首先說明公式的寫法
上標代表了一個樣本,下標代表了一個維度;
然后梯度的維度是和定義域的維度是一樣的大小;
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-l1(naive) 是用次梯度
缺點 不能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。這種對應的就是 sempre的 nonlzay的情況:
Params.opts.l1Reg = "nonlazy" will reduce the sizes of all parameter weights for each training example, which takes a lot of time.
Adagrad如何計算梯度呢?