• 卷积神经网络 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即可.

  • 相关阅读:
    Assembly之instruction之CMP
    Assembly之Instruction之Byte and Word
    MSP430之section(1)
    MSP430之software development flow
    openMSP430之Custom linker script
    CDC之Synchronizers
    CDC之Metastability
    Embedded之Stack之三
    Embedded之Stack之二
    Embedded之Stack之一
  • 原文地址:https://www.cnblogs.com/chenjieyouge/p/12318116.html
Copyright © 2020-2023  润新知