梯度检验与高级优化
梯度檢驗與高級優化
From Ufldl
Jump to: navigation, search眾所周知,反向傳播算法很難調試得到正確結果,尤其是當實現程序存在很多難于發現的bug時。舉例來說,索引的缺位錯誤(off-by-one error)會導致只有部分層的權重得到訓練,再比如忘記計算偏置項。這些錯誤會使你得到一個看似十分合理的結果(但實際上比正確代碼的結果要差)。因此,但從計算結果上來看,我們很難發現代碼中有什么東西遺漏了。本節中,我們將介紹一種對求導結果進行數值檢驗的方法,該方法可以驗證求導代碼是否正確。另外,使用本節所述求導檢驗方法,可以幫助你提升寫正確代碼的信心。
缺位錯誤(Off-by-one error)舉例說明:比如 循環中循環 次,正確應該是 ,但有時程序員疏忽,會寫成 ,這就是缺位錯誤。
假設我們想要最小化以 為自變量的目標函數。假設 ,則 。在一維的情況下,一次迭代的梯度下降公式是
再假設我們已經用代碼實現了計算 的函數 ,接著我們使用 來實現梯度下降算法。那么我們如何檢驗 的實現是否正確呢?
回憶導數的數學定義:
那么對于任意 值,我們都可以對等式左邊的導數用:
來近似。
實際應用中,我們常將 設為一個很小的常量,比如在 數量級(雖然 的取值范圍可以很大,但是我們不會將它設得太小,比如 ,因為那將導致數值舍入誤差。)
給定一個被認為能計算 的函數,我們可以用下面的數值檢驗公式
計算兩端是否一樣來檢驗函數是否正確。
上式兩端值的接近程度取決于 的具體形式。但是在假定 的情況下,你通常會發現上式左右兩端至少有4位有效數字是一樣的(通常會更多)。
現在,考慮 是一個向量而非一個實數(那么就有個參數要學習得到),并且 。在神經網絡的例子里我們使用 ,可以想象為把參數 組合擴展成一個長向量 。現在我們將求導檢驗方法推廣到一般化,即 是一個向量的情況。
假設我們有一個用于計算 的函數 ;我們想要檢驗 是否輸出正確的求導結果。我們定義 ,其中
是第 個基向量(維度和 相同,在第 行是“”而其他行是“”)。所以, 和 幾乎相同,除了第 行元素增加了 。類似地, 得到的第 行減小了 。然后我們可以對每個 檢查下式是否成立,進而驗證 的正確性:
當用反射傳播算法求解神經網絡時,正確算法實現會得到:
以上結果與反向傳播算法中的最后一段偽代碼一致,都是計算梯度下降。為了驗證梯度下降代碼的正確性,使用上述數值檢驗方法計算 的導數,然后驗證 與 是否能夠給出正確的求導結果。
迄今為止,我們的討論都集中在使用梯度下降法來最小化 。如果你已經實現了一個計算 和 的函數,那么其實還有更精妙的算法來最小化 。舉例來說,可以想象這樣一個算法:它使用梯度下降,并能夠自動調整學習速率 ,以得到合適的步長值,最終使 能夠快速收斂到一個局部最優解。還有更妙的算法:比如可以尋找一個Hessian矩陣的近似,得到最佳步長值,使用該步長值能夠更快地收斂到局部最優(和牛頓法類似)。此類算法的詳細討論已超出了這份講義的范圍,但是L-BFGS算法我們以后會有論述(另一個例子是共軛梯度算法)。你將在編程練習里使用這些算法中的一個。使用這些高級優化算法時,你需要提供關鍵的函數:即對于任一個 ,需要你計算出 和 。之后,這些優化算法會自動調整學習速率/步長值 的大小(并計算Hessian近似矩陣等等)來自動尋找 最小化時 的值。諸如L-BFGS和共軛梯度算法通常比梯度下降法快很多。
中英文對照
off-by-one error 缺位錯誤
bias term 偏置項
numerically checking 數值檢驗
numerical roundoff errors 數值舍入誤差
significant digits 有效數字
unrolling 組合擴展
learning rate 學習速率
Hessian matrix Hessian矩陣
Newton's method 牛頓法
conjugate gradient 共軛梯度
step-size 步長值
總結
- 上一篇: 稀疏自编码器符号一览表
- 下一篇: 反向传导算法