Skip to content

Latest commit

 

History

History
248 lines (189 loc) · 17.7 KB

File metadata and controls

248 lines (189 loc) · 17.7 KB

矩阵形式的循环神经网络

矩阵形式的循环神经网络的模型图和符号定义

模型图

符号表A

符号 意义
$m$ 样本个数。
$k$ 样本标签向量的维度。
$d^l$ 神经网络第 l 层神经元的个数。
$\sigma(·)$ 是某一种常用的激活函数。比如 sigmoid、tanh 和 ReLu 函数等。
$\rho(·)$ 神经网络输出层的变换函数。比如 logistic 和 Softmax 函数等。
$\Omega(·)$ 循环神经网络不同时间步同一层节点梯度距离函数。
$\Psi(·)$ 循环神经网络同一时间步相邻层节点梯度距离函数。
$C$ 代价函数。
$Loss$ 损失函数,意义同 $C$
$sum(·)$ 求和函数。可以根据矩阵行或列求和,比如 $sum(D, axis=0)$ 就是按照矩阵 $D$ 的行求和。
$where(·)$ 条件函数。可以根据矩阵元素满足的条件操作,比如 ${Y}=where(A>=0.5, 1, 0)$ 就是若矩阵 $A$ 中元素 $a_{ij}$ 大于等于 0.5 则 $Y$ 矩阵中对应位置元素 $y_{ij}$ 的值取 1 否则取 0。
$*$ 按矩阵元素乘积。比如 $A * B$
$\odot$ 按矩阵元素乘积。比如 $A \odot B$

符号表B

符号 向量形式 维度 意义
$x$ $[x_0,x_1,...,x_n]^T$ $(n, 1)$ $x$ 表示一个有 $n$ 维特征样本实例, $x_i$ 表示向量的第 $i$ 维特征。
$w_{jk}^{l}$ 标量 $(1, 1)$ 是从 $l-1$ 层的第 $k$ 个神经元到 $l$ 层的第 $j$ 个神经元的权重。
$s_{jk}^{l}$ 标量 $(1, 1)$ 是第 $l$ 层的记忆向量的第 $k$ 个元素到 $l$ 层的第 $j$ 个神经元的权重。
$b_j^l$ 标量 $(1, 1)$ 是第 $l$ 层的第 $j$ 个神经元的偏置。
$z_j^l$ 标量 $(1, 1)$ 是第 $l$ 层的第 $j$ 个神经元的带权输入。
$a_j^l$ 标量 $(1, 1)$ 是第 $l$ 层的第 $j$ 个神经元的激活值。
$y_j$ 标量 $(1, 1)$ 样本标签向量的第 $j$ 个值。
$\hat y_j$ 标量 $(1, 1)$ 模型预测的样本标签向量的第 $j$ 个值。
$\delta_j^l$ 标量 $(1, 1)$ 是第 $l$ 层的第 $j$ 个神经元的误差值。
$z^l$ $[z_0,z_1,...,z_{d^l}]^T$ $(d^l, 1)$ 表示第第 $l$ 层的带权输入。第 $j$ 个元素是 $z_j^l$
$a^{l}$ $[a_0,a_1,...,a_{d^l}]^T$ $(d^l, 1)$ 是激活向量。第 $j$ 行的元素是 $a_j^l$
$b^l$ $[b_0,b_1,...,b_{d^l}]^T$ $(d^l, 1)$ 偏置向量,第 $j$ 行的元素是 $b_j^l$
$h^l$ $[h_0,h_1,...,h_{d^l}]^T$ $(d^l, 1)$ 记忆向量,第 $j$ 行的元素是 $h_j^l$
$W^{l}$ $\left[\begin{matrix} w_{i1}^l & w_{i2}^l &···& w_{ik}^l & \ \w_{j1}^l & w_{j2}^l &···& w_{jk}^l\end{matrix} \right]$ $(d^l, d^{l-1})$ 权重矩阵,第 $j$$k$ 列的元素是 $w_{jk}^{l}$
$S^{l}$ $\left[\begin{matrix} s_{i1}^l &···& s_{ik}^l & \ \s_{k1}^l &···& s_{kk}^l\end{matrix} \right]$ $(d^l, d^{l})$ 记忆向量的权重方阵,第 $j$$k$ 列的元素是 $s_{jk}^{l}$
$\delta^l$ $[\delta_0,\delta_1,...,\delta_{d^l}]^T$ $(d^l, 1)$ 是误差向量,$\delta^l$ 的第 $j$ 个元素是 $\delta_j^l$
$z^{v,l}$ $[z_0,z_1,...,z_{d^l}]^T$ $(d^l, 1)$ 表示神经网络第 $l$ 层的小批量样本中的第 $v$ 个样本的带权输入向量。
$a^{v,l}$ $[a_0,a_1,...,a_{d^l}]^T$ $(d^l, 1)$ 表示神经网络第 $l$ 层的小批量样本中的第 $v$ 个样本的激活向量。
$\delta^{v,l}$ $[\delta_0,\delta_1,...,\delta_{d^l}]^T$ $(d^l, 1)$ 表示神经网络第 $l$ 层的小批量样本中的第 $v$ 个样本的误差。
$y$ $[y_0,y_1,...,y_{k}]^T$ $(k, 1)$ 标签向量,第 $j$ 个值是 $y_j$
$\hat y$ $[\hat y_0,\hat y_1,...,\hat y_{k}]^T$ $(k, 1)$ 模型预测的标签向量,第 $j$ 个值是 $\hat y_j$
$X$ $[{(x^{(1)})}^T,{(x^{(2)})}^T,...,{(x^{(m)})}^T]^T$ $(m, n)$ 样本矩阵,第 $i$ 行是第 $i$ 个样本向量 $x^{(i)}$ 的转置。
$Y$ $[{(y^{(1)})}^T,{(y^{(2)})}^T,...,{(y^{(m)})}^T]^T$ $(m, k)$ 标签矩阵,第 $i$ 行是第 $i$ 个标签向量 $y^{(i)}$ 的转置。
$\hat Y$ $[{(\hat y^{(1)})}^T,{(\hat y^{(2)})}^T,...,{(\hat y^{(m)})}^T]^T$ $(m, k)$ 模型预测的标签矩阵,第 $i$ 行是第 $i$ 个标签向量 $\hat y^{(i)}$ 的转置。
$Z^l$ $[{(z^{1,l})}^T,{(z^{2,l})}^T,...,{(z^{m,l})}^T]^T$ $(m, d^l)$ 带权输入矩阵,第 $v$ 行是第 $v$ 个样本在第 $l$ 层的带权输入向量 $z^{v,l}$ 的转置。
$A^l$ $[{(a^{1,l})}^T,{(a^{2,l})}^T,...,{(a^{m,l})}^T]^T$ $(m, d^l)$ 激活矩阵,第 $v$ 行是第 $v$ 个样本在第 $l$ 层的激活向量 $a^{v,l}$ 的转置。
$\Delta^l$ $[{(\delta^{1,l})}^T,{(\delta^{2,l})}^T,...,{(\delta^{m,l})}^T]^T$ $(m, d^l)$ 误差矩阵,第 $v$ 行是第 $v$ 个样本在第 $l$ 层的误差向量 $\delta^{v,l}$ 的转置。

前向传播算法的基本公式

计算公式 是否含记忆向量 维度变化
$a^0=x$ $(n, 1) = (n, 1)$
$z^l = W^l a^{l-1}+b^l$ $({d}^l, 1) =({d}^{l}, {d}^{l-1}) (d^{l-1}, 1) + (d^l, 1)$
$z^l = W^l a^{l-1}+S^lh^l+b^l$ $({d}^l, 1) =({d}^{l}, {d}^{l-1}) (d^{l-1}, 1) + (d^{l}, d^{l})(d^l,1) + (d^l, 1)$
$a^{l} =\sigma{(z^{l})}$ $(d^l, 1) = (d^l, 1)$
$h^l=a^l$ $(d^l, 1) = (d^l, 1)$
$a^{L} =\varphi(z^{L})$ $(?, 1) \leftarrow (d^L, 1)$
$\hat{y}=\rho(a^L)$ $(?, 1) \leftarrow (?, 1)$

前馈神经网络可以通过逐层信息传递,得到网络最后的输出 $a^L$。整个网络可以看做一个复合函数 $\varphi(x;W,b)$,将向量 $x$ 作为第一层的输入 $a^1$,将第 $L$ 层的输出 $a^L$ 作为整个函数的输出。

$$x = a^0 \rightarrow z^1 \rightarrow a^1 \rightarrow ··· \rightarrow a^{L-1} \rightarrow z^L \rightarrow a^L=\varphi(x;W,b)$$

其中 $W, b$ 表示网络中连接样本特征向量的权重矩阵和偏置。

而循环网络增加了记忆向量 $h$,信息不仅从低层向高层传递,含有记忆向量的层的信息也会在同一层“传递”。

矩阵形式前向传播算法的计算公式

计算公式 维度变化
$A^1_{t=i}=X_{t=i}$ $(m, n) = (m, n)$
$Z^l_{t=i}=A^{l-1}_{t=i}{(W^{l})}^T + {(b^l)}^T$ $(m, {d}^l) = (m, {d}^{l-1}) {({d}^{l}, {d}^{l-1})}^T + {(d^{l},1)}^T$
$Z^l_{t=i}=A^{l-1}{t=i}{(W^{l})}^T + H^l{t=i-1}({S^l})^T + {(b^l)}^T$ $(m, {d}^l) = (m, {d}^{l-1}) {({d}^{l}, {d}^{l-1})}^T + (m, {d}^{l}) {({d}^{l}, {d}^{l})}^T + {(d^{l},1)}^T$
$A^l_{t=i}=\sigma(Z^l_{t=i})$ $(m, d^l) = (m, d^l)$
$H^l_{t=i}=A^l_{t=i}$ $(m, d^l) = (m, d^l)$
$A^L_{t=i}=\varphi(Z^L_{t=i})$ $(m, ?) \leftarrow (m, d^L)$
$\hat{Y_{t=i}}=\rho(A^L_{t=i})$ $(m, ?) \leftarrow (m, ?)$

矩阵形式前向传播算法的计算公式不过是把原来的向量 $x$ 装进了矩阵 $X$ 当中,网络最终的输出变成了 $A^L$。整个网络仍然可以看做一个复合函数 $\varphi(X;W,b)$

$$X = A^1 \rightarrow Z^2 \rightarrow A^2 \rightarrow ··· \rightarrow A^{L-1} \rightarrow Z^L \rightarrow A^L=\varphi(X;W,b)$$

其中 $W, b$ 表示网络中连接样本特征向量的权重矩阵和偏置。

而循环网络增加了记忆矩阵 $H$,信息不仅从低层向高层传递,含有记忆向量的层的信息也会在同一层“传递”。

注意,循环神经网络并不是完全循环的,很多计算是可以并行计算的,只有不同时间步的计算产生依赖时才需要采用串行计算。上面前向算法中,需要串行的的地方是

$$Z^l_{t=i}=A^{l-1}{t=i}{(W^{l})}^T + H^l{t=i-1}({S^l})^T + {(b^l)}^T; A^l_{t=i}=\sigma(Z^l_{t=i}); H^l_{t=i}=A^l_{t=i}$$

因为这里的 $H_i$ 需要一步一步的来计算,下一步的值依赖上一步的计算结果。

矩阵形式反向传播算法的六大计算公式

|计算公式|维度变换| |-|-|-| |$\Delta_{t=i}^L = A^L_{t=i} - Y_{t=i}$|$(m , d^L) = (m , d^L) - (m , d^L)$| |$\Delta^{l}{t=T}=\Delta^{(l+1)}{t=T}W^{(l+1)} \odot \sigma'(Z^{(l)}{t=T}) $|$(m, d^{l})=(m, d^{l+1})(d^{l+1}, d^{l}) * (m, d^{l})$| |$\Delta^{l}{t=T-i}=\Delta^{(l+1)}{t=T-i}W^{(l+1)} \odot \sigma'(Z^{(l)}{t=T-i}) + \sum_{j=0}^{i-1} \left{ \Delta^{(l)}{t=T-j}[(S^{(l)})^T]^{i-j} \prod{k=T-i}^{T-j-1}\sigma'(Z^{(l)}{t=k}) \right}$|$(m, d^{l})=(m, d^{l+1})(d^{l+1}, d^{l}) * (m, d^{l}) + (m, d^l)(d^l, d^l)^{i-j} * (m, d^l)^{i-j}$| |$\dfrac{\partial C}{\partial b^{l}} =\dfrac{1}{m}[{\sum{t=i}^T \Delta_{t=i}^{(l)}}]^T $|$(d^l, 1) = {(1, d^l)}^T$| |$\dfrac{\partial C}{\partial W^{l}} = \dfrac{1}{m} \sum_{t=i}^T [\Delta {t}^{(l)}]^T A_t^{(l-1)}$|$(d^l, d^{(l-1)}) = {(m, d^l)}^T (m, d^{l-1})$| |$\dfrac{\partial C}{\partial S^{l}} = \dfrac{1}{m} \sum{t=i}^T [\Delta_{t}^{(l)}]^T H_t^{(l)}$|$(d^l, d^{(l-1)}) = {(m, d^l)}^T (m, d^{l-1})$|

对于梯度的递推计算式子,有几点需要说明,

$$\Delta^{l}{t=T-i}=\Delta^{(l+1)}{t=T-i}W^{(l+1)} \odot \sigma'(Z^{(l)}{t=T-i}) + \sum{j=0}^{i-1} \left{ \Delta^{(l)}{t=T-j}[(S^{(l)})^T]^{i-j} \prod{k=T-i}^{T-j-1}\sigma'(Z^{(l)}_{t=k}) \right}$$

$[S^{(l)}]^{i-j}$ 表示 $i-j$ 次方个 $S^{(l)}$,$\prod$ 使用的是 $\odot$ 连乘,即矩阵对应位置元素相乘。

为了简化上面的式子,同时为了看清计算式的本质,也是后面使用动态规划方法求解梯度递推计算式子的基础。

定义循环神经网络不同时间步同一层节点梯度距离函数,

$$\Omega(Z_{t_j}^{(l)}, Z_{t_i}^{(l)})=\dfrac{\partial Z_{t_j}^{(l)}}{\partial Z_{t_i}^{(l)}}=\prod_{t=t_i}^{t_{j}-1}(S^T)^{(l)} \odot \sigma'(Z_{t}^{(l)}) $$

定义循环神经网络同一时间步相邻层节点梯度距离函数,

$$\Psi(Z_{t_i}^{(l+1)}, Z_{t_i}^{(l)})=\dfrac{\partial Z_{t_i}^{(l+1)}}{\partial Z_{t_i}^{(l)}}=W^{(l+1)} \odot \sigma'(Z^{(l)}_{t_i})$$

梯度的递推计算式子就可以简化为,

$$\Delta^{(l)}{t=T-i}=\Delta^{(l+1)}{t=T-i}\Psi(Z_{t=T-i}^{(l+1)}, Z_{t=T-i}^{(l)}) + \sum_{j=0}^{i-1} \Delta^{(l)}{t=T-j}\Omega(Z{T-j}^{(l)}, Z_{T-i}^{(l)}) $$

该式子的意义就是,循环神经网络 $l$ 层时刻 $t$ 的反向传播的误差 $\Delta^{(l)}{t=T-i}$ 来自同一时刻上一层的误差 $\Delta^{(l+1)}{t=T-i}$ 和该时刻之后沿时间反向传播的误差和 $\sum_{j=0}^{i-1} \Delta^{(l)}_{t=T-j}$, 当然这些误差传递过程中会有一些“损耗”也就是要乘上对应的距离函数。

下面给出矩阵形式反向传播算法的六大计算公式,

|计算公式|维度变换| |-|-|-| |$\Delta_{t=i}^L = A^L_{t=i} - Y_{t=i}$|$(m , d^L) = (m , d^L) - (m , d^L)$| |$\Delta^{l}{t=T}=\Delta^{(l+1)}{t=T}\Psi(Z_{t=T}^{(l+1)}, Z_{t=T}^{(l)})$|$(m, d^{l})=(m, d^{l+1})(d^{l+1}, d^{l}) * (m, d^{l})$| |$\Delta^{(l)}{t=T-i}=\Delta^{(l+1)}{t=T-i}\Psi(Z_{t=T-i}^{(l+1)}, Z_{t=T-i}^{(l)}) + \sum_{j=0}^{i-1} \Delta^{(l)}{t=T-j}\Omega(Z{T-j}^{(l)}, Z_{T-i}^{(l)}) $|$(m, d^{l})=(m, d^{l+1})(d^{l+1}, d^{l}) * (m, d^{l}) + (m, d^l)(d^l, d^l)^{i-j} * (m, d^l)^{i-j}$| |$\dfrac{\partial C}{\partial b^{l}} =\dfrac{1}{m}[{\sum_{t=i}^T \Delta_{t=i}^{(l)}}]^T $|$(d^l, 1) = {(1, d^l)}^T$| |$\dfrac{\partial C}{\partial W^{l}} = \dfrac{1}{m} \sum_{t=i}^T [\Delta {t}^{(l)}]^T A_t^{(l-1)}$|$(d^l, d^{(l-1)}) = {(m, d^l)}^T (m, d^{l-1})$| |$\dfrac{\partial C}{\partial S^{l}} = \dfrac{1}{m} \sum{t=i}^T [\Delta_{t}^{(l)}]^T H_t^{(l)}$|$(d^l, d^{(l-1)}) = {(m, d^l)}^T (m, d^{l-1})$|

循环神经网络梯度下降算法要义

用下面这幅图来说明循环神经网络梯度计算的要义,

计算损失函数对最后一个时间步 $h_3$ 的梯度很简单,因为 $h_3$ 指通过 $o_3$ 影响损失函数,所以 $\dfrac{\partial L}{\partial h_3} = \dfrac{\partial L}{\partial o_3}\dfrac{\partial o_3}{\partial h_3}$

但是计算损失函数对第二个时间步 $h_2$ 的梯度就相对复杂,因为 $h_2$ 不仅仅通过 $o_2$ 影响损失函数,还可以通过 $h_3$ 来影响损失函数,所以 $\dfrac{\partial L}{\partial h_2} = \dfrac{\partial L}{\partial o_2}\dfrac{\partial o_2}{\partial h_2} + \dfrac{\partial L}{\partial h_3}\dfrac{\partial h_3}{\partial h_3}$

同理,损失函数对第一个时间步 $h_1$ 的梯度就是, $\dfrac{\partial L}{\partial h_1} = \dfrac{\partial L}{\partial o_1}\dfrac{\partial o_1}{\partial h_1} + \dfrac{\partial L}{\partial h_2}\dfrac{\partial h_2}{\partial h_1} + \dfrac{\partial L}{\partial h_3}\dfrac{\partial h_3}{\partial h_2}\dfrac{\partial h_2}{\partial h_1}$

上面矩阵形式反向传播算法的六大计算公式也给出了计算梯度的递推公式,

$$\Delta^{(l)}{t=T-i}=\Delta^{(l+1)}{t=T-i}\Psi(Z_{t=T-i}^{(l+1)}, Z_{t=T-i}^{(l)}) + \sum_{j=0}^{i-1} \Delta^{(l)}{t=T-j}\Omega(Z{T-j}^{(l)}, Z_{T-i}^{(l)}) $$

有读者可能会想这个递推公式很有规律,能不能推导出这个递推公式对应的通项公式,答案是肯定的。但是是没有必要的,就如同在前馈神经网络中可以用反向传播算法推出任何一个权重矩阵的计算公式,但我们还是选择了逐层传递误差来计算。主要是我们可以把递推的计算结果存起来,在下一次计算时就可以重复利用已经计算出的结果,大大减少了计算量。再者递推公式是简洁而优美的!

以上图为例,上面递推式子带入值后,优美的计算式子如下,

$$\Delta^3_{t=1}= \Delta^4_{t=1}W^{(4)} \odot \sigma'(Z^{(3)}{t=1})+ \Delta^3{t=2}S\odot\sigma'(Z_{t=1}) + \Delta^3_{t=3}SS\odot\sigma'(Z_{t=2})\odot\sigma'(Z_{t=1})$$

第一项 $ \Delta^4_{t=1}W^{(4)} \odot \sigma'(Z^{(3)}_{t=1})$ 来自上一层的误差传递,后面两项就是来自同一层的误差传递。

一个循环神经网络的计算例子

针对该例子的符号说明如下:

符号 维度 意义
$X$ $(s=3, m=10, v=2)$ 样本矩阵, $s$ 表示时间步数, $m$ 表示小批量样本数 $v$ 表示样本特征向量长度。
$X_{t = i}$ $(m=10, v=2)$ $i$ 个时间步的样本矩阵,$m$ 表示小批量样本数 $v$ 表示样本特征向量长度。
$W^1$ $(4, 3)$ 第一层的权重矩阵
$W^2$ $(5, 4)$ 第二层的权重矩阵
$W^3$ $(4, 5)$ 第三层的权重矩阵
$W^4$ $(3, 4)$ 第四层的权重矩阵
$S^3$ $(4, 4)$ 第三层的记忆向量权重方阵
$b^1$ $(4, 1)$ 第一层的偏置矩阵
$b^2$ $(5, 1)$ 第二层的偏置矩阵
$b^3$ $(4, 1)$ 第三层的偏置矩阵
$b^4$ $(3, 1)$ 第四层的偏置矩阵
$Z^1$ $(m, 4)$ 第二层的带权输入矩阵
$Z^2$ $(m, 5)$ 第二层的带权输入矩阵
$Z^3$ $(m, 4)$ 第三层的带权输入矩阵
$Z^4$ $(m, 3)$ 第三层的带权输入矩阵
$A^1$ $(m, 4)$ 第二层的激活矩阵
$A^2$ $(m, 5)$ 第二层的激活矩阵
$A^3$ $(m, 4)$ 第三层的激活矩阵
$A^4$ $(m, 3)$ 第三层的激活矩阵
$\hat Y$ $(m, 3)$ 输出矩阵

前向传播过程

计算公式 维度变化
$H^3_{t=0} = \mathbf 0$ $(m, 4) = (m, 4)$
$A^0_{t=i} = X_{t = i}$ $(m, 3) = (m, 3)$
$Z^1_{t=i}=A^0_{t=i}{(W^1)}^T + {(b^1)}^T$ $(m, 4) = (m, 3) {(4, 3)}^T + {(4, 1)}^T$
$A^1_{t=i}=\sigma(Z^1_{t=i})$ $(m, 4) = (m, 4)$
$Z^2_{t=i}=A^1_{t=i}{(W^2)}^T + {(b^2)}^T$ $(m, 5) = (m, 4) {(5, 4)}^T + {(5, 1)}^T$
$A^2_{t=i}=sigmoid(Z^2_{t=i})$ $(m, 5) = (m, 5)$
$Z^3_{t=1}=A^2{(W^3)}^T + H_{t=0}^3(S^3)^T + {(b^3)}^T$ $(m, 4) = (m, 5) {(4, 5)}^T + (m, 4)(4, 4)^T + {(4, 1)}^T$
$Z^3_{t=2}=A^2{(W^3)}^T + H_{t=1}^3(S^3)^T + {(b^3)}^T$ $(m, 4) = (m, 5) {(4, 5)}^T + (m, 4)(4, 4)^T + {(4, 1)}^T$
$Z^3_{t=3}=A^2{(W^3)}^T + H_{t=2}^3(S^3)^T + {(b^3)}^T$ $(m, 4) = (m, 5) {(4, 5)}^T + (m, 4)(4, 4)^T + {(4, 1)}^T$
$A_{t=i}^3=sigmoid(Z_{t=i}^3)$ $(m, 4) = (m, 4)$
$H_{t=i}^3 = A_{t=i}^3$ $(m, 4) = (m, 4)$
$Z^4_{t=i}=A^3_{t=i}{(W^4)}^T + {(b^4)}^T$ $(m, 3) = (m, 4) {(3, 4)}^T + {(3, 1)}^T$
$A^4_{t=i}=softmax(Z^4_{t=i})$ $(m, 3) = (m, 3)$
$\hat Y_{t=i}=A_{t=i}^4$ $(m, 3) = (m, 3)$

反向传播过程

计算公式 维度变化
$\Delta^4_{t=i}=A^4_{t=i}-Y_{t=i}$ $(m, 3) = (m, 3) - (m, 3)$
$\dfrac{\partial C}{\partial b^{4}} =\dfrac{1}{m} {(sum(\Delta^4_{t=i}, axis=0))}^T $ $(4, 1) = {(1, 4)}^T$
$\dfrac{\partial C}{\partial W^{4}} =\dfrac{1}{m}{(\Delta^4_{t=i})}^TA^{3}_{t=i} $ $(3, 4) = {(m, 3)}^T (m, 4)$
$\Delta^3_{t=3}=\Delta^4_{t=3}W^{(4)} \odot \sigma'(Z^{(3)}_{t=3}) $ $(m, 4)=(m, 3)(3,4)(4, 4) * (m, 4)$
$\Delta^3_{t=2}=\Delta^4_{t=2}W^{(4)} \odot \sigma'(Z^{(3)}{t=2}) + \Delta^3{t=3}S^T\odot\sigma'(Z_{t=2}^{(3)}) $ $(m, 4)=(m, 3)(3, 4) * (m, 4) + (m, 4) * (m, 4)$
$\Delta^3_{t=1}= \Delta^4_{t=1}W^{(4)} \odot \sigma'(Z^{(3)}{t=1})+ \Delta^3{t=2}S^T\odot\sigma'(Z_{t=1}^{(3)}) + \Delta^3_{t=3}S^TS^T\odot\sigma'(Z_{t=2}^{(3)})\odot\sigma'(Z_{t=1}^{(3)})$ $(m, 4)=(m, 3)(3, 4) * (m, 4) + (m, 4)(4, 4) * (m, 4) + (m, 4)(4, 4)(4, 4) * (m, 4) * (m, 4)$
$\dfrac{\partial C}{\partial W^{3}} = \sum_{t=1}^3 [(\Delta _{t})^{(3)}]^T A_t^{(2)}$ $(4, 5)=(m, 4)^T(m, 5)$
$\dfrac{\partial C}{\partial S^{3}} = \sum_{t=1}^3 [(\Delta _{t})^{(3)}]^T H_t^{(3)}$ $(4, 4)=(m, 4)^T(m, 4)$
$\dfrac{\partial C}{\partial b^{3}} = [\Delta^{(3)}]^T, axis=0$ $(4, 1)=(m, 4)^T$
$\Delta^2_{t=3}=\Delta^3_{t=3}W^{(3)} \odot \sigma'(Z^{(2)}_{t=3}) $ $(m, 5)=(m, 4)(4, 5) * (m, 5)$
$\Delta^2_{t=2}=\Delta^3_{t=2}W^{(3)} \odot \sigma'(Z^{(2)}_{t=2}) $ $(m, 5)=(m, 4)(4, 5) * (m, 5)$
$\Delta^2_{t=1}=\Delta^3_{t=1}W^{(3)} \odot \sigma'(Z^{(2)}_{t=1}) $ $(m, 5)=(m, 4)(4, 5) * (m, 5)$
$\Delta^2 = \sum_{t=1}^3 [(\Delta _{t})^{(2)}]^T $ $(m, 5)=(m, 5)$
$\dfrac{\partial C}{\partial W^{2}} = \sum_{t=1}^3 [(\Delta _{t})^{(2)}]^T A_t^{(1)}$ $(5, 4)=(m, 5)^T(m, 4)$
$\dfrac{\partial C}{\partial b^{2}} = [\Delta^{(2)}]^T, axis=0$ $(5, 1)=(m, 5)^T$
$\Delta^1_{t=3}=\Delta^2_{t=3}W^{(2)} \odot \sigma'(Z^{(1)}_{t=3}) $ $(m, 4)=(m, 5)(5, 4) * (m, 4)$
$\Delta^1_{t=2}=\Delta^2_{t=2}W^{(2)} \odot \sigma'(Z^{(1)}_{t=2}) $ $(m, 4)=(m, 5)(5, 4) * (m, 4)$
$\Delta^1_{t=1}=\Delta^2_{t=1}W^{(2)} \odot \sigma'(Z^{(1)}_{t=1}) $ $(m, 4)=(m, 5)(5, 4) * (m, 4)$
$\Delta^1 = \sum_{t=1}^3 [(\Delta _{t})^{(1)}]^T $ $(m, 4)=(m, 4)$
$\dfrac{\partial C}{\partial W^{1}} = \sum_{t=1}^3 [(\Delta _{t})^{(1)}]^T A_t^{(0)}$ $(4, 3)=(m, 4)^T(m, 3)$
$\dfrac{\partial C}{\partial b^{1}} = [\Delta^{(1)}]^T, axis=0$ $(4, 1)=(m, 4)^T$