本周作业分为三部分:
- 手动建一个RNN模型
- 搭建一个字符级的语言模型来生成恐龙的名字
- 用LSTM生成爵士乐
Part1:Building a recurrent neural network - step by step
来构建一个RNN的神经网络。
1 - Forward propagation for the basic Recurrent Neural Network
先来进行前向传播的构建,要构建这个网络,先构建每个RNN的传播单元:
RNN cell
- Compute the hidden state with tanh activation: $a^{\langle t \rangle} = \tanh(W_{aa} a^{\langle t-1 \rangle} + W_{ax} x^{\langle t \rangle} + b_a)$
- Using your new hidden state $a^{\langle t \rangle}$, compute the prediction $\hat{y}^{\langle t \rangle} = softmax(W_{ya} a^{\langle t \rangle} + b_y)$. We provided you a function:
softmax
. - Store $(a^{\langle t \rangle}, a^{\langle t-1 \rangle}, x^{\langle t \rangle}, parameters)$ in cache
- Return $a^{\langle t \rangle}$ , $y^{\langle t \rangle}$ and cache
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
思路是:
- 先把 a ,y_pred置为0
- 然后初始化a_next = a0
- 然后经过Tx个循环,求得每一步的a和y以及cache
1 | # GRADED FUNCTION: rnn_forward |
2 - Long Short-Term Memory (LSTM) network
接下来构建一个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 单元
- 先将$a^{\langle t-1 \rangle}$ and $x^{\langle t \rangle}$连接在一起变成$concat = \begin{bmatrix} a^{\langle t-1 \rangle} \ x^{\langle t \rangle} \end{bmatrix}$
- 计算以上的6个公式
- 然后预测输出y
1 | # GRADED FUNCTION: lstm_cell_forward |
Forward pass for LSTM
1 | # GRADED FUNCTION: lstm_forward |
3 - Backpropagation in recurrent neural networks
接下来是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): |