損失函數偏微分
本篇使用迴歸線的損失函數進行說明。
迴歸線定義
多個點中尋找一條線,此線與每個點的 y 軸距離平方總和為最小值,那此條線就稱為迴歸線。如下圖,所有紅色線的長度平方,加總後,若得到最小值,那麼那條線就是迴歸線。

上圖可由如下代碼所產生
🔒 更多內容,請登入會員繼續閱讀。
立即登入微分 – 導數

上圖藍色曲線的方程式,假設為 f(x),則(x, f(x))這個點的切線(紅色線)斜線為多少呢?。
首先x往右邊增加一個h的值,其y軸為f(x+h),所以綠色(割線)斜率為$(\frac{f(x+h)-f(x)}{h})$
當h往左邊靠,一直逼近x時,那就是紅色線的斜率 $(\lim_{h\to0}\frac{f(x+h)-f(x)}{h})$
把上面的那個式子,給予一個變數 $(f'(x)=\lim_{h\to0}\frac{f(x+h)-f(x)}{h})$, 則$(f'(x))$稱為導數
所以導數就是某個點的斜率。
假設$(f(x)=x^{2})$,則斜率為
$(\frac{f(x+h)-f(x)}{h}=\frac{(x+h)^{2}-x^{2}}{h}=\frac{x^{2}+2xh+h^{2}-x^{2}}{h}=2x+h)$
$(f'(x)=\lim_{h\to0}2x+h = 2x)$
也就是說,x=1時,斜率為2, x=2時,斜率為4
而$(f'(x)=2x)$ 正是 $(x^{2})$的微分,也就是說,微分就是在求切線,也就是微分後的函數
為什麼要微分
🔒 更多內容,請登入會員繼續閱讀。
立即登入偏微分
上述的方程式,只有一元變數(x),但如果是多元多次方程式呢,如下所示
🔒 更多內容,請登入會員繼續閱讀。
立即登入ps. $(\partial)$ 有的人唸 partial(帕修),也有人唸delta,還有人唸Costco,但版主的年代,是唸ro(肉)。
迴歸線損失函數
在上面的迴歸線中,規定 (實際值 – 預測值) 的平方總和必需為最小數,假設迴歸線是 $(r_i=ax_i+b)$,也就是
$(\sum_{1}^{n}(y_i-r_i)^2 = \sum_{1}^{n}(y_i-(ax_i+b))^2)$ 必需是最小值。
我們把 $(\sum_{1}^{n}(y_i-(ax_i+b))^2)$ 給定一個函數名稱 $(Loss(a,b))$,稱為損失函數
也就是損失函數為 $(Loss(a,b) = \sum_{1}^{n}(y_i-(ax_i+b))^2)$,而計算出來的值稱為損失值。
一階回歸線損失函數偏微分
損失函數解開後的公式為
🔒 更多內容,請登入會員繼續閱讀。
立即登入對 a 偏微分
🔒 更多內容,請登入會員繼續閱讀。
立即登入對 b 偏微分
🔒 更多內容,請登入會員繼續閱讀。
立即登入為什麼要對損失函數進行偏微分
損失函數的未知數為 a 及 b ,在 $(r_i= ax_i +b)$ 中,因為不知道 a,b 的值是多少,所以會先假設 a=0,b=0,計算損失值,然後用逼近法求取下一次的 a,b 值。
依逼近公式
$(a_{新值}=a_{前一次} – \frac{\partial Loss(a,b)}{\partial a} * lr)$
$(b_{新值}=b_{前一次} – \frac{\partial Loss(a,b)}{\partial b} * lr)$
取得新 a,b 值後重新計算最新損失值,如果最新損失值小於上一次的損失值,表示有成效,就可以再進行下一輪逼近。
這又怪怪的,為什麼是前一次 – 微分*lr,因為損失函數的值是愈來愈小,所以當然是用減的。
迴歸線逼近代碼
如下的代碼中,應用了上述的公式及觀念,一步一步的逼近正確的迴歸線
🔒 更多內容,請登入會員繼續閱讀。
立即登入
B值
其實 b 值,是所有 y 值的平均數
🔒 更多內容,請登入會員繼續閱讀。
立即登入二階迴歸線損失函數偏微分
二階迴歸線的公式為 $(y=ax^2+bx+c)$,所以
$(Loss(a,b))$
$(=\frac{1}{n}\sum_{i=1}^{n}(y_{i}-\tilde{y_{i}})^{2})$
$(=\frac{1}{n}\sum_{i=1}^{n}(y_{i}-(ax_i^2+bx_i+c))^{2})$
$(=\frac{1}{n}\sum_{i=1}^{n}y_{i}^2-2y_i(ax_i^2+bx_i+c)+(ax_i^2+bx_i+c)^2)$
$(=\frac{1}{n}\sum_{i=1}^{n}y_{i}^2-2ay_ix_i^2-2by_ix_i-2cy_i+a^2x_i^4+2ax_i^2(bx_i+c)+(bx_i+c)^2)$
$(=\frac{1}{n}\sum_{i=1}^{n}y_{i}^2-2ay_ix_i^2-2by_ix_i-2cy_i+a^2x_i^4+2abx_i^3+2acx_i^2+b^2x_i^2+2bcx_i+c^2)$
對 a 偏微分
$(\frac{\partial Loss(a,b,c)}{\partial a})$
$(=2\sum_{i=1}^{n}-y_ix_i^2+ax_i^4+bx_i^3+cx_i^2)$
$(=2\sum_{i=1}^{n}(ax_i^2+bx_i+c-y_i)x_i^2)$
$(=2\sum_{i=1}^{n}(\tilde{y_i}-y_i)x_i^2)$
對 b 偏微分
$(\frac{\partial Loss(a,b,c)}{\partial b})$
$(=2\sum_{i=1}^{n}-y_ix_i+ax^3+bx_i^2+cx_i)$
$(=2\sum_{i=1}^{n}(ax_i^2+bx_i+c-y_i)x_i)$
$(=2\sum_{i=1}^{n}(\tilde{y_i}-y_i)x_i)$
對 c 偏微分
$(\frac{\partial Loss(a, b, c)}{\partial c})$
$(=2\sum_{i=1}^{n}-y_i+ax_i^2+bx_i+c)$
$(=2\sum_{i=1}^{n}\tilde{y_i}-y_i)$
n 階迴歸線損失函數偏微分
由上可知,如果是 n 階迴歸線的話
對 a 偏微分就是 $(=2\sum_{i=1}^{n}(\tilde{y_i}-y_i)x_i^n)$
對 b 偏微分就是 $(=2\sum_{i=1}^{n}(\tilde{y_i}-y_i)x_i^{n-1})$
對 c 偏微分就是 $(=2\sum_{i=1}^{n}(\tilde{y_i}-y_i)x_i^{n-2})$
到最後是
$(2\sum_{i=1}^{n}(\tilde{y_i}-y_i)x_i^1)$
$(2\sum_{i=1}^{n}(\tilde{y_i}-y_i)x_i^0)$
numpy polyfit迴歸線
首先複習一下由numpy的poltfit所計算出來的迴歸線,其性線迴歸線方程式為
$(0.4585714x+3.2)$
🔒 更多內容,請登入會員繼續閱讀。
立即登入
numpy.dot()
二值均為 0 維陣列
import numpy as np a=4 b=5 print(a.dot(b)) 結果 : 20
當二值都為純量時,是二個數字的相乘
二值均為一維陣列
import numpy as np a=np.array([3,4]) b=np.array([4,5]) print(a.dot(b)) 結果 : 32
當二值均為一維陣列時,如[x1, y1] * [x2, y2],結果是 x1*x2+y1*y2
二值均為二維陣列
import numpy as np a=np.array([[3,4], [2,3]]) b=np.array([[4,5], [2,3]]) print(a.dot(b)) 結果 : [[20 27] [14 19]]
當二值圴為二維陣列時,則計算二矩陣相乘
zip
zip 一般認知是壓縮檔案,但 zip 其實是拉鍊縫接的意思。它會將所有的 List 參數由上而下一對一配成 tuple 格式,然後將所有資料形成一組 List 格式
a=[1,3,5,7,9] b=[2,4,6,8,10] c=['a','b','c','d','e'] d=list(zip(a,b,c)) print(d) 結果 : [(1, 2, 'a'), (3, 4, 'b'), (5, 6, 'c'), (7, 8, 'd'), (9, 10, 'e')]
那如果上下咬痕長度不一樣呢? 那就以最小的長度為準,多餘的就不進行配對。
a=[1,3,5,7,9] b=[2,4,6,8] c=list(zip(a,b)) print(c) 結果 : [(1, 2), (3, 4), (5, 6), (7, 8)]
TensorFlow梯度下降
上述使用Python 迴圈跑了一萬次作梯次下降,每次迴圈都要使用.dot()計算紅色部份的內積(矩陣相乘)。但Python慢的要死,如果有上千萬個點要計算矩陣相乘呢,那不就會等到死。所以如果能用TensorFlow把矩陣相乘的計算推給GPU來計算呢!!
底下需指定優化器 optimizer,優化器的用途是指定階梯度下降的方法,常用的有SGD(stochastic gradient descent隨機梯度下降), Momentum(曼摩頓),Adam等等。
🔒 更多內容,請登入會員繼續閱讀。
立即登入優化器條件
上述的優化器,使用 SGD,learning_rate為 2.5e-4
若將優化器改為 Adam, learning_rate 改為 5e-2, 也是同樣的效果
損失函數定義為 “預測值跟實際值的差異”,稱為 Loss。這個定義,也就是迴歸線的定義。
迴歸線定義為
(預測的 y 值 – 實際的 y 值)平方總合,再求平均數,以公式表示為
$(Loss=\frac{1}{n}\sum_{i=1}^{n}(y_{i}-\tilde{y_{i}})^{2})$
