卷积神经网络 CNN BP算法推导
重点在对CNN的理解后, 理解对卷积层的的 梯度(导数) 推演.
回顾 CNN
首先是对神经网络, 前向, 后向的基本认识.
神经网络初步认识来看, 跟传统的 ML 理论的区别在于, 它更像一个经验的过程, 即debug. 它将一个样本输入(向量) 的每个分量, 进行一些 奇怪 的线性处理 (加权, 求和), 然后进行压缩投影 (0-1), 这样一层层地处理数据, 最后再来个 归一化 为一个向量(近似概率) 的输出. 这个过程呢, 称为 前向, 得到结果跟真实值之间的误差, 通过 反向 传递的方式来 动态调整权值参数 直到每个节点的 梯度接近0 就停止了调整了, 也就意味着, 网络基本构建完成了.
而 反向调整权值的 BP算法的核心, 就是多元函数求偏导, 利用链式法则而已.
学界已经证明, 一个3层的网络结构, 是可以模拟出任何的函数的, 只要中间层的节点够多. 但这样一来需要的计算量和内存非常大. 于是想着可以适当将网络变为复杂一点, 从层次上增加 (卷积层), 再加上一个滤波器, 实现对 输入的数据的特征提取 大幅度降低了计算复杂度.
CNN 的卷积过程, 一般会这样处理:
- 卷积核: 也是一个矩阵, 或者从数学上称为算子(option), 对输入矩阵进行变换, 通常, 输入,输出的维数没变, 但数值变了.
- 池化: 类似对卷积后的矩阵, 进行一个过滤, 分块 这样的(滤波器) 操作, 实现对对输入的 主特征提取.
池化的过程:
而网络的基本结构为: (以黑白图像, 单通道举例). 如果是彩色图像, 多通道, 则输入根据 R, G, B 三个矩阵而已.
回顾就到这了, 现重点来关注卷积层的梯度推演.
卷积层梯度 BP推导
变量声明
输入:
- 图像, 尺寸 H, W
- 卷积核, 尺寸 R, S
H, W 分别表示图片的高和宽, 如 100 x 200 px; R, S 表示卷积核的 垂直方向, 水平方向的 px, 跟 图片类似概念
参数:
- u, v 为纵向和横向的步长 (strides)
- a, b 为纵向和横向的填充 (padding) 这是为了, 卷积和对 图片区没有能对应上的地方(边界) 填充
输出:
- 特征图 (大小) : P, Q (P是纵向, Q是横向)
P, Q 呢, 作为 输入图像 H, W 与卷积核 R, S 卷积后的输出尺寸, 其关系为:
\(P = \frac {H-R +1+2a} {u}\)
\(Q = \frac {W-S +1+2b} {v}\)
2a, 2b 因为有两端嘛, 画图就能形象理解.
默认上对 P, Q 进行了 ceiling 操作, 使其为整数.
卷积的定义
对于给定的图像矩 I 和卷积核矩阵 K (卷积和尺寸为 k1 x k2)
Cross-correlation:
\((I \otimes K)_{ij} = \sum\limits_{m=0}^{k_1-1} \sum\limits_{n=0}^{k_2-1} I(i+m, j+n)K(m,n)\)
这就跟咱直观理解的"卷积" 的那个图移动操作是相符合的呀, 对应元素相乘, 然后再求和.
而在数学上的卷积概念, 跟我们上边这个直接对应元素相乘再求和有些不太一样:
\((I \otimes K)_{ij} = \sum\limits_{m=0}^{k_1-1} \sum\limits_{n=0}^{k_2-1} I(i-m, j-n)K(m,n)\)
\(=(I \otimes K)_{ij} = \sum\limits_{m=0}^{k_1-1} \sum\limits_{n=0}^{k_2-1} I(i+m, j+n)K(-m,-n)\)
即 卷积 Convolution 相当于将一个卷积核 旋转180度, 以后再来做 Cross-correlation
旋转这个操作, 即对应于某个的矩阵. 或者可理解为, 矩阵就是一个函数.
卷积前向
也是要线声明一波变量.
-
l 为层的下标, 第一层为 l=1,最后一层为 l = L
-
输入x 的尺寸为 H, W 并用 i, j 表示其下标
-
卷积核 w 的尺寸 k1, k2 并用 m, n 表示其下标
-
\(w^l_{mn}\) 为连接 l-1 层 和 l 层的卷积核
-
\(b^l\) 为 l 层的 bias
-
\(x^l_{i,j}\) 为 l 层激活函数的输入
-
\(o^l_{i,j}\) 为 l 层的输出
-
f(*) 为激活函数
暂时不细写了, 感觉好难去描述这种多层多维度的东西哦, 还是调api吧, 暂时, 太难弄了.
继续,
小结
还是留了一个推导的 Todo 在这里, 就关于BP推导的部分, 细节还有待考量, 太难弄觉得, 深度学习果然不一般, 目前觉得已到了我的知识上限了, 前面的BP还好, 偏导数而已, 而CNN的BP, 是有一下难度. 不过总体上, 这几篇算是理解了卷积的大致过程, 卷积无非是做了一个特征提取, 降低计算复杂度的这样一个往深度发展的网络结构而已. 原理并不算复杂, 但要从数学符号来描述, 我感觉我目前还是有点难, 放一放先, 至少概念基本清楚, 能调api即可.