经过前面几章关于应用数学和机器学习的基础知识之后,本章开始正式进入实践篇。首先第六章来学习一下深度前馈神经网络。
一些概念
深度前馈神经网络(deep feedforward network):简单的来讲是用许多不同的函数复合在一起,构成一个有向无环图,同时,模型中的输出和模型自身不存在反馈。如图所示:
隐藏层(hidden layer):除了输入层和输出层之外其他层,都称之为隐藏层。
激活函数(activation function):用于计算一个神经元输入输出关系的函数,称之为激活函数。常用的激活函数有阶越函数、Sigmoid函数和ReLu函数。
基于梯度的学习
神经网络的非线性导致大多数损失函都变得非凸。但是,用于非凸损失函数的随机梯度下降不保证收敛性,并且对参数的初始值很敏感。因而对于前馈神经网络,将所有的权重值初始化为小随机数是很重要的。偏置则可以初始化为零或者小的正值。本章后面重点通过方向传播算法来求得梯度。
代价函数:大多数现代的神经网络使用最大似然来训练。这意味着代价函数就是负的对数似然,它与训练数据和模型分布间的交叉熵等价。
学习条件统计量:使用最小化均方误差代价函数(L2)将得到一个函数, 它可以用来对每个 x 的值预测出 y 的均值。使用L1的代价函数将得到一个函数可以对每个 x 预测 y 取值的中位数。可惜均方误差和平均绝对误差在基于梯度的优化方法是往往效果不佳。一些饱和的输出单元当结合这些代价函数的时候,会产生非常小的梯度。所以,交叉熵代价函数比较受欢迎。
用于高斯输出分布的线性单元:给定特征 h,线性输出单元层产生一个向量 yˆ = W⊤h + b,线性输出层经常被用来产生条件高斯分布的均值 。
常见的输出单元:
用于 Bernoulli 输出分布的 sigmoid 单元:以下公式中σ(x) = 1/(1+ e ^-x)
用于 Multinoulli 输出分布的 softmax 单元:
还有,其他混合输出单元……
常见的隐藏单元:
修正线性单元(rectified linear unit):使用激活函数g(z) = max{0,z}定义的线性单元称为整体线性单元。也叫Relu。书中使用它解决来实现XOR问题。Relu激活函数如下:
渗漏整流线性单元:g(z, α)= max(0, z) + αmin(0, z), a是个很小的数,如:0.01
maxout 单元(maxout unit):
双曲正切激活函数单元(Hyperbolic Tangent):
径向基函数单元(radial basis function,RBF):
softpuls函数:之前有介绍过。
硬双曲正切函数(Hard tanh):
架构设计
在这些链式架构中,主要的架构考虑是选择网络的深度和每一层的宽度。即使只有一个隐藏层的网络也足够适应训练集。更深层的网络通常能够 对每一层使用更少的单元数和更少的参数,并且经常容易泛化到测试集,但是通常也更难以优化。
万能近似定理(universal approximation theorem):一个前馈神经网络如果具有线性输出层和至少一层具有任何一种 “挤压” 性质的激活函数(例如logistic sigmoid激活函数)的隐藏层,只要给予网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的 Borel 可测函数。在 Rn 的有界闭集上的任意连续函数是 Borel 可测的, 因此可以用神经网络来近似。
总之,具有单层的前馈网络足以表示任何函数,但是网络层可能大得不可实现, 并且可能无法正确地学习和泛化。在很多情况下,使用更深的模型能够减少表示期 望函数所需的单元的数量,并且可以减少泛化误差。
反向传播和其他的微分算法
反向传播(back propagation)算法:经常简称为BP算法,允许来自代价函数的信息通过网络向后流动, 以便计算梯度。BP算法的数学理论依据是微积分中的链式法则。关于BP算法的推导过程可以参考http://www.jianshu.com/p/c5cda5a52ee4
下图找到了一张动态GIF图片,描述了表示前向(FP)和后向(BP)传播的全过程:
总之,前馈神经网络是最基础的神经网络模型。其中最重要的学习要点就是BP算法的理解。
Q&A:
如果有兴趣相投的朋友,欢迎来http://www.jokls.com/提问或者解答其他小伙伴的提问。