如何简单形象又有趣地讲解神经网络是什么?

有网友在 Quora 上提问:对于那些非计算机科学行业的人,你会如何向他们解释机器学习和数据挖掘? 斯坦福大学的印度学生、机器学习爱好者 PararthShah 在2012年12月22日的使用买芒果的例子,非常经典易懂。 如何用类似的方法来解释神经网络?
关注者
9607
被浏览
323113

40 个回答

神经网络很萌的!

0. 分类
神经网络最重要的用途是分类,为了让大家对分类有个直观的认识,咱们先看几个例子:
  • 垃圾邮件识别:现在有一封电子邮件,把出现在里面的所有词汇提取出来,送进一个机器里,机器需要判断这封邮件是否是垃圾邮件。
  • 疾病判断:病人到医院去做了一大堆肝功、尿检测验,把测验结果送进一个机器里,机器需要判断这个病人是否得病,得的什么病。
  • 猫狗分类:有一大堆猫、狗照片,把每一张照片送进一个机器里,机器需要判断这幅照片里的东西是猫还是狗。
这种能自动对输入的东西进行分类的机器,就叫做分类器。

分类器的输入是一个数值向量,叫做特征(向量)。在第一个例子里,分类器的输入是一堆0、1值,表示字典里的每一个词是否在邮件中出现,比如向量(1,1,0,0,0......)就表示这封邮件里只出现了两个词abandon和abnormal;第二个例子里,分类器的输入是一堆化验指标;第三个例子里,分类器的输入是照片,假如每一张照片都是320*240像素的红绿蓝三通道彩色照片,那么分类器的输入就是一个长度为320*240*3=230400的向量。

分类器的输出也是数值。第一个例子中,输出1表示邮件是垃圾邮件,输出0则说明邮件是正常邮件;第二个例子中,输出0表示健康,输出1表示有甲肝,输出2表示有乙肝,输出3表示有饼干等等;第三个例子中,输出0表示图片中是狗,输出1表示是猫。

分类器的目标就是让正确分类的比例尽可能高。一般我们需要首先收集一些样本,人为标记上正确分类结果,然后用这些标记好的数据训练分类器,训练好的分类器就可以在新来的特征向量上工作了。

1. 神经元
咱们假设分类器的输入是通过某种途径获得的两个值,输出是0和1,比如分别代表猫和狗。现在有一些样本:
大家想想,最简单地把这两组特征向量分开的方法是啥?当然是在两组数据中间画一条竖直线,直线左边是狗,右边是猫,分类器就完成了。以后来了新的向量,凡是落在直线左边的都是狗,落在右边的都是猫。

一条直线把平面一分为二,一个平面把三维空间一分为二,一个n-1维超平面把n维空间一分为二,两边分属不同的两类,这种分类器就叫做神经元。

大家都知道平面上的直线方程是ax+by+c=0,等式左边大于零和小于零分别表示点(x,y)在直线的一侧还是另一侧,把这个式子推广到n维空间里,直线的高维形式称为超平面,它的方程是:
h = a_1x_1+a_2 x_2+...+a_nx_n+a_0=0
神经元就是当h大于0时输出1,h小于0时输出0这么一个模型,它的实质就是把特征空间一切两半,认为两瓣分别属两个类。你恐怕再也想不到比这更简单的分类器了,它是McCulloch和Pitts在1943年想出来了。

这个模型有点像人脑中的神经元:从多个感受器接受电信号x_1, x_2,...,x_n,进行处理(加权相加再偏移一点,即判断输入是否在某条直线h=0的一侧),发出电信号(在正确的那侧发出1,否则不发信号,可以认为是发出0),这就是它叫神经元的原因。

当然,上面那幅图我们是开了上帝视角才知道“一条竖直线能分开两类”,在实际训练神经元时,我们并不知道特征是怎么抱团的。神经元模型的一种学习方法称为Hebb算法:

先随机选一条直线/平面/超平面,然后把样本一个个拿过来,如果这条直线分错了,说明这个点分错边了,就稍微把直线移动一点,让它靠近这个样本,争取跨过这个样本,让它跑到直线正确的一侧;如果直线分对了,它就暂时停下不动。因此训练神经元的过程就是这条直线不断在跳舞,最终跳到两个类之间的竖直线位置。

2. 神经网络
MP神经元有几个显著缺点。首先它把直线一侧变为0,另一侧变为1,这东西不可微,不利于数学分析。人们用一个和0-1阶跃函数类似但是更平滑的函数Sigmoid函数来代替它(Sigmoid函数自带一个尺度参数,可以控制神经元对离超平面距离不同的点的响应,这里忽略它),从此神经网络的训练就可以用梯度下降法来构造了,这就是有名的反向传播算法。

神经元的另一个缺点是:它只能切一刀!你给我说说一刀怎么能把下面这两类分开吧。
解决办法是多层神经网络,底层神经元的输出是高层神经元的输入。我们可以在中间横着砍一刀,竖着砍一刀,然后把左上和右下的部分合在一起,与右上的左下部分分开;也可以围着左上角的边沿砍10刀把这一部分先挖出来,然后和右下角合并。

每砍一刀,其实就是使用了一个神经元,把不同砍下的半平面做交、并等运算,就是把这些神经元的输出当作输入,后面再连接一个神经元。这个例子中特征的形状称为异或,这种情况一个神经元搞不定,但是两层神经元就能正确对其进行分类。

只要你能砍足够多刀,把结果拼在一起,什么奇怪形状的边界神经网络都能够表示,所以说神经网络在理论上可以表示很复杂的函数/空间分布。但是真实的神经网络是否能摆动到正确的位置还要看网络初始值设置、样本容量和分布。

神经网络神奇的地方在于它的每一个组件非常简单——把空间切一刀+某种激活函数(0-1阶跃、sigmoid、max-pooling),但是可以一层一层级联。输入向量连到许多神经元上,这些神经元的输出又连到一堆神经元上,这一过程可以重复很多次。这和人脑中的神经元很相似:每一个神经元都有一些神经元作为其输入,又是另一些神经元的输入,数值向量就像是电信号,在不同神经元之间传导,每一个神经元只有满足了某种条件才会发射信号到下一层神经元。当然,人脑比神经网络模型复杂很多:人工神经网络一般不存在环状结构;人脑神经元的电信号不仅有强弱,还有时间缓急之分,就像莫尔斯电码,在人工神经网络里没有这种复杂的信号模式。



神经网络的训练依靠反向传播算法:最开始输入层输入特征向量,网络层层计算获得输出,输出层发现输出和正确的类号不一样,这时它就让最后一层神经元进行参数调整,最后一层神经元不仅自己调整参数,还会勒令连接它的倒数第二层神经元调整,层层往回退着调整。经过调整的网络会在样本上继续测试,如果输出还是老分错,继续来一轮回退调整,直到网络输出满意为止。这很像中国的文艺体制,武媚娘传奇剧组就是网络中的一个神经元,最近刚刚调整了参数。

3. 大型神经网络

我们不禁要想了,假如我们的这个网络有10层神经元,第8层第2015个神经元,它有什么含义呢?我们知道它把第七层的一大堆神经元的输出作为输入,第七层的神经元又是以第六层的一大堆神经元做为输入,那么这个特殊第八层的神经元,它会不会代表了某种抽象的概念?

就好比你的大脑里有一大堆负责处理声音、视觉、触觉信号的神经元,它们对于不同的信息会发出不同的信号,那么会不会有这么一个神经元(或者神经元小集团),它收集这些信号,分析其是否符合某个抽象的概念,和其他负责更具体和更抽象概念的神经元进行交互。

2012年多伦多大学的Krizhevsky等人构造了一个超大型卷积神经网络[1],有9层,共65万个神经元,6千万个参数。网络的输入是图片,输出是1000个类,比如小虫、美洲豹、救生船等等。这个模型的训练需要海量图片,它的分类准确率也完爆先前所有分类器。纽约大学的Zeiler和Fergusi[2]把这个网络中某些神经元挑出来,把在其上响应特别大的那些输入图像放在一起,看它们有什么共同点。他们发现中间层的神经元响应了某些十分抽象的特征。

第一层神经元主要负责识别颜色和简单纹理

第二层的一些神经元可以识别更加细化的纹理,比如布纹、刻度、叶纹。


第三层的一些神经元负责感受黑夜里的黄色烛光、鸡蛋黄、高光。

第四层的一些神经元负责识别萌狗的脸、七星瓢虫和一堆圆形物体的存在。

第五层的一些神经元可以识别出花、圆形屋顶、键盘、鸟、黑眼圈动物。


这里面的概念并不是整个网络的输出,是网络中间层神经元的偏好,它们为后面的神经元服务。虽然每一个神经元都傻不拉几的(只会切一刀),但是65万个神经元能学到的东西还真是深邃呢。

[1] Krizhevsky, A., Sutskever, I., & Hinton, G. E. (2012). Imagenet classification with deep convolutional neural networks. In Advances in neural information processing systems (pp. 1097-1105).
[2] Zeiler, M. D., & Fergus, R. (2013). Visualizing and understanding convolutional neural networks. arXiv preprint arXiv:1311.2901.

超智能体专栏


YJango 的 Live -- 深层学习入门误区



深层学习为何要“Deep”(上) - 知乎专栏

深层学习为何要“Deep”(下) - 知乎专栏

YJango 的 Live -- 深层学习入门误区

串讲 线性代数、概率、熵 - 知乎专栏

TensorFlow基本用法 - 知乎专栏

Tensorflow代码演示LV1 · 超智能体 (看不了gitbook请看代码演示LV1)

Tensorflow实现神经网络(2) - 知乎专栏

Tensorflow实现深层学习完备流程 - 知乎专栏

循环神经网络(Recurrent)--介绍 - 知乎专栏

循环神经网络--实现LSTM - 知乎专栏


深层学习开启了人工智能的新时代。不论任何行业都害怕错过这一时代浪潮,因而大批资金和人才争相涌入。但深层学习却以“黑箱”而闻名,不仅调参难,训练难,“新型”网络结构的论文又如雨后春笋般地涌现,使得对所有结构的掌握变成了不现实。我们缺少一个对深层学习合理的认识。

本文就是通过对深层神经网络惊人表现背后原因的思考,揭示设计一个神经网络的本质,从而获得一个对“如何设计网络”的全局指导。


深层学习为何要“Deep”(上)一、基本变换:层

神经网络是由一层一层构建的,那么每究竟在做什么?

  • 数学式子\vec{y}= a(W\cdot\vec{x} + {b}),其中\vec{x}是输入向量,\vec{y}是输出向量,\vec{b}是偏移向量,W是权重矩阵,a()是激活函数。每一层仅仅是把输入\vec x经过如此简单的操作得到\vec y
  • 数学理解:通过如下5种对输入空间(输入向量的集合)的操作,完成 输入空间 ——> 输出空间 的变换 (矩阵的行空间到列空间)。 注:用“空间”二字的原因是被分类的并不是单个事物,而是一类事物。空间是指这类事物所有个体的集合。
    • 1. 升维/降维
    • 2. 放大/缩小
    • 3. 旋转
    • 4. 平移
    • 5. “弯曲” 这5种操作中,1,2,3的操作由W\cdot\vec{x}完成,4的操作是由+\vec{b}完成,5的操作则是由a()来实现。 (此处有动态图5种空间操作,帮助理解)

每层神经网络的数学理解:用线性变换跟随着非线性变化,将输入空间投向另一个空间
  • 物理理解:对 W\cdot\vec{x} 的理解就是通过组合形成新物质 a()又符合了我们所处的世界都是非线性的特点。
    • 情景:\vec{x}是二维向量,维度是碳原子和氧原子的数量 [C;O],数值且定为[1;1],若确定\vec{y}是三维向量,就会形成如下网络的形状 (神经网络的每个节点表示一个维度)。通过改变权重的值,可以获得若干个不同物质。右侧的节点数决定了想要获得多少种不同的新物质。(矩阵的行数) 1.如果权重W的数值如(1),那么网络的输出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] (1)
    • 2.也可以减少右侧的一个节点,并改变权重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](2) 3.如果希望通过层网络能够从[C, O]空间转变到[CO_{2};O_{3};CO]空间的话,那么网络的学习过程就是将W的数值变成尽可能接近(1)的过程 。如果再加一层,就是通过组合[CO_{2};O_{3};CO]这三种基础物质,形成若干更高层的物质。 4.重要的是这种组合思想,组合成的东西在神经网络中并不需要有物理意义。

每层神经网络的物理理解:通过现有的不同物质的组合形成新物质

二、理解视角:

现在我们知道了每一层的行为,但这种行为又是如何完成识别任务的呢?


数学视角:“线性可分”

  • 一维情景:以分类为例,当要分类正数、负数、零,三类的时候,一维空间的直线可以找到两个超平面(比当前空间低一维的子空间。当前空间是直线的话,超平面就是点)分割这三类。但面对像分类奇数和偶数无法找到可以区分它们的点的时候,我们借助 x % 2(取余)的转变,把x变换到另一个空间下来比较,从而分割。
  • 二维情景:平面的四个象限也是线性可分。但下图的红蓝两条线就无法找到一超平面去分割。 <img src="pic4.zhimg.com/v2-b1bd0" data-rawwidth="197" data-rawheight="204" class="content_image" width="197">神经网络的解决方法依旧是转换到另外一个空间下,用的是所说的神经网络的解决方法依旧是转换到另外一个空间下,用的是所说的5种空间变换操作。比如下图就是经过放大、平移、旋转、扭曲原二维空间后,在三维空间下就可以成功找到一个超平面分割红蓝两线 (同SVM的思路一样)。 <img src="pic4.zhimg.com/v2-8d7d1" data-rawwidth="197" data-rawheight="198" class="content_image" width="197">上面是一层神经网络可以做到的,如果把上面是一层神经网络可以做到的,如果把\vec{y} 当做新的输入再次用这5种操作进行第二遍空间变换的话,网络也就变为了二层。最终输出是\vec{y}= a_{2}(W_{2}\cdot(a_{1}(W_{1}\cdot\vec{x} + {b}_{1})) + {b}_{2})。 设想网络拥有很多层时,对原始输入空间的“扭曲力”会大幅增加,如下图,最终我们可以轻松找到一个超平面分割空间。 <img src="pic4.zhimg.com/v2-d831a" data-rawwidth="204" data-rawheight="201" class="content_image" width="204">当然也有如下图失败的时候,关键在于“如何扭曲空间”。所谓监督学习就是给予神经网络网络大量的训练例子,让网络从训练例子中学会如何变换空间。每一层的权重W就当然也有如下图失败的时候,关键在于“如何扭曲空间”。所谓监督学习就是给予神经网络网络大量的训练例子,让网络从训练例子中学会如何变换空间。每一层的权重W就控制着如何变换空间,我们最终需要的也就是训练好的神经网络的所有层的权重矩阵。。这里有非常棒的可视化空间变换demo一定要打开尝试并感受这种扭曲过程。更多内容请看Neural Networks, Manifolds, and Topology

上面的内容有三张动态图,对于理解这种空间变化非常有帮助。由于知乎不支持动态图,可以在gitbook深层学习为何要“deep”上感受那三张图。一定一定要感受

线性可分视角:神经网络的学习就是学习如何利用矩阵的线性变换加激活函数的非线性变换,将原始输入空间投向线性可分/稀疏的空间去分类/回归。
增加节点数:增加维度,即增加线性转换能力。 增加层数:增加激活函数的次数,即增加非线性转换次数。

物理视角:“物质组成”

  • 类比:回想上文由碳氧原子通过不同组合形成若干分子的例子。从分子层面继续迭代这种组合思想,可以形成DNA,细胞,组织,器官,最终可以形成一个完整的人。继续迭代还会有家庭,公司,国家等。这种现象在身边随处可见。并且原子的内部结构与太阳系又惊人的相似。不同层级之间都是以类似的几种规则再不断形成新物质。你也可能听过分形学这三个字。可通过观看从1米到150亿光年来感受自然界这种层级现象的普遍性。
  • 人脸识别情景:我们可以模拟这种思想并应用在画面识别上。由像素组成菱角再组成五官最后到不同的人脸。每一层代表不同的不同的物质层面 (如分子层)。而每层的W存储着如何组合上一层的物质从而形成新物质。 如果我们完全掌握一架飞机是如何从分子开始一层一层形成的,拿到一堆分子后,我们就可以判断他们是否可以以此形成方式,形成一架飞机。 附:Tensorflow playground展示了数据是如何“流动”的。
物质组成视角:神经网络的学习过程就是学习物质组成方式的过程。
增加节点数:增加同一层物质的种类,比如118个元素的原子层就有118个节点。 增加层数:增加更多层级,比如分子层,原子层,器官层,并通过判断更抽象的概念来识别物体。

按照上文在理解视角中所述的观点,可以想出下面两条理由关于为什么更深的网络会更加容易识别,增加容纳变异体(variation)(红苹果、绿苹果)的能力、鲁棒性(robust)。

数学视角:变异体(variation)很多的分类的任务需要高度非线性的分割曲线。不断的利用那5种空间变换操作将原始输入空间像“捏橡皮泥一样”在高维空间下捏成更为线性可分/稀疏的形状。 物理视角:通过对“抽象概念”的判断来识别物体,而非细节。比如对“飞机”的判断,即便人类自己也无法用语言或者若干条规则来解释自己如何判断一个飞机。因为人脑中真正判断的不是是否“有机翼”、“能飞行”等细节现象,而是一个抽象概念。层数越深,这种概念就越抽象,所能涵盖的变异体就越多,就可以容纳战斗机,客机等很多种不同种类的飞机。



三、神经网络的训练

知道了神经网络的学习过程就是学习控制着空间变换方式(物质组成方式)的权重矩阵后,接下来的问题就是如何学习每一层的权重矩阵W。


如何训练:

既然我们希望网络的输出尽可能的接近真正想要预测的值。那么就可以通过比较当前网络的预测值和我们真正想要的目标值,再根据两者的差异情况来更新每一层的权重矩阵(比如,如果网络的预测值高了,就调整权重让它预测低一些,不断调整,直到能够预测出目标值)。因此就需要先定义“如何比较预测值和目标值的差异”,这便是损失函数或目标函数(loss function or objective function),用于衡量预测值和目标值的差异的方程。loss function的输出值(loss)越高表示差异性越大。那神经网络的训练就变成了尽可能的缩小loss的过程。 所用的方法是梯度下降(Gradient descent):通过使loss值向当前点对应梯度的反方向不断移动,来降低loss。一次移动多少是由学习速率(learning rate)来控制的。


梯度下降的问题:

然而使用梯度下降训练神经网络拥有两个主要难题。


1、局部极小值

梯度下降寻找的是loss function的局部极小值,而我们想要全局最小值。如下图所示,我们希望loss值可以降低到右侧深蓝色的最低点,但loss有可能“卡”在左侧的局部极小值中。

<img src="pic2.zhimg.com/v2-00fe1" data-rawwidth="420" data-rawheight="250" class="content_image" width="420">试图解决“卡在局部极小值”问题的方法分两大类:

试图解决“卡在局部极小值”问题的方法分两大类:

  • 调节步伐:调节学习速率,使每一次的更新“步伐”不同。常用方法有:
  • 随机梯度下降(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)的贡献。 而计算图的概念又使梯度的计算更加合理方便。


基本流程图:

下面就结合图简单浏览一下训练和识别过程,并描述各个部分的作用。要结合图解阅读以下内容。但手机显示的图过小,最好用电脑打开

  • 收集训练集(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的过程。到此所有数据的维度都已确定:
    • 训练数据:input \in R^{39} ;label \in R^{48}
    • 权重矩阵:W_{h1}\in R^{1000x39};W_{h2}\in R^{1000x1000} ;W_{o}\in R^{48x1000}
    • 偏移向量:b_{h1}\in R^{1000};b_{h2}\in R^{1000} ;b_{o}\in R^{48}
    • 网络输出:output \in R^{48}

  • 数据预处理(preprocessing):将所有样本的input和label处理成能够使用神经网络的数据,label的值域符合激活函数的值域。并简单优化数据以便让训练易于收敛。比如中心化(mean subtraction)、归一化(normlization)、主成分分析(PCA)、白化(whitening)。假设上图的input和output全都经过了中心化和归一化。
  • 权重初始化(weights initialization)W_{h1},W_{h2},W_{0}在训练前不能为空,要初始化才能够计算loss从而来降低。W_{h1},W_{h2},W_{0}初始化决定了loss在loss function中从哪个点开始作为起点训练网络。上图用均匀分布初始权重(Uniform distribution)。
  • 训练网络(training):训练过程就是用训练数据的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})
    • 计算loss:loss = mean((output - target)^2)
    • 计算梯度:从loss开始反向传播计算每个参数(parameters)对应的梯度(gradients)。这里用Stochastic Gradient Descent (SGD) 来计算梯度,即每次更新所计算的梯度都是从一个样本计算出来的。传统的方法Gradient Descent是正向传递所有样本来计算梯度。SGD的方法来计算梯度的话,loss function的形状如下图所示会有变化,这样在更新中就有可能“跳出”局部最小值。
    • 更新权重:这里用最简单的方法来更新,即所有参数都 W = W - learningrate * gradient
    • 预测新值:训练过所有样本后,打乱样本顺序再次训练若干次。训练完毕后,当再来新的数据input,就可以利用训练的网络来预测了。这时的output就是效果很好的预测值了。下图是一张实际值预测值的三组对比图。输出数据是48维,这里只取1个维度来画图。蓝色的是实际值,绿色的是实际值。最上方的是训练数据的对比图,而下方的两行是神经网络模型从未见过的数据预测对比图。(不过这里用的是RNN,主要是为了让大家感受一下效果)

注:此部分内容不是这篇文章的重点,但为了理解深层神经网络,需要明白最基本的训练过程。 若能理解训练过程是通过梯度下降尽可能缩小loss的过程即可。 若有理解障碍,可以用python实践一下从零开始训练一个神经网络,体会整个训练过程。若有时间则可以再体会一下计算图自动求梯度的方便利用TensorFlow


四、结合Tensorflow playground理解5种空间操作物质组成视角

打开网页后,总体来说,蓝色代表正值,黄色代表负值。拿分类任务来分析。

  • 数据:在二维平面内,若干点被标记成了两种颜色。黄色,蓝色,表示想要区分的两类。你可以把平面内的任意点标记成任意颜色。网页给你提供了4种规律。神经网络会根据你给的数据训练,再分类相同规律的点。

  • 输入:在二维平面内,你想给网络多少关于“点”的信息。从颜色就可以看出来,x_{1}左边是负,右边是正,x_{1}表示此点的横坐标值。同理,x_{2}表示此点的纵坐标值。x_{1}^{2}是关于横坐标值的“抛物线”信息。你也可以给更多关于这个点的信息。给的越多,越容易被分开。
  • 连接线:表示权重,蓝色表示用神经元的原始输出,黄色表示用负输出。深浅表示权重的绝对值大小。鼠标放在线上可以看到具体值。也可以更改。在(1)中,当把x_{2}输出的一个权重改为-1时,x_{2}的形状直接倒置了。不过还需要考虑激活函数。(1)中用的是linear。在(2)中,当换成sigmoid时,你会发现没有黄色区域了。因为sigmoid的值域是(0,1) <img src="pic1.zhimg.com/v2-2820b" data-rawwidth="315" data-rawheight="136" class="content_image" width="315">(1)(1)<img src="pic1.zhimg.com/v2-83fd9" data-rawwidth="294" data-rawheight="123" class="content_image" width="294">(2)(2)
  • 输出:黄色背景颜色都被归为黄点类,蓝色背景颜色都被归为蓝点类。深浅表示可能性的强弱。<img src="pic2.zhimg.com/v2-dff3f" data-rawwidth="1116" data-rawheight="363" class="content_image" width="1116" data-original="pic2.zhimg.com/v2-dff3f">上图中所有在黄色背景颜色的点都会被分类为“黄点“,同理,蓝色区域被分成蓝点。在上面的分类分布图中你可以看到每一层通过上一层信息的组合所形成的。权重(那些连接线)控制了“如何组合”。神经网络的学习也就是从数据中学习那些权重。Tensorflow playground所表现出来的现象就是“在我文章里所写的“物质组成思想”,这也是为什么我把上图中所有在黄色背景颜色的点都会被分类为“黄点“,同理,蓝色区域被分成蓝点。在上面的分类分布图中你可以看到每一层通过上一层信息的组合所形成的。权重(那些连接线)控制了“如何组合”。神经网络的学习也就是从数据中学习那些权重。Tensorflow playground所表现出来的现象就是“在我文章里所写的“物质组成思想”,这也是为什么我把Tensorflow playground放在了那一部分。

不过你要是把Tensorflow的个名字拆开来看的话,是tensor(张量)的flow(流动)。Tensorflow playground的作者想要阐述的侧重点是“张量如何流动”的。


5种空间变换的理解:Tensorflow playground下没有体现5种空间变换的理解。需要打开这个网站尝试:ConvNetJS demo: Classify toy 2D data

<img src="pic2.zhimg.com/v2-55811" data-rawwidth="841" data-rawheight="425" class="content_image" width="841" data-original="pic2.zhimg.com/v2-55811">左侧是原始输入空间下的分类图,右侧是转换后的高维空间下的扭曲图。

左侧是原始输入空间下的分类图,右侧是转换后的高维空间下的扭曲图。

<img src="pic4.zhimg.com/v2-a81a1" data-rawwidth="848" data-rawheight="417" class="content_image" width="848" data-original="pic4.zhimg.com/v2-a81a1">最终的扭曲效果是所有绿点都被扭曲到了一侧,而所有红点都被扭曲到了另一侧。这样就可以线性分割(用超平面(这里是一个平面)在中间分开两类)

最终的扭曲效果是所有绿点都被扭曲到了一侧,而所有红点都被扭曲到了另一侧。这样就可以线性分割(用超平面(这里是一个平面)在中间分开两类)


深层学习为何要“Deep”(下)


虽然在gitbook上已有为何深层学习,但还是发一下照顾那些关注了超智能体,又只希望在知乎上看文章的小伙伴。近期由于期刊论文deadline将至(Winter is Coming),变体神经网络(RNN,CNN等不同变体的统一理解)部分会在17号开始继续写。

神经网络并不缺少新结构,但缺少一个该领域的E=mc^2

很多人在做神经网络的实验时会发现调节某些方式和结构会产生意想不到的结果。但就我个人而言,这些发现并不会让我感到满足。我更关心这些新发现到底告诉我们了什么,造成这些现象的背后原因是什么。我会更想要将新的网络结构归纳到已有的体系当中。这也是我更多思考“为何深层学习有效”的原因。下面便是目前YJango关于这方面的见解。

深层神经网络相比一般的统计学习拥有从数学的严谨中不会得出的关于物理世界的先验知识(非贝叶斯先验)。该内容也在Bengio大神的论文和演讲中多次强调。大神也在Bay Area Deep Learning School 2016的Founda’ons and Challenges of Deep Learning pdf(这里也有视频,需翻墙)中提到的distributed representations和compositionality两点就是神经网络和深层神经网络高效的原因(若有时间,强烈建议看完演讲再看该文)。虽然与大神的思考起点可能不同,但结论完全一致(看到Bengio大神的视频时特别兴奋)。下面就是结合例子分析: 1. 为什么神经网络高效 2. 学习的本质是什么 3. 为什么深层神经网络比浅层神经网络更高效 4. 神经网络在什么问题上不具备优势

其他推荐读物

  • Bengio Y. Learning deep architectures for AI[J]. Foundations and trends® in Machine Learning, 2009, 2(1): 1-127.
  • Brahma P P, Wu D, She Y. Why Deep Learning Works: A Manifold Disentanglement Perspective[J]. 2015.
  • Lin H W, Tegmark M. Why does deep and cheap learning work so well?[J]. arXiv preprint arXiv:1608.08225, 2016.
  • Bengio Y, Courville A, Vincent P. Representation learning: A review and new perspectives[J]. IEEE transactions on pattern analysis and machine intelligence, 2013, 35(8): 1798-1828.
  • Deep Learning textbook by Ian Goodfellow and Yoshua Bengio and Aaron Courville

YJango的整个思考流程都围绕减熵二字进行。之前在《熵与生命》和《生物学习》中讨论过,生物要做的是降低环境的熵,将不确定状态变为确定状态。通常机器学习是优化损失函数,并用概率来衡量模型优劣。然而概率正是由于无法确定状态才不得不用的衡量手段。生物真正想要的是没有丝毫不确定性。

深层神经网络在自然问题上更具优势,因为它和生物学习一样,是找回使熵增加的“物理关系”(知识,并非完全一样),将变体(2^n)转化回因素(n)附带物理关系的形式,从源头消除熵(假设每个因素只有两种可能状态)。这样所有状态间的关系可以被确定,要么肯定发生,要么绝不发生,也就无需用概率来衡量。因此下面定义的学习目标并非单纯降低损失函数,而从确定关系的角度考虑。一个完美训练好的模型就是两个状态空间内所有可能取值间的关系都被确定的模型。

学习目标:是确定(determine)两个状态空间内所有可能取值之间的关系,使得熵尽可能最低。

:对熵不了解的朋友可以简单记住,事件的状态越确定,熵越小。如绝不发生(概率0)或肯定发生(概率为1)的事件熵小。而50%可能性事件的熵反而大。

为举例说明,下面就一起考虑用神经网络学习以下两个集合的不同关联(OR gate 和 XOR gate)。看看随着网络结构和关联的改变,会产生什么不同情况。尤其是最后网络变深时与浅层神经网络的区别。

:选择这种XOR这种简单关联的初衷是输入和输出空间状态的个数有限,易于分析变体个数和熵增的关系。

:用“变体(variation)”是指同一类事物的不同形态,比如10张狗的图片,虽然外貌各异,但都是狗。

问题描述:集合A有4个状态,集合B有2个状态。0和1只是用于表示不同状态的符号,也可以用0,1,2,3表示。状态也并不一定表示数字,可以表示任何物理意义。

A=\{00,01,10,11\}B=\{0,1\}

方式1:记忆

  • 随机变量X:可能取值是 \{00,01,10,11\}
  • 随机变量Y:可能取值是 \{0,1\}

:随机变量(大写X)是将事件投射到实数的函数。用对应的实数表示事件。而小写字母x表示对应该实数的事件发生了,是一个具体实例。

  • 网络结构:暂且不规定要学习的关联是OR还是XOR,先建立一个没有隐藏层,仅有一个输入节点,一个输出节点的神经网络。
  • 表达式y=M(x)=\phi(w_{1} \cdot x+b)\phi表示sigmoid函数。(只要是非线性即可,relu是目前的主流)
  • 说明:下图右侧中的虚线表示的既不是神经网络的链接,也不是函数中的映射,而是两个空间中,所有可能值之间的关系(relation)。学习的目的是确定这些状态的关系。比如当输入00时,模型要尝试告诉我们00到1的概率为0,00到0的概率为1,这样熵H(X)=-\sum\limits _ {i} p_{i}(x)logp_{i}(x)才会为零。
  • 关系图:左侧是网络结构,右侧是状态关系图。输入和输出空间之间共有8个关系(非箭头虚线表示关系)。除非这8个关系对模型来说都是相同的,否则用w_{h1}表示f:X\rightarrow Y时的熵H(M(X),X)就会增加。(w_{h1}无法照顾到8个关系,若完美拟合一个关系,其余的关系就不准确)

:这里YJango是w_{h1}用表示\phi(w_{h1} \cdot x+b)的缩写。


  • 数据量:极端假设,若用查找表来表示关系:需要用8个不同的(x,y)数据来记住想要拟合的f:X\rightarrow Y

方式2:手工特征

  • 特征:空间A的4个状态是由两个0或1的状态共同组成。我们可以观察出来(计算机并不能),我们利用这种知识k()把A中的状态分解开(disentangle)。分解成两个独立的子随机变量H_{1}= \{0,1\}H_{2}= \{0,1\}。也就是用二维向量表示输入。
  • 网络结构:由于分成了二维特征,这次网络结构的输入需改成两个节点。下图中的上半部分是,利用人工知识k()将随机变量X无损转变为H_{1}H_{2}的共同表达(representation)。这时h_{1}h_{1}一起形成网络输入。

:k()旁边的黑线(实线表示确定关系)并非是真正的神经网络结构,只是方便理解,可以简单想象成神经网络转变的。

  • 表达式y=M(h)=\phi(W_{h} \cdot h+b)

:方便起见,w_{h1} \cdot h_{1} + w_{h2}\cdot h_{2}写成了矩阵的表达形式W_{h} \cdot h,其中b是标量,而W_{h}=\left[ \begin{matrix} w_{h1}&w_{h2} \end{matrix} \right]\vec{h}=\left[\begin{matrix}h_{1}\\h_{2}\end{matrix}\right]

  • 关系图:由于k()固定,只考虑下半部分的关系。因为这时用了两条线w_{h1}w_{h2}来共同对应关系。原本需要拟合的8个关系,现在变成了4个(两个节点平摊)。同样,除非右图的4条红色关系线对w_{h1}来说相同,并且4条绿色关系线对w_{h2}来说也相同,否则用w_{h1}w_{h2} 表示f:X\rightarrow Y时,一定会造成熵H(M(X),X)增加。

:下图中左侧是网络结构图。右侧关系图中,接触的圆圈表示同一个节点的不同变体。分开的、并标注为不同颜色的圆圈表示不同节点,左右两图连线的颜色相互对应,如红色的w_{h1}需要表示右侧的4条红色关系线。


  • 关联1:下面和YJango确定想要学习的关联(函数)。如果想学习的关联是只取H_{1}或者H_{2}的值,那么该结构可以轻松用两条线w_{h1}w_{h2}来表达这4个关系(让其中一条线的权重为0,另一条为1)。
  • 关联2:如果想学习的关联是或门,真值表和实际训练完的预测值对照如下。很接近,但有误差。不过若要是分类的话,可以找到0.5这个超平面来分割。大于0.5的就是1,小于0.5的就是0,可以完美分开。

:第一列是输入,第二列是真实想要学习的输出,第三列是训练后的网络预测值。

  • 关联3:如果想学习的关联是异或门(XOR),真值表和实际训练完的预测值对照如下。由于4条关系线无法用单个w表达,该网络结构连XOR关联的分类都无法分开。

  • 数据量:学习这种关联至少需4个不同的([h_{1},h_{2}],y)来拟合f_{hy}:H\rightarrow Y。其中每个数据可以用于确定2条关系线。

方式3:加入隐藏层

  • 网络结构1:现在直接把h_{1}h_{2}作为输入(用x_{1},x_2表示),不考虑k()。并且在网络结构中加入一个拥有2个节点(node)隐藏层(用h_{1}h_{2}表示)。
  • 表达式y=M(x)=\phi(W_{h} \cdot \phi(W_{x} \cdot x+b_{x})+b_{h})
  • 关系图1:乍一看感觉关系更难确定了。原来还是只有8条关系线,现在又多了16条。但实际上所需要的数据量丝毫没有改变。因为以下两条先验知识的成立

:下图最右侧是表示:当一个样本进入网络后,能对学习哪些关系线起到作用。


  • 1. 并行f_{xh_1}:X_{1},X_{2}\rightarrow H_{1}f_{xh_2}:X_{1},X_{2}\rightarrow H_{2}的学习完全是独立并行。这就是神经网络的两条固有先验知识中的:并行:网络可以同时确定f_{xh_1}f_{xh_2}的关联。也是Bengio大神所指的distributed representation。

:有效的前提是所要学习的状态空间的关联是可以被拆分成并行的因素(factor)。

f_{hy}:H_{1},H_{2}\rightarrow Y就没有并行一说,因为Y是一个节点拥有两个变体,而不是两个独立的因素。但是也可以把Y拆开表示为one-hot-vector。这就是为什么分类时并非用一维向量表示状态。更验证了YJango在机器学习中对学习定义:学习是将变体拆成因素附带关系的过程。

  • 迭代:第二个先验知识是:在学习f_{hy}:H_{1},H_{2}\rightarrow Y同时f_{xh_1}:X_{1},X_{2}\rightarrow H_{1}f_{xh_2}:X_{1},X_{2}\rightarrow H_{2}也可以被学习。这就是神经网络的两条固有先验知识中的:迭代:网络可以在确定上一级的同时确定下一级的所有内容。也是Bengio大神所指的compositionality。

:有效的前提是所要学习的空间的关联是由上一级迭代形成的。所幸的是,我们所生活的世界几乎都符合这个前提(有特殊反例)。

  • 关联:如果想学习的关联是异或门(XOR),真值表和实际训练完的预测值对照如下。

f_{xh_1}f_{xh_2}:期初若用两条网络连接表示X_{1},X_{2}\rightarrow H_{1},H_{2}的16个关系可能,那么熵会很高。但用两条线表示X_{1},X_{2}\rightarrow H_{1}的8个关系,模型的熵可以降到很低。下图中f_{xh_1}的输出值对应红色数字。f_{xh_2}对应输出值是由蓝色数字表达。

f_{hy}:这时再看H_{1},H_{2}\rightarrow Y的关系,完全就是线性的。光靠观察就能得出f(h_1,h_2)的一个表达。


  • 数据量:如关系图1中最右侧图所示,一个输入[0,0]会被关联到0。而这个数据可用于学习2+4个关系。也就是说网络变深并不需要更多数据

模型的熵H(M(X),X)与用一条\phi(w_{1} \cdot x+b)所要拟合的关系数量有关。也就是说,

变体(variation)越少,拟合难度越低,熵越低。
  • 网络结构2:既然这样,X有4个变体,这次把节点增加到4。
  • 关系图2:与网络结构1不同,增加到4个节点后,每个节点都可以完全没有变体,只取一个值。想法很合理,但实际训练时,模型不按照该方式工作。

:太多颜色容易眼花。这里不再用颜色标注不同线之间的对应关系,但对应关系依然存在。

    • 问题:因为会出现右图的情况:只有两个节点在工作(线的粗细表示权重大小)。ac的节点在滥竽充数。这就跟只有两个节点时没有太大别。原因是神经网络的权重的初始化是随机的,数据的输入顺序也是随机的。这些随机性使得权重更新的方向无法确定。

讨论:网络既然选择这种方式来更新权重,是否一定程度上说明,用较少的节点就可以表示该关联?并不是,原因在于日常生活中的关联,我们无法获得所有变体的数据。所得数据往往是很小的一部分。较少的节点可以表示这一小部分数据的关联,但却无法涵盖所有变体情况。造成实际应用时效果不理想。

    • 缓解:缓解的方式有L2正则化(L2 regularization):将每层权重矩阵的平方和作为惩罚。
    • 表达式\lambda/2\cdot\sum\limits_w w^2 \lambda是惩罚的强弱,可以调节。除以2是为了求导方便(与后边的平方抵消)。
    • 意义:当同一层的权重有个别值过高时,平方和就会增加。而模型在训练中会降低该惩罚。产生的作用是使所有权重平摊任务,让a,b,c,d都有值。以这样的方式来使每个节点都工作,从而消除变体,可以缓解过拟合(overfitting)。
    • 例如L2(W_{hy})=\lambda/2 \cdot (w_{hy1}^2+w_{hy2}^2+ w_{hy3}^2+w_{hy4}^2)

具有一个隐藏层的神经网络可以模拟任何函数,最糟的情况需要k^n个节点。

也叫Universal Approximation Theorem。但最糟的情况是输入空间有多少个变体,就需要多少个节点。k表示独立因素的变体个数,n表示独立因素的个数。上述的例子中最糟的情况需要2^2个隐藏节点。而代价也是需要k^n个不同数据才可以完美拟合。

  • 使用条件:浅层神经网络可以分开几乎所有自然界的关联。因为神经网络最初就是由于可移动的生物需要预测未来事件所进化而来的。所学习的关联是过去状态到未来状态。如下图,物理中的力也可以分离成两个独立的分力来研究。

但有一种不适用的情况:非函数。

  • 实例:函数的定义是:每个输入值对应唯一输出值的对应关系。为什么这么定义函数?对应两个以上的输出值在数学上完全可以。但是在宏观的世界发展中却不常见。如下图:
    • 时间顺流:不管从哪个起点开始,相同的一个状态(不是维度)可以独立发展到多个不同状态(如氧原子可演变成氧分子和臭氧分子)。也就热力学第二定律的自发性熵增:原始状态通过物理关系,形成更多变体。

    • 时间倒流:宏观自然界中难以找到两个以上的不同状态共同收回到一个状态的例子(如氧分子和臭氧分子无法合并成氧原子)。如果这个可以实现,熵就会自发性减少。也就不需要生物来消耗能量减熵。我们的房间会向整齐的状态发展。但这违背热力学第二定律。至少在我们的宏观世界中,这种现象不常见。所以进化而来的神经网络可以拟合任何函数,但在非函数上就没有什么优势。毕竟生物的预测是从过去状态到未来状态。也说明神经网络并不违背无免费午餐定理
      • 实例:XOR门的输入空间和输出空间若互换位置,则神经网络拟合出来的可能性就非常低(并非绝对无法拟合)。


方式4:继续加深

浅层神经网络可以模拟任何函数,但数据量的代价是无法接受的。深层解决了这个问题。相比浅层神经网络,深层神经网络可以用更少的数据量来学到更好的拟合。上面的例子很特殊。因为2\cdot 2=42^2=4,比较不出来。下面YJango就换一个例子,并比较深层神经网络和浅层神经网络的区别。

  • 问题描述:空间A有8个可能状态,空间B有2个可能状态:
A=\{0,1,2,3,4,5,6,7\}B=\{0,1\}
  • 网络结构
    • 浅层神经网络:8节点隐藏层
    • 深层神经网络:2节点隐藏层 + 3节点隐藏层

  • 深浅对比

浅层神经网络:假如说输入3和输出0对应。数据(3,0)只能用于学习一个节点(如h_1)前后的两条关系线。完美学习该关联需要所有8个变体。然而当变体数为10^{10}时,我们不可能获得10^{10}不同变体的数据,也失去了学习的意义。毕竟我们是要预测没见过的数据。所以与其说这是学习,不如说这是强行记忆。好比一个学生做了100册练习题,做过的题会解,遇到新题仍然不会。他不是学会了做题,而是记住了怎么特定的题。

深层神经网络:如果只观察输入和输出,看起来同样需要8个不同的(x,y)训练数据。但不同(x,y)之间有共用部分。比如说,在确定3和0关系时,也同时对所有共用w1,w2,w3连接的其他变体进行确定。这样就使得原本需要8个不同数据才能训练好的关联变成只需要3,4不同数据个就可以训练好。(下图关系线的粗细并非表示权重绝对值,而是共用度


  • 深层的前提:使用浅层神经网络好比是用y=ax+ba,b,需要2个不同数据。而深层神经网络好比用y=axa,只需要一个数据。无免费午餐定理告诉我们,优化算法在一个任务上优秀,就一定会在其他任务上有缺陷,深层同样满足该定理。如果用y=ax去解实际上有by=ax+b,或者去解实际为y=ax2+bx+c的关联时,搜索效果只会更差。所以深层的前提是:X空间中的元素可以由Y迭代发展而来的。换句话说X中的所有变体,都有共用根源Y(root)。
  • 我们的物理世界:幸运的是,我们的物理世界几乎都满足迭代的先验知识。
    • 实例:比如进化。不同动物都是变体,虽然大家现在的状态各异,但在过去都有共同的祖先。
    • 实例:又如细胞分裂。八卦中的8个变体是由四象中4个变体的基础上发展而来,而四象又是由太极的2个变体演变而来。很难不回想起“无极生太极,太极生两仪,两仪生四象,四象生八卦”。(向中国古人致敬,虽然不知道他们的原意)

学习的过程是因素间的关系的拆分,关系的拆分是信息的回卷,信息的回卷是变体的消除,变体的消除是不确定性的缩减。
自然界两个固有的先验知识
并行:新状态是由若干旧状态并行组合形成。
迭代:新状态由已形成的状态再次迭代形成。
为何深层学习:深层学习比浅层学习在解决结构问题上可用更少的数据学习到更好的关联。

随后的三篇文章正是用tensorflow实现上述讨论的内容,以此作为零基础实现深层学习的起点。


最后总结一下开篇的问题: 1. 为什么神经网络高效:并行的先验知识使得模型可用线性级数量的样本学习指数级数量的变体 2. 学习的本质是什么:将变体拆分成因素和知识(Disentangle Factors of Variation)

  • 稀疏表达:一个矩阵被拆分成了稀疏表达和字典。
  • one hot vector:将因素用不同维度分开,避免彼此纠缠。

3. 为什么深层神经网络比浅层神经网络更高效:迭代组成的先验知识使得样本可用于帮助训练其他共用同样底层结构的样本。

4. 神经网络在什么问题上不具备优势:不满足并行与迭代先验的任务

  • 非函数:需要想办法将问题转化。
  • 非迭代(非结构):该层状态不是由上层状态构成的任务(如:很深的CNN因为有max pooling,信息会逐渐丢失。而residual network再次使得迭代的先验满足)

到此我们讨论完了神经网络最基础的,也是最重要的知识。在实际应用中仍会遇到很多问题(尤其是神经网络对noise的克服更加巧妙)。随后YJango会再和大家一起分析过深后会产生什么效果,并一步步引出设计神经网络的本质

为什么?