人工神经网络(梯度下降算法)

这一讲我们主要讲解了人工神经网络的训练策略包含了两个步骤
第一基于实践经验
确定神经网络的层数和每一层的神经元个数
第二用梯度下降法求解目标函数的局部极小值

回顾一下上一讲的内容
我们讲到多层神经网络的结构是由每一层
由多个神经元组成的线性结构
加上层与层之间的非线性函数构成
我们同时论证了
如果层与层之间的非线性函数是阶跃函数
那么三层神经网络可以模拟任意的决策函数
然而实际的应用中
问题是反过来的
我们并不知道决策函数是什么
而是只知道特征空间中一些训练样本和这些训练样本的标签
由于我们不知道决策函数的具体形式
因此我们也无法知道表征这个决策函数的神经网络的结构
我们只能采取另一种思路
即首先假定神经网络是某一种结构
然后将一堆训练数据输入到这个网络中去
估计这个网络带球的参数
这两个问题都很复杂
首先假定一个多层神经网络的结构
就涉及到很多不确定的因素
其中最重要的两个因素是
第一网络有多少层
第二每层神经元的个数是多少
遗憾的是
尽管人工神经网络的研究已经有了大半个世纪的历史
但是对上述两个问题却没有标准的答案
我们只能从经验上去说一下设计网络结构的两个准则
首先如果问题是简单的
例如像前面提到的分割红细胞和白细胞的问题
如图所示
在特征空间中
两个类别的区分是明显的
那么一条不是很复杂的曲线就能分开两类
对于这样简单的问题
我们设置的神经网络结构也可以简单一点
也就是说神经网络的层数以及每层神经元的个数也可以少一点
但是如果问题本身是很复杂的
例如人脸识别这样的问题
那么神经网络的层数和每层神经元的个数都需要更多一些
这样神经网络产生的非线性函数才会更加复杂
才更有可能捕捉到训练样本的变化
另一个方面
网络结构设计和训练样本的数量也有很强的相关性
我们前面讲到
算法模型的复杂度要和训练样本的复杂度相匹配
因此对于训练样本很多的情况
我们可以增加神经网络的层数和每一层神经元的个数
从而增加神经网络的复杂度
使它与训练数据的复杂度匹配
而对于训练数据很少的情况
神经网络的复杂度一般不能设置的过高
上述两个原则并没有直接回答
对于某个具体的问题
神经网络应该设置多少层
每层神经元的个数应该是多少
在实践中
我们只能通过经验来设置这些重要的参数
如果某一个模型表现得不好
我们就换一个
因此有人说神经网络参数设置不是科学
而是艺术
这也是神经网络这种方法时常被诟病的方面之一
接下来我们假定神经网络设置已经确定下来
即神经网络的层数以及每一层神经元的个数已经确定
那么在这样的前提下
我们来看一下如何优化网络中带球的参数
这里还是举两层神经网络的例子
如这张图所附的这个例子
输入x y
其中x是二维的一个训练数据
y是x的标签
我们希望改变omega和b使得标签值大y与实际的输出时
小y尽可能的接近
这里需要注意的是
大y是x的标签
由训练数据直接给定
而小y是神经网络的输出
在前一讲中
我们知道小y可以写成如下的形式
我们需要使网络输出的小y和标签大y尽可能的接近
因此可以定义目标函数为最小化
e欧米伽b等于e x y大y减小y的平方
其中e x y指的是便利训练样本及标签的数学期望
这里可以简单地看作是对所有训练样本取平均值
由于网络输出小y是omega和b的非凸函数
因此我们无法向支持向量机那样求到唯一的全局机制
我们采用梯度下降法
英文是gradient decent method
来求这个目标函数的局部机制
梯度下降法的做法分成四部
第一步随机选取omega和b的初始值
omega 0 b0
第二步应用迭代算法求目标函数的局部极值
在第n部迭代中
omega和b的更新公式如下所示
其中第n加一部的欧米伽等于第n步的欧米伽
减掉阿尔法乘以e对omega的偏导
在第n部的omega和第n部的壁上
而n加一部的b等于n步的b减掉阿尔法乘以e对b的偏导
在第n步的欧米伽和第n部的b上
我们来看一下这个公式
首先这是一个迭代的算法
它和感知器算法是同一类型
即输入训练数据不断迭代更新欧米伽和b
但是这种更新算法和感知器算法有本质的区别
我们接下来讲一下梯度下降法主要的数学意识
首先我们举一个简单的例子
假设目标函数fx是一个一维的函数
它的图像如图所示
可以看到fx有好几个极小值
我们用到的梯度下降法是求其中一个局部极小值的算法
梯度下降法的步骤在这样的一个一维函数上是这样子的
首先随机选取一个点x0
接下来我们计算fx在x0 这一点的梯度
如图所示
梯度的方向就是x0
fx 0这个点沿着曲线的切线
我们朝着梯度的负值的方向移动一小步
获得x1
即x一等于x0
减掉阿尔法df dx在x0 上的值
那么从图上直观可以看出fx一小于f x0
接下来再求fx在x一处的导数
继续上述步骤获得x2
也可以看出f x2 小于f x1
这样一直迭代下去
最后找到局部的极小值
即让fx导数等于零的谷底
这个过程就像下山一样
我们走到每一步都用导数探索一下周围哪个方向比较低
然后朝较低的方向迈进一小步
如此循环
我们一定可以下到山脚下
接下来我们把上述这种几何的直观用严格的数学来描述
首先根据泰勒公式
我们有f x0 加上德尔塔x等于fx 0
加上df dx在x0 处的值乘以德尔塔x再加上德尔塔x的高阶无穷小
如果我们将刚才那个公式
即x一等于x0 减掉阿尔法乘以df dx在x0 处的值代入上面的式子
我们可以得到fx一等于f x0
减掉阿尔法df dx在x0 处的值
经过一些推导
我们可以进一步得到f x一等于f x0
减掉阿尔法df dx在x x0 处的值的平方
加上德尔塔x的高阶无穷小
它是小于fx 0的
可见如果阿尔法是一个足够小的正数
而且df dx在x0 处不为零
那么我们将一定有fx一小于fx 0
这与前面的直观是一致的
我们把阿尔法叫做学习率
learning rate
这是人工神经网络中最重要的超参数
hyperparameter之一
我们需要小心地设置阿尔法的值
才能保证较快的收敛
当阿尔法很大的时候
也就是说我们下山的步子迈得很大
这样就很容易错过局部极值点
当阿尔法很小的时候
会出现很久都不能收敛到局部极值点的情况
只有当阿尔法设置的恰到好处的时候
才能确保快速地收敛到局部极值点
当然由于我们并不知道fx的具体形式
如何把学习率设置得恰到好处
这也是一个没有理论保障的事情
我们基于fx是一维的情况
推导了梯度下降法
我们也可以把这样的关系推广到多维的情况
例如我们要最小化二维函数一omega b
其中这里omega是一个常数
b也是一个常数
我们可以把这个函数做泰勒展开
将会得到e欧米伽零加上德尔塔
欧米伽b0 加上德尔塔b它等于e aea 0
b0 加上一对omega的偏导数
在omega 0 b0 处的值乘以thetomega
加上e对b的偏导数
在欧米伽0b0 处的值乘以德尔塔b
再加上根号欧米伽零的平方
加上b0 平方的高阶无穷小
将n加一部的欧米伽等于n步的欧米伽减掉阿尔法
e对欧米伽的偏导数在第n步的欧米伽和第n部的b上的值
同时将n加一部的b等于n步的b减掉阿尔法乘以e对b的偏导数
在第n部的黄米卡和b上的值代入上面的式子
并作相似的化解
我们将会得到一omega n加一部b n加一部等于e欧米伽n部bn部
减掉阿尔法e对欧米伽的偏导
在n部的欧米伽和n部b上值的平方
再减掉阿尔法e对b的偏导
在n部的网比卡和n部的b上的值的平方可以看到同样的道理
如果e对omega的偏导和e对b的偏导
在第n部的omega和第n部的b上不全为零
那么我们就一定有一欧米伽n加一部b n加一不小于e欧米伽n部
bn部
通过合理设置学习与阿尔法
我们也可以用上述迭代的方法找到局部的极小值
刚才的例子是基于目标函数
e是二维的情况
如果目标函数是多于二维的情况
道理也是一样的
有兴趣的同学可以自行推导一下
这一讲我们主要讲解了人工神经网络的训练策略
包含了两个步骤
第一基于实践经验
确定神经网络的层数和每一层的神经元个数
第二用梯度下降法求解目标函数的局部极小值
在下一讲中
我们将继续讲解如何用梯度下降法训练人工神经网络
本讲就到这里
谢谢同学们

发表评论

邮箱地址不会被公开。 必填项已用*标注