1. 程式人生 > >關於深度學習優化器 optimizer 的選擇,你需要了解這些

關於深度學習優化器 optimizer 的選擇,你需要了解這些

在很多機器學習和深度學習的應用中,我們發現用的最多的優化器是 Adam,為什麼呢?

在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等:
https://keras.io/optimizers/

我們可以發現除了常見的梯度下降,還有 Adadelta,Adagrad,RMSProp 等幾種優化器,都是什麼呢,又該怎麼選擇呢?

本文將梳理:

  • 每個演算法的梯度更新規則和缺點
  • 為了應對這個不足而提出的下一個演算法
  • 超引數的一般設定值
  • 幾種演算法的效果比較
  • 選擇哪種演算法

優化器演算法簡述?

首先來看一下梯度下降最常見的三種變形 BGD,SGD,MBGD,
這三種形式的區別就是取決於我們用多少資料來計算目標函式的梯度,
這樣的話自然就涉及到一個 trade-off,即引數更新的準確率和執行時間。

1. Batch gradient descent

梯度更新規則:
BGD 採用整個訓練集的資料來計算 cost function 對引數的梯度:

θ=θαθJ(θ)

缺點:
由於這種方法是在一次更新中,就對整個資料集計算梯度,所以計算起來非常慢,遇到很大量的資料集也會非常棘手,而且不能投入新資料實時更新模型

我們會事先定義一個迭代次數 epoch,首先計算梯度向量 params_grad,然後沿著梯度的方向更新引數 params,learning rate 決定了我們每一步邁多大。

Batch gradient descent 對於凸函式可以收斂到全域性極小值,對於非凸函式可以收斂到區域性極小值。

2. Stochastic gradient descent

梯度更新規則:
和 BGD 的一次用所有資料計算梯度相比,SGD 每次更新時對每個樣本進行梯度更新, 對於很大的資料集來說,可能會有相似的樣本,這樣 BGD 在計算梯度時會出現冗餘, 而 SGD 一次只進行一次更新,就沒有冗餘,而且比較快,並且可以新增樣本。

缺點:
SGD 因為更新比較頻繁,會造成 cost function 有嚴重的震盪,此外SGD對噪聲比較敏感。

這裡寫圖片描述

BGD 可以收斂到區域性極小值,當然 SGD 的震盪可能會跳到更好的區域性極小值處。

當我們稍微減小 learning rate,SGD 和 BGD 的收斂性是一樣的。

3. Mini-batch gradient descent

梯度更新規則:
MBGD 每一次利用一小批樣本,即 n 個樣本進行計算, 這樣它可以降低引數更新時的方差,收斂更穩定, 另一方面可以充分地利用深度學習庫中高度優化的矩陣操作來進行更有效的梯度計算。
和 SGD 的區別是每一次迴圈不是作用於每個樣本,而是具有 n 個樣本的Batch。

超引數設定值:
n 一般取值在 50~200

缺點:
Mini-batch gradient descent 不能保證很好的收斂性,

①learning rate 如果選擇的太小,收斂速度會很慢,如果太大,loss function 就會在極小值處不停地震盪甚至偏離。

②有一種措施是先設定大一點的學習率,當兩次迭代之間的變化低於某個閾值後,就減小 learning rate,不過這個閾值的設定需要提前寫好,這樣的話就不能夠適應資料集的特點。此外,這種方法是對所有引數更新時應用同樣的 learning rate,如果我們的資料是稀疏的,我們更希望對出現頻率低的特徵進行大一點的更新

③另外,對於非凸函式,還要避免陷於區域性極小值處,或者鞍點處,因為鞍點周圍的error 是一樣的,所有維度的梯度都接近於0,SGD 很容易被困在這裡。

鞍點:一個光滑函式的鞍點鄰域的曲線,曲面,或超曲面,都位於這點的切線的不同邊。
例如這個二維圖形,像個馬鞍:在x-軸方向往上曲,在y-軸方向往下曲,鞍點就是(0,0)

這裡寫圖片描述

為了應對上面的三點挑戰就有了下面這些演算法。

[應對挑戰 1]

4. Momentum(動量法)

SGD 在 ravines 的情況下容易被困住, ravines就是曲面的一個方向比另一個方向更陡,這時 SGD 會發生震盪而遲遲不能接近極小值:

這裡寫圖片描述

梯度更新規則:
Momentum 通過加入 γvt1 ,可以加速 SGD, 並且抑制震盪

vt=γvt1+αθJ(θ)
θ=θvt
當我們將一個小球從山上滾下來時,沒有阻力的話,它的動量會越來越大,但是如果遇到了阻力,速度就會變小。
加入的這一項,可以使得梯度方向不變的維度上速度變快,梯度方向有所改變的維度上的更新速度變慢,這樣就可以加快收斂並減小震盪。

超引數設定值:
一般 γ取值 0.9 左右。

缺點:
這種情況相當於小球從山上滾下來時是在盲目地沿著坡滾,如果它能具備一些先知,例如快要上坡時,就知道需要減速了的話,適應性會更好。

5. Nesterov accelerated gradient(NAG)

梯度更新規則:
θγvt1來近似當做引數下一步會變成的值,則在計算梯度時,不是在當前位置,而是未來的位置上

vt=γvt1+αθJ(θγvt1)
θ=θvt
超引數設定值:
γ仍然取值 0.9 左右。

效果比較:
這裡寫圖片描述

藍色是 Momentum 的過程,會先計算當前的梯度,然後在更新後的累積梯度後會有一個大的跳躍。
而 NAG 會先在前一步的累積梯度上(brown vector)有一個大的跳躍,然後衡量一下梯度做一下修正(red vector),這種預期的更新可以避免我們走的太快。

NAG 可以使 RNN 在很多工上有更好的表現。

目前為止,我們可以做到,在更新梯度時順應 loss function 的梯度來調整速度,並且對 SGD 進行加速。

我們還希望可以根據引數的重要性而對不同的引數進行不同程度的更新。

[應對挑戰 2]

6. Adagrad

這個演算法就可以對低頻的引數做較大的更新,對高頻的做較小的更新,也因此,對於稀疏的資料它的表現很好,很好地提高了 SGD 的魯棒性,例如識別 Youtube 視訊裡面的貓,訓練 GloVe word embeddings,因為它們都是需要在低頻的特徵上有更大的更新。

梯度更新規則:

θt+1,i=θt,iαGt,ii+ϵgt,i

其中gt,i為:t 時刻引數 θi的梯度;Gt是個對角矩陣, (i,i) 元素就是 t 時刻引數 θi 的梯度gt,i的平方和。

Adagrad 的優點是減少了學習率的手動調節

超引數設定值:
一般 η 就取 0.01。

缺點:
它的缺點是分母會不斷積累,這樣學習率就會收縮並最終會變得非常小。

7. Adadelta

這個演算法是對 Adagrad 的改進,

Δθt=αE[g2]t+ϵgt
和 Adagrad 相比,就是分母的G換成了過去的梯度平方E[g2]t的衰減平均值。

這個分母相當於梯度的均方根 root mean squared (RMS) ,所以可以用 RMS 簡寫:

Δθt=αRMS[g]tgt

其中 E 的計算公式如下,t 時刻的依賴於前一時刻的平均和當前的梯度:

E[g2]t=γE[g2]t1+(1γ)g2t

梯度更新規則:

此外,還將學習率 α換成了 RMS[Δθ],這樣的話,我們甚至都不需要提前設定學習率了:
這裡寫圖片描述

超引數設定值:
γ 一般設定為 0.9,

7. RMSprop

RMSprop 是 Geoff Hinton 提出的一種自適應學習率方法。

RMSprop 和 Adadelta 都是為了解決 Adagrad 學習率急劇下降問題的。

梯度更新規則:
RMSprop 與 Adadelta 的第一種形式相同:

E[g2]t=0.9E[g2]t1+0.1g2t

相關推薦

關於深度學習優化 optimizer選擇需要這些

在很多機器學習和深度學習的應用中,我們發現用的最多的優化器是 Adam,為什麼呢? 在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等: https://keras.io/optimizers/ 我們可以發

關於驗證碼需要這些

使用場景 strong 兼容 logs nbsp 簽名 業務 swe yun (一)什麽是驗證碼業務id? captchaId, 驗證碼唯一標識,公開可見,用於區分不同的驗證碼使用場景,如登錄、投票、發帖等。可在易盾管理中心驗證碼業務ID管理處自行創建。2017年6月1

Spring Cloud Config 配置中心實踐過程中需要這些細節!

本文導讀: Spring Cloud Config 基本概念 Spring Cloud Config 客戶端載入流程 Spring Cloud Config 基於訊息匯流排配置 Spring Cloud Config 中的佔位符 Spring Cloud Config 倉庫最佳實踐 Spring Cloud

深度學習優化 optimizer 的原理及選擇

下面是 TensorFlow 中的優化器: 在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等,詳情: 我們可以發現除了常見的梯度下降,還有 Adadelta,Adagrad,RMSProp 等幾種優化器,都是什麼呢

深度學習優化 optimizer選擇

在很多機器學習和深度學習的應用中,我們發現用的最多的優化器是 Adam,為什麼呢?在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等: https://keras.io/optimizers/我們可以發現除了常見的梯度下降,還有 A

深度學習優化Optimizer總結-tensorflow-1原理篇

單純以演算法為論,深度學習從業者的演算法能力可能並不需要太大,因為很多時候,只需要構建合理的框架,直接使用框架是不需要太理解其中的演算法的。但是我們還是需要知道其中的很多原理,以便增加自身的知識強度,而優化器可能正是深度學習的演算法核心 官方文件所給的

【廣州服務回收】服務維護過程中需要的5個小常識

windows ron 就是 圖片 渲染 天都 驚人的 領域 其他人 大多數人認為,服務器僅僅是升級後的臺式機。但任何在數據中心工作過的人都知道,它們的差別挺大的。 盡管web服務器每天都要承擔數百萬訪問者的負載,但對於普通用戶來說,它們仍然神秘莫測。以下是關於服務器你可能

身為前端開發工程師需要的搜尋引擎優化SEO.

網站url網站建立具有良好描述性、規範、簡單的url,有利於使用者更方便的記憶和判斷網頁的內容,也有利於搜尋引擎更有效的抓取您的網站。網站設計之初,就應該有合理的url規劃。 處理方式: 1.在系統中只使用正常形式url,不讓使用者接觸到非正常形式的url。 2.不把session id、統計程式碼等不必

身為前端開發工程師需要的搜索引擎優化SEO.

ide 收藏 htm des 頻道 最適 主題 開發工程師 用戶 網站url網站創建具有良好描述性、規範、簡單的url,有利於用戶更方便的記憶和判斷網頁的內容,也有利於搜索引擎更有效的抓取您的網站。網站設計之初,就應該有合理的url規劃。 處理方式: 1.在系統中只使用正

學習 webpack 前需要的那些概念

什麼是webpack 關於什麼是webpack,一般的教程裡面都會提到webpack是一個模組化打包工作,但是很多初學者沒有模組化這個概念,所以往往在第一步就被攔住了。所以在講什麼是webpack之前,我想先講一下和模組化相關的概念。 javascript的執行環境 因

微服務架構盛行的時代需要點 Spring Boot

措辭 理由 直接 響應 con 可伸縮 角度 徹底 構建 隨著互聯網的高速發展,龐大的用戶群體和快速的需求變化已經成為了傳統架構的痛點。 在這種情況下,如何從系統架構的角度出發,構建出靈活、易擴展的系統來快速響應需求的變化,同時,隨著用戶量的增加,如何保證系統的穩定性、高可

數字貨幣交易需要這幾所海外交易所!

現在數字貨幣非常的火熱,而數字貨幣交易所作為數字貨幣交易的地方也吸引了許多人的關注,不過大部分人只知道兩三個常用的交易所,下面小編就講一下世界上最大的八個加密貨幣交易所。 1.GDAX 傳說中的G網,GDAX是Coinbase旗下的全球數字資產交易所,是美國第一家持有正規牌照的比特幣

進入職場之前需要這個致命弱點

這裡其實隱含了一個資訊:你們已經從學生角色慢慢進入職場,或即將成為一個職場新人。 首先要明確思維本身無對錯高下,重要的是:不同的場合或不同的身份,應該用不同的思維去解決問題。正因如此,你才會被要求具備職場思維。 學生思維和職場思維最大的區別就是——職場從現實利益出發,看重最後結果

資料分析師:大資料建模需要九大形式

“沒有免費的午餐”理論已經應用於機器學習領域,無偏的狀態好於(如一個具體的演算法)任何其他可能的問題(資料集)出現的平均狀態。沒有一個演算法適合每一個問題。但是經 過資料探勘處理的問題或資料集絕不是隨機的,也不是所有可能問題的均勻分佈,他們代表的是一個有偏差的樣本,那麼為什麼要應用NFL的結論?答案涉及到上

短視訊sdk:選擇一個靠譜的短視訊SDK 需要這些

關於選哪家公司這個問題。其實短視訊SDK選型考慮的東西還蠻多的。如果只是看下功能列表和商業版授權價格,不考慮開發易用性,最後還是要吃苦頭走很多彎路的。 那麼如何選擇短視訊 SDK ?站在 App 開發者的角度列了下面這份自檢清單供大家參考 1. 包體是否

安裝 Linux 與 Windows 10 雙系統需要的一切

該選Windows 10還是Linux Mint?魚與熊掌當然可以兼得,但咱們得掌握點小技巧才能順利搞定。 Windows 10絕不是唯一一款值得我們安裝在自己計算機之上的免費作業系統。Linux只靠一塊U盤就能順利執行,而且完全無需對現有系統作出任何修改。當然,如果大家打

入坑幣圈需要的數字貨幣錢包那些事兒

問題 strong fff 區塊 重置密碼 單詞 cto 而是 oss 如果你剛剛入坑幣圈,正欲入手數字貨幣,別著急,先靜下心來看一看下面的內容,我猜一定會對你有所幫助。 一、什麽是數字貨幣錢包 很多人說,數字貨幣錢包就是用來裝數字貨幣的,通俗來講這樣理解沒有問題,但實際上

小白到大神需要的 sqlite 最佳實踐

本文微信公眾號「AndroidTraveler」首發。 背景 本文是對一篇英文文件的翻譯,原文請見文末連結。 併發資料庫訪問 假設你實現了自己的 SQLiteOpenHelper。 public class DatabaseHelper extends SQLiteOpenHelper { ... } 現在

關於redis需要的幾點!

一、關於 redis key: 1、是二進位制安全的,也就是說,你可以使用任何形式的二進位制序列來作為key,比如一個string,或者一個jpg圖片的資料,需要說明的是,空字串也是一個有效的key。 2、不建議使用過長的key,影響記憶體佔用及資料查效能,對於過長的key,可以通過hash(例如SHA1)處

想考資料庫工程師?需要這些

資料庫工程師是軟考的中級考試,相信很多想要從事這方面工作的人都會考取軟考的資料庫工程師,那麼真的要考這個證書,都要了解一些什麼呢?今天小編來給大家總結一下 1、成為一名合格的資料庫工程師需掌握哪些知識技能呢? 一、資料庫應用系統分析及規劃:1.軟體工程與軟體生命週期。 2.資料庫系統生命