【Stanford CS224N 笔记】lecture 7 Recurrent Neural Network

一、语言模型

1.1 定义

语言模型Language Model,是指预测一个句子(词语有序序列)出现的概率的模型,即p(w_1,...,w_T),一般可用于以下场景:

1. 判断什么词序出现的可能性更高:p(六点吃饭)>p(六点饭吃)

2. 判断在上下文中,什么词汇出现的可能性更高:p(七点下班回家)>p(七点下班回公司)

1.2 n-gram

语言模型一般基于一个错误但有必要的马尔科夫假设:一个单词的出现概率仅取决于前n个单词是什么,即p(w_i|w_{i-1},...,w_1)=p(w_i|w_{i-1},...,w_{i-n+1)})

在足量数据的支撑下,概率可用频率估计:p(w_2|w_1)=\frac{count(w_1,w_2)}{count(w_1)}

当n越大时,模型的表现越好,但相应的,训练模型时所需的资源越多。

2 循环神经网络

2.1 next-word prediction

例:以next-word prediction任务为例,假设有句子x_1,...,x_{t-1},x_t,x_{t+1},...,x_T

h_t=\sigma(W^{(hh)}h_{t-1}+W^{(hx)}x_t)

\hat{y_t}=softmax(W^{(S)}h_t)

从而p(x_{t+1}=v_j|x_t,...,x_{t,j})=\hat{y_{t,j}}

我们可以以此构建出两种损失函数:一种是交叉熵损失函数

.J=-\frac{1}{T}\sum_{t=1}^T\sum_{j=1}^{|V|}y_{t,j}\times \log\hat{y_{t,j}}

另一种是以2^J,即perplexity作为损失函数

2.2 核心思想

第一,所有W均独立于t,也就是说,每一个时间步都共享参数,因此我们有“循环”的概念

第二,h_0是随机初始辅助向量,它随着时间步而更新,目的是为了存储上文的信息。

2.3 梯度消失与梯度爆炸

在对W进行更新时,我们需要求解梯度

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

其中,\frac{\partial h_t}{\partial h_k}=\prod_{j=k+1}^t\frac{\partial h_j}{h_{j-1}}

因此,如果t-k过大,就会导致多个梯度相乘,形成类似指数的运算结果,可能导致梯度过大(梯度爆炸)或者梯度过小(梯度消失)。

梯度爆炸的解决方法:裁剪,即在梯度下降更新参数时,使用\max(\frac{\partial E_t}{\partial W}, thres)

梯度消失的解决方法:下节课详细讲述,有GRU、LSTM等经过改良的RNN版本。

2.4 双向RNN与深度双向RNN

双向RNN:上述过程的主要问题在于,判断一个位置的词汇出现条件概率只使用了上文的信息。但实际上基于我们对于语言的认知,结合上下文的信息才能更准确的判断一个空位应该填入什么词语。因此我们引入了双向RNN,即:

h_t=f(W_1x_t+V_1h_{t-1}+b_1)

g_t=f(W_2x_t+V_2h_{t+1}+b_2)

\hat{y_t}=h(U[h_t,g_t]+c)

也就是说,我们从左到右和从右到左分别计算一个辅助向量,然后结合两者做出预测。

深度双向RNN:如果我们认为一层网络不足以刻画次序关系,我们可以采用多层循环神经网络来刻画,即:

h_t^{(i)}=f(W_1^{(i)}x_t+V_1^{(i)}h_{t-1}^{(i)}+b_1^{(i)})

g_t^{(i)}=f(W_2^{(i)}h_t^{(i-1)}+V_2^{(i)}h_{t+1}^{(i)}+b_2^{(i)})

\hat{y_t}=h(U[h_t^{(L)};g_t^{(L)}]+c)

你可能感兴趣的:(深度学习,机器学习,pytorch)