1. bp神經網路用啥演算法
自己找個例子算一下,推導一下,這個回答起來比較復雜
神經網路對模型的表達能力依賴於優化演算法,優化是一個不斷計算梯度並調整可學習參數的過程,Fluid中的優化演算法可參考優化器。
在網路的訓練過程中,梯度計算分為兩個步驟:前向計算與反向傳播。
前向計算會根據您搭建的網路結構,將輸入單元的狀態傳遞到輸出單元。
反向傳播藉助鏈式法則,計算兩個或兩個以上復合函數的導數,將輸出單元的梯度反向傳播回輸入單元,根據計算出的梯度,調整網路的可學習參數。
BP演算法
隱層的引入使網路具有很大的潛力。但正像Minskey和Papert當時所指出的.雖然對所有那些能用簡單(無隱層)網結解決的問題有非常簡單的學習規則,即簡單感知器的收斂程序(主要歸功於Widrow和HMf於1960年提出的Delta規剛),
BP演算法
但當時並沒有找到同樣有技的含隱層的同培的學習規則。對此問題的研究有三個基本的結果。一種是使用簡單無監督學習規則的競爭學習方法.但它缺乏外部信息.難以確定適台映射的隱層結構。第二條途徑是假設一十內部(隱層)的表示方法,這在一些先約條件下是台理的。另一種方法是利用統計手段設計一個學習過程使之能有技地實現適當的內部表示法,Hinton等人(1984年)提出的Bolzmann機是這種方法的典型例子.它要求網路在兩個不同的狀態下達到平衡,並且只局限於對稱網路。Barto和他的同事(1985年)提出了另一條利用統計手段的學習方法。但迄今為止最有教和最實用的方瑤是Rumelhart、Hinton和Williams(1986年)提出的一般Delta法則,即反向傳播(BP)演算法。Parter(1985年)也獨立地得出過相似的演算法,他稱之為學習邏輯。此外, Lecun(1985年)也研究出大致相似的學習法則。
2. 常用優化器演算法歸納介紹
優化器是神經網路訓練過程中,進行梯度下降以尋找最優解的優化方法。不同方法通過不同方式(如附加動量項,學習率自適應變化等)側重於解決不同的問題,但最終大都是為了加快訓練速度。
這里就介紹幾種常見的優化器,包括其原理、數學公式、核心思想及其性能;
核心思想: 即針對每次輸入的訓練數據,計算輸出預測與真值的Loss的梯度;
從表達式來看,網路中參數的更新,是不斷向著最小化Loss函數的方向移動的:
優點:
簡單易懂,即對於相應的最優解(這里認為是Loss的最小函數),每次變數更新都是沿著局部梯度下降最快的方向,從而最小化損失函數。
缺點:
不同於標准梯度下降法(Gradient Descent)一次計算所有數據樣本的Loss並計算相應的梯度,批量梯度下降法(BGD, Batch Gradient Descent)每次只取一個小批次的數據及其真實標簽進行訓練,稱這個批次為mini-batch;
優點:
缺點:
隨機梯度下降法的 batch size 選擇不當可能導致模型難以收斂;由於這種方法是在一次更新中,就對整個數據集計算梯度,所以計算起來非常慢,遇到很大量的數據集也會非常棘手,而且不能投入新數據實時更新模型。
我們會事先定義一個迭代次數 epoch,首先計算梯度向量 params_grad,然後沿著梯度的方向更新參數 params,learning rate 決定了我們每一步邁多大。
Batch gradient descent 對於凸函數可以收斂到全局極小值,對於非凸函數可以收斂到局部極小值。
和 BGD 的一次用所有數據計算梯度相比,SGD 每次更新時對每個樣本進行梯度更新,對於很大的數據集來說,可能會有相似的樣本,這樣 BGD 在計算梯度時會出現冗餘,而 SGD 一次只進行一次更新,就沒有冗餘,而且比較快,並且可以新增樣本。
即訓練時,每次只從一批訓練樣本中隨機選取一個樣本進行梯度下降;對隨機梯度下降來說,只需要一次關注一個訓練樣本,一點點把參數朝著全局最小值的方向進行修改了。
整體數據集是個循環,其中對每個樣本進行一次參數更新
缺點:
梯度下降速度比較慢,而且每次梯度更新時往往只專注與局部最優點,而不會恰好指向全局最優點;
單樣本梯度更新時會引入許多雜訊(跟訓練目標無關的特徵也會被歸為該樣本分類的特徵);
SGD 因為更新比較頻繁,會造成 cost function 有嚴重的震盪。
BGD 可以收斂到局部極小值,當然 SGD 的震盪可能會跳到更好的局部極小值處。
當我們稍微減小 learning rate,SGD 和 BGD 的收斂性是一樣的。
優點:
當處理大量數據時,比如SSD或者faster-rcnn等目標檢測模型,每個樣本都有大量候選框參與訓練,這時使用隨機梯度下降法能夠加快梯度的計算。
隨機梯度下降是通過每個樣本來迭代更新一次,如果樣本量很大的情況,那麼可能只用其中部分的樣本,就已經將 迭代到最優解了,對比上面的批量梯度下降,迭代一次需要用到十幾萬訓練樣本,一次迭代不可能最優,如果迭代10次的話就需要遍歷訓練樣本10次。缺點是SGD的噪音較BGD要多,使得SGD並不是每次迭代都向著整體最優化方向。所以雖然訓練速度快,但是准確度下降,並不是全局最優。雖然包含一定的隨機性,但是從期望上來看,它是等於正確的導數的。
梯度更新規則:
MBGD 每一次利用一小批樣本,即 n 個樣本進行計算,這樣它可以降低參數更新時的方差,收斂更穩定,另一方面可以充分地利用深度學習庫中高度優化的矩陣操作來進行更有效的梯度計算。
和 SGD 的區別是每一次循環不是作用於每個樣本,而是具有 n 個樣本的批次。
超參數設定值: n 一般取值在 50~256
缺點:(兩大缺點)
鞍點就是:一個光滑函數的鞍點鄰域的曲線,曲面,或超曲面,都位於這點的切線的不同邊。例如這個二維圖形,像個馬鞍:在x-軸方嚮往上曲,在y-軸方嚮往下曲,鞍點就是(0,0)。
為了應對上面的兩點挑戰就有了下面這些演算法
核心思想:
不使用動量優化時,每次訓練的梯度下降方向,都是按照當前批次訓練數據計算的,可能並不能代表整個數據集,並且會有許多雜訊,下降曲線波動較大:
添加動量項之後,能夠有效減小波動,從而加快訓練速度:
當我們將一個小球從山上滾下來時,沒有阻力的話,它的動量會越來越大,但是如果遇到了阻力,速度就會變小。
加入的這一項,可以使得梯度方向不變的維度上速度變快,梯度方向有所改變的維度上的更新速度變慢,這樣就可以加快收斂並減小震盪。
優點:
通過動量更新,參數向量會在有持續梯度的方向上增加速度;
使梯度下降時的折返情況減輕,從而加快訓練速度;
缺點:
如果數據集分類復雜,會導致 和 時刻梯度 向量方向相差較大;在進行向量求和時,得到的 會非常小,反而使訓練速度大大下降甚至模型難以收斂。
這種情況相當於小球從山上滾下來時是在盲目地沿著坡滾,如果它能具備一些先知,例如快要上坡時,就知道需要減速了的話,適應性會更好。
目前為止,我們可以做到,在更新梯度時順應 loss function 的梯度來調整速度,並且對 SGD 進行加速。
核心思想:
自適應學習率優化演算法針對於機器學習模型的學習率,採用不同的策略來調整訓練過程中的學習率,從而大大提高訓練速度。
這個演算法就可以對低頻的參數做較大的更新,對高頻的做較小的更新,也因此,對於稀疏的數據它的表現很好,很好地提高了 SGD 的魯棒性,例如識別 Youtube 視頻裡面的貓,訓練 GloVe word embeddings,因為它們都是需要在低頻的特徵上有更大的更新。
Adagrad 的優點是減少了學習率的手動調節
式中, 表示第 個分類, 表示第 迭代同時也表示分類 累計出現的次數。 表示初始的學習率取值(一般為0.01)
AdaGrad的核心思想: 縮放每個參數反比於其所有梯度歷史平均值總和的平方根。具有代價函數最大梯度的參數相應地有較大的學習率,而具有小梯度的參數又較小的學習率。
缺點:
它的缺點是分母會不斷積累,這樣學習率就會收縮並最終會變得非常小。
這個演算法是對 Adagrad 的改進,
和 Adagrad 相比,就是分母的 換成了過去的梯度平方的衰減平均值,指數衰減平均值
這個分母相當於梯度的均方根 root mean squared (RMS),在數據統計分析中,將所有值平方求和,求其均值,再開平方,就得到均方根值 ,所以可以用 RMS 簡寫:
其中 的計算公式如下, 時刻的依賴於前一時刻的平均和當前的梯度:
梯度更新規則:
此外,還將學習率 換成了 RMS[Δθ],這樣的話,我們甚至都不需要提前設定學習率了:
超參數設定值: 一般設定為 0.9
RMSprop 是 Geoff Hinton 提出的一種自適應學習率方法。
RMSprop 和 Adadelta 都是為了解決 Adagrad 學習率急劇下降問題的,
梯度更新規則:
RMSprop 與 Adadelta 的第一種形式相同:(使用的是指數加權平均,旨在消除梯度下降中的擺動,與Momentum的效果一樣,某一維度的導數比較大,則指數加權平均就大,某一維度的導數比較小,則其指數加權平均就小,這樣就保證了各維度導數都在一個量級,進而減少了擺動。允許使用一個更大的學習率η)
超參數設定值:
Hinton 建議設定 為 0.9, 學習率 為 0.001。
這個演算法是另一種計算每個參數的自適應學習率的方法。相當於 RMSprop + Momentum
除了像 Adadelta 和 RMSprop 一樣存儲了過去梯度的平方 vt 的指數衰減平均值 ,也像 momentum 一樣保持了過去梯度 mt 的指數衰減平均值:
如果 和 被初始化為 0 向量,那它們就會向 0 偏置,所以做了偏差校正,通過計算偏差校正後的 和 來抵消這些偏差:
梯度更新規則:
超參數設定值:
建議
示例一
示例二
示例三
上面情況都可以看出,Adagrad, Adadelta, RMSprop 幾乎很快就找到了正確的方向並前進,收斂速度也相當快,而其它方法要麼很慢,要麼走了很多彎路才找到。
由圖可知自適應學習率方法即 Adagrad, Adadelta, RMSprop, Adam 在這種情景下會更合適而且收斂性更好。
如果數據是稀疏的,就用自適用方法,即 Adagrad, Adadelta, RMSprop, Adam。
RMSprop, Adadelta, Adam 在很多情況下的效果是相似的。
Adam 就是在 RMSprop 的基礎上加了 bias-correction 和 momentum,
隨著梯度變的稀疏,Adam 比 RMSprop 效果會好。
整體來講,Adam 是最好的選擇。
很多論文里都會用 SGD,沒有 momentum 等。SGD 雖然能達到極小值,但是比其它演算法用的時間長,而且可能會被困在鞍點。
如果需要更快的收斂,或者是訓練更深更復雜的神經網路,需要用一種自適應的演算法。
各種優化器Optimizer原理:從SGD到AdamOptimizer
深度學習——優化器演算法Optimizer詳解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)
3. 非線性建模-神經網路
納彎派 這學期選修了Python與演算法基礎,利用Python語言編寫力圖實現高效演算法。前期接觸了線性建模中的單變數及多元變數回歸模型、多項式回歸和灰度模型等。目前正在解決非線性建模問題,引入了神經網路的概念,這里作為自我梳理。
首先該網路有三層:輸入層、隱含層和輸出層。輸入層進行變數與優化權重的加權計算,每個節點輸出z=Σxiwij,此時我們把多個變數鬧敗(x),變為了單個變數(z)。隱含層完成「非線性的實現」,節點值ho=1/((1+e^(-z))),此處使用了生長函數。當我們調節wij(優化權重),使模型收斂,就能解決該非線性問題。
接著我們建立MLPClassifier神經網路模型。以下辨明多個參數。
hidden_layer_sizes :用元組,一個數字代表一個隱含層的節點。如hidden_layer_sizes=(50,50) 兩個隱含層,每層50個節點hidden_layer_sizes=(60,) 一個隱含層,60個節點,其中逗號不能省略
activation :激活函數, 對Σxiwij的函數轉換。
{'identity','logistic', 'tanh'洞賀, 'relu'}, 默認relu
•identity:f(x)= x
•logistic:其實就是sigmod,f(x) = 1 / (1 + exp(-x)).
•tanh:f(x) = tanh(x).
•relu:f(x) = max(0, x)
solver : {'bfgs', 'sgd', 'adam'}, 默認adam,用來優化權重
lbfgs:quasi-Newton(擬牛頓法)方法的優化器
sgd:隨機梯度下降
adam: Kingma, Diederik, and Jimmy Ba提出的基於隨機梯度的優化器
注意:默認solver 'adam',在相對較大的數據集上效果比較好(幾千個樣本或者更多),對小數據集來說,lbfgs收斂更快效果也更好。
learning_rate :學習率,用於權重更新,只有當solver為』sgd』時使用,{'constant','invscaling', 'adaptive'},默認constant
•constant: 由learning_rate_init給定的恆定學習率
•invscaling:隨著時間t使用power_t的逆標度指數不斷降低學習率learning_rate_ ,effective_learning_rate = learning_rate_init / pow(t, power_t)
•adaptive:只要訓練損耗在下降,就保持學習率為learning_rate_init不變,當連續兩次不能降低訓練損耗或驗證分數停止升高至少tol時,將當前學習率除以5。
4. 優化演算法
SGD演算法中的一個關鍵參數是學習率。之前,我們介紹的SGD使用固定的學習率。在實踐中,有必要隨著時間的推移逐漸降低學習率,因此我們將第 k 步迭代的學習率記作 ϵ k 。
這是因為SGD中梯度估計引入的雜訊源(m 個訓練樣本的隨機采樣)並不會在極小點處消失。相比之下,當我們使用批量梯度下降到達極小點時,整個代價函數的真實梯度會變得很小,之後為 0,因此批量梯度下降可以使用固定的學習率。保證SGD收斂的一個充分條件是
若 ϵ 0 太大,學習曲線將會劇烈振盪,代價函數值通常會明顯增加。溫和的振盪是良好的,容易在訓練隨機代價函數(例如使用Dropout的代價函數)時出現。如果學習率太小,那麼學習過程會很緩慢。如果初始學習率太低,那麼學習可能會卡在一個相當高的代價值。通常,就總訓練時間和最終代價值而言,最優初始學習率會高於大約迭代 100 次左右後達到最佳效果的學習率。因此,通常最好是檢測最早的幾輪迭代,選擇一個比在效果上表現最佳的學習率更大的學習率,但又不能太大導致嚴重的震盪。
雖然隨機梯度下降仍然是非常受歡迎的優化方法,但其學習過程有時會很慢。動量方法 (Polyak, 1964) 旨在加速學習,特別是處理高曲率、小但一致的梯度,或是帶雜訊的梯度。動量演算法積累了之前梯度指數級衰減的移動平均,並且繼續沿該方向移動。動量的效果如圖8.5所示
受 Nesterov 加速梯度演算法 (Nesterov, 1983, 2004) 啟發,提出了動量演算法的一個變種。這種情況的更新規則如下:
其中參數 α 和 ϵ 發揮了和標准動量方法中類似的作用。Nesterov 動量和標准動量之間的區別體現在梯度計算上。Nesterov 動量中,梯度計算在施加當前速度之後。因此,Nesterov 動量可以解釋為往標准動量方法中添加了一個校正因子。完整的Nesterov動量演算法如演算法3.2所示
初始點能夠決定演算法是否收斂,有些初始點十分不穩定,使得該演算法會遭遇數值困難,並完全失敗。當學習收斂時,初始點可以決定學習收斂得多快,以及是否收斂到一個代價高或低的點。此外,差不多代價的點可以具有區別極大的泛化誤差,初始點也可以影響泛化。
也許完全確知的唯一特性是初始參數需要在不同單元間 『『破壞對稱性』』。如果具有相同激活函數的兩個隱藏單元連接到相同的輸入,那麼這些單元必須具有不同的初始參數。如果它們具有相同的初始參數,然後應用到確定性損失和模型的確定性學習演算法將一直以相同的方式更新這兩個單元。即使模型或訓練演算法能夠使用隨機性為不同的單元計算不同的更新(例如使用Dropout的訓練),通常來說,最好還是初始化每個單元使其和其他單元計算不同的函數。這或許有助於確保沒有輸入模式
丟失在前向傳播的零空間中,沒有梯度模式丟失在反向傳播的零空間中。每個單元計算不同函數的目標促使了參數的隨機初始化。我們可以明確地搜索一大組彼此互不相同的基函數,但這經常會導致明顯的計算代價。例如,如果我們有和輸出一樣多的輸入,我們可以使用 Gram-Schmidt 正交化於初始的權重矩陣,保證每個單元計算彼此非常不同的函數。在高維空間上使用高熵分布來隨機初始化,計算代價小並且不太可能分配單元計算彼此相同的函數。
通常情況下,我們可以為每個單元的偏置設置啟發式挑選的常數,僅隨機初始化權重。額外的參數(例如用於編碼預測條件方差的參數)通常和偏置一樣設置為啟發式選擇的常數。
我們幾乎總是初始化模型的權重為高斯或均勻分布中隨機抽取的值。高斯或均勻分布的選擇似乎不會有很大的差別,但也沒有被詳盡地研究。然而,初始分布的大小確實對優化過程的結果和網路泛化能力都有很大的影響。
更大的初始權重具有更強的破壞對稱性的作用,有助於避免冗餘的單元。它們也有助於避免在每層線性成分的前向或反向傳播中丟失信號——矩陣中更大的值在矩陣乘法中有更大的輸出。如果初始權重太大,那麼會在前向傳播或反向傳播中產生爆炸的值。在循環網路中,很大的權重也可能導致混沌(chaos)(對於輸入中很小的擾動非常敏感,導致確定性前向傳播過程表現隨機)。在一定程度上,梯度爆炸問題可以通過梯度截斷來緩解(執行梯度下降步驟之前設置梯度的閾值)。較大的權
重也會產生使得激活函數飽和的值,導致飽和單元的梯度完全丟失。這些競爭因素決定了權重的理想初始大小。
也有助於避免在每層線性成分的前向或反向傳播中丟失信號——矩陣中更大的值在矩陣乘法中有更大的輸出。如果初始權重太大,那麼會在前向傳播或反向傳播中產生爆炸的值。在循環網路中,很大的權重也可能導致混沌(chaos)(對於輸入中很小的擾動非常敏感,導致確定性前向傳播過程表現隨機)。在一定程度上,梯度爆炸問題可以通過梯度截斷來緩解(執行梯度下降步驟之前設置梯度的閾值)。較大的權重也會產生使得激活函數飽和的值,導致飽和單元的梯度完全丟失。這些競爭因素決定了權重的理想初始大小。
有些啟發式方法可用於選擇權重的初始大小。一種初始化 m 個輸入和 n 輸出的全連接層的權重的啟發式方法是從分布 U(−1/√ m ,
1/√ m ) 中采樣權重,而 Glorot and Bengio 建議使用標准初始化
後一種啟發式方法初始化所有的層,折衷於使其具有相同激活方差和使其具有相同梯度方差之間。這假設網路是不含非線性的鏈式矩陣乘法,據此推導得出。現實的神經網路顯然會違反這個假設,但很多設計於線性模型的策略在其非線性對應中的效果也不錯。
數值范圍准則的一個缺點是,設置所有的初始權重具有相同的標准差,例如1/√ m ,會使得層很大時每個單一權重會變得極其小。Martens (2010) 提出了一種被稱為稀疏初始化(sparse initialization)的替代方案,每個單元初始化為恰好有 k 個非零權重。這個想法保持該單元輸入的總數量獨立於輸入數目 m,而不使單一權重元素的大小隨 m 縮小。稀疏初始化有助於實現單元之間在初始化時更具多樣性。但是,獲得較大取值的權重也同時被加了很強的先驗。因為梯度下降需要很長時間縮小 『『不正確』』 的大值,這個初始化方案可能會導致某些單元出問題,例如maxout單元有幾個過濾器,互相之間必須仔細調整。
Delta-bar-delta 演算法 (Jacobs, 1988) 是一個早期的在訓練時適應模型參數各自學習率的啟發式方法。該方法基於一個很簡單的想法,如果損失對於某個給定模型參數的偏導保持相同的符號,那麼學習率應該增加。如果對於該參數的偏導變化了符號,那麼學習率應減小。當然,這種方法只能應用於全批量優化中。
AdaGrad 演算法,如演算法8.4所示,獨立地適應所有模型參數的學習率,縮放每個參數反比於其所有梯度歷史平方值總和的平方根 (Duchi et al., 2011)。具有損失最大偏導的參數相應地有一個快速下降的學習率,而具有小偏導的參數在學習率上有相對較小的下降。凈效果是在參數空間中更為平緩的傾斜方向會取得更大的進步。
在凸優化背景中,AdaGrad 演算法具有一些令人滿意的理論性質。然而,經驗上已經發現,對於訓練深度神經網路模型而言,從訓練開始時積累梯度平方會導致有效學習率過早和過量的減小。AdaGrad在某些深度學習模型上效果不錯,但不是全部。
RMSProp 演算法 (Hinton, 2012) 修改 AdaGrad 以在非凸設定下效果更好,改變梯度積累為指數加權的移動平均。AdaGrad旨在應用於凸問題時快速收斂。當應用於非凸函數訓練神經網路時,學習軌跡可能穿過了很多不同的結構,最終到達一個局部是凸碗的區域。AdaGrad 根據平方梯度的整個歷史收縮學習率,可能使得學習率在達到這樣的凸結構前就變得太小了。RMSProp 使用指數衰減平均以丟棄遙遠過去的歷史,使其能夠在找到凸碗狀結構後快速收斂,它就像一個初始化於該碗狀結構的 AdaGrad 演算法實例。
RMSProp 的標准形式如演算法8.5所示,結合 Nesterov 動量的形式如演算法8.6所示。相比於 AdaGrad,使用移動平均引入了一個新的超參數ρ,用來控制移動平均的長度范圍。經驗上,RMSProp 已被證明是一種有效且實用的深度神經網路優化演算法。目前它是深度學習從業者經常採用的優化方法之一。
Adam (Kingma and Ba, 2014) 是另一種學習率自適應的優化演算法,最好被看作結合 RMSProp 和具有一些重要區別的動量的變種。首先,在 Adam 中,動量直接並入了梯度一階矩(指數加權)的估計。將動量加入 RMSProp 最直觀的方法是將動量應用於縮放後的梯度。結合縮放的動量使用沒有明確的理論動機。其次,Adam 包括偏置修正,修正從原點初始化的一階矩(動量項)和(非中心的)二階矩的估計(演算法8.7)。RMSProp 也採用了(非中心的)二階矩估計,然而缺失了修正因子。因此,不像 Adam,RMSProp 二階矩估計可能在訓練初期有很高的偏置。Adam 通常被認為對超參數的選擇相當魯棒,盡管學習率有時需要從建議的默認修改。
目前,最流行並且使用很高的優化演算法包括 SGD、具動量的 SGD、RMSProp、具動量的 RMSProp、AdaDelta 和 Adam。