1.對於一個二元函數f(x, y),有 \(\nabla f = [\frac{\partial f}{\partial x} , \frac{\partial f}{\partial y}]\) 所以可知,梯度是一個向量而不是一個標量
2.利用鏈式法則解釋何爲反向傳播:
f(x,y,z)=(x+y)z, q = x+y。若是咱們對f求x的偏導。實際爲\(\frac{\partial f}{\partial x} = \frac{\partial f}{\partial q} \frac{\partial q}{\partial x}\)。此時,咱們使用代碼來複現這一過程,藉此來說反向傳播:網絡
# 設置輸入值 x = -2; y = 5; z = -4 # 進行前向傳播 q = x + y # q becomes 3 f = q * z # f becomes -12 # 進行反向傳播: # 首先回傳到 f = q * z dfdz = q # df/dz = q, 因此關於z的梯度是3 dfdq = z # df/dq = z, 因此關於q的梯度是-4 # 如今回傳到q = x + y dfdx = 1.0 * dfdq # dq/dx = 1. 這裏的乘法是由於鏈式法則 dfdy = 1.0 * dfdq # dq/dy = 1
咱們經過上述代碼獲得了梯度\([\frac{\partial f}{\partial x} , \frac{\partial f}{\partial y}, \frac{\partial f}{\partial z}]\)咱們的計算過程以下圖所示:
前向傳播從輸入計算到輸出(綠色),反向傳播從尾部開始,根據鏈式法則遞歸地向前計算梯度(顯示爲紅色。好比說我想獲得f關於z的反向傳播,就對z求梯度),一直到網絡的輸入端。能夠認爲,梯度是從計算鏈路中迴流。
下面舉一個如何利用這種思想求一個複雜函數梯度的例子:
\(f = \frac{1}{1 + exp(-(w_{0}x_{0} + w_{1}x_{1} + w{2}))}\)
在這裏咱們使用sigmod函數求導的思想
\(\sigma(x) = \frac{1}{1 + exp(-x)}\)
函數
咱們經過如下的代碼求出對x和w的梯度:spa
w = [2,-3,-3] # 假設一些隨機數據和權重 x = [-1, -2] # 前向傳播 dot = w[0]*x[0] + w[1]*x[1] + w[2] f = 1.0 / (1 + math.exp(-dot)) # sigmoid函數 # 對神經元反向傳播 ddot = (1 - f) * f # 點積變量的梯度, 使用sigmoid函數求導 dx = [w[0] * ddot, w[1] * ddot] # 回傳到x dw = [x[0] * ddot, x[1] * ddot, 1.0 * ddot] # 回傳到w # 完成!獲得輸入的梯度
上述代碼先完成了對dot=\(w_{0}x_{0} + w_{1}x_{1} + w{2}\)的求導,而後再令dot對x和w的份量求導code