更一般的,损失函数往往都是 C ( v 1 , v 2 , . . . , v n ) C(v_1,v_2,...,v_n) C(v1,v2,...,vn)的形式,其中 v i ( i = 1 , 2 , . . . , n ) v_i (i=1,2,...,n) vi(i=1,2,...,n)是模型的参数
但损失函数仅仅是给出了当前模型优劣程度的一个定量表达,这对于指导我们改进模型,提高拟合程度没有直接帮助。梯度下降算法则是希望利用损失函数 C ( w , b ) C(w,b) C(w,b),寻找模型参数 w w w和 b b b的更新方向,以极小化损失函数为目标,达到提高模型精确程度的目的。而参数更新一般都有如下公式:
v i ← v i − η ∂ C ∂ v i v_i←v_i-\eta\frac{\partial C}{\partial v_i} vi←vi−η∂vi∂C
不失一般性,将损失函数看做是关于向量 v = ( v 1 , v 2 , . . . , v n ) v=(v_1,v_2,...,v_n) v=(v1,v2,...,vn)的函数 C ( v ) C(v) C(v),则损失函数在当前模型参数 v 0 v_0 v0附近有泰勒展开
C ( v ) = ∑ x = 0 ∞ ( v − v 0 ) n n ! C ( n ) ( v 0 ) C(v)=\sum_{x=0}^\infty\frac{(v-v_0)^n}{n!}C^{(n)}(v_0) C(v)=x=0∑∞n!(v−v0)nC(n)(v0)
那么损失函数的一阶展开有如下形式
C ( v ) = C ( v 0 ) + ( v − v 0 ) C ′ ( v 0 ) C(v)=C(v_0)+(v-v_0)C'(v_0) C(v)=C(v0)+(v−v0)C′(v0)
可以看出,我们希望损失函数变小,也就意味着希望在 v 0 v_0 v0附近找到一个点 v v v,使得 C ( v ) < C ( v 0 ) C(v)
记向量 a ⃗ = v − v 0 \vec a = v-v_0 a =v−v0, b ⃗ = C ′ ( v 0 ) \vec b=C'(v_0) b =C′(v0),若要使得以上不等式成立并且值最小(趋向于负数),则有 ∣ ∣ a ⃗ ∣ ∣ × ∣ ∣ b ⃗ ∣ ∣ c o s α < 0 ||\vec a||\times||\vec b||cos\alpha<0 ∣∣a ∣∣×∣∣b ∣∣cosα<0,即 a ⃗ \vec a a 和 b ⃗ \vec b b 的方向相反时成立。那么我们可以用 b ⃗ \vec b b 来表示 a ⃗ \vec a a ,即 a ⃗ = − η b ⃗ \vec a = -\eta\vec b a =−ηb
带入此等式,有 v − v 0 = − η C ′ ( v 0 ) v-v_0=-\eta C'(v_0) v−v0=−ηC′(v0),那么我们就得到了梯度下降的参数更新公式:
v = v 0 − η C ′ ( v 0 ) v=v_0-\eta C'(v_0) v=v0−ηC′(v0)