coursera 吳恩達Improving Deep Neural Networks 筆記

終於考完試了,現在開始幹活!
網站鏈接

Week 1

1.1 Train / Dev / Test sets

本節介紹train/dev/test sets,訓練集、開發集(交叉驗證集)、測試集
獲得更好的參數要多做幾次右圖的圈圈:
在這裏插入圖片描述
之前數據不多的時代,分割比率是73開或者622開,現在只要1%左右就行了:

如果你有100萬個樣本 而只需要1萬個用作開發集 1萬個用作測試集 那麼1萬個只是100萬個的百分之一 所以你的比例就是98/1/1% 我還看見過一些應用 這些應用中樣本可能多於100萬個 分割比率可能會變成99.5/0.25/0.25% 或者開發集佔0.4% 測試集佔0.1%

在這裏插入圖片描述

  1. 通常分爲訓練集、開發集(交叉驗證集)和測試集,如果是隻有兩個的話,因爲有不同的講法,可能會把開發集講成測試集。如果不需要無偏估計的話,可以不要測試集,當然通常還是分開三個集比較好。無偏估計以後會講。
  2. 還有就是訓練集與另外兩個集針對的樣例一定要對應。不然就會像打靶一樣,訓練的是a靶子,測試要求的卻是b靶子,下面在網頁上爬取的貓貓圖和用戶發送的貓貓圖中辨認貓貓,其實是有偏差的,應該三個集的出處都一致,都是網頁上的貓貓圖或者是app上的貓貓圖。
    在這裏插入圖片描述

1.2 Bias / Variance

本節介紹偏差(bias)和方差(variancee):
訓練出來的算法要避免高偏差和高方差,二維方便可視化,但是高緯度就不行了
在這裏插入圖片描述
有無偏差和方差的4種情況。。。不知道怎麼總結,大概就圖那樣吧,然後提到了貝葉斯誤差(理想誤差),如果貝葉斯誤差非常高,表示人和任何系統都不能分類,這樣需要用別的手段去分析,這裏的判斷是基於貝葉斯誤差比較低且你的訓練集和開發集都來自同一分佈的假設下。
在這裏插入圖片描述
最後一個問題:高方差和高偏差的曲線長什麼樣?下圖紫線就是高方差和高偏差的曲線,然後直線部分是高偏差,曲線部分是高方差,因爲對於那兩個點過擬合了。
在這裏插入圖片描述

1.3 Basic Recipe for Machine Learning

本節介紹如何防止過擬合和欠擬合,圖上有對應的解決方案
High bias :模型連訓練集都不能很好擬合
High variance : 不能擬合 dev set (開發集(交叉驗證集))
下面是防止高偏差和高方差的流程,正則化(regularization)下面會講。
在深度學習和大數據之前,高方差和高偏差會顧此失彼,現在不會了,正則化用於減小方差,是個很有用的辦法 在正則化中存在一點點偏差與方差間的權衡 它可能會使偏差增加一點點 但在你的網絡足夠巨大時 增加得通常不會很多
在這裏插入圖片描述

1.4 Regularization

本節介紹正則化,因爲解決過擬合(high variance)用“more data”的方法的話,有時候數據比較難找或者昂貴,這時候就需要用正則化。
加上了regularization的 J(w,b) :
其中後面那個w22||w||^2_2,上標2是平方的也是,下標2是L2範數的意思,因爲lambda與Python的關鍵字衝突,所以用lambd代替
在這裏插入圖片描述
在神經網絡中的寫法:
然後因爲一些線性代數中的神祕原因,那個w矩陣不叫L2範數,而叫矩陣的弗羅貝尼烏斯範數,使用角標F標記,dwdw變爲原來的dwdw再加上λmw[l]\frac{λ}{m}w^{[l]},其他不變,代入到w[l]=w[l]αdw[l]w^{[l]}=w^{[l]}-αdw^{[l]}就是下面綠綠的公式,因此,無論矩陣w[l]是多少你都會讓它減掉自己小小的一部分(變得稍小一點),所以L2範數正則化又被稱爲權重衰減
在這裏插入圖片描述

1.5 Why regularization reduces overfitting?

下面介紹爲啥正則化可以減少過擬合:
正則化是在J中加入的額外的懲罰項是用來防止權重過大:如果調整λ很大的話,相當於w會很小,接近於0,則有些點會對神經網絡的影響很小,相當於被x掉了(左上角),這樣的話,整個神經網絡就會被削減,有點像深層的邏輯迴歸,這樣的話,會從 high variance 變爲 high bias ,然後肯定會有適合的λ使得 high variance 變爲 just right 的圖。
在這裏插入圖片描述
另一個例子是在tanh激活函數中,λ增加,則w減小,則z也會變小,所以tanh激活函數變成了類似線性的函數,然後之前知道了線性函數的堆砌也還是線性函數,所以就不能擬合那些很複雜的決策函數
在這裏插入圖片描述
最後 如果你使用梯度下降方法 調試程序的一個步驟就是畫出代價函數 J 關於 梯度下降的迭代次數的圖像 可以看到的是每次迭代後代價函數 J 都會單調遞減 。如果你實現了正則化部分 那麼請記住 J 現在有了新的定義 如果你仍然使用原來定義的 J 就像這裏的第一項 你可能看不到單調遞減的函數圖像 所以爲了調試梯度下降程序請確保你畫的圖像 是利用這個新定義的J函數 它包含了這裏第二個項

1.6 Dropout Regularization

除了L2正則化 另一種非常強大的正則化技術是 隨機失活正則化(丟棄法 dropout) :
總體思路就是先建好一個神經網絡,然後對於不同的訓練樣例(examples),隨機保留和消除節點,這個跟前幾天看到的何凱明的隨機生成神經網絡有點像,可能從中有些啓發吧。
在這裏插入圖片描述
隨機失活中,通常用反向隨機失活(inverted dropout),代碼如下:
先定義3層神經網絡,然後定義keep.prob是指保留的概率,這裏是0.8,就是保留丟失82開。然後d3就是保存選中的點的位置,點乘上a3就得出哪些點保留下來。
這裏a3/=keep.prob是用來放大a3的,因爲它能提供你所需要的大約20%的校正值,這樣a3的期望值就不會被改變 。
在這裏插入圖片描述
注意在測試的時候(應該是指predict的時候吧?),你不需要 drop out 來讓一些隱藏單元消失。因爲你並不想讓你的輸出也是隨機的,在測試階段也使用隨機失活算法,只會爲預測增加噪聲。(理論上來說可以用不同的隨機失活的神經網絡進行多次預測取並平均值,但是這個方法運算效率不高而且會得到幾乎相同的預測結果)
而上一頁的除以keep.prob運算就是使激活函數的期望輸出也不會改變,測試過程可以不用加入額外的縮放操作。
在這裏插入圖片描述

1.7 Understanding Dropout

隨機失活 (dropout) 這種從網絡中隨機敲除神經元的做法看起來有些瘋狂 但是爲什麼用於正則化時它的表現這麼好呢?上一節是說在更小的神經網絡中計算而使用更小的神經網絡就好像具有正則化效果。

我們從單一神經元的角度來看這個問題 比如這個點 它的任務就是 利用這些輸入單元生成一個有意義的輸出 而如果使用了dropout 這些輸入會被隨機的丟棄 有的時候這兩個神經元會被丟棄 有的時候另一個神經元會被丟棄 因此 這就意味着 我用紫色圈起來的這個 它不能依賴於任何一個特徵 因爲每個都可能被隨機丟棄 或者說它的每一個輸入都可能隨機失活 所以在特定的時候 【就不願把所有的賭注 只放在這一個輸入神經元上】 對嗎? 因爲任何一個輸入都可能失活 所以我們也不願把太多的權重放在某一個上 因此這個神經元將會更積極的使用這種方式 對於每個輸入都給一個比較小的權重 而泛化這些權值 將有利於壓縮這些權重的平方泛數 (平方和) 和L2正則化類似 使用dropout有助於 收縮權值以及防止過擬合 但是 更準確的來說 dropout應該被看作一種自適應形式而不是正則化 L2正則對不同權值的懲罰方式有所不同 這取決於被激活的乘方大小 總之來說 dropout能起到和L2正則類似的效果 只是針對不同的情況L2正則可以有少許的變化 所以適用面更廣

在這裏插入圖片描述
運行的時候每一層的留存率要設置,在擔心會發生過擬合的層留存率要減少,不太擔心過擬合的層留存率可以設定更高。一般輸入和輸出留存率是1.0,0.9也行,但一般不會是減半。
drop out有些缺點:

  1. 在交叉驗證 (網格) 搜索時 會有更多的超參數 (運行會更費時) 另一個選擇就是對一些層使用dropout (留存率相同) 而另一些不使用 這樣的話 就只有一個超參數了
  2. 讓代價函數J 變得不那麼明確 因爲每一次迭代 都有一些神經元隨機失活 所以當你去檢驗梯度下降算法表現的時候 你會發現很難確定代價函數是否已經定義的足夠好 (隨着迭代 值不斷變小) 這是因爲你對代價函數J 的定義不明確 或者難以計算 因此就不能用繪圖的方法去調試錯誤了 像這樣的圖 通常這個時候我會關閉dropout 把留存率設爲1 然後再運行代碼並確保代價函數J 是單調遞減的 最後再打開dropout並期待 使用dropout的時候沒有引入別的錯誤 我想,你需要使用其他方法 而不是類似這種畫圖的方法去確保你的代碼 在使用dropout後梯度下降算法依然有效

另外注意只有過擬合的情況下才需要正則化。在CV領域,因爲輸入層向量維度非常大,因爲要包含每個像素點的值,幾乎不可能有足夠的數據,所以通常要dropout,但是不是什麼領域都需要dropout,它是一種正則化技術,目的是防止過擬合,所以除非算法已經過擬合,是不會考慮使用dropout的。
(PS具體操作看編程作業2)
在這裏插入圖片描述

1.8 Other regularization methods

另外一些規則化的方法:
第一個增加數據,如果拿不到更多的數據,那麼在有限的數據中,可以通過各種細微地調整(下面的4很扭曲但只是用來誇張而已)來增加數據量,這樣處理,從圖片獲得的信息會少了,但也是可行的。
在這裏插入圖片描述
一個是early stopping,在 dev error 開始升高的附近結束訓練,即選取的算法是開發集誤差最小的。有個正交化(orthogonalization)的概念,即一個時間只考慮一個任務,比如讓J(w,b)儘可能小,讓神經網絡不overfit,但是early stopping把兩個任務結合了,無法分開解決這兩個問題。

可以替代early stopping的是L2正則化,你可以儘可能久的訓練神經網絡,這樣可以讓超參數的搜索空間更易分解,也因此更易搜索,但這麼做的缺點是你可能必須嘗試大量的正則化參數λ的值,這使得計算代價很高。

而early stopping的優勢是 只要運行一次梯度下降過程 你需要嘗試小w值 中等w值和大w值 而不用嘗試L2正則化中 超參數λ的一大堆值。

如果計算能力足夠,L2正則化會更好。
在這裏插入圖片描述

1.9 Normalizing inputs

歸一化,公式都在下面了,中間是X-μ後的圖形,右邊是X/σ^2的圖形
在這裏插入圖片描述
什麼時候要用到歸一化,一個是輸入的 x1,x2,x3...x_1,x_2,x_3... 之間差距比較大,比如 0~1,1~1000,下圖是歸一化前後 J 函數到達最小值的點的路線,可以看出歸一化前彎彎曲曲走很多路,且它的 learning rate 要很小才能走到最優點,但右圖可以用更長的步長。
在這裏插入圖片描述
歸一化幾乎沒啥壞處,所以不管有沒有效都會用。

1.10 Vanishing / Exploding gradients

介紹梯度消失和梯度爆炸。
按照下圖來說,y_hat 是有多個w點乘起來的,可以看到1.5的多次冪很大,這就會爆炸,同樣的,如果選擇爲0.5,這樣就會消失。爆炸的話。。。會不準吧,然後消失的話,梯度下降會很慢,走半天走不到最好的那個點,增加 learning rate 的也不行,因爲這個w實在是太小了。
在這裏插入圖片描述

1.11 Weight Initialization for Deep Networks

解決梯度爆炸或消失的方法:就是w初始化的時候乘上個係數,紫框中那個,然後如果是relu的分子是2,如果是tanh的,分子是1會更好,然後也有別的定義式啥的。當然還有一些高級的什麼超參數的調整不是很懂,具體看回視頻吧。(Xavier Initialization 作業中經常用到)
在這裏插入圖片描述

1.12 Numerical approximation of gradients

如何檢查梯度下降下降得對不對:
用下圖的雙邊誤差/雙向微分(two-sided difference)來驗證。
在這裏插入圖片描述

1.13 Gradient checking

用 θ 裝 w 和 b ,用 dθ 裝 dw 和 db:
在這裏插入圖片描述
計算 dθapprox(裏面的eplison取值爲10^-7)和自己公式求導出來的 dθ , 用check的公式計算,如果約等於10^-7,那麼說明梯度下降做得不錯,如果只有10^-3,說明可能出了問題,此時就得不斷修改自己的代碼,直到 check 爲10^-7左右
在這裏插入圖片描述

1.14 Gradient Checking Implementation Notes

實行梯度檢驗時要注意的地方:
第4點因爲dropout去除的點不穩定
第5點非常非常少見:

最後的這個內容有些微妙 雖然很少發生 但並不是沒有可能 你對於梯度下降的使用是正確的 同時w和b在隨機初始化的時候 是很接近0的數 但隨着梯度下降的進行 w和b有所增大 也許你的反向傳播算法 在w和b接近0的時候是正確的 但是當w和b變大的時候 算法精確度有所下降 所以雖然我不經常使用它 但是你可以嘗試的一個方法是 在隨機初始化的時候 運行梯度檢驗 然後訓練網絡一段時間 那麼w和b 將會在0附近搖擺一段時間 即很小的隨機初始值 在進行幾次訓練的迭代後 再運行梯度檢驗

在這裏插入圖片描述

加粗樣式
???
在這裏插入圖片描述
在這裏插入圖片描述
不要在測試的時候,用dropout,而且不要保留在training時候的1/keep_prob
only use dropout during training. Don’t use dropout (randomly eliminate nodes) during test time.

only during training time, divide each dropout layer by keep_prob to keep the same expected value for the activations.

編程作業1

在相同條件下用不同的初始化方法,得到的train accuracy天差地別,對於ReLU激活的,推薦使用 He initialization 與它相似的是(Xavier initialization,不過適用的激活函數是啥忘了),然後不建議使用把w全0化的初始化方法,然後隨機數不要太大
在這裏插入圖片描述
在這裏插入圖片描述

編程作業2

在這裏插入圖片描述
L2 正則化 注意事項等等
在這裏插入圖片描述
dropout 注意事項等等
在這裏插入圖片描述
dropout 心得:

  1. 記得 fp 和 bp 的時候都要用dropout,然後fp的時候 /keep_prob 是因爲:假設keep_prob 是0.5,然後就是打開了0.5,關閉了0.5嘛,因此剩下的一半的點 /keep_prob ,也就是 x2 ,意思就是扶持那消失了0.5的點,保持原來的輸出(可以認爲是保留的點把消失了的點的力也出了,一個頂2個),其他 keep_prob 值同理

  2. keep_prob 的意思是保留的意思,比如0.8就是保留80%的點(概率上)。因此作業2中的 forward propagation 是 D1<keep_prob 時爲0,一開始寫了>,就是沒有理解好

  3. 然後 fp 要 /keep_prob,在 bp 過程中也要 /keep_prob,因爲兩個要一致:

    During forward propagation, you had divided A1 by keep_prob. In backpropagation, you’ll therefore have to divide dA1 by keep_prob again (the calculus interpretation is that if A[1]A[1] is scaled by keep_prob, then its derivative dA[1]dA[1] is also scaled by the same keep_prob).

    總結,注意正則化會讓你的weights變小,在1.5第二個圖中得知w變小,z變小,然後tanh可以變成近似線性的樣子,線性堆砌也是線性的,所以過擬合會降下來。
    在這裏插入圖片描述

*編程作業3

最後gradient_check_n做得模模糊糊的,梳理一下
因爲theta(θ)不再是標量,所以用一個叫parameters的字典(dictionary)來存放,他的vector形態叫做values,然後這個theta是w和b的reshape(存放w和b的信息),字典和vector用 xxx_to_xxx 函數來轉化
這個是字典形式:print(parameters)
在這裏插入圖片描述
這個是vector形式:print(parameters_values)
在這裏插入圖片描述
代碼部分:首先parameters_values是把parameters從字典變爲vector,因爲有+有-,所以要np.copy備份一份values,然後這個values是個vector嘛,也就是個向量,行或列其中一個是一維的,所以thetaplus[i][0]就是個數字而已,這裏的一個theta表示的是一個w或者是b,然後step2,θ+ε,就是thetaplus[i][0]+=ε,然後J(θ+ε)就是把 thetaplus 傳過去,用print(vector_to_dictionary(thetaplus)) 可以對比字典形式的thetaplus和沒有plus的theta(就是變量parameters),可以發現只有W1的第一個變了,多了ε,就達到了我們的目的:得到θ+ε並且求出J(θ+ε),再重複一下,這裏θ其實是w或b,所以 i 要走num_parameters遍,把所有的數字都測一遍。
在這裏插入圖片描述
最後得出 gradapprox 然後跟神經網絡跑出來的 grad 做對比就知道有沒有寫錯。


Week 2

2.1 Mini-batch gradient descent

mini batch ,m=5,000,000,劃分5000個batch,那麼一個batch就是1000個x,設 t 爲第 t 個 batch ,比如 x{1} 就是第一個batch,就是 x(1) 到 x(1000)
在這裏插入圖片描述
mini-batch的算法:
用mini-batch梯度下降法遍歷一次訓練集(m=5,000,000),因爲被分割成5000個小的batch,所以進行了5000次梯度下降,如果是普通的,即batch梯度下降法,遍歷一次訓練集(m=5,000,000),那麼只能做一個梯度下降。

然後要注意one iteration和one epoch的區別,one iteration就是t,one epoch就是這裏的5000個iteration,mini和不mini一個iteration的數據量是不同的,但是一個epoch是相同的,也是餵了m個數據。

其實就是把訓練集拆分出來了而已,更好地利用數據,數學遊戲。
在這裏插入圖片描述

2.2 Understanding mini-batch gradient descent

mini和不mini的cost下降圖片的區別
在這裏插入圖片描述
隨機梯度下降和mini-batch和batch的對比,紫線綠線和藍線
在這裏插入圖片描述
還有個問題是mini-batch的size,推薦是2的次冪,一般是64~512,1024也行,需要多次嘗試找到更好的
在這裏插入圖片描述

2.3 Exponentially weighted averages

介紹指數加權(移動)平均值。
計算365天的溫度。v就是溫度的局部平均值/移動平均值,然後計算公式如下:
在這裏插入圖片描述
根據 β 的不同,右邊就是 1/(1-β) days 就是vt相當於這些days的平均,看得出來β越小,平均天數就越小,就是黃色那條,β越大,0.98那條,就是50days,就是綠色那一條,因爲參平均的days太多,所以會出現一定延遲,0.9就是紅色那條,剛剛好。
在這裏插入圖片描述

2.4 Understanding exponentially weighted averages

理解這個指數加權平均的意義,就把v100展開,然後看到在0.9^10的時候只佔0.35,相當於 1/e ,相當於v100的大部分數值由前10天組成,然後設 (1-epsilon) = β,然後(1epsilon)1/epsilon=1e(1-epsilon)^{1/epsilon}=\frac{1}{e},然後當β=0.98的時候,相當於大概平均了 1/epsilon = 50 天的數據。這個東西只是個大概,來輔助理解的,不是真正的推導。
在這裏插入圖片描述
寫成代碼的形式只需要一個參就夠了,所以很節約空間而且就一行代碼。
在這裏插入圖片描述

2.5 Bias correction in exponentially weighted averages

偏差修正,可以讓平均數運算更準確。
β = 0.98 的時候正常應該是綠線,但是實際是得到的是紫線。
在這裏插入圖片描述
可以看出估算初期處理得不是很好,因爲 v0 = 0,v1 = 0.98v0 + 0.02θ1 = 0.02θ1,v2=0.0196θ1+0.02θ2,差距比較大。
在這裏插入圖片描述
因此我們選擇除以一個係數,來修正偏差,當t比較大時,分母幾乎爲1,說明後面就不太需要修正了。 偏差修正可以幫你儘早做出更好的估計,不過一般不會這麼做。看看下一節就知道了
在這裏插入圖片描述

2.6 Gradient descent with momentum

momentum,動量梯度下降法,就是用到2.3、2.4裏面的公式,具體如下。
比如圖中要到達紅色點,沒有momentum的時候是藍色線,我們希望縱軸擺動的幅度減少,橫軸擺動的幅度增加,達到紅色線那種效果。加了momentum後,算法在前幾次取平均的時候,發現縱軸的均值近似於0,因此縱軸的動量就會很小,而橫軸方向上所有微分都指向橫軸方向,所以橫軸的均值很大,算法幾次迭代後,最終縱軸擺動變小,橫軸擺動增大,就成了紅色線。

還有一種解釋是像小球滾到碗裏面一樣,微分給了一個加速度,(1-β)db就是加速度,因爲β小於1,所以βVdb就是摩擦力(注意這個Vdb其實是Vd(b-1),因爲這裏只用了一個變量),所以球不會無限加速,原來的梯度下降則是獨立的,這裏球可以向下滾獲得動量。
在這裏插入圖片描述
習題補充:
β 的大小影響着加速度和摩擦力,我們可以從天數的角度來看
如果 β 比較大的話,就是平均的天數比較多(2.3節 相當於 1/(1-β)天),然後參考得多,曲線就比較平滑,而且反應變慢,像2.3節的綠線。
如果 β 比較小的話,就曲線會震盪多些,但還是沒有普通的梯度下降震盪得多,因爲momentum多多少少會參考之前的平均值,而普通的梯度下降則不會,是獨立的。
在這裏插入圖片描述

β通常爲0.9,很魯棒。然後上一節講的偏差修正通常不用。momentum還有另一種寫法,不過不太好。
在這裏插入圖片描述

2.7 RMSprop

介紹RMSprop,感覺和momentum差不多,這裏縱軸叫b,橫軸叫w,實際上比一定,只是爲了講課方便區分唯一。並且注意平方是(dw)的平方,db同理。

例子中W的方向上 我們希望學習速率較快 而在垂直方向上 即例子中b的方向上 我們希望降低垂直方向上的振盪 對於S_dW和S_db這兩項 我們希望S_dW相對較小 因此這裏除以的是一個較小的數 而S_db相對較大 因此這裏除以的是一個較大的數 這樣就可以減緩垂直方向上的更新 實際上 如果你看一下導數 就會發現垂直方向上的導數要比水平方向上的更大 所以在b方向上的斜率很大 對於這樣的導數 db很大 而dW相對較小 因爲函數在垂直方向 即b方向的斜率 要比w方向 也就是比水平方向更陡 所以 db的平方會相對較大 因此S_db會相對較大 相比之下dW會比較小 或者說dW的平方會較小 所以S_dW會較小 結果是 垂直方向上的更新量 會除以一個較大的數 這有助於減弱振盪 而水平方向上的更新量會除以一個較小的數 使用RMSprop的效果就是使你的更新 會更像這樣 在垂直方向上的振盪更小 而在水平方向可以一直走下去

大概就是說,原公式是沒有分母那個的,現在加了分母,除以一個數,這個數如果是針對w的,因爲w沒有b這麼陡,所以dw就比db相對小,然後分母相對小的話,整個就會增大,就是讓w變得更快。b同理,因爲比w要陡,所以db相對較大,我們把它擺在分母上就希望減弱它的震盪。

最後爲了分母不爲0,會加上一個很小的epsilon,常取爲1e-8.
在這裏插入圖片描述

2.8 Adam optimization algorithm

很多優化算法都不能適用於不同的神經網絡,這裏介紹的Adam、RMSprop和momentum都能適用於不同的神經網絡。
Adam優化算法:結合RMSprop和momentum
momentum用β_1,RMSProp用β_2
用Adam的時候要用修正偏差
接的分母要加上epsilon
在這裏插入圖片描述
超參數 α 需要經常被調整(tune),來去看看哪個更好。然後β1和β2一般很少調整。下面是建議的取值。最後是Adam的含義

Adam代表自適應矩估計(Adaptive Moment Estimation) β1代表這個導數的平均值 被稱爲第一階的矩 β2被用於計算平方數的 指數加權平均 也被稱爲第二階矩 以上就是Adam這個命名的由來

在這裏插入圖片描述

2.9 Learning rate decay

衰減率學習公式:
衰減率decay_rate 和 α0α_0 是另一需要調整的超參數
在這裏插入圖片描述
還有別的衰減率公式,t 是mini-batch的 t,還有手動控制 α 的
在這裏插入圖片描述

如果你現在在想 哇 這有那麼多的超參數 那我該如何在這麼多不同的選項當中做出選擇? 我想說 現在不用擔心這個 下週 我們將對系統性地選擇超參數 進行更多討論 對我來說 學習率衰減通常位於 我嘗試的事情中比較靠後的位置 設置一個固定數值的阿爾法 還要使它優化得良好 對結果是會有巨大的影響的 學習率衰減的確是有幫助的 有時它可以真正幫助加速訓練 但是它還是在我嘗試的辦法中比較靠後的一頂 但下個星期 我們談到超參數優化時 你會看到更多系統性來地安排所有的超參數的方式 以及如何有效地在當中搜索 那這些就是學習率衰減的內容

2.10 The problem of local optima

不必害怕神經網絡走到糟糕的局部最優點,因爲在高緯度、很多參數、較大的神經網絡上,更有可能走到鞍點。怕走到最差的局部最優點是因爲比較熟悉低緯的圖形,但現在大都是高緯度的。我們更多面臨的問題是在鞍點上如何更快地走到局部最優點,用Adam等。
在這裏插入圖片描述
在這裏插入圖片描述

編程作業

在這裏插入圖片描述
momentum 注意事項:
在這裏插入圖片描述
注意Adam是要bias correction的,偏差修正的。
在這裏插入圖片描述
最後是用的mini-batch來做,呃,數據的投喂,然後可以去看一下代碼。
然後比較了3中update parameters,更新參數(w和b)的方法,有普通的梯度下降(gd),momentum 和 Adam
在這裏插入圖片描述
最後比較了他們的準確率,沒想到Adam比momentum好這麼多,而momentum 卻和普通的梯度下降(gd)差不多,看來還是 Adam 好啊。

然後momentum這裏不起作用是因爲數據比較少(mini-batch),所以效果不明顯,不過如果投喂多次epochs的話,三個模型也會表現得很好,不過 Adam 還是會收斂得快很多,綜上 Adam 最好。
在這裏插入圖片描述

Week 3

(最後一週!!!)

3.1 Tuning process

如何選擇各種超參數
下面ng覺得α最重要,刺激是紫框和黃框,然後沒框住那些基本不動,當然也可以有別的想法。
在這裏插入圖片描述
研究早期,比如只有2個超參數,要選25個,就會以網格的形式選,其實這樣的話,對於超參數1,其實就選了5個不同的點,超參數2也是。但如果是隨機取25個點的話,超參數1和超參數2就有25個不同的數值。
在這裏插入圖片描述
然後選了25個之後,我們會發現一個地區的點表現得比較好,於是縮小範圍在那個地區繼續隨機選點,這樣就從粗到細地搜索。
在這裏插入圖片描述

3.2 Using an appropriate scale to pick hyperparameters

爲超參數選擇合適的範圍。隨機的時候要注意約束隨機的範圍。
在這裏插入圖片描述
然後隨機的範圍很大的話,會造成隨機的資源不平均。比如 α 取值爲 [0.0001,1],很大概率隨機出來的數是 [0.1,1],這樣會有偏差。然後我們需要把這個數軸平均分配,按照0.001、0.001、0.01、0.1、1分配,然後在每個段中平均取點,這樣會更平均。

做法是先設定左邊爲 10a10^a,右邊爲 10b10^b,那麼設置一個 r 隨機的是 [a,b]。然後 α 的取值就是 10r10^r。這裏因爲是每10倍劃分一次,所以是涉及到了對數 log 的運算 / 思想。
在這裏插入圖片描述

3.3 Hyperparameters tuning in practice: Pandas vs. Caviar

超參數調試實踐:熊貓照料法 vs. 魚子放養法
首先我們建議在一段時間內要重新評估一下超參數,看要不要調整,因爲一些數據等因素會變。
在這裏插入圖片描述
有兩種調整超參數的方式:熊貓照料法 和 魚子放養法。
一個是左圖,每一天根據現有情況來調整超參數,就像熊貓孩子很少,照看一個,不過熊貓一生也可以有幾個孩子,因此在兩三週後可以建立一個新的模型(孩子),來繼續照看。
另一個是右圖,在同一天用不同的超參數選擇方案,然後一起開始跑數據,跑到一定天數後看哪個方案更好。

自己擁有的計算資源決定了用哪種方式調整超參數,如果有足夠的計算機去平行試驗許多模型,那麼絕對是魚子放養法更好

但是在某些應用領域 例如在線廣告設置 以及計算機視覺識別 都有海量的數據和大量的模型需要去訓練 而同時訓練大量模型是極其困難的事情 看到很多研究小組更喜歡使用熊貓模式 這實際上是由行業性質所決定的
在這裏插入圖片描述

3.4 Normalizing activations in a network

Batch Norm:Batch歸一化
在之前logistic迴歸中用到了歸一化輸入同樣的,歸一化可以用在神經網絡中。歸一化有的歸的是a,有的歸的是z,實踐中通常歸的是z。
在這裏插入圖片描述
公式如下,這裏 γ 和 β 可以是 If 下面那些式子(由Znorm得來),也可以自己調整,比如不想均值爲0,方差爲1,不想值在sigmoid函數中總是在線性部分,也想讓他們在非線性部分,這時候就需要調整。
在這裏插入圖片描述

3.5 Fitting Batch Norm into a neural network

Batch Norm 在神經網絡的具體流程:
要注意的是 Batch Norm 的 β 和 Adam、momentum 的 β 不同,但是論文裏面都用了 β 這裏方便看論文。
然後 Batch Norm 接下來的 update parameters 也可以用 Adam 等,也可配合 mini-batch 使用
在這裏插入圖片描述
注意,如果用 Batch Norm,可以消掉 b,或者變爲0。因爲歸一化是滿足均值爲0,方差爲1,然後通過參數 β 和 γ 來重新調整,所以z中的bl可以消去,由z~中的β來調整偏移量。

because Batch Norm zeroes out the mean of these ZL values in the layer, there’s no point having this parameter blb^l

最後注意一下維度是多少。
在這裏插入圖片描述
mini-batch + Batch Norm (+Adam等參數更新優化)神經網絡的總體流程:
在這裏插入圖片描述

3.6 Why does Batch Norm work?

再講講爲什麼 BN 有用(也許可以看看論文?畢竟我有)
有點懶得解釋了,看看標題鏈接的視頻和論文吧
本節網易雲課堂鏈接

3.7 Batch Norm at test time

在測試的時候,因爲這裏是mini-batch,然後對所有的batch得出μ和σ,然後得出z~,當然也有別的方法得出 γ 和 β
在這裏插入圖片描述

3.8 Softmax Regression

Softmax 用於多分類
思路就是看哪個點佔所有點總概率之和最高,就是那個答案
在這裏插入圖片描述
在這裏插入圖片描述

3.9 Training a softmax classifier

下面是實現的細節:
在這裏插入圖片描述
注意有一些框架,只要給出 forward propagation,就會給出 bp,然後 softmax 的 dzldz^l 如下
在這裏插入圖片描述

3.10 Deep learning frameworks

推薦的深度學習框架和選擇框架時候要注意的點,有個點是:是否真正開源,有的開源框架過幾年後公司不開源了,或者將一些功能移入私有的雲服務中

有一個我會提醒你注意的地方是 你多信任這個框架在很長一段時間 會保持開源 而不是被單一公司所掌控 因爲這樣 即使現在它是開源的 在以後可能會因各種原因所關閉

在這裏插入圖片描述

3.11 TensorFlow

講解了怎樣用TensorFlow來弄一些東東

首先TensorFlow可以幫你實現反向傳播,只要給他正向傳播的式子和 learning_rate,因爲在寫 cost 式子的時候,如果裏面有一個是tf.Variable,那麼那些±*/平方等,就會重載成tf.add()等,右上角有個計算圖,TF就是根據這個圖來求出反向傳播的導數。把 cost 和 learning_rate 賦值給 train,GradientDescentOptimizer這裏是普通的梯度下降,可以換成Adam等等,然後運行session.run就可以跑了。

然後 x = tf.placeholder(…) 是說可以暫時保留X的值,並且之後可以傳遞值進去,下面的代碼coefficients定義了個矩陣,feed_dict={x:coefficients}就是把coefficients的東西賦值給x,然後和train一起餵給session.run。這裏有個使用例子就是運行mini-batch的時候,可以更換coefficients,然後神經網絡的輸入 x 也可以隨之更換。

最後是 session = tf.Session() 及其下面兩句話,這兩句是用來定義訓練啥的,然後右邊的表達感覺更好,with在Python裏面更容易清理,以防在執行這個內循環時出現錯誤或例外(不大懂,還沒查with在Python裏面的作用)
在這裏插入圖片描述
作業中的詳細對比:
在這裏插入圖片描述
用法,用來輸出sigmoid,注意feed_dict={x:z}就是把z傳給x,用來更新x的值
在這裏插入圖片描述

測驗

在這裏插入圖片描述
No. You can run deep learning programming languages from any machine with a CPU or a GPU, either locally or on the cloud.
在這裏插入圖片描述

編程作業

TensorFlow注意的地方,要建造一個session並運行session裏面的操作纔會生效。
在這裏插入圖片描述
這裏有個 sess.close(),運行第一遍是6,在運行一次會報錯,然後上面的代碼sess=tf.Session()要再運行一遍才行,或者直接刪掉sess.close()
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章