- 轉自:http://blog.csdn.net/jasonzzj/article/details/52017438
- 前言
- 交叉熵損失函數
- 交叉熵損失函數的求導
前言
說明:本文只討論Logistic回歸的交叉熵,對Softmax回歸的交叉熵類似。
首先,我們二話不說,先放出交叉熵的公式:
J(θ)=−1m∑i=1my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))),
以及
J(θ)對
參數
θ
的偏導數(用於諸如梯度下降法等優化算法的參數更新),如下:
∂∂θjJ(θ)=1m∑i=1m(hθ(x(i))−y(i))x(i)j
但是在大多論文或數教程中,也就是直接給出了上面兩個公式,而未給出推導過程,而且這一過程並不是一兩步就可以得到的,這就給初學者造成了一定的困惑,所以我特意在此詳細介紹了它的推導過程,跟大家分享。因水平有限,如有錯誤,歡迎指正。
交叉熵損失函數
我們一共有m組已知樣本,
(x(i),y(i))
表示第
i
組數據及其對應的類別標記。其中
x(i)=(1,x(i)1,x(i)2,...,x(i)p)T
為p+1維向量(考慮偏置項),
y(i)
則為表示類別的一個數:
- logistic回歸(是非問題)中,
y(i)
取0或者1;
- softmax回歸(多分類問題)中,
y(i)
取1,2…k中的一個表示類別標號的一個數(假設共有k類)。
這里,只討論logistic回歸,輸入樣本數據
x(i)=(1,x(i)1,x(i)2,...,x(i)p)T
,模型的參數為
θ=(θ0,θ1,θ2,...,θp)T
,因此有
θTx(i):=θ0+θ1x(i)1+⋯+θpx(i)p.
假設函數(hypothesis function)定義為:
hθ(x(i))=11+e−θTx(i)
.
因為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))=log11+e−θTx(i),
logP(y^(i)=0|x(i);θ)=log(1−hθ(x(i)))=loge−θTx(i)1+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=1my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))
由以上表征正確的概率含義可知,我們希望其值越大,模型對數據的表達能力越好。而我們在參數更新或衡量模型優劣時是需要一個能充分反映模型表現誤差的損失函數(Loss function)或者代價函數(Cost function)的,而且我們希望損失函數越小越好。由這兩個矛盾,那么我們不妨領代價函數為上述組合對數概率的相反數:
J(θ)=−∑i=1my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))
上式即為大名鼎鼎的交叉熵損失函數。(說明:如果熟悉“
信息熵“的概念
E[−logpi]=−∑mi=1pilogpi
,那么可以有助理解叉熵損失函數)
交叉熵損失函數的求導
這步需要用到一些簡單的對數運算公式,這里先以編號形式給出,下面推導過程中使用特意說明時都會在該步驟下腳標標出相應的公式編號,以保證推導的連貫性。
①
logab=loga−logb
②
loga+logb=log(ab)
③
a=logea
另外,值得一提的是在這里涉及的求導均為矩陣、向量的導數(矩陣微商),這里有一篇教程總結得精簡又全面,非常棒,推薦給需要的同學。
下面開始推導:
交叉熵損失函數為:
J(θ)=−∑i=1my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))
其中,
loghθ(x(i))=log11+e−θTx(i)=−log(1+e−θTx(i)) ,log(1−hθ(x(i)))=log(1−11+e−θTx(i))=log(e−θTx(i)1+e−θTx(i))=log(e−θTx(i))−log(1+e−θTx(i))=−θTx(i)−log(1+e−θTx(i))①③ .
由此,得到
J(θ)=−1m∑i=1m[−y(i)(log(1+e−θTx(i)))+(1−y(i))(−θTx(i)−log(1+e−θTx(i)))]=−1m∑i=1m[y(i)θTx(i)−θTx(i)−log(1+e−θTx(i))]=−1m∑i=1m[y(i)θTx(i)−logeθTx(i)−log(1+e−θTx(i))]③=−1m∑i=1m[y(i)θTx(i)−(logeθTx(i)+log(1+e−θTx(i)))]②=−1m∑i=1m[y(i)θTx(i)−log(1+eθTx(i))]
這次再計算
J(θ)
對第
j
個參數分量
θj
求偏導:
∂∂θjJ(θ)=∂∂θj(1m∑i=1m[log(1+eθTx(i))−y(i)θTx(i)])=1m∑i=1m[∂∂θjlog(1+eθTx(i))−∂∂θj(y(i)θTx(i))]=1m∑i=1m⎛⎝x(i)jeθTx(i)1+eθTx(i)−y(i)x(i)j⎞⎠=1m∑i=1m(hθ(x(i))−y(i))x(i)j
這就是交叉熵對參數的導數:
∂∂θjJ(θ)=1m∑i=1m(hθ(x(i))−y(i))x(i)j
轉載請注明出處:http://blog.csdn.net/jasonzzj/article/details/52017438