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:
NER
Entity level sentiment in context
opinion expression extraction Opinion Mining with Deep Recurrent Neural Networks
双向 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
表示根本听不懂,只知道使用deeplearning做依存分析。。用state-of-art的SyntaxNet和前人几篇有影响力的进行了对比~
cs224d-lecture8-RNN