参考:
http://x-algo.cn/index.php/2016/12/22/1318/
Inception v1
目标
人类的大脑可以看做是神经元的重复堆积,Inception网络存在的原因就是想找构造一种「基础神经元」结构。人类的神经元之间链接往往是稀疏链接,所以就是寻找「稀疏网络」的稠密表示,并希望这个稠密网络在效果上可以「接近」甚至「超越」稀疏链接的网络。
1x1卷积层
对特征降维,一方面可以解决计算瓶颈,同时限制网络的参数大小,可以将网络做的更「宽」和更「深」,效果也不差。
线性激活
整个GoogLeNet的卷积层和Inception单元内部,都是采用线性激活函数。
单元结构
整体结构
论文:Going deeper with convolutions
Batch Normalization
就是添加了一个归一化层。简称BN(Batch Normalization)。
在一个多层的神经网络中,如果前一层的参数发生了变化,就会导致前一层的输出「分布」发生改变,这种改变又会导致当前层的学习受到很大的影响,例如学习速度变慢、初始化参数对最终训练结果影响很大。所以,一种直观的想法就是在两层之间添加一层「归一化」层,从而消除这种分布的改变,提升训练的速度且不过渡依赖初始化参数。
这种分布变化的现象称为「Internal Covariate Shift」,早年是有解决方案「domain adaptation」。
梯度弥散(梯度消失)
如果激活函数式sigmoid函数,反向传播的之后只会在 |x||x| 较小的地方梯度值比较大,别的部分梯度很快接近为0,改变这种状况通常可以通过ReLU(Rectified Linear Units)激活函数/合理的初始化参数/合理的学习率来解决。导致反馈对权重的改变没作用了。
归一化之后,可以将非线性激活函数的效用得到提高,有效避免了数据集中落在一个取值区域。
白化(whitening)
http://ufldl.stanford.edu/wiki/index.php/Whitening
我们已经了解PCA降低数据维度。在一些算法中还需要一个与之相关的预处理步骤,这个预处理过程称为白化(一些文献中也叫sphering)。举例来说,假设训练数据是图像,由于图像中相邻像素之间具有很强的相关性,所以用于训练时输入是冗余的。白化的目的就是降低输入的冗余性;更正式的说,我们希望通过白化过程使得学习算法的输入具有如下性质:(i)特征之间相关性较低;(ii)所有特征具有相同的方差。
2D 的例子
下面我们先用前文的2D例子描述白化的主要思想,然后分别介绍如何将白化与平滑和PCA相结合。
如何消除输入特征之间的相关性? 在前文计算 时实际上已经消除了输入特征
之间的相关性。得到的新特征
的分布如下图所示:
这个数据的协方差矩阵如下:
(注: 严格地讲, 这部分许多关于“协方差”的陈述仅当数据均值为0时成立。下文的论述都隐式地假定这一条件成立。不过即使数据均值不为0,下文的说法仍然成立,所以你无需担心这个。)