梯度下降
1.梯度
各個方向的偏微分組成的向量
圖1
舉例說明,z對x的偏微分和對y的偏微分如下,則梯度是(-2x,2y)的這樣一個向量
圖2
在光滑連續函數的每個點上,都可以計算一個梯度,也就是一個向量,用小箭頭表示,那麼梯度越大的地方,向量的模值就會越大,箭頭就會越長,如圖所示
圖3
可以看到,越平坦的地方,箭頭越短,說明梯度越小,所以梯度反映了圖像的變化趨勢
2.通過梯度更新參數,讓目標函數(損失函數)趨於極小值
更新參數的目的是讓目標函數找到一個極小值,這個目標函數就是我們說的損失函數
在函數中的每個變量稱爲參數,對圖二中的例子進一步分析,x,y兩個就是參數,如圖,x沿着x正方向,所以△x>0,如果函數是上升的,是在上坡的,則△z>0,這時候參數x應該往回走,即應該減小。如果函數是下降,是下坡的,則△z<0,這時候參數x應該往前走,即應該增大,所以參數和梯度的關係應該是相反的
左邊是更新後的參數, at是學習率,防止每次改變的幅度過大,一不小心跳過了最小值點
圖4
3.通過tensorflow計算梯度
損失函數定義在
with tf.GradientTape() as tape:
tape.watch([w])
loss = w*x#在這裏定義損失函數
計算梯度在
grade = tape.gradient(loss,w)#在這裏計算梯度
完整代碼
import tensorflow as tf
w = tf.constant(1)
x = tf.constant(2.)
with tf.GradientTape() as tape:
tape.watch([w])
loss = w*x#在這裏定義損失函數
grade = tape.gradient(loss,w)#在這裏計算梯度
with tf.Session() as sess:
print(sess.run(grade))