日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

图解深度学习-三种梯度下降法可视化(BGD,SGD,MBGD)

發布時間:2023/12/9 pytorch 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图解深度学习-三种梯度下降法可视化(BGD,SGD,MBGD) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

圖解深度學習-三種梯度下降法可視化(BGD,SGD,MBGD)

  • BGM(批量梯度下降法)
  • SGD(隨機梯度下降法)
  • MBGD(小批量梯度下降法)
  • 總結

用可視化的方式來看下三種梯度下降法。
我們來擬合簡單的函數 $f(x)=wx+1 $ 其中w=0.5其中w=0.5w=0.5

import numpy as np import matplotlib.pyplot as plt from ipywidgets import * np.random.seed(1) %matplotlib inline # 生成數據 def generate_data(sample_num=200): #在返回(-1, 1)范圍內的等差序列X = np.linspace(-1, 1, sample_num) Y = 0.5* X+1 ++ np.random.normal(0, 0.1, (sample_num, ))#生成Y并添加噪聲return X,Y #顯示要擬合的數據 X, Y = generate_data() plt.scatter(X,Y) plt.show()

def plot(thetas,losses):plt.figure(figsize=(8,6))plt.plot(thetas, losses)plt.plot(np.array(thetas),np.array(losses),color='r',marker='o')plt.xlim(-0.1,0.6)plt.ylim(-0.1,0.2)plt.plot(0.5, 0, 'r*',ms=15)plt.text(0.5, 0, 'min', color='k')plt.text(thetas[0]+0.01, losses[0], 'start', color='k')plt.text(thetas[-1]+0.01, losses[-1]-0.01, 'end', color='k')plt.xlabel('w')plt.ylabel('loss')plt.title('w-loss')plt.figure(figsize=(8,6))plt.plot(np.linspace(0,1000,len(losses)), losses)plt.xlabel('epoch')plt.ylabel('loss')plt.title('epoch-loss')plt.figure(figsize=(8,6))X, Y = generate_data()plt.scatter(X,Y)Y = thetas[-1]* X+1plt.plot(X,Y,'r')plt.xlabel('x')plt.ylabel('y')plt.title('x-y')plt.show() print('w:',thetas[-1])print('loss:',losses[-1])

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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。