最近在调网络结构的参数,其实就是漫无目的的乱改。但是运气不佳,没有得到自己想要的准确率。于是,硬着头皮,去了解一下别人选择参数的一些依据。正如这篇论文的标题: Delving Deep into Rectifiers,或许只有这样才能对选择参数的原则有一个基本认识吧!
Background
给定一个很深的网络结构,我们有以下三个个问题需要解决:网络能训练、网络性能好、网络训练速度较快。
Main Points
网络结构越深(性能应该越好),越难训练。本文从non-linear unit(Relu,提出了增强版PRelu)、卷积核参数初始化着手解决上述问题。
1) PRelu
如上图所示,作者将原始的Relu进行了简单扩展便得到了PRelu,其中的参数a是可以学习的(初始化时a=0.25)。前向传播、后向传播都很简单,这一改变引入的计算量也基本可以忽略。也许我们会不服气,不就是简单修改了一下Relu吗?我也可以对这个函数修改一通,然后发篇质量很高的paper的。说实话,我们是可以乱修改一通的,但是我们必须得给出理论分析(如果我们对问题没有一个深刻的认识,这一点是很难做到的哦!哈哈)。这篇paper的理论分析思路很值得我们借鉴“从简单例子出发,通过近似、假设得出结论”,然后用所得结论指导我们的实验。
在论文中,作者指出“We investigate how PReLU may affect training via computing the Fisher Information Matrix (FIM). If the off-diagonal blocks of FIM are closer to zero, SGD which is a first-order solver becomes closer to natural gradient descent which is second-order and converges faster”,下面作者通过一个两层的MLP证明了PRelu能够使得对角线外的FIM元素更接近于0,从而比Relu收敛的速度更快。实验也证实了这一点。此外,这一改变又提升了一点网络的性能。
2)Initialization of Filter Weights for Rectifiers
在论文中作者提到,“Rectifier networks are easier to train compared with traditional sigmoid-like activation networks. But a bad initialization can still hamper the learning of a highly non-linear system”。那么我们能不能提供一个初始化参数的原则,从而避免bad initialization呢?能,论文中给出了答案。
作者遵循的原则很简单“A proper initialization method should avoid reducing or magnifying the magnitudes of input signals exponentially”,在实际操作的时候就是使得每一层的输出具有一致的方差,并据此得出了两个选择初始化参数的约束条件。其本质就是确定一个合适的权值初始化方差(均值为0,bias为0是假设,在应用时我们应该保证假设条件的成立!)
有了一个较好的权值初始化策略之后,我们就可以端到端的形式训练很深的网络了。可惜的是,更深的网络并没有带来更好的性能,这是后话了!
3)网络结构及其初始化
这篇论文对于网络结构及其初始化方式写的还是很清楚的,如学习率是“stepwise”的(初始为0.01,然后分别为0.001、0.0001)、weight decay、dropout ration、momentum、全连接层初始化方式等。数据增强方式、测试方式都很清楚。强烈建议大家读一读这篇paper。
Summary
1)两个很简单的改进在Imagenet上取得那么好的效果,的确有点令我吃惊。
2)作者的两个改进都有理论分析、实验验证,分析的过程清晰易懂,得出的结论具有很强的指导意义。这或许就是科研的魅力吧!
3)潜下心来,好好琢磨琢磨!哈哈
4)如果我们可以对权值进行这样的约束,那么我们是不是可以对数据也进行同样的约束呢?(Batch Normalization是不是完成这样的功能的呢?)