CS231N-Lecture6 Training Neural Network part-2

一、概述

這一集講了一些列不同的梯度下降算法,做了一些比較。

之後,講到了Dropout機制,隨機關閉一些neuron的訓練方式可以使整個模型更加有效。

然後講到了一點關於Model Ensemble的技巧。

最後,做了一個Convnet的引入,介紹了Convnet的歷史起源,以及後人的一些成就。

二、梯度下降算法

  1. SGD

    SGD(Stochastic Gradient Descent)就是之前一直在用的這種更新Weight的方式。如圖。

    現實當中,sgd是最慢的下降算法。先來看看問題所在。如圖。

    假設loss function映射成是一個垂直面上很深,但是水平面上很淺的地形。這樣說好抽象,就想象成一個V字形好了。現在我就在這個V字的左半坡上。假設我往下走一步的話,我在垂直方向上下降的距離,會大於我在水平方向上前進的距離。又因爲我因此,sgd會造成如下的問題,我在下降的過程中走很多的彎路,上下上下不斷調整。如下圖。

    而每次在水平方向上前進的距離越大,我就能越快到達那個笑臉,也就是loss最低點。sgd的前進路線浪費了很多時間。

  2. Momentum

    Momentum的方法,借用了物理中的加速度的概念。把整個loss function想象成一個碗,一個球從一側滑落,朝最底部的會有一個加速度和摩擦力的累加。因此,當這個球找到一個下降的方向時,速度就會累加,並越來越快。如圖。

    上圖中,learning_rate * dx就是標準的sgd,是一個下降的速度,mu * v就相當於摩擦力。因爲速度不能一直累加。如果一直累加,球根本停不下來,會over shot偏離目標。

    v就是要一直累加的下降加速度,用v去更新W

    mu通常設置成0.5 - 0.9之間的數值。

    v通常初始化成0

  3. Nesterov Momentum

    下圖是一個普通的momentum下降。

    gradient step就是learning_rate * dxmomentum step就是v;因此最終這次下降的值就是兩個向量和actual step

    nesterov momentum就是在momentum的基礎上,多想一步,在momentum step的盡頭,考慮下一步該怎麼走。如下圖。

    公式上唯一的區別就是在計算dx的時候要計算d(x + mu * vt-1)。因此要有一個變量保留一下上一次的速率。如下圖。

    替換成

    然後進行代數運算就可以得到最後的下降公式

    nag(Nesterov Accelerated Gradient)通常比momentum表現好一些。

  4. AdaGrad

    adagrad所做的就是將歷史的gradient平方都累加起來,然後在update的階段,按照比例來縮放一下。

    這樣做就好像我記錄下來之前所有走過的方向,然後綜合一下,往某一個方向走一步。從代碼看,我走的每一步距離都是在減小的。因此adagrad也有一個問題。

    在訓練大規模的神經網絡的時候,因爲cache是隨時間一直不斷增加的,因此總有一個時刻,gradient會是0。這時模型就停止學習了。

    爲了解決這個問題,Tieleman and Hinton提出了RMSProp

  5. RMSProp

    如上圖,爲了避免cache過大,引入了一個leaky機制,就像leaky relu那樣。這個decay_rate能保證cache不會一直增大,避免了模型停止學習的困境。

  6. Adam

    Adam的思想是將RMSpropmomentum結合起來。

    mmomentum的計算方式,vRMSProp的計算方式。
    然後在update的時候,將兩個變量代入到公式中。

    以上就是常用的梯度下降算法。目前爲止,表現最好的是Adam,可以嘗試使用在各種模型當中。

  7. 其他梯度下降算法

    上圖中的牛頓法,也能用於梯度下降的計算。牛頓法的還能在沒有learning_rate的情況下最小化loss

    大致的原理就是,我在下降的時候,如果有辦法知道這個loss function的最低點在哪,那麼我就能一步就到達這個最低點了。

    但是牛頓法貌似涉及整個黑賽矩陣的反轉,算法複雜度十分的高。雖然有BGFSL-BGFS做優化,但是在實踐中使用很罕見。

  8. 最佳實踐

    在實踐中,絕大多數情況下默認選擇Adam作爲梯度下降算法。

    如果內存等計算資源允許做全數據集的訓練(full batch updates),可以嘗試以下L-BGFS

    同時,可以利用Model Ensemble的原理。訓練多個獨立的模型,在測試階段,取所有模型分數的平均數。

    點擊這裏看一篇關於Model Ensemble的文章。

    同樣的,取一個模型的多個checkpoint的平均值,也能使訓練結果有所提升。

    最後,可以保留一份運行時的參數的平均值用於測試,往往結果比原有的參數好。操作如下圖。

    關於泰勒公式和牛頓法,繼續查資料學習體會一下,這裏還沒來得及深究。

三、Learning Rate的選擇

幾乎所有的梯度算法都用learning_ratehyperparameter。因此選擇一個好的learning_rate對於模型的訓練來說很重要。

上圖問,圖中最好的learning_rate是哪一個?

不要說是紅色的。這個問題視具體情況而定。

在選擇learning_rate時,一開始選擇一個高數值的lr。可以看到high learning rate的曲線可以使loss急速下降,但是之後就到達一個瓶頸。

然後,運用下圖的幾種方法之一,來不斷削減lr,再不斷進行訓練。

四、Dropout

Dropout指的是,在forward pass的過程當中,設置一個二進制的開關(就是隨機一個數字,然後和一個門檻做比較),以這樣的方式,隨機選擇一些neuron將其值設置爲0,也就是將其關閉或者說成丟棄dropout

實現方式如下。

  1. Dropout的好處

    做了Dropout之後,首先可以避免模型的overfitting,因爲每次dropout之後,模型的參數都變少了,參數越少,overfitting的可能性越低。

    其次,dropout能讓模型有冗餘的能力。這個是我翻譯的,比較抽象。存儲中有冗餘代表數據更加安全,神經網絡中有冗餘,應該代表着神經網絡的能力越強大。用下圖說明。

    上圖中,如果沒有dropout的時候,模型有所有的5個參數作爲判斷這張圖片是否是貓的依據,然後打分。如果使用了dropout,意味着有隨機的幾個參數會被丟棄(置爲0),這裏是有3個參數被丟棄了,那麼這個模型只能依賴2個參數來判斷這張圖片是否是貓。

    如果模型能夠在這樣的參數很少的苛刻的情況下訓練,並且做出正確的判斷。那麼這個模型在測試的時候的能力,肯定是高於沒有dropout的模型的。

    另外,使用dropout就是在使用model ensemble。每一次dropout,就訓練了一個sub neural network,這些子神經網絡都共享着一份參數W。如下圖。

  2. 測試階段

    在測試階段的時候,最好能夠整合所有的噪音(這點沒有懂誒,什麼是噪音…),在隨機dropout掉一些neuron之後多次進行forward pass,最後求出所有預測的平均值。

    也可以不使用dropout了,直接全開neuron,然後只做一次forward pass,然後求所有預測的平均值。如下圖。

  3. Dropout注意事項

    如上圖,假設這個三個節點的模型設置了有%50neuron會被dropout,那麼在訓練階段有dropout的一個輸出x,和測試階段沒有dropout的輸出x會是什麼關係?

    答案是,測試階段的x會是訓練階段x的兩倍左右。如下圖。

    代碼實現如下,可以在測試(predict)的時候,將兩個參數H1H2減半,才能得到和訓練階段一樣的輸出。

    可以像上圖一樣,在訓練階段dropout,在測試階段做scale,將輸出減半。

    更加常用的是invert dropout,如下圖。

    在訓練階段將輸出除以dropout的概率,測試階段保持不變。

五、Convolutional Neural Network

  1. 歷史

    convnet起源於1959年,Hubel & Wiesel這兩人在研究貓的大腦神經對特定圖像的反應。

    點這裏看這個實驗的油管視頻~

    他們發現貓的大腦對圖像在特定朝向上,神經元會被激活。

    基於此他們建立了視覺區域中的位置和大腦皮質上的神經元是有地形上的映射的理論。

    又基於這個理論,他們創建了視覺神經成像的層級關係。

    成像,是從簡單到複雜逐級深入的。

  2. 前期工作

    convnet最早期的工作,是Fukushima於1980年做出的。他的工作建立在Hubel & Wiesel的理論之上。

    他建立一個稱爲Neurocognitron的神經網絡,當時還沒有backprop的技術,只有forward pass

    直到1998年的時候,LeCun, Bottou, Bengio, Haffner開始了帶有backpropconvnet

    2012年的時候,Alex Krizhevsky, Sutskever, Hinton,創建了Deep
    Convolutional Neural Networks

    Alexnet與前人的不同在於,擁有了更大的數據集,並且使用了GPU計算,但是在網絡架構方面,沒有太大的差別。

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