DNN介绍及公式推导-k讠nd怎么读英语

2023-08-22 22:03:17

 

深度神经网络(DNN,Deep Neural Networks)简介

首先让我们先回想起在之前博客(数据挖掘入门系列教程(七点五)之神经网络介绍)中介绍的神经网络:为了解决M-P模型中无法处理XOR等简单的非线性可分的问题时,我们提出了多层感知机,在输入层和输出层中间添加一层隐含层,这样该网络就能以任意精度逼近任意复杂度的连续函数。

然后在数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST博客中,我们使用类似上图的神经网络结构对MINIST数据集进行了训练,最后在epochs = 100的条件下,F1 socre达到了约86%86\%

这个时候我们想一想,如果我们将中间的隐含层由一层变为多层,如下图所示:

那么该网络就变成了深度神经网络(DNN),也可以称之为多层感知机(Multi-Layer perceptron,MLP)。

下面将对这个网络进行介绍以及公式推导。

DNN的基本结构及前向传播

在上面的图中,我们可以很容易的观察到,在DNN中,层与层之间是全连接的,也就是如同感知机一样,第ii层的任意一个神经元与第i+1i+1层的任意一个神经元都有连接。尽管这个网络看起来很庞大复杂,但是如果我们只看某一小部分,实际上它的原理与感知机很类似。

如同感知机,我们可以很简单的知道:

对于LayerL2LayerL_2的输出,可知:

a12=σ(z12)=σ(w112x1+w122x2+w132x3+b12)a22=σ(z22)=σ(w212x1+w222x2+w232x3+b22)a32=σ(z32)=σ(w312x1+w322x2+w332x3+b32)\begin{equation}\begin{aligned} &a_{1}^{2}=\sigma\left(z_{1}^{2}\right)=\sigma\left(w_{11}^{2} x_{1}+w_{12}^{2} x_{2}+w_{13}^{2} x_{3}+b_{1}^{2}\right)\\ &\begin{array}{l} a_{2}^{2}=\sigma\left(z_{2}^{2}\right)=\sigma\left(w_{21}^{2} x_{1}+w_{22}^{2} x_{2}+w_{23}^{2} x_{3}+b_{2}^{2}\right) \\ a_{3}^{2}=\sigma\left(z_{3}^{2}\right)=\sigma\left(w_{31}^{2} x_{1}+w_{32}^{2} x_{2}+w_{33}^{2} x_{3}+b_{3}^{2}\right) \end{array} \end{aligned}\end{equation} \\

对于ww的参数上标下标解释,以下图为例:

对于w243w_{24}^3,上标3代表ww所在的层数,下标2对应的是第三层的索引2,下标4对应的是第二层的索引4。至于为什么标记为w243w_{24}^3而不是w423w_{42}^3,我们可以从矩阵计算的角度进行考虑:

在下图中,为了得到aa,我们可以直接使用a=Wxa = Wx,也可使用a=WTxa = W^Tx这种形式,但是对于第二种形式,我们需要使用转置,这样会加大计算量,因此我们采用第一种形式。

对于LayerL3LayerL_3的输出,可知:

a13=σ(z13)=σ(w113a12+w123a22+w133a32+b13)\begin{equation}a_{1}^{3}=\sigma\left(z_{1}^{3}\right)=\sigma\left(w_{11}^{3} a_{1}^{2}+w_{12}^{3} a_{2}^{2}+w_{13}^{3} a_{3}^{2}+b_{1}^{3}\right)\end{equation} \\

假设我们在l−1l-1层一共有mm个神经元,对于第ll层第jj个神经元的输出ajla_j^l,有:

ajl=σ(zjl)=σ(∑k=1mwjklakl−1+bjl)\begin{equation}a_{j}^{l}=\sigma\left(z_{j}^{l}\right)=\sigma\left(\sum_{k=1}^{m} w_{j k}^{l} a_{k}^{l-1}+b_{j}^{l}\right)\end{equation} \\

如果我们采用矩阵的方式进行表示,则第ll层的输出为:

al=σ(zl)=σ(Wlal−1+bl)a^l = \sigma(z^l) = \sigma(W^la^{l-1} + b^l) \\

因此,我们可以对DNN的前向传播算法进行推导,从输入到输出有:

❝ 输入: 总层数LL,所有隐藏层和输出层对应的矩阵WW,偏倚向量bb,输入值向量xx 输出:输出层的输出aLa^L ​ 1) 初始化a1=xa^1 = x ​ 2) for l=2l=2 to LL

,计算:

al=σ(zl)=σ(Wlal−1+bl)\begin{equation}a^{l}=\sigma\left(z^{l}\right)=\sigma\left(W^{l} a^{l-1}+b^{l}\right)\end{equation} \\ 最后结果的输出即为aLa^L

以上便是DNN的前向传播算法,实际上挺简单的,就是一层一层向下递归。

DNN反向传播(BP)算法

数据挖掘入门系列教程(七点五)之神经网络介绍中,我们提到过BP算法,并进行过详细的数学公式的推导。BP算法的目的就是为了寻找合适的W,bW,b使得损失函数LossLoss达到某一个比较小的值(极小值)。

在DNN中,损失函数优化极值求解的过程最常见的一般是通过梯度下降法来一步步迭代完成的,当然也有其他的方法。而在这里,我们将使用梯度下降法对DNN中的反向传播算法进行一定的数学公式推导。图片和部分过程参考了Youtube:反向传播算法,但是对其中的某一些图片进行了修改。

在左边的图片中,是一个比较复杂的DNN网络,我们针对该DNN网络进行简化,将其看成每一层只有一个神经元的网络,如右图所示

此时我们还可以将问题进行简化,如果我们只看简化模型的最后面两个神经元,则有:

yy代表期望值,CoC_o代表损失函数C0=Loss=(a(L)−y)2\mathrm{C_0}=\operatorname{Loss}=\left(a^{(L)}-y\right)^{2}σ\sigma代表激活函数,比如说Relu,sigmoid,具体的表达式在图中,我就不写出来了。

在下图所示,当w(L)w^{(L)}发生微小的改变(∂w(L)\partial w^{(L)})时,会通过一连串的反应使得C0C_0发生微小的改变:类似蝴蝶扇动翅膀一样,响应流程如下∂w(L)⟶z(L)⟶a(L)⟶C0\partial w^{(L)} \longrightarrow z^{(L)} \longrightarrow a^{(L)} \longrightarrow C_0

此时我们对C0C_0求其WLW^L的偏导,则得到了下式:

∂C0∂w(L)=∂z(L)∂w(L)∂a(L)∂z(L)∂C0∂a(L)\begin{equation}\frac{\partial C_{0}}{\partial w^{(L)}}=\frac{\partial z^{(L)}}{\partial w^{(L)}} \frac{\partial a^{(L)}}{\partial z^{(L)}} \frac{\partial C_0}{\partial a^{(L)}}\end{equation} \\

我们分别求各自偏导的结果:

∵C0=(a(L)−y)2∴∂C0∂a(L)=2(a(L)−y)∵a(L)=σ(z(L))∴∂a(L)∂z(L)=σ′(z(L))∵z(L)=w(L)a(L−1)+b(L)∴∂z(L)∂w(L)=a(L−1)\begin{equation}\begin{aligned} &\because C_{0}=\left(a^{(L)}-y\right)^{2} \\ & \therefore \frac{\partial C 0}{\partial a^{(L)}}=2\left(a^{(L)}-y\right)\\ &\because a^{(L)}=\sigma\left(z^{(L)}\right) \\ & \therefore\frac{\partial a^{(L)}}{\partial z^{(L)}}=\sigma^{\prime}\left(z^{(L)}\right)\\ &\because z^{(L)}=w^{(L)} a^{(L-1)}+b^{(L)}\\ & \therefore \frac{\partial z^{(L)}}{\partial w^{(L)}}=a^{(L-1)} \end{aligned}\end{equation} \\

综上,结果为:

∂C0∂w(L)=∂z(L)∂w(L)∂a(L)∂z(L)∂C0∂a(L)=a(L−1)σ′(z(L))2(a(L)−y)\begin{equation}\frac{\partial C_{0}}{\partial w^{(L)}}=\frac{\partial z^{(L)}}{\partial w^{(L)}} \frac{\partial a^{(L)}}{\partial z^{(L)}} \frac{\partial C 0}{\partial a^{(L)}}=a^{(L-1)} \sigma^{\prime}\left(z^{(L)}\right) 2\left(a^{(L)}-y\right)\end{equation} \\

同理我们可得:

∂C0∂b(L)=∂z(L)∂b(L)∂a(L)∂z(L)∂C0∂a(L)=1σ′(z(L))2(a(L)−y)\begin{equation}\frac{\partial C_{0}}{\partial b^{(L)}}=\frac{\partial z^{(L)}}{\partial b^{(L)}} \frac{\partial a^{(L)}}{\partial z^{(L)}} \frac{\partial C 0}{\partial a^{(L)}}=1 \sigma^{\prime}\left(z^{(L)}\right) 2\left(a^{(L)}-y\right)\end{equation} \\∂C0∂a(L−1)=∂z(L)∂a(L−1)∂a(L)∂z(L)∂C0∂a(L)=w(L)σ′(z(L))2(a(L)−y)\begin{equation}\frac{\partial C_{0}}{\partial a^{(L-1)}}=\frac{\partial z^{(L)}}{\partial a^{(L-1)}} \frac{\partial a^{(L)}}{\partial z^{(L)}} \frac{\partial C 0}{\partial a^{(L)}}=w^{(L)} \sigma^{\prime}\left(z^{(L)}\right) 2\left(a^{(L)}-y\right)\end{equation} \\

这时候,我们可以稍微将问题复杂化一点,考虑多个神经元如下图所示,那么此时所有的变量W,x,b,z,a,yW,x,b,z,a,y也就变成了一个矩阵:

求导结果如下(这里我们使得Loss为J(W,b,x,y)=12‖aL−y‖22J(W, b, x, y)=\frac{1}{2}\left\|a^{L}-y\right\|_{2}^{2}表示,代表Loss与W,b,x,yW, b, x, y有关):

∂J(W,b,x,y)∂WL=∂J(W,b,x,y)∂zL∂zL∂WL=∂J(W,b,x,y)∂aL∂aL∂zL∂zL∂WL=(aL−y)⊙σ′(zL)(aL−1)T∂J(W,b,x,y)∂bL=∂J(W,b,x,y)∂zL∂zL∂bL=∂J(W,b,x,y)∂aL∂aL∂zL∂zL∂bL=(aL−y)⊙σ′(zL)\begin{equation}\begin{array}{c} \frac{\partial J(W, b, x, y)}{\partial W^{L}}=\frac{\partial J(W, b, x, y)}{\partial z^{L}} \frac{\partial z^{L}}{\partial W^{L}}=\frac{\partial J(W, b, x, y)}{\partial a^{L}} \frac{\partial a^{L}}{\partial z^{L}} \frac{\partial z^{L}}{\partial W^{L}}=\left(a^{L}-y\right) \odot \sigma^{\prime}\left(z^{L}\right)\left(a^{L-1}\right)^{T} \\ \frac{\partial J(W, b, x, y)}{\partial b^{L}}=\frac{\partial J(W, b, x, y)}{\partial z^{L}} \frac{\partial z^{L}}{\partial b^{L}}=\frac{\partial J(W, b, x, y)}{\partial a^{L}} \frac{\partial a^{L}}{\partial z^{L}} \frac{\partial z^{L}}{\partial b^{L}}=\left(a^{L}-y\right) \odot \sigma^{\prime}\left(z^{L}\right) \end{array}\end{equation} \\

注意上式中有一个符号\odot,它代表Hadamard积, 对于两个维度相同的向量 A(a1,a2,…an)T和B(b1,b2,…bn)T,A\left(a_{1}, a_{2}, \ldots a_{n}\right)^T 和 B\left(b_{1}, b_{2}, \ldots b_{n}\right)^{T},A⊙B=A \odot B= (a1b1,a2b2,…anbn)T\left(a_{1} b_{1}, a_{2} b_{2}, \ldots a_{n} b_{n}\right)^{T}。怎么理解这个变量呢?从一个不怎么严谨的角度进行理解:

假设第L−1L-1层有ii个神经元,第LL层有jj个神经元(如上图所示),那么毋庸置疑,∂W\partial W为一个j×ij \times i的矩阵(因为WW为一个j×ij \times i的矩阵,至于为什么,前面前向传播中已经提到了)。A⊙BA \odot B则是一个j×1j \times 1的矩阵,然后与(aL−1)T\left(a^{L-1}\right)^{T}*(它是一个1×i1 \times i 的矩阵)*相乘,最后结果则为一个j×ij \times i的矩阵。

在求导的结果∂J(W,b,x,y)∂WL和∂J(W,b,x,y)∂bL\frac{\partial J(W, b, x, y)}{\partial W^{L}} 和 \frac{\partial J(W, b, x, y)}{\partial b^{L}}有公共部分,也就是∂J(W,b,x,y)∂zL=(aL−y)⊙σ′(zL)\frac{\partial J(W, b, x, y)}{\partial z^{L}}=\left(a^{L}-y\right) \odot \sigma^{\prime}\left(z^{L}\right),代表输出层的梯度,因此我们令:

δL=∂J(W,b,x,y)∂zL=(aL−y)⊙σ′(zL)\begin{equation}\delta^{L}=\frac{\partial J(W, b, x, y)}{\partial z^{L}}=\left(a^{L}-y\right) \odot \sigma^{\prime}\left(z^{L}\right)\end{equation} \\

根据前向传播算法,对于与第ll层的Wl和blW^l 和 b^l的梯度有如下结论:

∂J(W,b,x,y)∂Wl=∂J(W,b,x,y)∂zl∂zl∂Wl=δl(al−1)T∂J(W,b,x,y)∂bl=∂J(W,b,x,y)∂zl∂zl∂bl=δl\begin{equation}\begin{array}{c} \frac{\partial J(W, b, x, y)}{\partial W^{l}}=\frac{\partial J(W, b, x, y)}{\partial z^{l}} \frac{\partial z^{l}}{\partial W^{l}}=\delta^{l}\left(a^{l-1}\right)^{T} \\ \frac{\partial J(W, b, x, y)}{\partial b^{l}}=\frac{\partial J(W, b, x, y)}{\partial z^{l}} \frac{\partial z^{l}}{\partial b^{l}}=\delta^{l} \end{array}\end{equation} \\

因此问题就变成了如何求得任意一层llδl\delta^{l},假设我们一共有LL层,则对于δL\delta^{L}我们还是能够直接进行求解δL=(aL−y)⊙σ′(zL)\delta^{L}=\left(a^{L}-y\right) \odot \sigma^{\prime}\left(z^{L}\right),那么我们如何对L−1L-1层进行求解呢?

设第l+1l+1层的δl+1\delta^{l+1}已知,则对δl\delta^{l}的求解如下:

δl=∂J(W,b,x,y)∂zl=(∂zl+1∂zl)T∂J(W,b,x,y)∂zl+1=(∂zl+1∂zl)Tδl+1\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} \\

也就是说,求解关键点又到了(∂zl+1∂zl)T(\frac{\partial z^{l+1}}{\partial z^{l}})^T的求解,根据前向传播算法:

zl+1=Wl+1al+bl+1=Wl+1σ(zl)+bl+1z^{l+1}= W^{l+1}a^{l} + b^{l+1} = W^{l+1}\sigma(z^l) + b^{l+1} \\

因此,有:

∂zl+1∂zl=Wl+1diag(σ′(zl))\frac{\partial z^{l+1}}{\partial z^{l}} = W^{l+1}diag(\sigma^{}(z^l)) \\

综上可得:

δl=(∂zl+1∂zl)T∂J(W,b,x,y)∂zl+1=diag(σ′(zl))(Wl+1)Tδl+1=(Wl+1)Tδl+1⊙σ′(zl)\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} = (W^{l+1})^T\delta^{l+1}\odot \sigma^{}(z^l) \\

因此当我们可以得到任意一层的δl\delta^{l}时,我们也就可以对任意的Wl和blW^l和b^l进行求解。

算法流程

下面算法流程是copy深度神经网络(DNN)反向传播算法(BP)的,因为他写的比我好多了,我就直接用他的了。

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

输入: 总层数LL, 以及各隐藏层与输出层的神经元个数, 激活函数, 损失函数, 选代步长 α\alpha,最大迭代次数MAXMAX与停止迭代阈值ϵ\epsilon, 输入的mm个训练样本 {(x1,y1),(x2,y2),…,(xm,ym)}\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \ldots,\left(x_{m}, y_{m}\right)\right\}

输出: 各隐藏层与输出层的线性关系系数矩阵 WW 和偏倚向量bb

初始化各隐藏层与输出层的线性关系系数矩阵WW和偏倚向量bb

的值为一个随机值。

for iter to 1 to MAX:

2.1 for i=1i=1 to mm

:

​ a. 将DNN输入 a1a^{1} 设置为 xix_{i} ​ b. for l=2l=2 to L,L, 进行前向传播算法计算 ai,l=σ(zi,l)=σ(Wlai,l−1+bl)a^{i, l}=\sigma\left(z^{i, l}\right)=\sigma\left(W^{l} a^{i, l-1}+b^{l}\right) ​ c. 通过损失函数计算输出层的 δi,L\delta^{i, L} ​ d. for l=l= L-1 to 2 , 进行反向传播算法计算 δi,l=(Wl+1)Tδi,l+1⊙σ′(zi,l)\delta^{i, l}=\left(W^{l+1}\right)^{T} \delta^{i, l+1} \odot \sigma^{\prime}\left(z^{i, l}\right) 2.2 for l=2l=2 to L,\mathrm{L}, 更新第ll层的 Wl,bl:W^{l}, b^{l}:

Wl=Wl−α∑i=1mδi,l(ai,l−1)Tbl=bl−α∑i=1mδi,l\begin{array}{c} W^{l}=W^{l}-\alpha \sum_{i=1}^{m} \delta^{i, l}\left(a^{i, l-1}\right)^{T} \\ b^{l}=b^{l}-\alpha \sum_{i=1}^{m} \delta^{i, l} \end{array} \\

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

输出各隐藏层与输出层的线性关系系数矩阵WW和偏倚向量bb

总结

这一篇博客主要是介绍了以下内容:

DNN介绍DNN的基本结构DNN的前向传播DNN的BP算法

本来是想在这一章博客中将CNN也介绍一下,但是想了想,可能还是分开介绍比较好。因此我将会在下一篇博客中主要会对CNN进行介绍以及部分推导。

参考

深度学习研究综述 ——张荣,李伟平,莫同深度神经网络(DNN)模型与前向传播算法Youtube:反向传播算法深度学习(一):DNN前向传播算法和反向传播算法


以上就是关于《DNN介绍及公式推导-k讠nd怎么读英语》的全部内容,本文网址:https://www.7ca.cn/baike/70221.shtml,如对您有帮助可以分享给好友,谢谢。
标签:
声明

排行榜