Maxout Networks

1. Dropout

  • dropout可以训练集成模型,它们共享参数并近似的对这些模型的预测进行了平均。它可以被当作一种通用的方法用在任何一种MLP和CNN模型中,但是在论文中,由于dropout的模型平均过程没有被证明,因而一个模型最好的性能的获得,应该通过直接设计这个模型使之可以增强dropout的模型平均的能力。使用了dropout的训练过程和一般的SGD方法完全不同。dropout在更新时使用更大的步长最有效,因为这样可以在不同的训练子集上对不同的模型有明显的影响来使得目标函数有持续的波动性,理想情况下整个训练过程就类似于使用bagging来训练集成的模型(带有参数共享的约束)。而一般的SGD更新时会使用更小的步长,来使得目标函数平滑的下降。对于深度网络模型,dropout只能作为模型平均的一种近似,显式的设计模型来最小化这种近似误差也可以提高dropout的性能。
  • dropout训练的集成模型中,所有模型都只包括部分输入和部分隐层参数。对每一个训练样本,我们都会训练一个包括不同隐层参数的子模型。dropout与bagging的相同点是不同的模型使用不同数据子集,不同点是dropout的每个模型都只训练一次且所有模型共享参数。
  • 对于预测时如何平均所有子模型的问题,bagging一般使用的是算数平均,而对dropout产生的指数多个子模型则并非显而易见。但是如果模型只有一层 p(y | v;θ)=softmax(vTW+b) 作为输出( p(y | v;θ) 的几何平均),则最终的预测分布就是简单的 softmax(vTW/2+b) ,i.e. 指数多个子模型的平均预测就是完整模型的预测仅仅将权重减半而已。这个结果只能用在单softmax层的模型中,如果是深层模型如MLP,那么权重减半的方法只是几何平均的一种近似。

2. Maxout

maxout是一种前向传播结构,但是使用了一种maxout激活函数。以MLP为例,一般使用relu激活函数输出本层一个节点的表达式为

hi(x)=relu(xTWi+bi)=max(xTWi+bi,0)

其中 xd×n Wd×m bm n 表示输入样本的个数, d 表示上一层节点的个数, m 表示本层节点的个数。这里结果只表示取出的第 i 列,下标 i 前的省略号表示对应第 i 列中所有行。
而使用maxout激活函数输出本层一个节点的表达式为

hi(x)=maxj[1,k](xTWij+bij)

其中 xd×n Wd×m×k bm×k k 表示每个隐层节点对应了 k 个“隐隐层”节点,这 k 个“隐隐层”节点都是线性输出的,而maxout的每个节点就从这 k 个“隐隐层”节点输出值中取最大的。因为max操作使得整个maxout网络也是一种非线性的变换。

  • 对MLP而言(下图),2个输入节点先构成5个“隐隐层”节点,然后在5个“隐隐层”节点中使用最大的构成了本层的一个节点,本层其他节点类似。

    实现技巧: maxoutrelu唯一的区别是,relu使用的 max(x,0) 是对隐层每一个单元执行的与0比较最大化操作,而maxout是对5个“隐隐层”单元的值执行最大化操作。如果将“隐隐层”单元在隐层展开,那么隐层就有20个“隐隐层”单元,maxout做的就是在这20个中每5个取一个最大值作为最后的隐层单元,最后的隐层单元仍然为4个。这里每5个取一个最大值也称为最大池化步长(max pooling stride)为5,最大池化步长默认和“隐隐层”个数相等,如果步长更小,则可以实现重叠最大池化。
    实现的时候,可以将隐层单元数设置为20个,权重维度(2,20)偏置维度(1,20),然后在20个中每5个取一个最大值得到4个隐层单元。

    Maxout Networks_第1张图片

    Maxout Networks_第2张图片

  • 对于CNN而言,假设上一层有2个特征图,本层有4个特征图,那么就是将输入的2个特征图用5个滤波器卷积得到5张仿射特征图(affine feature maps),然后从这5张仿射特征图每个位置上选择最大值(跨通道池化,pool across channels)构成一张本层的特征图,本层其他特征图类似。

    实现技巧: relu使用的 max(x,0) 是对每个通道的特征图的每一个单元执行的与0比较最大化操作,而maxout是对5个通道的特征图在通道的维度上执行最大化操作。而如果把5个特征图在本层展开,那么本层就有20个特征图,maxout做的就是在这20个中每5个取在通道维度上的最大值作为最后的特征图,最后本层特征图仍然为4个。同样最大池化步长默认为5。
    实现的时候,可以将本层特征图数设置为20个,权重维度(20,2,3,3)偏置维度(1,20,1,1),然后在20个中每5个取一个最大特征图得到4个特征图。
    参考Example of convolutional maxout layer

注意: 对于CNN而言,在maxout输出后如果连接一个一般的降采样最大池化层,则可以将这个降采样最大池化融合进跨通道池化中,即在仿射特征图的每个池化窗口中选择最大值(相当于同时在通道间和空间取最大值)。这样就可以在maxout网络中省略显式的降采样最大池化层。

  • 单个maxout激活函数可以理解成一种分段线性函数来近似任意凸函数(任意的凸函数都可由分段线性函数来拟合)。它在每处都是局部线性的(k个“隐隐层”节点都是线性的,取其最大值则为局部线性,分段的个数与k值有关),而一般的激活函数都有明显的曲率。
  • 如同MLP一样,maxout网络也可以拟合任意连续函数。只要maxout单元含有任意多个“隐隐层”节点,那么只要两个隐层的maxout网络就可以实现任意连续函数的近似。
  • maxout网络不仅可以学习到隐层之间的关系,还可以学习到每个隐层单元的激活函数。
  • maxout放弃了传统激活函数的设计,它产生的表示不再是稀疏的,但是它的梯度是稀疏的,且dropout可以将它稀疏化。
  • maxout没有上下界,所以让它在某一端饱和是零概率事件。
  • 如果训练时使用dropout,则dropout操作在矩阵相乘之前,而并不对max操作的输入执行dropout。
  • 使用maxout会默认一个先验:样本集是凸集可分的。

3. 测试结果

1. MNIST

  • 排列不变限制的MNIST(MNIST with permutation invariant,即像素排列顺序可以改变,输入的数据是2维的),使用两个全连接maxout层再接上一个sorfmax层,结合dropout和权重衰减。验证集选取训练集中后10000个样本。在得到最小的验证集误差时记录下前50000个样本的训练集对数似然 L ,接着在整个60000样本的训练集上继续训练直到验证集的对数似然达到 L 0.94%
  • 无排列不变限制的MNIST(MNIST without permutation invariant,即像素排列顺序不变,输入的数据是3维的),使用三个卷积maxout层,之后接上空间最大池化层,最后接上一个softmax层。还可以使用扩充数据集的方法进一步提高。0.45%

2. CIFAR-10

  • 预处理:全局像素归一化和ZCA白化
  • 过程与MNIST类似,只是将继续训练改为了重新训练,因为继续训练的学习率很低训练太久。
  • 使用三个卷积maxout层,之后接上全连接maxout层,最后接上一个softmax层。13.2%(不使用验证集数据)11.68%(使用验证集数据)9.35%(使用平移、水平翻转的扩充数据集)

3. CIFAR-100

  • 超参数使用和CIFAR-10一样
  • 41.48%(不使用验证集数据)38.57%(使用验证集数据)

4. SVHN

  • 验证集为训练集每类选取400个样本和额外集每类选取200个样本,其他的为训练集。
  • 预处理:局部像素归一化
  • 使用三个卷积maxout层,之后接上全连接maxout层,最后接上一个softmax层(同CIFAR-10)。2.47%

4. maxout对比relu

  • 跨通道池化可以减少网络状态并减少模型所需要的参数。
  • 对于maxout,性能与跨通道池化时滤波器数量有很大关系,但对relu,性能与输出单元的数量没有关系,也就是relu并不从跨通道池化中受益。
  • 要让relu达到maxout的表现,需要使之具有和maxout相同数量的滤波器(即使用比原来 k 倍的滤波器,同样也要 k 倍的relu单元),但网络状态和所需要的参数也是原来的 k 倍,也是对应maxout的 k 倍。

5. 模型平均

  • 单层softmax有对模型进行平均的能力,但是通过观察,多层模型中使用dropout也存在这样的模型平均,只是有拟合精度的问题。
  • 训练中使用dropout使得maxout单元有了更大的输入附近的线性区域,因为每个子模型都要预测输出,每个maxout单元就要学习输出相同的预测而不管哪些输入被丢弃。改变dropout mask将经常明显移动有效输入,从而决定了输入被映射到分段线性函数的哪一段。使用dropout训练的maxout具有一种特性,即当dropout mask改变时每个maxout单元的最大化滤波器相对很少变化。
  • maxout网络中的线性和最大化操作可以让dropout的拟合模型平均的精度很高。而一般的激活函数几乎处处都是弯曲的,因而dropout的拟合模型平均的精度不高。

6. 优化

  • 训练中使用dropout时,maxout的优化性能比relu+max pooling好
  • dropout使用更大的步长最有效,使得目标函数有持续的波动性。而一般的SGD会使用更小的步长,来使得目标函数平滑的下降。dropout快速的探索着许多不同的方向然后拒绝那些损害性能的方向,而SGD缓慢而平稳的朝向最可能的方向移动。
  • 实验中SGD使得relu饱和在0值的时间少于5%,而dropout则超过60%。由于relu激活函数中的0值是一个常数,这就会阻止梯度在这些单元上传播(无论正向还是反向),这也就使得这些单元很难再次激活,这会导致很多单元由激活转变为非激活。而maxout就不会存在这样的问题,梯度在maxout单元上总是能够传播,即使maxout出现了0值,但是这些0值是参数的函数可以被改变,从而maxout单元总是激活的。单元中较高比例的且不易改变的0值会损害优化性能。
  • dropout要求梯度随着dropout mask的改变而明显改变,而一旦梯度几乎不随着dropout mask的改变而改变时,dropout就简化成为了SGD。relu网络的低层部分会有梯度衰减的问题(梯度的方差在高层较大而反向传播到低层后较小)。maxout更好的将变化的信息反向传播到低层并帮助dropout以类似bagging的方式训练低层参数。relu则由于饱和使得梯度损失,导致dropout在低层的训练类似于一般的SGD。

你可能感兴趣的:(论文笔记)