深度学习的”深度”, 早几年讨论的挺多的,身边有不同的理解:深度=更大规模的网络,也有认为:深度=更抽象的特征,近年来物理上也有人侧面显示:深度=玻璃相转变,如果后者的观点成立,那么仅仅引入GPU甚至FPGA硬件的目的只是加快, 没有算法的帮助(调参也算一种算法,后面会解释)是不会加深的!(注:等号表示强关系,不表示等价)
度量”深“
这个”深“同复杂度的联系是很紧密的。神经网络的复杂度,我们可以使用层数,神经元数目,或者连接权重数目作为度量。相对的,数据本身的复杂度,我们用带标签的数据的比例和不带标签的数据的比例来衡量。
深度=规模?网络复杂性同分类误差之间的联系:
70-90年代关于神经网络的数学结论可谓多如牛毛,基本上很多讨论了规模和泛化之间的关系,尤其是分类问题,关于分类的训练误差和测试误差(泛化能力),基本上归结为几个基本要求和限制:
模型要多复杂: 增加复杂度总是能拟合好训练样本,而要获得良好的泛化能力,普遍认为复杂度应该为训练数据数目的某种幂次,才能有较好的泛化能力。而且幂次要求小于1,若不然,每增加一个训练样本,都必须要扩充网络,这种模型没有任何实际意义。谢天谢地,神经网络可以满足这个要求,参考文献3。 要多少训练数据:如果网络节点数为 N,连接权重数为W,那么泛化误差小于任意指定值ε 的一个合理的要求便是: 训练数据的数目 >(W/ε)Log(N/ε),这说明复杂的模型需要更多的训练以获得优秀的泛化能力!事实上,不断提高数据量,多层感知器模型也能达到目前深度学习的水平(参考文献2),认为深度学习=普通多层神经网络,的确有现实的理由。 奥卡姆剃刀疑惑:理论上,带一层隐藏层的核基神经网络可以将任意数据拟合好(理解为级数展开,每个项就是一个隐藏神经元),那么提高复杂度的作用是啥?无法争辩的事实是,数据量足够高以后,简单的分类器都能给出优秀的结果。关于这一点从相变角度能解释为何需要实际工程需要一个“过度复杂的网络”,而不是一个大小“刚刚好的”网络。 复杂的代价:一个基本的定理,测试误差 >= 训练误差 + 模型复杂度,过度复杂的代价便是过拟合。防止过拟合的方法没有通论,业界通称“黑魔法”。
上面4点告诉我们的表象是,针对静态非时序分类问题,我们貌似可以不要高大上的算法,只要数据量足够,网络足够复杂,机器够大,速度够快,懂点“黑魔法”,在现在的工业界的数据量和模型通常都是用亿来衡量其规模的时代,此乃现世王道。
深度=更多抽象特征?一连串问题来了,何为特征?何为好的特征?深度学习的特征为何被称为抽象的?多层和抽象的关系是啥?
特征=函数展开的基函数?数学上将基函数理解成特征是可以的,当然不必要完备,也不必要正交。比如下图,图片特征提取,稀疏编码就是在一堆特征当中寻找最少且拟合最好的特征组,前提假设是图片都可以被分解为这些特征的线性叠加。然而前提要求分解仍然是线性的,使得机器上好计算,但是实际问题需要的特征通常是不同类型的组合,强行线性组合就像是吃正宗粤菜的时候来个山东煎饼果子一样。(图取自吴恩达的slide)
特征=低维流形嵌入?
产生成千上万个没经验证的特征总是容易的,但去除冗余特征,也就是去掉那些添不添加都不影响结果的特征,就需要相当的技巧。一种便是通过低维流形去寻找最重要的结构,这种方法可以利用多层自编码去逐层压缩维度,也可以用传统多层神经网络+Isomap类似的方法一步到位地压缩维度,然后不断调整使得嵌入低维的数据点“互相分离的最远”。由于数据点靠的近表示相似,故此这种方法能将数据本身的平移旋转按顺序嵌入到每块低维子流形当中。反过来说,如果训练数据已经包含有其本身的旋转平移,其低维子流形将会被填充得“更加的丰满”(如绿色的圆圈,因为手写数字1无论如何写都是“ |” 的某种旋转拉伸),其低维的边界就更容易被发现。然而这种方法是假设数据的可解释性隐藏在其低维流形结构上,难免让人费解,而且不同标签的嵌入子流形能否被充分分离也是非常困难的事情。(参考G.E.Hinton 06年 nature, Y LeCun,etc)