梯度檢查是一種 幫助我節省了大量時間的技術
多次幫助我發現在我的反向傳播 建置時的錯誤
讓我們來看 您也可以使用它來除錯
或者驗證您的反向傳播建置是正確的
您的神經網路有一些參數 像是 W[1], b[1], 等等到 W[L], b[L]
為了要建立梯度檢查, 第一件事是您應該要做的是拿所有您的
參數然後 重新建立一個大的向量 θ
您應該做的是拿 W 是一個矩陣 把它重塑成一個向量
您必須將所有這些 W 然後 重塑他們成為一個向量, 然後結合
所有這些東西, 變成一個大的向量 θ
大的向量發音為 theta
我們說成本函數 J 是 W 跟 b 的函數
您現在的成本函數 J 會變成 θ 的函數
接下來, 跟 W 跟 b 用相同方式排列
您也一樣將 dw[1], db[1], 等等 重塑它們變成一個
巨大向量 dθ 跟 θ 同維度
跟之前一樣, 我們重塑 dw[1] 這個矩陣, db[1] 已經是向量
重塑 dw[L], 所有 dw 的矩陣
記得 dw[1] 跟 w[1] 同維度
db[1] 跟 b[1] 同維度
用同樣的重塑及結合的運算
您可以重塑所有這些導數 成為一個大的向量 dθ
跟 θ 同維度
現在問題是 這個 dθ 是
成本函數 J 的梯度或者說是斜率嗎 ?
這個就是您如何來建立 梯度檢查
通常梯度檢查縮寫為 grad check
首先我們記住 J 現在是 一個大的參數 θ 的函數
對吧?
所以展開 J 是 θ1, θ2, θ3 等等的函數
無論這個大的參數向量 θ 的維度多少
要建立梯度檢查， 您要做的是建立一個迴圈
對於每一個 i, 對於每一個 θ
計算 dθ approx[i] 為
讓我們用雙邊差異
所以我拿 J of θ
θ1, θ2, 直到 θi
而我們將微調 θi 加上 ε
只要將 θi 增加 ε, 其他保持一樣
因為我們取雙邊差異
我們同樣取 θi 的另一邊 減去 ε
所以其他元素都不去動它們
然後我們拿這個來除以 2ε (口誤)
我們從前面的投影片看到
這個應該會趨近等於 dθ[i]
也就是 J 的偏導數 相對於
我想是 θi, 如果 dθi 是成本函數 J 的導數
您要做的是計算每一個 i
最後 您會有兩個向量
您最終有這個 dθ approx 跟
這會是同維度的 dθ
而這兩個的維度都跟 θ 一樣
而您要檢查的是 是否這兩個向量幾乎相等
是相同的
詳細的說 您如何定義
兩個向量是否真的 互相彼此接近
我會這樣做
我會計算這兩個向量的 歐幾里德距離
dθ approx 減去 dθ 所以就只是 L2 範數
注意這裡上面沒有平方
這是總和於逐元素的差異的平方
然後取平方根 就像是歐幾里德距離
然後用這些向量的長度 來做正規化
除以 dθ approx 加 dθ
取這兩個向量的 歐幾里德長度
分母這一行就只是萬一任何一個向量很小
或者很大, 您的分母會 將這個公式變成比率
所以當實作時
我用 ε 等於也許是 10 的負7 次方, 所以 -7
使用這個範圍的 ε 如果您發現這個公式給您
的值類似於 10 的負 7 次方或更小 那很棒
這表示您的導數 近似值可能是對的
這真的是很小的數字
如果也許在 10 的 -5 次方範圍 我會小心的看看
也許沒事
但我會再次檢查 這個向量的分量
確定沒有一個分量是太大的
而如果一些分量的差異很大
或許某個地方您有一個臭蟲 (錯誤)
而如果左邊這個公式是 -3 次方等級 那我會擔心
會更擔心 也許某個地方有錯誤
但您應該得到的值會 遠小於 10 的 -3 次方
如果比 10 的 -3 次方大 那我會很擔心
我會嚴重的擔心 是否真的有錯誤
我會 您應該看每一個
分量的資料是否有特定的 i
使得 dθ approx i 非常不同於 dθi
使用它試著來追蹤是否
您的一些導數計算是錯誤的
而經過一定的除錯 最後它終於
到這個相當小的值 那您或許有一個正確的建置
所以當建立一個神經網路時
通常我會建立 正向傳播, 建立反向傳播
然後我或許會發現這個 梯度檢查相對大的價值
而當我懷疑有錯誤時 就一直除錯, 除錯, 除錯
經過一段除錯的時間後 我發現以小的值通過梯度檢查時
那我可以比較有信心, 它是正確的
所以您現在知道梯度檢查如何作用
這曾經幫助我找到很多的錯誤 在我建立神經網路時
我希望它也會幫到您
在下一段影片 我想分享您一些技巧
或一些筆記如何 建立梯度檢查
讓我們進入下一段影片