6.1 从异或函数说起
为了使前馈网络的概念更具体化,我们先从一个简单地例子说起,这个例子中,我们使用前馈网络解决一个简单的任务:学习异或函数。
众所周知,异或(XOR)操作是一种针对二进制值的二目操作符。当两个操作数不同时返回1,其他返回0.异或函数为我们提供了我们想要学习到的目标函数y=f*(x),而我们的模型提供了函数y=f(x;θ),我们的学习算法将修正参数θ使得模型函数f尽可能的接近目标函数f*。
在本例中,我们更加关心网络能否在X={[0,0]T,[0,1]T,[1,0]T,and [1,1]T}这四个点上获得正确的结果,而不是讨论如何扩展其泛化能力。我们将使用上述四个点训练这个网络,主要的难题是如何使这个网络适应训练集。
我们可以把这个问题当做回归问题,并且使用均方误差(MSE)做为损失函数。使用MSE是为了在数学计算上简单一点,而在后续章节中我们会介绍其他更适合二值数据的误差度量方法。
针对我们的训练集,MSE损失函数表示如下:
现在,我们必须确定模型的类型,因为我们要得到f(x;θ)的具体形式。我们暂且选定一个线性模型,那么它可以被表示为:
根据训练数据,求解正规方程(normal equations) 很容易得到w=0并且b=1/2。
(如果大家和博主一样把线性代数都还给老师了,请移步至Normal
Equations 的由来了解一下normal equations。)
但是问题出现了,我们求得的这个模型,其输出永远是0.5. 为什么会这样子呢?图6.1说明了为何线性模型不能有效的表达XOR函数。解决这种问题的一种方法就是利用一个模型去学习一个不同的表征空间,使得在那个空间中,我们可以应用一个线性模型来解释这个问题。
特别的,我们将引入一个非常简单的前馈网络,这个网络只有一个隐含层,并且只含有两个隐藏单元。详见图6.2。在这个网络中,输入层的数据通过函数f(1)(x;w,c)得到隐含层单元的数值,这个数值构成了向量h,而h则会作为第二层(即输出层)的输入。大家可以看到,输出层仍然是一个线性的回归模型,但是,它的计算对象是h而不是先前的x了。这个网络现在由两个函数组成:h=f(1)(x;w,c)和y=f(2)(h;w,b),整体可以表示为:f(x;w,c,w,b)=f(2)(f(1)(x))。
那么,函数f(1)是什么样子的呢?目前为止,我们对线性模型的使用是轻车熟路的,因而我们会理所当然的想到能否尝试着将f(1)也设置为线性的呢?不幸的是,如果f(1)是线性的,那么整个前馈网络都将会是线性的,因为如果我们暂时忽略函数中的截距项,就会有:f(1)=WTx和f(2)=hTw.那么f(x)=wTWTx,这显然是线性的。
因此,我们明确了一点,那就是特征的描述函数必须是非线性的。大多数的神经网络都会应用激活函数来应对这个问题,这是一种不变的、非线性的函数。通过它再配合学习到的参数可以完成最终的仿射变换。在这里我们也采用这种策略,我们定义h=g(WTx+c),其中W为线性转换的权重,c被称为偏置。现在,我们描述从x到h的仿射变换,激活函数g是元素级别的,hi=g(xTW:,i+ci).现今,我们大多默认g为ReLU函数(rectifiedlinear
unit,修正线性单元),在这种情况下,g(z)=max{0,z} (这就是ReLU函数,是不是炒鸡简单)见图6.3
我们现在可以将网络完整的定义为如下形式:
在这里,我们指出XOR问题的一组解:
其中b=0.
对于:
我们的网络能够得到正确的解:
读者可自行验证。
在这个例子中,我们仅仅是指出了这个问题的一组解,而这个解可以获得0误差的成绩。但是在真实的情况下可能会有数以百万计的数据需要我们处理,并且有同样数量级的参数需要我们去调节,此时求解参数就绝不可能像解决XOR问题那样简单地指出来了。此时,一种基于梯度下降的优化算法就有了用武之地,它可以求解得到非常接近ground truth的值。