# 淺入淺出瞭解機器學習_03_Logistic Regression ###### tags: `淺入淺出瞭解機器學習` Logistic Regression雖然名字上掛著regression,但實際上它的輸出並不是實數值,而是類別,因此它是一個監督式學習的分類應用,也就是它的輸出是$\{0, 1\}$。 只要$h_\theta(x) \geq 0.5$,那output的$\hat{y}=1$,反與當$h_\theta(x) < 0.5$,那output的$\hat{y}=0$,並且$0 \leq h_\theta(x) \leq 1$。 回頭思考linear regression的hypothesis,$h_\theta(x) = \theta^Tx + b$,其輸出是實數值,像文章中內的範例,輸出就是1、2、3,但logistic regression的輸出只會是$\{0, 1\}$,這代表我們需要對hypothesis做一些調整,讓它變身成為logistic regression。 ## Sigmoid function linear regression變身成為logistic regression最主要是加入Sigmoid function,這是一種將線性輸入做非線性轉換的作法,假設$z = \theta^Tx$,那麼hypothesis會變成: * $h_\theta(x) = g(z) = \sigma(z)$ 其中$g$所指為Sigmoid function,執行的動作就是將線性輸入經過$\dfrac{1}{1+e^{-z}}$的計算,讓它的輸出值域介於0, 1之間。 如下圖所示,$x$軸是內積之後的$z$,$y$軸則是輸出的值域,像個S,因此以有有S函數之稱。 ![](https://i.imgur.com/Un0CG6s.jpg) 上圖看的到,當你的線性輸出$z$往正無限大去,轉換之後的值域會非常接近1。反之,當你的線性輸出$z$往負無限小去,轉換之後的值域會非常接近0。其實很明顯的,只要$z>0$,那輸出就是1,只要$z<0$,那輸出就是0。 其實從上圖也可以明顯看的出來,在左右兩端極值的時候它是相對平緩,這意謂著你計算斜率的時候它是非常小的,也代表優化上的困難,而在中間的斜坡處斜率相對較大,當你的輸出是在這值域的時候,優化相對容易,所以訓練過程中會發現,收斂到一個程度之後好像就有點後繼無力就差不多是這樣,當然還有鞍點問題,不過暫時不談。 這種非線性的轉換函數在深度學習中稱為Activation function,中文有很多稱呼,像是啟動函數、激活函數、活化函數。後續談到神經網路的時候會有另外的說明。 某種角度來看,我們所計算的就是在某一組$\theta$之下,給定data point $x$,其$\hat{y}=1$的機率是多少。也就是說,當$h_\theta(x)=0.51$,那就代表有51%的機率是1,同時有49%的機率是0。 當然,整個Logistic Regression並非只是Linear Regression加上一個Sigmoid function那麼簡單,只是因為我們是淺入淺出瞭解機器學習,因此只要知道一件事,這是由最大似然概率推論而得即可。 ## Loss Function Logistic Regression的loss function與linear regression不同,先給出數學式: * $-y\log(h_\theta(x)) - (1-y)\log(1-h_\theta(x))$ 上面的loss function雖然看起來很恐怖,又是$\log$又是$h_\theta(x)$,但其實它非常簡潔,當$y=0$的時候,$-y\log(h_\theta(x))$是被消除的,而當$y=1$的時候,$- (1-y)\log(1-h_\theta(x))$也是被消除的。 當然,這個loss function即是由最大似然概率推論而來,所計算的是cross-entropy,交叉熵,當cross-entropy為0的時候即代表兩個分佈是重疊的。也有人提出,cross-entropy所計算的也是兩個分佈之間的KL-divergence,不管如何,我們所做的就是試著利用所擁有的資料集來擬合出一個我們覺得就是這個domain的實際分佈。 所以,整個資料集的loss就是: $$\dfrac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}), y^{(i)})=-\dfrac{1}{m}[\sum_{i=1}^my^{(i)}\log h_\theta(x^{(i)}) + (1-y^{(i)})\log(1-h_\theta(x^{(i)}))]$$ 參數更新的概念也是一樣不變的,我們計算的就是$\theta$對loss function的偏微分,也就是: * $\theta_j := \theta_j - \alpha \cdot \dfrac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x^{(i)}_j$ 唯一不同的是,現在的hypothesis變成$h_\theta=\sigma(\theta^Tx)$,而loss function已經從MSE變成Cross-entropy。 如果對求導過程有興趣,可以往下看Extension的部份,如果沒有興趣那就此打住也可以,因為框架會處理這一切,未來有興趣自然會往下深讀。 ## Decision Boundary 事實上,如果稍微觀察上面關於Sigmoid function的圖就不難發現,只要$z>0$,那經過Sigmoid function的output就會是1,反之則為0。這意謂著你的決策邊界,也就是decision boundary會如下圖一般的呈現: ![](https://i.imgur.com/GxqvbyI.jpg) 這說明一件事,那就是這樣的hypothesis只能做出線性分割,如果你的資料集分佈不是線性可分的話,那這個模型的效能就可能不是那麼好。 因此,針對不是線性可分的資料集,除了改變使用的模型,像是使用MLP或是SVM之外,我們還可以調整hypothesis,使用Polynomial,也就是多項式參數,但同時也要注意,愈複雜的多項式所造成的overfitting會愈明顯,high bias與high variance之間是需要有所權衡的。(後續會說明high bias與high variance) ## 結論 現在你已經明白Logistic Regression的基本觀念,基本上跟Linear Regression的觀念是互通的。雖然Logistic Regression只是一個簡單的模型,但是面對一個問題,能簡單處理的我們就不需要複雜化來實作。接下來會需要一些實作來對Logistic Regression有更深的體驗。如果要用Linear Regression說明文章中的模型來調整,只需要調整loss function以及predict的部份就可以完成模型的變更。 如果有興趣sklearn的實作,可以參考[Scikit-Learn sklearn.linear_model.LogisticRegression](https://hackmd.io/@shaoeChen/H10yw7hUb) ## Extension_Derivation of the Sigmoid function 我們知道Logistic Regression加入Sigmoid function將輸出轉換為介於0-1之間的值,因此求導過程中一定會考慮到這個非線性轉換函數,因此: $$\begin{align}\dfrac{d}{dz} \sigma(z) & = \dfrac{d}{dz}\left[\dfrac{1}{1 + e^{-z}}\right] \\ & = \dfrac{d}{dz}(1 + e^{-z})^{-1} \\ & = -(1 + e^{-z})^{-2}(-e^{-z}) \\ & = \dfrac{e^{-z}}{(1 + e^{-z})^2} \\ & = \dfrac{1}{1 + e^{-z}} \cdot \dfrac{e^{-z}}{1 + e^{-z}} \\ & = \dfrac{1}{1 + e^{-z}} \cdot \dfrac{(1+e^{-z})-1}{1+e^{-z}} \\ & = \dfrac{1}{1 + e^{-z}} \cdot \left( \dfrac{1+e^{-z}}{1+e^{-z}} - \dfrac{1}{1+e^{-z}} \right) \\ & = \dfrac{1}{1 + e^{-z}} \cdot \left(1 - \dfrac{1}{1+e^{-z}} \right) \\ & = \sigma(z) \cdot (1 - \sigma(z))\end{align}$$ 求導之後我們可以看一下,Sigmoid function與求導所得的值域變化,如下圖所示: ![](https://i.imgur.com/YOv9vD4.jpg) 很清楚的可以看到,當輸出是在接近0與1的時候,梯度是非常小的,只有在中間會才有比較大的梯度,這時候的收斂才會有比較明顯的改變。 ## Extension_Logistic Regression Deriving the Gradient Equation 這邊推導的是Logistic Regression的參數更新,當做未來有興趣的時候深讀的資料,我們已經知道Sigmoid function求導的結果,在推導之後先知道另外兩件事: 1. 自然對數求導的結果即是$\dfrac{d}{dx}\ln(x) = \dfrac{1}{x}$,順便知道,如果裡面是個函數的話,那$\dfrac{d}{dx}\ln(u)=\dfrac{1}{u}\cdot\dfrac{du}{dx}=\dfrac{1}{u}\cdot u'$ 2. 鏈式法則,如果$f(x)=u(v(x))$,那$\dfrac{df}{dx}=\dfrac{du}{dv}\cdot\dfrac{dv}{dx}$ ![](https://i.imgur.com/mjYQNC9.jpg) 推導如下: $$\begin{align}\dfrac{\partial L}{\partial \theta_j} & = \dfrac{\partial}{\partial \theta_j}-[y\log\sigma(z)+(1-y)\log(1-\sigma(z))] \\ & =-\left[\dfrac{\partial}{\partial \theta_j}y\log\sigma(z)+\dfrac{\partial}{\partial\theta_j}(1-y)\log(1-\sigma(z))\right] \\ & = - \dfrac{y}{\sigma(z)}\cdot\dfrac{\partial}{\partial\theta_j}\sigma(z) - \dfrac{1-y}{1-\sigma(z)}\cdot\dfrac{\partial}{\partial\theta_j}(1-\sigma(z)) \\ & = -\left[\dfrac{y}{\sigma(z)} - \dfrac{1-y}{1-\sigma(z)}\right]\dfrac{\partial}{\partial\theta_j}\sigma(z) \\ & = -\left[\dfrac{y-\sigma(z)}{\sigma(z)(1-\sigma(z))}\right]\sigma(z)(1-\sigma(z))\dfrac{\partial z}{\partial\theta_j} \\ & = -\left[\dfrac{y-\sigma(z)}{\sigma(z)(1-\sigma(z))}\right]\sigma(z)(1-\sigma(z))x_j \\ & = -\left[y-\sigma(z)\right]x_j \\ &= \left[\sigma(z)-y\right]x_j\end{align}$$ 整個推導過程雖然看似繁雜,但其實就是我們上面有提到的幾個點的集合而以,分開來說明: 1. 第一段只是單純的寫下對loss function的求導 2. 第二段將loss的求導稍做整理,各自計算$y=0, y=1$的值 3. 第三段則是根據鏈式法則以及對對數求導來調整,左微乘右加上右微乘左,左微是$y$,常數微分為0,直接消掉,右微乘左套入上面第二點所說的對數求導,非常直觀 4. 第四段單純的將相同的項目$\dfrac{\partial}{\partial\theta_j}\sigma(z)$拉出來 5. 第五段,剛才拉出去的部份就是Sigmoid function的求導,只是我們要求的是$\dfrac{\partial}{\partial\theta_j}\sigma(z)$,因此依據鏈式法則,我們可以調整為$\dfrac{\partial\sigma(z)}{\partial z}\cdot \dfrac{\partial z}{\partial\theta_j}$ 6. 第六段,$\dfrac{\partial z}{\partial\theta_j}$求導之後只會剩相關參數的相對應的$x_j$ 7. 第七段,消掉可以消掉的 8. 第八段,得證 ## 參考 吳恩達老師機器學習課程 李宏毅老師機器學習課程 Sebastian Raschka機器學習 [stanford_CHAPTER5_Logistic Regression](https://web.stanford.edu/~jurafsky/slp3/5.pdf)