CNN前置知识:模型的数学符号定义——卷积网络从零实现系列(1)

 一、前言:

        本系列文章链接:

CNN前置知识:模型的数学符号定义——卷积网络从零实现系列(1)_日拱一两卒的博客-CSDN博客https://blog.csdn.net/yangwohenmai1/article/details/126951241?spm=1001.2014.3001.5501

CNN前向/反向传播原理推导——卷积网络从零实现系列(2)_日拱一两卒的博客-CSDN博客https://blog.csdn.net/yangwohenmai1/article/details/126622703?spm=1001.2014.3001.5501CNN前向传播源码实现——CNN数学推导及源码实现系列(3)_日拱一两卒的博客-CSDN博客https://blog.csdn.net/yangwohenmai1/article/details/127230225?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127230225%22%2C%22source%22%3A%22yangwohenmai1%22%7D      CNN反向传播源码实现——CNN数学推导及源码实现系列(4)_量化交易领域专家YangZongxian的博客-CSDN博客_cnn网络源码解析CNN算法逻辑、前向和反向传播数学原理、推导过程、以及CNN模型的源码实现上。https://forecast.blog.csdn.net/article/details/127461903?spm=1001.2014.3001.5502

        这个CNN系列是博主在学习图像识别过程中的一些学习笔记和总结,包含CNN数学推导和CNN源码实现两部分。属于机器学习的进阶内容,因此本文对神经网络的基础内容不做过多讲解,想学习基础,可看之前的神经网络入门系列文章:人工智能专题研究_日拱一两卒的博客-CSDN博客

        本系列重心放在解析CNN算法逻辑、前向和反向传播数学原理、推导过程、以及CNN模型的源码实现上。所以本文作为学习CNN模型理论的前置文章,重点介绍了通用神经网络模型的数学运算表达符号。

        大多数包含CNN的网络都属于深度神经网络(Deep Nueral Network),因此简化起见,后续我们都用DNN来表示通用的深度神经网络。

二、DNN前向传播和反向传播中的符号定义

1.单个神经元结构:

        首先我们先定义一个基础的神经网络模型,并标注好网络模型会使用的参数符号,以便后续使用和理解。如下图:

 ​        上图表示一个完整的神经元结构,x表示输入,\omega表示权重,\sigma表示激活函数,z表示神经元输出,所以一个完整的表达式形式是z= \sigma(w_{1}x_1 + w_{2}x_2 + w_{3}x_3),通常我们会额外添加一个调整系数b,所以另一种简洁的表示形式如下:

z=\sum\limits_{i=1}^mw_ix_i + b

2.神经网络结构:

         由于DNN层数多,则我们的线性关系系数W和偏置b的数量也就是很多了。具体的参数在DNN是如何定义的呢?我们构造一个4层网络如下图:

  (1)权重符号

        首先我们来看看线性关系系数W的定义。以上图这个四层的DNN为例,第二层的第3个神经元到第三层的第2个神经元的线性系数定义为w^3_{23},即上图标红的这条线。上标3代表权重系数W所在的层数,而下标{2,3}对应的是第三层的第2个神经元索引2和第二层的第3个神经元索引3。你也许会问,为什么不是w_{32}^3, 而是w^3_{23}呢?这主要是为了便于模型用于矩阵表示运算,如果是w_{32}^3而每次进行矩阵运算是w^Tx+b,需要进行转置。将输出的索引放在前面的话,则线性运算不用转置,即直接为wx+b

        总结下,第l-1层的第k个神经元到第l层的第j个神经元的线性系数定义为w^l_{jk}。注意,输入层是没有w参数的。

(2)偏置符号

        再来看看偏置b的定义。还是以这个三层的DNN为例,第二层的偏置定义为b^{2}。其中,上标2代表所在的层数。同样的道理,第三层的神经元的偏置应该表示为b^3。值得注意的是,输入层是没有偏置参数b的。

        我们已经介绍了DNN各层线性关系系数w,偏置b的定义。假设我们选择的激活函数是\sigma (z),隐藏层和输出层的输出值为a,则对于下图的三层DNN,利用和感知机一样的思路,我们可以利用上一层的输出计算下一层的输出,也就是所谓的DNN前向传播算法。

(3)输出符号

        对于第二层的的输出a_1^2,a_2^2,a_3^2​我们有:

a_1^2=\sigma(z_1^2) = \sigma(w_{11}^2x_1 + w_{12}^2x_2 + w_{13}^2x_3 + b^{2})

a_2^2=\sigma(z_2^2) = \sigma(w_{21}^2x_1 + w_{22}^2x_2 + w_{23}^2x_3 + b^{2})

a_3^2=\sigma(z_3^2) = \sigma(w_{31}^2x_1 + w_{32}^2x_2 + w_{33}^2x_3 + b^{2})

        同理对于第三层的的输出a_1^3​,我们有:

a_1^3=\sigma(z_1^3) = \sigma(w_{11}^3a_1^2 + w_{12}^3a_2^2 + w_{13}^3a_3^2 + b^{3})

        将上面的例子一般化,假设第l-1​层共有m个神经元,则对于第l层的第j​个神经元的输出a_j^l​,我们有:

a_j^l = \sigma(z_j^l) = \sigma(\sum\limits_{k=1}^mw_{jk}^la_k^{l-1} + b^l)

        其中,如果l=2​,则对于的a_k^1​即为输入层的x_k​。

        从上面可以看出,使用代数法一个一个的表示输出比较复杂,而如果使用矩阵法则比较的简洁。假设第l-1​层共有m​个神经元,而第l​层共有n​个神经元,则第l​层的线性系数w​组成了一个n \times m​的矩阵W^l​, 第l层的偏置b组成了一个n \times 1​的向量b^l​ , 第l-1​层的的输出a组成了一个m \times 1​的向量a^{l-1}​,第l层的未激活前线性输出z组成了一个n \times 1​的向量z^{l}​, 第l​层的的输出a​组成了一个n \times 1​的向量a^{l}​。则用矩阵法表示,第l层的输出为:

a^l = \sigma(z^l) = \sigma(W^la^{l-1} + b^l)

        这个表示方法简洁漂亮,后面我们的讨论都会基于上面的这个矩阵法表示来。

三、DNN前向传播算法流程的符号描述

        有了上一节的数学符号描述,我们后续用符号来描述DNN的前向传播算法也就不难了。所谓的DNN的前向传播算法也就是利用我们的若干个权重系数矩阵W​,偏置向量b​来和输入值向量x进行一系列线性运算和激活运算,从输入层开始一层层的向后计算,一直到运算到输出层,得到输出结果。流程描述如下:

        输入: 总层数L,所有隐藏层和输出层对应的矩阵W​,偏置向量b​,输入值向量x

        输出:输出层的输出a^L

        1)初始化a^1 = x

        2)  for l = 2​ to L​, 计算:

a^l = \sigma(z^l) = \sigma(W^la^{l-1} + b^l)

        最后的结果即为输出a^L​。

        DNN前向传播的过程很简单,基本都是简单的矩阵乘法和一些激活函数的函数运算,反向传播的过程就会复杂点。

四、DNN反向传播算法推导的符号描述

        在进行DNN反向传播算法前,我们需要选择一个损失函数,来度量训练样本计算出的输出和真实的训练样本输出之间的损失。你也许会问:训练样本计算出的输出是怎么得来的?其实这个输出是随机选择一系列W,b,​并用我们上一节的前向传播算法计算出来的结果。即通过一系列的计算:a^l = \sigma(z^l) = \sigma(W^la^{l-1} + b^l)​。计算到输出层第L层对应的a^L​即为前向传播算法计算出来的输出。

        回到损失函数,DNN可选择的损失函数有不少,为了专注算法,这里我们使用最常见的均方差来度量损失。即对于每个样本,我们期望最小化下式:

J(W,b,x,y) = \frac{1}{2}||a^L-y||_2^2

        其中,a^L​和y​为特征维度为n\_out​的向量,而||S||_2​为SL2​范数。损失函数有了,现在我们开始用梯度下降法迭代求解每一层的W,b​。首先是输出层第L​层。上街前向传播提到,输出层的W,b​满足下式:

a^L = \sigma(z^L) = \sigma(W^La^{L-1} + b^L)

        这样对于输出层的参数,我们的损失函数变为:

J(W,b,x,y) = \frac{1}{2}||a^L-y||_2^2 = \frac{1}{2}|| \sigma(W^La^{L-1} + b^L)-y||_2^2

        这样求解W,b的梯度就简单了:

\frac{\partial J(W,b,x,y)}{\partial W^L} = [(a^L-y) \odot \sigma^{'}(z^L)](a^{L-1})^T

\frac{\partial J(W,b,x,y)}{\partial b^L} =(a^L-y)\odot \sigma^{'}(z^L)

        注意上式中有一个符号\odot​,它代表Hadamard​积,对于两个维度相同的向量A(a_1,a_2,...a_n)^T​和,则A \odot B = (a_1b_1, a_2b_2,...a_nb_n)^T​。

        我们注意到在求解输出层的W,b​的时候,有中间依赖部分\frac{\partial J(W,b,x,y)}{\partial z^L}​也即\sigma^{'}(z^L),因此我们可以把公共的部分即对z^L​先表示出来,记为:

\delta^L = \frac{\partial J(W,b,x,y)}{\partial z^L} = (a^L-y)\odot \sigma^{'}(z^L)

        现在我们终于把输出层的梯度算出来了,那么如何计算上一层L-1层的梯度,上上层L-2层的梯度呢?这里我们需要一步步的递推,注意到对于第l层的未激活输出z^l​,它的梯度可以表示为:

\delta^l =\frac{\partial J(W,b,x,y)}{\partial z^l} = (\frac{\partial z^L}{\partial z^{L-1}}\frac{\partial z^{L-1}}{\partial z^{L-2}}...\frac{\partial z^{l+1}}{\partial z^{l}})^T\frac{\partial J(W,b,x,y)}{\partial z^L}

        如果我们可以依次计算出第l层的\delta^l,则该层的W^l,b^l​很容易计算?为什么呢?上节提到根据前向传播算法,我们有:

z^l= W^la^{l-1} + b^l

        所以根据上式我们可以很方便的计算出第l层的W^l,b^l的梯度如下:

\frac{\partial J(W,b,x,y)}{\partial W^l} = \delta^{l}(a^{l-1})^T

\frac{\partial J(W,b,x,y)}{\partial b^l} = \delta^{l}

        其中,第一个式子的推导可以参考文末参考文献矩阵向量求导链式法则这篇文章中第三节的最后一个公式。那么现在问题的关键就是要求出\delta^{l}​了。这里我们用数学归纳法,第L​层的\delta^{L}​上面我们已经求出, 假设第l+1​层的\delta^{l+1}​已经求出来了,那么我们如何求出第l层的\delta^{l}​呢?我们注意到:

\delta^{l} = \frac{\partial J(W,b,x,y)}{\partial z^l} = (\frac{\partial z^{l+1}}{\partial z^{l}})^T\frac{\partial J(W,b,x,y)}{\partial z^{l+1}} =(\frac{\partial z^{l+1}}{\partial z^{l}})^T \delta^{l+1}

        可见,用归纳法递推\delta^{l+1}​和\delta^{l}​的关键在于求解\frac{\partial z^{l+1}}{\partial z^{l}}​。而z^{l+1}​和z^{l}​的关系其实很容易找出:

z^{l+1}= W^{l+1}a^{l} + b^{l+1} = W^{l+1}\sigma(z^l) + b^{l+1}

        这样很容易求出:

\frac{\partial z^{l+1}}{\partial z^{l}} = W^{l+1}diag(\sigma^{'}(z^l))

        将上式带入上面\delta^{l+1}​和\delta^{l}​关系式,我们得到(矩阵求导后会转置\frac{\partial AB}{\partial B} = A^T):

\delta^{l} = \delta^{l+1}\frac{\partial z^{l+1}}{\partial z^{l}} =\frac{\partial (\delta^{l+1})^T z^{l+1}}{\partial z^{l}} = \frac{\partial (\delta^{l+1})^T (W^{l+1}\sigma(z^l) + b^{l+1})}{\partial z^{l}}

\delta^{l}= \frac{\partial (\delta^{l+1})^T W^{l+1}\sigma(z^l) }{\partial z^{l}} = ((\delta^{l+1})^T W^{l+1})^T\odot \sigma^{'}(z^l) =(W^{l+1})^T\delta^{l+1}\odot \sigma^{'}(z^l)

        即:

\delta^{l} =(W^{l+1})^T\delta^{l+1}\odot \sigma^{'}(z^l)

        也可表示为:

\delta^{l} = (\frac{\partial z^{l+1}}{\partial z^{l}})^T\frac{\partial J(W,b,x,y)}{\partial z^{l+1}} = diag(\sigma^{'}(z^l))(W^{l+1})^T\delta^{l+1}

         现在我们得到了\delta^{l}​的递推关系式,只要求出了某一层的\delta^{l}​,求解​W^lb^l的对应梯度就很简单的。

五、DNN反向传播算法流程的符号描述

        现在我们总结下DNN反向传播算法的过程。由于梯度下降法有批量(Batch),小批量(mini-Batch),随机三个变种,为了简化描述,这里我们以最基本的批量梯度下降法为例来描述反向传播算法。实际上在业界使用最多的是mini-Batch的梯度下降法。不过区别仅仅在于迭代时训练样本的选择而已。

        输入: 总层数L,以及各隐藏层与输出层的神经元个数,激活函数,损失函数,迭代步长\alpha​,最大迭代次数MAX与停止迭代阈值\epsilon​,输入的m个训练样本\{(x_1,y_1), (x_2,y_2), ..., (x_m,y_m)\}

        输出:各隐藏层与输出层的线性关系系数矩阵W​和偏置向量b

        1) 初始化各隐藏层与输出层的线性关系系数矩阵W​和偏置向量b​的值为随机值。

        2)for iter to 1 to MAX:

                2-1) for i =1​ to m​:

                        a) 将DNN输入a^1​设置为x_i

                        b) 进行前向传播算法计算a^{i,l} = \sigma(z^{i,l}) = \sigma(W^la^{i,l-1} + b^l)

                        c) 通过损失函数计算输出层的\delta^{i,L}

                        d) for l= L-1​ to 2, 进行反向传播算法计算\delta^{i,l} = (W^{l+1})^T\delta^{i,l+1}\odot \sigma^{'}(z^{i,l})

                2-2) for l = 2​ to L​,更新第l​层的W^l,b^l​:

W^l = W^l -\alpha \sum\limits_{i=1}^m \delta^{i,l}(a^{i, l-1})^T

b^l = b^l -\alpha \sum\limits_{i=1}^m \delta^{i,l}

    2-3) 如果所有W,b​的变化值都小于停止迭代阈值\epsilon​,则跳出迭代循环到步骤3。

        3) 输出各隐藏层与输出层的线性关系系数矩阵W​和偏置向量b​。

五、总结

        本文没用过多篇幅去讲解神经网络的基本原理,而是偏重于使用数学符号对神经网络中数据流转过程进行描述,目的是后续文章介绍CNN模型的基本原理时,可以直接引用本文使用的数学符号,而不至于过于突兀。如果想了解更多关于神经网络的基础知识,可以参考如下连接:人工智能专题研究_日拱一两卒的博客-CSDN博客https://blog.csdn.net/yangwohenmai1/category_9126892.html?spm=1001.2014.3001.5482

        本系列下篇文章链接:CNN前向/反向传播原理推导——CNN数学推导及源码实现系列(2)_日拱一两卒的博客-CSDN博客https://blog.csdn.net/yangwohenmai1/article/details/126622703?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22126622703%22%2C%22source%22%3A%22yangwohenmai1%22%7D

参考文献:

机器学习中的矩阵向量求导(四) 矩阵向量求导链式法则 - 刘建平Pinard - 博客园 (cnblogs.com)

Neural networks and deep learning

机器学习中的矩阵向量求导(五) 矩阵对矩阵的求导 - 刘建平Pinard - 博客园 (cnblogs.com)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部