为什么神经网络能够识别
为了研究神经网络,我们必须要对什么网络是什么有一个更直观的认识。
\vec{y}= a(W\cdot\vec{x} + {b}),其中\vec{x}是输入向量,\vec{y}是输出向量,\vec{b}是偏移向量,W是权重矩阵,a()是激活函数。每一层仅仅是把输入\vec{x}经过如此简单的操作得到\vec{y}。
通过如下5种对输入空间(输入向量的集合)的操作,完成的f:\vec{x}\rightarrow\vec{y}变换 (矩阵的行空间到列空间)。
这5种操作中,1,2,3的操作由W\cdot\vec{x}完成,4的操作是由+\vec{b}完成,5的操作则是由a()来实现。
每层的数学理解:用线性变换跟随着非线性变化,将输入空间投向另一个空间。
对 W\cdot\vec{x} 的理解就是通过组合形成新物质。a()又符合了我们所处的世界都是非线性的特点。
\vec{x}是二维向量,维度是碳原子和氧原子的数量 [C;O],数值且定为[1;1]。若确定\vec{y}是三维向量,就会形成如下网络的形状 (神经网络的每个节点表示一个维度)。通过改变权重的值,可以获得若干个不同物质。右侧的节点数决定了想要获得多少种不同的新物质(矩阵的行数)。
若权重W的数值如(1),那么网络的输出\vec{y}就会是三个新物质,二氧化碳,臭氧,一氧化碳。
\left[\begin{matrix}CO_{2}\\O_{3}\\CO\end{matrix}\right]=\left[\begin{matrix}1 & 2 \\0 & 3\\1 & 1\end{matrix}\right] \cdot \left[\begin{matrix}C \\O \\\end{matrix}\right]\tag{1}
若减少右侧的一个节点,并改变权重W至(2),那输出\vec{y}就会是两个新物质,[ O_{0.3} ;CO_{1.5}]。
\left[\begin{matrix}O_{0.3}\\CO_{1.5}\\\end{matrix}\right]=\left[\begin{matrix}0& 0.3 \\1 & 1.5\\\end{matrix}\right] \cdot \left[\begin{matrix}C \\O \\\end{matrix}\right]\tag{2}
若再加一层,就是再次通过组合[CO_{2};O_{3};CO]这三种基础物质,形成若干个更高层的物质。
若希望通过层网络能够从C, O空间转变到[CO_{2};O_{3};CO]空间的话,那么网络的学习过程就是将W的数值变成尽可能接近(1)的过程 。
重要的是这种组合思想,组合成的东西在神经网络中并不需要有物理意义,可以是抽象概念。
每层神经网络的物理理解:通过现有的不同成分的组合形成新成分。
神经网络的解决方法依旧是转换到另外一个空间下,用的是所说的5种空间变换操作。比如下图就是经过放大、平移、旋转、扭曲原二维空间后,在三维空间下就可以成功找到一个超平面分割红蓝两线 (同SVM的思路一样)。
上面是一层神经网络可以做到的空间变化。若把\vec{y} 当做新的输入再次用这5种操作进行第二遍空间变换的话,网络也就变为了二层。最终输出是\vec{y}= a_{2}(W_{2}\cdot(a_{1}(W_{1}\cdot\vec{x} + {b}_{1})) + {b}_{2})。设想当网络拥有很多层时,对原始输入空间的“扭曲力”会大幅增加,如下图,最终我们可以轻松找到一个超平面分割空间。
当然也有如下图失败的时候,关键在于“如何扭曲空间”。所谓监督学习就是给予神经网络网络大量的训练例子,让网络从训练例子中学会如何变换空间。每一层的权重W就控制着如何变换空间,我们最终需要的也就是训练好的神经网络的所有层的权重矩阵。。这里有非常棒的可视化空间变换demo,一定要打开尝试并感受这种扭曲过程。
更多内容请看Neural Networks, Manifolds, and Topology。
神经网络的学习就是学习如何利用矩阵的线性变换加激活函数的非线性变换,将原始输入空间投向线性可分/稀疏的空间去分类/回归。 增加节点数:增加维度,即增加线性转换能力。 增加层数:增加激活函数的次数,即增加非线性转换次数。
神经网络的学习过程就是自动寻找成分组成方式的过程。 增加节点数:增加同一层物质的种类,比如118个元素的原子层就有118个节点。 增加层数:增加更多层级,比如分子层,原子层,器官层,并通过判断更抽象的概念来识别物体。
按照上文在理解视角中所述的观点,可以想出下面两条理由关于为什么更深的网络会更加容易识别,增加容纳变体(variation)(红苹果、绿苹果)的能力、鲁棒性(robust)。
然而这只解释了为何神经网络有效,并没有接触到核心问题:为何深层神经网络更有效
既然我们希望网络的输出尽可能的接近真正想要预测的值。那么就可以通过比较当前网络的预测值和我们真正想要的目标值,再根据两者的差异情况来更新每一层的权重矩阵(比如,如果网络的预测值高了,就调整权重让它预测低一些。不断调整,直到能够预测出目标值)。
因此就需要先定义“如何比较预测值和目标值的差异”,这便是损失函数或目标函数(loss function or objective function),用于衡量预测值和目标值的差异的方程。loss function的输出值(loss)越高表示差异性越大。那神经网络的训练就变成了尽可能的缩小loss的过程。
所用的方法是梯度下降(Gradient descent):通过使loss值向当前点对应梯度的反方向不断移动,来降低loss。一次移动多少是由学习速率(learning rate)来控制的。
然而使用梯度下降训练神经网络拥有两个主要难题。
1、局部极小值(或鞍点)
梯度下降寻找的是loss function的局部极小值,而我们想要全局最小值。如下图所示,我们希望loss值可以降低到右侧深蓝色的最低点,但loss在下降过程中有可能“卡”在左侧的局部极小值中。也有最新研究表明在高维空间下局部极小值通常很接近全局最小值,训练网络时真正与之“斗争”的是鞍点。但不管是什么,其难处就是loss“卡”在了某个位置后难以下降。唯一的区别是:陷入局部极小值就难以出来,陷入鞍点最终会逃脱但是耗时。
试图解决“卡在局部极小值”问题的方法分两大类:
2、梯度的计算
机器学习所处理的数据都是高维数据,该如何快速计算梯度、而不是以年来计算。其次如何更新隐藏层的权重?解决方法是:计算图:反向传播算法这里的解释留给非常棒的Computational Graphs: Backpropagation
需要知道的是,反向传播算法是求梯度的一种方法。如同快速傅里叶变换(FFT)的贡献。
而计算图的概念又使梯度的计算更加合理方便。
下面就简单浏览一下训练和识别过程,并描述各个部分的作用。
也就是同时有input以及对应label的数据。每个数据叫做训练样本(sample)。label也叫target,也是机器学习中最贵的部分。上图表示的是我的数据库。假设input的维度是39,label的维度是48。
确定层数、每一隐藏层的节点数和激活函数,以及输出层的激活函数和损失函数。上图用的是两层隐藏层(最后一层是输出层)。隐藏层所用激活函数a( )是ReLu,输出层的激活函数是线性linear(也可看成是没有激活函数)。隐藏层都是1000节点。损失函数L( )是用于比较距离MSE:mean((output - target)^2)。MSE越小表示预测效果越好。训练过程就是不断减小MSE的过程。到此所有数据的维度都已确定:
将所有样本的input和label处理成能够使用神经网络的数据。label的值域符合激活函数的值域。并简单优化数据以便让训练易于收敛。比如中心化(mean subtraction)、归一化(normlization)、主成分分析(PCA)、白化(whitening)。假设上图的input和output全都经过了中心化和归一化。
W_{h1}、W_{h2}、W_{0}在训练前不能为空,要初始化才能够计算loss从而来降低。W_{h1}、W_{h2}、W_{0}初始化决定了loss在loss function中从哪个点开始作为起点训练网络。上图用均匀分布初始权重(Uniform distribution)。
训练过程就是用训练数据的input经过网络计算出output,再和label计算出loss,再计算出gradients来更新weights的过程。
算当前网络的预测值output =linear (W_{o} \cdot Relu(W_{h2}\cdot Relu(W_{h1}\cdot input+b_{h1})+b_{h2}) +b_{o})