图解深度学习-三种梯度下降法可视化(BGD,SGD,MBGD)
生活随笔
收集整理的這篇文章主要介紹了
图解深度学习-三种梯度下降法可视化(BGD,SGD,MBGD)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖解深度學習-三種梯度下降法可視化(BGD,SGD,MBGD)
- BGM(批量梯度下降法)
- SGD(隨機梯度下降法)
- MBGD(小批量梯度下降法)
- 總結
用可視化的方式來看下三種梯度下降法。
我們來擬合簡單的函數 $f(x)=wx+1 $ 其中w=0.5其中w=0.5其中w=0.5
BGM(批量梯度下降法)
每次都要全部樣本進行計算,方向比較穩,不會波動,但是比較慢,要迭代好多次
def bgd(X, Y, lr=0.01, epoch=10):sample_num = X.shape[0]w = 0.1loss=0thetas=[]losses=[]for i in range(epoch):loss=0dj=0error=0#每次都是所有樣本一起算,更新一次for j in range(sample_num):predict_y =w*X[j]+1error +=0.5*np.power((predict_y - Y[j]), 2)dj+=(predict_y - Y[j])*X[j]loss = error/sample_numdj/=sample_numw = w-lr *djlosses.append(loss)thetas.append(w)plot(thetas,losses) @interact(lr=(0, 1, 0.001),epoch=(1,2000,10),continuous_update=False) def visualize_gradient_descent(lr=0.01,epoch=10):X, Y = generate_data()bgd(X, Y,lr,epoch)
SGD(隨機梯度下降法)
def sgd(X, Y, lr=0.01, epoch=10):sample_num = X.shape[0]w =0thetas=[]losses=[]for _ in range(epoch):loss=0#每個樣本單獨算,單獨更新一次for j in range(sample_num):predict_y =w*X[j]+1loss =0.5* np.power((predict_y - Y[j]), 2)w = w-lr *(predict_y - Y[j])*X[j]losses.append(loss)thetas.append(w)plot(thetas,losses) #可以隨時調節,查看效果 (最小值,最大值,步長) @interact(lr=(0, 5, 0.001),epoch=(1,100,1),continuous_update=False) def visualize_gradient_descent(lr=0.01,epoch=10):X, Y = generate_data()sgd(X, Y,lr,epoch)
MBGD(小批量梯度下降法)
def mbgd(X, Y, lr=0.01, epoch=10,batch_size=8):sample_num = X.shape[0]w =0thetas=[]losses=[]batch_num=(sample_num-1)//batch_size+1for _ in range(epoch):for i in range(batch_num):loss=0start_index = i * batch_sizeend_index = min((i + 1) * batch_size, sample_num)batch_x=X[start_index:end_index]batch_y=Y[start_index:end_index]num=end_index-start_indexfor j in range(num):predict_y =w*batch_x[j]+1loss+=0.5* np.power((predict_y - batch_y[j]), 2)w = w-lr *(predict_y - batch_y[j])*batch_x[j]loss /= numlosses.append(loss)thetas.append(w)plot(thetas,losses) #可以隨時調節,查看效果 (最小值,最大值,步長) @interact(lr=(0.01, 5.00, 0.01),epoch=(1,100,1),batch_size=(0,200,8),continuous_update=False) def visualize_gradient_descent(lr=0.01,epoch=10,batch_size=8):X, Y = generate_data()mbgd(X, Y,lr,epoch,batch_size)
總結
BGD需要所有樣本計算才迭代一次,數據能更好的代表所有樣本總體,所以比較穩,不會出現波動,因此也比較慢,但是每次可以用矩陣并行計算,如果樣本不大可以這樣做。
SGD每次樣本都計算一次,因為可能有噪聲,所以可能會波動,但是總體趨勢還是對的,雖然可以觀察每個樣本的信息,但是這樣也失去了并行處理的優化操作,只能一個個算。
MBGD剛好是BGD和SDG結合,不采取兩個極端,取中間最優吧,既可以相對穩定損失,也可以進行批量化處理,至于batch取多少,還是得看具體情況的,沒有固定值,盡可能2的次數比較好,因為計算機存儲是2進制的,會有一定的優化。
修改后的jupyter的文件鏈接
好了,今天就到這里了,希望對學習理解有幫助,大神看見勿噴,僅為自己的學習理解,能力有限,請多包涵。
總結
以上是生活随笔為你收集整理的图解深度学习-三种梯度下降法可视化(BGD,SGD,MBGD)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下ssh通过公钥登录服务器
- 下一篇: Android PermissionUt