• 正文
    • 一、梯度下降和梯度的介紹
    • 二、Pytorch完成線性回歸
  • 相關推薦
申請入駐 產(chǎn)業(yè)圖譜

三、梯度下降和反向傳播

2024/12/11
1518
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

一、梯度下降和梯度的介紹

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)

相關推薦