一、梯度下降和梯度的介紹
1、定義
梯度:是一個向量,導數(shù)+變化量快的方向(學習的前進方向)。在機器學習里,有一個機器學習模型f,為 f(z,w)=Y(不是完整公式,這里只做示意):
梯度下降:指的是更新上面的w的過程,即算出導數(shù),作用是算出梯度,并更新w.
常見的導數(shù)計算:
多元函數(shù)求偏導:
計算圖:把數(shù)據(jù)和操作通過圖來表示
反向傳播算法:從后往前,計算每一層的梯度,并通過變量存儲起來,因此計算量很大的時候,相當好內存。
二、Pytorch完成線性回歸
1、向前計算
對于pytorch中的一個tensor, 如果設置它的屬性,requires_grad為True, 那么它將會追蹤對于該張量的所有操作,或者可以理解為,這個參數(shù)會被計算梯度,并更新該參數(shù)。
# 舉例
import torch
x = torch.ones(2, 2, requires_grad=True) # 以后每次計算都會修改grad_fn屬性
print(x)
y = x+2
print(y)
2、反向傳播
直接調用 output.backward(),此時會根據(jù)損失函數(shù)去計算梯度。
3、獲取梯度
x.grad,此時還并未更新梯度。這是累加梯度,因此每次反向傳播之前,需要將梯度置為0,。
4、獲取tensor中的數(shù)據(jù)
直接調用 tensor.data
5、實現(xiàn)tensor的數(shù)據(jù)深拷貝,轉化為ndarray類型
直接調用:tensor.detach().numpy()
6、線性回歸的實現(xiàn)
(1)準備數(shù)據(jù)
(2)計算預測值
(3)計算損失,把參數(shù)的梯度置為0,進行反向傳播
(4)更新參數(shù)
import torch
import numpy as np
from matplotlib import pyplot as plt
#1. 準備數(shù)據(jù) y = 3x+0.8,準備參數(shù)
x = torch.rand([50])
y = 3*x + 0.8
w = torch.rand(1,requires_grad=True)
b = torch.rand(1,requires_grad=True)
def loss_fn(y,y_predict):
loss = (y_predict-y).pow(2).mean()
for i in [w,b]:
# 每次反向傳播前把梯度置為0
if i.grad is not None:
i.grad.data.zero_()
# [i.grad.data.zero_() for i in [w,b] if i.grad is not None]
loss.backward()
return loss.data
def optimize(learning_rate):
# print(w.grad.data,w.data,b.data)
w.data -= learning_rate* w.grad.data
b.data -= learning_rate* b.grad.data
for i in range(3000):
#2. 計算預測值
y_predict = x*w + b
#3.計算損失,把參數(shù)的梯度置為0,進行反向傳播
loss = loss_fn(y,y_predict)
if i%500 == 0:
print(i,loss)
#4. 更新參數(shù)w和b
optimize(0.01)
# 繪制圖形,觀察訓練結束的預測值和真實值
predict = x*w + b #使用訓練后的w和b計算預測值
plt.scatter(x.data.numpy(), y.data.numpy(),c = "r")
plt.plot(x.data.numpy(), predict.data.numpy())
plt.show()
print("w",w)
print("b",b)