先记录一些相关的blog:
https://zybuluo.com/hanbingtao/note/581764
Deep Learning Book chpt 6
Deep Feedforward Network
简介
深度前向网络(Deep Feedforward network)通常也称为前向神经网络,或者多层感知机(MLPs),是很典型的(quintessential)深度学习模型。前向网络的目的是估计出一些函数
f∗
,比如分类器
y=f∗(x)
,就是将输入
x
映射到某个类别
定义 前向网络定义了映射
y=f(x;θ)
,通过学习参数
θ
估计出最好的映射。
上述模型中的前向是指信息流从输入
x
,经过中间计算(
前向网络对于实践机器学习非常重要,是很多商业应用的基础。比如图像中的目标识别所用到的卷积网络就是前向网络的一种,自然语言处理应用中的递归网络也是以前向网络为基础的。
前向神经网络之所以称为网络,是因为它们通常有很多函数组成,可以参考有向无环图来理解。以三个函数
实际上,每个隐含层都是一个向量,这些向量的维度决定了模型的宽度(width)。神经网络称呼的灵感来自于神经系统科学,所以上述向量的每个元素可以类比为一个个神经元。
如上图(图片来源ufldl),每层都可以理解为向量到单个数值的映射。
注:个人觉得ufldl的wiki写的挺清楚的,可以参考读一下。
需要说明的是,神经网络并不是要建模人脑,只是建模一系列函数来近似达到统计上的普遍性规律。
一个理解前向网络的方式是从线性模型开始,并考虑如何克服线性模型的局限性。Logistic回归、线性回归都属于线性模型,它们能够有效、快速的拟合,无论是闭合解还是用凸优化的方式。当然了,线性模型的局限性也很明显,不能拟合非线性的情况,比如多个输入变量。为了提升线性模型的能力,我们可以用一个非线性的核(
注:非线性核实际上就是一个函数,比如SVM中的高斯核、径向基核等。
那么,问题来了,如何选择映射函数
ϕ
呢?
1. 选择非常通用的映射函数,如RBF核中隐含使用的无限维映射。理论上,只要
ϕ(x)
有足够高的维度,我们是有足够的能力去拟合训练集的,但是在测试集上的泛化能力就会非常弱。(注:也就是所谓的过拟合)
2. 人为选择映射函数,在深度学习之前,人们经常使用。针对不同的任务,人们都需要花费很大的经历来设定映射函数。比如语音识别和计算机视觉,映射函数可能完全不一样,而且它们基本无法相互转换。
3. 学习映射函数,这就是深度学习所采用的策略。在深度学习中,模型可以定义为
y=f(x;θ,w)=ϕ(x;θ)Tw
。通过参数
θ
从一系列函数中学习得到
ϕ
,而参数
w
则将
下面会从一个例子开始后续的介绍。
6.1 举例:学习异或XOR
这里从一个简单的任务开始,即学习异或函数。异或是逻辑运算中的概念,对于两个布尔值,当它们不一样的时候得到1,其他的情况为0。如下表:
假设异或的目标函数为 y=f∗(x) ,模型中提供的函数为 y=f(x;θ) ,那么学习算法的目的就是通过调整参数 θ 使得 f 与尽可能的与
在这个例子中,我们不关心统计上的普适性,只要求函数能够很好的拟合上述四个点,即这个问题的训练集
X={[0,0]T,[0,1]T,[1,0]T,[1,1]T}
,其对应的真值为
Y={0,1,1,0}
,与上表对应。可以用回归问题(regression)来拟合这个函数,为了简化问题,选择MSE(Mean Squared Error)作为损失函数,如下:
需要留意下, x 都是表示的向量。然后,我们要选择模型的形式,也就是目标函数,这里选择线性模型,如下:
建立好模型函数和损失函数后,可以通过最小化 J(θ) 求得参数 w=0 , b=12 。
理解
最小化
J(θ)
是通过极大似然估计实现的,即对参数
w
和
b
的偏导数为0。首先,Loss function为
那么极大似然估计的求解过程如下:
将训练集 X 和真值 Y=f∗(x) 带入到上面两个公式中,便可求得 w=0 , b=12 。顺便提一下, x , w 都是向量,在计算的时候可以展开来表示, x=(x1,x2) , w=(w1,w2) 。
很显然,线性函数无法拟合异或操作。如果还不能理解,可以把上述四个点在坐标系中呈现出来,就很明显的看出其不是线性可分的。要解决这个问题,可以用核函数把原始输入映射到另外一个线性可分的空间中。在神经网络中,通过隐含层来达到这一目的。如隐含层 h=f(1)(x;W,c) ,输出层 y=f(2)(h;w,b) 。
那么,问题来了,如何得到隐含层的函数
f(1)
呢?前面已经证明了线性函数是不能解决异或问题的,所以我们在神经网络中引入激活函数来实现非线性的变换,记
h=g(Wtx+c)
。通常使用的激活函数是ReLU(rectified Linear Unit),即
g(x)=max{0,x}
。我们下面用简单的例子说明网络正向传递的方式,如图
图中,
x
为输入(以
在原书中,给了一组特定的参数来说明上述的过程,这里就不说明了。在实际运算中,参数有很多,需要通过梯度下降的方式逐步的求得最优的解。
6.2 梯度学习方法
神经网络的训练过程跟其他学习方法并没有太大的区别,都是基于梯度下降的,无外乎代价函数、优化的过程以及一系列模型函数。但是,有个关键的区别需要说明,即神经网络的损失函数是非凸的。而线性回归、SVM等属于凸优化,理论上是都能找到最优解的。而神经网络的训练优化是需要通过迭代逐步的找到最优解(实际上,是否是最优解也不太确定),这个过程是通过随即梯度下降(SGD,Stochastic Gradient Descent)来完成的,所有的参数在开始都是随机初始化的。这些在后续会有详细的说明,我们先来一层层的剖析神经网络。
6.2.1 代价函数
大部分情况下,参数模型定义了一个分布 p(y|x;θ) ,然后用极大似然求解。也就是说,我们可以把训练数据与预测结果之间的交叉熵作为代价函数。通常,代价函数还会加上正则项,正则项的目的是为了对参数做进一步的约束。(具体的意义还未完全理解。)