雷锋网按:本文原作者 YJango ,本文原载于其知乎专栏——超智能体 。雷锋网已获得原作者授权。
介绍 为了研究神经网络,我们必须要对什么网络是什么有一个更直观的认识。
一、基本变换:层 神经网络是由一层一层构建的,那么每层究竟在做什么?
每层神经网络的数学理解:用线性变换跟随着非线性变化,将输入空间投向另一个空间。 <img src="https://static.leiphone.com/uploads/new/article/pic/201708/3ff9ebd942879748f95d91555321698f.jpg" data-rawwidth="144" data-rawheight="164" class="content_image" width="144" _src="https://static.leiphone.com/uploads/new/article/pic/201708/3ff9ebd942879748f95d91555321698f.jpg"/>
每层神经网络的物理理解:通过现有的不同物质的组合形成新物质。 二、理解视角: 现在我们知道了每一层的行为,但这种行为又是如何完成识别任务的呢?
数学视角:“线性可分” <img src="https://static.leiphone.com/uploads/new/article/pic/201708/4a29ebcdbc580732f249253dfd5c6325.jpg" data-rawwidth="370" data-rawheight="63" class="content_image" width="370" _src="https://static.leiphone.com/uploads/new/article/pic/201708/4a29ebcdbc580732f249253dfd5c6325.jpg"/>
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/08662ec286aa83566fc02ad36b7ab184.jpg" data-rawwidth="197" data-rawheight="204" class="content_image" width="197" _src="https://static.leiphone.com/uploads/new/article/pic/201708/08662ec286aa83566fc02ad36b7ab184.jpg"/>
神经网络的解决方法依旧是转换到另外一个空间下,用的是所说的 5 种空间变换操作 。比如下图就是经过放大、平移、旋转、扭曲原二维空间后,在三维空间下就可以成功找到一个超平面分割红蓝两线 (同 SVM 的思路一样)。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/6d3997dcebb8b2d431a292c3bef44d97.jpg" data-rawwidth="197" data-rawheight="198" class="content_image" width="197" _src="https://static.leiphone.com/uploads/new/article/pic/201708/6d3997dcebb8b2d431a292c3bef44d97.jpg"/>
上面是一层神经网络可以做到的,如果把 当做新的输入再次用这 5 种操作进行第二遍空间变换的话,网络也就变为了二层。最终输出是 。 设想网络拥有很多层时,对原始输入空间的 “扭曲力” 会大幅增加,如下图,最终我们可以轻松找到一个超平面分割空间。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/1a059f45f735f249b448c97280e550ef.gif" data-rawwidth="239" data-rawheight="233" data-thumbnail="https://static.leiphone.com/uploads/new/article/pic/201708/2e5cd18516c20235636108232aaf533e.jpg" class="content_image" width="239" _src="https://static.leiphone.com/uploads/new/article/pic/201708/1a059f45f735f249b448c97280e550ef.gif"/>
当然也有如下图失败的时候,关键在于 “如何扭曲空间”。所谓监督学习就是给予神经网络网络大量的训练例子,让网络从训练例子中学会如何变换空间。每一层的权重 W 就控制着如何变换空间,我们最终需要的也就是训练好的神经网络的所有层的权重矩阵。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/eb7d8c68190405b4d0f7a65869c1b227.gif" data-rawwidth="239" data-rawheight="233" data-thumbnail="https://static.leiphone.com/uploads/new/article/pic/201708/adf56ee267562ede061b26adf997ef6f.jpg" class="content_image" width="239" _src="https://static.leiphone.com/uploads/new/article/pic/201708/eb7d8c68190405b4d0f7a65869c1b227.gif"/>
这里有非常棒的可视化空间变换 demo ,一定要打开尝试并感受这种扭曲过程。更多内容请看 Neural Networks, Manifolds, and Topology 。
线性可分视角:神经网络的学习就是学习如何利用矩阵的线性变换加激活函数的非线性变换,将原始输入空间投向线性可分 / 稀疏的空间去分类 / 回归。 增加节点数:增加维度,即增加线性转换能力。 增加层数:增加激活函数的次数,即增加非线性转换次数。 物理视角:“物质组成” <img src="https://static.leiphone.com/uploads/new/article/pic/201708/3272533ad6055f6af84000f0d9483497.jpg" data-rawwidth="488" data-rawheight="340" class="origin_image zh-lightbox-thumb" width="488" data-original="https://pic1.zhimg.com/v2-3ec7216f7ab84dac089836b166c0ae28_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201708/3272533ad6055f6af84000f0d9483497.jpg"/>
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/2645069b637ec0528082379f59f7ce4b.png" data-rawwidth="624" data-rawheight="218" class="origin_image zh-lightbox-thumb" width="624" data-original="https://pic4.zhimg.com/v2-82f05552fd2ddde28a0ef20814d7acbb_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201708/2645069b637ec0528082379f59f7ce4b.png"/>
物质组成视角:神经网络的学习过程就是学习物质组成方式的过程。 增加节点数:增加同一层物质的种类,比如 118 个元素的原子层就有 118 个节点。 增加层数:增加更多层级,比如分子层,原子层,器官层,并通过判断更抽象的概念来识别物体。 三、神经网络的训练 知道了神经网络的学习过程就是学习控制着空间变换方式(物质组成方式)的权重矩阵 后,接下来的问题就是如何学习每一层的权重矩阵 。
如何训练: 既然我们希望网络的输出尽可能的接近真正想要预测的值。那么就可以通过比较 当前网络的预测值 和我们真正想要的目标值 ,再根据两者的差异情况来更新每一层的权重矩阵(比如,如果网络的预测值高了,就调整权重让它预测低一些,不断调整,直到能够预测出目标值)。因此就需要先定义 “如何比较 预测值和目标值的差异 ”,这便是损失函数 或目标函数(loss function or objective function) ,用于衡量预测值和目标值的差异的方程。loss function 的输出值(loss)越高表示差异性越大。那神经网络的训练就变成了尽可能的缩小 loss 的过程。 所用的方法是梯度下降(Gradient descent) :通过使 loss 值向当前点对应梯度的反方向不断移动,来降低 loss。一次移动多少是由学习速率(learning rate) 来控制的。
梯度下降的问题: 然而使用梯度下降训练神经网络拥有两个主要难题。
1、局部极小值 梯度下降寻找的是 loss function 的局部极小值,而我们想要全局最小值。如下图所示,我们希望 loss 值可以降低到右侧深蓝色的最低点,但 loss 有可能 “卡” 在左侧的局部极小值中。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/8d1f34de5b4492625d426cab466c9f8d.png" data-rawwidth="420" data-rawheight="250" class="content_image" width="420" _src="https://static.leiphone.com/uploads/new/article/pic/201708/8d1f34de5b4492625d426cab466c9f8d.png"/>
试图解决 “卡在局部极小值” 问题的方法分两大类:
调节步伐: 调节学习速率,使每一次的更新 “步伐” 不同。常用方法有:
随机梯度下降(Stochastic Gradient Descent (SGD):每次只更新一个样本所计算的梯度
小批量梯度下降(Mini-batch gradient descent):每次更新若干样本所计算的梯度的平均值
动量(Momentum):不仅仅考虑当前样本所计算的梯度;Nesterov 动量(Nesterov Momentum):Momentum 的改进
Adagrad、RMSProp、Adadelta、Adam:这些方法都是训练过程中依照规则降低学习速率,部分也综合动量
优化起点: 合理初始化权重(weights initialization)、预训练网络(pre-train),使网络获得一个较好的 “起始点”,如最右侧的起始点就比最左侧的起始点要好。常用方法有:高斯分布初始权重(Gaussian distribution)、均匀分布初始权重(Uniform distribution)、Glorot 初始权重、He 初始权、稀疏矩阵初始权重(sparse matrix)
2、梯度的计算 机器学习所处理的数据都是高维数据,该如何快速计算梯度 、而不是以年来计算。 其次如何更新隐藏层 的权重? 解决方法是:计算图:反向传播算法 这里的解释留给非常棒的 Computational Graphs: Backpropagation 需要知道的是,反向传播算法是求梯度的一种方法 。如同快速傅里叶变换(FFT)的贡献。 而计算图的概念又使梯度的计算更加合理方便。
基本流程图: 下面就结合图简单浏览一下训练和识别过程,并描述各个部分的作用。要结合图解阅读以下内容。但手机显示的图过小,最好用电脑打开。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/1e3e67cb624a1d4ff378927325247bf3.png" data-rawwidth="734" data-rawheight="339" class="origin_image zh-lightbox-thumb" width="734" data-original="https://pic4.zhimg.com/v2-69c014a15afde18a4086950c30e97d1b_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201708/1e3e67cb624a1d4ff378927325247bf3.png"/>
收集训练集(train data): 也就是同时有 input 以及对应 label 的数据。每个数据叫做训练样本(sample)。label 也叫 target,也是机器学习中最贵的部分。上图表示的是我的数据库。假设 input 本别是 x 的维度是 39,label 的维度是 48。
设计网络结构(architecture): 确定层数、每一隐藏层的节点数和激活函数,以及输出层的激活函数和损失函数。上图用的是两层隐藏层(最后一层是输出层)。隐藏层所用激活函数 a() 是 ReLu,输出层的激活函数是线性 linear(也可看成是没有激活函数)。隐藏层都是 1000 节点。损失函数 L() 是用于比较距离 MSE:mean((output - target)^2)。MSE 越小表示预测效果越好。训练过程就是不断减小 MSE 的过程。到此所有数据的维度都已确定:
数据预处理(preprocessing): 将所有样本的 input 和 label 处理成能够使用神经网络的数据,label 的值域符合激活函数的值域。并简单优化数据以便让训练易于收敛。比如中心化(mean subtraction)、归一化(normalization)、主成分分析(PCA)、白化(whitening)。假设上图的 input 和 output 全都经过了中心化和归一化。
权重初始化(weights initialization): 在训练前不能为空,要初始化才能够计算 loss 从而来降低。 初始化决定了 loss 在 loss function 中从哪个点开始作为起点训练网络。上图用均匀分布初始权重(Uniform distribution)。
训练网络(training): 训练过程就是用训练数据的 input 经过网络计算出 output,再和 label 计算出 loss,再计算出 gradients 来更新 weights 的过程。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/cd1896d89059e20ecdc3d02446fda640.png" data-rawwidth="469" data-rawheight="227" class="origin_image zh-lightbox-thumb" width="469" data-original="https://pic4.zhimg.com/v2-0c0e7f5ffa98c2c1eb87763dd5d1d9a3_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201708/cd1896d89059e20ecdc3d02446fda640.png"/>
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/e9e9a2c61a83c72b995da42d30953f9f.jpg" data-rawwidth="2000" data-rawheight="1600" class="origin_image zh-lightbox-thumb" width="2000" data-original="https://pic1.zhimg.com/v2-a675e692f7f7755d91bcdba5e988e910_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201708/e9e9a2c61a83c72b995da42d30953f9f.jpg"/>
注:此部分内容不是 这篇文章的重点 ,但为了理解深层 神经网络,需要明白最基本的训练过程。 若能理解训练过程是通过梯度下降尽可能缩小 loss 的过程即可。 若有理解障碍,可以用 python 实践一下从零开始训练一个神经网络 ,体会整个训练过程。若有时间则可以再体会一下计算图自动求梯度的方便利用 TensorFlow 。
打开网页后,总体来说,蓝色代表正值,黄色代表负值。拿分类 任务来分析。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/2a634170594c37b7566a8cf3ffab820d.png" data-rawwidth="173" data-rawheight="169" class="content_image" width="173" _src="https://static.leiphone.com/uploads/new/article/pic/201708/2a634170594c37b7566a8cf3ffab820d.png"/>
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/64298fa8de56e12ac4d93bdf9989a401.png" data-rawwidth="92" data-rawheight="228" class="content_image" width="92" _src="https://static.leiphone.com/uploads/new/article/pic/201708/64298fa8de56e12ac4d93bdf9989a401.png"/>
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/3476511e93d170a5702a719b82cd3e74.png" data-rawwidth="315" data-rawheight="136" class="content_image" width="315" _src="https://static.leiphone.com/uploads/new/article/pic/201708/3476511e93d170a5702a719b82cd3e74.png"/> (1)
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/e34ff5b8369daac328df9994fc3175ab.png" data-rawwidth="294" data-rawheight="123" class="content_image" width="294" _src="https://static.leiphone.com/uploads/new/article/pic/201708/e34ff5b8369daac328df9994fc3175ab.png"/> (2)
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/e4010bdb6584992a4113191bacd09e09.png" data-rawwidth="1116" data-rawheight="363" class="origin_image zh-lightbox-thumb" width="1116" data-original="https://pic2.zhimg.com/v2-dff3f6e72881ebd222414eabb9504671_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201708/e4010bdb6584992a4113191bacd09e09.png"/>
上图中所有在黄色背景颜色的点都会被分类为 “黄点 “,同理,蓝色区域被分成蓝点。在上面的分类分布图中你可以看到每一层通过上一层信息的组合所形成的。权重(那些连接线)控制了 “如何组合”。神经网络的学习也就是从数据中学习那些权重。Tensorflow playground 所表现出来的现象就是 “在我文章里所写的 “物质组成思想”,这也是为什么我把 Tensorflow playground 放在了那一部分。
不过你要是把 Tensorflow 的个名字拆开来看的话,是 tensor(张量)的 flow(流动)。Tensorflow playground 的作者想要阐述的侧重点是 “张量如何流动 ” 的。
5 种空间变换的理解: Tensorflow playground 下没有体现 5 种空间变换的理解。需要打开这个网站尝试:ConvNetJS demo: Classify toy 2D data
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/632ae02d5d23cc0b0fe177ddbddb34e5.png" data-rawwidth="841" data-rawheight="425" class="origin_image zh-lightbox-thumb" width="841" data-original="https://pic2.zhimg.com/v2-55811ac3d91f56f19543714b1b5abe49_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201708/632ae02d5d23cc0b0fe177ddbddb34e5.png"/>
左侧是原始输入空间下的分类图,右侧是转换后的高维空间下的扭曲图。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/ac25860b3ae70a8765ec17a05c708fbf.png" data-rawwidth="848" data-rawheight="417" class="origin_image zh-lightbox-thumb" width="848" data-original="https://pic4.zhimg.com/v2-a81a10592b96a1d2b067e1d4ae3951e7_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201708/ac25860b3ae70a8765ec17a05c708fbf.png"/>
最终的扭曲效果是所有绿点都被扭曲到了一侧,而所有红点都被扭曲到了另一侧。这样就可以线性分割(用超平面(这里是一个平面)在中间分开两类)
四、表现原因 文章的最后稍微提一下深层神经网络。深层神经网络就是拥有更多层数的神经网络。
按照上文在理解视角中所述的观点,可以想出下面两条理由关于为什么更深的网络会更加容易识别,增加容纳变异体(variation)(红苹果、绿苹果)的能力、鲁棒性(robust)。
数学视角: 变异体(variation)很多的分类的任务需要高度非线性的分割曲线。不断的利用那 5 种空间变换操作将原始输入空间像 “捏橡皮泥一样” 在高维空间下捏成更为线性可分 / 稀疏的形状。
物理视角: 通过对 “抽象概念 ” 的判断来识别物体,而非细节。比如对 “飞机” 的判断,即便人类自己也无法用语言或者若干条规则来解释自己如何判断一个飞机。因为人脑中真正判断的不是是否 “有机翼”、“能飞行” 等细节现象,而是一个抽象概念。层数越深,这种概念就越抽象,所能涵盖的变异体 就越多,就可以容纳战斗机,客机等很多种不同种类的飞机。
雷峰网版权文章,未经授权禁止转载。详情见转载须知 。