1.1 方向导数
方向导数:类比于函数的偏导数是函数沿座标轴方向的变化率,方向导数是函数沿某一射线方向的变化率。
定理:如果函数 f(x,y) 在点 P0(x0,y0) 可微分,那么函数在该点沿任一方向 l 的方向导数存在,且有
∂l∂f∣∣∣∣(x0,y0)=fx(x0,y0)cosα+fy(x0,y0)cosβ
其中 cosρ 和 cosβ 是方向 l 的方向余弦。
1.2 梯度
梯度:梯度是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(梯度的方向)变化最快,变化率最大(为梯度的模)。
定义:设二元函数 z=f(x,y) 在平面区域D上具有一阶连续偏导数,则对与于每一个点 P(x,y) 都可定出一个向量 {∂x∂f,∂y∂f}=fx(x,y)i+fy(x,y)j ,该函数就称为函数 z=f(x,y) 在点 P(x,y) 的梯度,记作 gradf(x,y) 或 ∇f(x,y) ,既有:
gradf(x,y)=∇f(x,y)={∂x∂f,∂y∂f}=fx(x,y)i+fy(x,y)j
1.3 梯度下降算法
梯度下降算法针对的是最小优化问题(即求最小值问题),目的是使目标函数沿最快路径下降到最小值。
通俗的解释,是模拟下山,每次沿着当前位置最陡峭最易下山的方向前进一小步,然后继续沿下一个位置最陡方向前进一小步。这样一步一步走下去,一直走到觉得我们已经到了山脚。
虽然这样很好理解,但这只是给不懂梯度下降算法的小白讲的形象比喻,最终要落实到算法上代码上,具体的过程是怎么样的呢?还得靠数学推导。
算法作用于损失函数(也称目标函数、代价函数、误差函数),是为了找到使损失函数取最小值的权重(w)和偏置(b)。
设损失函数为 l(x,w,b,y) ,要寻找最优的 w 和 b ,为便于计算,抽象出函数描述 f(w,b) ,这里 f=l ,只是描述形式不同。同时设 θ=(w,b)T ,T 为转置符号,此时 θ 是一个二维列向量。
则损失函数为 f(θ),将其进行一阶泰勒展开,得:
f(θ)≈f(θ0)+(θ−θ0)⋅∇f(θ0)
为什么要一阶泰勒展开呢,因为这样可以“以直代曲”,数学术语叫“局部线性近似”,就是在很小的区间内,直线与曲线近似重合,对曲线不易做的计算,可以对直线计算作为代替。
θ−θ0 就是这个很小的区间,可以表示为 Δθ ,但它仍然是一个矢量,将其分解为模和单位向量的形式,即长度和方向的形式:
Δθ=θ−θ0=ρv这里的 ρ 就是前面下山比喻中每次走的一小步的距离,v 就是走的方向,这里注意ρ 是距离(长度),所以 ρ > 0。
则损失函数 f(θ) 的一阶泰勒展开式可描述为:
f(θ)≈f(θ0)+ρv⋅∇f(θ0)
其中 f(θ0) 是现在的损失函数的值,f(θ) 是即将要更新的损失函数的值,前面说过我们的目的是为了找到使损失函数取最小值的权重(w)和偏置(b),所以我们每次更新要保证 f(θ)<f(θ0) ,即:
f(θ)−f(θ0)≈ρv⋅∇f(θ0)<0
又因为 ρ > 0,所以有:
v⋅∇f(θ0)<0
这里注意,v 是一个向量,∇f(θ0) 是函数 f(w,b) 在点 (w0,b0) 处的梯度,它也是一个向量。要两个向量的乘积小于0,则需要他们的夹角大于90°。再次想到我们的目的,使目标函数沿 最快 路径下降到最小值,既然要最快,f(θ) 与 $ f(\theta_0)$ 的距离(即 ∣f(θ)−f(θ0)∣)就要越大越好,根据公式 f(θ)−f(θ0)≈ρv⋅∇f(θ0)<0 ,就是结果越小越好(因为结果是负值)。再回到 v 和 ∇f(θ0) 两个向量的乘积上,就是他们的夹角为180°时,v⋅∇f(θ0) 的结果最小,此时结果为:
v⋅∇f(θ0)=−∣∣v∣∣⋅∣∣∇f(θ0)∣∣=−∣∣∇f(θ0)∣∣
则 v 描述为:
v=−∣∣∇f(θ0)∣∣∇f(θ0)
带入 θ−θ0=ρv 得:
θ=θ0−ρ∣∣∇f(θ0)∣∣∇f(θ0)
因为 ρ 和 ∣∣∇f(θ0)∣∣1 都是标量,所以可以设 α=∣∣∇f(θ0)∣∣ρ ,则上式(梯度下降算法中 θ 的更新表达式)可描述为:
θ=θ0−α∇f(θ0)
这里的 α 就是我们常说的学习速率。
当实际使用该算法时,我们还需将公式还原,即将 θ=(w,b)T,θ0=(w0,b0)T 代入上式得:
(w,b)T=(w0,b0)T−α(∂x∂f,∂y∂f)T即:
w=w0−α∂w0∂fb=b0−α∂b0∂f
这个公式才是最终往代码里写的形式,只不过要结合你 f (损失函数)的具体形式进一步计算偏导,再落实到代码。
梯度(数学名词)_百度百科
简单的梯度下降算法,你真的懂了吗?