Pytorch(二) --梯度下降法
針對(duì)y=wx+b,利用梯度下降法求得相對(duì)應(yīng)的w和b,此時(shí),w和b是一個(gè)近似解,而不是確切解。
上圖是針對(duì)y=wx的梯度下降法的步驟,y=w*x+b的步驟與之類(lèi)似,只不過(guò)分為兩步,w和b。
代碼如下所示:
最終的結(jié)果如下所示:
epoch: 9999 w= 2.0000000000202744 b= 2.9999999999539115 loss= 3.061922477666832e-22
與真實(shí)結(jié)果相差很小,比起窮舉法,節(jié)省很多時(shí)間。
SGD(隨機(jī)梯度下降法)
上面求梯度的方法是利用了所有的樣本求梯度,而在面對(duì)大量的樣本時(shí),這樣做耗時(shí)嚴(yán)重,而且樣本中所摻雜的噪聲樣本會(huì)影響最終的結(jié)果,因此,隨機(jī)梯度下降法是很好的選擇,每次只選擇一個(gè)樣本求梯度,然后更新梯度,最終也會(huì)獲得很好的結(jié)果。
兩種求梯度方法的優(yōu)缺點(diǎn):
1)
優(yōu)點(diǎn):可以并行計(jì)算,計(jì)算效率高。
缺點(diǎn):最終的結(jié)果誤差較大。
2)
優(yōu)點(diǎn):最終的結(jié)果較為準(zhǔn)確。
缺點(diǎn):不能并行計(jì)算,計(jì)算效率比較低。
采取折中的辦法------Mini batch
SGD代碼如下所示:
def SGD(x,y):return 2*x*(x*w+b-y),2*(x*w+b-y) epoch_list = [] cost_list = [] print('predict (before training)',4,forward(4)) for epoch in range(10000):cost_val = cost(x_data,y_data)gradw,gradb = gradient(x_data,y_data)w-=lr*gradwb-=lr*gradbprint('epoch:',epoch,'w=',w,'b=',b,'loss=',cost_val)epoch_list.append(epoch)cost_list.append(cost_val) print('predict (after training)',4,forward(4)) plt.plot(epoch_list,cost_list) plt.ylabel('cost') plt.xlabel('epoch') plt.show()結(jié)果如下:
epoch: 9999 w= 2.0000000000202744 b= 2.9999999999539115 loss= 3.061922477666832e-22
努力加油a啊
總結(jié)
以上是生活随笔為你收集整理的Pytorch(二) --梯度下降法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 超九成美国小商家将涌入,TikTok 蒙
- 下一篇: 48mp是多少万像素