task04神经网络
神经网络的的基础单元:神经元(neuron)
神经元是神经网络中的最基本的成分,其是仿造生物学中神经细胞之间传递信号的方式而设计的。在生物神经网络中,神经细胞都是相互相连的,当一个神经元接收到其它神经元发送的化学物质时,其会判断神经元的电位是否超过阈值。如果超过了,该神经元将会被激活,并向其它神经元发送化学物质。
与此类似,机器学习中的神经元接收来自 n 个其它神经元传递过来的输入信号,这些输入数据通过加权计算之后,神经元将会判断其是否超过神经元阈值。如果超过阈值,神经元将被激活,并通过“激活函数”(activation function)产生神经元的输出。
神经元的初步组合:感知机和多层网络
将许多个神经元按一定的层次结构连接起来,就得到了神经网络,而不同的组合形式将生成不同的神经网络。
-
感知机(perceptron)是早期的神经网络组合形式,由输入层和输出层两层神经元组成。因为感知机只拥有一层功能神经元(functional neuron)-输出层,其学习能力有限,在处理线性可分问题(如逻辑与、非、或运算)上效果很好,但在非线性可分问题(逻辑异或)上无法求得合适解。
-
多层网络
要解决非线性可分问题,需要考虑使用多层功能神经元,即在输入输出层之外再加入中间层,这个中间层也叫隐含层。隐含层可以是一到多层,当隐含层很多时,这时的神经网络就是深度神经网络。
多层网络的学习算法:误差逆传播算法(error BackPropagation,简称BP算法)
多层网络学习算法的目标是通过调整网络中的权重和阈值使得神经网络模型的泛化误差最小(其实每一种机器学习算法的中心思想都是一致的,这在我们第二章的学习中已经了解到了,设定一个模型/算法,用训练数据进行训练,然后用测试数据进行测试,以找到泛化性能最高的模型结构和参数)。
BP算法也是一样的,其目标是要最小化训练集 D 上的累计误差。对每个训练样例,BP算法执行以下操作:先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差,再将误差逆向传播至隐层神经元;最后根据隐层神经元的误差来对连接权和阈值进行调整。该循环重复进行直到达到停止条件(比如训练误差小于一定的值)
如何设置隐含层神经元的个数仍是个未决问题,实际应用中通常靠“试错法”(trial-by-error)调整。
由于神经网络具有强大的表示能力,BP神经网络容易遭遇过拟合。目前有两种策略常用来缓解神经网络过拟合现象:
-
早停(early stopping):将数据分成训练集和验证集的策略,训练集用来计算梯度、更新权值和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练。
-
正则化(regularization):其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,这样的话训练过程将会偏好比较小的连接权和阈值,使网络输出更加“光滑”,从而对过拟合有所缓解。
学习的参数是否是最优解
神经网络的学习算法是根据误差的导数来对参数进行调优的过程。在数学上,导数值代表的是一个函数的斜率,是一种倾向性,所以以目标的负梯度方向对参数进行调整会使得误差变小。
当梯度为零时,此时的误差达到了一个极值,即其误差函数值小于邻点的误差函数值。但是这个极值只可能是一个局部极小值,而并不一定是全局极小值。我们可以根据下图来理解一下局部极小和全局极小之间的关系:
并没有很好的办法跳出局部最优,传统方法有通过尝试不同参数的神经网络,模拟退火或者是随机梯度下降。
这些都是启发式方法,没办法保证寻优
PS 在这里想到一个很有意思的东西,曾经我国学者郑权和张连生老师做过关于积分水平集的方法寻找全局最优,不知是否可以尝试。