Deep Learning 学习笔记2:深度前馈网络(一)

    深度前馈网络(deep feedforward network),也叫做前馈神经网络(feedforward neural network),或者多层感知机(multilayer perceptron, MLP),是典型的深度学习模型。基本上所有的深度学习算法的过程都可以定义为:数据集的输入→求代价函数→最优化处理→得到模型。前馈网络也类似:该网络的目标是获得一个算法过程近似某个函数f*。以线性回归为例,通过对一系列y=f^{*}(x)的真实映射进行处理,需要定义一个新的映射 y=f(x,\theta ),并且对θ值进行优化,使得该映射能够得到最佳的函数近似。

    这种模型被称作向前,是因为信息流过x,并流经定义为f的算法计算过程,最终达到输出y,输出结果y并没有与模型本身f进行反馈连接,即该网络是单向传递的。如果当前的网络包含了反馈连接时,就被称作循环神经网络。

    前馈神经网络被称作网络,是因为它们通常用多个函数复合在一起来表示,该函数过程形成一个有向无环图。比如我们有多个函数在一个链上形成f(x)=f^{n}(...f^{(3)}(f^{(2)}(f^{(1)}(x))))的结构,f^{(1)}被称作第一层,f^{(2 )}被称作第二层,以此类推。链的全长被称为深度。前馈网络的最后一层称为输出层,在神经网络训练的过程中,我们让f(x)去匹配f^{_{*}}(x)的值。训练数据为我们提供了在不同训练点上的取值的、含有噪声的f^{_{*}}(x)的近似实例。每个样例x都伴随着一个标签y\approx f^{*}(x)。训练样例直接指明了输出层在每一点x上必须做什么;它必须产生一个接近真实y的值。但是训练数据集并没有告诉每一层该怎样做,算法必须决定如何使用每一层来实现最终尽可能接近真实f^{_{*}}(x)的值。这些没有被具体算法定义的层就叫做隐藏层。

    这些网络被称为神经网络来源于神经科学的启发。网络中每个层都是向量值的。这些隐藏层的维数决定了模型的宽度。向量的每个元素都可以被视为起到类似一个神经元的作用。除了将层想象成向量到向量的单个函数,也可以把层想象为由许多并行操作的单元组成。,每个单元表示为一个向量到一个标量的函数。每个单元在某种意义上类似一个神经元,它接收的输入来自于其他许多的神经元,并且计算它自己的激活值。

                                                                                  一个神经元模型

                                                                           两层神经网络(中间层计算)

                                                                        两层神经网络(输出层计算)

一个简单的例子:学习XOR

    XOR 函数(‘‘异或’’ 逻辑)是两个二进制值x1 和x2 的运算。当这些二进制值中恰好有一个为1 时,XOR 函数返回值为1。其余情况下返回值为0。XOR 函数提供了我们想要学习的目标函数y=f^{*}(x)。我们的模型给出了一个函数y=f(x;\theta )并且我们的学习算法会不断调整参数θ 来使得f 尽可能接近f*。我们希望网络在这四个点X=\left \{ {[0,0]^{T},[0,1]^{T},[1,0]^{T},[1,1]^{T}} \right \}上表现正确。我们会用全部这四个点来训练我们的网络,唯一的挑战是拟合训练集。

    为什么线性模型不能用来表示XOR函数:

    通过学习一个表示来解决XOR 问题。图上的粗体数字标明了学得的函数必须在每个点输出的值。(左) 直接应用于原始输入的线性模型不能实现XOR 函数。当x1 = 0 时,模型的输出必须随着x2 的增大而增大。当x1 = 1 时,模型的输出必须随着x2 的增大而减小。线性模型必须对x2 使用固定的系数w2。因此,线性模型不能使用x1 的值来改变x2 的系数,从而不能解决这个问题。(右) 在由神经网络提取的特征表示的变换空间中,线性模型现在可以解决这个问题了。在我们的示例解决方案中,输出必须为1 的两个点折叠到了特征空间中的单个点。换句话说,非线性特征将x=[1,0]^{^{T}} 和x=[0,1]^{^{T}} 都映射到了特征空间中的单个点h=[1,0]^{^{T}}。线性模型现在可以将函数描述为h1 增大和h2 减小。在该示例中,学习特征空间的动机仅仅是使得模型的能力更大,使得它可以拟合训练集。在更现实的应用中,学习的表示也可以帮助模型泛化。

    大多数神经网络通过仿射变换之后紧跟着一个被称为激活函数的固定非线性函数来实现这个目标,其中仿射变换由学得的参数控制。我们这里使用这种策略,定义h=g(W^{T}x+c),其中W 是线性变换的权重矩阵,c 是偏置。先前,为了描述线性回归模型,我们使用权重向量和一个标量的偏置参数来描述从输入向量到输出标量的仿射变换。现在,因为我们描述的是向量x 到向量h 的仿射变换,所以我们需要一整个向量的偏置参数。激活函数g 通常选择对每个元素分别起作用的函数,有h_{}i=g({x^{T}}W:_{}i + c_{i})。在现代神经网络中,默认的推荐是使用由激活函数g(z)=max(0,z)定义的整流线性单元(rectified linear unit).

    上图是使用两种不同样式绘制的前馈网络的示例。具体来说,这是我们用来解决XOR 问题的前馈网络。它有单个隐藏层,包含两个单元。(左) 在这种样式中,我们将每个单元绘制为图中的一个节点。这种风格是清楚而明确的,但对于比这个例子更大的网络,它可能会消耗太多的空间。(右)在这种样式中,我们将表示每一层激活的整个向量绘制为图中的一个节点。这种样式更加紧凑。有时,我们对图中的边使用参数名进行注释,这些参数是用来描述两层之间的关系的。这里,我们用矩阵W 描述从x 到h 的映射,用向量w 描述从h 到y 的映射。当标记这种图时,我们通常省略与每个层相关联的截距参数。

    明我们的整个网络是:f=(x;W,c,w,b)=w^{^{T}}max{0,W^{T}x+c}+b

令           W=\begin{bmatrix} 1 & 1\\ 1 & 1 \end{bmatrix} ,     c=\begin{bmatrix} 0\\ -1 \end{bmatrix},           w=\begin{bmatrix} 1\\ -2 \end{bmatrix}                      以及   b = 0

    我们现在可以了解这个模型如何处理一批输入。令X 表示设计矩阵,它包含二进制输入空间中全部的四个点,每个样例占一行,那么矩阵表示为:

                                                                      X=\begin{bmatrix} 0 & 0\\ 0&1 \\ 1&0 \\ 1& 1 \end{bmatrix}

    神经网络的第一层是将输入矩阵乘以第一层的权重矩阵:

                                                                  XW=\begin{bmatrix} 0 &0 \\ 1&1 \\ 1&1 \\ 2& 2 \end{bmatrix}

    然后我们加上偏置向量c,得到:

                                                                               \begin{bmatrix} 0 &-1 \\ 1&0 \\ 1& 0\\ 2&1 \end{bmatrix}

    在这个空间中,所有的样例都处在一条斜率为1 的直线上。当我们沿着这条直线移动时,输出需要从0 升到1,然后再降回0。线性模型不能实现这样一种函数。为了用h 对每个样例求值,我们使用整流线性变换得到如下矩阵:

                                                                                \begin{bmatrix} 0&0 \\ 1&0 \\ 1& 0\\ 2& 1 \end{bmatrix}

    这个变换改变了样例间的关系。它们不再处于同一条直线上了。它们现在处在一个可以用线性模型解决的空间上。整流线性激活函数是被推荐用于大多数前馈神经网络的默认激活函数。将此函数用于线性变换的输出将产生非线性变换。然而,函数仍然非常接近线性,在这种意义上它是具有两个线性部分的分段线性函数。由于整流线性单元几乎是线性的,因此它们保留了许多使得线性模型易于使用基于梯度的方法进行优化的属性。它们还保留了许多使得线性模型能够泛化良好的属性。计算机科学的一个公共原则是,我们可以从最小的组件构建复杂的系统。就像图灵机的内存只需要能够存储0 或1 的状态,我们可以从整流线性函数构建一个通用函数逼近器。

    我们最后乘以一个权重向量w,得到:

                                                                                    \begin{bmatrix} 0\\ 1 \\1 \\ 0 \end{bmatrix}

    神经网络对这一批次中的每个样例都给出了正确的结果。

    在这个例子中,我们简单地指明了答案,然后说明它得到的误差为零。在实际情况中,可能会有数十亿的模型参数以及数十亿的训练样本,所以不能像我们这里做的那样进行简单地猜解。与之相对的,基于梯度的优化算法可以找到一些参数使得产生的误差非常小。我们这里给出的XOR 问题的解处在损失函数的全局最小点,所以梯度下降算法可以收敛到这一点。梯度下降算法还可以找到XOR 问题一些其他的等价解。梯度下降算法的收敛点取决于参数的初始值。在实践中,梯度下降通常不会找到像我们这里给出的那种干净的、容易理解的、整数值的解。

猜你喜欢

转载自blog.csdn.net/WPR1991/article/details/82798158