梯度下降算法数学推导

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 (损失函数)的具体形式进一步计算偏导,再落实到代码。

梯度(数学名词)_百度百科

简单的梯度下降算法,你真的懂了吗?

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