梯度下降做做優化(batch gd、sgd、adagrad )

 

首先說明公式的寫法  

上標代表了一個樣本,下標代表了一個維度;

然後梯度的維度是和定義域的維度是一樣的大小;

1、batch gradient descent:

假設樣本個數是m個,目標函數就是J(theta),因爲theta 參數的維度是和 單個樣本  x(i) 的維度是一致的,theta的維度j  thetaj是如何更新的呢??

說明下 這個公式對於  xj(i) 

需要說明,這個代表了樣本i的第j個維度;這個是怎麼算出來的,要考慮 htheta

2、SGD

可以看到 theta的一個維度j的一次更新是要遍歷所有樣本的,這很不科學

轉換爲 單個樣本更新一次,就是sgd

3、什麼是adagrad

 就是 自適應sgd,是在sgd上的改進

3.1、首先總結sgd的缺點

就是參數 theta的第t+1次更新的時候

使用theta的上一次取值-learning rate* 目標函數C在theta的上一個取值時候的梯度;-----其實梯度是一個向量既有大小也要方向(一維的時候,斜率就是梯度越大代表月陡峭 變化快)----梯度大小代表了變化快慢程度,梯度越大代表變化越快

但是learning raste eta是固定的,這會有問題的,實際希望 eta是可以動態變化的

也就是說如果梯度 steep,那麼希望eta 可以小一點,不要走那麼快嗎!如果梯度 很平滑,那麼可以走快一點

3.2、adagrad具體推理過程

 

 

4、具體實現:關於sempre中是如何做的?這裏傳入的梯度是沒有做L1之前的梯度

所以總共有三種情況,這裏的實現主要是2這種情況;

》》最早的解決L1就是sgd-l1naive)  是用次梯度

缺點  不能compact  更新所有特徵

》》sgd-l1(clipping)  做剪枝

》》sgd-l1(clipping+lazy_update)<=====>sgd-l1(cumulative penalty) 做懶更新

 

4.1、實現 sgd-l1(clipping)

首先看下 sgd-l1  nonlazy的操作,就是 做 clipping  sgd-l1(clipping),所謂cliping就是對於penalty 做拉成0的操作。

就是簡單看下  wi是正還是負,然後取值{1,0,-1},然後那個參數C是控制 the strength of regularization。這種對應的就是 semprenonlzay的情況:

Params.opts.l1Reg = "nonlazy" will reduce the sizes of all parameter weights for each training example, which takes a lot of time.

Adagrad如何計算梯度呢?

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章