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

LHBlog發表於2019-05-01

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

除此之外,我們引入一種叫softmax的方式,它比OVR對樣本不均衡的問題要稍好一些,而且它的分類效果更好。它其實就是一個跟邏輯迴歸類似的一個專門解決多分類的模型,它有自己的判別函式,也有自己的損失函式,是邏輯迴歸的一種擴充,邏輯迴歸是softmax的一種特例。

如果現在只讓用一個模型去判斷一個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,接下來把得到的每一個結果概率化輸出,為:

                                                \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}}

在 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的邏輯迴歸

相關文章