日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

帶你一文透徹學(xué)習(xí)【PyTorch深度學(xué)習(xí)實(shí)踐】分篇——線性模型 & 梯度下降

 taotao_2016 2023-04-13 發(fā)布于遼寧

本篇文章來(lái)源于專欄《Python從入門到人工智能》,更多內(nèi)容可復(fù)制鏈接到此查看:https://blog.csdn.net/qq_44731019/category_11717408.html

對(duì)于一個(gè)算法(模型)。在深度學(xué)習(xí)中,簡(jiǎn)要的處理方式是:

準(zhǔn)備數(shù)據(jù)集(Datasets)—>> Model(選擇模型) —>> Training (模型訓(xùn)練) —>> 推理(進(jìn)行推理預(yù)測(cè))。

至于優(yōu)化等,可以理解為后續(xù)的補(bǔ)充。

監(jiān)督學(xué)習(xí):數(shù)據(jù)集需要 交付給算法模型 進(jìn)行訓(xùn)練,利用所訓(xùn)練的模型,在獲得 新的數(shù)據(jù)時(shí) 可以得到相應(yīng)的輸出。

線性模型的基本模型如下,其中的ω和  是模型中的參數(shù),訓(xùn)練模型的過(guò)程即為確定模型中參數(shù)的過(guò)程:

   
在本模型中設(shè)置成      對(duì)于不同的  有不同的線性模型及圖像與之對(duì)應(yīng)。
圖片

在模型訓(xùn)練中 會(huì)先隨機(jī)取得一個(gè)值,繼而 計(jì)算其和標(biāo)準(zhǔn)量之間的 偏移量,從而判斷 當(dāng)前模型 是否符合預(yù)期。

記實(shí)際值為  ,模型對(duì)應(yīng)的預(yù)測(cè)值為  ,則其中的偏移量為  ,以此來(lái)代表 模型估計(jì)值 對(duì)原值的誤差。

通常,該公式定義為Training Loss (Error)

本例中,原題目中的幾種  所對(duì)應(yīng)的Loss如下 幾個(gè)圖所示:

其中的每行 為   不同時(shí) 的 單個(gè)樣本的損失,最后一行為 平均損失。

對(duì)于單個(gè)樣本,loss 可用于 指代樣本誤差。對(duì)于所有樣本,可同理用Mean Square Error (MSE)來(lái)指代 整體樣本的平均平方誤差(均方差cost)

MSE:均方誤差(Mean Square Error)。,即 每個(gè)樣本對(duì)應(yīng)的損失值 (平方) 求和,再除以樣本總個(gè)數(shù)。

  :

圖片

  :

圖片

  :

圖片

由cost的計(jì)算公式可知,當(dāng)平均損失為0時(shí),模型最佳,但由于 僅當(dāng)數(shù)據(jù)無(wú)噪聲 且 模型完美貼合數(shù)據(jù) 的情況下才會(huì)出現(xiàn)這種情況,因此 模型訓(xùn)練的目的 應(yīng)當(dāng)是 誤差(損失)盡可能小,而非找到 誤差為0的情況。

不同  得到的 MSE:

圖片

1.1.1 基礎(chǔ)練習(xí)  

根據(jù)上面的分析,code如下:注釋我已經(jīng)寫的比較清楚啦。

# 昵 稱:XieXu# 時(shí) 間: 2023/2/12/0012 21:10
# 導(dǎo)入必要的工具包import numpy as npimport matplotlib.pyplot as plt
# 自定義 簡(jiǎn)單數(shù)據(jù)集。x與y 一一對(duì)應(yīng) (訓(xùn)練集)x_data = [1.0, 2.0, 3.0]y_data = [2.0, 4.0, 6.0]

# 模型,(前饋)def forward(x): return x * w

# 損失函數(shù)def loss(x, y): y_pred = forward(x) # 即 y_hat。相當(dāng)于 預(yù)測(cè)的值 return (y_pred - y) * (y_pred - y) # 平方(均方誤差)。簡(jiǎn)單形式的均方誤差。這個(gè)計(jì)算的 為單個(gè)樣本的誤差
# 【窮舉法】# 如下兩個(gè)列表 保存 權(quán)重 及其對(duì)應(yīng)的損失值w_list = []mse_list = []
# [0.0,4.1),間隔為0.1。即 0.0, 0.1, 0.2, 0.3 ... 4.0 起始值(含),停止值(不含),步長(zhǎng)for w in np.arange(0.0, 4.1, 0.1): # 外層循環(huán) 控制權(quán)重 2023.2.13 08:20 print('w=', w) l_sum = 0 # zip 將x_data 和 y_data 打包為一個(gè)tuple(元組),方便同時(shí)遍歷。 for x_val, y_val in zip(x_data, y_data): # 內(nèi)層循環(huán)控制進(jìn)行 權(quán)重:調(diào)用forward函數(shù) 對(duì)應(yīng)的預(yù)測(cè),以及 調(diào)用上面定義的loss函數(shù) 進(jìn)行損失值計(jì)算 y_pred_val = forward(x_val) # 計(jì)算 每個(gè)樣本的 預(yù)測(cè)值 loss_val = loss(x_val, y_val) # 計(jì)算 每個(gè)樣本的 損失值 l_sum += loss_val # 將 所有樣本的 損失求和(這里沒(méi)做均值) print('\t', x_val, y_val, y_pred_val, loss_val) # 打印出 每一個(gè)樣本:x,x對(duì)應(yīng)的y,預(yù)測(cè)值y_hat,損失值 print('MSE=', l_sum / 3) # 這里 除以樣本總數(shù),進(jìn)行均值,即 均方誤差 w_list.append(w) # 將每次 用完的 權(quán)重添加到列表中,用以 下面畫圖 的橫坐標(biāo)~ mse_list.append(l_sum / 3) # 除以樣本總數(shù)。每個(gè)權(quán)重 對(duì)應(yīng)的 所有樣本的平均誤差(均方誤差) MSE,也叫均值吧。下面繪圖的縱坐標(biāo)
# 繪制圖形plt.plot(w_list, mse_list) # 橫坐標(biāo)、縱坐標(biāo) 的取值plt.ylabel('Loss') # 縱坐標(biāo)y的標(biāo)簽plt.xlabel('w') # 橫坐標(biāo)w的標(biāo)簽plt.show()

可以得到結(jié)果:紅色為我做的標(biāo)注~圖片

從下面 控制臺(tái)打印的日志中,我們 可以 很容易看出來(lái)上圖 的由來(lái):

開始時(shí),隨著W增加,平均損失MSE逐漸減小,圖片


到W為2.0時(shí),MSE達(dá)到最小 即0,
圖片
后面  繼續(xù)增加,MSE又變大了:
圖片

1.1.2 練習(xí)  

同樣地,基于上面的例子,練習(xí):

實(shí)現(xiàn)線性模型  并輸出loss的3D圖像。

不同之處在于,定義的模型,與上面相比,加了個(gè) 偏置項(xiàng)B。

# 昵 稱:XieXu# 時(shí) 間: 2023/2/13/0012 12:26
# 練習(xí)題# 作業(yè)題目:實(shí)現(xiàn)線性模型(y=wx+b)并畫出loss的3D圖像。import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D
# 以下兩行代碼 解決坐標(biāo)軸不能顯示中文問(wèn)題 否則會(huì)報(bào)類似錯(cuò)誤:FigureCanvasAgg.draw(self) (圖上的 中文無(wú)法正常顯示)from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 輸入數(shù)據(jù),設(shè)函數(shù)為y=3x+2x_data = [1.0, 2.0, 3.0]y_data = [5.0, 8.0, 11.0]
# 定義模型def forward(x): return x * w + b
# 定義損失函數(shù)def loss(x, y): y_pred = forward(x) return (y_pred - y) * (y_pred - y)

mse_list = [] # 保存mse,均方誤差W = np.arange(0.0, 4.1, 0.1)B = np.arange(0.0, 4.1, 0.1)[w, b] = np.meshgrid(W, B) # 通過(guò) 兩個(gè)坐標(biāo)軸上的點(diǎn) 在平面上畫網(wǎng)格
l_sum = 0for x_val, y_val in zip(x_data, y_data): y_pred_val = forward(x_val) print(y_pred_val) loss_val = loss(x_val, y_val) l_sum += loss_val
fig = plt.figure()ax = Axes3D(fig)ax.plot_surface(w, b, l_sum / 3)# 以下三行 設(shè)置坐標(biāo)的文字說(shuō)明ax.set_xlabel('權(quán)重W')ax.set_ylabel('偏置項(xiàng) B')ax.set_zlabel('損失值')plt.show() # 畫圖

可以得到如下圖形:這就是 (   ) 損失值的3D圖形。

其中,控制臺(tái)輸出的日志中,含有警告:

圖片
定位到源代碼中:

圖片

ax = Axes3D(fig)

翻譯一下上面的警告:大意即 由于版本不同,可暫時(shí)忽略。

圖片

1.1.3 其它:在深度學(xué)習(xí)訓(xùn)練中,橫軸往往是Epoch

在深度學(xué)習(xí)訓(xùn)練的可視化圖形中,一般橫軸是Epoch,即訓(xùn)練輪數(shù):往往在訓(xùn)練集上表現(xiàn)是,隨著訓(xùn)練輪數(shù)增多,損失越來(lái)越低;而在測(cè)試集(老師讀 開發(fā)集)上的效果是,損失在剛開始會(huì)下降,而后到某個(gè)點(diǎn),又會(huì)逐漸上升。而我們的目標(biāo)就是,想找到損失最低的那個(gè)點(diǎn);從而進(jìn)一步 對(duì)超參數(shù)進(jìn)行處理等其它操作。

圖片

深度學(xué)習(xí)中可能需要考慮更多問(wèn)題,比如 可視化問(wèn)題 / 訓(xùn)練的時(shí)間問(wèn)題(可能需要幾天,甚至連續(xù)幾周都是有可能的) / 斷點(diǎn)問(wèn)題(比如訓(xùn)練7天會(huì)結(jié)束,但是第6天程序崩潰了,這期間產(chǎn)生的數(shù)據(jù) 結(jié)果 怎么辦)

老師提到了 Pytorch可視化工具——Visdom。目前我沒(méi)有用到…稍微大型的項(xiàng)目可能會(huì)用到吧??梢栽诎俣人阉鱒isdom并查看它的相關(guān)信息,以及其GitHub官網(wǎng)。

??1.2 Gradient Descent(梯度下降)

1.2.1 梯度下降法 的由來(lái):?jiǎn)栴}背景

在上面 線性模型的方法中,所使用的思想是基于窮舉,即提前已經(jīng)設(shè)定好 參數(shù)的準(zhǔn)確值 在某個(gè)區(qū)間內(nèi)并以某個(gè)步長(zhǎng)進(jìn)行窮舉,如(np.arange(0.0,4.1,0.1))。

但是,這種思想 在多維的情況下,即多個(gè)參數(shù)的時(shí)候,會(huì)引起維度詛咒的現(xiàn)象,在一個(gè)N維曲面中找一個(gè)最低點(diǎn),容易 使得原問(wèn)題變得不可解。那么 既然有這樣的問(wèn)題,就需要對(duì)算法 進(jìn)行改進(jìn)。

那么,使用 分治法 如何?

即:大化小,小化無(wú),先對(duì)整體 進(jìn)行分割采樣,在相對(duì)最低點(diǎn)進(jìn)行進(jìn)一步采樣,直到其步長(zhǎng)與誤差符合條件。

但是,分治法有兩個(gè)缺點(diǎn):

  • 容易只找到局部最優(yōu)解,而不易找到一個(gè)全局最優(yōu)解。

  • 如果需要分得更加細(xì)致,則計(jì)算量仍然巨大。

同時(shí),由于以上問(wèn)題的存在,引起了參數(shù)優(yōu)化的問(wèn)題,即求解使loss最小時(shí)的參數(shù)的值。

簡(jiǎn)言之,即求得  ,使得loss值最小。

如何優(yōu)化,求得符合條件的  呢?

1.2.2 何為梯度?

梯度,即 導(dǎo)數(shù)變化最大的值,其方向導(dǎo)數(shù)變化最大的方向。

這里,可以使用高等數(shù)學(xué)中關(guān)于 一個(gè)點(diǎn)處 導(dǎo)數(shù)的定義:

(這里僅簡(jiǎn)單理解,并非嚴(yán)謹(jǐn)數(shù)學(xué)推導(dǎo))對(duì)于  ,若增函數(shù),梯度為上升方向,若減函數(shù),梯度為下降方向。由數(shù)學(xué)知識(shí) 知道,需要取梯度下降的方向 即梯度的反方向作為變化方向,才能盡可能地求得極小值(最小值)。

下面的圖將便于理解:

1.2.3 梯度下降

在深度學(xué)習(xí)中,所說(shuō)的凸函數(shù),是與高等數(shù)學(xué)定義中的 凸函數(shù),完全反過(guò)來(lái)的,知道這一點(diǎn)就好。如下圖所示,在深度學(xué)習(xí)中,將其看做一個(gè)凸函數(shù)。

當(dāng)前,  的取值點(diǎn) 與 全局最小值點(diǎn):

圖片

那么,取值點(diǎn) 需要 向下更新,所取的梯度即為  ,更新的公式如下,其中   學(xué)習(xí)率,即 所下降的步長(zhǎng),不宜取太大。

  按梯度下降方向進(jìn)行更新:

圖片

局限性

  • [1] 梯度下降算法 容易進(jìn)入 局部最優(yōu)解(非凸函數(shù)),但是

    實(shí)際問(wèn)題中的局部最優(yōu)點(diǎn)較少

    ,或 已經(jīng)

    基本可以當(dāng)成全局最優(yōu)點(diǎn)。

圖片

  • [2] 梯度下降算法容易陷入鞍點(diǎn)(鞍點(diǎn)處,梯度值為0)(總之不是取得 損失最小值的點(diǎn),簡(jiǎn)單理解為 局部最優(yōu):在優(yōu)化問(wèn)題中,鞍點(diǎn) 是一種特殊的局部最優(yōu)解,是一個(gè)難以優(yōu)化的點(diǎn),因?yàn)閮?yōu)化算法 可能 很難從鞍點(diǎn) 附近找到 全局最優(yōu)解)。(陷入到鞍點(diǎn),導(dǎo)致無(wú)法繼續(xù) 進(jìn)行迭代?。?/p>

圖片

1.2.4 梯度下降的公式 如何得來(lái)的?(理解)

通過(guò)線性模型,我們知道 均方誤差的公式即:其中  

進(jìn)一步地,可以對(duì)  求偏導(dǎo),一步一步來(lái):

  是常數(shù),對(duì)求  的導(dǎo)數(shù)沒(méi)有影響,可以提到前面來(lái):

根據(jù)數(shù)學(xué)知識(shí),由于是對(duì)  求導(dǎo),那么 可以 把(  )看做一個(gè)整體,【復(fù)合函數(shù)求導(dǎo)】:對(duì)含有  的 (外部)整體 求導(dǎo),乘以內(nèi)部 對(duì)  求導(dǎo),故而得:

而(  )對(duì)  求導(dǎo)的結(jié)果 顯然為  ,調(diào)整一下順序,就得到對(duì)  的最終求導(dǎo)結(jié)果:

因此,梯度下降的更新公式為:

下圖即上述公式的推導(dǎo)過(guò)程:

圖片

梯度的求解公式,應(yīng)用到code中的示例:

圖片

1.2.5 隨機(jī)梯度下降(Stochastic gradient descent,SGD);Mini-batch!

平時(shí)用的比較多的,是隨機(jī)梯度下降(SGD)

SGD采用單個(gè)訓(xùn)練樣本的損失來(lái)近似平均損失,故 SGD 用單個(gè)訓(xùn)練數(shù)據(jù)即可對(duì)模型參數(shù)進(jìn)行一次更新,大大加快了訓(xùn)練速度。

隨機(jī)梯度下降 每次 只需要計(jì)算 一個(gè)樣本關(guān)于  的導(dǎo)數(shù)

圖片
隨機(jī)梯度下降SGD 與 標(biāo)準(zhǔn)梯度下降的區(qū)別:

  • 標(biāo)準(zhǔn)梯度下降 在權(quán)值更新前 匯總所有樣例得到的標(biāo)準(zhǔn)梯度,隨機(jī)梯度下降 則是通過(guò)考察每次訓(xùn)練實(shí)例來(lái)更新。

  • 標(biāo)準(zhǔn)梯度下降的是使用準(zhǔn)確的梯度,理直氣壯地走,隨機(jī)梯度下降使用的是近似的梯度,小心翼翼地走。

  • 標(biāo)準(zhǔn)梯度下降的步長(zhǎng) 比 隨機(jī)梯度下降 的大。

  • 當(dāng)有多個(gè)局部極小值時(shí),隨機(jī)梯度 反而更可能 避免 進(jìn)入局部極小值中。

同時(shí),為了降低隨機(jī)梯度的方差,使迭代算法更加穩(wěn)定,在真實(shí)操作中,會(huì)同時(shí)處理若干訓(xùn)練數(shù)據(jù),該方法叫做小批量隨機(jī)梯度下降法(Mini_Batch Gradient Densent)。,這才是真正地運(yùn)用了 隨機(jī)梯度下降(SGD),目前,在實(shí)際應(yīng)用中,我們所說(shuō)的梯度下降,(batch)都是指的 Mini-batch SGD,小批量 隨機(jī)梯度下降。 這在神經(jīng)網(wǎng)絡(luò)中,尤其明顯?。?!使用及其廣泛!?。。?保證 性能,又保證時(shí)間復(fù)雜度不是特別高)

小結(jié)

普通梯度下降算法利用數(shù)據(jù)整體,不容易避免鞍點(diǎn),算法性能欠佳,但算法效率高。隨機(jī)梯度下降需要利用每個(gè)的單個(gè)數(shù)據(jù),雖然算法性能良好,但計(jì)算過(guò)程 環(huán)環(huán)相扣 無(wú)法將樣本抽離開 并行運(yùn)算,因此算法效率低,時(shí)間復(fù)雜度高。

綜上所述,可采取一種折中的方法,即批量梯度下降方法。

將若干個(gè)樣本分為一組,記錄一組的梯度 用以代替隨機(jī)梯度下降中的單個(gè)樣本。

該方法最為常用,也是默認(rèn)接口。一般,mini-batch可以在2的冪次中挑選最優(yōu)取值。例如16、32、64、128、256等。

1.2.6 梯度下降練習(xí):方法一(推薦 完全 自己 多手寫幾遍)

給定一個(gè)數(shù)據(jù)集,x_data、y_data。尋找y=wx模型的w最優(yōu)解。

code練習(xí)如下,注釋中,我已經(jīng)介紹的比較詳細(xì)啦!我想這可以幫助絕大多數(shù)朋友理解。

# 昵 稱:XieXu# 時(shí) 間: 2023/2/13/0013 13:26
# 梯度下降算法
# 注:在 深度學(xué)習(xí)算法 中,并沒(méi)有過(guò)多的局部最優(yōu)點(diǎn)。# 即 一般 通過(guò)梯度下降 就可以求得 最優(yōu)點(diǎn)
import numpy as npimport matplotlib.pyplot as plt
# 訓(xùn)練數(shù)據(jù),x與y一一對(duì)應(yīng)x_data = [1.0, 2.0, 3.0]y_data = [2.0, 4.0, 6.0]
epoch_list = [] # # 2023.2.13 13:58 保存訓(xùn)練輪數(shù)cost_list = [] # 2023.2.13 13:58 每一輪對(duì)應(yīng)的損失值
w = 1.0 # 初始化,我們指定一個(gè)W取值

# 前饋計(jì)算(定義模型)def forward(x): return x * w

# 求MSE (定義cost函數(shù),計(jì)算均方誤差)def cost(xs, ys): cost = 0 for x, y in zip(xs, ys): y_pred = forward(x) cost += (y_pred - y) ** 2 return cost / len(xs) # 計(jì)算 均方誤差(損失)

# 求梯度(求W的偏導(dǎo)數(shù))def gradient(xs, ys): grad = 0 for x, y in zip(xs, ys): temp = forward(x) grad += 2 * x * (temp - y) # 由導(dǎo)數(shù)公式得 return grad / len(xs)

print('Predict(before training)', 4, forward(4)) # 這是根據(jù) 我們 給定的那個(gè)W,計(jì)算y=wx得到的值,forward(4) 即4
# 開始訓(xùn)練for epoch in range(1, 101, 1): cost_val = cost(x_data, y_data) # 計(jì)算均方誤差(損失) grad_val = gradient(x_data, y_data) # 求梯度(W的偏導(dǎo)數(shù)) w -= 0.01 * grad_val # 梯度下降,更新梯度(W) print('Epoch: ', epoch, 'w = ', w, 'loss = ', cost_val) # w就會(huì)用在下一輪的訓(xùn)練中
epoch_list.append(epoch) # 保存輪數(shù)1~100,做繪圖的橫坐標(biāo) cost_list.append(cost(x_data, y_data)) # 每輪對(duì)應(yīng)的 損失值
print('Predict(after training)', 4, forward(4)) # 根據(jù)100輪 之后的權(quán)重W,計(jì)算x取4時(shí),預(yù)測(cè)的y值。實(shí)際應(yīng)該是無(wú)限接近2,即2
# 繪圖plt.plot(epoch_list, cost_list) # 橫坐標(biāo) 和 縱坐標(biāo) 分別是 輪數(shù) 和 對(duì)應(yīng)該輪的 損失值plt.title('train loss')plt.xlabel('Epoch')plt.ylabel('Cost')plt.show()

得到結(jié)果:可以看到,在20輪左右,損失值就已經(jīng)很接近0了。

圖片
控制臺(tái)的結(jié)果:為了便于展示,這里我也特意截取到了20輪的訓(xùn)練結(jié)果。

圖片

1.2.7 方法二(與法一類似,不過(guò)這里 縱軸 是 權(quán)值的收斂變化

第二種方式:與第一種類似,只不過(guò)這里縱坐標(biāo)取的是 權(quán)值,另外,直接把梯度下降 放到Epoch訓(xùn)練里面了。代碼如下:

# 方法二import numpy as npimport matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0]y_data = [2.0, 4.0, 6.0]
scope_list = [] # 輪數(shù)w_list = [] # 權(quán)值W
w = 60 # 我們給W一個(gè)初始值
# 學(xué)習(xí)率k = 0.01 # 定義學(xué)習(xí)率
# 開始訓(xùn)練for i in range(1,201,1): # 計(jì)算cost(loss的和) loss_sum = 0
# 求梯度 for x_val, y_val in zip(x_data, y_data): loss_sum += 2 * x_val * (w * x_val - y_val) cost = loss_sum / 3
# 計(jì)算本輪w w = w - k * cost print('Epoch:',i,'W:',w) scope_list.append(i) w_list.append(w)
# 按說(shuō)縱坐標(biāo)不應(yīng)該取權(quán)值的,既然取了,那么可以從圖形中,看出來(lái)大概 50左右,權(quán)值就收斂了plt.plot(scope_list, w_list) # 橫坐標(biāo) 取值 依然是 輪數(shù),縱坐標(biāo)取值是按照W來(lái)取的值plt.xlabel('scope')plt.ylabel('W')plt.show()

結(jié)果如下所示:

圖片

我們也可以看一下,Console控制臺(tái)輸出的內(nèi)容:可以看到,50多輪依然還在收斂,100輪左右就已經(jīng)收斂的比較好了~ 最終權(quán)值應(yīng)為2
圖片

1.2.8 隨機(jī)梯度下降練習(xí)(一),可視化

這里,即普通的隨機(jī)梯度下降,每輪訓(xùn)練中,每次計(jì)算的 關(guān)于  的 偏導(dǎo)數(shù),是僅僅只計(jì)算 一個(gè)樣本的,而非 所有樣本的關(guān)于  的偏導(dǎo)數(shù) 求和 再取均值。

 即 注:這里,隨機(jī)梯度主要是指,每次拿一個(gè)訓(xùn)練數(shù)據(jù)來(lái)訓(xùn)練,然后更新梯度參數(shù)。

# 昵 稱:XieXu# 時(shí) 間: 2023/2/13/0013 15:11# 隨機(jī)梯度下降
# 方法一# 注:這里,隨機(jī)梯度主要是指,每次拿一個(gè)訓(xùn)練數(shù)據(jù)來(lái)訓(xùn)練,然后更新梯度參數(shù)。# 本算法中 梯度總共更新100(epoch)x3 = 300次。梯度下降算法中 梯度總共更新100(epoch)次。import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0]y_data = [2.0, 4.0, 6.0]
w = 1.0

def forward(x): return x * w

# calculate loss function(損失函數(shù)--均方誤差)def loss(x, y): y_pred = forward(x) return (y_pred - y) ** 2 # 僅 計(jì)算一個(gè)樣本 的損失函數(shù)

# define the gradient function sgd(定義隨機(jī)梯度下降 函數(shù))def gradient(x, y): return 2 * x * (x * w - y) # 注:這里,僅計(jì)算 “一個(gè)樣本” 關(guān)于W 的 偏導(dǎo)數(shù)

epoch_list = [] # 訓(xùn)練輪數(shù),100輪 2023.2.13 19:24loss_list = []print('predict (before training)', 4, forward(4))for epoch in range(1, 101, 1): for x, y in zip(x_data, y_data): grad = gradient(x, y) # 這里,每輪訓(xùn)練中,三個(gè) 樣本中 都分別計(jì)算了 梯度,for...zip循環(huán)。應(yīng)該是沒(méi)有用到“隨機(jī)” w = w - 0.01 * grad # update weight by every grad of sample of training set。根據(jù)梯度,更新W。。。 print('\tgrad:', x, y, grad) # 打印每輪訓(xùn)練中,每個(gè)樣本的x、y、根據(jù)其計(jì)算的梯度。2023.2.13 19:36 l = loss(x, y) # 根據(jù)梯度得到的 更新后的W,進(jìn)一步 計(jì)算損失函數(shù)(均方誤差) 2023.2.13 19:36 print('progress:', epoch, 'w=', w, 'loss=', l) # 打印該輪中,通過(guò)每一個(gè)樣本 得到的 W 以及 損失函數(shù)值!??!2023.2.13 19:37 epoch_list.append(epoch) loss_list.append(l)
print('predict (after training)', 4, forward(4))plt.plot(epoch_list, loss_list)plt.title('train loss')plt.ylabel('loss')plt.xlabel('epoch')plt.show()

圖片
以此類推:
圖片
得到的損失函數(shù)值,關(guān)于 訓(xùn)練輪數(shù)的圖像如下:
圖片

1.2.9 隨機(jī)梯度下降練習(xí)(二),可視化

上面的隨機(jī)梯度下降算法中,貌似僅僅 是只計(jì)算了 每一個(gè)樣本的梯度,好像沒(méi)有體現(xiàn)“隨機(jī)”。

這里再換個(gè)類似的算法,基本一樣,但用到了random隨機(jī)。

該方法與目錄1.2.6類似。

# 方法二import randomimport numpy as npimport matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0]y_data = [2.0, 4.0, 6.0]
scope_list = [] # 訓(xùn)練輪數(shù)w_list = [] # 權(quán)值
w = 60
# 學(xué)習(xí)率k = 0.01
for i in range(1, 201, 1): # 計(jì)算cost(即隨機(jī)一個(gè)loss當(dāng)cost用) rand = random.randint(0, 2) # 取值為[0,2],即 隨機(jī)生成0~2內(nèi)的 某個(gè) 整數(shù),包含0和2。(三個(gè)樣本,隨機(jī)取一個(gè)) cost = 2 * x_data[rand] * (w * x_data[rand] - y_data[rand]) # 從而計(jì)算得到 關(guān)于W的偏導(dǎo)數(shù)
# 計(jì)算本輪w w = w - k * cost # 更新W print('Epoch=', i, 'W=', w) # 本輪更新后的W 2023.2.13 20:30 scope_list.append(i) w_list.append(w)
plt.plot(scope_list, w_list) # 橫坐標(biāo)為輪數(shù),縱坐標(biāo)為權(quán)值。plt.xlabel('scope')plt.ylabel('W')plt.show()

如下圖所示,可以看出,75輪左右,權(quán)值就已經(jīng)逐漸收斂了~
圖片
圖片

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多