现在说说深度学习中的权重更新算法:经典算法SGD:stochastic gradient descent,随机梯度下降。
假设我们的模型就是要拟合一根直线:
那么直线的方程为:
y = ω x + b y = \omega x + b y=ωx+b
而且我们的训练集有 n n n个样本:
( x 1 , y 1 ) , . . . . ( x n , y n ) {(x_1, y_1), .... (x_n, y_n)} (x1,y1),....(xn,yn)
如图所示:
更简单一点,假设这根直线穿过原点,那么后面的常数b也没有了
我们通过图中的这些样本点去训练模型获得靠谱的 w w w。
在反向传播的基本逻辑里,首先要定义一个损失函数,损失函数其实就是预测值与真实值(训练数据)的差异,在这个例子里,我们定义的这个差异是均方误差,用公式表示就是:
l = ( y i − y i ^ ) 2 l = ({y_i} - \hat{y_i})^2 l=(yi−yi^)2
那么,联合上面两个公式可以得到:
l = w x i 2 − 2 w x i y i ^ − y i ^ 2 l = {wx_i }^2 - 2wx_i\hat{y_i} -\hat{y_i}^2 l=wxi2−2wxiyi^−yi^2
我们就是要通过这个误差去反向计算 w w w的调整量。
我们在训练的时候,一般来说都是一批数据一起调整,每次都调整也太费劲了,作为一个batch,用一个batch的样本损失的平均值来进行权重调整。
一个batch的每个样本都有一个损失:对这些损失求和,比如一个batch有m个样本
e = ∑ i m = 1 m ( ( x 1 2 + . . . + x m 2 ) ∗ w 2 + ( − 2 ∗ x 1 ∗ y 1 + . . . + − 2 ∗ x m ∗ y + m ) ∗ w + ( y 1 2 + . . . + y m 2 ) ) e = \sum_i^m=\frac{1}{m}(({x_1^2 + ... + x_m^2})*w^2 + (-2*x_1*y_1 + ... + -2*x_m*y+m)*w + (y_1^2 + ... +y_m^2)) e=i∑m=m1((x12+...+xm2)∗w2+(−2∗x1∗y1+...+−2∗xm∗y+m)∗w+(y12+...+ym2))
如果令
a = x 1 2 + . . . + x m 2 a = {x_1^2 + ... + x_m^2} a=x12+...+xm2
b = ( − 2 ∗ x 1 ∗ y 1 + . . . + − 2 ∗ x m ∗ y + m ) b = (-2*x_1*y_1 + ... + -2*x_m*y+m) b=(−2∗x1∗y1+...+−2∗xm∗y+m)
c = ( y 1 2 + . . . + y m 2 ) c = (y_1^2 + ... +y_m^2) c=(y12+...+ym2)
那么上面公式实际上就是以 w w w为变量的二次方程,图像是一个朝上的U型曲线,因为 a a a肯定大于0。那么这个二次曲线图可以如图(matplot画的图,不够细致,大概那个意思):
上面已经把模型的输出损失定义和公式列举出来了。
那么为了尽快收敛,也就是为了尽快的让 w w w能达到我们想要的目标,也就是上面这个曲线的最低处(极值),我们就会让当前的梯度(初始化可能是一个正态分布或者随机数)加上某个偏移量,那么这个偏移量是多少呢,就是对上面的值就行求导,求导也就是求梯度。
梯度的正方向是远离极值的方向,所以需要取个负号,所以也叫梯度下降。用公式表示就是:
θ = − ∂ e ∂ l = − 1 n ( a w + b ) \theta = -\frac{\partial e}{\partial l} = -\frac{1}{n}(aw + b) θ=−∂l∂e=−n1(aw+b)
我这里为了省事,把b去掉了,有兴趣的可以带入进去算一下,因为对 w w w求偏导的时候, b b b就是个常量,求完就直接等于0了。
上面公式计算出来的就是曲线当前点的梯度,或者说是切线的斜率。那么沿着斜率走多少了?也就是最终还是要求出一个 Δ w \Delta w Δw来,这就是训练中的参数学习率了,在学习率 η \eta η的情况下(可以理解成斜率上的x轴距离),权重的调整量就是:
w ^ = w + Δ w = w + η ∗ θ \hat{w}=w+\Delta{w} = w + \eta * \theta w^=w+Δw=w+η∗θ
随机是指上面的这个batch是在整个训练集随机挑选样本到batch中,这个就可以减小样本之间造成的参数更新抵消问题。