# Calculus for Machine Learning and Data Science(Week3: Lesson 1 - Optimization in Neural Networks and Newton's Method) ###### tags: `coursera` `Linear Algebra` `math` [Week3 - Optimization in Neural Networks and Newton's Method](https://www.coursera.org/learn/machine-learning-calculus/home/week/3) ## Regression with a perceptron [課程連結](https://www.coursera.org/learn/machine-learning-calculus/lecture/tdJNp/regression-with-a-perceptron) ### Regression Problem Motivation ![](https://hackmd.io/_uploads/ryZTP29pn.png) 這邊給出一個預測房價的範例,x軸是房子的大小,y軸是房價,我們的目標是找出一條線來擬合資料集。房子的大小在這邊又稱為特徵(feature)。 ### Regression with a Perceptron ![](https://hackmd.io/_uploads/HJyMO2qpn.png) 如果把問題再複雜一點來看,我們還可以再加入房間數,這也許也是影響房價的一個主因。 不過如果我們還想要再加入更多特徵呢? ### Regression with a Perceptron ![](https://hackmd.io/_uploads/HkEWYh9T2.png) 這時候我們可以考慮把這個迴歸問題用Perceptron來表示,它可以把input轉變為你想要預測的output,在這邊的範例指的就是房價。 上圖說明了感知器的作業模式,$x_1,x_2$指的就是input feature,也就是房子大小與房間數,經過一個函數的計算之後得到$\hat{y}$,也就是預測的價格。 ### Regression with a Perceptron ![](https://hackmd.io/_uploads/Bycptncp3.png) 中間的函數是什麼?是一個加總函數,細部來看,每個特徵都會有一個對應的權重(weight)$w$,把權重跟對應的輸入相乘之後加總再加上一個bias就是這個函數在做的事情。 ### Regression with a Perceptron ![](https://hackmd.io/_uploads/ryoh5n5T3.png) 這個加總函數加總之後的結果就是我們的預測結果,即$\hat{y}=w_1x_1+w_2x_2+b$。input不會變,會變的就是weights與bias,也因此我們的目標就是找出一組能夠讓預測變的很準的權重與偏差。 基本上就是希望這個組合能夠讓某一個誤差最小化,也就是預測的價格跟實際價格能夠愈接近愈好,這就讓我們引入loss function的觀念了。 ## Regression with a perceptron - Loss function [課程連結](https://www.coursera.org/learn/machine-learning-calculus/lecture/bz4vV/regression-with-a-perceptron-loss-function) ### Mean Squared Error ![](https://hackmd.io/_uploads/S19ann5p2.png) 我們的範例目標就是找出一條線來擬合目標資料集,如果這條線可以很接近每一個點,那就是一個很好的預測。但我們需要一個方法來知道說到底這條線有多好,是不是夠好。 假設現在就這條線,第一個column是實際的價格,第二個column是預測的價格,也就是$\hat{y}$,看起來不錯,但我們還是需要把它量化。 把實際跟預測做相減,這中間的差異就稱為誤差(error),這個誤差基本就是點到預測線的距離(線垂直x軸),距離愈短,則模型愈好,因為這代表預測值足夠接近實際值。 不過就這樣減有時候會正,有時候會負,加加減減之後就可能是零,這會造成誤導,所以我們就把實際與預測相減之後取平方,然後再加個$\dfrac{1}{2}$在前面,就當做約定俗成吧。 ### Regression with a Perceptron ![](https://hackmd.io/_uploads/SJKHT2qTh.png) 把觀念組合起來,加總函數得到了預測值,損失函數計算實際與預測之間的誤差,我們的目標就是找出一組權重與偏差來最小化誤差,使用的方法就是梯度下降 ## Regression with a perceptron - Gradient Descent [課程連結](https://www.coursera.org/learn/machine-learning-calculus/lecture/aAA9l/regression-with-a-perceptron-gradient-descent) ### Regression With a Perceptron ![](https://hackmd.io/_uploads/ryujPWnpn.png) 現在我們的問題目標就是找出一組權重與偏差組合來最佳化問題,也就是最小化loss function,使用的方法就是梯度下降。 回憶一下公式,三個學習參數各自的更新目標為: * $w_1 \to w_1 - \alpha \dfrac{\partial{L}}{\partial{w_1}}$ * $w_2 \to w_2 - \alpha \dfrac{\partial{L}}{\partial{w_2}}$ * $b \to b - \alpha \dfrac{\partial{L}}{\partial{b}}$ 總之就是有個初始值,然後套用公式計算各自的偏導數來做為更新的依據。 ### Regression With a Perceptron ![](https://hackmd.io/_uploads/H1Gnd-h6n.png) 這個更新的動作會用到鏈式法則,基本就是loss的部份是取決於$\hat{y}$的結果,而$\hat{y}$則是取決於各參數,所以各自的偏導數的計算就是: * $\dfrac{\partial{L}}{\partial{b}} = \dfrac{\partial{L}}{\partial{\hat{y}}} \cdot \dfrac{\partial{\hat{y}}}{\partial{b}}$ * $\dfrac{\partial{L}}{\partial{w_1}} = \dfrac{\partial{L}}{\partial{\hat{y}}} \cdot \dfrac{\partial{\hat{y}}}{\partial{w_1}}$ * $\dfrac{\partial{L}}{\partial{w_2}} = \dfrac{\partial{L}}{\partial{\hat{y}}} \cdot \dfrac{\partial{\hat{y}}}{\partial{w_2}}$ ### Regression With a Perceptron ![](https://hackmd.io/_uploads/BkVQ9W3Tn.png) 現在就來做各自的偏導數的推導計算: * $\dfrac{\partial{L}}{\partial{\hat{y}}}=-1 \cdot (y-\hat{y})$,指數下來,$2*1/2=1$,然後裡面是對$\hat{y}$求導,所以是$-1$ * $\dfrac{\partial{\hat{y}}}{\partial{b}}=1$,因為$b$是常數項,求導之後為$1$ * $\dfrac{\partial{\hat{y}}}{\partial{w_1}}=x_1$,跟$w_1$無關的就去掉,對$w_1$求導之後就是$x_1$ * $\dfrac{\partial{\hat{y}}}{\partial{w_2}}=x_2$,跟$w_2$無關的就去掉,對$w_2$求導之後就是$x_2$ ### Regression With a Perceptron ![](https://hackmd.io/_uploads/Bklw9-hTn.png) 總的來看,這就是我們預期最佳化的計算公式。 ### Regression With a Perceptron ![](https://hackmd.io/_uploads/Byzi9Znp3.png) 最後,回到我們的更新公式這邊,帶入剛剛所推導的內容。 這就是我們最佳化過程中的迭代計算。 ## Classification with Perceptron [課程連結](https://www.coursera.org/learn/machine-learning-calculus/lecture/eF3Xh/classification-with-perceptron) 課程說明將Perceptron應用於二分類問題 ### Classification Problem Motivation ![](https://hackmd.io/_uploads/HyJijZhp3.png) 這是個課程中出現過的範例,總之就是外星寶寶語言分析,根據外星寶寶說的話來預測它的情緒。 因為模型的input必需是數字,而非字串,所以我們要先把字串轉為數值,這邊根據的是單一個詞彙出現的次數來做為轉換整理。 ### Classification Problem Motivation ![](https://hackmd.io/_uploads/HyGthbhT2.png) 把詞彙出現的次數繪製出來可以發現到,傷心通常在左上,開心通常在右下。 如果用感知器來表述的話,以$x_1$代表aack出現的次數,$x_2$做為beep出現的次數。然後這個input會經過某個函數的計算之後得到預測結果,預測結果就會跟我們說明這次的外星寶寶情緒是傷心還是快樂的。 ### Classification With a Perceptron ![](https://hackmd.io/_uploads/H1TT6b36h.png) 基本上的一切都跟之前說明的迴歸類似,不一樣的是這次的預測我們希望的是0、1,而不是一個數值。 所以,我們先將加總函數的結果以$z$來表示,即$z=x_1w_1+x_2w_2+b$,然後經過一個稱為sigmoid function的轉換,$\sigma(z)$,這個sigmoid function即為activation function,主要將加總結果$z$轉換為0~1之間的值。 ### Sigmoid Function ![](https://hackmd.io/_uploads/SktMA-2p2.png) 這邊直接給出Sigmoid function的公式$\dfrac{1}{1 + e^{-z}}$。細節的部份後續說明。 ## Classification with Perceptron - The sigmoid function [課程連結](https://www.coursera.org/learn/machine-learning-calculus/lecture/E7NIR/classification-with-perceptron-the-sigmoid-function) ### Sigmoid Function ![](https://hackmd.io/_uploads/H10li8aan.png) sigmoid function很實用,因為它可以把值域縮放到0~1之間,而這也是我們所需求的。 上圖是sigmoid function的值域空間表示,可以看的到,0跟1都是非常非常接近,但就是不會到達。 ### Derivative of a Sigmoid Function ![](https://hackmd.io/_uploads/Hkdp3IaT3.png) 機器學習中很重要的一點就是導數,所以這邊也來推導sigmoid function的求導過程。 1. $\dfrac{1}{1+e^{-z}}$可以寫成$(1+e^{-z})^{-1}$ 2. 指數下來,變成$-1(1+e^{-z})^{-2}$,然後裡面的東西也要計算導數,所以是$-1(1+e^{-z})^{-2}(\dfrac{d}{dz}(1+e^{-z}))$ 3. 調整一下變成$-1(1+e^{-z})^{-2}(\dfrac{d}{dz}(1)+\dfrac{d}{dz}(e^{-z}))$ 4. 常數項求導變成0,所以變成$-1(1+e^{-z})^{-2}(0+e^{-z}\dfrac{d}{dz}(-z))$ 5. 最後變成$-1(1+e^{-z})^{-2}(e^{-z}(-1))$ ### Derivative of a Sigmoid Function ![](https://hackmd.io/_uploads/BkZbaUap2.png) ![](https://hackmd.io/_uploads/HknP6UaTh.png) 剩下再整理一下就可以得到函數的推導結果,非常漂亮的一個函數。 ## Classification with Perceptron - Gradient Descent [課程連結](https://www.coursera.org/learn/machine-learning-calculus/lecture/f0sK2/classification-with-perceptron-gradient-descent) ### Classification With a Perceptron ![](https://hackmd.io/_uploads/rJDRAIaph.png) 現在回到我們的範例,假設現在有這一句話是『Aack beep beep beep』,那輸入就會是1、3,假設學習權重目前各別是$w_1=4.5, w_2=1.5, b=2$,這句話實際上是情緒低落的,因此$y=0$。 感知器做的就是把輸入計算之後得到$\hat{y}$,然後計算這個預測值離實際值多遠,這中間的落差就是error,而對於分類問題來說,最好的計算方式並不是單純的兩個相減然後計算平方,而是log loss。 ### Classification With a Perceptron ![](https://hackmd.io/_uploads/Hy8Zewpa2.png) 感知器的計算就是$\hat{y}=\sigma(w_1x_1 + w_2x_2 + b)$,分類問題會經過一個activation function的計算,這邊的activation function即為sigmoid function。 得到結果之後要計算預測與實際之間的差異,這個loss function的表示為$L(y, \hat{y})$,如果還有印象的話,課程中是提過一個硬幣最佳化的範例,我們的loss function就是從那邊來的,也就是$L(y, \hat{y})=-y\ln{(\hat{y})} - (1-y)\ln(1-\hat{y})$,採用這個方法的一個原因就是其存在著機率性質。 目標就是找一組權重來最小化這個loss function,使用的方法自然就是梯度下降。 ## Classification with Perceptron - Calculating the derivatives [課程連結](https://www.coursera.org/learn/machine-learning-calculus/lecture/626Cc/classification-with-perceptron-calculating-the-derivatives) ### Classification With a Perceptron ![](https://hackmd.io/_uploads/SkQRoXpC3.png) 現在,我們知道問題了,我們想做的就是找出一組參數來最佳化函數。 首先把焦點放在$w_1$對於loss function的變化影響,如果我們能夠找到那一個方向的變化可以降低$L$,那我們剩下要做的就是一直迭代去計算而以。 會影響$w_1$與$L$之間有很多的變數,其中一個就是$\hat{y}$,$\hat{y}$會影響$L$,因此我們需要計算出$\dfrac{\partial{L}}{\partial{\hat{y}}}$,接下來會影響$\hat{y}$的就是$w_1$,所以我們會需要計算出$\dfrac{\partial{\hat{y}}}{\partial{w_1}}$。 最終就會知道$w_1$對$L$的影響有多大,這可以根據鏈式法則得到: $\dfrac{\partial L}{\partial w_1} = \dfrac{\partial{L}}{\partial{\hat{y}}} \cdot \dfrac{\partial{\hat{y}}}{\partial{w_1}}$ ### Classification With a Perceptron ![](https://hackmd.io/_uploads/r1Kz27TCh.png) ![](https://hackmd.io/_uploads/SkkEnQ6Ah.png) 對於$w_2$與bias-$b$也是一樣的做法。 ### Classification With a Perceptron ![](https://hackmd.io/_uploads/r13ca7TC2.png) 剛剛整理之後我們確定有四個計算要處理,其中一個最常出現的就是$\dfrac{\partial{L}}{\partial{\hat{y}}}$,其中$L$做為loss function,它的數學式是$-y\ln(\hat{y}) - (1-y)\ln(1-\hat{y})$,而$\hat{y}$的話就是一個以sigmoid function包住的函數。 結果來看,$\dfrac{\partial{L}}{\partial{\hat{y}}}$的導數就是$\dfrac{-(y-\hat{y})}{\hat{y}(1-\hat{y})}$。 ### Classification With a Perceptron ![](https://hackmd.io/_uploads/r1FWRX6Cn.png) 其它三個的計算,就根據之前的推論可以得到如上的三個結果。 ### Classification With a Perceptron ![](https://hackmd.io/_uploads/HyeFR7aA3.png) ![](https://hackmd.io/_uploads/S1jKCQpRn.png) 整理一下,這幾個偏導數的計算就是這樣,然後把可以消除的消一消做整理。 ### Classification With a Perceptron ![](https://hackmd.io/_uploads/rkY3CmTCh.png) 整理之後發現,wow,簡單,簡潔明瞭。直觀的發現,如果預測跟實際結果相差不多的話,理論上不會有太多的變化。 ### Classification With a Perceptron ![](https://hackmd.io/_uploads/HJWgg4pAn.png) 回到問題,得到一個完整的表示,一個線性計算經過非線性函數(sigmoid function)的計算之後得到預測結果$\hat{y}$,而這個結果會因為sigmoid function的特性而讓值域在0~1之間。將預測結果與實際結果之間的差異計算得到loss,我們希望可以有一組參數可以讓這個loss愈小愈好,而找到這組參數的方法就是使用梯度下降。 反正你就是用這個方式迭代計算收斂就可以得到一個很不錯的結果。 ## Classification with a Neural Network [課程連結](https://www.coursera.org/learn/machine-learning-calculus/lecture/dVK5W/classification-with-a-neural-network) 課程說明於神經網路的應用 ### Classification Problem Motivation ![](https://hackmd.io/_uploads/SJLrRh1G6.png) 上圖是課程中出現過的情緒分析範例。其中$z$是輸入跟權重相乘之後得到的總合,經過sigmoid的轉換之後我們得到結果。 那課程中也提過,這其實是在空間中建立出一個liear boundary,線的某一邊是快樂的,另一邊則是不快樂的。不過語言這種東西可能不是線性能處理的,所以我們需要感知器,很多很多個感知器組合在在一起。這種組合就稱為神經網路。 ### 2,2,1 Neural Network ![](https://hackmd.io/_uploads/HyiiW6kzT.png) 以上圖為例,input之後有兩個感知器,紅的跟綠的,也許兩個會有不同的看法,然後把兩個感知器的輸出丟給另一個感知器,也就是紫色的那個。 計算的話也跟剛剛一樣,輸入的部份會跟每一個感知器的權重做加權計算,紅、綠分別得到各自的輸出,也就是$a_1, a_2$。然後這個輸出再做為紫色感知器的輸入做一樣的加權計算,最終得到$\hat{y}$。 這個模型來看會有一個input layer、一個hidden layer、一個output layer。這就是一個簡易神經網路的樣貌。 ### 2,2,1 Neural Network ![](https://hackmd.io/_uploads/BJoAZpyfT.png) 這邊所給出的是每個感知器以及最終的損失函數的數學計算式。 ## Classification with a Neural Network - Minimizing log-loss [課程連結](https://www.coursera.org/learn/machine-learning-calculus/lecture/o8LC9/classification-with-a-neural-network-minimizing-log-loss) ### 2,2,1 Neural Network ![](https://hackmd.io/_uploads/SJGCXTyMp.png) 這是上一堂課最終看到的結果,我們的目標就是最小化實際與預測之前的誤差。 ### 2,2,1 Neural Network ![](https://hackmd.io/_uploads/HJKAV6Jfa.png) 基本上我們必需要看每一個權重與bias對loss的影響,這也是偏導數$\dfrac{\partial{L}}{\partial{w_{ij}}}$、$\dfrac{\partial{L}}{\partial{b_{i}}}$、$\dfrac{\partial{L}}{\partial{w_{i}}}$、$\dfrac{\partial{L}}{\partial{b}}$所告訴我們的事情,也就是說,這些偏導數會跟我們說每個weights與bias要怎麼移動才能減少loss。 ### 2,2,1 Neural Network ![](https://hackmd.io/_uploads/r1PgI6yMT.png) 簡化問題,我們先看紅色的感知器,也同時把每個input、output的數學式寫入。 ### 2,2,1 Neural Network ![](https://hackmd.io/_uploads/SkSx-RZGa.png) 先看loss與$w_{11}$之間的計算: * $\dfrac{\partial{L}}{\partial{\hat{y}}}$,loss($L$)的部份取決於$\hat{y}$ * $\dfrac{\partial{\hat{y}}}{\partial{z}}$,$\hat{y}$則是看$\sigma(z)$的臉色, * $\dfrac{\partial{z}}{\partial{a_1}}$,$z$則是跟$a_1$有關 * $\dfrac{\partial{a_1}}{\partial{z_1}}$,$a_1$則是跟$z_1$有關 * $\dfrac{\partial{z_1}}{\partial{w_{11}}}$,$z_1$則是跟$w_{11}$有關 這個鏈式法則有點長: $\dfrac{\partial{L}}{\partial{w_{11}}}=\dfrac{\partial{z_1}}{\partial{w_{11}}} \cdot \dfrac{\partial{a_1}}{\partial{z_1}} \cdot \dfrac{\partial{z}}{\partial{a_1}} \cdot \dfrac{\partial{\hat{y}}}{\partial{z}} \cdot \dfrac{\partial{L}}{\partial{\hat{y}}}$ ### 2,2,1 Neural Network ![](https://hackmd.io/_uploads/rJ2VXAZfT.png) 雖然這個鏈式法則有點嚇人,不過你把它拆開來看是很簡單的: $\dfrac{\partial{L}}{\partial{w_{11}}}=\dfrac{\partial{z_1}}{\partial{w_{11}}} \cdot \dfrac{\partial{a_1}}{\partial{z_1}} \cdot \dfrac{\partial{z}}{\partial{a_1}} \cdot \dfrac{\partial{\hat{y}}}{\partial{z}} \cdot \dfrac{\partial{L}}{\partial{\hat{y}}}$ 其中: * $\dfrac{\partial{z_1}}{\partial{w_{11}}}$=$x_1$,只跟$w_{11}$有關,其它都視為常數項,微分掉就不見了 * $\dfrac{\partial{a_1}}{\partial{z_1}}=a_1(1-a_1)$,sigmoid函數的求導 * $\dfrac{\partial{z}}{\partial{a_1}}=w_1$,只跟$w_1$有關,其它都視為常數項,微分掉就不見了 * $\dfrac{\partial{\hat{y}}}{\partial{z}}=\hat{y}(1-\hat{y})$,sigmoid函數的求導 * $L(y, \hat{y})=\dfrac{1(y-\hat{y})}{\hat{y}(1-\hat{y})}$ 然後再用著迭代更新的公式來計算$w_{11}$即可。 ### 2,2,1 Neural Network ![](https://hackmd.io/_uploads/SJ9yERZM6.png) 基本上對於bias的部份也是類似的作法,先寫下整個鏈式法則的公式。 ### 2,2,1 Neural Network ![](https://hackmd.io/_uploads/SkDBVR-G6.png) 然後逐一拆解,得到迭代更新的公式。 ### 2,2,1 Neural Network ![](https://hackmd.io/_uploads/S1AuVA-Gp.png) 這邊就是第一層神經網路的所有權重與bias的更新公式。 ### 2,2,1 Neural Network ![](https://hackmd.io/_uploads/B1cKBA-fa.png) ![](https://hackmd.io/_uploads/S1lhHRWMp.png) ![](https://hackmd.io/_uploads/B1LTHAWGa.png) 第二層的部份會相對簡單一點,因為要更新的神經元相對較少,套路都一樣,前面懂,這邊就通。 ## Gradient Descent and Backpropagation [課程連結](https://www.coursera.org/learn/machine-learning-calculus/lecture/51n2T/gradient-descent-and-backpropagation) 課程說明如何利用上一節課所學的推導來訓練神經網路 ### Back Propagation Introduction ![](https://hackmd.io/_uploads/r18pvR-fT.png) 符號說明: * $w^{[1]}$,代表第1層 * $w_{12}$,代表前1後2的權重連接,前1後2說的是前一層的第1個神經元與下一層第2個神經元 * $z$,代表輸入與權重、bias的線性計算 * $a$,代表將$z$經過非線性轉換(啟動函數、活化函數),這邊為sigmoid * $\hat{y}$,為預測結果 * $y$,為實際結果 * $L$,實際與預測之間的loss ### Back Propagation Introduction ![image.png](https://hackmd.io/_uploads/Sk9hWbwmT.png) 基本上所做的計算都跟先前課程中所提的一樣,唯一的差別就是計算的參數變多了。 我們所關注的是每一個權重(綠色)對於最終的loss(紅色)的影響,所以計算的是都$\partial{L}$,第一個layer的參數就是$\dfrac{\partial{L}}{\partial{w^{[1]}}}$,第二個layer的參數就是$\dfrac{\partial{L}}{\partial{w^{[1]}}}$,blablabla.. ### Back Propagation Introduction ![image.png](https://hackmd.io/_uploads/r1b9fbP7T.png) 先看$w^{[3]}$、$b^{[3]}$,計算的部份仍然是依賴著鏈式法則。 ### Back Propagation Introduction ![image.png](https://hackmd.io/_uploads/ryhT7-D7p.png) $w^{[2]}$、$b^{[2]}$也是一樣,只是這個鏈式法則長了點。最後一個$\dfrac{\partial{z^{[2]}}}{\partial{w^{[2]}}}$是sigmoid。 其中紅色框起來的部份已經是計算過的部份,所以不用再計算,實作上利用一個變數來保存,然後在back的時候就拿出來重覆使用。 ### Back Propagation Introduction ![image.png](https://hackmd.io/_uploads/HkD6V-P7a.png) 好消息是,有個概念就好,剩下的框架都會幫忙處理了。