梯度下降算法數學推導

1.1 方向導數

方向導數:類比於函數的偏導數是函數沿座標軸方向的變化率,方向導數是函數沿某一射線方向的變化率。

定理:如果函數 f(x,y)f(x,y) 在點 P0(x0,y0)P_0(x_0,y_0) 可微分,那麼函數在該點沿任一方向 ll 的方向導數存在,且有
fl(x0,y0)=fx(x0,y0)cosα+fy(x0,y0)cosβ \left. \frac{\partial f}{\partial l} \right|_{(x_0,y_0)} =f_x(x_0,y_0)\cos\alpha + f_y(x_0,y_0)\cos\beta
其中 cosρ\cos\rhocosβ\cos\beta 是方向 ll 的方向餘弦。

1.2 梯度

梯度:梯度是一個向量(矢量),表示某一函數在該點處的方向導數沿着該方向取得最大值,即函數在該點處沿着該方向(梯度的方向)變化最快,變化率最大(爲梯度的模)。

定義:設二元函數 z=f(x,y)z=f(x,y) 在平面區域D上具有一階連續偏導數,則對與於每一個點 P(x,y) 都可定出一個向量 {fx,fy}=fx(x,y)i+fy(x,y)j\left \lbrace \frac{\partial f}{\partial x} ,\frac{\partial f}{\partial y}\right \rbrace=f_x(x,y)\vec i + f_y(x,y)\vec j ,該函數就稱爲函數 z=f(x,y)z=f(x,y) 在點 P(x,y) 的梯度,記作 gradf(x,y)gradf(x,y)f(x,y)\nabla f(x,y) ,既有:
gradf(x,y)=f(x,y)={fx,fy}=fx(x,y)i+fy(x,y)j gradf(x,y) = \nabla f(x,y)=\left \lbrace \frac{\partial f}{\partial x} ,\frac{\partial f}{\partial y}\right \rbrace=f_x(x,y)\vec i + f_y(x,y)\vec j

1.3 梯度下降算法

梯度下降算法針對的是最小優化問題(即求最小值問題),目的是使目標函數沿最快路徑下降到最小值。

通俗的解釋,是模擬下山,每次沿着當前位置最陡峭最易下山的方向前進一小步,然後繼續沿下一個位置最陡方向前進一小步。這樣一步一步走下去,一直走到覺得我們已經到了山腳。

雖然這樣很好理解,但這只是給不懂梯度下降算法的小白講的形象比喻,最終要落實到算法上代碼上,具體的過程是怎麼樣的呢?還得靠數學推導。

算法作用於損失函數(也稱目標函數、代價函數、誤差函數),是爲了找到使損失函數取最小值的權重(ww)和偏置(bb)。

設損失函數爲 l(x,w,b,y)l(x,w,b,y) ,要尋找最優的 wwbb ,爲便於計算,抽象出函數描述 f(w,b)f(w,b) ,這裏 f=lf=l ,只是描述形式不同。同時設 θ=(w,b)T\theta = (w,b)^TTT 爲轉置符號,此時 θ\theta 是一個二維列向量。

則損失函數爲 f(θ)f(\theta),將其進行一階泰勒展開,得:
f(θ)f(θ0)+(θθ0)f(θ0) f(\theta)\approx f(\theta_0)+(\theta-\theta_0)·\nabla f(\theta_0)

爲什麼要一階泰勒展開呢,因爲這樣可以“以直代曲”,數學術語叫“局部線性近似”,就是在很小的區間內,直線與曲線近似重合,對曲線不易做的計算,可以對直線計算作爲代替。

θθ0\theta-\theta_0 就是這個很小的區間,可以表示爲 Δθ\Delta \theta ,但它仍然是一個矢量,將其分解爲模和單位向量的形式,即長度和方向的形式:
Δθ=θθ0=ρv \Delta \theta=\theta-\theta_0=\rho \vec v 這裏的 ρ\rho 就是前面下山比喻中每次走的一小步的距離,v\vec v 就是走的方向,這裏注意ρ\rho 是距離(長度),所以 ρ\rho > 0

則損失函數 f(θ)f(\theta) 的一階泰勒展開式可描述爲:
f(θ)f(θ0)+ρvf(θ0) f(\theta)\approx f(\theta_0)+\rho \vec v·\nabla f(\theta_0)

其中 f(θ0)f(\theta_0) 是現在的損失函數的值,f(θ)f(\theta) 是即將要更新的損失函數的值,前面說過我們的目的是爲了找到使損失函數取最小值的權重(ww)和偏置(bb),所以我們每次更新要保證 f(θ)<f(θ0)f(\theta)<f(\theta_0) ,即:
f(θ)f(θ0)ρvf(θ0)<0 f(\theta)-f(\theta_0)\approx \rho \vec v·\nabla f(\theta_0)<0
又因爲 ρ\rho > 0,所以有:
vf(θ0)<0 \vec v·\nabla f(\theta_0)<0
這裏注意,v\vec v 是一個向量,f(θ0)\nabla f(\theta_0) 是函數 f(w,b)f(w,b) 在點 (w0,b0)(w_0,b_0) 處的梯度,它也是一個向量。要兩個向量的乘積小於0,則需要他們的夾角大於90°。再次想到我們的目的,使目標函數沿 最快 路徑下降到最小值,既然要最快,f(θ)f(\theta) 與 $ f(\theta_0)$ 的距離(即 f(θ)f(θ0)|f(\theta)-f(\theta_0)|)就要越大越好,根據公式 f(θ)f(θ0)ρvf(θ0)<0f(\theta)-f(\theta_0)\approx \rho \vec v·\nabla f(\theta_0)<0 ,就是結果越小越好(因爲結果是負值)。再回到 v\vec vf(θ0)\nabla f(\theta_0) 兩個向量的乘積上,就是他們的夾角爲180°時,vf(θ0)\vec v·\nabla f(\theta_0) 的結果最小,此時結果爲:
vf(θ0)=vf(θ0)=f(θ0) \vec v·\nabla f(\theta_0)= -||\vec v||·||\nabla f(\theta_0)||=-||\nabla f(\theta_0)||
v\vec v 描述爲:
v=f(θ0)f(θ0) \vec v=-\frac{\nabla f(\theta_0)}{||\nabla f(\theta_0)||}
帶入 θθ0=ρv\theta-\theta_0=\rho \vec v 得:
θ=θ0ρf(θ0)f(θ0) \theta=\theta_0-\rho \frac{\nabla f(\theta_0)}{||\nabla f(\theta_0)||}
因爲 ρ\rho1f(θ0)\frac{1}{||\nabla f(\theta_0)||} 都是標量,所以可以設 α=ρf(θ0)\alpha=\frac{\rho}{||\nabla f(\theta_0)||} ,則上式(梯度下降算法中 θ\theta 的更新表達式)可描述爲:
θ=θ0αf(θ0) \theta=\theta_0-\alpha\nabla f(\theta_0)
這裏的 α\alpha 就是我們常說的學習速率。
當實際使用該算法時,我們還需將公式還原,即將 θ=(w,b)Tθ0=(w0,b0)T\theta = (w,b)^T,\theta_0 = (w_0,b_0)^T 代入上式得:
(w,b)T=(w0,b0)Tα(fx,fy)T (w,b)^T=(w_0,b_0)^T-\alpha \left ( \frac{\partial f}{\partial x} ,\frac{\partial f}{\partial y} \right )^T 即:
w=w0αfw0 w=w_0-\alpha \frac{\partial f}{\partial w_0} b=b0αfb0 b=b_0-\alpha \frac{\partial f}{\partial b_0}
這個公式纔是最終往代碼裏寫的形式,只不過要結合你 ff (損失函數)的具體形式進一步計算偏導,再落實到代碼。

梯度(數學名詞)_百度百科

簡單的梯度下降算法,你真的懂了嗎?

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