卷积层的反向传播分析
卷积层是卷积神经网络最基本的结构,在以前的文章中,我们讨论了卷积层的前馈计算方法,而神经网络的学习过程包括前馈计算和梯度的反向传播两个部分,本文就准备对卷积层的梯度计算进行分析。为了简单起见,我们使用一个 3x3 的输入张量和 2x2 的卷积核来举例说明,并把结论推广的任意大小输入和卷积核情况。
\[\left[\begin{aligned}
x_{11} \quad x_{12}\quad x_{13}\\
x_{21} \quad x_{22}\quad x_{23}\\
x_{31} \quad x_{32}\quad x_{33}
\end{aligned}
\right] \star \left[\begin{aligned}
k_{11} \quad k_{12}\\
k...
点我阅读更多...
批量正则化的前馈计算与反向传播分析
Batch Normalization 想要解决什么问题?
很多时候,当我们训练好一个模型,拿到实际运行环境中会发现精度表现不如预期,其中有一个可能的原因是实际环境中的数据分布和我们训练集的分布不同,术语叫 Covariate Shift。这时我们可以采用一些办法把真实数据的分布变换成想要的形式,比如标准化,对数变换等等。在神经网络训练过程中,每一层的输入数据都经过了前面多层处理,并且每层的权重参数都在反向传播的过程中不断变化,因此,即便同样的初始数据在不同轮次的训练中都可能有不同的分布,这一现象也被称为 Internal Covariate Shift。既然数据分布都不一样了,那上一批次训练的参数可能就失效了,这就迫使每层的权重参数不断地修正自己来适应新的数据分布,而不是朝着减小损...
点我阅读更多...
全连接层的前馈计算与反向传播分析
全连接层差不多可以说是神经网络中最简单的结构,对它进行分析可以让我们比较容易地建立起对神经网络运作方式的理解基础。首先我们来看一下前馈计算过程,设置全连接层的输入维度为 \(n\),输出维度为 \(m\),并定义以下变量:输入向量 \(x \in R^m\),输出向量 \(y\in R^n\),权重向量 \(W \in R^{n\times m}\),偏置项 \(b \in R^n\),则前馈计算的公式表示如下
\[y = W x + b\qquad \qquad (1)\]
它的分量形式为
\[y_i = \sum_{j = 1}^m w_{ij}x_j + b_i \qquad \qquad (2)\]
前馈计算相当简单,接下来我们再考虑它的反向传播,也就是损失对参数 \(...
点我阅读更多...
为什么说 Network In Network 等价于 1x1 卷积?
下图描述了一个最简单的卷积运算过程,卷积核在图片的空间维度上不断滑动,每停留一次就与其覆盖的 patch 做 element-wise 相乘,然后再求和作为输出特征上的一个元素。
而如果输入和输出都是多通道的,则卷积核的数量等于前两者通道数量之积,用图形来表示的话如下所示
特化到我们当前讨论的 1x1 卷积,则上图可以简化一下
接下来,我们把每次卷积涉及到的元素单独提取出来
然后再调整一下排列顺序
这样就可以看出来,1x1 卷积不过就是一种全连接层,它的输入和输出都是特征图每个空间位置在 channel 方向上的元素值组成的向量,卷积核则是该全连接层的权重参数。
Network In Network 是一种神经网络结构,论文作者指出,普通卷积核是针对于卷...
点我阅读更多...
如何实现一个卷积函数
本文,我们使用 C++ 来实现一个简单的卷积运算函数。卷积运算我们都不陌生了,它的过程其实就是卷积核在矩阵上面滑动,每停留一次就将卷积核及其所覆盖的区域进行 element-wise 相乘并求和,所有这样的求和结果就构成了输出矩阵的元素。
为了提高卷积运算的性能,采用并行计算的思想,我们可以令不同位置的卷积核同时开算,在足够理想的情况下,任意尺寸的矩阵卷积时间复杂度都将是 (\mathcal{O}(1))。
另一方面来看,单个卷积核的运算过程本质上可以看作是一维向量的点积。于是我们可以把卷积核及其所覆盖的矩阵块都展开成一维向量,然后使用向量点积来代替前述的 element-wise 相乘并求和。而这个矩阵展开的过程就叫做 im2col,通过 im2col,我们可以把卷积运算...
点我阅读更多...