上一篇简单介绍了深度学习概念,本文将介绍最典型的神经网络模型之,深度前馈网络(deep feedforward network),也叫做前
馈神经网络(feedforward neuralnetwork)。
深度前馈网络是典型的深度学习模型,目标是近似某个函数f*,比如映射y=(x;),并学习的值,使他能够得到函数近似值。
是深度网络的基础。下面简单介绍深度前馈网络的概念,架构,算法,训练等等,其中很多都是深度网络中常用的概念。后续再具体扩展。
顾名思义,向前一层一层传递的多层网络结构,前一层的输出做为后一层的输入,中间没有反馈,没有循环。
每层计算和机器学习中逻辑回归类似,中间层(隐藏层)输出通过激活函数使得整个网络变为非线性。
优化算法比较简单,通过反向传播从最后一层往前一层一层计算梯度进行训练
其中,又输入层、中间层(也叫隐藏层,经过多个隐藏层)和输出层组成,从输入到一层一层向前传递,直到输出层。
隐藏层根据模型的大小和复杂程度可以设计成数量任意的多层,各层之间的连接一般实际表示特征的权重。
深度是指一个神经网络模型的层数,设计的层数越多,深度就越大,模型也越复杂。
神经网络之所以被成为“网络”,是因为我们可以认为这样的一个模型是由许多不同的函数复合在一起组成的,
也就是说神经网络的每一层可以认为是一个函数,加上层与层之间的连接,就表示了多个函数复合在一起的过程。
理论上,只要足够的深度可以任意近似从一个维度到另一个维度的可测函数。
隐藏单元,即中间层的输出,每个隐藏单元输出通过一个激活函数使得整个网络变得非线性。为什么要激活函数,
假如隐藏层不使用激活函数,直接一层一层w*x传递,其实最后还是一个线性函数,和单层没什么区别。知道现象模型表达
能力非常有限,这也是深度学习为什么强调非线性的原因。
常用的激活函数:
1、正流线型单元,ReLU函数。虽然整流线性函数有不可微点,但实践证明梯度下降算法表现足够好,目前隐藏单元推荐使用的函数。
2、sigmoid,(其广泛饱和性使得梯度算法非常困难,所以一般不推荐在隐藏单元中使用,当和代价函数来抵消sigmoid的饱和性是,作为输出单元使用比如sigmoid和softmax) 输出单元再介绍
3、双切函数
激活函数(Activation Function)的特点:
1、非线性: 当激活函数是线性的时候,一个两层的神经网络就可以逼近基本上所有的函数了。
2、可微: 当优化方法是基于梯度的时候,这个性质是必须的。
3、单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。
ReLU函数
f(x)= max(x,0),即小于等于0时取值0,其他情况取值x本身。
Tanh函数
f(x)=1 - e^(-2x)/ 1 + e^(-2x)
输出单元,网络模型最后一层输出。
输出单元激活函数
sigmoid 单元
Bernoulli分布 二值随机变量分布
softmax 单元
Multinoulli 具有K个不同状态的单个离散型随机变量的分布
代价函数
- 交叉熵
- 均方误差
- 绝对平均误差
交叉熵
简单讲表示两个独立概率的差异(从香浓熵和散度推理过来),
实际应用中P是以知道的结果(数据分布),Q为计算得到概率值(模型分布),那么优化目标就是把概率分布尽量靠近实际分布。
详细推理过程,后续和softmax一并再讲。
交叉熵损失函数代替均方差,使用交叉熵大大提高了sigmoid 和softmax 输出模型的性能,而均方差存在饱和和学习缓慢问题。
反向传播算法就是指前向网络基于梯度的反向传播算法。 原理是梯度下降最终的计算结果。那么先通过链式法则
(复合函数的导数)每个节点对最终结果变量的偏导数。这样就可以按梯度方向优化了。
计算方法:从最后层(输出层)往前一层一层推,i-1节点的偏导数计算基于i层的偏导数,因为计算i-1层时i层的已经计算完成。
微积分的链式法则
使用向量记法,可以等价写成
X为(x_1,x_2, … , x_m),这里∂y/∂x 是g 的n* m 的Jacobian 矩阵。
这样可以看到,变量x 的梯度可以通过Jacobian 矩阵∂y/∂x和梯度∇_(y^z )相乘来得到。反向传播算法由图中每一个
这样的Jacobian 梯度的乘积操作所组成。
梯度计算
计算方法:从最后层(输出层)往前一层一层推, i-1节点的偏导数计算基于i层的偏导数,因为计算i-1层时i层的已经计算完成。
或者用梯度描述:i-1层的梯度就是i-1层的各节点(n个)对i层梯度进行求偏导加和,刚好变成i-1层的梯度
架构设计(建模型),设计网络层宽度和深度。
深度, 已经证明带激活函数的隐藏层,只要足够的深度可以任意近似从一个维度到另一个维度的可测函数。
当然单层的网络也证明任意的近似,但函数量已超出可实现,并且可能无法正确的学习和泛化。
实践也证明,深度更深的网络比浅层网络更好的表现。即就更多简单的函数复合在一起有更好的表现
(意味着,学习更简单的表示组成的表示或者学习顺序依赖的步骤的程序, 比如先定位一个对象,然后分割他们,之后识别它)
对网络模型的深度和宽度设计不单单需要考虑其准确性,还需要考虑其训练难度、算法收敛、优化可行性等。
另外需要针对不同应用场景设计适用的模型也非常重要。在实践中,选择一族容易优化的模型比使用一个强大的
优化算法更重要。