1. 記住第一個公式:delta = z * (1 - z) * error
這項名稱是我提出的,幷不見得人人都贊同,但是它的確可以非常有效地簡化AI的教學與學生們的學習途徑。雖然看起來這些式子,如:delta = z * (1-z) * error,看來很複雜。其實,只要您不掉入數學推導的細節,它是非常簡單可愛的。其中,error就是預測值與實際值(標簽)的落差值。所以: delta = z * (1 - z) * error
其中的z *(1-z)就是Sigmoid激活函數的導數。將它記住了之後,做些變化。例如,當激活函數改爲ReLU時,其導數爲1或0,此時,這個黃金公式就變成爲:
delta = loss (或 0)
所以先記住: delta = z * (1 - z) * error。就能隨著兩種變因而舉一反三了。其變因有二:1)損失函數(Loss Function);2)激活函數(Activation Function)。例如,最常見的損失函數是MSE(即均方誤差)或SSE(誤差平方和);而最常見的激活函數是Sigmoid函數。 2. 逐漸孰悉它的變化:
例如,改變一下,把損失函數改爲交叉熵時,這標準公式會變成什麽? 再如,改變一下,把激活函數改爲ReLU時,這標準公式會變成什麽? 然後,再改變一下,把激活函數改爲Softmax時,這標準公式會變成什麽? 如此,就很輕易地掌握NN的BP算法的任督之脉了。如此,一切變化盡在其中,就不必去糾纏于對損失函數的偏微分推倒細節了,也就是不必去糾纏于梯度向量的推算細節了,它們都在這簡單公式裡了。 3. 就像牛頓力學的公式:F = ma
這項 delta = z * (1 - z) * error 公式,就像幾何學裏的圓形面積公式:Area = PI * r^2 一樣,人人朗朗上口,也像牛頓力學的F = ma公式,或像愛因斯坦的 E = MC^2 質能變換公式一樣,記住它,活用它,然後才漸漸去理解它是如何導出的,甚至許多人一輩子也都不去煩惱它們是如何推導出來的。 4. 三個基本公式
許多人都可以直接記住它、活用它,總共三個簡單公式:
第1公式:delta = z * (1 - z) * error
第2公式:error_prev = W * delta
第3公式:dw = X_prev * delta
這三個公式如同牛頓力學三大定律公式。基于這項基礎知識,就能非常迅速地算出NN, CNN, RNN等神經網絡模型的AI機器學習流程了。 5. 範例一:解析Python代碼
例如,在我所撰寫的《Python 與TensorFlow結合》一書裡,有一段代碼:
for i in range(500):
hy = x.dot(w1)
hz = relu(hy)
oy = hz.dot(w2)
oz = sigmoid(oy)
# Compute and print loss
L = np.square(t - oz).sum()
print(i, L)
# Backprop to compute gradients of w1 and w2 with respect to loss
error = t - oz
delta = oz * (1-oz) * error
dw2 = hz.T.dot(delta)
error_h = delta.dot(w2.T)
delta_h = error_h.copy()
delta_h[h < 0] = 0
dw1 = x.T.dot(delta_h)