PyTorch深度学习——梯度下降算法
目錄
一、梯度下降算法(batch gradient descend)
二、隨機梯度下降算法(stochastic gradient descend)
三、 小批量梯度下降算法(mini-batch gradient descend)
一、梯度下降算法(batch gradient descend)
原理:梯度下降算法是深度學習中很常見的一種方法,為了找到最優解,可以嘗試利用窮舉法,分治法或者貪心算法,梯度下降算法就是一種貪心的算法。通過不斷的迭代,每次選取損失下降最快的方向去更新參數,可以很快達到局部最優解。如果函數是凸函數,局部最優解就是全局最優解;如果函數是非凸函數,可能會陷入局部最優解,或者神經網絡中梯度為0的鞍點處,從而停止迭代。
使用求導(Derivative)來獲得梯度:
?w的更新公式:
?其中α是學習率,一般在開始訓練前將其設置為learning_rate = 0.01。
代碼
對線性目標函數的迭代更新過程:
import numpy as np import matplotlib.pyplot as plt#1.training set x_data = [1.0,2.0,3.0,4.0] y_data = [2.0,4.0,6.0,8.0]#2.initial_w,initial_a w = 1.0 a = 0.01#3.functions def forward(x):return x * wdef cost(xs, ys):cost = 0for x, y in zip(xs, ys):y_pred = forward(x)cost += (y_pred - y) ** 2return cost / len(xs)def gradient(xs, ys):grad = 0for x, y in zip(xs, ys):grad += 2 * x * (forward(x)-y)return grad / len(xs)#4.迭代100次 epoch_list = [] cost_list = [] #訓練初始的預測值 print('Predict (before training):',4.0,forward(4.0)) for epoch in range(100):cost_val = cost(x_data, y_data)grad_val = gradient(x_data, y_data)w -= a * grad_valprint('epoch:', epoch, ' w=', '%.2f'%w, ' cost=', '%.2f'%cost_val)epoch_list.append(epoch)cost_list.append(cost_val) #更新w后對y進行預測 print('Predict (before training):', 4.0, forward(4.0))#畫圖 plt.plot(epoch_list,cost_list) plt.ylabel('cost') plt.xlabel('epoch') plt.show()運行結果
經過100次的迭代后,權重更新到近似目標值2.0,預測值接近8.0。并且使用加權均值后的cost_function更加平滑。
二、隨機梯度下降算法(stochastic gradient descend)
原理:不再使用全部樣本的梯度均值來進行更新,而是在每一次的迭代中,從N個樣本中隨機抽取一個樣本,利用單個樣本的損失loss對權重w求導得到梯度,并對權重w進行更新。當遇到鞍點或者局部最小值時,隨機的梯度有利于幫助跳出這塊區域,使算法向最優點繼續前進。
?代碼
import numpy as np import matplotlib.pyplot as plt#1.training set x_data = [1.0,2.0,3.0,4.0] y_data = [2.0,4.0,6.0,8.0]#2.initial_w,initial_a w = 1.0 a = 0.01#3.functions def forward(x):return x * wdef loss(x, y): y_pred = forward(x)loss = (y_pred - y) ** 2return lossdef gradient(x, y):return 2 * x * (forward(x)-y)#4.迭代100次 epoch_list = [] loss_list = [] #訓練初始的預測值 print('Predict (before training):',4.0,forward(4.0)) for epoch in range(100):for x, y in zip(x_data, y_data):loss_val = loss(x, y)grad_val = gradient(x, y)w -= a * grad_valprint('epoch:', epoch, ' w=', '%.2f'%w, ' cost=', '%.2f'%loss_val)#選取每個數據進行更新w權重epoch_list.append(epoch)loss_list.append(loss_val) #更新w后對y進行預測 print('Predict (before training):', 4.0, forward(4.0))#plot plt.plot(epoch_list,loss_list) plt.ylabel('loss') plt.xlabel('epoch') plt.show()運行結果
梯度下降算法和隨機梯度下降算法的區別是:
1、損失函數cost()更改為loss(),cost()計算的是全部數據的損失均值,而loss()計算的是單個數據的損失值。
2、梯度函數gradient()也從全部數據求出來的梯度均值變為單個數據所求的。
3、當epoch = 1時,即迭代100次,前者的w更新100次,而后者的w共更新100×4。
三、 小批量梯度下降算法(mini-batch gradient descend)
原理:將樣本分成等量的子集,對每一個子集(mini-batch)做一次梯度下降并更新參數,這樣可以在提高學習率的同時降低迭代次數。mini-batch的迭代成本函數是上下波動的,但總體呈下降趨勢。
該算法需要創建Dataset和DataLoader對象,詳情見下文鏈接。
三種算法的優缺點:
1、第一種梯度下降要遍歷全部數據集之后才算一次損失函數,然后求各個參數的梯度并更新。這種方法的時間復雜度高且不支持在線學習。
2、第二種隨機梯度下降是每次隨機選取一個數據就要計算損失函數并更新參數,雖然更新迭代速度很快,但是收斂性能不好,因為可能存在噪聲數據的影響,導致在最優點附近來回跳動,很難達到最優點。
3、為了中和上述兩種算法的優缺點,采用小批量的梯度下降,把數據分成若干份,并對每一份進行參數更新。在一次參數更新中,是由一小批數據共同決定梯度方向,就避免了方向的巨大波動,能有效減少更新的隨機性。
總結
以上是生活随笔為你收集整理的PyTorch深度学习——梯度下降算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动端特效
- 下一篇: 【深度学习】梯度下降算法和随机梯度下降算