卷积神经网络 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} = sumlimits_{m=0}^{k_1-1} sumlimits_{n=0}^{k_2-1} I(i+m, j+n)K(m,n))

这就跟咱直观理解的"卷积" 的那个图移动操作是相符合的呀, 对应元素相乘, 然后再求和.

而在数学上的卷积概念, 跟我们上边这个直接对应元素相乘再求和有些不太一样:

((I otimes K)_{ij} = sumlimits_{m=0}^{k_1-1} sumlimits_{n=0}^{k_2-1} I(i-m, j-n)K(m,n))

(=(I otimes K)_{ij} = sumlimits_{m=0}^{k_1-1} sumlimits_{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即可.

原文地址:https://www.cnblogs.com/chenjieyouge/p/12318116.html