深度学习的“深度”有什么意义?
深度学习的”深度”, 早几年讨论的挺多的,身边有不同的理解:深度=更大规模的网络,也有认为:深度=更抽象的特征,近年来物理上也有人侧面显示:深度=玻璃相转变,如果后者的观点成立,那么仅仅引入GPU甚至FPGA硬件的目的只是加快, 没有算法的帮助(调参也算一种算法,后面会解释)是不会加深的!(注:等号表示强关系,不表示等价)
度量”深“
这个”深“同复杂度的联系是很紧密的。神经网络的复杂度,我们可以使用层数,神经元数目,或者连接权重数目作为度量。相对的,数据本身的复杂度,我们用带标签的数据的比例和不带标签的数据的比例来衡量。
深度=规模?网络复杂性同分类误差之间的联系:
70-90年代关于神经网络的数学结论可谓多如牛毛,基本上很多讨论了规模和泛化之间的关系,尤其是分类问题,关于分类的训练误差和测试误差(泛化能力),基本上归结为几个基本要求和限制:
- 模型要多复杂: 增加复杂度总是能拟合好训练样本,而要获得良好的泛化能力,普遍认为复杂度应该为训练数据数目的某种幂次,才能有较好的泛化能力。而且幂次要求小于1,若不然,每增加一个训练样本,都必须要扩充网络,这种模型没有任何实际意义。谢天谢地,神经网络可以满足这个要求,参考文献3。
- 要多少训练数据:如果网络节点数为 N,连接权重数为W,那么泛化误差小于任意指定值ε 的一个合理的要求便是: 训练数据的数目 >(W/ε)Log(N/ε),这说明复杂的模型需要更多的训练以获得优秀的泛化能力!事实上,不断提高数据量,多层感知器模型也能达到目前深度学习的水平(参考文献2),认为深度学习=普通多层神经网络,的确有现实的理由。
- 奥卡姆剃刀疑惑:理论上,带一层隐藏层的核基神经网络可以将任意数据拟合好(理解为级数展开,每个项就是一个隐藏神经元),那么提高复杂度的作用是啥?无法争辩的事实是,数据量足够高以后,简单的分类器都能给出优秀的结果。关于这一点从相变角度能解释为何需要实际工程需要一个“过度复杂的网络”,而不是一个大小“刚刚好的”网络。
- 复杂的代价:一个基本的定理,测试误差 >= 训练误差 + 模型复杂度,过度复杂的代价便是过拟合。防止过拟合的方法没有通论,业界通称“黑魔法”。
上面4点告诉我们的表象是,针对静态非时序分类问题,我们貌似可以不要高大上的算法,只要数据量足够,网络足够复杂,机器够大,速度够快,懂点“黑魔法”,在现在的工业界的数据量和模型通常都是用亿来衡量其规模的时代,此乃现世王道。
深度=更多抽象特征?一连串问题来了,何为特征?何为好的特征?深度学习的特征为何被称为抽象的?多层和抽象的关系是啥?
- 特征=函数展开的基函数?数学上将基函数理解成特征是可以的,当然不必要完备,也不必要正交。比如下图,图片特征提取,稀疏编码就是在一堆特征当中寻找最少且拟合最好的特征组,前提假设是图片都可以被分解为这些特征的线性叠加。然而前提要求分解仍然是线性的,使得机器上好计算,但是实际问题需要的特征通常是不同类型的组合,强行线性组合就像是吃正宗粤菜的时候来个山东煎饼果子一样。(图取自吴恩达的slide)
特征=低维流形嵌入?
产生成千上万个没经验证的特征总是容易的,但去除冗余特征,也就是去掉那些添不添加都不影响结果的特征,就需要相当的技巧。一种便是通过低维流形去寻找最重要的结构,这种方法可以利用多层自编码去逐层压缩维度,也可以用传统多层神经网络+Isomap类似的方法一步到位地压缩维度,然后不断调整使得嵌入低维的数据点“互相分离的最远”。由于数据点靠的近表示相似,故此这种方法能将数据本身的平移旋转按顺序嵌入到每块低维子流形当中。反过来说,如果训练数据已经包含有其本身的旋转平移,其低维子流形将会被填充得“更加的丰满”(如绿色的圆圈,因为手写数字1无论如何写都是“ |” 的某种旋转拉伸),其低维的边界就更容易被发现。然而这种方法是假设数据的可解释性隐藏在其低维流形结构上,难免让人费解,而且不同标签的嵌入子流形能否被充分分离也是非常困难的事情。(参考G.E.Hinton 06年 nature, Y LeCun,etc)
- 特征=数据拓扑?似乎研究训练数据本身复杂性的不多,都强调模型对数据的解释能力。实际上,不论任何数据,任何奇怪的类型,拓扑都是比人设模型更泛的工具。不少人直观认为拓扑学的概括性过强,用作特征没法表示数据的内禀结构。其实不然,目前比较火的,如代数拓扑里面有个Persistent homology,其对数据主要特征如此敏感,甚至可以用来当作蛋白质结构的拓扑指纹,有数学家通过这些指纹,甚至发现一些蛋白数据库的结构错误。(参考文献4,5)
- 是特征提升“深度”,还是“深度”提升特征?
深度=玻璃相转变?何为玻璃相?它对泛化误差的影响是啥?
- 相,作为区分两种状态的词,有个非常现实和直观的影响便是,外部条件不变的话,从一种相跨到另一种相是有很大难度的!比如水在低温会结冰,同样条件,让水不结冰的概率,虽然按照玻尔兹曼分布来看并非为零,过冷水便是一例。但这种状态是非常不稳定的,一旦扰动很快就变成冰,不可能回到液体。
- 相变过程=搜索能量最小点,这是一个粗浅的理解,在给定条件下(比如温度T),相变就是从能量高的状态(低温水)找到能量低的状态(冰)。但是该过程不是直线式的下陂过程,期间要翻过一些很小的山头,描述这些小山头的阻碍我们用一个正的能量垒ΔE来表示。其阻碍时间按照阿伦尼乌斯的观点,正比于N*E^(ΔE/T),指数型的拖延。前面的参数N用来形容山头的多寡。
- 玻璃相。假设这些小山头不是一个,而是体系自由度的指数,虽然每个山头的高度不高,累计的阻碍仍然非常可观,甚至严重影响你寻找最小能量态的可能性,进入这种像踩到沥青的区域,我们用玻璃相来形容。如下图,比如蛋白质折叠的能量漏斗模型(能量landscape),从计算机模拟上来看,穿过玻璃转变区(glass transition)进入能量最小值是最消耗时间的一个区域。这个过程硬件提速固然重要,但是并行加速是线性的提高,只解决空间复杂,不解决时间复杂!玻璃区域是包含有时间复杂的,一旦规模巨大后,没有算法技巧,寻找能量最低点,在这种非凸的模型上,基本无望。
玻璃世界的山头类型,这里的山头不仅包括语义上的山,也包括低谷。数学上严格描述应该理解为梯度为零的点,梯度为零的点有两种,鞍点和极值点。梯度下降法中,鞍点总是可以找到出路的,到了极小点就无望了。物理上,鞍点数目可能会随着能量不断下降而慢慢转换成极小点,如下图便是Lennard-Jones液固转变的模拟计算(文献7),y轴描述鞍点数目,系统还没到达最小能量(变成固体)就被包围在一堆极小值附近了,这时候采用梯度下降搜索万亿年都是徒劳的。然而这也告诉我们一个希望,没必要担心局部极小,因为一旦到了真正的局部极小,也非常接近最小值了,毕竟大部分区域都是被鞍点割据着。
智能是非凸的过程!这是一个非常老的观点,按照早期的计算能力来看,可想而知地不受欢迎。任何训练都是在最小化某个损失函数L(W)
或叫能量函数也可。Y LeCun(文献6)等人近来研究的观点显示,多层卷积神经网络的损失函数虽然是非凸的,但是阻碍其通向最优点的山头属鞍点居多,是鞍点意味着总是可以找到出路。但是小index的鞍点阻碍能力甚高,而且随机矩阵理论和模拟显示,神经网络在一定能量以上的某个区域全都是这类鞍点,非常类似物理上的Lennard-Jones液固转变过程,这也能理解为何训练一个神经网络会慢慢开始黏在一个区域不动,这个区域的鞍点山头阻碍都十分可怕(参考8)。(下图y轴描述鞍点数,横轴就是损失函数,第4张图说明能量高到一定程度,鞍点都会消失)
深度=跨越玻璃相?这里要给个问号,毕竟目前理论都不是在真实工业界的模型下计算出来的,像是一个猜测。想法是,既然训练存在玻璃阻碍,为何不一开始就把系统初始化到鞍点尽量少的区域,可惜在高维空间判断鞍点少的区域是个十分复杂的问题。但是我们可以降低维度去判断,比如引入少量外部控制变量—序参数(权重的平方和,类似SVM中的间隔,输入层的偏置,无标签/有标签数据数目等),然后约束这些序参数,按照某种权重平均掉这些鞍点Wi的贡献(重要性抽样说明这约等于将所有W积掉)。由于鞍点多的地方贡献相对大,序参数调整不好会导致平均结果同其它区域有明显不同,因此可以用来判断相区。如下图,log(ε)表示泛化能力的对数,越小泛化能力越强。β表示无标签样本的数目,α表示有标签样本数。不同颜色的线是不同偏置,蓝色线的偏置最小。不论那条颜色的线,增大无标签的样本原则上可以降低误差,但是理论上存在“相区”,如蓝色线的上半支和下半支,中间不稳定,难以逗留长时间,会存在一支相的误差一直无法下降。它卡住了!
预训练能加深!有了控制变量,我们可以通过调整这些值,将损失函数拖到感兴趣的区域,从而回避相的影响,这个拖动过程由一个日本人今年的研究表明(文献9),就是无标签的预训练!如下图,预训练越多,有标签的调优能越早找到最小值区域!(log(ε)表示泛化能力的对数,越小泛化能力越强。β表示无标签样本的数目,α表示有标签样本数,预训练是RBM之流,激活函数是ReLu)