深度学习中反向传播算法简单推导笔记

反向传播算法简单推导笔记

1.全连接神经网络

在这里插入图片描述

该结构的前向传播可以写成:

z(1)=W(1)x+b(1)z^{(1)} = W^{(1)}x+b^{(1)}z(1)=W(1)x+b(1)
a(1)=σ(z(1))a^{(1)} = \sigma(z^{(1)})a(1)=σ(z(1))
z(2)=W(2)a(1)+b(2)z^{(2)}=W^{(2)}a^{(1)}+b^{(2)}z(2)=W(2)a(1)+b(2)
a(2)=σ(z(2))a^{(2)} = \sigma(z^{(2)})a(2)=σ(z(2))

2.符号约定

  1. δi(x)\delta^{(x)}_{i}δi(x):∂Loss∂zi(x)\frac{\partial Loss}{\partial z_i^{(x)}}zi(x)Loss 标量.

  2. δ(x)\delta^{(x)}δ(x):向量,由δ1(x),δ2(x)...,δn(x)\delta^{(x)}_{1},\delta^{(x)}_{2}...,\delta^{(x)}_{n}δ1(x),δ2(x)...,δn(x)组成.

  3. ⊙\odot:表示按元素级别的乘法操作.
    [ab]⊙[cd]=[acbd]\left[ \begin{matrix} a\\b \end{matrix} \right] \odot \left[ \begin{matrix} c\\d \end{matrix} \right] = \left[ \begin{matrix} ac\\bd \end{matrix} \right][ab][cd]=[acbd]

    [abcd]⊙[ef]=[aebecfdf]\left[ \begin{matrix} a&b\\c&d \end{matrix} \right] \odot \left[ \begin{matrix} e\\f \end{matrix} \right] = \left[ \begin{matrix} ae&be\\cf &df\end{matrix} \right][acbd][ef]=[aecfbedf]

3.全连接反向传播公式推导

针对本博客给出来的2层,每层2个神经元的全连接神经网络模型,给出其反向传播推导过程.

现在欲求∂Loss∂W(1),∂Loss∂W(2),∂Loss∂b(1),∂Loss∂b(2),δ(1),δ(2)\frac{\partial Loss}{\partial W^{(1)}},\frac{\partial Loss}{\partial W^{(2)}},\frac{\partial Loss}{\partial b^{(1)}},\frac{\partial Loss}{\partial b^{(2)}},\delta^{(1)},\delta^{(2)}W(1)Loss,W(2)Loss,b(1)Loss,b(2)Loss,δ(1),δ(2).

依据模型图并根据链式求导法则可以得到下面的等式:
欲求δ(2)\delta^{(2)}δ(2)先考虑下面式子

δ1(2)=∂Loss∂a1(2)∗∂a1(2)∂z1(2)=∂Loss∂a1(2)∗σ′(z1(2))\delta^{(2)}_1=\frac{\partial Loss}{\partial a^{(2)}_1}*\frac{\partial a^{(2)}_1}{\partial z^{(2)}_1} = \frac{\partial Loss}{\partial a^{(2)}_1}*\sigma'(z^{(2)}_1)δ1(2)=a1(2)Lossz1(2)a1(2)=a1(2)Lossσ(z1(2))

δ2(2)=∂Loss∂a2(2)∗∂a2(2)∂z2(2)=∂Loss∂a2(2)∗σ′(z2(2))\delta^{(2)}_2=\frac{\partial Loss}{\partial a^{(2)}_2}*\frac{\partial a^{(2)}_2}{\partial z^{(2)}_2} = \frac{\partial Loss}{\partial a^{(2)}_2}*\sigma'(z^{(2)}_2)δ2(2)=a2(2)Lossz2(2)a2(2)=a2(2)Lossσ(z2(2))
那么
δ(2)=[δ1(2)δ2(2)]=[∂Loss∂a1(2)∂Loss∂a2(2)]⊙[σ′(z1(2))σ′(z2(2))]\delta^{(2)}=\left[ \begin{matrix} \delta^{(2)}_1 \\ \\ \delta^{(2)}_2 \end{matrix} \right] = \left[ \begin{matrix} \frac{\partial Loss}{\partial a^{(2)}_1} \\ \\ \frac{\partial Loss}{\partial a^{(2)}_2} \end{matrix} \right] \odot \left[ \begin{matrix} \sigma'(z^{(2)}_1) \\ \\ \sigma'(z^{(2)}_2) \end{matrix} \right]δ(2)=δ1(2)δ2(2)=a1(2)Lossa2(2)Lossσ(z1(2))σ(z2(2))


欲求∂Loss∂W(2)\frac{\partial Loss}{\partial W^{(2)}}W(2)Loss先考虑下面式子
∂Loss∂w11(2)=δ1(2)∗∂z1(2)∂w11(2)=δ1(2)∗a1(1)\frac{\partial Loss}{\partial w^{(2)}_{11}} = \delta^{(2)}_1*\frac{\partial z^{(2)}_1}{\partial w^{(2)}_{11}}= \delta^{(2)}_1*a^{(1)}_1w11(2)Loss=δ1(2)w11(2)z1(2)=δ1(2)a1(1)

∂Loss∂w12(2)=δ1(2)∗∂z1(2)∂w12(2)=δ1(2)∗a2(1)\frac{\partial Loss}{\partial w^{(2)}_{12}} = \delta^{(2)}_1*\frac{\partial z^{(2)}_1}{\partial w^{(2)}_{12}}= \delta^{(2)}_1*a^{(1)}_2w12(2)Loss=δ1(2)w12(2)z1(2)=δ1(2)a2(1)

∂Loss∂w21(2)=δ2(2)∗∂z2(2)∂w21(2)=δ2(2)∗a1(1)\frac{\partial Loss}{\partial w^{(2)}_{21}} = \delta^{(2)}_2*\frac{\partial z^{(2)}_2}{\partial w^{(2)}_{21}}= \delta^{(2)}_2*a^{(1)}_1w21(2)Loss=δ2(2)w21(2)z2(2)=δ2(2)a1(1)

∂Loss∂w22(2)=δ2(2)∗∂z2(2)∂w22(2)=δ2(2)∗a2(1)\frac{\partial Loss}{\partial w^{(2)}_{22}} = \delta^{(2)}_2*\frac{\partial z^{(2)}_2}{\partial w^{(2)}_{22}}= \delta^{(2)}_2*a^{(1)}_2w22(2)Loss=δ2(2)w22(2)z2(2)=δ2(2)a2(1)

那么
∂Loss∂W(2)=[δ1(2)⋅a1(1)δ1(2)⋅a2(1)δ2(2)⋅a1(1)δ2(2)⋅a2(1)]=[δ1(2)δ2(2)]⋅[a1(1)a2(1)]=δ(2)⋅a(1)T\frac{\partial Loss}{\partial W^{(2)}} = \left[ \begin{matrix} \delta^{(2)}_1 \cdot a^{(1)}_1 & \delta^{(2)}_1\cdot a^{(1)}_2 \\ \\ \delta^{(2)}_2 \cdot a^{(1)}_1 & \delta^{(2)}_2 \cdot a^{(1)}_2 \end{matrix} \right] = \left[ \begin{matrix} \delta^{(2)}_1 \\ \\ \delta^{(2)}_2 \end{matrix} \right] \cdot \left[ \begin{matrix} a^{(1)}_1 & a^{(1)}_2 \end{matrix} \right] = \delta^{(2)}\cdot a^{(1)T}W(2)Loss=δ1(2)a1(1)δ2(2)a1(1)δ1(2)a2(1)δ2(2)a2(1)=δ1(2)δ2(2)[a1(1)a2(1)]=δ(2)a(1)T


欲求∂Loss∂b(2)\frac{\partial Loss}{\partial b^{(2)}}b(2)Loss,先考虑下面式子

∂Loss∂b1(2)=δ1(2)∗1\frac{\partial Loss}{\partial b^{(2)}_1} = \delta^{(2)}_1*1b1(2)Loss=δ1(2)1

∂Loss∂b2(2)=δ2(2)∗1\frac{\partial Loss}{\partial b^{(2)}_2} = \delta^{(2)}_2*1b2(2)Loss=δ2(2)1

那么
∂Loss∂b(2)=[δ1(2)δ2(2)]⊙[1]=δ(2)\frac{\partial Loss}{\partial b^{(2)}} = \left[ \begin{matrix} \delta^{(2)}_1 \\ \\ \delta^{(2)}_2 \end{matrix} \right] \odot \left[ \begin{matrix} 1 \end{matrix} \right] = \delta^{(2)}b(2)Loss=δ1(2)δ2(2)[1]=δ(2)


欲求δ(1)\delta^{(1)}δ(1),先考虑下面式子

δ1(1)=δ1(2)⋅∂z1(2)∂a1(1)⋅∂a1(1)∂z1(1)+δ2(2)⋅∂z2(2)∂a1(1)⋅∂a1(1)∂z1(1)=δ1(2)⋅w11(2)⋅σ′(z1(1))+δ2(2)⋅w21(2)⋅σ′(z1(1))\delta^{(1)}_1 = \delta^{(2)}_1 \cdot \frac{\partial z^{(2)}_{1}}{\partial a^{(1)}_1} \cdot \frac{\partial a_1^{(1)}}{\partial z_1^{(1)}} + \delta^{(2)}_2 \cdot \frac{\partial z^{(2)}_{2}}{\partial a^{(1)}_1} \cdot \frac{\partial a_1^{(1)}}{\partial z_1^{(1)}} = \delta^{(2)}_1 \cdot w^{(2)}_{11} \cdot \sigma'(z_1^{(1)}) + \delta^{(2)}_2 \cdot w_{21}^{(2)} \cdot \sigma'(z_1^{(1)})δ1(1)=δ1(2)a1(1)z1(2)z1(1)a1(1)+δ2(2)a1(1)z2(2)z1(1)a1(1)=δ1(2)w11(2)σ(z1(1))+δ2(2)w21(2)σ(z1(1))

δ2(1)=δ1(2)⋅∂z1(2)∂a2(1)⋅∂a2(1)∂z2(1)+δ2(2)⋅∂z2(2)∂a2(1)⋅∂a2(1)∂z2(1)=δ1(2)⋅w12(2)⋅σ′(z2(1))+δ2(2)⋅w22(2)⋅σ′(z2(1))\delta^{(1)}_2 = \delta^{(2)}_1 \cdot \frac{\partial z^{(2)}_{1}}{\partial a^{(1)}_2} \cdot \frac{\partial a_2^{(1)}}{\partial z_2^{(1)}} + \delta^{(2)}_2 \cdot \frac{\partial z^{(2)}_{2}}{\partial a^{(1)}_2} \cdot \frac{\partial a_2^{(1)}}{\partial z_2^{(1)}} = \delta^{(2)}_1 \cdot w^{(2)}_{12} \cdot \sigma'(z_2^{(1)}) + \delta^{(2)}_2 \cdot w_{22}^{(2)} \cdot \sigma'(z_2^{(1)})δ2(1)=δ1(2)a2(1)z1(2)z2(1)a2(1)+δ2(2)a2(1)z2(2)z2(1)a2(1)=δ1(2)w12(2)σ(z2(1))+δ2(2)w22(2)σ(z2(1))

那么

δ(1)=[w11(2)w21(2)w12(2)w22(2)]⋅[δ1(2)δ2(2)]⊙[σ′(z1(1))σ′(z2(1))]=W(2)T⋅δ(2)⊙σ′(z(1))\delta^{(1)}=\left[ \begin{matrix} w_{11}^{(2)} & w_{21}^{(2)} \\ \\ w_{12}^{(2)} & w_{22}^{(2)} \end{matrix} \right] \cdot \left[ \begin{matrix} \delta^{(2)}_1 \\ \\ \delta^{(2)}_2 \end{matrix} \right] \odot \left[ \begin{matrix} \sigma'(z^{(1)}_1) \\ \\ \sigma'{(z_2^{(1)})} \end{matrix} \right]=W^{(2)T} \cdot \delta^{(2)} \odot \sigma'(z^{(1)})δ(1)=w11(2)w12(2)w21(2)w22(2)δ1(2)δ2(2)σ(z1(1))σ(z2(1))=W(2)Tδ(2)σ(z(1))


∂Loss∂W(1),∂Loss∂b(1)\frac{\partial Loss}{\partial W^{(1)}},\frac{\partial Loss}{\partial b^{(1)}}W(1)Loss,b(1)Loss的方法与之前求∂Loss∂W(2),∂Loss∂b(2)\frac{\partial Loss}{\partial W^{(2)}},\frac{\partial Loss}{\partial b^{(2)}}W(2)Loss,b(2)Loss完全相同,这里就不赘述了

利用向量微积分简化推导过程

上面的推到方法我们专注于拆成标量用链式求导法则算,最后拼成矩阵相乘的形式,这样从数学上来说比较严谨,但是较为麻烦.

而实际上我们有一种更为简单(玄学 )的做法,那就是直接对向量运用链式求导法则,并且根据矩阵的维数来调整项目的位置和对项目进行转置.

欲求δ(2)=∂Loss∂z(2)=∂Loss∂a(2)⋅∂a(2)∂z(2)\delta^{(2)} = \frac{\partial Loss}{\partial z^{(2)}} = \frac{\partial Loss}{\partial a^{(2)}} \cdot \frac{\partial a^{(2)}}{\partial z^{(2)}}δ(2)=z(2)Loss=a(2)Lossz(2)a(2)

由于dim{δ(2)}=2∗1,dim{∂Loss∂a(2)}=2∗1dim\{\delta^{(2)}\} = 2*1,dim\{\ \frac{\partial Loss}{\partial a^{(2)}} \} = 2*1dim{δ(2)}=21,dim{ a(2)Loss}=21,根据矩阵乘法的法则,理论上应该有dim{∂a(2)∂z(2)}=1∗1dim\{\ \frac{\partial a^{(2)}}{\partial z^{(2)}} \} = 1*1dim{ z(2)a(2)}=11.

而实际上如果是列向量(a(2)a^{(2)}a(2))对列向量(z(2)z^{(2)}z(2))进行求导,大多都是对应元素进行求导,比如∂a(2)∂z(2)=[σ′(z1(2))σ′(z2(2))]=σ′(z(2))\frac{\partial a^{(2)}}{\partial z^{(2)}}=\left[ \begin{matrix} \sigma'(z^{(2)}_1) \\ \\ \sigma'(z^{(2)}_2) \end{matrix} \right]=\sigma'(z^{(2)})z(2)a(2)=σ(z1(2))σ(z2(2))=σ(z(2)),也就是说dim{∂a(2)∂z(2)}=2∗1dim\{\frac{\partial a^{(2)}}{\partial z^{(2)}} \} = 2*1dim{z(2)a(2)}=21.

那怎么办呢,2∗1,2∗22*1,2*221,22的矩阵不满足乘法规律,这样的话,使用⊙\odot这个操作刚好就可以,所以:
δ(2)=∂Loss∂z(2)=∂Loss∂a(2)⋅∂a(2)∂z(2)=∂Loss∂a(2)⊙σ′(z(2))\delta^{(2)} = \frac{\partial Loss}{\partial z^{(2)}} = \frac{\partial Loss}{\partial a^{(2)}} \cdot \frac{\partial a^{(2)}}{\partial z^{(2)}}=\frac{\partial Loss}{\partial a^{(2)}} \odot \sigma'(z^{(2)})δ(2)=z(2)Loss=a(2)Lossz(2)a(2)=a(2)Lossσ(z(2))

看到这里,明白人一定会说:你这不扯淡吗,毫无道理.

没错,你来打我呀.

我们再看一个例子:

欲求∂Loss∂W(2)=(∂Loss∂a(2)⋅∂a(2)∂z(2))⋅∂z(2)∂W(2)=δ(2)⋅∂z(2)∂W(2)\frac{\partial Loss}{\partial W^{(2)}} = (\frac{\partial Loss}{\partial a^{(2)}} \cdot \frac{\partial a^{(2)}}{\partial z^{(2)}}) \cdot \frac{\partial z^{(2)}}{\partial W^{(2)}} = \delta^{(2)} \cdot \frac{\partial z^{(2)}}{\partial W^{(2)}}W(2)Loss=(a(2)Lossz(2)a(2))W(2)z(2)=δ(2)W(2)z(2)

注意到dim{∂Loss∂W(2)}=2∗2,dim{δ(2)}=2∗1dim\{\frac{\partial Loss}{\partial W^{(2)}}\}=2*2,dim\{\delta^{(2)}\}=2*1dim{W(2)Loss}=22,dim{δ(2)}=21
那么理论上应该有dim{∂z(2)∂W(2)}=1∗2dim\{\frac{\partial z^{(2)}}{\partial W^{(2)}}\} = 1*2dim{W(2)z(2)}=12.

我们根据z(2)=W(2)a(1)+b(2)z^{(2)}=W^{(2)}a^{(1)}+b^{(2)}z(2)=W(2)a(1)+b(2),知道dim{a(1)}=2∗1dim\{a^{(1)}\}=2*1dim{a(1)}=21,所以令∂z(2)∂W(2)=a(1)T\frac{\partial z^{(2)}}{\partial W^{(2)}}=a^{(1)T}W(2)z(2)=a(1)T.

于是∂Loss∂W(2)=δ(2)⋅a(1)T\frac{\partial Loss}{\partial W^{(2)}}= \delta^{(2)} \cdot a^{(1)T}W(2)Loss=δ(2)a(1)T.

虽然很扯淡,但这样做跟前面用数学推导得到的公式是一样的.

我们再看一个例子:

δ(1)=∂Loss∂z(1)=∂Loss∂z(2)⋅∂z(2)∂a(1)⋅∂a(1)∂z(1)\delta^{(1)} = \frac{\partial Loss}{\partial z^{(1)}}=\frac{\partial Loss}{\partial z^{(2)}} \cdot \frac{\partial z^{(2)}}{\partial a^{(1)}} \cdot \frac{\partial a^{(1)}}{\partial z^{(1)}}δ(1)=z(1)Loss=z(2)Lossa(1)z(2)z(1)a(1)

由于dim{∂Loss∂z(1)}=n∗1,dim{∂Loss∂z(2)}=m∗1,dim{∂z(2)∂a(1)}=?,dim{∂a(1)∂z(1)}=n∗1dim\{\frac{\partial Loss}{\partial z^{(1)}}\}=n*1,dim\{\frac{\partial Loss}{\partial z^{(2)}}\}=m*1,dim\{\frac{\partial z^{(2)}}{\partial a^{(1)}}\} = ?,dim\{\frac{\partial a^{(1)}}{\partial z^{(1)}}\}=n*1dim{z(1)Loss}=n1,dim{z(2)Loss}=m1,dim{a(1)z(2)}=?,dim{z(1)a(1)}=n1.

再根据z(2)=W(2)a(1)+b(2)z^{(2)}=W^{(2)}a^{(1)}+b^{(2)}z(2)=W(2)a(1)+b(2),那么∂z(2)∂a(1)\frac{\partial z^{(2)}}{\partial a^{(1)}}a(1)z(2)一定是有W(2)W^{(2)}W(2)变化而来的,而dim{W(2)}=m∗ndim\{W^{(2)}\}=m*ndim{W(2)}=mn,所以玄学一波(调整一下顺序以及转置)应该得到:
(其中n,m=2n,m=2n,m=2)

δ(1)=W(2)T⋅δ(2)⊙σ′(z(1))\delta^{(1)} = W^{(2)T} \cdot \delta^{(2)} \odot \sigma'(z^{(1)})δ(1)=W(2)Tδ(2)σ(z(1)).这与上面数学推导得到的结果是一致的.


4.卷积层反向传播

输入层为XXX,卷积核为KKK,输出层为YYY.

那么有 X⊗K=YX \otimes K=YXK=Y.

如果XXX的宽度为xxx,KKK的宽度为kkk,YYY的宽度为yyy.那么有y=x−k+1y=x-k+1y=xk+1成立.

[x11x12x13x21x22x23x31x32x33]⊗[k11k12x21k22]=[y11y12y21y22]\left[ \begin{matrix} x_{11} & x_{12} & x_{13} \\ x_{21} & x_{22} & x_{23} \\ x_{31} & x_{32} & x_{33} \end{matrix} \right] \otimes \left[ \begin{matrix} k_{11} & k_{12} \\ x_{21} & k_{22} \end{matrix} \right] = \left[ \begin{matrix} y_{11} & y_{12} \\ y_{21} & y_{22} \end{matrix} \right]x11x21x31x12x22x32x13x23x33[k11x21k12k22]=[y11y21y12y22]

展开之后我们可以写成:

y11=x11k11+x12k12+x21k21+x22k22y_{11}=x_{11}k_{11}+x_{12}k_{12}+x_{21}k_{21}+x_{22}k_{22}y11=x11k11+x12k12+x21k21+x22k22
y12=x12k11+x13k12+x22k21+x23k22y_{12}=x_{12}k_{11}+x_{13}k_{12}+x_{22}k_{21}+x_{23}k_{22}y12=x12k11+x13k12+x22k21+x23k22
y21=x21k11+x22k12+x31k21+x32k22y_{21}=x_{21}k_{11}+x_{22}k_{12}+x_{31}k_{21}+x_{32}k_{22}y21=x21k11+x22k12+x31k21+x32k22
y22=x22k11+x23k12+x32k21+x33k22y_{22}=x_{22}k_{11}+x_{23}k_{12}+x_{32}k_{21}+x_{33}k_{22}y22=x22k11+x23k12+x32k21+x33k22

δij=∂Loss∂yij=∇yij\delta_{ij}=\frac{\partial Loss}{\partial y_{ij}}=\nabla y_{ij}δij=yijLoss=yij

∂Loss∂k11=δ11⋅x11+δ12⋅x12+δ21⋅x21+δ22⋅x22\frac{\partial Loss}{\partial k_{11}}=\delta_{11} \cdot x_{11} + \delta_{12} \cdot x_{12}+\delta_{21} \cdot x_{21}+\delta_{22} \cdot x_{22}k11Loss=δ11x11+δ12x12+δ21x21+δ22x22
∂Loss∂k12=δ11⋅x12+δ12⋅x13+δ21⋅x22+δ22⋅x23\frac{\partial Loss}{\partial k_{12}}=\delta_{11} \cdot x_{12} + \delta_{12} \cdot x_{13}+\delta_{21} \cdot x_{22}+\delta_{22} \cdot x_{23}k12Loss=δ11x12+δ12x13+δ21x22+δ22x23
∂Loss∂k21=δ11⋅x21+δ12⋅x22+δ21⋅x31+δ22⋅x32\frac{\partial Loss}{\partial k_{21}}=\delta_{11} \cdot x_{21} + \delta_{12} \cdot x_{22}+\delta_{21} \cdot x_{31}+\delta_{22} \cdot x_{32}k21Loss=δ11x21+δ12x22+δ21x31+δ22x32
∂Loss∂k22=δ11⋅x22+δ12⋅x23+δ21⋅x32+δ22⋅x33\frac{\partial Loss}{\partial k_{22}}=\delta_{11} \cdot x_{22} + \delta_{12} \cdot x_{23}+\delta_{21} \cdot x_{32}+\delta_{22} \cdot x_{33}k22Loss=δ11x22+δ12x23+δ21x32+δ22x33

我们发现

[∇k11∇k12∇k21∇k22]=[x11x12x13x21x22x23x31x32x33]⊗[∇y11∇y12∇y21∇y22]\left[ \begin{matrix} \nabla k_{11} &\nabla k_{12} \\ \\ \nabla k_{21} &\nabla k_{22} \end{matrix} \right] = \left[ \begin{matrix} x_{11} & x_{12} & x_{13} \\ x_{21} & x_{22} & x_{23} \\ x_{31} & x_{32} & x_{33} \end{matrix} \right] \otimes \left[ \begin{matrix} \nabla y_{11} & \nabla y_{12} \\ \\ \nabla y_{21} & \nabla y_{22} \end{matrix} \right]k11k21k12k22=x11x21x31x12x22x32x13x23x33y11y21y12y22

而这刚好也是一个卷积操作,可以写成

∂Loss∂K=∂Loss∂Y⋅∂Y∂K=X⊗∇Y\frac{\partial Loss}{\partial K}=\frac{\partial Loss}{\partial Y}\cdot\frac{\partial Y}{\partial K}=X \otimes \nabla YKLoss=YLossKY=XY

我们写成 ∇K=X⊗∇Y\nabla K=X \otimes \nabla YK=XY

这说明了卷积层的梯度传播仍然是卷积操作.

那么对卷积核KKK的梯度∇K\nabla KK我们求出来了,下面我们省略对XXX的梯度推导步骤,直接得出公式∇X=pad(∇Y)⊗rot180(K)\nabla X= pad(\nabla Y) \otimes rot_{180}(K)X=pad(Y)rot180(K)

其中rot180rot_{180}rot180操作表示将矩阵旋转180180180度,可以理解成先左右旋转,再上下旋转.

其中padpadpad操作表示对矩阵周围进行补000操作,为什么需要补000呢,这是为了保证最后维数是匹配的.∇X\nabla XX的维度是rrr,KKK的唯独是kkk,那么我们前向传播时候得到的YYY的维度是r−k+1r-k+1rk+1.假设pad(∇Y)pad(\nabla Y)pad(Y)的维度是???,那么必须有r=?−k+1r=?-k+1r=?k+1,所以?=r+k−1?=r+k-1?=r+k1,因此padpadpad操作将维度为r−k+1r-k+1rk+1的矩阵补成维度r+k−1r+k-1r+k1.

例如这个例子中的pad(∇Y)pad(\nabla Y)pad(Y)应该写成:

[00000∇y11∇y1200∇y21∇y2200000]\left[ \begin{matrix} 0&0&0&0 \\ 0&\nabla y_{11} & \nabla y_{12} & 0\\ 0&\nabla y_{21} & \nabla y_{22} & 0\\ 0&0&0&0 \end{matrix} \right]00000y11y2100y12y2200000

这个例子中的rot180(K)rot_{180}(K)rot180(K)应该写成:

[w22w21w12w11]\left[ \begin{matrix} w_{22} &w_{21} \\ \\ w_{12} & w_{11} \end{matrix} \right]w22w12w21w11


5.卷积操作的实现

卷积操作其实也可以写作矩阵乘法来做.

比如下面式子可以写成矩阵相乘的形式:

[x11x12x13x21x22x23x31x32x33]⊗[k11k12x21k22]=[y11y12y21y22]\left[ \begin{matrix} x_{11} & x_{12} & x_{13} \\ x_{21} & x_{22} & x_{23} \\ x_{31} & x_{32} & x_{33} \end{matrix} \right] \otimes \left[ \begin{matrix} k_{11} & k_{12} \\ x_{21} & k_{22} \end{matrix} \right] = \left[ \begin{matrix} y_{11} & y_{12} \\ y_{21} & y_{22} \end{matrix} \right]x11x21x31x12x22x32x13x23x33[k11x21k12k22]=[y11y21y12y22]


y11=x11k11+x12k12+x21k21+x22k22y_{11}=x_{11}k_{11}+x_{12}k_{12}+x_{21}k_{21}+x_{22}k_{22}y11=x11k11+x12k12+x21k21+x22k22
y12=x12k11+x13k12+x22k21+x23k22y_{12}=x_{12}k_{11}+x_{13}k_{12}+x_{22}k_{21}+x_{23}k_{22}y12=x12k11+x13k12+x22k21+x23k22
y21=x21k11+x22k12+x31k21+x32k22y_{21}=x_{21}k_{11}+x_{22}k_{12}+x_{31}k_{21}+x_{32}k_{22}y21=x21k11+x22k12+x31k21+x32k22
y22=x22k11+x23k12+x32k21+x33k22y_{22}=x_{22}k_{11}+x_{23}k_{12}+x_{32}k_{21}+x_{33}k_{22}y22=x22k11+x23k12+x32k21+x33k22

[y11y12y21y22]=[x11x12x21x22x12x13x22x23x21x22x31x32x22x23x32x33]⋅[k11k12k21k22]\left[\begin{matrix} y_{11}\\y_{12}\\y_{21}\\y_{22} \end{matrix}\right] = \left[\begin{matrix} x_{11}&x_{12}&x_{21}&x_{22}\\ x_{12}&x_{13}&x_{22}&x_{23}\\ x_{21}&x_{22}&x_{31}&x_{32}\\ x_{22}&x_{23}&x_{32}&x_{33} \end{matrix}\right] \cdot \left[\begin{matrix} k_{11}\\ k_{12}\\k_{21}\\k_{22} \end{matrix}\right]y11y12y21y22=x11x12x21x22x12x13x22x23x21x22x31x32x22x23x32x33k11k12k21k22

从上面的例子可以看出吗,要把卷积操作变成矩阵相乘需要把YYY矩阵和KKK矩阵都展成一列向量,并且要对XXX矩阵做一个操作,就是把XXX按照卷积核的大小拆出一个大小为k2∗k2k^2*k^2k2k2的矩阵来.

最后矩阵乘法做完以后,将yyy向量reshapereshapereshape成矩阵回来就好了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EntityFramework Core进行读写分离最佳实践方式,了解一下(二)?

写过上一篇关于EF Core中读写分离最佳实践方式后,虽然在一定程度上改善了问题,但是在评论中有的指出更换到从数据库。那么接下来要进行插入此时又要切换到主数据库,同时有的指出是否可以进行底层无感知操作,这确实是个问题&#x…

一文搞清到底什么是 .NET?

现在各种 .NET 满天飞,别说新手了,连我这样的老手都差点被绕进去。到底什么是 .NET 呢?通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core? 这篇文章好长呀,不知道你看完了没有,其实…

Service Mesh新成员:Consul 1.2

本文译自 HashiCorp 官网关于 Consul 1.2 支持 Service Mesh 发布的博客文章。原文链接:https://www.hashicorp.com/blog/consul-1-2-service-mesh作者:Mitchell Hashimoto 翻译:董干 转载自:https://blog.idevfun.io/consul-1-2-…

VAE(变分自编码器)学习笔记

VAE学习笔记 普通的编码器可以将图像这类信息编码成为特征向量. 但通常这些特征向量不具有空间上的连续性. VAE(变分自编码器)可以将图像信息编码成为具有空间连续性的特征向量. 方法是向编码器和解码器中加入统计信息,即特征向量代表的的是一个高斯分布,强迫特征向量服从高…

小 X 的 AK 计划

小 X 的 AK 计划 题目大意: 有n个点,到一个点(时间为距离)并花一些时间可以A掉此点,问最多可以A多少个点 原题: 解题思路: 先按位置从小到大排序,然后到每一个点并A掉的时间加在…

.NET Core 2.1的重大缺陷延长了.NET Core 2.0的寿命

微软近日宣布,.NET Core 2.0 即将 "寿终正寝",对它的支持将在2018年10月1日结束。.NET Core 2.0 是一个非长期支持(LTS)的版本,因此微软的承诺是在下一个版本发布的三个月之后结束对它的支持。由于 .NET Cor…

.Net Core开发日志——Global Tools

.Net Core 2.1引入了一个新的功能,Global Tools,其本质是包含控制台应用程序的nuget包,目前而言,还没有特别有用的工具,不过相信随着时间的推移,各种有创意或者实用性强的Global Tools会出现在大家的视野里…

Simple-Faster-RCNN源码学习笔记

Simple-Faster-RCNN 源码学习 项目github地址: https://github.com/chenyuntc/simple-faster-rcnn-pytorch 源码 源文件: model/utils/bbox_tools.py 方法: loc2bbox(src_bbox, loc) 参数含义: src_bbox描述的是bbox的坐标.loc表示的偏移(offsets)和缩放尺度(scales). 给…

API网关模式

什么是网关网关一词来源于计算机网络中的定义,网关(Gateway)又称网间连接器、协议转换器。网关的准确定义是: 两个计算机程序或系统之间的连接,网关作为两个程序之间的门户,允许它们通过不同计算机之间的协议通信来共享信息。顾名…

CVPR19 基于图卷积网络的多标签图像识别模型 论文笔记

笔记 旷视研究院的研究员提出了如下模型,用于图像的多标签分类. 该模型与一般模型不一样的一点是,它的分类器是生成的,因此它有一个专门生成分类器的子网络. 网络主要由两部分构成 特征表示子网络,该网络由ResNet-101构成,即蓝色框圈出的部分.分类器生成子网络,该网络由3个…

日行千里,全凭“车”况,为什么我们要升级平台

历经一个半月的时间,不管是叫工业互联网平台还是叫工业大数据平台,从1.0版本升级到2.0版本,升级部分包括:客户端(网关)、服务端(数据接收、数据处理、计算服务)、底层数据库结构、WE…

好代码是管出来的——.Net Core中的单元测试与代码覆盖率

测试对于软件来说,是保证其质量的一个重要过程,而测试又分为很多种,单元测试、集成测试、系统测试、压力测试等等,不同的测试的测试粒度和测试目标也不同,如单元测试关注每一行代码,集成测试关注的是多个模…

数字图像处理作业

图像处理作业 1 取sT(r)11(mr)EsT(r)\frac{1}{1(\frac{m}{r})^E}sT(r)1(rm​)E1​ 其中rrr为原始亮度,mmm为输入区间的中点,EEE描述曲线的陡峭程度 2 一幅8灰度级图像具有如下所示的直方图,求直方图均衡后的灰度级和对应概率,…

深港澳大湾区(深圳).NET技术交流会圆满成功

2018年7月7日一场以.NET Core微服务和机器学习为主题的交流会成功在深圳职业技术学院落下帷幕。这次活动在短短的一周时间内,报名人数超过了170人,除了一些同学临时有事,基本都到现场了,特别感谢深职院的软创工作室对这次活动的支…

.Net Core开发日志——Peachpie

.Net Core的生态圈随着开源社区的力量不断注入至其中,正在变得越来越强盛,并且不时得就出现些有意思的项目,比如Peachpie,它使得PHP的代码迁移到.Net Core项目变得可能。从创建简单的入门程序开始可以更容易地体会其特性。首先安装…

.NET Core开发日志——Middleware

熟悉ASP.NET架构的开发者一定对于HTTP Modules与HTTP Handlers不陌生。两者的作用主要是对网络请求执行特定的处理工作。而在.NET Core中,它们都被Middleware(中件间)取代了。之前的Http Modules和HTTP Handlers是如下图般处理请求的:现在变成了这样&…

Identity Server 4 - Hybrid Flow - Claims

前一篇 Identity Server 4 - Hybrid Flow - MVC客户端身份验证: https://www.cnblogs.com/cgzl/p/9253667.htmlClaims我不知道怎么样翻译这个词比较好, 所以我一般就不翻译了.在前一篇文章里, MVC客户端配置身份认证的时候有这么一句话(Startup的ConfigureServices):JwtSecurit…

图像处理作业第7次

图像处理作业第7次 1.请根据课本中Z变换的定义,证明如下结论。 (1)若x(n)x(n)x(n)的ZZZ变换为X(z)X(z)X(z),则(−1)nx(n)(-1)^nx(n)(−1)nx(n)的ZZZ变换为X(−z)X(-z)X(−z) 根据ZZZ变换的定义 X(z)∑x(n)z−n,∑(−1)nx(n)z−n∑x(n)(−z)−nX(−z)X(z…

微软宣布ASP.NET Core 2.0正式支持OData标准

近日,OData 团队在微软开发者博客上宣布,ASP.NET Core 2.0 已正式支持 OData 标准,开发者现在可通过包管理器 NuGet 来获取 Microsoft.AspNetCore.OData 包。此软件包包含在使用 ASP.NET Core MVC 时创建 OData v4.0 端点以及支持 Web API 的…

图像处理作业4

图像处理作业4 1. 第二版课本习题4.21 本质没有区别,只将图片放置在中心,而周围填充0的个数不变时,不会影响结果。因为本质都是进行了周期延拓,使得尾部的信息不会被丢弃掉。相当于滤波前将图像进行了平移。需要注意的是&#x…