本周作业分为三部分:
来构建一个RNN的神经网络。
先来进行前向传播的构建,要构建这个网络,先构建每个RNN的传播单元:
RNN cell
softmax
.We will vectorize over $m$ examples. Thus, $x^{\langle t \rangle}$ will have dimension $(n_x,m)$, and $a^{\langle t \rangle}$ will have dimension $(n_a,m)$.
1 | # GRADED FUNCTION: rnn_cell_forward |
RNN forward pass
思路是:
1 | # GRADED FUNCTION: rnn_forward |
接下来构建一个LSTM的网络
遗忘门:
假设我们正在阅读一段文字中的单词,并且希望使用LSTM来跟踪语法结构,例如主语是单数还是复数。 如果主语从单个单词变成复数单词,我们需要找到一种方法来摆脱先前存储的单数/复数状态的记忆值。
在LSTM中,遗忘门让我们做到这一点:
$$\Gamma_f^{\langle t \rangle} = \sigma(W_f[a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_f)$$
更新门:
一旦我们忘记所讨论的主题是单数的,我们需要找到一种方法来更新它,以反映新主题现在是复数。
$$\Gamma_u^{\langle t \rangle} = \sigma(W_u[a^{\langle t-1 \rangle}, x^] + b_u)$$
所以两个门结合起来可以更新单元值:
$$ \tilde{c}^{\langle t \rangle} = \tanh(W_c[a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_c) $$
$$ c^{<t>} = \Gamma_f^{<t>} c^{<t-1>} + \Gamma_u ^{<t>} \tilde {c}^{<t>} $$
输出门:
为了决定输出,我们将使用以下两个公式:
$$ \Gamma_o^{\langle t \rangle}= \sigma(W_o[a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_o)$$
$$ a^{\langle t \rangle} = \Gamma_o^{\langle t \rangle}* \tanh(c^{\langle t \rangle}) $$
LSTM 单元
1 | # GRADED FUNCTION: lstm_cell_forward |
Forward pass for LSTM
1 | # GRADED FUNCTION: lstm_forward |
接下来是RNN的反向传播,但是一般框架都会帮我们实现,这里看看就好了。公式也比较复杂。
RNN backward pass
1 | def rnn_cell_backward(da_next, cache): |
1 | def rnn_backward(da, caches): |
LSTM backward pass
1 | def lstm_cell_backward(da_next, dc_next, cache): |
1 | def lstm_backward(da, caches): |