精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

深度學習筆記6:神經網絡優化算法之從SGD到Adam

人工智能實訓營 ? 2018-08-24 18:31 ? 次閱讀

從前面的學習中,帶大家一起學會了如何手動搭建神經網絡,以及神經網絡的正則化等實用層面的內容。這些都使得我們能夠更深入的理解神經網絡的機制,而并不是初次接觸深度學習就上手框架,雖然對外宣稱神經網絡是個黑箱機制,但是作為學習者我們極度有必要搞清楚算法在每個環節到底都干了些什么。

今天筆者需要講的是深度學習的一個大的主題——優化算法。采用何種方式對損失函數進行迭代優化,這是機器學習的一大主題之一,當一個機器學習問題有了具體的模型和評估策略,所有的機器學習問題都可以形式化為一個最優化問題。這也是為什么我們說優化理論和凸優化算法等學科是機器學習一大支柱的原因所在。從純數學的角度來看,所有的數學模型盡管形式不一,各有頭面,但到最后幾乎到可以歸約為最優化問題。所以,有志于奮戰在機器學習和深度學習領域的各位,學好最優化,責無旁貸啊。

要說機器學習和深度學習的優化算法,梯度下降必然是核心所在。神經網絡發展至今,優化算法層出不窮,但大底是出不了梯度下降的框框架架。這一篇筆記,筆者就和大家一起學習和回顧深度學習中常用的優化算法。在前面手動搭建神經網絡的代碼實踐中,我們對于損失函數的優化采用了一般的梯度下降法,所以本篇總結就從梯度下降法開始。

梯度下降法 Gradient Descent


640?wx_fmt=png

想必大家對于梯度下降是很熟悉了,選擇負梯度方向進行參數更新算是常規操作了。話不多說,對于多層神經網絡如何執行梯度下降:

defupdate_parameters_with_gd(parameters,grads,learning_rate):
"""
Updateparametersusingonestepofgradientdescent

Arguments:
parameters--pythondictionarycontainingyourparameterstobeupdated:
parameters['W'+str(l)]=Wl
parameters['b'+str(l)]=bl
grads--pythondictionarycontainingyourgradientstoupdateeachparameters:
grads['dW'+str(l)]=dWl
grads['db'+str(l)]=dbl
learning_rate--thelearningrate,scalar.
Returns:
parameters--pythondictionarycontainingyourupdatedparameters
"""
L=len(parameters)//2#numberoflayersintheneuralnetworks
#Updateruleforeachparameter
forlinrange(L):
parameters['W'+str(l+1)]=parameters['W'+str(l+1)]-learning_rate*grads['dW'+str(l+1)]
parameters['b'+str(l+1)]=parameters['b'+str(l+1)]-learning_rate*grads['db'+str(l+1)]
returnparameters

在上述代碼中,我們傳入含有權值和偏置的字典、梯度字段和更新的學習率作為參數,按照開頭的公式編寫權值更新代碼,一個簡單的多層網絡的梯度下降算法就寫出來了。

小批量梯度下降法 mini-batch Gradient Descent

工業數據環境下,直接對大數據執行梯度下降法訓練往往處理速度緩慢,這時候將訓練集分割成小一點的子集進行訓練就非常重要了。這個被分割成的小的子集就叫做 mini-batch,意為小批量。對每一個小批量同時執行梯度下降會大大提高訓練效率。在實際利用代碼實現的時候,小批量梯度下降算法通常包括兩個步驟:充分打亂數據(shuffle)和分組組合數據(partition)。如下圖所示。

640?wx_fmt=png
shuffle
640?wx_fmt=png
partition

具體代碼實現為:

def random_mini_batches(X, Y, mini_batch_size = 64, seed = 0):
  """
  Creates a list of random minibatches from (X, Y)

  Arguments:
  X -- input data, of shape (input size, number of examples)
  Y -- true "label" vector (1 for blue dot / 0 for red dot), of shape (1, number of examples)
  mini_batch_size -- size of the mini-batches, integer

  Returns:
  mini_batches -- list of synchronous (mini_batch_X, mini_batch_Y)
  """

  np.random.seed(seed)    
  m = X.shape[1]         
  mini_batches = []  # Step 1: Shuffle (X, Y)
  permutation = list(np.random.permutation(m))
  shuffled_X = X[:, permutation]
  shuffled_Y = Y[:, permutation].reshape((1,m))  # Step 2: Partition (shuffled_X, shuffled_Y). Minus the end case.
  num_complete_minibatches = math.floor(m/mini_batch_size) 
  for k in range(0, num_complete_minibatches):
    mini_batch_X = shuffled_X[:, 0:mini_batch_size]
    mini_batch_Y = shuffled_Y[:, 0:mini_batch_size]

    mini_batch = (mini_batch_X, mini_batch_Y)
    mini_batches.append(mini_batch)  # Handling the end case (last mini-batch < mini_batch_size)
  if m % mini_batch_size != 0:
    mini_batch_X = shuffled_X[:, 0: m-mini_batch_size*math.floor(m/mini_batch_size)]
    mini_batch_Y = shuffled_Y[:, 0: m-mini_batch_size*math.floor(m/mini_batch_size)]

    mini_batch = (mini_batch_X, mini_batch_Y)
    mini_batches.append(mini_batch)  
return mini_batches

小批量梯度下降的實現思路非常清晰,先打亂數據在分組數據,需要注意的細節在于最后一個小批量所含的訓練樣本數,通常而言最后一個小批量會少于前面批量所含樣本數。

隨機梯度下降 Stochastic Gradient Descent

當小批量所含的訓練樣本數為 1 的時候,小批量梯度下降法就變成了隨機梯度下降法(SGD)。SGD雖然以單個樣本為訓練單元訓練速度會很快,但犧牲了向量化運算所帶來的便利性,在較大數據集上效率并不高。
我們可以看一下梯度下降和隨機梯度下降在實現上的差異:

# GD
X = data_input Y = labels parameters = initialize_parameters(layers_dims)
for i in range(0, num_iterations): # Forward propagation a, caches = forward_propagation(X, parameters) # Compute cost. cost = compute_cost(a, Y) # Backward propagation. grads = backward_propagation(a, caches, parameters) # Update parameters. parameters = update_parameters(parameters, grads)

# SGDX = data_input Y = labels parameters = initialize_parameters(layers_dims)
for i in range(0, num_iterations):
for j in range(0, m): # Forward propagation a, caches = forward_propagation(X[:,j], parameters) # Compute cost cost = compute_cost(a, Y[:,j]) # Backward propagation grads = backward_propagation(a, caches, parameters) # Update parameters. parameters = update_parameters(parameters, grads)

所以,從本質上看,梯度下降法、小批量梯度下降法和隨機梯度下降法,并沒有區別。唯一的區別就在于它們執行一次訓練過程所需要用到的訓練樣本數。梯度下降法用到的是全集訓練數據,隨機梯度下降則是單個樣本數據,而小批量則是介于二者之間。

帶動量的梯度下降法(momentum)

640?wx_fmt=png
正如上圖中看到的一樣,我們假設梯度下降的橫向為參數 W 的下降方向,而偏置 b 的下降方向為縱軸,我們總是希望在縱軸上的震蕩幅度小一點,學習速度慢一點,而在橫軸上學習速度快一點,無論是小批量梯度下降還是隨機梯度下降,好像都不能避免這個問題。為了解決這個問題,帶動量的梯度下降法來了。帶動量的梯度下降考慮歷史梯度的加權平均值作為速率進行優化。執行公式如下:

640?wx_fmt=png
根據上述公式編寫帶動量的梯度下降法實現代碼:

defupdate_parameters_with_momentum(parameters,grads,v,beta,learning_rate):
"""
UpdateparametersusingMomentum

Arguments:
parameters--pythondictionarycontainingyourparameters:
parameters['W'+str(l)]=Wl
parameters['b'+str(l)]=bl
grads--pythondictionarycontainingyourgradientsforeachparameters:
grads['dW'+str(l)]=dWl
grads['db'+str(l)]=dbl
v--pythondictionarycontainingthecurrentvelocity:
v['dW'+str(l)]=...
v['db'+str(l)]=...
beta--themomentumhyperparameter,scalar
learning_rate--thelearningrate,scalar

Returns:
parameters--pythondictionarycontainingyourupdatedparameters
v--pythondictionarycontainingyourupdatedvelocities
"""

L=len(parameters)//2#numberoflayersintheneuralnetworks

#Momentumupdateforeachparameter
forlinrange(L):#computevelocities
v['dW'+str(l+1)]=beta*v['dW'+str(l+1)]+(1-beta)*grads['dW'+str(l+1)]
v['db'+str(l+1)]=beta*v['db'+str(l+1)]+(1-beta)*grads['db'+str(l+1)]#updateparameters
parameters['W'+str(l+1)]=parameters['W'+str(l+1)]-learning_rate*v['dW'+str(l+1)]
parameters['b'+str(l+1)]=parameters['b'+str(l+1)]-learning_rate*v['db'+str(l+1)]
returnparameters,v

實現帶動量的梯度下降的關鍵點有兩個:一是動量是考慮歷史梯度進行梯度下降的,二是這里的需要指定的超參數變成了兩個:一個是學習率 learning_rate,一個是梯度加權參數beta。

Adam算法

Adam 全稱為 Adaptive Moment Estimation,是在帶動量的梯度下降法的基礎上融合了一種稱為 RMSprop(加速梯度下降)的算法而成的。相較于帶動量的梯度下降法,無論是RMSprop 還是 Adam,其中的改進思路都在于如何讓橫軸上的學習更快以及讓縱軸上的學習更慢。RMSprop 和 Adam 在帶動量的梯度下降法的基礎上,引入了平方梯度,并對速率進行了偏差糾正。具體計算公式如下:

640?wx_fmt=png

實現代碼如下:

def update_parameters_with_adam(parameters, grads, v, s, t, learning_rate = 0.01,
                beta1 = 0.9, beta2 = 0.999, epsilon = 1e-8):
  """
  Update parameters using Adam

  Arguments:
  parameters -- python dictionary containing your parameters:
          parameters['W' + str(l)] = Wl
          parameters['b' + str(l)] = bl
  grads -- python dictionary containing your gradients for each parameters:
          grads['dW' + str(l)] = dWl
          grads['db' + str(l)] = dbl
  v -- Adam variable, moving average of the first gradient, python dictionary
  s -- Adam variable, moving average of the squared gradient, python dictionary
  learning_rate -- the learning rate, scalar.
  beta1 -- Exponential decay hyperparameter for the first moment estimates 
  beta2 -- Exponential decay hyperparameter for the second moment estimates 
  epsilon -- hyperparameter preventing division by zero in Adam updates

  Returns:
  parameters -- python dictionary containing your updated parameters 
  v -- Adam variable, moving average of the first gradient, python dictionary
  s -- Adam variable, moving average of the squared gradient, python dictionary
  """

  L = len(parameters) // 2         
  v_corrected = {}            
  s_corrected = {}             

  # Perform Adam update on all parameters
  for l in range(L):
    v["dW" + str(l+1)] = beta1 * v["dW" + str(l+1)] + (1 - beta1) * grads['dW'+str(l+1)]
    v["db" + str(l+1)] = beta1 * v["db" + str(l+1)] + (1 - beta1) * grads['db'+str(l+1)]    # Compute bias-corrected first moment estimate. Inputs: "v, beta1, t". Output: "v_corrected".  
    v_corrected["dW" + str(l+1)] = v["dW" + str(l+1)] / (1 - beta1**t)
    v_corrected["db" + str(l+1)] = v["db" + str(l+1)] / (1 - beta1**t)    # Moving average of the squared gradients. Inputs: "s, grads, beta2". Output: "s".
    s["dW" + str(l+1)] = beta2 * s["dW" + str(l+1)] + (1 - beta2) * (grads["dW" + str(l+1)])**2
    s["db" + str(l+1)] = beta2 * s["db" + str(l+1)] + (1 - beta2) * (grads["db" + str(l+1)])**2


    # Compute bias-corrected second raw moment estimate. Inputs: "s, beta2, t". Output: "s_corrected".
    s_corrected["dW" + str(l+1)] = s["dW" + str(l+1)] / (1 - beta2**t)
    s_corrected["db" + str(l+1)] = s["db" + str(l+1)] / (1 - beta2**t)    # Update parameters. Inputs: "parameters, learning_rate, v_corrected, s_corrected, epsilon". Output: "parameters".

    parameters["W" + str(l+1)] = parameters["W" + str(l+1)] - learning_rate * v_corrected["dW" + str(l+1)] / (np.sqrt(s_corrected["dW" + str(l+1)]) + epsilon)
    parameters["b" + str(l+1)] = parameters["b" + str(l+1)] - learning_rate * v_corrected["db" + str(l+1)] / (np.sqrt(s_corrected["db" + str(l+1)]) + epsilon)  
return parameters, v, s

除了以上這些算法,還有一些像 Adadelta 之類的算法我們沒有提到,有需要了解的同學可以自行查找相關資料。最后用一個圖來展示各種優化算法的效果:


本文由《自興動腦人工智能》項目部 凱文 投稿。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 人工智能
    +關注

    關注

    1791

    文章

    46863

    瀏覽量

    237587
  • 機器學習
    +關注

    關注

    66

    文章

    8378

    瀏覽量

    132412
  • 深度包檢測
    +關注

    關注

    0

    文章

    2

    瀏覽量

    5704
收藏 人收藏

    評論

    相關推薦

    神經網絡優化器有哪些

    神經網絡優化器是深度學習中用于調整網絡參數以最小化損失函數的重要工具。這些優化器通過不同的策略來
    的頭像 發表于 07-11 16:33 ?516次閱讀

    BP神經網絡學習機制

    BP神經網絡(Backpropagation Neural Network),即反向傳播神經網絡,是一種基于梯度下降算法的多層前饋神經網絡,其學習
    的頭像 發表于 07-10 15:49 ?458次閱讀

    深度神經網絡與基本神經網絡的區別

    在探討深度神經網絡(Deep Neural Networks, DNNs)與基本神經網絡(通常指傳統神經網絡或前向神經網絡)的區別時,我們需
    的頭像 發表于 07-04 13:20 ?679次閱讀

    深度神經網絡的設計方法

    結構的構建,還包括激活函數的選擇、優化算法的應用、正則化技術的引入等多個方面。本文將從網絡結構設計、關鍵組件選擇、優化與正則化策略、以及未來發展趨勢四個方面詳細探討
    的頭像 發表于 07-04 13:13 ?409次閱讀

    神經網絡優化算法有哪些

    神經網絡優化算法深度學習領域中的核心技術之一,旨在通過調整網絡中的參數(如權重和偏差)來最小化
    的頭像 發表于 07-03 16:01 ?458次閱讀

    神經網絡反向傳播算法的優缺點有哪些

    神經網絡反向傳播算法(Backpropagation Algorithm)是一種廣泛應用于深度學習和機器學習領域的
    的頭像 發表于 07-03 11:24 ?683次閱讀

    神經網絡反向傳播算法的作用是什么

    神經網絡反向傳播算法(Backpropagation)是一種用于訓練人工神經網絡算法,它通過計算損失函數關于網絡參數的梯度來更新
    的頭像 發表于 07-03 11:17 ?1211次閱讀

    神經網絡反向傳播算法的原理、數學推導及實現步驟

    傳播算法的原理、數學推導、實現步驟以及在深度學習中的應用。 神經網絡概述 神經網絡是一種受人腦啟發的計算模型,由大量的
    的頭像 發表于 07-03 11:16 ?678次閱讀

    神經網絡算法的結構有哪些類型

    神經網絡算法深度學習的基礎,它們在許多領域都有廣泛的應用,如圖像識別、自然語言處理、語音識別等。神經網絡的結構有很多種類型,每種類型都有其
    的頭像 發表于 07-03 09:50 ?387次閱讀

    神經網絡算法的優缺點有哪些

    的優點 自學習能力:神經網絡算法具有強大的自學習能力,能夠大量數據中自動提取特征,無需人工干預。這使得
    的頭像 發表于 07-03 09:47 ?1131次閱讀

    深度學習與卷積神經網絡的應用

    隨著人工智能技術的飛速發展,深度學習和卷積神經網絡(Convolutional Neural Network, CNN)作為其中的重要分支,已經在多個領域取得了顯著的應用成果。圖像識
    的頭像 發表于 07-02 18:19 ?810次閱讀

    基于神經網絡算法的模型構建方法

    神經網絡是一種強大的機器學習算法,廣泛應用于各種領域,如圖像識別、自然語言處理、語音識別等。本文詳細介紹了基于神經網絡算法的模型構建方法,包
    的頭像 發表于 07-02 11:21 ?456次閱讀

    深度神經網絡模型有哪些

    、Sigmoid或Tanh。 卷積神經網絡(Convolutional Neural Networks,CNN): 卷積神經網絡深度學習中最重
    的頭像 發表于 07-02 10:00 ?1170次閱讀

    如何訓練和優化神經網絡

    神經網絡是人工智能領域的重要分支,廣泛應用于圖像識別、自然語言處理、語音識別等多個領域。然而,要使神經網絡在實際應用中取得良好效果,必須進行有效的訓練和優化。本文將從神經網絡的訓練過程
    的頭像 發表于 07-01 14:14 ?397次閱讀

    詳解深度學習神經網絡與卷積神經網絡的應用

    處理技術也可以通過深度學習來獲得更優異的效果,比如去噪、超分辨率和跟蹤算法等。為了跟上時代的步伐,必須對深度學習
    的頭像 發表于 01-11 10:51 ?1917次閱讀
    詳解<b class='flag-5'>深度</b><b class='flag-5'>學習</b>、<b class='flag-5'>神經網絡</b>與卷積<b class='flag-5'>神經網絡</b>的應用