主頁 >  其他 > 一文弄懂交叉熵損失

一文弄懂交叉熵損失

2021-12-07 08:47:44 其他

引言

今天來好好地捋一捋交叉熵損失(Cross Entropy Loss),
從資訊熵入手,再到極大似然估計,然后引入KL散度,最后來看KL散度與交叉熵的關系,
雖然文章有點長,但相信看完本文,你一定會對交叉熵損失有更高一層的領悟,

資訊熵

資訊的價值在于消除事件的不確定性,那事件的不確定性要怎么度量呢?答案就是資訊熵(information entropy),

比如你告訴別人你中了500萬彩票,別人會大吃一驚,因為他被消除了大量的不確定性,但如果你告訴別人你沒中彩票,別人基本熵沒有反應,因為他估計你這小子十有八九不會中彩票,相當于你幾乎沒有消除他對你沒有中彩票這件事的不確定性,或者說你傳達的資訊量太少,我們知道概率只能在0到1之間,也就是說,最好在概率為1的時候,資訊量為0,且概率越小,資訊量越大,后來人們發現,對數函式很符合這樣的規律,某個事件的資訊量與概率的關系是 i = log ? ( 1 p ) i = \log(\frac{1}{p}) i=log(p1?),這里的對數是以2為底的, p p p是事件發生的概率,

上面最后這個式子是怎么來的呢?以拋硬幣游戲為例,如果有一枚理想的硬幣,其出現正面和反面的概率相等,假設我們相隔很遠,只能通過電位信號(0或1)進行交流,如何把這個硬幣的結果告訴我呢,顯然,此時只需要發送一個信號就可以,用1表示正面,用0表示反面,資訊的價值在于消除事件的不確定性,傳遞一枚硬幣結果的資訊,幫我們消除了它是哪一個面的不確定性,

image-20211201072758316

我們再來看一個轉盤游戲,這個轉盤被均等地分為8個區域,如果我們要把轉盤的結果發送出去,那么需要多少個信號呢?答案是3個信號,

image-20211201072848280

在這兩個例子中,我們發現一件事情,把一個游戲系統中所有可能出現的等概率事件數量取以2為底的對數,就是我們要傳遞事件結果所需要的信號數量,比如在拋硬幣游戲中是 log ? 2 ( 2 ) = 1 \log_2(2)=1 log2?(2)=1,在轉盤游戲中是 log ? 2 ( 8 ) = 3 \log_2(8)=3 log2?(8)=3??,這個數量就是資訊量

資訊量 = log ? ( N ) \text{資訊量}=\log(N) 資訊量=log(N),這里的 N N N是等可能事件數量,

可以把這種度量不確定性的資訊量稱為資訊熵,但嚴格來說這并不是香農所說的資訊熵,這只是資訊熵的一個特例,即所有的事件是等可能的,我們遇到的更多情況是事件發生的可能性不一樣的系統, 比如現實生活中就無法制作出來正反面概率都是50%的硬幣,

實際上,我們總是可以把一個事件的概率值轉換為一個等可能事件系統中發生某個事件的概率,舉例來說,我們總是可以把一個概率值轉換為“在N個球中隨機摸一個球”這個等可能事件系統中摸出某個球的概率,

假設中彩票大獎的概率很低,只有兩千萬分之一,我們可以把這個概率值轉換為在兩千萬個球中摸出中獎球的概率,在這個摸球系統中,就有兩千萬個等可能事件,所以只需要用1除以概率值就可以想象出等可能事件系統中事件等數量,即 N = 1 p N=\frac{1}{p} N=p1??,

假設我們有一個動了手腳的不均勻硬幣,它正面朝上的概率是0.8,反面朝上的概率是0.2,

image-20211201074928812

如上圖,反面朝上0.2的概率可以想象有5個球的摸球系統中摸出某個球的概率,

image-20211201075108802

而正面朝上0.8的概率可以想象成在有1.25個球的系統中摸出某個球的概率,我們通過想象把一個非等概率事件的系統拆成了兩個等概率事件的系統,

而面對等概率事件系統,我們就可以很容易地計算它們的資訊量,再把這兩個想象出來的摸球系統的資訊量加起來,就是這個不均勻硬幣的資訊量: log ? 5 + log ? 1.25 \log 5 + \log 1.25 log5+log1.25,由于這兩個我們想象出來的等概率系統本身出現的概率也不一樣,因此我們需要分別乘上它們出現的概率,得 0.2 ? log ? 5 + 0.8 ? log ? 1.25 0.2 \cdot \log 5 + 0.8 \cdot \log 1.25 0.2?log5+0.8?log1.25

如果我們用符號去抽象這些具體的值,就是
p 1 ? log ? 1 p 1 + p 2 ? log ? 1 p 2 (1) p_1 \cdot \log \frac{1}{p_1} + p_2 \cdot \log \frac{1}{p_2} \tag{1} p1??logp1?1?+p2??logp2?1?(1)
對于有更多事件的一般情況,我們可以這么表示:
∑ i p i log ? 1 p i (2) \sum_i p_i \log \frac{1}{p_i} \tag{2} i?pi?logpi?1?(2)
我們整理下這個式子
∑ i p i log ? 1 p i = ∑ i ( p i ? ( log ? 1 ? log ? p i ) ) = ∑ i ? p i log ? p i = ? ∑ i p i log ? p i (3) \begin{aligned} \sum_i p_i \log \frac{1}{p_i} &= \sum_i (p_i \cdot (\log1 - \log p_i)) \\ &= \sum_i - p_i \log p_i \\ &= - \sum_i p_i \log p_i \end{aligned} \tag{3} i?pi?logpi?1??=i?(pi??(log1?logpi?))=i??pi?logpi?=?i?pi?logpi??(3)

就得到了香農所提出的資訊熵公式 ? ∑ i p i log ? p i -\sum_i p_i \log p_i ?i?pi?logpi?

我們可以看出,資訊熵實際熵就是我們給每個概率值想象出來的某球系統的資訊量的平均值,或者說是資訊量的期望,

如果我們要比較兩個概率模型的距離,最簡單的辦法就是把它們的資訊熵都算出來,直接比較兩個結果就好了,但是問題是,在機器學習中,我們往往不知道訓練樣本的概率模型,此時呢,我們就需要用到相對熵,也稱為KL散度(KL Divergence),

但是在這之前,為了知識的完整性,我們需要了解極大似然估計的概念,

極大似然估計

極大似然估計里面有三個概念,極大、似然和估計,通俗來說,就是用已知的樣本結果資訊,去反推最有可能導致這些樣本結果出現的模型引數值,

反推說的是一種推理、估計,我們無法保證完全能從已知樣本去推出產生這些樣本的概率分布,只能說是一種估計,似然值說的是,真實樣本已經看到,假設有很多(概率)模型,每個模型產生這些真實樣本的可能性就叫似然值,極大似然估計就是選擇似然值最高的模型來估計真實(概率)模型,

還是以拋硬幣為例,我們記硬幣的正面為H(Head),反面為T(Tail),

假設我們不知道這個硬幣產生正反面的概率,但是我們可以做10次實驗,假設產生這樣一組結果:HHHHHHHTTT,即前7次是正面,后3次是反面,

假設有三個產生這組結果的模型(概率分布),

  • 模型A產生正面的概率 p = 0.1 p=0.1 p=0.1,產生反面的概率就是 1 ? p = 0.9 1-p=0.9 1?p=0.9?
  • 模型B產生正面的概率 p = 0.7 p=0.7 p=0.7,產生反面的概率是 1 ? p = 0.3 1-p=0.3 1?p=0.3
  • 模型 C C C產生正面的概率 p = 0.8 p=0.8 p=0.8,產生反面的概率是 1 ? p = 0.2 1-p=0.2 1?p=0.2

計算某個概率模型產生這組結果的可能性是可以計算出來的,公式為:
P ( C 1 , C 2 , ? ? , C 10 ∣ θ ) = ∏ i = 1 10 P ( C i ∣ θ ) (4) P(C_1,C_2,\cdots,C_{10}|\theta) = \prod_{i=1}^{10} P(C_i|\theta) \tag{4} P(C1?,C2?,?,C10?θ)=i=110?P(Ci?θ)(4)
其中 C i ∈ { 0 , 1 } C_i \in \{0,1\} Ci?{0,1}是第 i i i次拋硬幣的結果,整個式子說的是由引數 θ \theta θ確定的模型同時發生 C 1 , C 2 , ? ? , C 10 C_1,C_2,\cdots,C_{10} C1?,C2?,?,C10?的概率,

同時發生就是連乘,

這樣的可能性就叫似然值

因此我們只需要計算每個模型的似然值,然后選擇似然值最大的模型來估計真實模型,

模型 A A A的似然值: 0. 1 7 0. 9 3 ≈ 7.29 e ? 08 0.1^70.9^3 \approx 7.29e-08 0.170.937.29e?08

模型 B B B的似然值: 0. 7 7 0. 3 3 ≈ 0.00222 0.7^70.3^3\approx 0.00222 0.770.330.00222

模型 C C C的似然值: 0. 1 7 0. 9 3 ≈ 0.00168 0.1^70.9^3\approx 0.00168 0.170.930.00168

挑出似然值最大的模型就叫最大似然估計法,

極大似然法

我們從極大似然估計的角度來看一下損失函式的選擇,

以上圖為例,把一些圖片,輸入到神經網路,神經網路會輸出這張圖片是貓的可能性,假設這些圖片是訓練資料,我們已經這些圖片是否是貓,

在拋硬幣中,我們通過 θ \theta θ來表示引數,在神經網路這里可以具體地用 W , b W,b W,b來表示,

即可以寫成:
P ( x 1 , x 2 , x 3 , ? ? , x n ∣ W , b ) (5) P(x_1,x_2,x_3,\cdots,x_n|W,b) \tag{5} P(x1?,x2?,x3?,?,xn?W,b)(5)
n n n這些圖片的個數; x i ∈ { 0 , 1 } x_i \in \{0,1\} xi?{0,1}代表輸入的這張圖片是否為貓, 1 1 1代表是貓,

這樣我們也可以把上式改成連乘的形式:
P ( x 1 , x 2 , x 3 , ? ? , x n ∣ W , b ) = ∏ i = 1 n P ( x i ∣ W , b ) (6) P(x_1,x_2,x_3,\cdots,x_n|W,b) =\prod_{i=1}^n P(x_i|W,b) \tag{6} P(x1?,x2?,x3?,?,xn?W,b)=i=1n?P(xi?W,b)(6)
我們就可以得到基于這些圖片的模型的似然值,我們要找到使得這個似然值最大的 W , b W,b W,b

但是 W , b W,b W,b?是一個確定的值,而我們知道神經網路可以看成是由 W , b W,b W,b這組引數確定的一個函式,該函式的輸出結果 y i y_i yi?表示輸入圖片 x i x_i xi?是貓的可能性有多大,即 y i = N N W , b ( x i ) y_i = NN_{W,b}(x_i) yi?=NNW,b?(xi?)??,這里我們就可以用可能性 y i y_i yi?來替代上面的引數 W , b W,b W,b
P ( x 1 , x 2 , x 3 , ? ? , x n ∣ W , b ) = ∏ i = 1 n P ( x i ∣ y i ) (7) P(x_1,x_2,x_3,\cdots,x_n|W,b) =\prod_{i=1}^n P(x_i|y_i) \tag{7} P(x1?,x2?,x3?,?,xn?W,b)=i=1n?P(xi?yi?)(7)
這樣輸入不同貓的圖片 x i x_i xi?,我們可以得到不同的概率值 y i y_i yi?

這個式子我們要如何展開呢,我們這個連乘時的寫法與 x i x_i xi?的取值有關,當 x i = 1 x_i=1 xi?=1時,輸出的應該是判斷為貓的概率,取 y i y_i yi?;當 x i = 0 x_i=0 xi?=0時,輸出的應該是判斷不是貓的概率,取 1 ? y i 1-y_i 1?yi?

好在還是有解法的,這個式子可以通過伯努利分布展開的,因為 x i ∈ { 0 , 1 } x_i \in \{0,1\} xi?{0,1}兩種情況,同時 y i y_i yi?又是一個概率,

image-20211204082555576

和拋硬幣的例子類似,當 x = 1 x=1 x=1時,我們用硬幣是正面的概率 p p p去乘;當 x = 0 x=0 x=0是,我們用硬幣是反面的概率 1 ? p 1-p 1?p去乘,

我們就可以通過伯努利分布的這個式子來展開式 ( 7 ) (7) (7),得:
P ( x 1 , x 2 , x 3 , ? ? , x n ∣ W , b ) = ∏ i = 1 n y i x i ( 1 ? y i ) 1 ? x i (8) P(x_1,x_2,x_3,\cdots,x_n|W,b) = \prod_{i=1}^n y_i^{x_i}(1-y_i)^{1-x_i} \tag{8} P(x1?,x2?,x3?,?,xn?W,b)=i=1n?yixi??(1?yi?)1?xi?(8)
我們通過在等式右邊取對數,把連乘變成連加,因為取對數不改變單調性的,
log ? ( ∏ i = 1 n y i x i ( 1 ? y i ) 1 ? x i ) = ∑ i = 1 n log ? ( y i x i ( 1 ? y i ) 1 ? x i ) = ∑ i = 1 n ( x i ? log ? y i + ( 1 ? x i ) ? log ? ( 1 ? y i ) ) (9) \begin{aligned} \log \left( \prod_{i=1}^n y_i^{x_i}(1-y_i)^{1-x_i} \right )&= \sum_{i=1}^n \log \left(y_i^{x_i}(1-y_i)^{1-x_i} \right) \\ &= \sum_{i=1}^n \left(x_i \cdot \log y_i + (1-x_i)\cdot \log (1-y_i) \right) \\ \end{aligned} \tag{9} log(i=1n?yixi??(1?yi?)1?xi?)?=i=1n?log(yixi??(1?yi?)1?xi?)=i=1n?(xi??logyi?+(1?xi?)?log(1?yi?))?(9)

我們要求極大似然值,是取的最大值,而損失函式是取最小值,我們把等式兩邊乘以一個負號,變成了求最小值,
min ? ? ∑ i = 1 n ( x i ? log ? y i + ( 1 ? x i ) ? log ? ( 1 ? y i ) ) (10) \min - \sum_{i=1}^n \left(x_i \cdot \log y_i + (1-x_i)\cdot \log (1-y_i) \right) \tag{10} min?i=1n?(xi??logyi?+(1?xi?)?log(1?yi?))(10)
雖然這個式子看起來很像交叉熵,但實際上還是有很大不同的,主要的區別是它們的量綱不同,

這里面的對數是我們故意加上去的,并且負號也是為了湊成求最小值,

下面我們就來了解相對熵,

KL散度

KL散度,也被稱為相對熵,是用來衡量兩個分布的距離,設 P P P Q Q Q是兩個概率分布,則 P P P Q Q Q的相對熵為:
D K L ( P ∣ ∣ Q ) = ∑ i P ( i ) log ? P ( i ) Q ( i ) (11) D_{KL}(P||Q) = \sum_i P(i) \log \frac{P(i)}{Q(i)} \tag{11} DKL?(PQ)=i?P(i)logQ(i)P(i)?(11)
這里 i i i代表分布中的所有類別,

性質

  1. 不具備對稱性,即 D ( P ∣ ∣ Q ) ≠ D ( Q ∣ ∣ P ) D(P||Q) \neq D(Q||P) D(PQ)?=D(QP)
  2. 非負性,即 D ( P ∣ ∣ Q ) ≥ 0 D(P||Q) \geq 0 D(PQ)0

舉個例子,還是以拋硬幣為例,假設我們有一個公平的硬幣,即正反概率都是50%;我們還有一個有偏差的硬幣,其正面概率為 p p p,反面概率為 q q q

我們要如何判斷這兩個分布的相似性呢?

可能不好回答,但是我們知道,如果 p = 0.55 p=0.55 p=0.55,它肯定比 p = 0.95 p=0.95 p=0.95要更相似,

我們可以從拋硬幣的結果來看,

? 假設公平硬幣的拋擲結果為:HHTHHTTHTHTH

假設 p = 0.55 p=0.55 p=0.55硬幣的拋擲結果為:HHTHHTTHHHTH

假設 p = 0.95 p=0.95 p=0.95硬幣的拋擲結果為:HHHHHHTHHHHH

我們可以簡單的計算不相等的結果個數,但是更嚴謹的做法是計算產生某個結果的似然值,

如果似然值很接近,那么說明這兩個概率分布很接近,

基于(公平硬幣拋出的)觀察結果,我們就可以計算公平硬幣的似然值和其他硬幣的似然值的比值:
P ( 觀察結果 ∣ 公平硬幣 ) P ( 觀察結果 ∣ 偏差硬幣 ) \frac{P(\text{觀察結果}|\text{公平硬幣})}{P(\text{觀察結果}|\text{偏差硬幣})} P(觀察結果偏差硬幣)P(觀察結果公平硬幣)?
我們再舉一個例子,假設有一枚硬幣,其正面概率為 p 1 p_1 p1?,反面概率為 p 2 p_2 p2?

假設我們拋擲這枚硬幣12次,產生的結果為:HHTHHTHHHTHT

我們可以很容易計算出這枚硬幣產生這個結果的概率: p 1 ? p 1 ? p 2 ? p 1 ? p 1 ? p 2 ? p 1 ? p 1 ? p 1 ? p 2 ? p 1 ? p 2 p_1\cdot p_1 \cdot \color{red}p_2 \cdot \color{black}p_1 \cdot p_1 \cdot \color{red}p_2 \cdot \color{black}p_1 \cdot p_1 \cdot p_1 \cdot \color{red}p_2 \cdot \color{black}p_1 \cdot \color{red}p_2 p1??p1??p2??p1??p1??p2??p1??p1??p1??p2??p1??p2?

我們再拿一枚硬幣,它產生正面的概率為 q 1 q_1 q1?,反面概率為 q 2 \color{red}q_2 q2?

那么這枚新的硬幣產生這個結果的概率為: q 1 ? q 1 ? q 2 ? q 1 ? q 1 ? q 2 ? q 1 ? q 1 ? q 1 ? q 2 ? q 1 ? q 2 q_1\cdot q_1 \cdot \color{red}q_2 \cdot \color{black}q_1 \cdot q_1 \cdot \color{red}q_2 \cdot \color{black}q_1 \cdot q_1 \cdot q_1 \cdot \color{red}q_2 \cdot \color{black}q_1 \cdot \color{red}q_2 q1??q1??q2??q1??q1??q2??q1??q1??q1??q2??q1??q2?

即基于觀察結果,有

P ( 觀察結果 ∣ 硬幣1 ) = p 1 N H p 2 N T P(\text{觀察結果}|\text{硬幣1}) = p_1^{N_H}\color{red}p_2^{N_T} P(觀察結果硬幣1)=p1NH??p2NT??

P ( 觀察結果 ∣ 硬幣2 ) = q 1 N H q 2 N T P(\text{觀察結果}|\text{硬幣2}) = q_1^{N_H}\color{red}q_2^{N_T} P(觀察結果硬幣2)=q1NH??q2NT??

其中 N H N_H NH??表示觀察結果中為正面的次數, N T N_T NT??為反面的次數,我們計算它們的比值:
P ( 觀察結果 ∣ 真實硬幣 ) P ( 觀察結果 ∣ 硬幣2 ) = p 1 N H p 2 N T q 1 N H q 2 N T (12) \frac{P(\text{觀察結果}|\text{真實硬幣})}{P(\text{觀察結果}|\text{硬幣2})} = \frac{p_1^{N_H}\color{red}p_2^{N_T}}{q_1^{N_H}\color{red}q_2^{N_T}} \tag{12} P(觀察結果硬幣2)P(觀察結果真實硬幣)?=q1NH??q2NT??p1NH??p2NT???(12)
這樣就能計算出來這兩個硬幣的相似性,

其實KL散度衡量的是類似的東西,怎么說?

我們把上式右邊取對數,并除以實驗總數 N = N H + N T N=N_H+\color{red}N_T N=NH?+NT?
1 N log ? ( p 1 N H p 2 N T q 1 N H q 2 N T ) = 1 N log ? p 1 N H + 1 N log ? p 2 N T ? 1 N log ? q 1 N H ? 1 N log ? q 2 N T = p 1 log ? p 1 + p 2 log ? p 2 ? p 1 log ? q 1 ? p 2 log ? q 2 = p 1 log ? p 1 q 1 + p 2 log ? p 2 q 2 \begin{aligned} \frac{1}{N}\log \left( \frac{p_1^{N_H}\color{red}p_2^{N_T}}{q_1^{N_H}\color{red}q_2^{N_T}} \right) &= \frac{1}{N}\log p_1^{N_H} + \frac{1}{N}\log \color{red}p_2^{N_T} \color{black} - \frac{1}{N}\log q_1^{N_H} -\frac{1}{N}\log \color{red} q_2^{N_T} \\ &= p_1\log p_1 + p_2 \log \color{red}p_2 \color{black} - p_1 \log q_1 - \color{red}p_2 \color{black}\log \color{red}q_2 \\ &= p_1 \log \frac{p_1}{q_1} + \color{red}p_2 \color{black}\log \frac{\color{red}p_2}{\color{red}q_2} \end{aligned} N1?log(q1NH??q2NT??p1NH??p2NT???)?=N1?logp1NH??+N1?logp2NT???N1?logq1NH???N1?logq2NT??=p1?logp1?+p2?logp2??p1?logq1??p2?logq2?=p1?logq1?p1??+p2?logq2?p2???

其中 N H N = p 1 ???? N T N = p 2 \frac{N_H}{N}=p_1 \,\,\,\, \frac{\color{red}N_T}{N}=\color{red}p_2 NNH??=p1?NNT??=p2?,這里 p p p是一個概率分布, q q q是另一個概率分布,該式子和KL散度的式子一模一樣,

即我們通過計算真實分布的似然值除以第二個分布的似然值,再取歸一化的對數,就得到了KL散度的運算式,

我們可以看到,KL散度是一種衡量兩個概率分布距離的方式,通過觀察第二個概率分布產生第一個概率分布樣本的可能性,

KL散度非常適用于深度學習的場景,因為深度學習模型基本上是關于為已知樣本的真實分布建模,

實際上,交叉熵損失(cross entroy loss)就等于KL損失,最小化交叉熵就是最小化兩個分布的距離,

我們先來看下交叉熵的定義,

交叉熵

交叉熵(Cross Entropy)主要衡量兩個概率分布之間的差異性,交叉熵可在神經網路中作為損失函式,有:
H ( P ? ∣ P ) = ? ∑ i P ? ( i ) log ? P ( i ) (13) H(P^*|P)=- \sum_i P^*(i) \log P(i) \tag{13} H(P?P)=?i?P?(i)logP(i)(13)
其中 P ? P^* P?表示真實分布; P P P表示預測分布; i i i表示分布中的所有類別,

KL散度和交叉熵

我們已經了解了KL散度和交叉熵,我們本小節來看它們之間的關系,

我們知道,交叉熵可以用來衡量預測分布和真實分布的差異(距離),我們觀察到的樣本都是由真實分布產生的,所以我們可以這樣描述KL散度:
D K L ( P ? ∣ ∣ P ) = D K L ( P ? ( y ∣ x i ) ∣ ∣ P ( y ∣ x i ; θ ) (14) D_{KL}(P^*||P) =D_{KL}\left ( P^* (y|x_i) || P(y|x_i;\theta\right) \tag{14} DKL?(P?P)=DKL?(P?(yxi?)P(yxi?;θ)(14)
其中 P ? P^* P?是真實分布, P P P是我們的預測分布; x i x_i xi?是第 i i i個樣本, y y y是其對應的標簽; θ \theta θ是模型的引數,
D K L ( P ? ∣ ∣ P ) = ∑ y P ? ( y ∣ x i ) log ? P ? ( y ∣ x i ) P ( y ∣ x i ; θ ) = ∑ y P ? ( y ∣ x i ) [ log ? P ? ( y ∣ x i ) ? log ? P ( y ∣ x i ; θ ) ] = ∑ y P ? ( y ∣ x i ) log ? P ? ( y ∣ x i ) ? ∑ y P ? ( y ∣ x i ) log ? P ( y ∣ x i ; θ ) (15) \begin{aligned} D_{KL}(P^*||P) &= \sum_y P^* (y|x_i) \log \frac{P^*(y|x_i)}{P(y|x_i;\theta)} \\ &=\sum_y P^* (y|x_i) \left [\log P^*(y|x_i) - \log P(y|x_i;\theta) \right] \\ &= \sum_y P^* (y|x_i)\log P^*(y|x_i) - \sum_y P^* (y|x_i) \log P(y|x_i;\theta) \\ \end{aligned} \tag{15} DKL?(P?P)?=y?P?(yxi?)logP(yxi?;θ)P?(yxi?)?=y?P?(yxi?)[logP?(yxi?)?logP(yxi?;θ)]=y?P?(yxi?)logP?(yxi?)?y?P?(yxi?)logP(yxi?;θ)?(15)
觀察上面最終的式子,其中 P ? ( y ∣ x i ) log ? P ? ( y ∣ x i ) P^* (y|x_i)\log P^*(y|x_i) P?(yxi?)logP?(yxi?)與引數 θ \theta θ無關,實際上是真實分布的資訊熵,是一個常數;而 ? P ? ( y ∣ x i ) log ? P ( y ∣ x i ; θ ) -P^* (y|x_i)\log P(y|x_i;\theta) ?P?(yxi?)logP(yxi?;θ)就是我們熟悉的交叉熵的式子,

如果看不明白的話,或者我們換一種寫法: D K L ( P ? ∣ ∣ P ) = ? S ( P ? ) + H ( P ? , P ) D_{KL}(P^*||P)= -S(P^*) + H(P^*,P) DKL?(P?P)=?S(P?)+H(P?,P) S ( P ? ) S(P^*) S(P?) P ? P^* P?的資訊熵; H ( P ? , P ) H(P^*,P) H(P?,P)是交叉熵,KL散度 = 交叉熵 - 熵

因此,我們最小化關于引數 θ \theta θ的KL散度,就相當于最小化式 ( 15 ) (15) (15)中的第二項,即:
arg ? ? min ? θ D K L ( P ? ∣ ∣ P ) ≡ arg ? ? min ? θ ? ∑ i P ? ( y ∣ x i ) log ? P ( y ∣ x i ; θ ) (16) \arg\,\min_{\theta}D_{KL}(P^*||P) \equiv \arg\,\min_{\theta} - \sum_i P^* (y|x_i) \log P(y|x_i;\theta) \tag{16} argθmin?DKL?(P?P)argθmin??i?P?(yxi?)logP(yxi?;θ)(16)

arg ? ? min ? θ D K L ( P ? ∣ ∣ P ) ≡ arg ? ? min ? θ H ( P ? , P ) (17) \arg\,\min_{\theta}D_{KL}(P^*||P) \equiv \arg\,\min_{\theta} H(P^*,P) \tag{17} argθmin?DKL?(P?P)argθmin?H(P?,P)(17)
因此,在機器學習中,我們要評估預測模型和真實模型之間的差距,可以使用KL散度,而KL散度中的資訊熵那一部分不變,所以只需要關注交叉熵就可以了,

基于KL散度恒不小于零的特性,博主找到了一個很好的圖示:

image-20211205154233264

紅色曲線代表真實概率分布;橙色曲線代表預測概率分布;紫線代表藍色曲線下的面積,代表這兩個分布的交叉熵,

交叉熵的大小與預測分布和真實分布的偏離程度相關,

image-20211205154728426

當兩個分布重疊時,此時交叉熵最小,為真實分布的資訊熵,

交叉熵損失

在機器學習中,我們需要評估標簽值 y y y和預測值 y ^ \hat y y^?之間的差距,我們知道只需要關注交叉熵,一般在機器學習中直接用交叉熵做損失函式來評估模型,

l o s s = ? ∑ j = 1 n y j log ? y ^ j (18) loss=-\sum_{j=1}^n y_j \log \hat y_j \tag{18} loss=?j=1n?yj?logy^?j?(18)
這里 y j y_j yj?是真實樣本的標簽; y ^ j \hat y_j y^?j?是預測值,通常是一個概率; n n n是分類的個數;因此這是針對單個樣本的情況,如果對于批量樣本,那么交叉熵計算公式為:
L = ? ∑ i = 1 m ∑ j = 1 n y i j log ? y ^ i j (19) \mathcal L = -\sum_{i=1}^m \sum_{j=1}^n y_{ij} \log \hat y_{ij} \tag{19} L=?i=1m?j=1n?yij?logy^?ij?(19)
其中 m m m是樣本數; n n n是分類數,

二分類

有一種特殊問題,即分類數為 2 2 2,就是二分類問題,對于這種問題,由于 n = 2 n=2 n=2 y 1 = 1 ? y 2 y_1=1-y_2 y1?=1?y2? y ^ 1 = 1 ? y ^ 2 \hat y_1 = 1- \hat y_2 y^?1?=1?y^?2?,所以交叉熵可以簡化為:
l o s s = ? [ y 1 log ? y ^ 1 + ( 1 ? y 1 ) log ? ( 1 ? y ^ 1 ) ] (20) loss = - \left[ y_1 \log \hat y_1 + (1-y_1)\log (1-\hat y_1) \right] \tag{20} loss=?[y1?logy^?1?+(1?y1?)log(1?y^?1?)](20)
對于批量樣本的交叉熵為:
L = ? ∑ i = 1 m [ y i log ? y ^ i + ( 1 ? y i ) log ? ( 1 ? y ^ i ) ] (21) \mathcal L = - \sum_{i=1}^m \left [ y_i \log \hat y_i + (1-y_i)\log(1-\hat y_i) \right] \tag{21} L=?i=1m?[yi?logy^?i?+(1?yi?)log(1?y^?i?)](21)
通常對于二分類問題,記正例為 1 1 1,負例為 0 0 0,因此上式的兩個相加項只會有一個存在,

多分類

常見的是多分類問題,即分類數 n ≥ 3 n \geq 3 n3,多分類問題對于批量樣本的交叉熵損失即為式 ( 19 ) (19) (19)
L = ? ∑ i = 1 m ∑ j = 1 n y i j log ? y ^ i j \mathcal L = -\sum_{i=1}^m \sum_{j=1}^n y_{ij} \log \hat y_{ij} L=?i=1m?j=1n?yij?logy^?ij?
這里有必要指出的是,對于多分類問題,標簽值一般采用獨熱編碼,預測值在輸出之前會經過Softmax轉換為概率分布,這樣交叉熵損失只會關注預測正確的類別的概率,

這種特性使得代碼撰寫也比計較直觀,

均方誤差和交叉熵

我們知道,線性回歸的損失函式是均方誤差,而邏輯回歸的損失函式為交叉熵損失,為什么呢?

先看邏輯回歸為什么用交叉熵損失而不是均方誤差,

邏輯回歸其實是分類問題,輸出的是一個概率,交叉熵就是用于衡量概率距離的函式,所以選用交叉熵損失,如果把概率值看成是一個數值的話,也可以用均方誤差啊,那到底為什么呢?

我們可以從均方誤差和交叉熵的函式圖形入手,

以二分類問題為例,先看交叉熵的函式圖形,

import numpy as np
import matplotlib.pyplot as plt

def cross_entropy(y_hat, y):
  return -np.log(y_hat) if y == 1 else -np.log(1 - y_hat)
 
y_hat = np.arange(0.01,1,0.01)

plt.plot(y_hat, cross_entropy(y_hat, 1), label='y=1')
plt.plot(y_hat, cross_entropy(y_hat, 0), label='y=0')
plt.legend()
plt.show()

20211205193211

其中藍線代表真實標簽 y = 1 y=1 y=1時的交叉熵損失函式圖形,橙線代表真實標簽 y = 0 y=0 y=0時的圖形,橫坐標代表預測值,縱坐標代表損失值,

可以看到,當 y = 1 y=1 y=1時(藍線),如果預測的越正確(預測值與1越近),則損失(懲罰)越小,在越接近0的位置,損失越大,

反過來,當 y = 0 y=0 y=0時(橙線),如果預測的越正確(預測值與0越近),則損失越小,在越接近1的位置,損失越大,

我們來看下,當 y = 1 y=1 y=1時,預測結果為 y ^ = 0.1 \hat y=0.1 y^?=0.1時的損失:

> cross_entropy(0.1, 1)
2.3025850929940455

大約是 2.3 2.3 2.3

我們再來看均方誤差的圖形:

def mse(y_hat, y):
  return (y - y_hat)**2
 
plt.plot(y_hat,mse(y_hat, 1) , label='y=1')
plt.plot(y_hat, mse(y_hat, 0), label='y=0')
plt.legend()

202112051932112

其中藍線代表真實標簽 y = 1 y=1 y=1時的均方誤差損失函式圖形,橙線代表真實標簽 y = 0 y=0 y=0時的圖形,橫坐標代表預測值,縱坐標代表損失值,

上面縱軸最大值也只是 1.0 1.0 1.0,整個函式影像看起來也沒有特別大的梯度,

我們也來看下,當 y = 1 y=1 y=1時,預測結果為 y ^ = 0.1 \hat y=0.1 y^?=0.1?時的損失:

> mse(0.1, 1)
0.81

其損失值也不大,如果選用均方誤差作為邏輯回歸的損失函式,很可能訓練不起來,

這樣我們就明白了為什么邏輯回歸要選擇交叉熵,

我們再來看線性回歸為什么不選擇交叉熵,直接說結論,假設概率分布為高斯分布的情況下,采用交叉熵損失等同于采用均方誤差損失,相關證明可以網上查找,

交叉熵損失的梯度

這里以多分類問題為例,拷貝了博主之前的另一篇文章Softmax與Cross-entropy的求導,

softmax函式為:

y ^ i = e z i ∑ k = 1 K e z k \hat y_i = \frac{e^{z_i}}{\sum_{k=1}^K e^{z_k}} y^?i?=k=1K?ezk?ezi??

這里 K K K是類別的總數,接下來求 y ^ i \hat y_i y^?i?對某個輸出 z j z_j zj?的導數,
? y ^ i ? z j = ? e z i ∑ k = 1 K e z k ? z j \frac{\partial \hat y_i}{\partial z_j} = \frac{\partial \frac{e^{z_i}}{\sum_{k=1}^K e^{z_k}}}{\partial z_j} ?zj??y^?i??=?zj??k=1K?ezk?ezi???

這里要分兩種情況,分別是 i = j i=j i=j i ≠ j i \neq j i?=j,當 i = j i=j i=j時, e z i e^{z_i} ezi? z j z_j zj?的導數為 e z i e^{z_i} ezi?,否則當 i ≠ j i \neq j i?=j時,導數為 0 0 0

i = j i = j i=j
? y ^ i ? z j = e z i ? ∑ k = 1 K e z k ? e z i ? e z j ( ∑ k = 1 m e z k ) 2 = e z i ∑ k = 1 m e z k ? e z i ∑ k = 1 m e z k ? e z j ∑ k = 1 m e z k = y ^ i ? y ^ i 2 = y ^ i ( 1 ? y ^ i ) \begin{aligned} \frac{\partial \hat y_i}{\partial z_j} &= \frac{e^{z_i}\cdot \sum_{k=1}^K e^{z_k} - e^{z_i} \cdot e^{z_j} }{(\sum_{k=1}^m e^{z_k})^2} \\ &= \frac{e^{z_i}}{\sum_{k=1}^m e^{z_k}} - \frac{e^{z_i}}{\sum_{k=1}^m e^{z_k}} \cdot \frac{e^{z_j}}{\sum_{k=1}^m e^{z_k}} \\ &= \hat y_i - \hat y_i^2 = \hat y_i(1 - \hat y_i) \end{aligned} ?zj??y^?i???=(k=1m?ezk?)2ezi??k=1K?ezk??ezi??ezj??=k=1m?ezk?ezi???k=1m?ezk?ezi???k=1m?ezk?ezj??=y^?i??y^?i2?=y^?i?(1?y^?i?)?

i ≠ j i \neq j i?=j
? y ^ i ? z j = 0 ? ∑ k = 1 K e z k ? e z i ? e z j ( ∑ k = 1 m e z k ) 2 = ? e z i ∑ k = 1 m e z k ? e z j ∑ k = 1 m e z k = ? y ^ i y ^ j \begin{aligned} \frac{\partial \hat y_i}{\partial z_j} &= \frac{0 \cdot \sum_{k=1}^K e^{z_k} - e^{z_i} \cdot e^{z_j}}{(\sum_{k=1}^m e^{z_k})^2} \\ &= - \frac{e^{z_i}}{\sum_{k=1}^m e^{z_k}} \cdot \frac{e^{z_j}}{\sum_{k=1}^m e^{z_k}} \\ &= - \hat y_i \hat y_j \end{aligned} ?zj??y^?i???=(k=1m?ezk?)20?k=1K?ezk??ezi??ezj??=?k=1m?ezk?ezi???k=1m?ezk?ezj??=?y^?i?y^?j??

損失函式 L L L為:
L = ? ∑ k y k log ? y ^ k L = -\sum_k y_k \log \hat y_k L=?k?yk?logy^?k?

其中 y k y_k yk?是真實類別,相當于一個常數,接下來求 L L L z j z_j zj?的導數

? L ? z j = ? ? ( ∑ k y k log ? y ^ k ) z j = ? ? ( ∑ k y k log ? y ^ k ) ? y ^ k ? y ^ k ? z j = ? ∑ k y k 1 y ^ k ? y ^ k z j = ( ? y k ? y ^ k ( 1 ? y ^ k ) 1 y ^ k ) k = j ? ∑ k ≠ j y k 1 y ^ k ( ? y ^ k y ^ j ) = ? y j ( 1 ? y ^ j ) ? ∑ k ≠ j y k ( ? y ^ j ) = ? y j + y j y ^ j + ∑ k ≠ j y k ( y ^ j ) = ? y j + ∑ k y k ( y ^ j ) = ? y j + y ^ j = y ^ j ? y j \begin{aligned} \frac{\partial L}{\partial z_j} &= \frac{\partial -(\sum_k y_k \log \hat y_k)}{z_j}\\ &= \frac{\partial -(\sum_k y_k \log \hat y_k)}{\partial \hat y_k} \frac{\partial \hat y_k}{\partial z_j} \\ &= -\sum_k y_k \frac{1}{\hat y_k} \frac{\partial \hat y_k}{z_j} \\ &= \left(-y_k \cdot \hat y_k(1 - \hat y_k) \frac{1}{\hat y_k} \right)_{k=j} - \sum_{k \neq j} y_k \frac{1}{\hat y_k} (-\hat y_k \hat y_j) \\ &= - y_j (1 -\hat y_j) - \sum_{k \neq j} y_k (-\hat y_j) \\ &= - y_j + y_j \hat y_j + \sum_{k \neq j} y_k (\hat y_j) \\ &= - y_j + \sum_{k} y_k (\hat y_j) \\ &= - y_j +\hat y_j \\ &= \hat y_j -y_j \end{aligned} ?zj??L??=zj???(k?yk?logy^?k?)?=?y^?k???(k?yk?logy^?k?)??zj??y^?k??=?k?yk?y^?k?1?zj??y^?k??=(?yk??y^?k?(1?y^?k?)y^?k?1?)k=j??k?=j?yk?y^?k?1?(?y^?k?y^?j?)=?yj?(1?y^?j?)?k?=j?yk?(?y^?j?)=?yj?+yj?y^?j?+k?=j?yk?(y^?j?)=?yj?+k?yk?(y^?j?)=?yj?+y^?j?=y^?j??yj??

這里用到了 ∑ k y k = 1 \sum_{k} y_k = 1 k?yk?=1

Reference

  1. 如何理解資訊熵

  2. 損失函式是如何設計出來的

  3. Softmax與Cross-entropy的求導

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/374551.html

標籤:AI

上一篇:ubuntu入門---從配置虛擬機到使用qtcreator運行opencv3.4(C++)

下一篇:R語言ggplot2可視化:將dataframe和資料列名稱傳遞給函式通過函式進行ggplot2可視化輸出

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more