参考 深度前馈网络(一)、神经网络学习XOR - 云+社区 - 腾讯云
XOR函数("异或"逻辑)是两个二进制值x1" role="presentation">x1和的运算。当这些二进制值中恰好有一个为1时,XOR函数提供了我们想要学习的目标函数。我们的模型给出了一个函数,并且我们的学习算法会不断调整参数来使得f尽可能接近。
在这个简单的例子中,我们不会关心统计泛化。我们希望网络在这4个点上表现正确。我们会影全部这4个点来训练我们的网络,唯一的挑战时拟合训练集。我们可以把这个问题当作回归问题,并使用均方误差损失函数。选择这个损失函数是为了尽可能地简化本例中用到的数学知识。在应用领域,对于二进制数据建模时,MSE通常并不是一个合适的代价函数。
评估整个训练集上表现的MSE代价函数为
(1)
我们现在必须要选择模型的形式。假设选择一个线性模型,包含w和b,那么模型被定义成
(2)
我们可以使用正规方程关于w和b最小化J(θ)" role="presentation">J(θ),来得到一个逼式解。
解正规方程以后,我们得到w=0以及b=1/2。线性模型仅仅是在任意一点都输出0.5。解决这个问题的其中一种方法是使用一个模型来学习一个不同的特征空间,在这个特征空间上线性模型能够表示这个解。
具体来说,我们这里引入了一个非常简单的前馈神经网络,它有一层隐藏层并且隐藏层包含两个单元,见下图中对该模型的解释。这个前馈神经网络有一个通过函数f(1)(x;W,c)" role="presentation">f(1)(x;W,c)计算得到的隐藏单元的向量h。这些隐藏单元的值随后被用作第二层的输入。第二层就是这个网络的输出层。输出层仍然只是一个线性回归模型,只不过现在在它作用于h而不是x。网络现在包含链接在一起的两个函数:h=f(1)(x;W,c)" role="presentation">h=f(1)(x;W,c)和,完整的模型是f(x;W,c,w,b)=f(2)(f(1)(x))" role="presentation">f(x;W,c,w,b)=f(2)(f(1)(x))。
f(1)" role="presentation">f(1)应该是哪种函数?线性模型到目前为止都表现不错,让f(1)" role="presentation">f(1)也是线性的似乎很有诱惑力。可惜的是,如果f(1)" role="presentation">f(1)是线性的,那么前馈网络作为一个整体对于输入仍然是线性的。暂时忽略截距项,假设f(1)(x)=WTx" role="presentation">f(1)(x)=WTx并且f(2)(x)=hTw" role="presentation">f(2)(x)=hTw,那么f(x)=wTWTx" role="presentation">f(x)=wTWTx。我们可以将这个函数重新表示成f(x)=xTw′" role="presentation">f(x)=xTw′,其中w′=Ww" role="presentation" style="position: relative;">w′=Ww。
显然,我们必须用非线性函数来描述这些特征。大多数神经网络通过放射变换之后紧跟着一个被称为激活函数的固定非线性函数来实现这个目标,其中放射变换由学得的参数控制。我们这里使用这种策略,定义h=g(WTx+c)" role="presentation" style="position: relative;">h=g(WTx+c),其中W是线性变换的权重矩阵,c是偏置。此前,为了描述线性回归模型,我们使用权重向量和一个标量的偏置参数来描述从输入向量到输出向量的放射变换。现在,因为描述的是向量x到向量h的放射变换,所以我们需要一整个向量的偏置参数。激活函数g通常选择对每个元素分别起作用的函数,有hi=g(xTW:,i+ci)" role="presentation" style="position: relative;">hi=g(xTW:,i+ci)。在现代神经网络中,默认的推荐是使用由激活函数g(z)=max{0,z}" role="presentation" style="position: relative;">g(z)=max{0,z}定义的整流线性单元(rectified linear unit)或者称为ReLU。
现在可以指明我们的整个网络是
f(x;W,c,w,b)=wTmax{0,WTx+c}+b" role="presentation" style="position: relative;">f(x;W,c,w,b)=wTmax{0,WTx+c}+b
我们现在可以给出XOR问题的一个解。令
W=[1111]" role="presentation" style="position: relative;">W=[1111]
c=[0−1]" role="presentation" style="position: relative;">c=[0−1]
w=[1−2]" role="presentation" style="position: relative;">w=[1−2]
以及b=0。
我们现在可以了解这个模型如何处理一批输入。令X表示设计矩阵,它包含二进制输入空间中全部的四个点,每个样本占一行,那么矩阵表示为
X=[00011011]" role="presentation" style="position: relative;">X=⎡⎣⎢⎢⎢00110101⎤⎦⎥⎥⎥
神经网络的第一步是将输入矩阵乘以第一层的权重矩阵:
XW=[00111122]" role="presentation" style="position: relative;">XW=⎡⎣⎢⎢⎢01120112⎤⎦⎥⎥⎥
然后,我们加上偏置向量c,得到
[0−1101021]" role="presentation" style="position: relative;">⎡⎣⎢⎢⎢0112−1001⎤⎦⎥⎥⎥
在这个空间中,所有的样本都处在一条斜率为1的直线上。当我们沿着这条线移动时,输出需要从0升到1,然后再将回0。线性模型不能实现这样的一种函数。为了用h对每个样本求值,我们使用整流线性变换:
[00101021]" role="presentation" style="position: relative;">⎡⎣⎢⎢⎢01120001⎤⎦⎥⎥⎥
这个变换改变了样本间的关系,它们不再处于同一条直线上。
我们最后乘以一个权重向量w:
[0110]" role="presentation" style="position: relative;">⎡⎣⎢⎢⎢0110⎤⎦⎥⎥⎥
神经网络对这一批次中的每个样本都给出了正确的结果。
在这个例子中,我们简单地指定了解决方案,然后说明它得到的误差为零。在实际情况中,可能会有数十亿的模型参数以及数十亿的训练样本,所以不能像我们这里做的那样进行简单的猜解。与之相对的,基于梯度的优化算法可以找到一些参数使得产生的误差非常小。这里给出的XOR问题的解处在损失函数的全局最小点,所以梯度下降算法可以收敛到这一点。梯度下降算法还可以找到XOR问题一些其他的等价解。梯度下降算法的收敛点取决于参数的初始值。在实践中,梯度下降通常不会找到像我们这里给出的那种干净的、容易理解的、整数值的解。