看了两篇最新的较为复杂的论文,再来看AlexNet打打基础,感觉像是喝了好多美酒回来再品清茶,有一种简简单单中窥见朴素的智慧之感,看完了觉得很舒心,这样的论文我能再看一打哈哈哈哈
论文的精华部分主要集中在Section 4,其次是Section 5。下面开始进入正题:
一、Section 4部分中提到的模型亮点和值得借鉴的特征有:
1、ReLu —— 只向小于0的输出值下手,大于0的值保持不变,因此是non-saturating的。
区别于传统的tanh和sigmoid非线性函数,ReLu这种非线性方式不对所有神经元都执行非线性操作。具体的说,ReLu只将小于0的神经元调整为0,其它的神经元值都维持不变。这种方式有如下优点:
a) 正向传播和反向传播时,计算速度非常快。不像tanh或者sigmoid函数一样,需要很多的乘法。
b) 相对于tanh和sigmoid非线性函数来说,ReLu的收敛速度非常快。这是做实验得出来的结论。如下图,其中黑线是使用Relu时的收敛过程,而虚线是使用tanh时的收敛过程。
c) 在反向传播时,不容易出现梯度消失的情况。【这一条参考博文:https://blog.csdn.net/qq_35554139/article/details/94205786,其中还讲了非线性函数为什么可以采用多种形式,有待研究】
2、多GPU同时训练——设计合理的模型,利用多GPU进行计算。
由于现在GPU可以互相直接访问内存空间,因此利用多GPU计算可以提高并行计算效率。
当模型很大的时候,一个GPU可能放不下一个完整的模型,此时将模型拆分到多个GPU中去,既提高计算速度,也削弱了GPU对模型大小的限制。
不过我觉得这种多GPU分布计算的代码,对编程能力要求会很高。现在的我还是没法完全理解的。
3、Local response normalization (局部反应正则化??) ——对元素进行横向压制以增强泛化能力。
不知道理解成Batch normalization的变种可不可以(原谅我菜,第一个想到的就是BN了),虽然LRN不需要计算样本平均值和协方差。
作者想用LRN达到 横向压制(Lateral inhibition) 的作用,通过四个超参数 k, alph, beta, n,来对每个神经元输出进行宽度为n的处理和计算。貌似是可以实现generalization,为什么能做到我也不是很理解。公式如下:
4、Overlapping pooling —— 就是现如今的池化层。
跟卷积很像,就是函数变了变。作者这里把s和z的关系讲的更清楚。s是每个池化区域的中间元素间隔的距离。z \times z是池化区域的面积。当 s == z,即间隔距离就是边长的时候,任意两个池化区域是没有交集的。当 s < z的时候,池化区域之间就有overlap的地方了。
二、防过拟合的方法
1、增加数据——两种方法,一种是增加图像的总张数,一种是增加每张图像的输入成分(即维度)。
a) 增加图像总张数:对每张图像,取224 x 224的区域作为新的输入图像。对每张224 x 224的图像,进行水平reflection,作为新的输入图像。
b) 增加图像输入维度:主成分分析法PCA,增加变量。
2、dropout——每个输出神经元有0.5的概率输出为0,使得每次训练的都是不同的模型,然而这些模型都共享参数。
具体有待学习Hinton大神的论文:
《Improving neural networks by preventing co-adaptation of feature detectors》