大白話5分鐘帶你走進人工智慧-第十七節邏輯迴歸之交叉熵損失函式概念(2)

LHBlog發表於2019-04-29

  第十七節邏輯迴歸之交叉熵損失函式概念(2)

上一節中我們講解了邏輯迴歸是做分類的原因,本節的話我們講解邏輯迴歸的損失函式-交叉熵損失函式。邏輯迴歸,是要做分類的,最重要的是要去分界,這個邏輯迴歸它是怎麼找分界?首先它有迴歸兩個字,我們可以轉成另外兩個字,擬合。所以邏輯迴歸找分界,它首先乾的事情是擬合原有的資料,然後再來找分界,怎麼找?

如果知道已知的資料點,用曲線來進行擬合,之後找到某一個位置可以對原有的0和1類別,兩類資料進行一個很好的分開。當然線性迴歸也可以來分類,通過迴歸找到一個分界點X,小於分界點的X屬於某個類別,大於分界點的X屬於另一個類別。為什麼分類一定要找這個點?因為做分類的目標是要訓練出一個模型,然後根據這個模型,我們把未來新的資料xnew帶進來,它可以給我們一個預算結果ŷ,一個分類號,對於二分類來說,它必須得給一個0類別號或者1類別號。所以要根據分界點把每個資料區分開。我們怎麼找到一個很好的分界點?因為y= θ^T*X,它的結果是負無窮到正無窮之間,因此Y=0零是比較合適的一個分界點。假如我們讓y= θ^T*X的負無窮到正無窮之間的值縮放到0到1之間,讓每個值都具有一個概率的含義,越接近零就說這件事情發生的概率越低越小,越接近1就說明這件事情發生的概率就越大。這時候再找一個分界點區分開之前的資料,可以自然而然的想到 是0.5,0.5是50%,就是說它屬於負例的概率是50%,它屬於正例的概率也是50%。所以我們就可以找0到1之間的0.5來作為分界點。 實際上這就是邏輯迴歸的設想。

邏輯迴歸它給出這樣一個縮放的函式,滿足最後縮放的區間是0到1之間,並且在我們原本y= θ^T*X的這個位置,滿足縮放後的位置剛好是對應0.5才合適。所以sigmoid函式,本身是一個S曲線的意思,S型的曲線有無窮無盡種,你可以找很多S曲線,這裡選用的S曲線特點是:

                                                                                                            f(x)=\frac{1}{1+e^{-\theta^Tx}}

你會發現,如果θ^T*X=0的話,f(x)的值剛好等於1/(1+1)=1/2=0.5。所以對f(x)來說就以0.5作為一個分界。也就是說如果我們要去做分類的話,所計算出來的θ^T*X>0是正例,θ^T*X<0是負例。帶到sigmoid函式裡面去,f(x)就是y軸,算出的y軸,所對應的值就是大於0.5是正例,小於0.5是負例。因此我們的目標是找到y是0.5的情況下所對應的x是多少,這樣我們就可以用x或者用縮放完之後的y=0.5來作為分界點,對未來資料進行分類,一個是X軸上的維度,一個是y軸上的維度。

我們再結合圖形來看下對應的函式:

S曲線實際上是y=1/(1+e-θTx),x,y,e,1都是已知的,唯獨只有θ需要去計算,所以算出來的θ引數就是我們的模型,所以這個模型就是去找一組θ,使得θ^T*X縮放之後對應的S曲線儘可能通過我們已有的所有的點。儘可能是人類語言的描述,我們就要把儘可能的給它變成公式,變成數字的表達,然後讓計算機去算,讓它儘可能的誤差最小的時候。

總結下我們的目標就是:構造一個函式更好地解決二分類問題,並且使得這個函式輸出一個 (0,1) 的實數代表概率。通過上面的結論,我們知道這個函式比較好的是sigmoid函式,即:

                                                              g(z)=\frac{1}{1+e^{-z}}

這裡面的Z=w^T*X。如果我們把w^Tx看成一個整體Z ,f(x)就是關於Z的函式,我們定義為g(z),它給出的結果是0到1之間的一個值,我們說如果它小於0.5代表負例,如果大於0.5,它代表正例。即 g(z) <0.5 時, 判斷y=0。g(z)>=0.5時, 判斷y=1。比如某條資料帶到這個公式裡,然後它給出一個ŷ值,這條ŷ資料具體值含義是,它是1類別的概率有多大。比如最後算出來的值是0.85,0.85是大於0.5,那就意味著這條資料它是1這個類別是正例的概率是85%。如果另外一個x new傳進來得到的結果是0.05,首先0.05小於0.5,所以肯定給它分到0這個類別,它就意味著它是1這個類別的概率是0.05,相反它是0類別的概率就是1-0.05,就是0.95。所以實際上得出的ŷ值它代表是該條資料是1這個位置的概率是多少,這是它的實質。

我們再來解剖下z的影像的含義g(z) = 0.5 時 ,W^T*X = 0 在二維平面下是一條直線。如果是一維的情況下,只有一個軸,找到一個點將資料分開,如果有兩個維度,x1,x2,對應一個平面,我們要找到一條直線把它分開。比如下圖:

紅色和綠色是已知的資料點,是不同的類別,當wTx=0的話,就意味著w1*x1+w2*x2+b=0,正好是圖中的分界線,將資料分割了兩個類別。因為這個地方帶有截距,所以沒有穿過原心點。直線左側的x通過計算會讓g(z)<5,也就是說這裡面紅顏色的就是小於0.5的負例,綠顏色就是大於0.5的正例。這個東西很簡單,之前說的一維情況下,就把小於0的設為負例。

 所以看起來我們找到了分類的方法,那麼如何確定g(z)?實際上確定了一組w, 就確定了 z,因為Z=w^T*X確定了z 就確定了 g(z) 的輸出。這裡的g(z) 也可以寫成 g(w,x),代表每條樣本所對應的輸出。它應該有以下特點,首先值是0到1之間,有概率含義;其次這個概率的含義就是在已知w和x的情況下,它是1類別的概率是多少。我們轉化成數學形式的表達就是:以w.x為條件,它的y是1的概率。即:

P(y=1|w,x),自然而然以w.x為條件,它的y是0的概率,即P(y=0|w,x)=1- g(z),是相反的。

所以我們的期望是找到一組w使得已有的資料x為已知的條件下,你預測出來的ŷ發生的概率最大,也就是希望預測出來的ŷ和手頭上已經拿到的y一致。什麼是不一致,什麼是誤差?ŷ-y是偏差,誤差。對於分類來說,真實的y要麼是0,要麼就是1。對於ŷ來說,它是一個0到1之間的一個值。如果它真實是1類別,我們的ŷ計算出來結果又正好是1.0,百分之一百準確。如果我們真實類別是1,計算出來是個0.2,這個誤差就是0.8。如果你真實的類別是0,你計算出來是0.2,那這個偏差就是0.2。因為它最完美的情況就是0這個類別概率就是0,1這個類別概率就是1.因此我們期望就是隻要讓我們的g(w,x)函式在訓練集上預測正確的概率最大,我的g(w,x)就是好的g(w,x)。

舉個例子,比如下面的資料集:

 

x1,x2,x3,x4分別代表不同的維度,y就是真實的y類別號。我們要求的結果是每個維度所對應的模型w。而我們預測正確的概率,就是ŷ=1/(1+e-θ^T*x),即g(w,x)。它是1類別的概率是g(w,x),它是0類別的概率就是1- g(w,x)。我們結合最大似然的思想。回顧前面我們所學的知識最大似然的總似然是怎麼求的?就是要得到每條樣本的概率相乘。而當我們求出一組模型來的話,此時的總似然就是我們對應這個模型下每一個樣本的概率相乘,而每一個樣本此時的概率就是我們預測正確的概率值。我們最大似然的前提是假設這裡面的每條樣本它是隨機並且獨立的從所有的樣本里面取樣的這一部分,所以假如我們的訓練集裡面就這五條資料,並且每條樣本之間相對獨立。對於我們這五條樣本來說,這裡面總的MLE(最大似然)就是第一條樣本乘以這組w,然後再帶到Sigmoid函式裡面去得到g(w*x1),這個X1,代表第一條樣本,第二個就是g(w*x2),X2代表第二條樣本,第三個就是g(w*x3),第四條是1-g(w*x4),第五條樣本是1-g(w*x5),連續相乘,得到總似然。即:MLE=g(w*x1)*g(w*x2)*g(w*x3)*1-g(w*x4)*1-g(w*x5)。這裡面的x1,x2,x3,x3,x5分別代表每一行樣本。簡化一下就是:

                                                              $g(w * x)^{3} *[1-g(w * x)]^{2}$

我們只所以將樣本預測出來的概率寫成g(w,xi)或者是1-g(w,xi),是因為我們看了一眼真實的y=1,才把它寫成g(w,xi),看了一眼真實的 y=0給它寫成1-g(w,xi)。即:

                                                            

如果要沒看y是1還是0,來表達一個形式的話,那就是下面泛化的形式,它都可以來表達這兩種情況。對於每一條資料預測正確的概率即:

                                                             

假設這條樣本,它的lable標籤y是1,放到公式中,1-yi=0,後面一部分是1,剩下就是g(w,xi)。如果yi=0的話,前面這部分就是1,後面這部分是1-g(w,xi)。所以說這種形式是不看yi是1,0的情況下,就可以知道概率如何來通過公式來描述和表達。 如果我們有n條樣本,要做一個總似然,要把所有條樣本的概率相乘.即

                                                              

因為假設獨立了。所以用一個連乘符號∏,從第1條樣本一直乘到n條樣本。pi就是上面的單個預測正確的式子。我們得到了一個總似然的式子,記P(全部正確) 為 L(θ),這裡的θ為之前的w,記g(w,xi)為h(θ),即:

                                                            $L(\theta)=\prod_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)\right)^{y^{(i)}}\left(1-h_{\theta}\left(x^{(i)}\right)\right)^{1-y^{i}}$

它的連乘可以通過log,ln變一下。實際上就是L(θ),大寫的L,然後取個對數,把它變成l(θ),小寫的l。即:

                                                           $\begin{aligned} l(\theta) &=\log L(\theta)\\ &=\prod_{i=1}^{m}log\left(h_{\theta}\left(x^{(i)}\right)\right)^{y^{(i)}}+log\left(1-h_{\theta}\left(x^{(i)}\right)\right)^{1-y^{i}}$\\ &=\sum_{i=1}^{m}\left(y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right) \end{aligned}$

解釋下上面公式:因為log(a*b)=log a+log b,所以從第一個公式化簡到第二個公式,所以L(θ),把它變成對數形式l(θ),連乘就變成連加,從第1條加到第m條。又log x^2=2log x,所以從第二條化簡為第3條公式,即化簡為上面公式。

我們要使得整體似然函式最大,而此時這樣一個公式,就成為我們的目標函式。但是搞機器學習的人喜歡去把它換個名稱叫損失函式,一般提到損失函式我們都是要找最小。這件事情很簡單,如果要找它的最大,就相當於在前面添個-,找添上-之後的整體最小。 所以邏輯迴歸的損失函式就推匯出來了。

所以簡單歸納起來就是首先要根據y的真實情況的概率表達,推匯出比較泛化的對每條樣本的概率表達,然後我們再來一個總似然的概率表達,然後把這些東西帶進來,就得到L(θ),然後接著取對數,得到l(θ),最後人為的加一個負號,這就是損失函式。邏輯迴歸比mse要簡單的多。

它有什麼含義呢?它是從最大似然理論推出來的,通常前面加一個負號。即:

                                                -\sum_{i=1}^{m}\left(y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right)

我們會稱為交叉熵。所以很多時候一提到分類,就會提到交叉熵損失函式。這個就是邏輯迴歸裡面的損失函式,它前面是一個負號,所以我們一定要找到交叉熵最小的情況。

熵是什麼意思? 高壓鍋在熵特別大的時候它會爆炸,因為熵從物理上來說,它代表分子的不確定性。分子越不確定,它就亂撞,在高壓鍋裡面亂碰亂撞,總之它代表是不確定性。不確定性越大,就代表熵越大。這個含義也被引入到了資訊理論裡面去,熵越大,就代表了所包含的資訊量越大。

熵越大是件好事還是件壞事?要是研究原子彈,肯定越大越好。放到機器學習裡面,熵越小越好因為我們們希望它是有規律的,是確定性的。所以概率越大,熵就越小。比如說這個人它註定是你一身的伴侶,註定的情況下,就意味著這件事情概率特別大,不確定性相反就會變小,不確定性變小就是熵變小。所以概率越大,不確定性越小,熵越小。概率越小,不確定性越大,熵越大。

我們現在找的就是熵越小的情況下,概率越大,概率越大就越能說明已知的x根據我們的某組w,它就越確定最後的結果是真實y,我們要使得這個概率最大。這個是它的本質。

 

我們看下熵和概率的圖示關係:

 

 

橫軸是概率probability,縱軸是熵 entropy。概率最大是1.0,熵沒有盡頭,概率越大,熵就越小,比如說概率達到1.0的時候,熵就是0。概率越小,熵就越大,越趨於正無窮。它是一個帶拐彎的曲線。對比log函式單調遞增,如果我們反方向畫出log函式,熵的影像類似反方向的log函式。

 

再來看下我們的損失函式:

 

                                                                -\sum_{i=1}^{m}\left(y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right)

左邊一部分是yi=1的情況,右邊一部分是yi=0的情況,其中log hθ(xi)是我們預測的ŷ,前面y^(i)是我們真實的樣本類別,所以yi*log pi,它是交叉熵的公式核心的一部分。如果類比多個分類(k個分類,m個樣本),可以自然而然推匯出目標函式l(θ)公式應該是,0到k個類別各自的yi*log pi累加,然後再從樣本1到m加和,實際上這個就是softmax迴歸的損失函式,即交叉熵,Cross Entropy,公式是:

 

                                                                         $-\sum_{i=1}^{m} \sum_{j=0}^{k} y_{i} \log p_{i}$

 

事實上所有的分類,它的損失函式都是交叉熵。只不過邏輯迴歸裡面的pi是根據Sigmoid函式1/(1+e-z)算出來的。如果有人發明了另外一種演算法,算出來之後概率不是用這樣的公式,無非用交叉熵的時候,hθ(x)的形式變了而已。其實前面推出交叉熵公式的時候,也並沒有涉及到前面說的Sigmoid函式,所以它的推導跟Sigmoid函式沒有關係。只不過邏輯迴歸的損失函式在算hθ(x)的時候用了Sigmoid函式。如果是其它演算法,那就得用其它演算法的公式來算概率。

 

總結下定義損失函式的步驟:因為要使得l(θ ) 最大的θ 生產出來的 g(θ,x) 全預測對的概率最大,但損失函式是要求某個函式結果越小 生成的模型越好,所以我們定義 - l(θ )為邏輯迴歸的損失函式,即:     

 

                                                       $J_{\log }(w)=\sum_{i=1}^{m}-y_{i} \log \left(p\left(x_{i} ; w\right)\right)-\left(1-y_{i}\right) \log \left(1-p\left(x_{i} ; w\right)\right)$

 

問題轉化為 找到一組使損失函式最小的w,下一步就可以用前面講過的梯度下降最小化這樣一個公式,然後找到w在什麼情況下,使得損失函式最小。下一節中我們對具體交叉熵損失函式怎麼求解進行展開。

 

相關文章