盡管解析梯度可以讓我們省去巨大的計算量,但如果函數比較復雜,對這個損失函數進行微分計算會變得很困難。我們通常會用反向傳播技術來遞歸地調用鏈式法則來計算向量每一個方向上的梯度。具體來說,我們將整個計算過程的輸入與輸入具體化,用計算圖表示:
以SVM為例,如果是求梯度,在點乘處直接做偏導就行了,但如果函數并沒有那么簡單,由很多個不同的點乘和加法構成呢,那么函數只會在最后形成,要求偏導的話,就要用間接的關系,反相傳播的意思就是,假如在第一個節點f與A有關,第二個節點A與要求的偏導B和C有關,那么在正向求完每個節點的梯度值后,就可以用f對A的偏導,再乘以A對B和C的偏導,約去分子分母的同項,從而得到該方向上的剃度了。那么也就是說,假如計算過程可以寫成計算圖的形式,那么計算每種損失函數的微分都可以實現,區別只是快慢。
假如我們的損失函數是,把計算過程拆解為計算圖:
從這個復雜的例子我們就能理解,假如我們直接對損失函數進行求導,這個計算過程會很復雜,難度大的同時還增加計算時間,換成反向傳播之后,我們只需根據輸入值,一步一步地進行簡單計算,然后從最后根據上一個節點傳來的值計算偏導再乘到一起就行。
值得注意的是,在實際應用的時候,我們并不一定要拆解成每一步,我們可以將其中一部分當成一個整體,類似于指代的過程,這樣我們就可以先通過公式計算完外部的整體求導,再對內部進行反向傳播的運算。
學習來自斯坦福教程:Stanford University CS231n: Deep Learning for Computer Vision