目錄
1. 前言
2. 交叉熵損失函數
3. 交叉熵損失函數的求導
前言
說明:本文只討論Logistic迴歸的交叉熵,對Softmax迴歸的交叉熵類似(Logistic迴歸和Softmax迴歸兩者本質是一樣的,後面我會專門有一篇文章說明兩者關係,先在這裏挖個坑)。
首先,我們二話不說,先放出交叉熵的公式:
J(θ)=−m1i=1∑my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))),
以及J(θ)對參數θ的偏導數(用於諸如梯度下降法等優化算法的參數更新),如下:
∂θj∂J(θ)=m1i=1∑m(hθ(x(i))−y(i))xj(i)
但是在大多論文或數教程中,也就是直接給出了上面兩個公式,而未給出推導過程,而且這一過程並不是一兩步就可以得到的,這就給初學者造成了一定的困惑,所以我特意在此詳細介紹了它的推導過程,跟大家分享。因水平有限,如有錯誤,歡迎指正。
交叉熵損失函數(Logistic Regression代價函數)
我們一共有m組已知樣本(Batchsize=m),(x(i),y(i))表示第 i 組數據及其對應的類別標記。其中x(i)=(1,x1(i),x2(i),...,xp(i))T爲p+1維向量(考慮偏置項),y(i)則爲表示類別的一個數:
- logistic迴歸(是非問題)中,y(i)取0或者1;
- softmax迴歸 (多分類問題)中,y(i)取1,2…k中的一個表示類別標號的一個數(假設共有k類)。
這裏,只討論logistic迴歸,輸入樣本數據x(i)=(1,x1(i),x2(i),...,xp(i))T,模型的參數爲θ=(θ0,θ1,θ2,...,θp)T,因此有
θTx(i):=θ0+θ1x1(i)+⋯+θpxp(i).
假設函數(hypothesis function)定義爲:
hθ(x(i))=1+e−θTx(i)1.
因爲Logistic迴歸問題就是0/1的二分類問題,可以有
P(y^(i)=1∣x(i);θ)=hθ(x(i))P(y^(i)=0∣x(i);θ)=1−hθ(x(i))
現在,我們不考慮“熵”的概念,根據下面的說明,從簡單直觀角度理解,就可以得到我們想要的損失函數:我們將概率取對數,其單調性不變,有
logP(y^(i)=1∣x(i);θ)=loghθ(x(i))=log1+e−θTx(i)1logP(y^(i)=0∣x(i);θ)=log(1−hθ(x(i)))=log1+e−θTx(i)e−θTx(i)
那麼對於第i組樣本,假設函數表徵正確的組合對數概率爲:
I{y(i)=1}logP(y^(i)=1∣x(i);θ)+I{y(i)=0}logP(y^(i)=0∣x(i);θ)=y(i)logP(y^(i)=1∣x(i);θ)+(1−y(i))logP(y^(i)=0∣x(i);θ)=y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))
其中,I{y(i)=1}和I{y(i)=0}爲示性函數(indicative function),簡單理解爲{ }內條件成立時,取1,否則取0,這裏不贅言。
那麼對於一共m組樣本,我們就可以得到模型對於整體訓練樣本的表現能力:
i=1∑my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))
由以上表徵正確的概率含義可知,我們希望其值越大,模型對數據的表達能力越好。而我們在參數更新或衡量模型優劣時是需要一個能充分反映模型表現誤差的損失函數(Loss function)或者代價函數(Cost function)的,而且我們希望損失函數越小越好。由這兩個矛盾,那麼我們不妨領代價函數爲上述組合對數概率的相反數:
J(θ)=−m1i=1∑my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))
上式即爲大名鼎鼎的交叉熵損失函數。(說明:如果熟悉“信息熵"的概念E[−logpi]=−∑i=1mpilogpi,那麼可以有助理解叉熵損失函數,先挖個坑,後面我會專門寫一篇講信息熵的白話文)
交叉熵損失函數的求導
這步需要用到一些簡單的對數運算公式,這裏先以編號形式給出,下面推導過程中使用特意說明時都會在該步驟下腳標標出相應的公式編號,以保證推導的連貫性。
① logba=loga−logb
② loga+logb=log(ab)
③ a=logea (爲了方便這裏log指loge,即ln,其他底數如2,10等,只是前置常數係數不同,對結論毫無影響)
另外,值得一提的是在這裏涉及的求導均爲矩陣、向量的導數(矩陣微商),這裏有一篇教程總結得精簡又全面,非常棒,推薦給需要的同學。
下面開始推導:
交叉熵損失函數爲:
J(θ)=−m1i=1∑my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))(1)
其中,
loghθ(x(i))=log1+e−θTx(i)1=−log(1+e−θTx(i)) ,log(1−hθ(x(i)))=log(1−1+e−θTx(i)1)=log(1+e−θTx(i)e−θTx(i))=log(e−θTx(i))−log(1+e−θTx(i))=−θTx(i)−log(1+e−θTx(i))①③ .
由此,得到
J(θ)=−m1i=1∑m[−y(i)(log(1+e−θTx(i)))+(1−y(i))(−θTx(i)−log(1+e−θTx(i)))]=−m1i=1∑m[y(i)θTx(i)−θTx(i)−log(1+e−θTx(i))]=−m1i=1∑m[y(i)θTx(i)−logeθTx(i)−log(1+e−θTx(i))]③=−m1i=1∑m[y(i)θTx(i)−(logeθTx(i)+log(1+e−θTx(i)))]②=−m1i=1∑m[y(i)θTx(i)−log(1+eθTx(i))]
這次再計算J(θ)對第j個參數分量θj求偏導:
∂θj∂J(θ)=∂θj∂(m1i=1∑m[log(1+eθTx(i))−y(i)θTx(i)])=m1i=1∑m[∂θj∂log(1+eθTx(i))−∂θj∂(y(i)θTx(i))]=m1i=1∑m(1+eθTx(i)xj(i)eθTx(i)−y(i)xj(i))=m1i=1∑m(hθ(x(i))−y(i))xj(i)
這就是交叉熵對參數的導數:
∂θj∂J(θ)=m1i=1∑m(hθ(x(i))−y(i))xj(i)
向量形式
前面都是元素表示的形式,只是寫法不同,過程基本都是一樣的,不過寫成向量形式會更清晰,這樣就會把i 和求和符號∑省略掉了。我們不妨忽略前面的固定係數項1/m,交叉墒的損失函數(1)則可以寫成下式:
J(θ)=−[yTloghθ(x)+(1−yT)log(1−hθ(x))](2)
將hθ(x)=1+e−θTx1帶入,得到:
J(θ)=−[yTlog1+e−θTx1+(1−yT)log1+e−θTxe−θTx]=−[−yTlog(1+e−θTx)+(1−yT)loge−θTx−(1−yT)log(1+e−θTx)]=−[(1−yT)loge−θTx−log(1+e−θTx)]=−[(1−yT)(−θTx)−log(1+e−θTx)]
再對θ求導,前面的負號直接削掉了,
∂θj∂J(θ)=−∂θj∂[(1−yT)(−θTx)−log(1+e−θTx)]=(1−yT)x−1+e−θTxe−θTx=(1+e−θTx1−yT)x=(hθ(x)−yT)x
轉載請註明:趙子健的博客 » 機器學習系列 » 交叉熵損失函數的求導 [zijian-zhao.com/2020/04/crossEntropyLossGrident/]
由於本人不常登陸CSDN,大家的留言很難及時回覆,因此知乎專欄同步該文,如有疑問歡迎在知乎討論:人工+智能