[翻译]Notes on Convolutional Neural Networks

外行翻译,有错请指正。

1.简介

本文讨论了卷积神经网络(convolutional neural networks, CNNs)的推导和实现[3,4], 然后作了一个简单直接的扩展. 卷积神经网络牵涉到比权重连接更复杂的连接方式; 这种架构自身就实现了正则化(regularization). 除此以外, 卷积神经网络还在某种程度上提供了平移不变性. 这种特殊的神经网络以一种数据驱动(data-driven)的方式运行, 它假设我们希望从输入中提取某些特征来训练一组滤波器. 这里的推导是针对二维数据的, 但是容易推广到任意维数的数据.

我们先简短叙述一下经典全连接网络的反向传播算法, 然后推导二维卷积神经网络的卷积层和下采样层的反向传播权值更新. 在推导中我们会强调具体实现的的效率, 给出一些方程的同时也会给出相应的MATLAB代码段. 但对于CNN不能太强调代码效率. 随后我们将讨论如何从前层学习构建特征映射, 并着重考虑了如何学习特征映射的稀疏合成.

这份粗略的笔记可能包含推导错误、夸大的成分或不正确的论断。

2.全连接网络上的反向传播

在文献中, 卷积神经网络前半段由交替的卷积层和下采样层构成, 最后是通用的多层网络: 最后几层(靠近输出层)是全连接的一维层. 当要把二维的特征矩阵作为一维网络的输入, 可以很方便地把二维特征矩阵排成长的一维向量, 然后我们可以继续利用普通的反向传播算法. 在叙述卷积神经网络中的特殊反向传播算法之前, 先介绍标准的反向传播算法. (更多细节详见[1]).

2.1正向传播

在下面的推导中我们考虑均方误差函数. 对于一个有\(N\)个样本的\(c\)分类问题, 误差为\[E^N=\frac{1}{2}\sum^N_{n=1}\sum^c_{k=1}\left(t_k^n-y_k^n\right)^2\]
这里\(t_k^n\)是第\(n\)个样本的标签的第\(k\)维的值, 类似的, \(y_k^n\)是第\(n\)个样本的输出的第\(k\)维的值. 对于多分类问题, 通常采用"one-of-\(c\)"编码, 即如果\(\boldsymbol{x}^n\)属于第\(k\)类, 则\(\boldsymbol{t}^n\)的第\(k\)元素就是正的, 而\(\boldsymbol{t}^n\)的其他元素就是零或者负数, 这取决于激活函数的类型(下面有讨论).

因为数据集上的总误差是每个样本误差单项误差的累计和, 我们考虑, 比如第\(n\)个样本的单项误差的反向传播: \[E^n=\frac{1}{2}\sum^c_{k=1}\left(t^n_k-y^n_k\right)^2=\frac{1}{2}||\boldsymbol{t}^n-\boldsymbol{y}^n||^2_2\tag{1}\]
对于全连接层, 我们可以用下面给出的反向传播来计算\(E\)对各权重的导数. 记当前层为第\(l\)层, 输出层为第\(L\)层, 输入层为第1层. 定义本层输出为\[\boldsymbol{x}^l=f(\boldsymbol{u}^l), \boldsymbol{u}^l=\boldsymbol{W}^l\boldsymbol{x}^{l-1}+\boldsymbol{b}^l\tag{2}\]这里输出激活函数\(f(\cdot)\)可以是logistic(sigmoid)函数\(f(x)=(1+e^{-\beta x})^{-1}\)也可以是双曲正切函数\(f(x)=a\tanh(bx)\). sigmoid函数把\((-\infty,+\infty)\)映射到\((0,1)\), 而双曲正切把\((-\infty,+\infty)\)映射到\((-a,+a)\). 因此双曲正切的输出大致在0附近, 而sigmoid的输出的均值非零. 然而, 将特征标准化, 使其具有零均值单位标准差, 将会对梯度下降的收敛更有利[5], 对于已标准化的数据集, 使用双曲正切更好一些. LeCun建议\(a=1.7159\)\(b=2/3\), 目的是使得最大非线性出现在\(f(\pm1)=\pm1\)附近, 若数据以\(\pm1\)标准化, 这样就可避免训练过程中的饱和.

2.2反向传播

我们通过网络反向传播的误差可以视为每个单元对其偏置微扰的灵敏度. 这就是说\[\frac{\partial E}{\partial b}=\frac{\partial E}{\partial u}\frac{\partial u}{\partial b}=\delta\tag{3}\]因为在这里\(\frac{\partial u}{\partial b}=1\). 所以偏置的灵敏度和误差函数对其所在单元的总输入的导数是相等的. 正是这个导数结合下面的递归关系式把高层的误差反向传播到底层来: \[\boldsymbol{\delta}=(\boldsymbol{W}^{l+1})^T\boldsymbol{\delta}^{l+1}\circ f'(\boldsymbol{u}^l)\tag{4}\]这里\(\circ\)表示矩阵的点对点乘积. 对于式\((1)\)中的误差函数, 输出层神经元的灵敏度可以写成下面形式\[\boldsymbol{\delta}^L=f'(\boldsymbol{u}^L)\circ(\boldsymbol{y}^n-\boldsymbol{t}^n)\]
最后, 给定神经元的权值更新规则就是先简单地复制该神经元的输入, 再经该神经元的\(\delta\)缩放. 用向量的形式可以写成输入向量(前层的输出)和灵敏度向量的外积: \[\frac{\partial E}{\partial \boldsymbol{W}^l}=\boldsymbol{x}^{l-1}(\boldsymbol{\delta}^l)^T\tag{5}\]
\[\Delta\boldsymbol{W}^{l}=-\eta\frac{\partial E}{\partial \boldsymbol{W}^l}\tag{6}\]其中\(\boldsymbol{\delta}\)见式(3). 实际中通常为每个权重\(\boldsymbol{W}_{ij}\)设置学习率\(\eta_{ij}\).

3.卷积神经网络

通常, 卷积层和下采样层是相互交替的, 旨在减少运行时间并逐渐建立进一步的空间不变性和构型不变性. 然而下采样因子不能太大, 因为同时还要保留细节清晰. 当然, 这种思想并不是很新颖, 但既简单又有效. 哺乳动物的视觉皮层及其模型[12,8,7]着重介绍了这些方面, 在过去的10年中, 听觉神经科学发现了在不同动物大脑皮质的primary和belt听觉区域中有相同的机制[6,9,11]. 分级分析及其学习架构可能是听觉的关键.

3.1卷积层

我们继续推导网络中卷积层的反向转播. 在卷积层中, 前层传来的特征矩阵与可学习的卷积核进行卷积后再通过激活函数变换作为输出特征矩阵. 每个输出矩阵可能由多个输入图像卷积后合成而来. 一般地, 我们有\[\boldsymbol{x}^l_j=f\left(\sum_{i\in M_j}\boldsymbol{x}^{l-1}_i* \boldsymbol{k}^l_{ij}+b^l_j\right)\]这里\(M_j\)代表输入矩阵集合的某个子集, 在MATLAB中实现卷积时, 要使用'valid'边界选项. 通常合成的方式可以是all-pairs或者all-triplets, 但下面我们将讨论使用基于学习的方法来合成. 每个输出矩阵都有只一个固定的偏置\(b\), 但每个输出矩阵可能由不同的卷积核卷积合成而来. 这就是说, 输出矩阵\(j\)\(k\)都由输入矩阵\(i\)卷积而来, 但用于卷积\(i\)的核不同, 可能\(j\)\(k\)并不相同.

3.1.1梯度计算

我们假设第\(l\)层卷积层后面的第\(l+1\)层是下采样层. 反向传播算法说的是, 为了计算\(l\)层某神经元的灵敏度, 我们首先要把下一层中与该神经元相连的神经元的灵敏度加起来, 再以\(l+1\)层的各权值缩放之, 然后把这个量乘以该层激活函数的导函数在\(u\)处的取值, \(u\)是该层该神经元接收的总加权和. 在卷积层后面紧跟一个下采样层的情况下, 下采样层每个像素的\(\delta\)都连接着卷积层输出图像的一小块区域, 而卷积层输出图像的每个像素仅连接下采样层的某一个像素. 为有效计算\(l\)层的灵敏度矩阵, 我们可以对下采样层的灵敏度矩阵先上采样, 使其尺寸与卷积层输出矩阵大小一致, 再点对点乘以前述的卷积层激活函数导数矩阵. 前述缩放用到的下采样层"权值"在这里是\(\beta\)(一个常数, 见3.2节). 我们可以对卷积层的每个输出矩阵\(j\)如法炮制, 结合下采样层对应的矩阵, 有\[\boldsymbol{\delta}^l_j=\beta^{l+1}_j\left[f'(\boldsymbol{u}^l_j)\circ \text{up}(\boldsymbol{\delta}^{l+1}_j)\right]\]这里\(\text{up}(\cdot)\)指的是上采样操作, 即如果之前的下采样因子为\(n\), 则现在把每个像素在横竖方向都复制\(n\)次. 这个操作的一个高效实现方式是使用克罗内克积(Kronecker product)\[up(\boldsymbol{x})=\boldsymbol{x}\otimes \boldsymbol{1}_{n\times n}\]
既然我们有了灵敏度矩阵, 我们可以通过把它加起来得到\(\boldsymbol{\delta}^l_j\):\[\frac{\partial E}{\partial b_j}=\sum_{u,v}(\boldsymbol{\delta}^l_j)_{uv}\]
最后, 本应使用反向传播来计算卷积核的梯度, 但在这种情况下, 多个连接共享同一组权重, 因此, 我们把使用了某个权重的所有连接的权重梯度相加, 就在偏置那里做的一样: \[\frac{\partial E}{\partial\boldsymbol{k}^l_{ij}}=\sum_{u,v}(\boldsymbol{\delta}^l_j)_{uv}(\boldsymbol{p}^{l-1}_i)_{uv} \tag{7}\]这里\((\boldsymbol{p}_i^{l-1})_{uv}\)\(\boldsymbol{x}_i^{l-1}\)中与\(\boldsymbol{k}^l_{ij}\)卷积生成\(\boldsymbol{x}^{l}_j\)\((u,v)\)元的那个小块. 初看上去似乎我们要刻意跟踪与输出矩阵(及其灵敏度矩阵)对应的输入矩阵的每一个小块, 但是式(7)可以在MATLAB通过'valid'卷积仅用一行代码来实现: \[\frac{\partial E}{\partial\boldsymbol{k}^l_{ij}}=\text{rot180}(\text{conv2}(\boldsymbol{x}^{l-1}_i,\text{rot180}(\boldsymbol{\delta}^l_j),\text{'valid'}))\]这里我们把\(\delta\)矩阵做了旋转, 目的在于做相关运算而非卷积运算, 而把得到的结果再旋转回来为的是使之与前向传播中做卷积运算的卷积核取向一致.

3.2下采样层

下采样层产生输入矩阵的下采样版本. 如果有\(N\)个输入矩阵, 就有\(N\)个输出矩阵, 不过每个矩阵尺寸会变小. 具体地,\[\boldsymbol{x}^l_j=f\left(\beta^l_j \text{down}(\boldsymbol{x}^{l-1}_j)+b^l_j\right)\]这里\(\text{down}(\cdot)\)代表下采样操作. 一般来说, 这个操作将输入矩阵的每\(n\times n\)小块求和, 以使得其沿着每个维度的尺寸都减小\(n\)倍. 每个输出矩阵都有一个增益系数\(\beta\)和一个加法偏置\(b\).我们也可以简单的丢弃其余的采样点来实现[10].

3.2.1计算梯度

这里的困难在于计算灵敏度矩阵. 一旦得到了灵敏度矩阵, 我们就只剩下两个学习参数\(\beta\)\(b\)待更新罢了. 我们假设下采样层前后都是卷积层, 因为如果跟在下采样层后面的是一个全连接层, 那么下采样层的灵敏度矩阵就可以根据第2部分介绍的标准反向传播算法来计算了.

在3.1.1中计算卷积核的梯度时, 我们不得不确定对应于输出矩阵一个像素的是输入矩阵的哪个块. 为使用类似于式\((4)\)那样的\(\delta\)递归关系, 我们这里也不得不确定对应于下一层灵敏度矩阵某一个元素的是本层灵敏度矩阵的哪一个块. 当然, 这里连接输入块和输出元素的权值, 恰好是(旋转后的)卷积核. 使用卷积仍可以高效地实现: \[\boldsymbol{\delta}_j^l=f'(\boldsymbol{u}^l_j)\circ \text{conv2}(\boldsymbol{\delta}_j^{l+1},\text{rot180}(\boldsymbol{k}^{l+1}_j),\text{'full'})\]与之前一样, 我们旋转卷积核来执行相关运算. 然而, 这里需要注意的是我们使用了'full'边界选项, 这是MATLAB里面的叫法. 这个小差别允许我们更简单高效地处理边界, 输入到\(l+1\)层的单元的数量不是完整的\(n\times n\)的卷积核. 这种情况下, 'full'卷积可以自动地用0填充边界.

此时我们可以计算\(\beta\)\(b\)的梯度. 加法偏置的导数仍然是对灵敏度矩阵各元求和\[\frac{\partial E}{\partial b_j}=\sum_{u,v}(\boldsymbol{\delta^l_j})_{uv}\]当然, 增益系数\(\beta\)的梯度也要用到前向传播时, 本层的下采样输出值. 鉴于此, 前向传播时, 应该储存下采样结果, 这样在反向传播中就不必另作计算. 我们令\[\boldsymbol{d}^l_j=\text{down}(\boldsymbol{x}^{l-1}_j)\]然后梯度由下式给出\[\frac{\partial E}{\partial \beta_j}=\sum_{u,v}(\boldsymbol{\delta}^l_j \circ \boldsymbol{d}_j^l)_{uv}\]

3.3学习合成特征映射矩阵

通常, 把多个输入矩阵的卷积合成为一个输出矩阵是有利的. 文献中, 合成为一个输出的多个输入往往是人工选择的. 然而我们可以在训练中去学习这种合成. 令\(\alpha_{ij}\)代表输入\(i\)参与合成输出\(j\)的权重, 输出\(j\)由下式给出\[\boldsymbol{x}_j^l=f\left(\sum^{N_{in}}_{i=1}\alpha_{ij}(\boldsymbol{x}^{l-1}_i*\boldsymbol{k}^l_i)+b_j^i\right)\]约束方程为\[\sum_i\alpha_{ij}=1,0\leqslant\alpha_{ij}\leqslant1\]
可以通过将\(\alpha_{ij}\)设置成softmax形式来把这个约束问题化为无约束问题, 其中\(c_{ij}\)是隐权重: \[\alpha_{ij}=\frac{\exp(c_{ij})}{\sum_k\exp(c_{kj})}\]
固定\(j\)值, 则每个权重\(c_{ij}\)是独立与另一个\(j\)值的, 所以我们只考虑对于一个\(j\)的情况, 并略去下标\(j\), 每个输出矩阵的操作都类似, 仅仅是\(j\)取值不同而已.

softmax函数给出的导数为\[\frac{\partial \alpha_k}{\partial c_i}=\delta_{ki}\alpha_i-\alpha_i\alpha_k\tag{8}\]这里\(\delta\)是克罗内克符号, 式(1)对\(l\)\(\alpha_i\)的导数是\[\frac{\partial E}{\partial \alpha_i}=\frac{\partial E}{\partial u^l}\frac{\partial u^l}{\partial \alpha_i}=\sum_{u,v}(\boldsymbol{\delta}^l\circ(\boldsymbol{x}_i^{l-1}*\boldsymbol{k}_i^l))_{uv}\]这里的\(\boldsymbol{\delta}_l\)是与输入\(\boldsymbol{u}\)对应的灵敏度矩阵. 我们再次使用'valid'类型的卷积, 以使其尺寸与灵敏度矩阵一致. 我们现在可以使用链式法则来求误差函数(1)对隐权重\(c_i\)的导数:
\[\frac{\partial E}{\partial c_i}=\sum_k\frac{\partial E}{\partial \alpha_k}\frac{\partial \alpha_k}{\partial c_i}\\=\alpha_i\left(\frac{\partial E}{\partial \alpha_i}-\sum_k\frac{\partial E}{\partial \alpha_k}\alpha_k\right)\tag{9,10}\]

3.3.1强迫稀疏合成

对于一个给定的输出矩阵, 我们也可以通过向误差函数中加入\(\Omega(\boldsymbol{\alpha})\)这一项来迫使权重\(\alpha\)的分布稀疏化. 这样一来, 就倾向于鼓励一部分权重为零, 只有较少的一部分输入矩阵对输出矩阵有明显贡献. 对于单个样本, 误差函数写为\[\widetilde{E}^n=E^n+\lambda\sum_{i,j}|(\boldsymbol{\alpha})_{ij}|\tag{11}\]这样该正则项将对权重\(c_i\)的梯度做贡献. 自定义的参数\(\lambda\)控制着拟合误差最小化和权重正则项的\(\ell-1\)范数最小化之间的权衡. 对于给定的输出矩阵, 略去下标\(j\), 我们考虑权重\(\alpha_i\). 我们有\[\frac{\partial \Omega}{\partial \alpha_i}=\lambda \text{sign}(\alpha_i)\tag{12}\]对原点以外都成立. 结合(8)式我们得到\[\frac{\partial \Omega}{\partial c_i}=\sum_k\frac{\partial \Omega}{\partial \alpha_k}\frac{\partial \alpha_k}{\partial c_i}=\lambda\left(|\alpha_i|-\alpha_i\sum_k|\alpha_k|\right)\tag{13,14}\]
使用误差函数(11)结合(13)和(9)可以计算出最终的\(c_i\)的梯度\[\frac{\partial \widetilde{E}}{\partial c_i}=\frac{\partial E^n}{\partial c_i}+\frac{\partial \Omega}{\partial c_i}\]

3.4使用MATLAB加速

当网络中有交替的卷积层和下采样层时, 计算平瓶颈主要在与:

1.前向传播时: 将卷积层的输出下采样
2.反向传播时: 将下采样层的\(\delta\)矩阵上采样
3.sigmoid函数及其导数的使用

当然在前向传播和反向传播中卷积的计算也是瓶颈, 但是假设这个2D卷积程序是高效的, 那这部分也就没什么可以优化的了.

然而有人会试图用MATLAB的内建函数去处理上采样和下采样操作. 对于上采样, imresize可以做这个工作, 但是会有明显的开销. 一个更快的替代方法是使用克罗内克积函数 kron来处理矩阵上采样, 这可以加速一个数量级. 当在前向传播的下采样过程中, imresize不提供关于下采样的选择, 只是将不同的\(n\times n\)块进行求和罢了. " 最近邻"方法可用块中的一个原始像素来替换整块邻域. 一个可选方法是用blkproc在每个不同的块上进行操作, 或者将im2col和colfilt组合起来. 这些操作都只计算需要的部分而没有其他的开销, 重复的调用自定义的块处理函数会导致开销明显增加. 一个更快速的方法是用矩阵来对图像进行卷积, 然后使用标准索引(例如: y = x(1:2:end,1:2:end) ).尽管在这个例子中卷积实际计算了四次,和我们需要的输出一样多(假设是2的下采样), 这种方法仍然(实验性的)比之前提到的方法要快.

大多数作者实现sigmiod激活函数及其导数用的是内联(inline)函数. 但在写本文时, MATLAB中inline函数和C语言中的宏机制是不同的, 而且该机制还有待时间的检验, 因此通常来说用实际的代码代替\(f\)\(f'\)是值得的. 这也是代码优化和可读性之间的权衡问题.

4.实际训练问题(不完整)

4.1批量训练 vs. 在线训练

随机梯度下降法 vs. 批量学习

4.2学习率

LeCun的随机在线方法值得采纳吗?Viren认为, 至少每一层学习率都应不同, 因为传播到底层的梯度更小, 也更不可靠. LeCun也有类似的观点[5].

4.3误差函数的选取

平方误差(MLE) vs. 交叉熵. 后者对于某些分类问题更有效[2].

4.4用有限差分来检验

在检验反向传播的实现(或推导)是否正确时, 有限差分是一个不可或缺的工具, 有时尽管代码写错了, 而训练出来的网络看上去好像也学到了些东西。 使用有限差分的结果来检验你的代码算出来的梯度, 以确定其正确性.

对单个输入样本, 用二阶差分来估算梯度\[\frac{\partial E}{\partial w_i}\approx\frac{E(w_i+\epsilon)-E(w_i-\epsilon)}{2\epsilon}\]然后检查反向传播代码给出的梯度. \(\epsilon\)应该很小, 但不要太小而引起数值精度的问题, 大概\(10^{-8}\)就可以了. 注意, 使用有限差分来训练网络是十分低效的(网络中有\(W\)个权重, 则复杂度为\(\mathcal{O}(W^2)\)); 比起克服写反向传播代码的困难, \(\mathcal{O}(W)\)的速度显然更重要.

5.参考文献

[1]C.M.Bishop,“NeuralNetworksforPatternRecognition”,OxfordUniversityPress,NewYork, 1995.

[2]F.J.HuangandY.LeCun.“Large-scaleLearningwithSVMandConvolutionalforGenericObject Categorization”, In: Proc. 2006 IEEE Computer Society Conference on Computer Vision and Pattern Recognition, vol. 1, pp. 284-291, 2006.

[3]Y. LeCun, B. Boser, J. Denker, D. Henderson, R. Howard, W. Hubbard, and L. Jackel. “Backpropagation applied to handwritten zip code recognition”, Neural Computation, 1(4), 1989.

[4]Y. LeCun, L. Bottou, Y. Bengio, and P. Haffner.“Gradient-based learning applied to document recognition”, Proceedings of the IEEE, vol. 86, pp. 2278–2324, November 1998.

[5]Y.LeCun,L.Bottou,G.Orr,andK.Muller.“EfficientBackProp”,in: NeuralNetworks: Tricks of the trade, G. Orr and K. Muller (eds.), “Springer”, 1998.

[6]J.P. Rauschecker and B. Tian. “Mechanisms and streams for processing of ’what’ and ’where’ in auditory cortex,” Proc. Natl. Acad. Sci. USA, 97 (22), 11800–11806, 2000.

[7]T. Serre, M. Kouh, C. Cadieu, U. Knoblich, G. Kreiman and T. Poggio. “A Theory of Object Recognition: Computations and Circuits in the Feedforward Path of the Ventral Stream in Primate Visual Cortex”, CBCL Paper #259/AI Memo #2005-036, Massachusetts Institute of Technology, October, 2005.

[8]T. Serre, A. Oliva and T. Poggio. “A Feedforward Architecture Accounts for Rapid Categorization”, Proc. Natl. Acad. Sci. USA, (104)15, pp.6424-6429, 2007.

[9]S. Shamma. “On the role of space and time in auditory processing,” TRENDS in Cognitive Sciences, Vol. 5 No. 8, 2001.

[10]P.Y. Simard, Dave Steinkraus, and John C. Platt. “Best Practices for Convolutional Neural NetworksAppliedtoVisualDocumentAnalysis”,ProceedingsoftheInternationalConference on Document Analysis and Recognition, pp. 958-962, 2003.

[11]F.E. Theunissen, K. Sen, and A. Doupe, “Spectral-temporal receptive fields of nonlinear auditory neurons obtained using natural sounds,” J. Neuro., Vol. 20, pp.2315–2331, 2000.

[12]D. Zoccolan, M. Kouh, J. DiCarlo and T. Poggio. “Tradeoff between selectivity and tolerance in monkey anterior inferior temporal cortex”, J. Neurosci., 2007.

转载于:https://www.cnblogs.com/immcrr/p/10348440.html

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值