为何深层学习
深层学习开启了人工智能的新时代。不论任何行业都害怕错过这一时代浪潮,因而大批资金和人才争相涌入。但深层学习却以 “黑箱” 而闻名,不仅调参难,训练难,“新型” 网络结构的论文又如雨后春笋般地涌现,使得对所有结构的掌握变成了不现实。我们缺少一个对深层学习合理的认识。
神经网络并不缺少新结构,但缺少一个该领域的
很多人在做神经网络的实验时会发现调节某些方式和结构会产生意想不到的结果。但就我个人而言,这些发现并不会让我感到满足。我更关心这些新发现到底告诉我们了什么,造成这些现象的背后原因是什么。我会更想要将新的网络结构归纳到已有的体系当中。这也是我更多思考 “为何深层学习有效” 的原因。下面便是目前 yjango 关于这方面的见解。
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.
<a href="http://link.zhihu.com/?target=http%3a//www.deeplearningbook.org/" target="_blank">deep learning textbook by ian goodfellow and yoshua bengio and aaron courville</a>
深层神经网络在自然问题上更具优势,因为它和生物学习一样,是找回使熵增加的 “物理关系”(知识,并非完全一样),将变体(
)转化回因素(
)附带物理关系的形式,从源头消除熵(假设每个因素只有两种可能状态)。这样所有状态间的关系可以被确定,要么肯定发生,要么绝不发生,也就无需用概率来衡量。因此下面定义的学习目标并非单纯降低损失函数,而从确定关系的角度考虑。一个完美训练好的模型就是两个状态空间内所有可能取值间的关系都被确定的模型。
学习目标:是确定(determine)两个状态空间内所有可能取值之间的关系,使得熵尽可能最低。
注:对熵不了解的朋友可以简单记住,事件的状态越确定,熵越小。如绝不发生(概率 0)或肯定发生(概率为 1)的事件熵小。而 50% 可能性事件的熵反而大。
为举例说明,下面就一起考虑用神经网络学习以下两个集合的不同关联(or gate 和 xor gate)。看看随着网络结构和关联的改变,会产生什么不同情况。尤其是最后网络变深时与浅层神经网络的区别。
注:选择这种 xor 这种简单关联的初衷是输入和输出空间状态的个数有限,易于分析变体个数和熵增的关系。
注:用 “变体(variation)” 是指同一类事物的不同形态,比如 10 张狗的图片,虽然外貌各异,但都是狗。
问题描述:集合 a 有 4 个状态,集合 b 有 2 个状态。0 和 1 只是用于表示不同状态的符号,也可以用 0,1,2,3 表示。状态也并不一定表示数字,可以表示任何物理意义。
随机变量 y:可能取值是
注:随机变量(大写 x)是将事件投射到实数的函数。用对应的实数表示事件。而小写字母 x 表示对应该实数的事件发生了,是一个具体实例。
网络结构:暂且不规定要学习的关联是 or 还是 xor,先建立一个没有隐藏层,仅有一个输入节点,一个输出节点的神经网络。
表达式:
,
表示 sigmoid 函数。(只要是非线性即可,relu 是目前的主流)
说明:下图右侧中的虚线表示的既不是神经网络的链接,也不是函数中的映射,而是两个空间中,所有可能值之间的关系(relation)。学习的目的是确定这些状态的关系。比如当输入 00 时,模型要尝试告诉我们 00 到 1 的概率为 0,00 到 0 的概率为 1,这样熵
才会为零。
关系图:左侧是网络结构,右侧是状态关系图。输入和输出空间之间共有 8 个关系 (非箭头虚线表示关系)。除非这 8 个关系对模型来说都是相同的,否则用
表示
时的熵
就会增加。(
无法照顾到 8 个关系,若完美拟合一个关系,其余的关系就不准确)
注:这里 yjango 是
用表示
的缩写。
数据来记住想要拟合的
。
特征:空间 a 的 4 个状态是由两个 0 或 1 的状态共同组成。我们可以观察出来(计算机并不能),我们利用这种知识
把 a 中的状态分解开(disentangle)。分解成两个独立的子随机变量
和
。也就是用二维向量表示输入。
网络结构:由于分成了二维特征,这次网络结构的输入需改成两个节点。下图中的上半部分是,利用人工知识
将随机变量
无损转变为
的共同表达(representation)。这时
一起形成网络输入。
注:k() 旁边的黑线(实线表示确定关系)并非是真正的神经网络结构,只是方便理解,可以简单想象成神经网络转变的。
注:方便起见,
写成了矩阵的表达形式
,其中
是标量,而
,
关系图:由于
固定,只考虑下半部分的关系。因为这时用了两条线
来共同对应关系。原本需要拟合的 8 个关系,现在变成了 4 个(两个节点平摊)。同样,除非右图的 4 条红色关系线对
来说相同,并且 4 条绿色关系线对
来说也相同,否则用
时,一定会造成熵
增加。
注:下图中左侧是网络结构图。右侧关系图中,接触的圆圈表示同一个节点的不同变体。分开的、并标注为不同颜色的圆圈表示不同节点,左右两图连线的颜色相互对应,如红色的
需要表示右侧的 4 条红色关系线。
关联 1:下面和 yjango 确定想要学习的关联(函数)。如果想学习的关联是只取
或者
的值,那么该结构可以轻松用两条线
来表达这 4 个关系 (让其中一条线的权重为 0,另一条为 1)。
注: 第一列是输入,第二列是真实想要学习的输出,第三列是训练后的网络预测值。
表达,该网络结构连 xor 关联的分类都无法分开。
数据量:学习这种关联至少需 4 个不同的
来拟合
。其中每个数据可以用于确定 2 条关系线。
网络结构 1:现在直接把
作为输入(用
,
表示),不考虑
。并且在网络结构中加入一个拥有 2 个节点(node)隐藏层(用
表示)。
关系图 1:乍一看感觉关系更难确定了。原来还是只有 8 条关系线,现在又多了 16 条。但实际上所需要的数据量丝毫没有改变。因为以下两条先验知识的成立。
注:下图最右侧是表示:当一个样本进入网络后,能对学习哪些关系线起到作用。
1. 并行:
的关联。也是 bengio 大神所指的 distributed representation。
注:有效的前提是所要学习的状态空间的关联是可以被拆分成并行的因素(factor)。
注:
就没有并行一说,因为
是一个节点拥有两个变体,而不是两个独立的因素。但是也可以把
迭代:第二个先验知识是:在学习
的同时,
注:有效的前提是所要学习的空间的关联是由上一级迭代形成的。所幸的是,我们所生活的世界几乎都符合这个前提(有特殊反例)。
关联:如果想学习的关联是异或门(xor),真值表和实际训练完的预测值对照如下。
:期初若用两条网络连接表示
的 16 个关系可能,那么熵会很高。但用两条线表示
的 8 个关系,模型的熵可以降到很低。下图中
的输出值对应红色数字。
对应输出值是由蓝色数字表达。
: 这时再看
的关系,完全就是线性的。光靠观察就能得出
的一个表达。
数据量:如关系图 1 中最右侧图所示,一个输入 [0,0] 会被关联到 0。而这个数据可用于学习 2+4 个关系。也就是说网络变深并不需要更多数据。
模型的熵
与用一条
所要拟合的关系数量有关。也就是说,
变体(variation)越少,拟合难度越低,熵越低。
网络结构 2:既然这样,
有 4 个变体,这次把节点增加到 4。
关系图 2:与网络结构 1 不同,增加到 4 个节点后,每个节点都可以完全没有变体,只取一个值。想法很合理,但实际训练时,模型不按照该方式工作。
注:太多颜色容易眼花。这里不再用颜色标注不同线之间的对应关系,但对应关系依然存在。
问题:因为会出现右图的情况:只有两个节点在工作(线的粗细表示权重大小)。a和c的节点在滥竽充数。这就跟只有两个节点时没有太大别。原因是神经网络的权重的初始化是随机的,数据的输入顺序也是随机的。这些随机性使得权重更新的方向无法确定
讨论:网络既然选择这种方式来更新权重,是否一定程度上说明,用较少的节点就可以表示该关联?并不是,原因在于日常生活中的关联,我们无法获得所有变体的数据。所得数据往往是很小的一部分。较少的节点可以表示这一小部分数据的关联,但却无法涵盖所有变体情况。造成实际应用时效果不理想。
缓解:缓解的方式有 l2 正则化(l2 regularization):将每层权重矩阵的平方和作为惩罚。
是惩罚的强弱,可以调节。除以 2 是为了求导方便(与后边的平方抵消)。
意义:当同一层的权重有个别值过高时,平方和就会增加。而模型在训练中会降低该惩罚。产生的作用是使所有权重平摊任务,让
都有值。以这样的方式来使每个节点都工作,从而消除变体,可以缓解过拟合(overfitting)。
例如:
具有一个隐藏层的神经网络可以模拟任何函数,最糟的情况需要 个节点。
个隐藏节点。而代价也是需要
个不同数据才可以完美拟合。
使用条件:浅层神经网络可以分开几乎所有自然界的关联。因为神经网络最初就是由于可移动的生物需要预测未来事件所进化而来的。所学习的关联是过去状态到未来状态。如下图,物理中的力也可以分离成两个独立的分力来研究。
但有一种不适用的情况:非函数。
实例:函数的定义是:每个输入值对应唯一输出值的对应关系。为什么这么定义函数?对应两个以上的输出值在数学上完全可以。但是在宏观的世界发展中却不常见。如下图:
时间顺流:不管从哪个起点开始,相同的一个状态(不是维度)可以独立发展到多个不同状态(如氧原子可演变成氧分子和臭氧分子)。也就热力学第二定律的自发性熵增:原始状态通过物理关系,形成更多变体。
实例:xor 门的输入空间和输出空间若互换位置,则神经网络拟合出来的可能性就非常低(并非绝对无法拟合)。
浅层神经网络可以模拟任何函数,但数据量的代价是无法接受的。深层解决了这个问题。相比浅层神经网络,深层神经网络可以用更少的数据量来学到更好的拟合。上面的例子很特殊。因为
,比较不出来。下面 yjango 就换一个例子,并比较深层神经网络和浅层神经网络的区别。
问题描述:空间
有 8 个可能状态,空间
有 2 个可能状态:
网络结构:
浅层神经网络:8 节点隐藏层
深层神经网络:2 节点隐藏层 + 3 节点隐藏层
深浅对比:
浅层神经网络:假如说输入 3 和输出 0 对应。数据
只能用于学习一个节点(如
)前后的两条关系线。完美学习该关联需要所有 8 个变体。然而当变体数为
时,我们不可能获得
个不同变体的数据,也失去了学习的意义。毕竟我们是要预测没见过的数据。所以与其说这是学习,不如说这是强行记忆。好比一个学生做了 100 册练习题,做过的题会解,遇到新题仍然不会。他不是学会了做题,而是记住了怎么特定的题。
深层神经网络:如果只观察输入和输出,看起来同样需要 8 个不同的
训练数据。但不同
之间有共用部分。比如说,在确定 3 和 0 关系时,也同时对所有共用
连接的其他变体进行确定。这样就使得原本需要 8 个不同数据才能训练好的关联变成只需要 3,4 不同数据个就可以训练好。(下图关系线的粗细并非表示权重绝对值,而是共用度)
深层的前提:使用浅层神经网络好比是用
解
,需要 2 个不同数据。而深层神经网络好比用
去解实际上有
的
,或者去解实际为
的关联时,搜索效果只会更差。所以深层的前提是:
空间中的元素可以由
迭代发展而来的。换句话说
中的所有变体,都有共用根源
(root)。
我们的物理世界:幸运的是,我们的物理世界几乎都满足迭代的先验知识。
实例:比如进化。不同动物都是变体,虽然大家现在的状态各异,但在过去都有共同的祖先。
实例:又如细胞分裂。八卦中的 8 个变体是由四象中 4 个变体的基础上发展而来,而四象又是由太极的 2 个变体演变而来。很难不回想起 “无极生太极,太极生两仪,两仪生四象,四象生八卦”。(向中国古人致敬,虽然不知道他们的原意)
学习的过程是因素间的关系的拆分,关系的拆分是信息的回卷,信息的回卷是变体的消除,变体的消除是不确定性的缩减。 并行:新状态是由若干旧状态并行组合形成。 迭代:新状态由已形成的状态再次迭代形成。 为何深层学习:深层学习比浅层学习在解决结构问题上可用更少的数据学习到更好的关联。
随后的三篇文章正是用 tensorflow 实现上述讨论的内容,以此作为零基础实现深层学习的起点。
<a href="http://link.zhihu.com/?target=https%3a//yjango.gitbooks.io/superorganism/content/tensorflowji_ben_yong_fa.html" target="_blank">tensorflow 基本用法</a>
<a href="http://link.zhihu.com/?target=https%3a//yjango.gitbooks.io/superorganism/content/dai_ma_yan_shi.html" target="_blank">代码演示 lv1</a>
<a href="http://link.zhihu.com/?target=https%3a//yjango.gitbooks.io/superorganism/content/dai_ma_yan_shi_2.html" target="_blank">代码演示 lv2</a>
最后总结一下开篇的问题:
1. 为什么神经网络高效:并行的先验知识使得模型可用线性级数量的样本学习指数级数量的变体
2. 学习的本质是什么:将变体拆分成因素和知识(disentangle factors of variation)
稀疏表达:一个矩阵被拆分成了稀疏表达和字典。
one hot vector:将因素用不同维度分开,避免彼此纠缠。
3. 为什么深层神经网络比浅层神经网络更高效:迭代组成的先验知识使得样本可用于帮助训练其他共用同样底层结构的样本。
4. 神经网络在什么问题上不具备优势:不满足并行与迭代先验的任务
非函数:需要想办法将问题转化。
非迭代(非结构):该层状态不是由上层状态构成的任务(如:很深的 cnn 因为有 max pooling,信息会逐渐丢失。而 residual network 再次使得迭代的先验满足)
到此我们讨论完了神经网络最基础的,也是最重要的知识。在实际应用中仍会遇到很多问题(尤其是神经网络对 noise 的克服更加巧妙)。随后 yjango 会再和大家一起分析过深后会产生什么效果,并一步步引出设计神经网络的本质。
====================================分割线================================
本文作者:ai研习社