【ML】 李宏毅机器学习一:Regression、Gradient Descent(python实现)
我的GitHub地址:https://github.com/taw19960426/DeepLearning存放與之對應的python代碼
1.Regression
1.1 Introduction
- Machine Learning: define a set of function, goodness of function, pick the best function
- 選不同的function 其實就是選不同的model,model里面最簡單的就是linear model;此外還有很多nonlinear model,如deep learning, SVM, decision tree, kNN… 以上都是supervised learning - 需要搜集很多training data
- 回歸分析是一種預測性的建模技術,它研究的是因變量(目標)和自變量(預測器)之間的關系。這種技術通常用于預測分析,時間序列模型以及發(fā)現(xiàn)變量之間的因果關系。回歸問題通常是用來預測一個值,如預測房價、未來的天氣情況等等。
1.2 Step
-
Step1:
Model: y=b+wxcpy=b+w x_{c p}y=b+wxcp?
-w和b是參數(shù),w:權重,b:偏差
線性模型:y=b+∑wixiy=b+\sum w_{i} x_{i}y=b+∑wi?xi? -
Step2:Goodness of Function
Goodness of Function - -損失函數(shù)L:input is a function, output is how bad it is (損失函數(shù))。
損失函數(shù)的第一版:L(w,b)=∑(y^n?(b+wxcpn))2L(w, b)=\sum\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)^{2} L(w,b)=∑(y^?n?(b+wxcpn?))2 -
Step3: Best Function
w?b?=arg?min?w,bL(w,b)=arg?min?w,b∑(y^n?(b+wxcpn))2w^{*} b^{*}=\arg \min _{w, b} L(w, b)=\arg \min _{w, b} \sum\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)^{2} w?b?=argw,bmin?L(w,b)=argw,bmin?∑(y^?n?(b+wxcpn?))2
1.3 Regularization (正則化)
-
y=b+∑wixiy=b+\sum w_{i} x_{i}y=b+∑wi?xi?
-
L=∑n(y^n?(b+∑wixi))2+λ(wi)2L=\sum_{n}\left(\hat{y}^{n}-\left(b+\sum w_{i} x_{i}\right)\right)^{2}+\lambda\left(w_{i}\right)^{2}L=∑n?(y^?n?(b+∑wi?xi?))2+λ(wi?)2
-
不但要選擇一個loss小的function,還要選擇一個平滑的function(正則化使函數(shù)更平滑, 因為w比較小)
-
λ\lambdaλ大,找出來的function就比較smooth。反之,找出來的則不太smooth. 在由小到大變化的過程中,函數(shù)不止要考慮loss最小化還要考慮weights最小化,所以對training error最小化的考慮就會相對(于沒有正則化的時候)減小,因此training error會隨著增大而增大。test error則先減小再增大。
2.Gradient Descent (梯度下降法)
梯度下降法 - 只要loss func對與它的參數(shù)是可微分的就可以用,不需要一定是線性方程
2.1 總體思想
- 選擇一個初始值w0w^{0}w0 ;-計算dLdw∣w=w0\left.\frac{d L}{d w}\right|_{w=w^{0}}dwdL?∣∣?w=w0? ,w1←w0?ηdLdw∣w=w0w 1 \leftarrow w^{0}-\left.\eta \frac{d L}{d w}\right|_{w=w^{0}}w1←w0?ηdwdL?∣∣?w=w0?和 η\etaη學習率 。繼續(xù)此步驟,直到找到等于零的梯度。
- 對于兩個參數(shù):w?,b?w^{*}, b^{*}w?,b?; -選擇初始值:w0,b0w_{0}, b_{0}w0?,b0? ;
- 計算
?L?w∣w=w0,b=b0,?L?b∣w=w0,b=b0\left.\frac{\partial L}{\partial w}\right|_{w=w_{0}, b=b_{0}},\left.\frac{\partial L}{\partial b}\right|_{w=w_{0}, b=b_{0}}?w?L?∣∣∣∣?w=w0?,b=b0??,?b?L?∣∣∣∣?w=w0?,b=b0??
w1←w0?η?L?w∣w=w0,b=b0w^{1} \leftarrow w^{0}-\left.\eta \frac{\partial L}{\partial w}\right|_{w=w^{0}, b=b^{0}}w1←w0?η?w?L?∣∣∣∣?w=w0,b=b0?
b1←b0?η?L?b∣w=w0,b=b0b^{1} \leftarrow b^{0}-\left.\eta \frac{\partial L}{\partial b}\right|_{w=w^{0}, b=b^{0}}b1←b0?η?b?L?∣∣∣∣?w=w0,b=b0?
繼續(xù)此步驟,直到找到等于零的坡度。 - 以上方法得出來的結果滿足:
θ?=arg?min?θL(θ)\theta^{*}=\arg \min _{\theta} L(\theta) θ?=argθmin?L(θ)
2.2 線性回歸-梯度下降公式摘要:
L(w,b)=∑n=110(y^n?(b+wxcpn))2?L?w=∑n=1102(y^n?(b+wxcpn))(?xcpn)?L?b=∑n=1102(y^n?(b+wxcpn))(?1)\begin{array}{l}{L(w, b)=\sum_{n=1}^{10}\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)^{2}} \\\\ {\frac{\partial L}{\partial w}=\sum_{n=1}^{10} 2\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)\left(-x_{c p}^{n}\right)} \\ \\{\frac{\partial L}{\partial b}=\sum_{n=1}^{10} 2\left(\hat{y}^{n}-\left(b+w x_{c p}^{n}\right)\right)(-1)}\end{array} L(w,b)=∑n=110?(y^?n?(b+wxcpn?))2?w?L?=∑n=110?2(y^?n?(b+wxcpn?))(?xcpn?)?b?L?=∑n=110?2(y^?n?(b+wxcpn?))(?1)?
2.3 設置learning rate:
-
假設θ\thetaθ有兩個變量θ1,θ2\theta_{1}, \theta_{2}θ1?,θ2? , 則:
θ0=[θ10θ20],θ1=θ0?η?L(θ0)\theta^{0}=\left[\begin{array}{l}{\theta_{1}^{0}} \\ {\theta_{2}^{0}}\end{array}\right], \quad \theta^{1}=\theta^{0}-\eta \nabla L\left(\theta^{0}\right)θ0=[θ10?θ20??],θ1=θ0?η?L(θ0)
[θ11θ21]=[θ10θ20]?η[?L(θ10)/?θ1?L(θ20)/?θ2]\left[\begin{array}{c}{\theta_{1}^{1}} \\ {\theta_{2}^{1}}\end{array}\right]=\left[\begin{array}{c}{\theta_{1}^{0}} \\ {\theta_{2}^{0}}\end{array}\right]-\eta\left[\begin{array}{c}{\partial L\left(\theta_{1}^{0}\right) / \partial \theta_{1}} \\ {\partial L\left(\theta_{2}^{0}\right) / \partial \theta_{2}}\end{array}\right][θ11?θ21??]=[θ10?θ20??]?η[?L(θ10?)/?θ1??L(θ20?)/?θ2??]
這里:
?L(θ)=[?L(θ1)/?θ1?L(θ2)/?θ2]\nabla L(\theta)=\left[\begin{array}{l}{\partial L\left(\theta_{1}\right) / \partial \theta_{1}} \\ {\partial L\left(\theta_{2}\right) / \partial \theta_{2}}\end{array}\right]?L(θ)=[?L(θ1?)/?θ1??L(θ2?)/?θ2??] -
可以繪制loss vs. No. of parameters updates(同一個循環(huán)的參數(shù)迭代次數(shù))的曲線,觀察變化趨勢;
-
每隔幾個時期將學習率降低一些因子,例如:ηt=η/t+1\eta^{t}=\eta / \sqrt{t+1}ηt=η/t+1?
-
為不同的參數(shù)提供不同的學習率-Adagrad-將每個參數(shù)的學習率除以其先前導數(shù)的均方根
w1←w0?η0σ0g0σ0=(g0)2w2←w1?η1σ1g1σ1=12[(g0)2+(g1)2]w3←w2?η2σ2g2σ2=13[(g0)2+(g1)2+(g2)2]wt+1←wt?ηtσtgtσt=1t+1∑i=0t(gi)2\begin{aligned} w^{1} \leftarrow w^{0}-\frac{\eta^{0}}{\sigma^{0}} g^{0} & \sigma^{0}=\sqrt{\left(g^{0}\right)^{2}} \\ w^{2} \leftarrow w^{1}-\frac{\eta^{1}}{\sigma^{1}} g^{1} & \sigma^{1}=\sqrt{\frac{1}{2}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}\right]} \\ w^{3} \leftarrow w^{2}-\frac{\eta^{2}}{\sigma^{2}} g^{2} & \sigma^{2}=\sqrt{\frac{1}{3}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}+\left(g^{2}\right)^{2}\right]} \\ & \quad \quad \quad \quad \quad \\ w^{t+1} \leftarrow w^{t}-\frac{\eta^{t}}{\sigma^{t}} g^{t} & \sigma^{t}=\sqrt{\frac{1}{t+1} \sum_{i=0}^{t}\left(g^{i}\right)^{2}} \end{aligned} w1←w0?σ0η0?g0w2←w1?σ1η1?g1w3←w2?σ2η2?g2wt+1←wt?σtηt?gt? σ0=(g0)2? σ1=21?[(g0)2+(g1)2]? σ2=31?[(g0)2+(g1)2+(g2)2]? σt=t+11?i=0∑t?(gi)2??
ηt/σt\eta^{t} / \sigma^{t}ηt/σt可以消除…然后涉及以下形式:
wt+1←wt?η∑i=0t(gi)2gtw^{t+1} \leftarrow w^{t}-\frac{\eta}{\sqrt{\sum_{i=0}^{t}\left(g^{i}\right)^{2}}} g^{t} wt+1←wt?∑i=0t?(gi)2?η?gt
gt=?L(θt)?wg^{t}=\frac{\partial L\left(\theta^{t}\right)}{\partial w}gt=?w?L(θt)?為當下的梯度值(偏微分) - 造成反差效果
3 python代碼實現(xiàn)
我的GitHub地址:https://github.com/taw19960426/DeepLearning
3.1 GradientDescent01.py
import numpy as np import matplotlib.pyplot as plt # plt#相當于x^n和y^n所對應的cp值 x_data = [338, 333, 328, 207, 226, 25, 179, 60, 208, 606] y_data = [640, 633, 619, 393, 428, 27, 193, 66, 226, 1591]#準備三維函數(shù)及待投影平面的網(wǎng)格坐標 x = np.arange(-200, -100, 1) # bias y = np.arange(-5, 5, 0.1) # weight Z = np.zeros((len(x), len(y))) X, Y = np.meshgrid(x, y) #[X,Y] = meshgrid(x,y) 將向量x和y定義的區(qū)域轉換成矩陣X和Y, # 其中矩陣X的行向量是向量x的簡單復制,而矩陣Y的列向量是向量y的簡單復制 for i in range(len(x)):for j in range(len(y)):b = x[i]w = y[j]Z[j][i] = 0for n in range(len(x_data)):Z[j][i] = Z[j][i] + (y_data[n] - b - w * x_data[n]) ** 2Z[j][i] = Z[j][i] / len(x_data)# yadata = b + w*xdata b = -120 # intial b w = -4 # intial w lr = 0.0000001 # 學習率 iteration = 100000#迭代次數(shù)#存儲繪圖的初始值 b_history = [b] w_history = [w]# iterations for i in range(iteration):b_grad = 0.0w_grad = 0.0#L(w,b)對b,w分別求導for n in range(len(x_data)):b_grad = b_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * 1.0w_grad = w_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * x_data[n]#更新參數(shù)相當于第一代版本的W^(t+1)=W^t-(lr)^t*g^tb = b - lr * b_gradw = w - lr * w_grad# 存儲繪圖參數(shù)b_history.append(b)w_history.append(w)# plot the figure plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet')) ''' contourf() 函數(shù)為等高線圖填充顏色. x:指定 X 軸數(shù)據(jù)。 y:指定 Y 軸數(shù)據(jù)。 z:指定 X、Y 坐標對應點的高度數(shù)據(jù)。 colors:指定不同高度的等高線的顏色。 alpha:指定等高線的透明度。 cmap:指定等高線的顏色映射,即自動使用不同的顏色來區(qū)分不同的高度區(qū)域。 linewidths:指定等高線的寬度。 linestyles:指定等高線的樣式''' plt.plot([-188.4], [2.67], 'x', ms=6, markeredgewidth=3, color='orange') # ms和marker分別代表指定點的長度和寬度。 plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black') plt.xlim(-200, -100) plt.ylim(-5, 5) plt.xlabel(r'$b$', fontsize=16) plt.ylabel(r'$w$', fontsize=16) plt.show()結果顯示:
3.2 GradientDescent02.py
對 b 和 w 給予克制化的Learning Rate:
學習率 lr 改為 1,lr_b = 0 / lr_w = 0 ;
對b、w定制化的學習率lr,采用Adagard
b = b - lr / np.sqrt(lr_b) * b_grad ; w = w - lr / np.sqrt(lr_w) * w_grad
import numpy as np import matplotlib.pyplot as plt # plt#相當于x^n和y^n所對應的cp值 x_data = [338, 333, 328, 207, 226, 25, 179, 60, 208, 606] y_data = [640, 633, 619, 393, 428, 27, 193, 66, 226, 1591]#準備三維函數(shù)及待投影平面的網(wǎng)格坐標 x = np.arange(-200, -100, 1) # bias y = np.arange(-5, 5, 0.1) # weight Z = np.zeros((len(x), len(y))) X, Y = np.meshgrid(x, y) #[X,Y] = meshgrid(x,y) 將向量x和y定義的區(qū)域轉換成矩陣X和Y, # 其中矩陣X的行向量是向量x的簡單復制,而矩陣Y的列向量是向量y的簡單復制 for i in range(len(x)):for j in range(len(y)):b = x[i]w = y[j]Z[j][i] = 0for n in range(len(x_data)):Z[j][i] = Z[j][i] + (y_data[n] - b - w * x_data[n]) ** 2Z[j][i] = Z[j][i] / len(x_data)# yadata = b + w*xdata b = -120 # intial b w = -4 # intial w lr = 1 # 學習率 iteration = 100000#迭代次數(shù)#存儲繪圖的初始值 b_history = [b] w_history = [w]#對w,b分別定義學習率,初始化 lr_b=0 lr_w=0# iterations for i in range(iteration):b_grad = 0.0w_grad = 0.0#L(w,b)對b,w分別求導for n in range(len(x_data)):b_grad = b_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * 1.0w_grad = w_grad - 2.0 * (y_data[n] - b - w * x_data[n]) * x_data[n]''' #更新參數(shù)相當于第一代版本的W^(t+1)=W^t-(lr)^t*g^tb = b - lr * b_gradw = w - lr * w_grad'''# 對w,b分別賦予不同的學習率lr# 更新參數(shù)相當于第二代版本,加入反差效果,反映二次微分lr_b=lr_b+b_grad**2lr_w=lr_w+w_grad**2#對b、w定制化的學習率lr,采用Adagardb=b-lr/np.sqrt(lr_b)*b_gradw=w-lr/np.sqrt(lr_w)*w_grad# 存儲繪圖參數(shù)b_history.append(b)w_history.append(w)# plot the figure plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet')) ''' contourf() 函數(shù)為等高線圖填充顏色. x:指定 X 軸數(shù)據(jù)。 y:指定 Y 軸數(shù)據(jù)。 z:指定 X、Y 坐標對應點的高度數(shù)據(jù)。 colors:指定不同高度的等高線的顏色。 alpha:指定等高線的透明度。 cmap:指定等高線的顏色映射,即自動使用不同的顏色來區(qū)分不同的高度區(qū)域。 linewidths:指定等高線的寬度。 linestyles:指定等高線的樣式''' plt.plot([-188.4], [2.67], 'x', ms=6, markeredgewidth=3, color='orange') # ms和marker分別代表指定點的長度和寬度。 plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black') plt.xlim(-200, -100) plt.ylim(-5, 5) plt.xlabel(r'$b$', fontsize=16) plt.ylabel(r'$w$', fontsize=16) plt.show()結果顯示:
參考文章:
總結
以上是生活随笔為你收集整理的【ML】 李宏毅机器学习一:Regression、Gradient Descent(python实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vim学习及实践
- 下一篇: 李宏毅机器学习作业1:预测PM2.5(含