星小環的AI讀書會—深度學習系列06深度學習中的優化

本系列星小環AI讀書會——深度學習於2017年8月28日開始,每周三晚上7點至9點,在星小環AI讀書會微信群裡面直播。本篇將介紹深度學習中的優化。入群方法,Github代碼地址和詳細介紹見文章結尾。

深度學習中的優化

機器學習中的演算法涉及諸多的優化問題,典型的就是利用梯度下降法(gradient descent)求使損失函數 J(	heta) 下降的模型參數 	heta 。在深度學習,尤其是深度神經網路的訓練和預測中,大的模型往往要花上數天甚至是數月的訓練時間,因此雖然模型的優化費事費力,仍然是一個高回報的步驟, 因為好的模型和優化方法可以極大的加速深度學習模型的訓練。在本章中,將主要介紹神經網路優化這一特定問題:尋找神經網路的參數 	heta ,可以顯著的降低由訓練集誤差項和正則化項組成的代價函數  J(	heta)

本文結構

  1. 深度學習優化與純優化的異同
  2. 優化神經網路的挑戰
  3. 神經網路優化的基本演算法
  4. 優化參數初始化
  5. 自適應學習率優化
  6. 二階近似的利用
  7. 優化策略和元演算法

1. 深度學習優化與純優化的異同

在機器學習的問題中,我們關心的是演算法的性能度量 P, 它通常定義於測試集之上而且往往是不可解的,因此,我們採取的策略是間接地優化 P:我們希望通過降低代價函數 J(	heta) 的方式來提高 P。而傳統的純優化就是單純的優化目標 J本身。深度學習中,代價函數通常用訓練集上損失函數的期望或者平均 (eqn 1.1):

J(	heta)=E_{(x,y)sim hat{p}_{data}} L(f(oldsymbol{x}; oldsymbol{	heta}), y)

其中,L是每個樣本的損失函數(loss function)f(oldsymbol{x}; oldsymbol{	heta}) 是輸入x時候的預測的輸出, hat{p}_{data} 是樣本的經驗分布,在監督學習中,y是目標輸出。上式定義了訓練集上的目標函數,而我們真正希望最小化的是基於數據生成分布 p_{data} 的期望(eqn 1.2):

J^*(	heta)=E_{(x,y)sim p_{data}} L(f(oldsymbol{x}; oldsymbol{	heta}), y)

1.1 經驗風險的最小化

機器學習演算法真正目標是想降低 (eqn 1.2) 方程表示的期望誤差,這樣的一個量也叫做風險(risk)。需要注意的是,該式所計算的值是取自數據的真實潛在分布 p_{data} 。如果我們知道了真實的數據分布,那麼這將變成一個可以被優化演算法優化的問題。但是,通常我們只有訓練集的樣本。因此,機器學習優化問題在這裡可以轉化為求最小化訓練集上的誤差期望,也就是說用已知的經驗分布 hat{p}_{data} 代替未知的真實分布 p_{data} 。這樣一來,我們轉為最小化經驗風險(emperical risk)(eqn 1.3):

E_{(x,y) sim hat{p}_{data} } L(f(oldsymbol{x}; oldsymbol{	heta}), y)=frac{1}{m}sum_{i=1}^{m} L(f(oldsymbol{x^{(i)}}; oldsymbol{	heta}), y^{(i)})

上式中 m表示訓練樣本的數目。基於這種評價訓練誤差的訓練過程被稱為經驗風險最小化(empirical risk minimization)。總結起來,我們並沒有直接優化風險,而是優化經驗風險,希望能夠很大程度上的降低風險。單純依靠最小化經驗風險可能導致過擬合現象,而且在很多的情形下,減小經驗風險並不可行,所以在深度學習中,我們很少使用經驗風險最小化,而使用另外一不同的方法。

1.2 代理損失函數和提前終止

有時候我們的真正損失函數,比如 0-1 分類誤差並無法被有效的優化,此時我們會使用代理損失函數(surrogate loss function)來作為原來目標的替代,而且會帶來好處。比如,正確分類類別的負對數似然通常用作 0-1 損失的替代,。負對數似然允許模型估計給定樣本的類別的條件概率,能夠輸出期望最小分類誤差所對應的類型。有些情況下,代理損失函數可以比原損失函數學到更多的東西,比如對數似然代替 0-1 分類誤差函數時,當訓練集上的誤差達到0之後,測試集上的誤差還可以持續下降,也就是說此時模型可以繼續學習以拉開不同類別直接的距離以提高分類的魯棒性。也就是說,代理損失函數從訓練數據中學到了更多的東西。

另外一個一般優化演算法和機器學習訓練演算法不同的地方是,訓練演算法不會停在局部極小值點,而且通常機器學習的演算法會提前設置終止條件,當條件滿足時(通常在過擬合之前)演算法就停止,雖然此時代理損失函數仍然有較大的導數。對於純優化來說,終止時導數非常小。

1.3 批量演算法和小批量演算法

機器學習演算法的目標函數通常可以分解為訓練樣本上的求和。機器學習中的優化演算法在計算參數的每一次更新時,通常僅僅使用整個代價函數的一部分項來估計代價函數的期望值。例如(eqn 1.4):

	heta_{ML}=underset{	heta} {argmax} sum_{1}^{m} L(f(oldsymbol{x^{(i)}}; oldsymbol{	heta}), y^{(i)})

最大化這個總和等價於最大化訓練集在經驗分布上的期望(eqn 1.5):

J(	heta)=E_{(x,y)sim hat{p}_{data} } log_{p_{model}}(oldsymbol{x}, y; oldsymbol{	heta})

優化演算法用到的目標函數 J 中用到的大多數屬性也是訓練集上的期望。例如常用的梯度期望(eqn 1.6):


abla_{	heta} J(	heta)=E_{(x,y)sim hat{p}_{data}} 
abla_{	heta} log_{p_{model}} (oldsymbol{x}, y; oldsymbol{	heta})

準確的計算這個期望的代價非常大,因為需要在訓練集的每個數據上進行以上的計算,計算量非常大。在真正的實踐中,我們通常會隨機採樣少量的樣本,然後計算這些樣本上的平均值。簡單的論證如下:n個樣本的平均值的方差是 frac{sigma}{sqrt{n}} ,其中 sigma 是樣本真實的標準差。這個公式表明,當樣本量增大100倍時,相應地只能得到10倍的誤差減小,也就是說回報是低於線性的。如果能夠快速的計算出梯度的估計值,而不是緩慢的計算所有梯度的準確值,大多數演算法會收斂的更快。另外,訓練集的冗餘也使得我們考慮使用小數目的部分樣本進行模型訓練。

使用整個訓練集的優化方法被稱為批量(batch)確定性(deterministic)梯度演算法,他們會在每次更新參數時計算所有樣本。通常,「批量梯度下降」指使用全部訓練集,而「批量」單獨出現時,指一組樣本。每次只使用部分樣本的方法被稱為隨機(stochastic)或者在線(online)演算法。在線通常是指從連續產生的數據流(stream)中提取樣本,而不是從一個固定大小的樣本中遍歷多次採樣的情形。大多數深度學習演算法介於兩者之間,使用一個以上但不是全部的訓練樣本,傳統上稱這種方法為小批量(minibatch)或者小批量隨機(minibatch stochastic)方法,現在統稱為隨機(stochastic)方法。

小批量大小由以下因素決定:

  1. 更大批量產生更精準梯度,但是回報低於線性
  2. 太小的批量無法充分利用多核架構
  3. 如果可並行處理,那麼內存消耗和批量大小成正比
  4. 特定大小數組運行在某些硬體上,運行更快
  5. 小批量引入雜訊,具有正則化的效果

不同的演算法使用不同的方法從小批量中提取信息,有些表現好,有些表現不好,原因可能是無法在小批量上面獲取有用信息,或者是放大了小批量上面的誤差雜訊。

小批量是隨機抽取的這一點非常重要,以防連續遍歷時數據之間的相關性導致梯度估計的相關性。從一組樣本中計算出梯度期望的無偏估計要求這些樣本之間是互相獨立的。通常的做法是在訓練之前,將數據隨機打亂一次後,再按照順序一直往下取 minibatch 就可以了。每個獨立的模型每次遍曆數據時都會使用我們已經提前打亂的數據,這種理論上偏離隨機採樣的方法並沒有給模型訓練帶來怎樣的影響。 小批量隨機梯度下降的一個有趣的事實是,只要沒有重複使用樣本,它將遵循著真實泛化誤差的梯度。在線學習最好體現了隨機梯度下降是最小泛化誤差的原因:所有數據都是新的獨立產生的,而不是原來固定大小的訓練集,這種情況下每次更新的樣本是直接從分布 p_{data} 中採樣獲得的無偏樣本。

除非數據量非常之大,通常最好是多次遍曆數據集,如果只在第一次隨機打亂數據順序後不再改變順序,只有第一次遍曆數據符合泛化誤差梯度的無偏估計,額外的訓練仍然可以繼續減小訓練誤差而獲得好處。隨著數據集的不斷增大,往往一個數據只會使用一次,甚至只是使用部分訓練集,這時過擬合不再是問題,欠擬合和計算效率成為我們需要考慮的問題。

2. 優化神經網路的挑戰

優化通常是一個非常困難的任務,傳統的機器學習會想辦法設計目標函數和約束,使得目標函數是凸函數,從而避免優化過程中出現非凸函數的問題。然而,即使是凸函數,也會遇到優化的問題,本節將主要探討深度學習優化問題中會遇到的挑戰。

2.1 病態情況

在優化凸函數的時候,會遇到Hessian矩陣 oldsymbol{	extit{H}} 病態的情況。病態情況一般被認為廣泛存在於神經網路的訓練過程中,體現在隨機梯度下降會「卡」在某些特殊的情況,此時即使很小的更新步長也會增加代價函數。回顧之前的代價函數的二階泰勒展開預測梯度下降的 -epsilonoldsymbol{	extit{g}} 會增加:

frac{1}{2}epsilon^2oldsymbol{	extit{g}}^{	op}oldsymbol{	extit{H}}oldsymbol{	extit{g}}-epsilonoldsymbol{	extit{g}}^{	op}oldsymbol{	extit{g}}

frac{1}{2}epsilon^2oldsymbol{	extit{g}}^{	op}oldsymbol{	extit{H}}oldsymbol{	extit{g}} 超過 epsilonoldsymbol{	extit{g}}^{	op}oldsymbol{	extit{g}} 時,梯度的病態會成為問題,很多情況下,梯度的範數不會再訓練中顯著的減小,但是 oldsymbol{	extit{g}}^{	op}oldsymbol{	extit{H}}oldsymbol{	extit{g}} 的增長會超過一個數量級。結果是,儘管梯度很強,但是學習率必須收縮以彌補更強的曲率,因此學習變得非常緩慢。 有些適合於解決其他情況中的病態的技術並不適用於深度神經網路。比如牛頓法在解決帶有病態條件的Hessian矩陣的凸優化問題時,是有效的方法,但是運用到神經網路時需要很大的改動。

2.2 局部極小值

在凸優化問題中,優化問題可以簡化為尋找一個局部極小值點,因為任何的局部極小值就是全局最小值。雖然有些凸函數底部是一個很大的平坦區域,並非單一的極值點,但是應用過程中實際上該區域中每一個極小值點都是一個可以接受的點。所以說,對於凸優化問題來說,找到任何形式的臨界點,就是找到了一個不錯的可行解。而對於非凸函數問題,比如神經網路問題,可能會存在很多的局部極小值點。

如果一個足夠大的模型可以唯一確定一組模型的參數,那麼我們說該模型是可以辨認的。帶有潛變數的模型往往是不可辨認的,因為互相交換潛變數,可以得到等價的模型。神經網路代價函數具有非常多甚至是無限多的局部極小值點,而且,由於不可辨識性問題而產生的局部極小值都有相同的代價函數,因此局部極小值點並非是非凸帶來的問題。如果局部極小值點相比全局最小值點有很大的代價,那麼局部極小值點會帶來很大的問題。對於實際使用的神經網路,是否存在很多代價很大的局部極小值點,優化演算法是否會碰到這些極小值點都是尚未解決的公開問題。學者們現在猜想,對於足夠大的神經網路而言,大部分局部極小值都具有很小的代價函數,我們能不能找到全局最小點並不重要,重要的是能夠在參數空間里找到一個代價很小的可以接受的點。

2.3 高原, 鞍點和平坦區域

很多高維非凸函數而言,局部極值遠少於另一類梯度為零的點:鞍點。在一個鞍點附近,有些方向有更大的代價函數,有些方向有更小的代價函數。在鞍點處,Hessian矩陣同時具有正負特徵值,位於正特徵值對應的特徵向量方向的點比鞍點有更大的代價,負特徵值對應的特徵向量方向的點比鞍點有更小的代價。鞍點是某個方向的橫截面的極大值點,也是另一個方向截面的極小值點。

(圖片截取自Saddle point - Wikipedia)

在低維空間中,局部極值很長常見,而在高維空間中,鞍點則很常見。理論上已經證明,不具有非線性的淺層自編碼器只有全局極小值和鞍點,沒有代價比全局極小值更大的局部極小值點。試驗中發現,梯度下降在很多情況下可以逃離鞍點。對於牛頓法而言,鞍點是一個問題,因為梯度下降旨在朝著「下坡」方向移動,而非明確尋找梯度為0的點。如果不經修改,牛頓法就會跳進一個鞍點。而在高維空間中,鞍點激增,所以以牛頓法為代表的二階方法無法成功取代梯度下降。

2.4 懸崖和梯度爆炸

多層神經網路因為有大量的因子相乘,典型的比如循環神經網路,因為長的時間序列會有大量因子相乘,這中情況下存在像懸崖一樣的斜率較大的區域,當遇到這種懸崖結構時,梯度更新會很大程度的改變參數的值,進而跳過這樣的區域。不管是從上還是從下接近懸崖,都會產生不好的結果。如果採用啟發式梯度截斷可以避免嚴重的後果。基本想法在於梯度只是指明了移動的最佳方向,並沒有指明最佳步長,因此啟發式梯度截斷會減小步長,使得梯度下降不太可能一步走出最陡下降方向的懸崖區域。

(圖片由[英文原書](Deep Learning)內基於Pascanu等人2013論文《On the difficulty of training recurrent neural networks 》修改 )

2.5 長期依賴

在一些算中,當計算圖變得非常深的時候,會面臨一個長期依賴的問題。深層的計算圖不僅存在於前饋網路,也存在於循環神經網路中,因為循環神經網路要在很長的時間序列的各個時刻重複應用相同操作來構建非常深的計算圖。舉個例子,假如某個計算圖包含一條反覆與矩陣 oldsymbol{	extit{W}} 相乘的路徑,那麼 t步之後,相當於乘以 oldsymbol{	extit{W}^t} 。假設 oldsymbol{	extit{W}} 有特徵分解:

oldsymbol{	extit{W}}=(oldsymbol{	extit{V}} diag(lambda)oldsymbol{	extit{V}}^{-1})^t=oldsymbol{	extit{V}} diag(lambda)^toldsymbol{	extit{V}}^{-1}

當特徵值 lambda_i 不在 1 附近時,若大於1,則會爆炸,若小於1,則會消失。梯度消失與爆炸問題(vanishing and exploding gradient problem)是指該計算圖上面的梯度會因 diag(lambda)^t 發生大幅度的變化。梯度消失使得我們不知道參數朝那個方向移動可以快速改進代價函數,而梯度爆炸會使得學習不穩定。循環網路中使用的相同的矩陣 oldsymbol{	extit{W}} 並沒有在前饋網路中使用,因此即使使用非常深的前饋網路,也能避免梯度消失於爆炸問題。

2.6 非精確梯度

大多數優化演算法先決條件是我們知道精確的梯度或者是Hessian矩陣,然而在實踐中,往往都是有偏的估計,幾乎所有的深度學習演算法都需要基於採樣的估計,比如小批量數據計算更新梯度。有些情況下,我們希望最小化的目標函數實際上是難以處理的,所以此時我們只能使用近似梯度。大多數神經網路演算法的設計都考慮到了梯度估計的缺陷,所以選擇比真實損失函數更容易估計的代理損失函數來避免這個問題。

2.7 局部與全局的弱對應

以上討論的大都是單點的性質,如果利用梯度下降在某個方向上損失函數改進很大,但是並沒有指向全局代價更低的遙遠區域,那麼單點處表現很好,但是全局表現不佳。有學者認為大部分訓練的運行時間取決於到達最終解的路徑長度,大多數優化研究難點集中於訓練是否找到了全局最小點,局部最小點,鞍點,但是在實踐中神經網路並不會達到其中任何一種。

梯度下降和幾乎所有可以有效訓練神經網路的方法,都是基於局部較小更新。以上的內容都是集中於為何這些局部範圍更新的正確方向難以計算,但是難以確定局部下降是否定義通向有效解的足夠短的路徑。目標函數可能有諸如病態條件或不連續梯度的問題,使得梯度為目標函數提供較好近似的區間非常小。有些情況下,局部下降或許可以定義通向解的路徑,但是該路徑包含很多次更新,因此遵循該路徑會帶來很大的計算代價;還有些情況下,局部下降完全無法定義通向解的路徑;還有些情況下,局部移動太過貪心,朝著下坡的方向移動,但是卻和所以可行解越來越遠。

許多現有的研究方法在研究求解具有困難全局結構的問題時,著力於尋找良好的初始點,而不是在局部範圍內更新的演算法,因為前者實現目標更加可行。

2.8 優化的理論限制

一些理論研究表明,我們為任何神經網路設計的任何優化演算法都有性能限制,但是,這樣的理論上的性能限制並不影響神經網路在實踐中的應用。尋找一個給定規模的網路的可行解是困難的,但在現實情況中,我們可以通過選擇更大的網路,設置更多的參數,輕鬆找到可以接受的解。另外,在神經網路中實踐中,我們不關注某個函數的精確的極小值點,只要求損失減到足夠小以獲得可以接受的泛化誤差即可。理論研究優化演算法的性能上界需要學術界更多的努力。

3. 神經網路優化的基本演算法

以上內容已經講解了神經網路優化的理論指導思想,使用梯度下降和隨機梯度下降,可以很大程度上加速模型的訓練,代價函數會沿著隨機挑選的小批量數據的梯度方向下降。

3.1 隨機梯度下降

隨機梯度下降(SGD)及其變種是一般機器學習中應用最多的優化演算法,尤其是在深度學習中。按照數據生成分布 p_{data} 隨機抽取 m個小批量(獨立同分布,iid)的樣本,通過計算它們梯度的均值,得到梯度的無偏估計。下圖展示了這個演算法的過程:

(演算法圖片截取自[中文翻譯](exacity/deeplearningbook-chinese))

代碼實現示例如下:

# define the standard SGD functiondef SGD(batches, n_iter, w, b): for i in range(1, n_iter + 1): for j in range(len(batches)): x_mini, y_mini = batches[j] # x_mini dim mini*nf delta = np.dot(x_mini, w) + b - y_mini # dim mini*1 loss[sgd].append((delta*delta).mean()) w = w - eps*(np.dot(x_mini.T, delta))/x_mini.shape[0] b = b - eps*delta.mean() # end for # end for

SGD演算法中的一個關鍵參數是學習率 epsilon_k ,在此之前我們介SGD都是使用的固定的學習率,在實踐中,隨著梯度的降低,有必要逐步減小學習率。因此以上偽代碼中將第k步的學習率用 epsilon_k 來表示。由於SGD中隨機採樣 minibatch 會引入雜訊源,因此在極小點處梯度並不會消失。而批量梯度下降使用全量數據更新梯度,在接近極小值點時,梯度很小並逐步變為0,因此,批量梯度下降可以使用固定學習率。與之對比,SGD收斂的一個充分條件是:

sum_{k=1}^{infty}epsilon_k = infty

sum_{k=1}^{infty}epsilon_k^2 < infty

在實踐中,一般會選擇線性衰減學習率知道第 	au 次迭代:

epsilon_k = (1-alpha)epsilon_0 + alphaepsilon_{	au}

其中 alpha= frac{k}{	au} 。在第 	au 次迭代之後,一般使 epsilon 保持常數。學習率可以通過實驗誤差的演變曲線來選取,如果初始 epsilon_0 選取的過大,則會出現損失上升和震蕩,而如果 epsilon_0 選取的過小,學習過程會過於緩慢。

SGD及其相關的小批量,或者是更廣義的基於梯度優化的在線學習演算法,一個重要的性質是每一步更新的計算時間不依賴與總的訓練樣本的多少。及時總的數據集很大,它也能收斂,而且SGD往往在處理完整個訓練集之前就收斂到可接受的誤差範圍之內。

研究演算法的收斂率,一般會衡量額外誤差(excess error) J(	heta)-min_{	heta}J(	heta) ,也即當前代價函數超出最低可能代價的量。SGD應用於凸問題時,k步迭代之後誤差的量級是 O(frac{1}{sqrt{k}}) ,在強凸情況下誤差量級是 O(frac{1}{k}) 。在沒有額外假設和輔助信息之下,以上的界限不能進一步改進。批量梯度下降理論上SGD有更好的收斂率,然而有學者研究指出,泛化誤差的下降速度不會快於 O(frac{1}{k}) ,因此對於機器學習演算法而言,不值得探索收斂快於 O(frac{1}{k}) 的優化演算法,因為往往過快的收斂對應著過擬合。對於大數據集,SGD只需要少量的樣本計算梯度從而實現初始快速更新。但是由SGD損失了常數倍 O(frac{1}{k}) 的漸進分析,我們可以在學習中逐漸增大小批量的batch大小,以此權衡並充分利用批量梯度下降和隨機梯度下降兩者的優點。

3.2 動量

SGD是最受歡迎的優化演算法,但是其學習過程有時會有點緩慢,動量方法旨在加速學習過程,特別是處理高曲率,小但一致的梯度,或者是帶有雜訊的梯度。動量演算法積累了之前梯度指數級衰減的移動平均,並且繼續沿該方向移動。從形式上看,動量演算法引入了變數 v充當速度角色-代表參數在參數空間移動的方向和速率,速度被認為是負梯度的指數衰減平均。動量這個名詞的引入也是為了類比物理當中的動力概念。超參數 alpha 決定了之前的梯度貢獻衰減得有多快,更新規則如下:

oldsymbol{	extit{v}} = alpha oldsymbol{	extit{v}} - epsilon 
abla_{	heta}(frac{1}{m}sum_{i=1}^{m}L(f(oldsymbol{x^{(i)}}; oldsymbol{	heta}), y^{(i)}))

oldsymbol{	heta} = oldsymbol{	heta} + oldsymbol{	extit{v}}

速度 v 累積了梯度元素 
abla_{	heta}(frac{1}{m}sum_{i=1}^{m}L(f(oldsymbol{x^{(i)}}; oldsymbol{	heta}), y^{(i)})) ,相對於 epsilonalpha 越大,之前梯度對現在方向的影響也越大。

帶動量的SGD演算法的偽代碼如下:

(演算法圖片截取自[中文翻譯](exacity/deeplearningbook-chinese))

代碼實現示例如下:

# define SGD with momentumdef momentum(batches, n_iter, w, b): alpha = 1e-2 # momentum hyperparameters velocity = np.zeros_like(w) # the velocity term for i in range(1, n_iter + 1): for j in range(len(batches)): x_mini, y_mini = batches[j] # x_mini dim mini*nf delta = np.dot(x_mini, w) + b - y_mini # dim mini*1 loss[momentum].append((delta*delta).mean()) velocity = alpha*velocity - eps*(np.dot(x_mini.T, delta))/x_mini.shape[0] w = w + velocity b = b - eps*delta.mean() # end for # end for

在之前的SGD或者批量梯度下降中,步長只是梯度範數乘以學習率,現在,步長取決於梯度序列的大小和排列,當許多連續的梯度指向相同的方向時,步長最大,如果動量演算法始終觀察到梯度 oldsymbol{	extit{g}} ,那麼它會在 -oldsymbol{	extit{g}} 的方向上不斷的加速。其中,步長大小為:

frac{epsilon left | oldsymbol{	extit{g}} 
ight |} {1-alpha}

因此將動量方法的超參數視為 frac{epsilon}{1-alpha} 有助於SGD類比理解。比如, alpha=0.9 對應著最大速度10倍於梯度下降演算法。在實踐中,一般 alpha 會取值為0.5, 0.9和0.99,和學習率一樣, alpha 也會隨著時間不斷地調整。一開始取比較小的值,逐漸變大,隨著訓練的深入,調整 alpha 沒有收縮 epsilon 重要。

3.3 Nesterov 動量

受Nesterov加速梯度演算法的啟發,Sutskever等人提出了動量演算法的一個變種,更新規則如下:

oldsymbol{	extit{v}} = alpha oldsymbol{	extit{v}} - epsilon 
abla_{	heta}(frac{1}{m}sum_{i=1}^{m}L(f(oldsymbol{x^{(i)}}; oldsymbol{	heta}+alpha oldsymbol{	extit{v}}), y^{(i)}))

oldsymbol{	heta} = oldsymbol{	heta} + oldsymbol{	extit{v}}

參數 alphaepsilon 發揮了和標準動量方法中類似的作用,Nesterov動量和標準動量之間的區別在於梯度的計算上。Nesterov動量中,梯度計算在施加當前速度之後,可以理解為Nesterov 動量往標準動量方法中添加了一個校正因子。在凸優化問題使用批量梯度下降的情況下,Nesterov 動量將 k 步之後額外誤差收斂率從 O(frac{1}{k}) 提高到 O(frac{1}{k^2}) ,對SGD沒有改進收斂率。完整的 Nesterov動量演算法如下所示:

(演算法圖片截取自[中文翻譯](exacity/deeplearningbook-chinese))

代碼實現示例如下:

# define SGD with nesterov momentumdef nesterov(batches, n_iter, w, b): alpha = 1e-2 # momentum hyperparameters velocity = np.zeros_like(w) # the velocity term for i in range(1, n_iter + 1): for j in range(len(batches)): x_mini, y_mini = batches[j] # x_mini dim mini*nf delta = np.dot(x_mini, w + alpha*velocity) + b - y_mini # dim mini*1 loss[nesterov].append((delta*delta).mean()) velocity = alpha*velocity - eps*(np.dot(x_mini.T, delta))/x_mini.shape[0] w = w + velocity b = b - eps*delta.mean() # end for # end for

4. 優化參數初始化

有些演算法本質上是非迭代的,只是求解一個點。而有些其他優化演算法本質上是迭代的,應用這類優化問題時,能在可接受的時間內收斂到可接受的解,並且收斂值與初始值無關。深度學習的模型通常是迭代的,因此要求使用者制定一些開始迭代的初始點。另外,深度學習模型又是一個很複雜的問題,以至於大部分演算法的結果收到初始值的影響。初始點能決定演算法是否收斂,有些初始點十分不穩定,使得演算法會遭遇數值困難,並完全失敗。在收斂的情形下,初始點可以決定學習收斂的有多快,以及是否收斂到一個代價高或者低的點。另外,差不多代價的點可以導致區別極大的泛化誤差,初始點可以影響泛化。

現代機器學習乃至深度學習和神經網路的初始化策略是簡單和啟發式的,改進初始化是一項困難的任務。神經網路的優化到目前都沒有被很好的理解。有些初始化策略在神經網路初始化時具有很好的效果,然而我們並沒有理解哪些性質可以在初始化之後得意保持。進一步,有些初始化從優化的觀點是有利的,但是從泛化的角度看是不利的。

目前完全確信的唯一特性是初始參數需要在不同的單元之間「破壞對稱性」。比如,如果具有相同激活函數的兩個隱藏單元連接到相同的輸入,那麼這些單元必須具有不同的初始化參數。如果他們具有相同的參數,那麼應用到確定性損失和模型的確定性學習演算法之上時將會一直以相同的方式更新這兩個單元。通常來說,最好還是初始化每個單元使其和其他單元計算不同的函數,這或許有助於確保沒有輸入模式丟失在前向傳播的零空間中,也沒有梯度丟失在反向傳播的零空間中。每個單元計算不同的函數的目標促使了參數的隨機初始化。

我們幾乎總是初始化模型的權重為高斯或者均勻分布中隨機抽取的值,兩者似乎沒有很大的區別,然而初始分布的大小確實對優化過程的結果和網路的泛化能力都有很大的影響。

更大的初始權重具有更強的破壞對稱性的作用,有助於避免冗餘的單元,也有助於避免在每層線性成分的前向或反向傳播中丟失信號。如果權重初始太大,那麼會在前向或者反向中產生爆炸的值。對於初始化網路,正則化和優化有著不同的觀點:優化觀點建議權重應該足夠大以成功傳播信息,正則化則希望參數小一點以降低模型複雜度。

很多啟發式的方法可用於選擇權重的初始大小。一種初始化 m 個輸入和 n 個輸出的全連接層的權重啟發式方法是從分布

U(-frac{1}{sqrt{m}},frac{1}{sqrt{m}})

中採樣權重,而 Glorot 和 Bengio 建議使用標準初始化(normalized initialization)

W_{i, j} sim U(-sqrt{frac{6}{m+n}},sqrt{frac{6}{m+n}})

後一種啟發式方法初始化所有的層,目的在於使其處於具有相同激活方差和使其具有相同的梯度方差之間。雖然這種假設網路是不含有非線性的鏈式矩陣乘法,現實的神經網路會違反這個假設,但是很多設計給線性模型的演算法在非線性模型上面都有很好的效果。

如果計算資源允許,將每層權重的初始值範圍設定為一個超參數通常是一個好主意,使用後面11章 實踐方法論中介紹的額超參數搜索演算法,比如隨機搜索來進行參數挑選。是否選擇使用密集或者稀疏初始化也可以設置為一個超參數,當然我們也可以選擇手動搜索最優初始範圍。以上都是關注權重的初始化,其他參數的初始化通常是更加容易的。初始化偏置的方法必須和初始化權重的方法相協調,通常大部分情況下將偏置設置為0是可行的方案。當然,存在以下這些需要將初始化偏置為非0的情形:

  1. 偏置作為輸出單元,初始化偏置以獲得正確的輸出邊緣統計通常是有利的
  2. 有時需要選擇偏置以避免初始化引起太大飽和
  3. 有時一個單元會控制其他單元能否參與到等式中

上面這些初始化模型參數為常數或者隨機演算法,實踐中還可以利用機器學習來初始化網路參數。在深度學習這本書的第三部分,一個常用的策略是使用無監督模型訓練出來的參數來初始化監督模型。 即使是在一個不相關的問題上運行監督訓練,往往也會得到一個比隨機初始化更快收斂的初始值(類似於遷移學習)。這些新式的初始化策略有時能夠得到更好的泛化誤差和更快的收斂速度,因為它們編碼了模型初始參數的分布信息。之前的其他初始化策略效果也不錯的原因主要在於設置了正確的參數範圍,或者是設置不同單元計算互相不同的參數。

5. 自適應學習率優化

學習速率對神經網路的性能有著顯著的影響,損失通常高度敏感於參數空間的某些方向,而對其他因素不敏感。動量演算法可以一定程度上緩解這個問題,但代價是引入了另一個超參數。如果我們相信方向敏感度在某種程度是軸對齊的,那麼給每個參數設置不同的學習率,在模型學習訓練過程中自動適應這些學習率是有道理的。早期的一個模型訓練時候的啟發式演算法 Delta-bar-delta演算法,基於簡單的想法:如果損失對於某個給定模型參數的偏導符號保持不變,那麼學習率應該增大,如果對於該參數的偏導的方向發生了變化,那麼學習率應該減小。這種方法只適用於全批量優化中。本節將介紹最近提出的幾種基於小批量的演算法來自適應模型參數的學習率。

5.1 AdaGrad 演算法

AdaGrad演算法,如下圖所示,獨立地適應所有模型參數的學習率,縮放每個參數反比於其所有梯度歷史平方值總和和平方根,具有損失最大偏導的參數相應有一個快速下降的學習率,而具有小偏導的參數在學習率上有相對較小的下降。總的效果是在參數空間中更為平緩的傾斜方向會取得更大的進步。對於訓練深度神經網路而言,從訓練開始積累梯度平方會導致有效學習率過早和過量的減小。

(演算法圖片截取自[中文翻譯](exacity/deeplearningbook-chinese))

代碼實現示例如下:

# define adagraddef adagrad(batches, n_iter, w, b): #eps = 1e-3 deltaa = 1e-7 r = np.zeros_like(w) # the accumulative term for i in range(1, n_iter + 1): for j in range(len(batches)): x_mini, y_mini = batches[j] # x_mini dim mini*nf delta = np.dot(x_mini, w) + b - y_mini # dim mini*1 loss[adagrad].append((delta*delta).mean()) g = (np.dot(x_mini.T, delta))/x_mini.shape[0] r = r + g*g dw = -eps*g/(deltaa + np.sqrt(r)) w = w + dw b = b - eps*delta.mean() # end for # end for

5.2 RMSProp 演算法

RMSProp由Hinton於2012年提出,用於修改AdaGrad以在非凸設定下效果更好,將梯度積累改變為指數加權的移動平均。AdaGrad設計以讓凸問題能夠快速的收斂。當應用於非凸函數訓練神經網路時,學習軌跡可能穿過了很多不同的結構,最終到達一個局部是凸碗的結構。AdaGrad根據平方梯度的整個歷史來收縮學習率,學習率很可能在到達這樣的凸碗結構之前就變得太小。而RMSProp使用指數衰減平均,丟棄遙遠過去的歷史,使其能夠在找到凸碗結構後快速收斂,該演算法等效於一個初始化與該碗狀結構的AdaGrad演算法。實踐中和經驗上,RMSProp已經被證明是是一種有效而且實用的深度神經網路優化演算法,目前是深度學習從業者經常採用的優化方法之一。

RMSProp的標準形式和結合Nesterov動量的形式如下圖所示,相比AdaGrad,引入了一個新的超參數 
ho ,用來控制移動平均的長度範圍。

代碼實現示例如下:

# define rmspropdef rmsprop(batches, n_iter, w, b): #eps = 1e-2 rho = 0.09 # for rmsprop deltaa = 1e-6 r = np.zeros_like(w) # the accumulative term for i in range(1, n_iter + 1): for j in range(len(batches)): x_mini, y_mini = batches[j] # x_mini dim mini*nf delta = np.dot(x_mini, w) + b - y_mini # dim mini*1 loss[rmsprop].append((delta*delta).mean()) g = (np.dot(x_mini.T, delta))/x_mini.shape[0] r = rho*r + (1.0-rho)*g*g dw = -eps*g/np.sqrt(r+deltaa) w = w + dw b = b - eps*delta.mean() # end for # end for

演算法圖片截取自[中文翻譯](exacity/deeplearningbook-chinese))

5.3 Adam 演算法

Adam (adaptive moments),在早期演算法的背景下,最好被看成結合RMSProp和具有一些重要區別的動量的變種。首先,在Adam中動量直接併入了梯度一階矩(指數加權)的估計。將動量加入RMSProp最直觀的方法是將動量應用於縮放後的梯度。其次,Adam包括偏置修正,修正從原點初始化的一階矩(動量項)和二階矩(非中心項)。Adam通常被認為對超參數的選擇相當魯棒,儘管學習率有時需要從建議的默認值修改。

(演算法圖片截取自[中文翻譯](exacity/deeplearningbook-chinese))

代碼實現示例如下:

# define adamdef adam(batches, n_iter, w, b): #eps = 1e-2 # recommended values rho1 = 0.9 rho2 = 0.999 deltaa = 1e-8 s = np.zeros_like(w) # the accumulative term r = np.zeros_like(w) # the accumulative term t = 0 # initialize time step for i in range(1, n_iter + 1): for j in range(len(batches)): x_mini, y_mini = batches[j] # x_mini dim mini*nf delta = np.dot(x_mini, w) + b - y_mini # dim mini*1 loss[adam].append((delta*delta).mean()) g = (np.dot(x_mini.T, delta))/x_mini.shape[0] t = t + 1 s = rho1*s + (1.0 - rho1)*g r = rho2*r + (1.0 - rho2)*(g*g) s_hat = s/(1.0 - rho1**t) r_hat = r/(1.0 - rho2**t) dw = -eps*s_hat/(np.sqrt(r_hat)+deltaa) w = w + dw b = b - eps*delta.mean() # end for # end for

5.4 選擇正確的優化演算法

本節以上部分討論了一系列通過自適應每個模型參數的學習率以解決優化深度模型中的難題,究竟在實踐中該如何選擇並沒有定論。目前來說,最流行並且使用率很高的優化演算法包括SGD,有動量的SGD,RMSProp,有動量的RMSProp,AdaDelta 和 Adam,選擇哪一個演算法主要取決於使用者對特定演算法的熟悉程度以便調節超參數。

演算法總結:基於動量和基於自適應學習率的優化演算法都是從梯度下降SGD演化而來,演算法的細節之處對比如下圖:

(圖片截取自[blog](machine learning - 第2頁 - Slinuxer))

為比較和各個演算法的特點和更好的理解基於梯度下降演算法的工作原理,以下兩張動圖可供參考。下圖1:損失函數的等高圖和不同演算法的演化迭代收斂時間。下圖2:鞍點附近的各個演算法的工作圖,注意到紅色的SGD路徑在鞍點處花了很長時間才找到下降的方向,而RMSProp很快就找到了更快下降的方向。

(圖片來自作者[Alec Radford](twitter.com/alecrad))

以上基於SGD的6個演算法的完整Python演示代碼見如下鏈接DiscoverML/simplified-deeplearning

6. 二階近似的利用

本節會討論用於訓練深度神經網路的二階方法。為簡單起見,只討論目標函數為經驗風險(暫時不考慮正則化項)(eqn. 25):

J(	heta) = E_{(x,y)sim hat{p}_{data} } L(f(oldsymbol{x}; oldsymbol{	heta}), y)=frac{1}{m} sum_{1}^{m} L(f(oldsymbol{x^{(i)}}; oldsymbol{	heta}), y^{(i)})

6.1 牛頓法

與一階方法相比,二階方法使用二階導數改進了優化,最廣泛使用的是牛頓法。牛頓法是基於二階泰勒級數展開在某點 	heta_0 附近來近似 J(	heta) 的方法,忽略了更高級的導數(eqn. 26):

J(	heta) approx J(	heta_0) + (	heta-	heta_0)^{	op}
abla_{	heta}J(	heta_0)+frac{1}{2}(	heta-	heta_0)^{	op}oldsymbol{	extit{H}}(	heta-	heta_0)

其中 oldsymbol{	extit{H}} 是 J 相對於 	heta 的Hessian矩陣在 	heta_0 處的估計。如果我們基於上式求解這個函數的臨界點,得到牛頓參數的更新規則(eqn. 27):

	heta^* = 	heta_0 - oldsymbol{	extit{H}}^{-1}
abla_{	heta}J(	heta_0)

因此,對於局部的具有正定 oldsymbol{	extit{H}} 的二次函數,用 oldsymbol{	extit{H}}^{-1} 調整梯度,牛頓法會直接跳到極小值,如果目標函數是凸的但非二次,該更新將是迭代的,得到的相關演算法如下。對於非二次的表面,只要Hessian矩陣保持正定,牛頓法就能夠迭代應用。

(演算法圖片截取自[中文翻譯](exacity/deeplearningbook-chinese))

牛頓法只適用於Hessian矩陣是正定的情況,而在深度學習中,目標函數的表面通常是非凸的,因此使用牛頓法是有問題的,這種情況下可以通過正則化Hessian矩陣來避免,常用的方法是在Hessian矩陣對角線上增加常數 alpha

	heta^* = 	heta_0 - [oldsymbol{	extit{H}(f(	heta_0))+alpha oldsymbol{	extit{I}}} ]^{-1}
abla_{	heta}J(	heta_0)

這個正則化策略用於牛頓法的近似,只要Hessian矩陣的負特徵值仍然相對接近0,效果就會很好。在曲率方向更極端的情況下, alpha 的值必須足夠大,以抵消負特徵。但是如果 alpha 變得太大,Hessian矩陣會變成由對角矩陣 alpha oldsymbol{	extit{I}} 為主導,通過牛頓法選擇的方向會收斂到普通梯度除以 alpha 。如果有很強的負數曲率存在時, alpha 需要特別大,導致牛頓法比選擇合適學習率的梯度下降的步長更小。

除了目標函數帶來的挑戰,牛頓法在大型神經網路訓練中還受限制於龐大的計算負擔。如果有

k 個參數,那麼牛頓法需要計算 k	imes k 的矩陣的逆,計算的額複雜度是 O(k^3) 。另外由於每次訓練迭代都要計算Hessian矩陣及其逆矩陣,所以只有參數很少的網路才能在實際中使用牛頓法。至於用於更大規模的網路訓練,本節以下將討論一些保持牛頓法優點,同時減小計算量的替代演算法。

6.2 共軛梯度

共軛梯度是一種通過迭代下降的共軛方向,來有效避免Hessian矩陣求逆的演算法。這種方法來源於對最速下降法弱點的研究和改進。在共軛梯度法中,我們尋求一個和先前線搜索方向共軛(conjugate)的搜索方向,也即它不會撤銷該方向上的進展,在訓練迭代第 t 步時,下一步的搜索方向 oldsymbol{	extit{d}}_t 的形式如下:

{oldsymbol{	extit{d}}}_t = 
abla_{	heta} J(	heta) + {eta}_t {oldsymbol{	extit{d}}}_{t-1}

其中 eta\_t 的大小控制著我們應該沿方向 oldsymbol{	extit{d}}_{t-1} 上加回多少道當前搜索方向上。在這裡,如果:

{oldsymbol{	extit{d}}}_t^{	op} {oldsymbol{	extit{H}}} {oldsymbol{	extit{d}}}_{t-1} = 0

那麼我們說兩個方向 oldsymbol{	extit{d}}\_toldsymbol{	extit{d}}_{t-1} 是共軛的。有兩種計算  eta_t 的方法,一種是 Fletcher-Reeves方法,另一種是 Polak-Ribiere 方法。對於二次曲面而言,共軛方向確保梯度沿著前一個方向大小不變。

(演算法圖片截取自[中文翻譯](exacity/deeplearningbook-chinese))

6.3 BFGS

BFGS演算法(Broyden-Fletcher-GoldfarbShanno)演算法具有牛頓法的有點,但是沒有牛頓法的計算負擔。BFGS演算法使用了一個更直接的方法近似牛頓更新,回顧公式 eqn. 27,BFGS演算法使用矩陣 oldsymbol{	extit{M}_t} 近似逆,迭代地低秩更新精度以更好地近似  oldsymbol{	extit{H}^{-1}} 。更多關於BFGS演算法的內容,請參見相關參考資料。

當Hessian逆近似  oldsymbol{	extit{M}_t} 更新時,下降方向 
ho_t
ho_t = 	extit{M}_t 	extit{g}_t ,在該方向上的線搜索用於決定該方向上的步長 epsilon^* ,參數更行為:

	heta_{t+1}=	heta_t + epsilon^* 
ho_t

和共軛梯度法類似BFGS演算法迭代一系列線搜索,其方向含有二階信息。而和共軛梯度不同的是,該方法的成功並不依賴於線搜索尋找該方向上和真正極小值很近的一點。優點方面,相比於共軛梯度,BFGS花費較少時間改進每個線搜索。缺點方面,BFGS演算法必須存儲Hessian逆矩陣 oldsymbol{	extit{M}} ,需要 O(n^2) 的存儲空間,使得BFGS不適用於具有百萬級參數的大規模現代深度學習模型。作為改進,存儲受限的BFGS(或者稱為L-BFGS)通過避免存儲完整的Hessian逆近似 oldsymbol{	extit{M}} ,使得存儲代價顯著降低。

7. 優化策略和元演算法

有很多的優化技術並不是真正具體的演算法,而是更為一般化的模板和思想,它們既可以產生特定的演算法,也可以併入到很多的演算法之中。

7.1 批標準化

批標準化是優化深度神經網路的重要創新之一。實際上它並不是一個優化演算法,而是一個自適應的重參數的方法,以期解決訓練非常深的模型的困難。重參數化顯著減少了多層之間協調更新的問題,可以用於網路的任何輸入層或者是隱藏層。設  oldsymbol{	extit{H}} 是需要標準化的某層的小批量激活函數,排布為設計矩陣,每個樣本的激活層出現在矩陣的每一行中。為了標準化 oldsymbol{	extit{H}} ,我們將其替換為:

oldsymbol{	extit{H}}= frac{oldsymbol{	extit{H}}-oldsymbol{mu}}{oldsymbol{sigma}}

其中  mu 是包含每個單元均值的向量, sigma 是包含每個單元標準差的向量。在訓練的階段:

mu = frac{1}{m} sum_{i} {oldsymbol{	extit{H}}}_i

{oldsymbol{sigma}} = sqrt{delta+frac{1}{m} sum_{i} (oldsymbol{	extit{H}}-{oldsymbol{mu})}_i^2}

其中  delta 是一個很小的正值,比如 10^{-8} 。我們反向傳播這些操作,計算均值和標準差,並應用它們來標準化  oldsymbol{	extit{H}} 。在測試階段, musigma 可以被替換為訓練階段收集的運行均值,使得模型可以對單一樣本進行評估。批標準化使得模型更容易學習。

7.2 坐標下降

在某些情況下,將一個優化問題分解成幾個部分,可以更快速地解決原問題。比如,如果我們相對於某個單一變數 x_i 最小化 f(oldsymbol{	extit{x}}) ,然後相對於另一個變數 x_j 等等,這樣反覆循環所有變數,會保證達到局部極小值點。這種做法叫做坐標下降(coordinate descent),因為我們一次優化一個坐標。進一步地,塊坐標下降(block coordinate descent)指對某個子集的變數同時最小化。

7.3 Polyak 平均

Polyak 平均會平均優化演算法在參數空間訪問軌跡中的幾個點。如果 t 次迭代梯度下降訪問了點 oldsymbol{	heta}^{(1)}... 	heta^{(t)} ,那麼Polyak平均演算法輸出的是:

hat{	heta}^{(t)} = frac{1}{t}sum_i 	heta^{(i)}

在梯度下降應用於某些問題,比如凸問題時,這種方法具有較強的收斂保證。當Polyak平均於非凸問題時,通常會用指數衰減計算平均值:

hat{	heta}^{(t)} = alpha hat{	heta}^{(t-1)} + (1-alpha) 	heta^t

7.4 監督預訓練

有時如果模型太過複雜難以優化或者任務非常困難,直接訓練模型的挑戰非常之大,有時訓練一個較為簡單的問題,然後使得模型逐漸複雜會更有效。訓練模型先求解一個簡化的問題,然後轉移到最後的問題,有時也會更有效些。這種在訓練最終模型之前訓練簡單模型求解簡化問題的方法統稱為預訓練(pretraining)

貪心演算法(greedy algorithm)將問題分解為許多部分,然後獨立地在每個部分求解最優值,往往結合各個最佳部分並不能保證得到一個最優解,但是這種貪心演算法計算比求解聯合最優解的演算法高效很多,並且貪心演算法的結果即使不是最優解,往往也是可以接受的。貪心演算法之後可以緊隨一個精調(fine-tunning)階段,聯合優化演算法搜索全問題的最優解。所以,使用貪心演算法初始化聯合優化演算法,可以極大地加速演算法,並提高尋找到的解的質量。

預訓練演算法,特別是貪心預訓練,將監督學習問題分解成其他簡化的監督學習問題的預訓練演算法,叫做貪心監督預訓練(greedy supervised pretraining)。這種方法有助於更好的指導深層結構的中間層的學習,且在一般情況下,預訓練對於優化和泛化都是有幫助的,它實際上擴展了遷移學習的想法。

7.5 設計有助於優化的模型

改進優化的最好方法並不總是改進優化演算法,相反,在深度學習中的許多改進來自設計易於優化的模型。在實踐中,選擇一族容易優化的模型比使用一個強大的優化演算法更重要。神經網路學習在過去30年的大多數進步主要來自改變模型族,而並非改變優化過程。

現代神經網路的設計選擇體現在層之間的線性變換,幾乎處處可導的激活函數,和大部分定義域都有明顯的梯度,特別是創新的模型,比如LSTM,整流線性單元和maxout單元都比先前的模型,比如sigmoid單元的深度網路,使用更多的線性函數,使得這些模型都有簡化優化的作用。現代神經網路的設計方案旨在使其局部梯度信息合理地對應著移動向一個遙遠的解。

7.6 延拓法和課程學習

許多優化的挑戰都來自於代價函數的全局結構,不能僅僅通過局部更新方向上更好的估計來解決。解決這個問題的主要方法是嘗試初始化參數到某種區域內,該區域可以通過局部下降很快連接到參數空間中的解。

延拓法(continuation method)是一族通過挑選初始點使得優化更容易的方法,以確保局部優化花費大部分時間在表現良好的區域。延拓法的基本思想是構造一系列具有相同參數的目標函數,這些函數難度逐漸提高。傳統上,延拓法主要被用來客服局部極小值的問題,它被設計用來在有很多局部極小值的情況下,求解一個全局最小點。這些連續的方法會通過「模糊」原來的代價函數來構造更容易的代價函數,有些非凸函數在模糊之後就變成了近似凸函數,而且這種模糊保留了關於全局極小值的足夠信息以供演算法學習。儘管局部極小值問題已不再是神經網路優化的主要問題了,延拓法仍然有所幫助。

Bengio 提出被稱為課程學習(curriculum learning)或者塑造(shaping)的方法也可以被解釋為延拓法。課程學習基於規劃學習過程的想法,首先學習簡單的概念,然後逐步學習依賴於這些簡單概念的複雜概念。比如:教師通常會先展示更容易更典型的實例給學生,然後慢慢過渡到複雜的實例,在人類教學上,課程學習的策略比基於樣本均勻採樣的策略更為有效。

結尾

本系列星小環AI讀書會——深度學習於2017年8月28日開始,每周三晚上7點至9點,在星小環AI讀書會微信群裡面直播。該群接納深度學習書籍的答疑討論,不過小環AI-er工作時間會響應滯後。

怎麼入群?歡迎評論區留言微信號申請入群,評論區不會公開,小環工作人員會聯繫你,審核並邀請入群。

沒有入群的也可以持續關注本系列,每周會更新讀書會內容和代碼。

歷史文章

星小環的AI讀書會—深度學習系列01開篇

星小環的AI讀書會—深度學習系列02數學基礎

星小環的AI讀書會—深度學習系列03機器學習基礎與實踐

星小環的AI讀書會—深度學習系列04深度前饋網路

星小環的AI讀書會—深度學習系列05深度學習中的正則化

《深度學習》中譯版讀書筆記:GitHub項目等你來Fork&Commit


推薦閱讀:

相比人工電銷、智能電話機器人的優勢在哪裡
北大AI公開課報名 | 曠視首席科學家孫劍:計算機視覺的變革與挑戰
人工智慧爆紅,能否成為聯想轉型的一支奇兵?
人工智慧會毀滅人類嗎?
何愷明團隊計算機視覺最新進展:從特徵金字塔網路、Mask R-CNN 到學習分割一切

TAG:深度學習DeepLearning | 人工智慧 |