深度学习maxout单元

    今天学习深度学习看到整流线性单元及其扩展里的maxout单元,感觉这个有点东西,书中讲的不是特别详细,在此记录一下学习到的东西。参考了http://www.cnblogs.com/tornadomeet

一、相关理论

    maxout出现在ICML2013上:《Maxout  Networks》,作者Goodfellow将maxout和dropout结合后,号称在MNIST, CIFAR-10, CIFAR-100, SVHN这4个数据上都取得了start-of-art的识别率。从论文中可以看出,maxout其实一种激发函数形式。本文主要介绍这个函数的具体算法。

二、Maxout函数

    假设输入的特征向量为深度学习maxout单元,Maxout隐藏层每个神经元的计算公式如下:

                                                                       深度学习maxout单元

                                                                       深度学习maxout单元

W是3维的,d表示输入层节点数,m表示隐含层节点数,k表示每个隐含层节点对应了k个"隐隐含层"节点,b是一个大小为(m,k)的二维矩阵,这是我们需要学习的参数。这个公式就是Maxout隐藏层神经元i的计算 公式。k就是maxout层需要的参数。像dropout一样,也有参数p(每个神经元dropout的概率)。如果我们设定参数k=1,那么这个时候,网络就类似于以前我们所学普通的MLP网络。我们可以这么理解,本来传统的MLP算法在第i层到第i+1层,参数只有一组,然而现在我们不怎么干了,我们在这一层同时训练n组参数,然后选择**值最大的作为下一层神经元的**值。模型参考一张图片:

深度学习maxout单元

假设我们网络第i层有2个神经元x1、x2,第i+1层的神经元个数为1个:

 (1)以前MLP的方法。我们要计算第i+1层,那个神经元的**值的时候,传统的MLP计算公式就是:

                                                                深度学习maxout单元

                                                                   深度学习maxout单元

f是我们熟悉的**函数,sigmoid,Relu,Tanh等。

(2)Maxout 的方法。如果我们设置maxout的参数k=5,maxout层就如上图中所示,相当于在每个输出神经元前面又多了一层“隐隐含层”。这一层有5个神经元,此时maxout网络的输出计算公式为:

                                                             深度学习maxout单元深度学习maxout单元,...,深度学习maxout单元,

                                                             深度学习maxout单元

所以这就是为什么采用maxout的时候,参数个数成k倍增加的原因。本来我们只需要一组参数就够了,采用maxout后,就需要有k组参数。

maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合(学过高等数学应该能明白),而maxout又是取k个隐隐含层节点的最大值,这些”隐隐含层"节点也是线性的,所以在不同的取值范围下,最大值也可以看做是分段线性的(分段的个数与k值有关)。论文中的图1如下(它表达的意思就是可以拟合任意凸函数,当然也包括了ReLU了):

深度学习maxout单元

 作者从数学的角度上也证明了这个结论,即只需2个maxout节点就可以拟合任意的凸函数了(相减),前提是”隐隐含层”节点的个数可以任意多,如下图所示:

深度学习maxout单元