Optimization algorithms
Last updated
Was this helpful?
Last updated
Was this helpful?
當 training set 非常大,例如有 m = 5000000 筆時
Batch gradient descent 需要跑完所有 m 才能進行一次下降
Mini-batch gradient descent 從 m 中取出一批一批 training set
假設每 1000 筆一批
那就可以執行 5000 次下降
全部 5000 筆執行完一次,稱為 1 epoch
前 1000 筆用 表示,
最後 1000 筆就是
每次執行的 gradient descent 和 batch 時一模一樣
執行 5000 次完還可以重複進行,直到 converge
執行多次 epoch
Batch 和 Mini-Batch 的 cost per iteration 如下
Mini-batch size 也是一個需要經驗的 hyperparameter
當 size = m 時
就是原本的 Batch gradient descent
當 size = 1 時
稱為 Stochastic gradient descent
每讀一筆 training set 就做一次 gradient descent
Batch Gradient Descent
對整個 m 進行一次 gradient descent
下降幅度較大,很穩定往最小值移動
每個 iteration 時間很長,訓練過程很慢
Stochastic Gradient Descent
速度很快
但完全沒享受到 vectorization 的加速優勢
永遠不會 converge,會在最小值周圍移動
可以用 learning rate decay 解決
Mini-Batch
將兩者優點合併,但需要找出適合的 batch size
若 m 較小,如 可以考慮直接使用 batch gradient descent
若 m 較大,通常使用 作為 batch size 較好
符合電腦 memory 儲存方式
另外,size 一定要定義為 CPU/GPU 裝的下的大小
在實作一些比 gradient descent 還要棒的 optimization algorithm 前
需要先學會使用 Exponentially Weighted Averages
這是一種用於分析移動平均的算法、像天氣、股票等一連串資訊
要試著減緩短期波動、反映長期趨勢
例如上圖是倫敦一整年的溫度變化圖
我們想算出他的移動平均 (紅線)
我們定義 為前一天算完的平均 ()
定義 為每一天的溫度
我們可以用以下算法算出紅線
可以將以上循環定義為一個簡單公式
把 想成是 天的溫度
所以 是一個 weight,在上面例子是 0.9
代表每次得到的 是平均前 10 天的溫度
若設定
每次得到的 就是平均前 50 天的溫度
設定
得到 為平均前 2 天的溫度
所以 越小,代表平均越少前面天數,就會改變的越激烈
所以綠線就是平均前 50 天所產生的線 ()
黃線則是平均前 2 天 ()
我們這目標是在不同分析中找到類似紅色的線
我們設定 ,可以計算出
然後把計算到 的值攤開
因為每個 代表第 i 天的真實溫度
每個 前方的 稱為 Bias correction
所有的 Bias correction 加總會接近或等於 1
而真實溫度會隨著 Bias correction 不斷被降低 (被無視)
上面這個公式代表當 時
10 天後的溫度在乘上 bias correction 後,已經下降到原本的 1/3 左右
所以越往後的溫度根本等於沒有用一樣
最後,在計算 exponentially weighted averages 只需要一行程式碼
並且只需要一個儲存 v 的 memory 位置
因為不需定義所有的 v,只需對同一個 v 進行運算更新即可
雖然不會比你直接計算前 10 天、50 天的平均還要精準
但他只需要一行代碼、而且佔用非常少 memory、效率極高
實際上會因為 從 0 開始
所以
前項完全被消掉,因此第一個 v 僅為當天溫度的 () 倍
會產生紫色線一樣慢熱的狀況
我們可以修改 為以下公式
這個修正讓 在一開始可以正常一點
而隨著 越大, 將趨近於 0,代表整個修正不再影響結果
Momentum 事實上就是對 gradient 進行 Exponentially weighted averages 的計算
並用新產生的 gradient 來更新下降
上面用一個 intuition 解釋
藍線為一般的 gradient descent
有一些不往最小值移動的 oscillation
紫線為 learning rate 特別大的 gradient descent
oscillation 更大,甚至會 overshoot
我們的目的就是要減少上下擺動的幅度
並且維持甚至增加往最小值移動的幅度
紅線的部分
所以 gradient descent with momentum 的實作如下
其中 就是計算 exponentially weighted averages 的方法
而 跟 一樣,是一個 hyperparameter
當 ,就等於一般的 gradient descent
通常會設置 ,會很好的得到紅線的效果
momentum 不需要修正 bias correction
因為通常移動十次左右,就已經是不錯的移動平均
RMSprop 全名為 Root-Mean-Square Propagation
我們假設 和 是主要影響 oscillation 的 parameters
而 是影響上下擺動較嚴重的 parameter
我們先來計算 RMSprop
為了跟 momentum 區分,RMSprop 中的 改為
因為 較小,所以用 計算的 也會較小
那麼更新 時, 在分母,算出來的 就適中
而 較大,所以用 計算的 就會較大
那麼更新 時, 在分母較大,算出來的 就會變小
就可以抑制上下的 osciilation
另外在分母加上 ,是為了防止分母太小,導致數值不穩定
通常為 10e-8
這裡只是舉 為影響上下擺動嚴重的 parameter
實際例子可能為 是影響上下擺動的原因
而 是不影響的
也是一個 hyperparameter
Adam 的全名為 Adaptive Moment Estimation
Adam 將 momentum 和 RMSprop 融合在一起,得到更好效果
以下是 Adam 算法
初始化以下參數
在每個 itetation t 進行計算
在 momentum 部分的 用 表示
在 RMSprop 部分的 用 表示
接著在 Adam,要對這四個參數進行 bias correction adjustment
最終更新參數
以上就是整個 Adam 算法
在這個算法中出現非常多 hyperparameters
要怎麼設置以下一一介紹
: learning rate,需要自己慢慢找到一個合適的
: momentum 使用到的像 exponentially weighted averages 的 weight
常用的設定為 0.9
: RMSprop 所使用到的 ,一樣是由 exponentially weighted averages 而來
Adam 作者建議設定為 0.999
: 不重要,用預設的 10e-8 即可
通常不太需要去修改調整
若使用固定 的 mini-batch,那麼 gradient descent 幾乎不會準確 converge
gradient descent 將會在最小值周圍擺動
為此我們可以讓 隨著時間慢慢減少
一開始 較大,幫助我們跨大步伐
最終 變小,幫助我們在最小值收斂
最常用的 learning rate decay 公式如下
是初始的 learning rate
k epoch
代表所有 mini-batch 全跑過 k 遍
decay-rate
是一個 hyperparameter
假設我們設計
那 將會隨著跑過所有 mini-batch 的次數而下降
Epoch
1
0.1
2
0.067
3
0.05
4
0.04
...
...
Exponentially Decay
Discrete staircase
Manual decay : Only small num training set
在 machine learning 時,我們對梯度接近 0 的想像都是 local optima
圖面上很多凹點,然後你隨便掉進一個凹點就出不來
但在 deep learning 中,你的維度變的非常大
通常會遇到梯度接近 0 的地方是 saddle point
所以在大型的 nn、有著大量參數、較高維度時
困在 local optima 的情況是不太可能的
所以 deep learning optimization 的問題不是 local optima 而是 plateaus
這個 saddle point 或者 plateaus 會使得 learning 速度變慢
所以才會不斷的推出新的 optimization algorithm
Momentum, RMSprop, Adam, ...
這些算法能夠加速離開這些梯度接近 0 的點
甚至找出更棒的 optimization algorithm 是 deep learning 的挑戰之一