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和前人几篇有影响力的进行了对比~