Qwen2.5-VL 損失函數

Qwen2.5-VL 損失函數

flyfish

文章名稱鏈接
深入理解交叉熵損失 CrossEntropyLoss - 概率基礎鏈接
深入理解交叉熵損失 CrossEntropyLoss - 對數鏈接
深入理解交叉熵損失 CrossEntropyLoss - 概率分布鏈接
深入理解交叉熵損失 CrossEntropyLoss - 信息論(交叉熵)鏈接
深入理解交叉熵損失 CrossEntropyLoss - 損失函數鏈接
深入理解交叉熵損失 CrossEntropyLoss - one-hot 編碼鏈接
深入理解交叉熵損失 CrossEntropyLoss - Softmax鏈接
深入理解交叉熵損失 CrossEntropyLoss - 歸一化鏈接
深入理解交叉熵損失 CrossEntropyLoss - nn.LogSoftmax鏈接
深入理解交叉熵損失 CrossEntropyLoss - 似然鏈接
深入理解交叉熵損失 CrossEntropyLoss - 乘積符號在似然函數中的應用鏈接
深入理解交叉熵損失 CrossEntropyLoss - 最大似然估計鏈接
深入理解交叉熵損失 CrossEntropyLoss - nn.NLLLoss(Negative Log-Likelihood Loss)鏈接
深入理解交叉熵損失 CrossEntropyLoss - CrossEntropyLoss鏈接

qwen2_5_vl/modular_qwen2_5_vl.py
qwen2_5_vl/modeling_qwen2_5_vl.py
文件的forward方法中使用了CrossEntropyLoss

loss = None
if labels is not None:# Upcast to float if we need to compute the loss to avoid potential precision issueslogits = logits.float()# Shift so that tokens < n predict nshift_logits = logits[..., :-1, :].contiguous()shift_labels = labels[..., 1:].contiguous()# Flatten the tokensloss_fct = CrossEntropyLoss()shift_logits = shift_logits.view(-1, self.config.vocab_size)shift_labels = shift_labels.view(-1)# Enable model parallelismshift_labels = shift_labels.to(shift_logits.device)loss = loss_fct(shift_logits, shift_labels)if not return_dict:output = (logits,) + outputs[1:]return (loss,) + output if loss is not None else output

loss_fct(shift_logits, shift_labels)

1. shift_logits

  • 類型torch.Tensor
  • 含義:它代表模型的原始輸出得分,也就是未經Softmax函數處理過的對數概率。在多分類任務里,每個樣本的 shift_logits 是一個長度為詞匯表大小(self.config.vocab_size)的向量,此向量的每個元素對應著模型預測該樣本屬于各個類別的得分。
  • 形狀:在代碼里,shift_logits 經過 view(-1, self.config.vocab_size) 操作后,其形狀為 (N, C),其中 N 是所有樣本的總數(即批次大小與序列長度的乘積),C 是類別數量(也就是詞匯表的大小)。

2. shift_labels

  • 類型torch.LongTensor
  • 含義:它代表樣本的真實標簽。每個元素是一個整數,這個整數對應著樣本的真實類別索引,其取值范圍是 [0, C - 1],這里的 C 是類別數量(即詞匯表的大小)。
  • 形狀:在代碼中,shift_labels 經過 view(-1) 操作后,其形狀為 (N,),這里的 N 是所有樣本的總數(即批次大小與序列長度的乘積),要和 shift_logits 的第一個維度保持一致。

示例代碼

使用 CrossEntropyLoss 計算

import torch
from torch.nn import CrossEntropyLoss# 假設詞匯表大小為10
vocab_size = 10
# 假設總樣本數為5
N = 5# 生成隨機的logits和labels
shift_logits = torch.randn(N, vocab_size)
shift_labels = torch.randint(0, vocab_size, (N,))# 創建CrossEntropyLoss實例
loss_fct = CrossEntropyLoss()# 計算損失
loss = loss_fct(shift_logits, shift_labels)
print(f"Loss: {loss.item()}")

shift_logits 是模型的原始輸出得分,shift_labels 是樣本的真實標簽,loss_fct(shift_logits, shift_labels) 會計算出這些樣本的交叉熵損失。

代碼中使用了CrossEntropyLoss類來計算損失,在 PyTorch 中,CrossEntropyLoss結合了LogSoftmax和NLLLoss(負對數似然損失)。LogSoftmax操作會對模型的輸出logits應用 Softmax 函數,將其轉換為概率分布,然后再取對數;NLLLoss則基于這個對數概率分布和真實標簽計算損失。因此,CrossEntropyLoss本質上實現的是 Softmax 交叉熵。

多分類場景的體現:shift_logits被調整為形狀(-1, self.config.vocab_size),其中self.config.vocab_size表示詞匯表的大小,這意味著模型的輸出是一個多分類的概率分布,每個類別對應詞匯表中的一個詞。

簡單的說

1. 基礎概念:熵、交叉熵與KL散度

1.1 信息熵(Entropy)

信息熵是隨機變量的不確定性度量,對于離散概率分布 P ( x ) P(x) P(x),其公式為 H ( P ) = ? ∑ i P ( x i ) log ? P ( x i ) H(P) = -\sum_{i} P(x_i) \log P(x_i) H(P)=?i?P(xi?)logP(xi?)。直觀來看,熵越高意味著分布越“均勻”,不確定性越大——例如擲骰子結果的熵高于拋硬幣,因為骰子的可能結果更多且分布更均勻,其不確定性更強。

1.2 交叉熵(Cross-Entropy)

交叉熵用于衡量用分布 Q Q Q 表示分布 P P P 的困難程度,公式為 H ( P , Q ) = ? ∑ i P ( x i ) log ? Q ( x i ) H(P, Q) = -\sum_{i} P(x_i) \log Q(x_i) H(P,Q)=?i?P(xi?)logQ(xi?)。交叉熵越小,說明 Q Q Q P P P 的差異越小,即 Q Q Q 越接近真實分布 P P P,因此常被用作衡量兩個分布相似性的指標。

1.3 KL散度(Kullback-Leibler Divergence)

KL散度是對兩個概率分布差異的量化度量,公式為 D K L ( P ∣ ∣ Q ) = ∑ i P ( x i ) log ? P ( x i ) Q ( x i ) D_{KL}(P||Q) = \sum_{i} P(x_i) \log \frac{P(x_i)}{Q(x_i)} DKL?(P∣∣Q)=i?P(xi?)logQ(xi?)P(xi?)?,其與交叉熵、信息熵的關系為 H ( P , Q ) = H ( P ) + D K L ( P ∣ ∣ Q ) H(P, Q) = H(P) + D_{KL}(P||Q) H(P,Q)=H(P)+DKL?(P∣∣Q),即交叉熵等于信息熵與KL散度之和。當真實分布 P P P 固定時,最小化交叉熵等價于最小化KL散度,目標是讓預測分布 Q Q Q 盡可能接近 P P P

2. 交叉熵損失在分類任務中的應用

2.1 二分類問題

在二分類場景中,模型需要預測樣本屬于0或1類的概率,通常通過sigmoid函數將輸出映射到[0, 1]區間,得到概率 y ^ \hat{y} y^?。二元交叉熵(BCE)損失函數為 L = ? 1 N ∑ i = 1 N [ y i log ? ( y ^ i ) + ( 1 ? y i ) log ? ( 1 ? y ^ i ) ] L = -\frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i) \right] L=?N1?i=1N?[yi?log(y^?i?)+(1?yi?)log(1?y^?i?)]:當真實標簽 y i = 1 y_i=1 yi?=1 時,損失為 ? log ? ( y ^ i ) -\log(\hat{y}_i) ?log(y^?i?),鼓勵 y ^ i \hat{y}_i y^?i? 接近1;當 y i = 0 y_i=0 yi?=0 時,損失為 ? log ? ( 1 ? y ^ i ) -\log(1-\hat{y}_i) ?log(1?y^?i?),鼓勵 y ^ i \hat{y}_i y^?i? 接近0。

2.2 多分類問題

多分類任務中,樣本需被預測為 C C C 個類別之一,模型通過softmax函數將輸出轉換為概率分布 y ^ 1 , … , y ^ C \hat{y}_1, \dots, \hat{y}_C y^?1?,,y^?C?(滿足 ∑ i = 1 C y ^ i = 1 \sum_{i=1}^{C} \hat{y}_i = 1 i=1C?y^?i?=1),損失函數為多類交叉熵 L = ? 1 N ∑ i = 1 N ∑ c = 1 C y i , c log ? ( y ^ i , c ) L = -\frac{1}{N} \sum_{i=1}^{N} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c}) L=?N1?i=1N?c=1C?yi,c?log(y^?i,c?),其中 y i , c y_{i,c} yi,c? 是one-hot標簽(樣本 i i i 屬于類別 c c c 時為1,否則為0),該公式本質是對每個樣本的真實類別對應的預測概率取負對數并求平均。

3. 交叉熵損失與最大似然估計

3.1 從最大似然到交叉熵

假設訓練數據 ( x i , y i ) (x_i, y_i) (xi?,yi?) 獨立同分布,模型預測為條件概率 P ( y ∣ x ; θ ) P(y|x; \theta) P(yx;θ),對數似然函數為 log ? L ( θ ) = ∑ i = 1 N log ? P ( y i ∣ x i ; θ ) \log \mathcal{L}(\theta) = \sum_{i=1}^{N} \log P(y_i|x_i; \theta) logL(θ)=i=1N?logP(yi?xi?;θ),最小化負對數似然(NLL)即 L = ? 1 N ∑ i = 1 N log ? P ( y i ∣ x i ; θ ) L = -\frac{1}{N} \sum_{i=1}^{N} \log P(y_i|x_i; \theta) L=?N1?i=1N?logP(yi?xi?;θ) 等價于最大化似然。對于分類問題,若 P ( y i ∣ x i ; θ ) P(y_i|x_i; \theta) P(yi?xi?;θ) 是softmax分布,則NLL損失恰好對應交叉熵損失。

3.2 為什么用交叉熵而非MSE?

從梯度特性看,交叉熵在預測錯誤時梯度較大,能加速收斂;而MSE在預測值遠離真實值時梯度較小,可能導致訓練緩慢。從概率解釋角度,交叉熵直接優化似然函數,與概率模型的訓練目標一致,而MSE更適用于回歸任務,不直接關聯概率分布的擬合。

4. 交叉熵損失在語言模型中的應用

4.1 自回歸語言模型

自回歸語言模型的任務是根據前文 x 1 , … , x t ? 1 x_1, \dots, x_{t-1} x1?,,xt?1? 預測下一個token x t x_t xt? 的概率分布,損失函數為對序列每個位置 t t t 計算交叉熵 L = ? 1 T ∑ t = 1 T log ? P ( x t ∣ x 1 , … , x t ? 1 ) L = -\frac{1}{T} \sum_{t=1}^{T} \log P(x_t | x_1, \dots, x_{t-1}) L=?T1?t=1T?logP(xt?x1?,,xt?1?)。以PyTorch為例,假設模型輸出logits為 [batch_size, seq_len, vocab_size],真實標簽為 [batch_size, seq_len],可通過 nn.CrossEntropyLoss() 計算損失:loss = loss_fct(logits.view(-1, vocab_size), labels.view(-1)),其中函數會自動對logits應用softmax并計算交叉熵。

4.2 與分類任務的聯系

語言模型中每個token位置的預測可視為獨立的分類問題,詞匯表大小即類別數,模型需在每個位置預測當前token屬于詞匯表中某個詞的概率。因此,語言模型的訓練本質是對序列中每個位置的“分類器”進行聯合優化,與多分類任務的核心邏輯一致,只是序列場景下需要考慮上下文依賴關系。

交叉熵損失和交叉熵區別

1. 區別

交叉熵(信息論概念)是衡量兩個概率分布差異的指標,數學定義為 H ( P , Q ) = ? ∑ i P ( x i ) log ? Q ( x i ) H(P, Q) = -\sum_{i} P(x_i) \log Q(x_i) H(P,Q)=?i?P(xi?)logQ(xi?),其中 P P P是真實分布, Q Q Q是預測分布,核心作用是衡量用分布 Q Q Q表示分布 P P P的“不匹配程度”,不匹配程度越低,交叉熵越小。而交叉熵損失(機器學習損失函數)是交叉熵在模型訓練中的具體應用,本質上是對樣本的交叉熵求平均,用于量化模型預測與真實標簽的差距,作為優化目標,例如在分類任務中,其表達式為 L = ? 1 N ∑ i = 1 N ∑ c = 1 C y i , c log ? y ^ i , c L = -\frac{1}{N} \sum_{i=1}^{N} \sum_{c=1}^{C} y_{i,c} \log \hat{y}_{i,c} L=?N1?i=1N?c=1C?yi,c?logy^?i,c?,其中 N N N是樣本數, C C C是類別數, y i , c y_{i,c} yi,c?是樣本 i i i的one-hot標簽, y ^ i , c \hat{y}_{i,c} y^?i,c?是模型預測的概率。

2. 聯系:交叉熵損失是交叉熵的“工程化應用”

交叉熵損失的設計直接基于交叉熵的數學定義,在機器學習中,真實標簽(如one-hot向量)可視為真實分布 P P P,模型預測的概率分布是 Q Q Q,此時交叉熵即對應單個樣本的損失,而交叉熵損失是所有樣本交叉熵的平均。例如在二分類問題中,真實標簽 y y y(0或1)對應伯努利分布 P P P,模型預測概率 y ^ \hat{y} y^?對應分布 Q Q Q,單個樣本的交叉熵為 L = ? [ y log ? y ^ + ( 1 ? y ) log ? ( 1 ? y ^ ) ] L = -[y \log \hat{y} + (1-y) \log (1-\hat{y})] L=?[ylogy^?+(1?y)log(1?y^?)],這正是二元交叉熵損失(BCE Loss)的表達式。
交叉熵是通用指標,不依賴于機器學習任務,只要存在兩個概率分布,就可用交叉熵衡量它們的差異(如在信息壓縮、分布匹配中);而交叉熵損失是任務特定的優化目標,僅在模型訓練時使用,目的是通過最小化損失讓預測分布 Q Q Q逼近真實分布 P P P,例如在語言模型中,交叉熵損失對應“預測下一個token的概率與真實token的匹配程度”,而交叉熵本身可用來評估語言模型的困惑度(Perplexity)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83431.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83431.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83431.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode 1524. 和為奇數的子數組數目

好的&#xff01;讓我們詳細解釋 LeetCode 1524. 和為奇數的子數組數目 這道題的思路和解法。 題目&#xff1a; https://leetcode.cn/problems/number-of-sub-arrays-with-odd-sum/description/ 題目分析 問題描述&#xff1a; 給定一個整數數組 arr&#xff0c;返回其中和…

kafka學習筆記(三、消費者Consumer使用教程——消費性能多線程提升思考)

1.簡介 KafkaConsumer是非線程安全的&#xff0c;它定義了一個acquire()方法來檢測當前是否只有一個線程在操作&#xff0c;如不是則會拋出ConcurrentModifcationException異常。 acquire()可以看做是一個輕量級鎖&#xff0c;它僅通過線程操作計數標記的方式來檢測線程是否發…

百度蜘蛛池的作用是什么?技術@baidutopseo

百度蜘蛛池的作用 百度蜘蛛池是一種用于集中管理和調度百度搜索引擎蜘蛛&#xff08;爬蟲&#xff09;的技術工具。其主要目的是優化網站內容的收錄效率&#xff0c;幫助搜索引擎更高效地發現和抓取網頁內容。技術baidutopseo 提升收錄效率 通過集中大量百度蜘蛛的訪問請求&…

黑馬Java面試筆記之 消息中間件篇(Kafka)

一. Kafka保證消息不丟失 Kafka如何保證消息不丟失 使用Kafka在消息的收發過程中都會出現消息丟失&#xff0c;Kafka分別給出了解決方案 生產者發送消息到Brocker丟失消息在Brocker中存儲丟失消費者從Brocker接收消息丟失 1.1 生產者發送消息到Brocker丟失 設置異步發送 消息…

dis css port brief 命令詳細解釋

華為交換機命令 display css port brief 詳細解釋 display css port brief 是華為交換機中用于 快速查看堆疊&#xff08;CSS&#xff0c;Cluster Switch System&#xff09;端口狀態及關鍵參數 的命令&#xff0c;適用于日常運維、堆疊鏈路健康檢查及故障定位。以下是該命令的…

Redis 緩存問題及其解決方案

1. 緩存雪崩 概念&#xff1a;緩存雪崩是指在緩存層出現大范圍緩存失效或緩存服務器宕機的情況下&#xff0c;大量請求直接打到數據庫&#xff0c;導致數據庫壓力驟增&#xff0c;甚至可能引發數據庫宕機。 影響&#xff1a;緩存雪崩會導致系統性能急劇下降&#xff0c;甚至導…

使用Python進行函數作畫

前言 因為之前通過deepseek繪制一下卡通的人物根本就不像&#xff0c;又想起來之前又大佬通過函數繪制了一些圖像&#xff0c;想著能不能用Python來實現&#xff0c;結果發現可以&#xff0c;不過一些細節還是需要自己調整&#xff0c;deepseek整體的框架是沒有問題&#xff0…

關于list集合排序的常見方法

目錄 1、list.sort() 2、Collections.sort() 3、Stream.sorted() 4、進階排序技巧 4.1 空值安全處理 4.2 多字段組合排序 4.3. 逆序 5、性能優化建議 5.1 并行流加速 5.2 原地排序 6、最佳實踐 7、注意事項 前言 Java中對于集合的排序操作&#xff0c;分別為list.s…

Java高級 | (二十二)Java常用類庫

參考&#xff1a;Java 常用類庫 | 菜鳥教程 一、核心Java類庫 二、常用第三方庫 以下是 Java 生態系統中廣泛使用的第三方庫&#xff1a; 類別庫名稱主要功能官方網站JSON 處理JacksonJSON 序列化/反序列化https://github.com/FasterXML/jacksonGsonGoogle 的 JSON 庫https:…

幾種常用的Agent的Prompt格式

一、基礎框架范式&#xff08;Google推薦標準&#xff09; 1. 角色與職能定義 <Role_Definition> 你是“項目專家”&#xff08;Project Pro&#xff09;&#xff0c;作為家居園藝零售商的首席AI助手&#xff0c;專注于家裝改造領域。你的核心使命&#xff1a; 1. 協助…

蛋白質結構預測軟件openfold介紹

openfold 是一個用 Python 和 PyTorch 實現的 AlphaFold2 的開源復現版&#xff0c;旨在提升蛋白質結構預測的可復現性、可擴展性以及研究友好性。它允許研究者在不開源 DeepMind 原始代碼的情況下&#xff0c;自由地進行蛋白結構預測的訓練和推理&#xff0c;并支持自定義模型…

AD轉嘉立創EDA

可以通過嘉立創文件遷移助手進行格式的轉換 按照它的提示我們整理好文件 導出后是這樣的&#xff0c;第一個文件夾中有原理圖和PCB&#xff0c;可以把它們壓縮成一個壓縮包 這個時候我們打開立創EDA&#xff0c;選擇導入AD 這樣就完成了

MySQL(50)如何使用UNSIGNED屬性?

在 MySQL 中&#xff0c;UNSIGNED 屬性用于數值數據類型&#xff08;如 TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT&#xff09;&#xff0c;表示該列只能存儲非負整數。使用 UNSIGNED 屬性可以有效地擴展列的正整數范圍&#xff0c;因為它不需要為負數保留空間。 1. 定義與…

什么是鏈游,鏈游系統開發價格以及方案

2025 Web3錢包開發指南&#xff1a;從多版本源碼到安全架構實戰 在數字資產爆發式增長的今天&#xff0c;Web3錢包已成為用戶進入鏈上世界的核心入口。作為開發者&#xff0c;如何高效構建安全、跨鏈、可擴展的錢包系統&#xff1f;本文結合前沿技術方案與開源實踐&#xff0c…

文件IO流

IO使用函數 標準IO文件IO(低級IO)打開fopen, freopen, fdopenopen關閉fcloseclose讀getc, fgetc, getchar, fgets, gets, fread printf fprintfread寫putc, fputc, putchar, fputs, puts, fwrite scanf fscanfwrite操作文件指針fseeklseek其它fflush rewind ftell 文件描述符 …

云原生DMZ架構實戰:基于AWS CloudFormation的安全隔離區設計

在云時代,傳統的DMZ(隔離區)概念已經演變為更加靈活和動態的架構。本文通過解析一個實際的AWS CloudFormation模板,展示如何在云原生環境中構建現代化的DMZ安全架構。 1. 云原生DMZ的核心理念 傳統DMZ是網絡中的"緩沖區",位于企業內網和外部網絡之間。而在云環境…

一、虛擬貨幣概述

1. 定義 - 虛擬貨幣是一種基于網絡技術、加密技術和共識機制的數字貨幣&#xff0c;它不依賴傳統金融機構發行&#xff0c;而是通過計算機算法生成&#xff0c;例如比特幣、以太坊等。 2. 特點 - 去中心化&#xff1a;沒有一個單一的機構或個人控制整個虛擬貨幣系統&#xff0c…

Make All Equal

給定一個循環數組 a1,a2,…,ana1?,a2?,…,an?。 你可以對 aa 至多執行 n?1n?1 次以下操作&#xff1a; 設 mm 為 aa 的當前大小&#xff0c;你可以選擇任何兩個相鄰的元素&#xff0c;其中前一個不大于后一個&#xff08;特別地&#xff0c;amam? 和 a1a1? 是相鄰的&a…

任務中心示例及瀏覽器強制高效下載實踐

1. 效果展示 這里的進度展示&#xff0c;可以通過我們之前講到的Vue3實現類ChatGPT聊天式流式輸出(vue-sse實現) SSE技術實現&#xff0c;比如用戶點擊全量下載時&#xff0c;后臺需要將PDF文件打包為ZIP文件&#xff0c;由于量較大&#xff0c;需要展示進度&#xff0c;用戶點…

SpringBoot整合Flowable【08】- 前后端如何交互

引子 在第02篇中&#xff0c;我通過 Flowable-UI 繪制了一個簡單的績效流程&#xff0c;并在后續章節中基于這個流程演示了 Flowable 的各種API調用。然而&#xff0c;在實際業務場景中&#xff0c;如果要求前端將用戶繪制的流程文件發送給后端再進行解析處理&#xff0c;這種…