图解深度学习-梯度下降学习率可视化
生活随笔
收集整理的這篇文章主要介紹了
图解深度学习-梯度下降学习率可视化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖解深度學習-梯度下降學習率可視化
- 梯度下降學習率問題
梯度下降學習率問題
用最簡單的SGD做實驗,討論學習率問題。
學習率如果太小,則會下降很慢,需要很多次迭代,如果太大,就會出現發散,具體可以動手調試,也可以看截圖。
這里我選取的代價函數J(x)=0.5(x?1)2+0.5J(x) = 0.5 (x-1)^2 + 0.5J(x)=0.5(x?1)2+0.5,求導方便。
import numpy as np import matplotlib.pyplot as plt from ipywidgets import *#梯度函數的導數 def gradJ(theta):return theta-1#梯度函數 def J(theta):return 0.5*(theta-1)**2+0.5def train(lr,epoch,theta):thetas = []for i in range(epoch):gredient = gradJ(theta)theta = theta - lr*gredientthetas.append(theta)plt.figure(figsize=(10,10))x = np.linspace(-1,3,100)plt.plot(x, J(x))plt.plot(np.array(thetas),J(np.array(thetas)),color='r',marker='o')plt.plot(1.0, 0.5, 'r*',ms=15)plt.text(1.0, 0.55, 'min', color='k')plt.text(thetas[0]+0.1, J(thetas[0]), 'start', color='k')plt.text(thetas[-1]+0.1, J(thetas[-1])-0.05, 'end', color='k')plt.xlabel('theta')plt.ylabel('loss')plt.show()print('theta:',theta)print('loss:',J(theta))#可以隨時調節,查看效果 (最小值,最大值,步長) @interact(lr=(0, 5, 0.001),epoch=(1,100,1),init_theta=(-1,3,0.1),continuous_update=False) def visualize_gradient_descent(lr=0.05,epoch=10,init_theta=-1):train(lr,epoch,init_theta) 學習率:0.05 迭代次數:10 參數初始化:-1 10次迭代還沒到最小值 學習率:0.33 迭代次數:10 參數初始化:-1 10次迭代接近收斂了,可見加大學習率可以加快訓練 學習率:1.87 迭代次數:10 參數初始化:-1 軌跡開始波動了,梯度方向不停的在變,最后還沒到收斂。解釋下梯度方向為什么開始變了,根據公式theta= theta- lr*gredient, 可以看到開始theta大致為2.7,梯度為正數大致為2,然后學習率又1.87 , theta=2.7 - 2 x 1.87<0 即theta變為負數了,所有到曲線右邊了, 同理繼續更新,此時梯度為負數了,減去一個負數等于加上正數,theta變為正數, 所以又到曲線右邊,如此循環,直到最低點。 如此一來,來回波動很多次,所以收斂速度變慢了。我們當然希望它跟上面一樣是從一個方向一直下降。 學習率:2.18 迭代次數:10 參數初始化:-1 繼續加到學習率,直到變得不收斂,我把坐標范圍拉大了,看了清楚,已經開始發散了。原因是因為,學習率過大,使得更新后的theta無論正負,絕對值會越來越大,會開始往上跑,再加上越上面的梯度絕對值越來越大,所以每次更新完之后theta的絕對值繼續變大,就無限循環了,不收斂了。具體可見下圖。 把一些參數打出來了,可以看到,負值和正值絕對值都在變大,因為迭代后出現折線發散。修改后的jupyter的文件鏈接
好了,今天就到這里了,希望對學習理解有幫助,大神看見勿噴,僅為自己的學習理解,能力有限,請多包涵。
總結
以上是生活随笔為你收集整理的图解深度学习-梯度下降学习率可视化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CISCO网络故障排错命令总结分享
- 下一篇: 【算法升级】仅有85K个参数的开源人脸检