# Natural Language Processing Lecture07

## Recurrent Neural Networks

### Why sequence models

• 在序列模型中，输入、输出随着不同的序列有所改变，无法确定输入、输出层的神经元个数
• 并没有考虑序列模型中，各个特征之间的关系

• Inputs, outputs can be different lengths in different examples
• Doesn't share features leanrd across positions of test

### RNN

$a^{(1)}=g(W_{aa}a^{(0)}+W_x^{(1)}+ba) \\ y^{(1)}=g(w_{ya}a^{(1)}+by)$

$a^{(2)}=g(W_{aa}a^{(1)}+W_x^{(2)}+ba) \\ y^{(2)}=g(w_{ya}a^{(2)}+by)$

$a^{(t)}=b+Wh^{(t-1)}+Ux^{(t)} \\ h^{(t)}=tanh(a^{(t)})\\ o^{(t)}=c+Vh^{(t)}\\ \hat{y}^{(t)}=softmax(o^{(t)}) \\ L_{total} = \sum_tL^{(t)}=-\sum_t log p _{model}(y^{(t)}|{\{x^{(1)},\dots,x^{(t)}}\})$

$a^{(t)}=g(W_{aa}a^{(t-1)}+W_x^{(t)}+ba) \\ y^{(t)}=g(w_{ya}a^{(t)}+by)$

$a^{(t)}=W_{aa}a^{(t-1)}+W_x^{(t)}+ba \\ y^{(t)}=w_{ya}a^{(t)}+by$

$L=-y^{(t)}log \hat{y}^{(t)}-(1-y^{(t)})log(1-\hat y^{(t)})$

\begin{aligned} \frac{\partial L^{(t)}}{\partial W_{ax}} &= \frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial W_{ax}} = \frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial a^{(t)}} \cdot \frac{\partial a^{(t)}}{\partial W_{ax}} \\ &= \frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial a^{(t)}} \cdot( \frac{\partial a^{(t)}}{\partial a^{(t-1)}} \cdot \frac{\partial a^{(t-1)}}{\partial W_{ax}}+ x^{(t)}) \\ &= \frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial a^{(t)}} \cdot \frac{\partial a^{(t)}}{\partial a^{(t-1)}} \cdot \frac{\partial a^{(t-1)}}{\partial W_{ax}}+ \frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial a^{(t)}} \cdot x^{(t)} \\ &= \frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial a^{(t)}} \cdot \frac{\partial a^{(t)}}{\partial a^{(t-1)}} \cdot( \frac{\partial a^{(t-1)}}{\partial a^{(t-2)}} \cdot \frac{\partial a^{(t-2)}}{\partial W_{ax}} + x^{(t-1)} ) +右边 \end{aligned}

$\frac{\partial L^{(t)}}{\partial y^{(t)}} \cdot \frac{\partial y^{(t)}}{\partial a^{(t)}} \cdot x^{(t)}$ 就是从时序 t 到时序 1 的长距离联系，从 $L^{(t)}$传到 T=t 这个时间点对 $W_{ax}$ 的梯度，这个值不影响从 $L^{(t)}$传到 $T=1,2,\dots,t-1$ 的梯度

 则是相邻时序的距离联系

### Bidirectional RNN and Deep RNN

#### Bidirectional RNN

BRNN的idea是将传统RNN的状态神经元拆分为两个部分，一个负责positive time direction(forward states)，另一个负责negative time direction(backward states)。Forward states的输出并不会连接到Backward states的输入。因此结构如下所示。如果没有backward layer的话就跟传统RNN相同了。

## Some RNN Variations

### LSTM

LSTM 内部主要有三个阶段：

• 忘记阶段。这个阶段主要是对上一个节点传进来的输入进行选择性忘记。简单来说就是会 “忘记不重要的，记住重要的”。 通过计算 $z^{forget}$ 来作为忘记门控，来控制上一个状态的 $c^{t-1}$ 哪些需要留那些需要忘。
• 选择记忆阶段。这个阶段将这个阶段的输入有选择性地进行“记忆”。主要是会对输入 $x^t$ 进行选择记忆。哪些重要则着重记录下来，哪些不重要，则少记一些。当前的输入内容由前面计算得到的 z 表示。而选择的门控信号则是由 $z^i$ 来进行控制。
• 输出阶段。这个阶段将决定哪些将会被当成当前状态的输出。主要是通过 $z^o$ 来进行控制的。并且还对上一阶段得到的 $c^o$ 进行了缩放。

### Gated Recurrent Unit (GRU)

GRU（Gate Recurrent Unit）是循环神经网络（Recurrent Neural Network, RNN）的一种。和LSTM（Long-Short Term Memory）一样，也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。

GRU 的实验效果与 LSTM 相似，但是更易于计算。

$x^t$ 是当前的输入，上一个节点传递下来的隐状态 $h^{t-1}$，这个隐状态包含了之前节点的相关信息，输出当前隐藏节点的输出 $y^t$ 和传递给下一个节点的隐状态 $h^t$

GRU 的内部结构如下：

• $z\odot h^{t-1}$ 表示对原本隐藏状态的遗忘
• $(1-z)\odot h'$ 表示对当前结点信息的选择性记忆
• 则更新表达式就是忘记传递下来的某些维度信息，记忆当前节点输入的某些维度信息

## Transfer Learning

### An example of transfer learning in NLP

word embedding 可以看作是迁移学习的 part1.

# NLP