# 梯度下降算法

两个隐藏层的神经网络(输入层+隐藏层+输出层),MultiLayer Perceptions(MLP):实际是sigmoid neurons,不是perceptions(0、1取值)

图片名称

# 实例

利用梯度下降算法结合神经网络识别手写数字MNIST数据集:

  • 训练数据集:60000张图片
  • 测试数据集:10000张图片

输入为每一张图片(28*28)中的784个像素点,每个值代表图片中一个像素值

如果输入的某个图片是数字6,则期待的理想输出应该为

y(x)=(0,0,0,0,0,0,1,0,0,0)T:y(x) = (0,0,0,0,0,0,1,0,0,0)^T:

# 目标函数

首先要确定一个目标函数,将代价函数作为目标函数
Cost function(loss function, objective function)目标函数:

C(w,b)=12nxy(x)a2C(w,b) = \frac{1}{2n}\sum_x||y(x)-a||^2

其中:

  • C:costC:cost
  • w:weightw:weight权重
  • b:biasb:bias偏向
  • n:n:训练集实例的个数
  • x:x:输入值
  • a:a:输出值
  • v:||v||:向量的lengthfunctionlength \quad function

因此需要C(w,b)C(w,b)越小越好,输出的预测值和真实值的差距越来越小,因此目标是最小化C(w,b)C(w,b)

# 梯度下降

最小化问题可以用梯度下降(gradient descent)算法解决

图片名称

# 核心思想

对于一个单一变量xx的曲线,要找到这个曲线的最低点的x0x_0坐标,可以从曲线上的任何一点开始,去求曲线在该点的斜率,然后用该点的xx坐标减去斜率(可以尝试一下,无论是在最低点的左边还是右边,这样都可以不断靠近最低点,因为当xx大于x0x_0时,斜率是正的;当xx小于x0x_0时,斜率是负的),在逼近x0x_0的过程中,斜率的值也会不断减少,当达到最低点的时候,斜率正好为零,不会再发生变化,所以用斜率(梯度)来做为迭代过程的调节因子实在是很合适。

当函数存在多个变量时,构成的是高维的空间曲面,这时同样要去找到这个最低点,如下图所示:

图片名称

此时,要进行估计wkw_kblb_l的值,就需要求偏导数

wkwk=wkηCwkw_k \rightarrow w^{'}_{k} = w_k - \eta \frac{\partial C}{\partial w_{k}}

blbl=wkηCblb_l \rightarrow b^{'}_{l} = w_k - \eta \frac{\partial C}{\partial b_{l}}

不断迭代更新权重weightweight和偏向biasbias,最终找到wwbb,使得目标函数最小。

有几点需要注意:

  • 最终可能达到局部最优而不是全局最优(与初始点的选取有关)
  • 目标函数必须是凸函数(就是碗状的,有最低点)
  • 学习率(斜率)会自动减小

# 梯度是函数最快上升的方向

根据泰勒展开式

f(x)=f(x0)+(θθ0)f(θ0)f(x) = f(x_0) + (\theta - \theta_0) \nabla f(\theta_0)

其中θθ0\theta - \theta_0代表了步进的信息(包括方向和大小),是一个矢量,因此当从x0x_0前进时,要得到最大的前进值,当且仅当这个前进方向与f(θ0)\nabla f(\theta_0)(也就是当前值的梯度方向)相同的时候,此时

ab=abcosθ=ab\vec a \cdot \vec b = |a| \cdot |b| cos \theta = |a| \cdot |b|

取到最大值。(此时两个矢量的方向相同)

因此梯度方向是函数上升最快的方向,梯度方向的反方向是函数下降最快的方向,因此用梯度下降法。