2019年CS224N課程筆記-Lecture 4: Backpropagation and Computation Graphs

資源鏈接:https://www.bilibili.com/video/BV1r4411

正課內容

神經網絡的梯度

讓我們再看他一下s對w的求導

反向傳播中梯度的計算

(上圖的大概意思就是,考慮單個權重Wij的導數,Wij只對zi有貢獻,例如W23只對z2有貢獻,而對z1沒有貢獻)

對於單個Wij的導數來說,爲:

我們想要整個 W 的梯度,但是每種情況都是一樣的:

梯度求導需要注意的

  1. 小心的定義變量而且要始終關注它們的維度
  2. 使用鏈式法則進行計算
  3. 要清楚哪些變量用於哪些計算
  4. 對於模型最上面的softmax部分,首先考慮c=y時的梯度(正確的類別),然後考慮錯誤的類別(c!=y)
  5. 如果你被矩陣微積分搞糊塗了,算出元素偏導數!
  6. 使用形狀法則。注意:到達隱藏層的錯誤消息delta具有與該隱藏層相同的維度

窗口模型推導梯度

重新訓練詞向量時的一個陷阱

假設:使用單一的單詞爲電影評論情緒建立一個邏輯迴歸模型
在訓練數據中,有單詞TV和telly;在測試數據中,有單詞television;在預訓練中詞向量有三個相似的地方

當更新詞向量時會發生什麼呢?訓練時TV和telly的向量會一起移動,但是television是在測試數據中,沒有別訓練到,所以位置是保持不變的,如下圖:

這樣的分類結果是有錯的。所以我們應該採取一定的方法來解決這個問題--使用預訓練向量。

預訓練向量:接受了大量的數據訓練,所以他們會知道訓練數據中沒有的單詞,也會知道更多關於訓練數據中的單詞。

應該對我自己的詞向量進行微調嗎?

  • 如果數據集很小,不要訓練詞向量。
  • 如果數據集很大,可能會運行得更好train=update=fine-tune(微調)

反向傳播的一個小技巧:在計算較低層的導數時,我們重用對較高層計算的導數,以使計算最小化。

計算圖和反向傳播

我們將上述的神經網絡用等價的計算圖來表示

在其上進行前向傳播和反向傳播

每個節點都有局部的梯度:

  • 節點接收“上游梯度”
  • 目標是傳遞正確的“下游梯度”
  • 每個節點都有局部梯度
  • 它輸出的梯度是與它的輸入有關,也就是反向傳播是依賴正向傳播的

當有多個輸入時:

一個梯度計算的例子:

Back-Prop in General Computation Graph

這一部分,其實這一部分現在主流的框架都幫忙我們完成了,如果有興趣的小夥伴可以自行查閱,我沒太聽懂這部分也...

當模型有很多參數時,需要正則化

在實踐中,一個損失函數包含正則化項,正則化項包含所有參數。以下是添加的懲罰項爲L2正則化懲罰項

正則化在很大程度上可以防止過擬合

矢量化計算

矢量化計算往往比單獨計算更加快速或者說把數據放到向量裏進行計算可以提高計算速度(之前也提到過)

例如,對單詞向量進行循環,而不是將它們全部連接到一個大矩陣中,然後將softmax權值與該矩陣相乘(矢量化計算其實就是把單獨的向量連接成一個矩陣進行計算)

結果:

  • 1000 loops, best of 3: 639 μs per loop
  • 10000 loops, best of 3: 53.8 μs per loop

(10x)更快的方法是使用拼接的矢量化計算

總是嘗試使用向量和矩陣,而不是循環的對單個數據進行操作

自己測試測試就能發現~總的來說:矩陣太棒了

非線性化/激活函數

(常見的就是relu、tanh、sigmoid函數,不過本課程中介紹了一些其他形態)

參數初始化

  • 通常 必須將權重初始化爲小的隨機值 (這樣才能在激活函數的有效範圍內, 即存在梯度可以使其更新) 
  • 避免對稱性妨礙學習/特殊化的 
  • 初始化隱含層偏差爲0,如果權重爲0,則輸出(或重構)偏差爲最優值(例如,均值目標或均值目標的反s形)
  • 初始化 所有其他權重 爲Uniform(–r, r),選擇使數字既不會太大也不會太小的 r
  • Xavier初始化中,方差與 fan-in(前一層尺寸)和 fan-out (下一層尺寸)成反比:

優化器

簡單的SGD就可以了 ,然而,要得到好的結果通常需要手動調整學習速度
對於更復雜的網絡和情況,或者只是爲了避免擔心,更有經驗的複雜的 “自適應”優化器通常會令你做得更好,通過累積梯度縮放參數調整,如下優化器:

(想要詳細瞭解這些優化器,可以參考本鏈接內容https://trickygo.github.io/Dive-into-DL-TensorFlow2.0/#/chapter07_optimization/7.1_optimization-intro

學習率

第一個思考:你可以用一個固定的學習速度。從lr = 0.001開始? 

  1. 它必須是數量級的——嘗試10的冪
  2. 太大:模型可能會發散或不收斂
  3. 太小:你的模型可能訓練不出很好的效果

第二個思考:如果你在訓練時降低學習速度,通常可以獲得更好的效果 

  1. 手工:每隔K個階段(epoch)將學習速度減半 
  2. epoch = 遍歷一次數據 (打亂或採樣的)
  3. 通過一個公式: 
  4. 還有更新奇的方法,比如循環學習率(q.v.)

第三個思考:更高級的優化器仍然使用學習率,但它可能是優化器縮小的初始速度——因此可能可以從較高的速度開始

  1. 如上述優化算法有每個參數都擁有自己的可變的學習率的方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章