大白話5分鐘帶你走進人工智能-第二十節邏輯迴歸和Softmax多分類問題(5)

                                                    大白話5分鐘帶你走進人工智能-第二十節邏輯迴歸和Softmax多分類問題(5)算法

上一節中,咱們講解了邏輯迴歸的優化,本節的話咱們講解邏輯迴歸作多分類問題以及傳統的多分類問題,咱們用什麼手段解決。網絡

先看一個場景,假如咱們如今的數據集有3個類別,咱們想經過邏輯迴歸建模給它區分出來。但咱們知道邏輯迴歸本質上是區分二分類的算法模型。難道沒有解決辦法了嗎?辦法仍是有的,既然想分出3類,咱們姑且稱這3個類別號爲0,1,2。想經過邏輯迴歸作二分類的話,那麼咱們就分別判斷每一條樣本數據屬不屬於0號類別,屬不屬於1號類別,屬不屬於2號類別去判斷,這樣至關於創建3個邏輯迴歸的模型,分別訓練,既照顧了邏輯迴歸二分類的本質,也照顧了多分類的需求。假如咱們訓練出來的3個模型, 第一個模型判斷是否是1號類別的機率是0.8  第二個模型判斷是否是2號類別的機率是0.1  第三個模型判斷是否是3號類別的機率是 0.6 ,綜合來看0.8>0.6>0.1,因此咱們對這條樣本判別爲1號類別。剩下的全部樣本數據亦如此。這種用邏輯迴歸解決問題的方式就是OVR( ovr  one vs rest )。這裏問個問題,這三個模型判斷出來各自的機率相加結果是1 嗎?確定不是。由於咱們是對每一個模型單獨訓練出來的。函數

咱們先總結一下OVR思路就是:1,修改數據的lable。2,而後訓練N個邏輯迴歸模型。3,根據輸出結果機率輸出。測試

這裏須要注意一個問題就是樣本不均衡的問題。邏輯迴歸就怕樣本不均衡,當負例比正例或者正列比負例多不少的時候,模型判斷會不許確,邏輯迴歸,最喜歡的是1:1的正負例。 由於假若有一個訓練集只有一條正例,其它的全都是負例,那麼哪怕把全部的條目都判斷爲負例,正確率仍是99%。由於在訓練過程當中,咱們是找了一組w帶來總的預測正確率最高,但這樣狀況下當樣本不均衡的時候就會對正例特別的不公平,由於它只追求總的預測正確率最高,無論是正例仍是負例,都會對少的那一部分很不公平,它會着重的想把多的預測準確了,得到更大的收益,對它來講這個w是更好的w。因此當樣本不均衡的時候不必定會很差,可是頗有可能的模型會不穩定。優化

怎麼解決樣本不均衡的問題?人工智能

一般的辦法是對多的進行降採樣。 好比說只有30%的正例,有70%是負例,第一對70%的負例裏面進行一個降採樣,不要所有的負例了。第二,創造一些新的正例樣本,屬性隨機採樣,就是說把正例樣本的每一個屬性對應的值隨機採起點出來,組合出一個新的正例樣原本,這樣凡是涉及到人工建立的訓練集一般不太好,可是它是沒辦法的辦法,已經不均衡了,沒有更多的訓練集了。按理說用降採樣,可是發現不光負例多,正例還特別少,才幾十條正例這會這已經很難了,只要樣本少,誰也幫不了,神仙也救不了,惟一能自救的方法就是重採樣一下。適當的生成出一些新的訓練集,但生成的東西並不必定能表明客觀規律,這是沒辦法的事兒,確實少,也只能試一試。因此能夠經過對少的樣本進行重採樣,經過對多的樣本進行降採樣,來必定程度上緩和咱們樣本不均衡的問題。除此以外,使用決策樹的方法。那麼它對於樣本不均衡,要比邏輯迴歸要堅固的多,魯棒性要好得多,因此換句話說,須要選擇其它的算法來解決這個問題。spa

除此以外,咱們引入一種叫softmax的方式,它比OVR對樣本不均衡的問題要稍好一些,並且它的分類效果更好。它其實就是一個跟邏輯迴歸相似的一個專門解決多分類的模型,它有本身的判別函數,也有本身的損失函數,是邏輯迴歸的一種拓展,邏輯迴歸是softmax的一種特例。3d

若是如今只讓用一個模型去判斷一個5分類任務,這個模型要輸出什麼?至少得輸出5個機率出來,才能判斷。只輸出兩個機率,我怎麼判斷剩下3個?輸出形式必定要出現5個機率。因而它特別簡單,它就搞出了5組w,其實就有點神經網絡的感受了。神經網絡咱們還沒講,不過不要緊,你先有個大致的概念。之後咱們再會對神經網絡裏面softmax函數詳細解釋,由於它很重要。幾乎能夠說是任何多分類問題最後的一步。咱們這裏就直到softmax就是一個單層的神經網絡就能夠了,如下關於神經網絡解釋softmax的問題聽不懂不要緊,後面在神經網絡裏面會詳細說的。我們說五分類,5組模型,W1,W2,W3,W4,W5,如今一個x扔進來以後,要同時交給每組W算出一個結果,獲得了W1^Tx,W2^Tx,W3^Tx,W4^Tx,W5^Tx,接下來把獲得的每個結果機率化輸出,爲:rest

                                                \frac{e^{w_{1}^{T}x}}{\sum e^{w_{i}^{T}x}}\frac{e^{w_{2}^{T}x}}{\sum e^{w_{i}^{T}x}}\frac{e^{w_{3}^{T}x}}{\sum e^{w_{i}^{T}x}}\frac{e^{w_{4}^{T}x}}{\sum e^{w_{i}^{T}x}}\frac{e^{w_{5}^{T}x}}{\sum e^{w_{i}^{T}x}}code

在 softmax迴歸中,咱們解決的是多分類問題(相對於 logistic 迴歸解決的二分類問題),類標y能夠取k個不一樣的值(而不是兩個)所以,對於訓練集\left\{\left(x^{(1)}, y^{(1)}\right), \ldots,\left(x^{(m)}, y^{(m)}\right)\right\},咱們有$y^{(i)} \in\{1,2, \ldots, k\}$,(注意此處的類別下標從 1 開始,而不是 0)。對於給定的測試輸入x,咱們想用假設函數針對每個類別j估算出機率值p(y=j|x),也就是說,咱們想估計x的每一種分類結果出現的機率。

所以,咱們的假設函數將要輸出一個k維(k個類別)的向量來表示這k個估計的機率值。具體地說,咱們的假設函數h(θ)形式以下:

                             h_{\theta}\left(x^{(i)}\right)=\left[ \begin{array}{c}{p\left(y^{(i)}=1 | x^{(i)} ; \theta\right)} \\ {p\left(y^{(i)}=2 | x^{(i)} ; \theta\right)} \\ {\vdots} \\ {p\left(y^{(i)}=k | x^{(i)} ; \theta\right)}\end{array}\right]=\frac{1}{\sum_{j=1}^{k} e^{\theta_{j}^{T} x^{(i)}}} \left[ \begin{array}{c}{e^{\theta_{1}^{T} x^{(i)}}} \\ {e^{\theta_{2}^{T} x^{(i)}}} \\ {\vdots} \\ {e^{\theta_{k}^{T} x^{(i)}}}\end{array}\right]

其中$\theta_{1}, \theta_{2}, \ldots, \theta_{k} \in \mathrm{R} \mathfrak{e}^{n+1}$是模型的參數,\frac{1}{\sum_{j=1}^{k} e^{\theta_{j}^{T} x^{(i)}}}這一項對機率分佈進行歸一化,使得全部機率之和爲 1。實際上就是把一個x(i)丟在一個hθ裏面要輸出一組機率,好比這個例子裏面要輸出5個機率,每一個機率實際上它的判別函數都是它們共用同一個分母,只不過度子部分不一樣,第一個機率就是第一組w算出來分數扔到e的上面得出來的結果,每個都是每一組w對於同一個x(i)的運算結果,分母又是全部分子的加和,所以它們整體的加和必定是等於1的。這個就是softmax的判別函數。

爲了方便起見,咱們一樣使用符號θ來表示所有的模型參數,將θ用一個k*n的矩陣來表示,k個類別,n個屬性值,每一類這這些屬性上面都對應着一組參數。該矩陣是將每組$\theta_{1}, \theta_{2}, \ldots, \theta_{k}$按照行羅列起來獲得的。以下所示:

                                                                       \theta=\left[ \begin{array}{c}{-\theta_{1}^{T}-} \\ {-\theta_{2}^{T}-} \\ {\vdots} \\ {-\theta_{k}^{T}-}\end{array}\right]
有了這一組θ,咱們的h(x)就可使用了,那怎麼獲得最好的一組θ?仍是經過最大似然來推導損失函數。咱們先來看下示性函數的表示就是1,其取值規則爲:1{值爲真的表達式}=1,1{值爲假的表達式} =0。舉例來講,表達式:1{2+2=4}的值爲1 ,由於2+2=4是正確的值爲真,因此1{2+2=4}的值爲1。同理, 1{2+2=5}的值爲 0。

回顧下邏輯迴歸的損失函數:

                                                $-\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*log h(x)+(1-yi)*log (1-h(x))組成,可是由於yi不是0就是1,前面在後面就沒了,後面在前面就沒了,因此對每一條樣原本說就只能存活下來一項,這個是針對二分類來講的。把其寫成示性函數的表達就是:

                                                -$\sum_{i=1}^{m} \sum_{j=0}^{1} 1\left\{y^{(i)}=j\right\} \log p\left(y^{(i)}=j | x^{(i)} ; \theta\right)$

解釋下:好比一條樣本標籤真實值yi是0,根據咱們上面的描述yi*log h(x)+(1-yi)*log (1-h(x))這裏面只能存在一項就是後面一項。而對於示性函數來講$\sum_{j=0}^{1} 1\left\{y^{(i)}=j\right\} \log p\left(y^{(i)}=j | x^{(i)} ; \theta\right)$這個裏面j是累加到1,兩個取值,j先爲0的時候,yi=j=0爲真。1{值爲真的表達式}=1,因此當j爲0的時候值保留下來,當j爲1的時候yi=j=1≠0,1{值爲假的表達式} =0,因此當j爲1的時候值沒有累加。所以真正每一條樣本計算的就是其對應真實y的時候那一部分機率值。

而對於多分類來講咱們須要像推導邏輯迴歸損失函數同樣,把每一條樣本預測正確的機率連乘,使得似然最大。那多分類的每一條樣本預測正確的機率就是:

                                                      \sum_{j=1}^{k} 1\left\{y^{(i)}=j\right\} \log \frac{e^{\theta_{j}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}}

在Softmax迴歸中將x分類爲類別j的機率爲:

                                            h(\theta)x=p\left(y^{(i)}=j | x^{(i)} ; \theta\right)=\frac{e^{\theta_{j}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}}

舉例來講,假如是3分類,這個預測就輸出3個機率,也就是3個數,對每一條樣原本說,其中第一個機率表明是我預測它最後類別是1的機率,第二個是表明我預測它類別爲2的機率,第三個就是我預測它類別爲3的機率,它實際的類別假如爲1的話,我預測對了的機率是第一個數,第二個數仍是第三個數?應該是第一個數。就從裏邊挑出應該預測正確的機率放在這,這就是它正確的機率,由於對每個樣原本說yi只能取一個值,因此裏面的加和也只會存活下來一項。每一條樣本yi等於多少其對應的hθ(x)的值就留下來。好比第一個樣本真實分類是0,那就保留\frac{e^{\theta_{0}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}}這一部分,第二個真實樣本類別是1 ,那就保留\frac{e^{\theta_{1}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}}這一部分,第三個真實樣本分類是2,那就保留\frac{e^{\theta_{2}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}}這一部分,損失函數只取決於預測對的那一項的機率,其它的機率其實損失函數角度是不關心的。因此它儘可能,想讓訓練集上所有預測的總正確率最大,就須要把每條數據被預測正確的機率給連乘起來,求最大似然,加個log,連乘變連加,而後加個負號就獲得這個損失函數了。最後推導出來的softmax損失函數以下:

                                                       J(\theta)=-\sum_{i=1}^{m} \sum_{j=1}^{k} 1\left\{y^{(i)}=j\right\} \log \frac{e^{\theta_{j}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}}

能夠看到,Softmax代價函數與logistic 代價函數在形式上很是相似,只是Softmax損失函數中對類標記的k個可能值進行了累加。

對於J(θ)的最小化問題,當前尚未閉式解法。所以,咱們使用迭代的優化算法(例如梯度降低法,或 L-BFGS)。通過求導,咱們獲得梯度公式以下:

                                            \nabla_{\theta_{j}} J(\theta)=-\frac{1}{m} \sum_{i=1}^{m}\left[x^{(i)}\left(1\left\{y^{(i)}=j\right\}-p\left(y^{(i)}=j | x^{(i)} ; \theta\right)\right)\right]

有了上面的偏導數公式之後,咱們就能夠將它代入到梯度降低法等算法中,來最小化J(θ)。例如,在梯度降低法的標準實現中,每一次迭代須要進行以下更新:

                                                            $\theta_{j} :=\theta_{j}-\alpha \nabla_{\theta_{j}} J(\theta)(j=1, \ldots, k)$

獲得一組θ使得模型表現最好。此時獲得θ就是softmax訓練出來的結果。因此無論它是什麼損失函數,你總能夠交給sgd或者l-bfgs進行最小化,獲得一組θ使得模型表現最好。

對於softmax,你它的本質是把好幾個邏輯迴歸塞到一塊兒去了,可是它判別函數又變了變,原來是1/{1+exp(-z)},如今變成了e的z求和,有多少個z就求和多少次,加起來以後當分母,而後分子爲對應部分預測的機率,這樣它們輸出的每一個機率就都進行了歸一化。

softmax有一個有趣的特色:softmax的形式是有幾個分類,就有幾組w向量,好比三類,最終訓練出來的參數實際上就是θ1,θ2,θ3,原來邏輯迴歸是一組θ,如今是三組θ。你把這三組θ都減去一個相同的向量φ,好比φ全是1。 假如這θ長度爲五,φ是五個1也好,五個2也好,12345也好,只要把每個θ的向量都減去同一個φ,你就會發現他們預測結果沒有任何變化。假如我拿每個θ都減去了同一個φ,我把θj-φ看成原來的θj,即:

                                                          \begin{aligned} p\left(y^{(i)}=j | x^{(i)} ; \theta\right) &=\frac{e^{\left(\theta_{j}-\psi\right)^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\left(\theta_{l}-\psi\right)^{T} x^{(i)}}} \\ &=\frac{e^{\theta_{j}^{T} x^{(i)} e^{-\psi^{T} x^{(i)}}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)} e^{-\psi^{T} x^{(i)}}}} \\ &=\frac{e^{\theta_{l=1}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}} \end{aligned}

經過上面公式展開,也就是說減φ與不減φ不影響最終的預測結果。這說明softmax參數有冗餘,既然隨便減一個φ能夠,那我都給他減一個θ1,也能夠,那麼就是把θ1全變成零了,θ2變成θ2-θ1了,θ3變成θ3-θ1了。因此實際上咱們只須要保存兩組參數就夠了。

咱們再來看下Softmax迴歸與Logistic 迴歸的關係:當類別數k=2時,softmax 迴歸退化爲 logistic 迴歸。這代表 softmax 迴歸是 logistic 迴歸的通常形式。具體地說,當k=2時,softmax 迴歸的假設函數爲:

                                                                      h_{\theta}(x)=\frac{1}{e^{\theta_{1}^{T} x}+e^{\theta_{2}^{T} x^{(i)}}} \left[ \begin{array}{c}{e^{\theta_{1}^{T} x}} \\ {e^{\theta_{2}^{T} x}}\end{array}\right]

利用softmax迴歸參數冗餘的特色,θ1全置爲0,θ2變成θ2-θ1:那麼h(x)會輸出兩個結果。即:

                                                                       h(x)=\frac{1}{e^{\overrightarrow{0}^{T} x}+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x^{(i)}}} \left[ \begin{array}{c}{e^{\overrightarrow{0}^{T} x}} \\ {e^{\left(\theta_{2}-\theta_{1}\right)^{T} x} ]}\end{array}\right]

                                                                               =\left[ \begin{array}{c}{\frac{1}{1+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x}}} \\ {\frac{e^{\left(\theta_{2}-\theta_{1}\right)^{T} x}}{1+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x}}}\end{array}\right]

                                                                              =\left[ \begin{array}{c}{\frac{1}{1+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x^{(i)}}}} \\ {1-\frac{1}{1+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x^{(i)}}}}\end{array}\right]

咱們就會發現 softmax 迴歸器預測其中一個類別的機率爲\frac{1}{1+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x(i)}},另外一個類別的機率就是1-\frac{1}{1+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x}(i)}

此時的softmax迴歸就是參數爲θ2-θ1的邏輯迴歸

相關文章
相關標籤/搜索