線性回歸 小批量隨機梯度下降演算法

2021-09-27 12:34:35 字數 4693 閱讀 9232

先貼**

import torch

import numpy as np

import random

trainsetshape =

(100,2

)true_w = torch.tensor([[

2.00],

[-3.4]

], dtype=torch.float64)

true_b =

4.2def

data_iter

(features, labels, batch_size=10)

: num_examples =

len(features)

indices =

list

(range

(num_examples)

) random.shuffle(indices)

# 樣本的讀取順序是隨機的

for i in

range(0

, num_examples, batch_size)

: j = torch.longtensor(indices[i:

min(i + batch_size, num_examples)])

# 最後一次可能不足乙個batch

yield features.index_select(

0, j)

, labels.index_select(

0, j)

deflinreg

(x, w, b)

:return torch.mm(x, w)

+ b# x: n*2

# w: 2*1

# b: n*1

defsquared_loss

(y_hat, y)

:# 注意這裡返回的是向量, 另外, pytorch裡的mseloss並沒有除以 2

return

((y_hat - y.view(y_hat.size())

)**2)

*0.5

defsgd

(params, lr, batch_size)

:for param in params:

param.data -= lr * param.grad # 注意這裡更改param時用的param.data

if __name__ ==

'__main__'

:# 生成資料

features = torch.from_numpy(np.random.normal(0,

1, trainsetshape)

) labels = torch.mm(features, true_w)

+ true_b

labels += torch.from_numpy(np.random.normal(0,

0.01

, labels.shape)

) w = torch.tensor([[

5],[

5]], dtype=torch.float64)

b = torch.tensor([5

], dtype=torch.float64)

w.requires_grad_(requires_grad=

true

) b.requires_grad_(requires_grad=

true

) lr =

0.03

num_epochs =

15 batch_size =

10for epoch in

range

(num_epochs)

:# 訓練模型一共需要num_epochs個迭代週期

# 在每乙個迭代週期中,會使用訓練資料集中所有樣本一次(假設樣本數能夠被批量大小整除)。x

# 和y分別是小批量樣本的特徵和標籤

for x, y in data_iter(features, labels, batch_size=10)

: l = squared_loss(linreg(x, w, b)

, y)

.sum()

# l是有關小批量x和y的損失

l.backward(

)# 小批量的損失對模型引數求梯度

sgd(

[w, b]

, lr, batch_size)

# 使用小批量隨機梯度下降迭代模型引數

# 不要忘了梯度清零

w.grad.data.zero_(

) b.grad.data.zero_(

) train_l = squared_loss(linreg(features, w, b)

, labels)

print

('epoch %d, loss %f'

%(epoch +

1, train_l.mean(

).item())

)print

(w)print

(b)

**分別:匯入包、定義了一些常量、定義了一些函式、定義了**主體

訓練模型y = b + x1w1 + x2w2

小批量隨機梯度下降演算法:比如乙個資料集有10w條資料,你同時做矩陣運算不太現實,所以就要批量處理。比如每次處理100條、一千條。

# 生成資料

features = torch.from_numpy(np.random.normal(0,

1, trainsetshape)

) labels = torch.mm(features, true_w)

+ true_b

labels += torch.from_numpy(np.random.normal(0,

0.01

, labels.shape)

)

np.random.normal(): 生成乙個形狀為trainsetshape的,服從0,1正態分佈的矩陣

資料型別是 numpy,要轉換成tensor,要用到 torch.from_numpy() 函式

torch.mm() 矩陣乘法

我們先自己生產100條資料,設w1 = 2, w2 = =3.4, bias = 4.2, 然後再加上隨機擾動

w = torch.tensor([[

5],[

5]], dtype=torch.float64)

b = torch.tensor([5

], dtype=torch.float64)

w.requires_grad_(requires_grad=

true

) b.requires_grad_(requires_grad=

true

)# learning rate

lr =

0.03

# 迭代次數

num_epochs =

15#分塊大小

batch_size =

10

這裡要講一講autograd

我們宣告了w、b是要在以後求微分的requires_grad=true

那麼之後所有用w、b運算出來的變數都會帶有requires_grad=true

比如loss_function(b, w),中b和w作為線性回歸中喪失函式的引數,是要以後迭代求微分來進行梯度下降的。

for epoch in

range

(num_epochs)

:# 訓練模型一共需要num_epochs個迭代週期

# 在每乙個迭代週期中,會使用訓練資料集中所有樣本一次(假設樣本數能夠被批量大小整除)。

# x和y分別是小批量樣本的特徵和標籤

for x, y in data_iter(features, labels, batch_size=10)

: l = squared_loss(linreg(x, w, b)

, y)

.sum()

# l是有關小批量x和y的損失

l.backward(

)# 小批量的損失對模型引數求梯度

sgd(

[w, b]

, lr, batch_size)

# 使用小批量隨機梯度下降迭代模型引數

# 不要忘了梯度清零

w.grad.data.zero_(

) b.grad.data.zero_(

) train_l = squared_loss(linreg(features, w, b)

, labels)

print

('epoch %d, loss %f'

%(epoch +

1, train_l.mean(

).item())

)

l = squared_loss(linreg(x, w, b)

, y)

.sum()

l.backward(

)

在這裡,autograd要求求梯度必須為乙個1維的值,即shape必須為1x1

backward為求梯度,然後會反射會涉及的變數

批量梯度下降,隨機梯度下降,小批量梯度下降

在機器學習領域中,梯度下降的方式有三種,分別是 批量梯度下降法bgd 隨機梯度下降法sgd 小批量梯度下降法mbgd,並且都有不同的優缺點。下面我們以線性回歸演算法 也可以是別的演算法,只是損失函式 目標函式 不同而已,它們的導數的不同,做法是一模一樣的 為例子來對三種梯度下降法進行比較。假設 特徵...

小批量梯度下降演算法 python

coding utf 8 created on tue mar 13 20 49 03 2018 author import numpy as np from scipy import stats import matplotlib.pyplot as plt 產生訓練資料,生成模型為2 x 5 r...

小批量梯度下降演算法步驟 優化演算法之梯度下降演算法

在應用機器學習演算法時,我們通常採用梯度下降法來對採用的演算法進行訓練。其實,常用的梯度下降法還具體包含有三種不同的形式,它們也各自有著不同的優缺點。1.批量梯度下降法bgd 現在下面以lr演算法為例對這三種演算法從原理到 進行講解 由lr演算法可知lr演算法的損失函式為 損失函式j 最小值時的 則...