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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小批量随机梯度下降

發布時間:2024/8/23 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小批量随机梯度下降 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

小批量隨機梯度下降

在每一次迭代中,梯度下降使用整個訓練數據集來計算梯度,因此它有時也被稱為批量梯度下降(batch gradient descent)。

  • 隨機梯度下降在每次迭代中只隨機采樣一個樣本來計算梯度。
  • 可以在每輪迭代中隨機均勻采樣多個樣本來組成一個小批量,然后使用這個小批量來計算梯度。

下面就來描述小批量隨機梯度下降

  • 設目標函數f(x):Rd→Rf(\boldsymbol{x}): \mathbb{R}^d \rightarrow \mathbb{R}f(x):RdR
  • 在迭代開始前的時間步設為0。
  • 該時間步的自變量記為x0∈Rd\boldsymbol{x}_0\in \mathbb{R}^dx0?Rd,通常由隨機初始化得到

在接下來的每一個時間步t>0t>0t>0中,小批量隨機梯度下降隨機均勻采樣一個由訓練數據樣本索引組成的小批量Bt\mathcal{B}_tBt?。我們可以通過重復采樣(sampling with replacement)或者不重復采樣(sampling without replacement)得到一個小批量中的各個樣本。前者允許同一個小批量中出現重復的樣本,后者則不允許如此,且更常見。對于這兩者間的任一種方式,都可以使用

gt←?fBt(xt?1)=1∣B∣∑i∈Bt?fi(xt?1)\boldsymbol{g}_t \leftarrow \nabla f_{\mathcal{B}_t}(\boldsymbol{x}_{t-1}) = \frac{1}{|\mathcal{B}|} \sum_{i \in \mathcal{B}_t}\nabla f_i(\boldsymbol{x}_{t-1}) gt??fBt??(xt?1?)=B1?iBt???fi?(xt?1?)

來計算時間步ttt的小批量Bt\mathcal{B}_tBt?上目標函數位于xt?1\boldsymbol{x}_{t-1}xt?1?處的梯度gt\boldsymbol{g}_tgt?。這里∣B∣|\mathcal{B}|B代表批量大小,即小批量中樣本的個數,是一個超參數。同隨機梯度一樣,重復采樣所得的小批量隨機梯度gt\boldsymbol{g}_tgt?也是對梯度?f(xt?1)\nabla f(\boldsymbol{x}_{t-1})?f(xt?1?)的無偏估計。給定學習率ηt\eta_tηt?(取正數),小批量隨機梯度下降對自變量的迭代如下:

xt←xt?1?ηtgt.\boldsymbol{x}_t \leftarrow \boldsymbol{x}_{t-1} - \eta_t \boldsymbol{g}_t.xt?xt?1??ηt?gt?.

基于隨機采樣得到的梯度的方差在迭代過程中無法減小,因此在實際中,(小批量)隨機梯度下降的學習率可以在迭代過程中自我衰減,例如ηt=ηtα\eta_t=\eta t^\alphaηt?=ηtα(通常α=?1\alpha=-1α=?1或者?0.5-0.5?0.5)、ηt=ηαt\eta_t = \eta \alpha^tηt?=ηαt(如α=0.95\alpha=0.95α=0.95)或者每迭代若干次后將學習率衰減一次。如此一來,

  • 學習率和(小批量)隨機梯度乘積的方差會減小
  • 而梯度下降在迭代過程中一直使用目標函數的真實梯度,無須自我衰減學習率

小批量隨機梯度下降中每次迭代的計算開銷為O(∣B∣)\mathcal{O}(|\mathcal{B}|)O(B)

  • 當批量大小為1時,該算法即為隨機梯度下降;當批量大小等于訓練數據樣本數時,該算法即為梯度下降。
  • 當批量較小時,每次迭代中使用的樣本少,這會導致并行處理和內存使用效率變低。這使得在計算同樣數目樣本的情況下比使用更大批量時所花時間更多。
  • 當批量較大時,每個小批量梯度里可能含有更多的冗余信息。
  • 為了得到較好的解,批量較大時比批量較小時需要計算的樣本數目可能更多,例如增大迭代周期數。

實現小批量隨機梯度下降

  • 使用一個來自NASA的測試不同飛機機翼噪音的數據集來比較各個優化算法
  • 使用該數據集的前1,500個樣本和5個特征
  • 使用標準化對數據進行預處理。
%matplotlib inline import numpy as np import time import torch from torch import nn, optim import sys from matplotlib import pyplot as plt sys.path.append("..") def get_data_ch7():data = np.genfromtxt('data/airfoil_self_noise.dat', delimiter='\t')data = (data - data.mean(axis=0)) / data.std(axis=0)#標準化處理# data.mean(axis=0) 輸出矩陣為一行,求每列的平均值,同理data.mean(axis=1) 輸出矩陣為一列,求每行的平均值# data.std(axis=0) 輸出矩陣為一列,求每列的標準差,同理data.std(axis=1) 輸出矩陣為一列,求每行的標準差return torch.tensor(data[:1500, :-1], dtype=torch.float32), \torch.tensor(data[:1500, -1], dtype=torch.float32) # 前1500個樣本(每個樣本5個特征)#[:-1]=[0:-1],表示除了最后一列的所有列 features, labels = get_data_ch7() features.shape # torch.Size([1500, 5])def sgd(params, states, hyperparams):#梯度下降(懲罰)for p in params:p.data -= hyperparams['lr'] * p.grad.datadef linreg(X, w, b):#線性函數return torch.mm(X, w) + bdef squared_loss(y_hat, y): # 注意這里返回的是向量, 另外, pytorch里的MSELoss并沒有除以 2return ((y_hat - y.view(y_hat.size())) ** 2) / 2def set_figsize(figsize=(3.5, 2.5)):use_svg_display()# 設置圖的尺寸plt.rcParams['figure.figsize'] = figsize#初始化一個線性回歸模型,然后可以使用小批量隨機梯度下降以及其他算法來訓練模型 def train_ch7(optimizer_fn, states, hyperparams, features, labels,batch_size=10, num_epochs=2):# 初始化模型net, loss = linreg, squared_lossw = torch.nn.Parameter(torch.tensor(np.random.normal(0, 0.01, size=(features.shape[1], 1)), dtype=torch.float32),requires_grad=True)b = torch.nn.Parameter(torch.zeros(1, dtype=torch.float32), requires_grad=True)def eval_loss():return loss(net(features, w, b), labels).mean().item()ls = [eval_loss()]data_iter = torch.utils.data.DataLoader(torch.utils.data.TensorDataset(features, labels), batch_size, shuffle=True)for _ in range(num_epochs):start = time.time()for batch_i, (X, y) in enumerate(data_iter):l = loss(net(X, w, b), y).mean() # 使用平均損失# 梯度清零if w.grad is not None:w.grad.data.zero_()b.grad.data.zero_()l.backward()optimizer_fn([w, b], states, hyperparams) # 迭代模型參數if (batch_i + 1) * batch_size % 100 == 0:ls.append(eval_loss()) # 每100個樣本記錄下當前訓練誤差# 打印結果和作圖print('loss: %f, %f sec per epoch' % (ls[-1], time.time() - start))set_figsize()plt.plot(np.linspace(0, num_epochs, len(ls)), ls)#np.linspace分割橫坐標plt.xlabel('epoch')plt.ylabel('loss')

飛機機翼噪音數據集

當批量大小為樣本總數1,500時,優化使用的是梯度下降。梯度下降的1個迭代周期對模型參數只迭代1次。可以看到6次迭代后目標函數值(訓練損失)的下降趨向了平穩。

def train_sgd(lr, batch_size, num_epochs=2):train_ch7(sgd, None, {'lr': lr}, features, labels, batch_size, num_epochs)train_sgd(1, 1500, 6)

當批量大小為1時,優化使用的是隨機梯度下降。為了簡化實現,有關(小批量)隨機梯度下降的實驗中,我們未對學習率進行自我衰減,而是直接采用較小的常數學習率。隨機梯度下降中,每處理一個樣本會更新一次自變量(模型參數),一個迭代周期里會對自變量進行1,500次更新。可以看到,目標函數值的下降在1個迭代周期后就變得較為平緩。

train_sgd(0.005, 1)

雖然隨機梯度下降和梯度下降在一個迭代周期里都處理了1,500個樣本,但實驗中隨機梯度下降的一個迭代周期耗時更多。這是因為隨機梯度下降在一個迭代周期里做了更多次的自變量迭代,而且單樣本的梯度計算難以有效利用矢量計算。

當批量大小為10時,優化使用的是小批量隨機梯度下降。它在每個迭代周期的耗時介于梯度下降和隨機梯度下降的耗時之間。

train_sgd(0.05, 10)
  • 小批量隨機梯度每次隨機均勻采樣一個小批量的訓練樣本來計算梯度。
  • 在實際中,(小批量)隨機梯度下降的學習率可以在迭代過程中自我衰減。
  • 通常,小批量隨機梯度在每個迭代周期的耗時介于梯度下降和隨機梯度下降的耗時之間。

總結

以上是生活随笔為你收集整理的小批量随机梯度下降的全部內容,希望文章能夠幫你解決所遇到的問題。

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