13 反向傳播法求梯度

2022-09-10 06:27:09 字數 2141 閱讀 1800

利用計算圖求梯度是一種比較方便又快速的方法,如何利用計算圖求梯度?先回憶一下計算圖:

以 z =x

2+y2

z=x^2+y^2

z=x2+y

2 為例:

return dx,dy #(dx, dy)就是梯度

現在利用這個類來求一下在點 (2, 3) 處的梯度:

sqrt_with_add = sqrtwithadd(

)#例項化類

sqrt_with_add.forward(2,

3)#先進行正向傳播

grad = sqrt_with_add.backward(

)#求梯度

print

(grad)

#輸出:(4,6)

經手算驗證,結果正確。

既然用反向傳播的方法求出了梯度值,那麼現在就想用這個方法結合梯度下降法來求一下函式最小值。

先把公式寫一下:

x =x

−η∂f

∂xy=

y−η∂

f∂yx = x - \eta \frac\\y = y - \eta \frac

x=x−η∂

x∂f​

y=y−

η∂y∂

f​之前講過了,η

\eta

η 是學習率。

**如下:

def

gradient_descent

(init_x,init_y, lr=

0.01

, step_num=

100)

: x = init_x

y = init_y

sqrt_with_add = sqrtwithadd(

)#建立例項

for i in

range

(step_num)

: sqrt_with_add.forward(x,y)

#正向傳播

dx,dy = sqrt_with_add.backward(

)#反向傳播求梯度

x -= lr * dx

y -= lr * dy

return x,y

#呼叫函式求最小值位置

x,y = gradient_descent(init_x=

3,init_y=4)

#設定開始起點(3,4)

print

('[{}, {}]'

.format

(x,y)

)

輸出:

[0.39785866768425965, 0.5304782235790126]
結果可以通過調整學習率lr和 學習次數step_num來接近最佳位置。

這裡舉的例子是二維的,可以通過調整上面的類的輸入值的維數來使其變為可以求 n維的。

最後總結一下反向傳播法求梯度與數值微分法求梯度的區別

反向傳播求梯度實際上用的是解析法來求導,跟自己手算求梯度是一樣的,記得求導公式就可以;

而數值微分法求的梯度實際上用的是導數定義法來求

反向傳播和梯度消失

統計機器學習演算法由模型 策略和演算法三個要素構成,當選擇了一種演算法模型後,下一步就要考慮選擇什麼樣的策略或準則來最優化模型 損失函式是機器學習中用於衡量模型一次 結果好壞的目標函式 常用的損失函式有 1 0 1損失函式 非凸函式,只關心 值和真實值是否相同,沒有關係他們之間的距離或誤差,有很多不...

pytorch梯度累加反向傳播

傳統的訓練函式,乙個batch是這麼訓練的 for i,images,target in enumerate train loader 1.input output images images.cuda non blocking true target torch.from numpy np.arr...

Tensorflow 卷積的梯度反向傳播

我們分兩種不同的情況討論valid卷積的梯度 第一種情況,在已知卷積核的情況下,對未知張量求導 即對張量中每乙個變數求導 第二種情況,在已知張量的情況下,對未知卷積核求導 即對卷積核中每乙個變數求導 1.已知卷積核,對未知張量求導 我們用乙個簡單的例子理解valid卷積的梯度反向傳播。假設有乙個3x...