梯度下降 gradient descent
文章目錄
- 導數
- 偏導數
- 方向導數
- 梯度
- 代價函數的梯度
- 梯度下降的詳細算法
- 先決條件
- 算法過程
- 代價損失中 θ 偏導數公式推導
- 批量梯度下降(Batch Gradient Descent,BGD)
- 隨機梯度下降法(Stochastic Gradient Descent,SGD)
- 小批量梯度下降法(Mini-batch Gradient Descent,MBGD)
導數
導數反映的是函數 f(x)f(x)f(x) 在 xxx 軸上某一點處沿著 xxx 軸正方向的變化率/變化趨勢。
f′(x0)=lim?Δx→0ΔyΔx=lim?Δx→0f(x0+Δx)?f(x0)Δxf'(x_0)=\lim_{\Delta x \to 0}\frac{\Delta y}{\Delta x}=\lim_{\Delta x \to 0}\frac{f(x_0+\Delta x)-f(x_0)}{\Delta x}f′(x0?)=Δx→0lim?ΔxΔy?=Δx→0lim?Δxf(x0?+Δx)?f(x0?)?
-
f′(x)>0f'(x)>0f′(x)>0,說明 f(x)f(x)f(x) 的函數值在 xxx 點沿 xxx 軸正方向趨于增加。
-
f′(x)<0f'(x)<0f′(x)<0,說明 f(x)f(x)f(x) 的函數值在 xxx 點沿 xxx 軸正方向趨于減少。
偏導數
因為曲面上的每一點都有無窮多條切線,描述曲面函數的導數相當困難。偏導數就是選擇其中一條切線,并求出它的斜率。
- 假設 ??? 是一個多元函數。例如:
z=f(x,y)=x2+xy+y2z = f(x, y) = x^2 + xy + y^2z=f(x,y)=x2+xy+y2
-
一種求出這些切線的好辦法是把其他變量視為常數。例如,欲求出以上的曲面函數在點(1,1,3)(1, 1, 3)(1,1,3) 與 y=1y = 1y=1 平面的切線。(右圖為 y=1y = 1y=1 切面)
-
我們把變量 yyy 視為常數,過對 xxx 求導:
?z?x=2x+y{\displaystyle {\frac {\partial z}{\partial x}}=2x+y} ?x?z?=2x+y
-
得到點(1, 1, 3)的與 xOzxOzxOz 平面平行的切線的斜率為 3。
一般地,函數 f(x1,...,xn)f(x_1,...,x_n)f(x1?,...,xn?) 在點 (a1,...,an)(a_1,...,a_n)(a1?,...,an?) 關于 xix_ixi? 的偏導數定義為:
?f?xi(a1,…,an)=lim?h→0f(a1,…,ai+h,…,an)?f(a1,…,an)h{\displaystyle {\frac {\partial f}{\partial x_{i}}}(a_{1},\ldots ,a_{n})=\lim _{h\to 0}{\frac {f(a_{1},\ldots ,a_{i}+h,\ldots ,a_{n})-f(a_{1},\ldots ,a_{n})}{h}}}?xi??f?(a1?,…,an?)=h→0lim?hf(a1?,…,ai?+h,…,an?)?f(a1?,…,an?)?
方向導數
導數和偏導數的定義中,均是沿坐標軸正方向討論函數的變化率。而方向導數則是求某一點在某一趨近方向上的導數值,反映函數在特定方向上的變化率:
梯度
梯度即函數在某一點最大的方向導數,函數沿梯度方向函數有最大的變化率,梯度的值是最大方向導數的值。
利用有限差值計算梯度
對 xxx 所有維度進行迭代,在每個維度上產生一個很小的變化 hhh,通過觀察函數值變化,計算函數在該維度上的偏導數。最后,所有的梯度存儲在變量 grad 中:
def eval_numerical_gradient(f, x):""" 一個f在x處的數值梯度法的簡單實現- f是只有一個參數的函數- x是計算梯度的點""" fx = f(x) # 在原點計算函數值grad = np.zeros(x.shape)h = 0.00001# 對x中所有的索引進行迭代it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])while not it.finished:# 計算x+h處的函數值ix = it.multi_indexold_value = x[ix]x[ix] = old_value + h # 增加hfxh = f(x) # 計算f(x + h)x[ix] = old_value # 存到前一個值中 (非常重要)# 計算偏導數grad[ix] = (fxh - fx) / h # 坡度it.iternext() # 到下個維度return grad實際中用中心差值公式(centered difference formula)[f(x+h)?f(x?h)]/2h[f(x+h)-f(x-h)]/2h[f(x+h)?f(x?h)]/2h 效果較好。
代價函數的梯度
- 對于 1 維特征的假設函數:
hθ(x)=θ0+θ1?xh_{θ}(x) = θ_0 + θ_1 * xhθ?(x)=θ0?+θ1??x
- 不同參數的 θiθ_iθi? 可以擬合出不同的直線:
- 代價函數 J(θ)J(θ)J(θ) 隨參數 θiθ_iθi? 的變化而變化:
-
有 2 維特征時,代價函數表現為曲面圖。
-
優化目標函數,可以沿著 負梯度方向 不斷下降,逐步降低函數損失值,以此達到最優點:
-
θ0,θ1θ_0, θ_1θ0?,θ1? 初始值不同的時候,可能會找到不同局部最小值,這個正是 梯度下降算法 的特點。
-
一般線性回歸的代價函數都是凸函數,只有一個全局最優值,如下圖:
梯度下降的詳細算法
先決條件
-
確認優化模型的 假設函數 和 代價函數。比如對于線性回歸,假設函數表示為:
hθ(x1,x2,...xn)=θ0x0+θ1x1+...+θnxnh_\theta(x_1, x_2, ...x_n) = \theta_0x_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n}hθ?(x1?,x2?,...xn?)=θ0?x0?+θ1?x1?+...+θn?xn?
即:
hθ(X)=Xθh_\mathbf{\theta}(\mathbf{X}) = \mathbf{X\theta}hθ?(X)=Xθ其中 θiθ_iθi? 為模型參數,xix_ixi? 為每個樣本 xxx 的第 iii 個特征值。XXX 為 m?(n+1)m * (n+1)m?(n+1) 維的矩陣,mmm 代表樣本的個數,n+1n+1n+1 代表樣本的特征數,多加的1維作為偏置項。
-
對應于上面的假設函數,代價函數為:
J(θ0,θ1...,θn)=12m∑j=0m(hθ(x0(j),x1(j),...xn(j))?y(j))2J(\theta_0, \theta_1..., \theta_n) = \frac{1}{2m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y^{(j)})^2J(θ0?,θ1?...,θn?)=2m1?j=0∑m?(hθ?(x0(j)?,x1(j)?,...xn(j)?)?y(j))2
即:
J(θ)=12(Xθ?Y)T(Xθ?Y)J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y})J(θ)=21?(Xθ?Y)T(Xθ?Y)
其中 YYY 是樣本的標簽值,維度為 m?1m*1m?1
算法過程
確定當前位置的代價函數的梯度,對于 θθθ 向量,其梯度表達式如下:
??θJ(θ)=??θiJ(θ0,θ1...,θn)=1m∑j=0m(hθ(x0(j),x1(j),...xn(j))?y(j))xi(j)\frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) =\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)= \frac{1}{m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y^{(j)})x_i^{(j)}?θ??J(θ)=?θi???J(θ0?,θ1?...,θn?)=m1?j=0∑m?(hθ?(x0(j)?,x1(j)?,...xn(j)?)?y(j))xi(j)?
即:
??θJ(θ)=XT(Xθ?Y)\frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) = \mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y})?θ??J(θ)=XT(Xθ?Y)
用學習速率 ααα 乘以代價函數的梯度,得到當前位置將要下降的距離:
α??θJ(θ)=α??θiJ(θ0,θ1...,θn)\alpha\frac{\partial}{\partial\theta}J(\theta) =\alpha\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)α?θ??J(θ)=α?θi???J(θ0?,θ1?...,θn?)
同步更新所有的 θθθ,對于 θiθ_iθi?,其更新表達式如下。更新完畢后繼續轉入步驟1。
θi=θi?α??θiJ(θ0,θ1...,θn)\theta_i = \theta_i - \alpha\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)θi?=θi??α?θi???J(θ0?,θ1?...,θn?)
即:
θ=θ?αXT(Xθ?Y)\mathbf\theta= \mathbf\theta - \alpha\mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y})θ=θ?αXT(Xθ?Y)
代價損失中 θ 偏導數公式推導
代價損失函數對于 θiθ_iθi? 的偏導數計算,推導如下:
假設函數:
hθ(x1,x2)=θ0x0+θ1x1h_\theta(x_1, x_2) = \theta_0x_0 + \theta_{1}x_1hθ?(x1?,x2?)=θ0?x0?+θ1?x1?
代價損失函數:
J(θ0,θ1)=12m∑j=0m(hθ(x0(j),x1(j))?y(j))2J(\theta_0, \theta_1)=\frac{1}{2m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}) - y^{(j)})^2J(θ0?,θ1?)=2m1?j=0∑m?(hθ?(x0(j)?,x1(j)?)?y(j))2
=12m∑j=0m((θ0x0(j)+θ1x1(j))?y(j))2=\frac{1}{2m}\sum\limits_{j=0}^{m}((\theta_0x_0^{(j)} + \theta_{1}x_1^{(j)}) - y^{(j)})^2=2m1?j=0∑m?((θ0?x0(j)?+θ1?x1(j)?)?y(j))2
=12m∑j=0m((θ0x0(j)+θ1x1(j))2+y(j)2?2(θ0x0(j)+θ1x1(j))y(j))=\frac{1}{2m}\sum\limits_{j=0}^{m}((\theta_0x_0^{(j)} + \theta_{1}x_1^{(j)})^2 + {y^{(j)}}^2 - 2(\theta_0x_0^{(j)} + \theta_{1}x_1^{(j)})y^{(j)})=2m1?j=0∑m?((θ0?x0(j)?+θ1?x1(j)?)2+y(j)2?2(θ0?x0(j)?+θ1?x1(j)?)y(j))
=12m∑j=0m(θ02x0(j)2+θ12x1(j)2+2θ0x0(j)θ1x1(j)+y(j)2?2θ0x0(j)y(j)?2θ1x1(j)y(j))=\frac{1}{2m}\sum\limits_{j=0}^{m}(\theta_0^2{x_0^{(j)}}^2 + \theta_1^2{x_1^{(j)}}^2 + 2\theta_0x_0^{(j)}\theta_{1}x_1^{(j)}+ {y^{(j)}}^2 - 2\theta_0x_0^{(j)}y^{(j)} - 2\theta_{1}x_1^{(j)}y^{(j)})=2m1?j=0∑m?(θ02?x0(j)?2+θ12?x1(j)?2+2θ0?x0(j)?θ1?x1(j)?+y(j)2?2θ0?x0(j)?y(j)?2θ1?x1(j)?y(j))
代價損失函數對于θ0θ_0θ0? 的偏導數:
??θ0J(θ0,θ1)=12m∑j=0m(2θ0x0(j)2+2x0(j)θ1x1(j)?2x0(j)y(j))\frac{\partial}{\partial\theta_0}J(\theta_0, \theta_1)= \frac{1}{2m}\sum\limits_{j=0}^{m}(2\theta_0{x_0^{(j)}}^2 + 2x_0^{(j)}\theta_{1}x_1^{(j)}- 2x_0^{(j)}y^{(j)} )?θ0???J(θ0?,θ1?)=2m1?j=0∑m?(2θ0?x0(j)?2+2x0(j)?θ1?x1(j)??2x0(j)?y(j))
=1m∑j=0m(θ0x0(j)2+x0(j)θ1x1(j)?x0(j)y(j))= \frac{1}{m}\sum\limits_{j=0}^{m}(\theta_0{x_0^{(j)}}^2 + x_0^{(j)}\theta_{1}x_1^{(j)}- x_0^{(j)}y^{(j)} )=m1?j=0∑m?(θ0?x0(j)?2+x0(j)?θ1?x1(j)??x0(j)?y(j))
=1m∑j=0m(θ0x0(j)+θ1x1(j)?y(j))x0(j)= \frac{1}{m}\sum\limits_{j=0}^{m}(\theta_0x_0^{(j)} + \theta_{1}x_1^{(j)}-y^{(j)} )x_0^{(j)}=m1?j=0∑m?(θ0?x0(j)?+θ1?x1(j)??y(j))x0(j)?
=1m∑j=0m(hθ(x0(j),x1(j))?y(j))x0(j)= \frac{1}{m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}) - y^{(j)})x_0^{(j)}=m1?j=0∑m?(hθ?(x0(j)?,x1(j)?)?y(j))x0(j)?
即:
??θJ(θ)=??θiJ(θ0,θ1...,θn)=1m∑j=0m(hθ(x0(j),x1(j),...xn(j))?y(j))xi(j)\frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) =\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)= \frac{1}{m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y^{(j)})x_i^{(j)}?θ??J(θ)=?θi???J(θ0?,θ1?...,θn?)=m1?j=0∑m?(hθ?(x0(j)?,x1(j)?,...xn(j)?)?y(j))xi(j)?
即:
??θJ(θ)=XT(Xθ?Y)\frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta) = \mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y})?θ??J(θ)=XT(Xθ?Y)
批量梯度下降(Batch Gradient Descent,BGD)
- 批量梯度下降法,就是在梯度下降的每一步中,都 使用所有的樣本 來進行更新。前面的梯度下降算法過程,就是批量梯度下降法。
θi=θi?α∑j=0m(hθ(x0(j),x1(j),...xn(j))?yj)xi(j)\theta_i = \theta_i - \alpha\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}θi?=θi??αj=0∑m?(hθ?(x0(j)?,x1(j)?,...xn(j)?)?yj?)xi(j)?
-
由于我們有 mmm 個樣本,這里求梯度的時候就用了所有 mmm 個樣本的梯度數據。
-
在大規模的應用中(比如ILSVRC挑戰賽),訓練數據可以達到百萬級量級。如果像這樣計算整個訓練集,來獲得僅僅一個參數的更新就太浪費了。
隨機梯度下降法(Stochastic Gradient Descent,SGD)
隨機梯度下降法,其實和批量梯度下降法原理類似,區別在與求梯度時沒有用所有的 mmm 個樣本的數據,而是僅僅選取一個樣本 jjj 來求梯度。對應的更新公式是:
θi=θi?α(hθ(x0(j),x1(j),...xn(j))?yj)xi(j)\theta_i = \theta_i - \alpha (h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}θi?=θi??α(hθ?(x0(j)?,x1(j)?,...xn(j)?)?yj?)xi(j)?
-
隨機梯度下降法,和批量梯度下降法是兩個極端,一個采用所有數據來梯度下降,一個用 1 個樣本來梯度下降。自然各自的優缺點都非常突出。
-
對于訓練速度來說,隨機梯度下降法由于每次僅僅采用 1 個樣本來迭代,訓練速度很快,而批量梯度下降法在樣本量很大的時候,訓練速度不能讓人滿意。
-
對于準確度來說,隨機梯度下降法用于僅僅用一個樣本決定梯度方向,導致解很有可能不是最優。對于收斂速度來說,由于隨機梯度下降法一次迭代一個樣本,導致迭代方向變化很大,不能很快的收斂到局部最優解。
小批量梯度下降法(Mini-batch Gradient Descent,MBGD)
-
小批量梯度下降法是批量梯度下降法和隨機梯度下降法的折衷,也就是對于 mmm 個樣本,我們采用 xxx 個樣本來迭代,1<x<m1<x<m1<x<m。
-
小批量數據的大小是一個超參數,但是一般并不需要通過交叉驗證來調參。它一般由存儲器的限制來決定的,比如 32,64,128 等。之所以使用2的指數,是因為在實際中許多向量化操作實現的時候,如果輸入數據量是 2 的倍數,那么運算更快。
-
對應的更新公式是:
θi=θi?α∑j=tt+x?1(hθ(x0(j),x1(j),...xn(j))?yj)xi(j)\theta_i = \theta_i - \alpha \sum\limits_{j=t}^{t+x-1}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}θi?=θi??αj=t∑t+x?1?(hθ?(x0(j)?,x1(j)?,...xn(j)?)?yj?)xi(j)?
-
使用向量化操作的代碼,一次計算 100 個數據 比100次計算 1 個數據要高效很多。
總結
以上是生活随笔為你收集整理的梯度下降 gradient descent的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性回归 linear regressi
- 下一篇: 正则化方法:数据增强、regulariz