cs224d-lecture8-RNN

主要内容:

  • 语言模型 Language model

  • 循环神经网络 recurrent neural network

  • 梯度消失和梯度爆炸问题的原因以及解决方法

  • 双向rnn, deep bi-RNNs

  • 关于依存分析的presentation

语言模型 Language Model

语言模型是计算一系列词以特定序列出现的概率。传统的语言模型是基于频率,计算在前n个词的条件下生成下一个词 $w_i$ 的概率。

$$P(w_1,…,w_m)=\prod_{i=1}^{i=m}P(w_i|w_1,…,w_i-1)\approx\prod_{i=1}^{i=m}P(w_i|w_{i-n},…,w_{i-1})$$

其中:

$$P(w_2|w_1)=\dfrac{count(w_1,w_2)}{count(w_1)}$$

$$P(w_3|w_1,w_2)=\dfrac{count(w_1,w_2,w_3)}{count(w_1,w_2)}$$

但基于概率的语言模型并不能捕捉到一些语义信息。

For instance, consider a case where an article discusses the history of Spain and France and somewhere later in the text, it reads “The two countries went on a battle”; clearly the information presented in this sentence alone is not sufficient to identify the name of the two countries.

于是出现了第一个神经网络的语言模型, learning a distributed representation of words

$$\hat y=softmax(W^{(2)}tanh(w^{(1)}x+b^{(1)})+w^{(3)}x+b^{(3)})$$

  • W^{(1)} 应用于词向量(solid green arrows)

  • W^{(2)} 应用于隐藏层

  • W^{(3)} 应用于词向量(dashed green arrows)

但如果要记忆更多的词,必须要增大windows size n,这会造成计算量太大而无法计算。

循环神经网络 Recurrent Neural Network language model

$$h_t = \sigma(W_{hh}h_{t-1}+W_{hx}x_{|t|})$$

其中+表示concatenate还是直接相加?通过作业实现,是相加~

shapes:

  • $h_0\in R^{D_h}$ is some initialization vector for the hidden layer at time step 0,
  • $x\in R^{d}$ is the column vector for L at index [t] at time step t
  • $W^{hh}\in R^{D_h\times D_h}$
  • $W^{hx}\in R^{D_h\times d}$
  • $W^{(S))}\in R^{|V|\times D_h}$

当前时间步的输出:

$\hat y \in R^{|V|}$ 通过softmax得到的在词表V上的概率分布。

那么当前时间步的损失值:

$$J^{(t)}(\theta) = -\sum_{j=1}^{|V|}y_{t,j}log\hat y_{t,j}$$

$y_{t,j}$ 表示当前时间步的actual word,是 one-hot vector.

在训练模型时,$\hat y_t$ 用来计算当前时间步的损失值,从而训练参数。而在测试集中时,也就是生成sentence时,用来作为下一个时间步的输入。

那么对整个sentence的预测的损失值:

$$J=\dfrac{1}{T}\sum_{t=1}^T(\theta)=-\dfrac{1}{T}\sum_{t=1}^T\sum_{j=1}^{|V|}y_{t,j}\times log(\hat y_{t,j})$$

困惑度:

$$Perplexity=2^J$$

梯度消失和梯度爆炸问题

Training RNNs is incredibly hard! Buz of gradient vanishing and explosion problems.

这篇文章对rnn中梯度消失的问题说的比较清楚,RNN梯度消失和爆炸的原因

这里将rnn简化了,原本应该是:

$$h_t=\sigma (Wf(h_{t-1})+W^{(hx)}x_{|t|})$$

$$\hat y = softmax(W^{(S)}f(h_t))$$

这里就按照简化的来推导吧,t时间步的损失值对

$$\dfrac{\partial E_t}{\partial W} = \sum_{k=1}^t\dfrac{\partial E_t}{\partial y_t}\dfrac{\partial y_t}{\partial h_t}\dfrac{\partial h_t}{\partial h_k}\dfrac{\partial h_k}{\partial W}$$

其实主要是这个式子的问题 $\dfrac{\partial h_t}{\partial h_k}$, $h_t$ 是W 和 $h_t-1$ 的函数, $h_{t-1}$ 又是 W 和 $h_{t-2}$ 的函数…..

也就是说 $h_t$ 是之前所有时刻 $h_k$ 的函数,而 $h_k$ 也是权重 W 的函数

$$\dfrac{\partial h_t}{\partial h_k} = \prod_{j=k+1}^k\dfrac{\partial h_j}{\partial h_{j-1}}=\prod_{j=k+1}^tW^T\times diag[f’(j_{j-1})]$$

其中 $h\in R^{D_h}$, 因此其导数 $\partial h_j/\partial h_{j-1}$ 是一个 $D_h \times D_h$ 的雅克比矩阵。

所以有:

$$\dfrac{\partial E_t}{\partial W} = \sum_{k=1}^t\dfrac{\partial E_t}{\partial y_t}\dfrac{\partial y_t}{\partial h_t}(\prod_{j=k+1}^t\dfrac{\partial h_j}{\partial h_{j-1}})\dfrac{\partial h_k}{\partial W}$$

定义 $\beta$ 为范式的下界,那么 $||\dfrac{\partial h_j}{\partial h_{j-1}}||$ 很容易变得很小或很大。

解决梯度爆炸或消失的一些tricks

梯度裁剪 gradient clipping

对于gradient exploding,有个很简单的trick:gradient clipping

可以动手实践下,也许对梯度会有更深的理解~

  • 实线Solid lines表示 standard gradient descent trajectories

  • 虚线Dashed lines表示 gradients rescaled to fixed size

将error看作是很多维参数空间的函数,如果是二维的话,那error surface就是一个曲面。在曲面上高曲率的地方(high curvature walls),其梯度也就很大。

详细的还是看文献吧On the difficulty of training Recurrent Neural Networks, Pascanu

对于梯度消失 vanishing gradients

  • 参数初始化 Initialization

  • relus, Rectified Relus

很难理解为啥用relu能很好的解决梯度消失的问题,的确relu的梯度为1,但它的非线性也太简单了吧。。。所以得看看原论文 A Simple Way to Initialize Recurrent Networks of Rectified Linear Units

softmax计算量太大的问题

对于每个时间步,从隐藏层到输出 $W^{(S)} \in R^{D_h, V}$ ,如果词表很大的话,这个矩阵也就很大了~

序列模型的一些其他任务

Classify each word into:

双向 RNNs

其实跟rnn没有太多变化,有两个隐藏层,并且隐藏层的递归分别是从语料库的两个不同的方向。

Deep bidirectional RNNs

$$\overrightarrow {h_t^{(i)}}=f(\overrightarrow{W^{(i)}}h_t^{(i-1)}+\overrightarrow{V^{(i)}}h_{t-1}^{(i)}+\overrightarrow{b^{(i)}})$$

其中 $h_t^{(i-1)}$ 表示上一层隐藏层的输入, $h_{t-1}^{(i)}$ 表示当前隐藏层层的上一个时间步的输入。

$$\overleftarrow {h_t^{(i)}}=f(\overleftarrow{W^{(i)}}h_t^{(i-1)}+\overleftarrow{V^{(i)}}h_{t-1}^{(i)}+\overleftarrow{b^{(i)}})$$

需要训练的参数有:$\overrightarrow{W^{(i)}},\overleftarrow{W^{(i)}}$ $\overrightarrow{V^{(i)}},\overleftarrow{V^{(i)}}$

$$\hat y_t=g(Uh_t+c)=g(U[\overrightarrow{h_t^{(L)}};\overleftarrow{h_t^{(L)}}]+c)$$

data evalution

Presentation

Structured Training for Neural Network Transition-Based Parsing, David Weiss, Chris Alberti, Michael Collins, Slav Petrov

表示根本听不懂,只知道使用deeplearning做依存分析。。用state-of-art的SyntaxNet和前人几篇有影响力的进行了对比~

作者

Xie Pan

发布于

2018-05-04

更新于

2021-06-29

许可协议

评论