CS224N(Lecture 6)-2019 斯坦福

Lecture 6(2019斯坦福)

Language Models and RNNs

一、传统的语言模型

1.什么是语言模型?

语言模型是做预测下一个单词会是什么这样的任务的系统。
在这里插入图片描述
更正式一点,给定x(1)到x(t)的单词序列,语言模型就是计算下一个单词的概率分布(P(x( t +1)))。

在这里插入图片描述
也可以将语言模型想成一个将概率分配给一段文本的一个系统。在这里插入图片描述
实际上你每天都在使用语言模型。

  • 如何学习语言模型? ————学习 n-garm 语言模型

2.n-gram语言模型

  • n-gram:一系列的n个连续单词:
  • unigram: “the” 、“student”、“opened”、“their”…
  • bigram: “the student”、“student opened”、“opened their”…
  • trigram:“the student opened”、“student opened their”…
  • 4-gram:“the student opened their”…

n-gram语言模型的核心思想:
关于不同n-gram的频率,收集一系列统计数据,用于预测下一个单词。
在这里插入图片描述

  • 首先,假设 x( t +1) 仅仅取决于最后n-1个单词。
  • 在一些大型文本中获取 n-gram 以及 (n-1)-gram 的概率(仅通过计算他们出现在训练语料库中的次数)。
n-gram 的问题:
1.稀疏性问题在这里插入图片描述
  • 稀疏问题:
    对于某些从未出现在数据库里(分子为0),可能不常见但确实可能发生的词可能就会出现被分配到的概率为0的情况:

  • 可以对于词汇表中的每个单词在计数时增加一个小的数字delta,使得每个有可能的单词至少有一些小概率。(smothing)

  • 分母为0时怎么办?

  • back-off:如果出现这种情况可以返回去将n-1个单词词组调整为n-2个单词再做预测

  • 如果扔掉太多的背景,那么预测的结果可能就不是很尽如人意。,然而如果你想要增加背景从而增大N,会使得稀疏性问题更加严重。所以在实践中,通常不会取大于5的N。

2.储存问题 在这里插入图片描述

需要存储在语料库中看到的所有n-gram的计数。随着n的增加(或者语料库大小的增加),模型的大小也随之增加。在这里插入图片描述
使用n-gram语言模型预测出来的文本,往往语义不是很连贯,因为它只能想到每个单词的前n个单词,但是如果增大n,稀疏问题和储存问题就会更加严重。

3.基于窗口的神经语言模型在这里插入图片描述

假设固定窗口大小为4:

  • 首先用one-hot向量表示这些单词
  • 通过嵌入矩阵得到单词的嵌入向量
  • 通过线性层和非线性函数f得到某种隐藏层
  • 通过另一个线性层和softmax函数,输出概率分布
优点(与n-gram语言相比)
  • 没有稀疏性问题
  • 不需要储存所有观察到的n-gram(只需要储存词汇表中所有单词的单词向量)
问题
  • 窗口设定太小
    不管窗口设定多大,都会失去一些可能有用的上下文
    如果试图放大窗口,就会增大矩阵W

  • 输入的处理方式不对称(每个单词向量与W的不同部分相乘)

我们需要某种可以处理任何长度输入的神经架构

二、循环神经网络(RNN)

1. 初识RNN在这里插入图片描述

  • 输入任意长度的序列
  • 有一系列隐藏状态,每个隐藏状态都是基于上一个隐藏状态以及输入进行计算的
  • 每一个时间步上应用相同的权重矩阵W
    在这里插入图片描述
    一些具体细节:
  • 首先用ohe-hot向量表示输入的单词
  • 通过嵌入矩阵计算嵌入向量
  • 根据先前的隐藏状态和当前输入计算第一个隐藏阶段H1(当前输入:E1,调用初始隐藏状态:H(0)
  • 从而可以根据新的隐藏状态计算下一个隐藏状态…
  • 得到最终的隐藏状态并通过一个线性层,并通过softmax函数,得到输出分布
优点
  • 可以处理任何长度的输入
  • 理论上,对于第t层的计算会用到来自许多步骤的信息,而不仅仅是一个窗口
  • 模型的大小固定,并不会因为输入的大小而改变
  • 每个时间步都应有相同的权重,对每个输入应有完全相同的变换
缺点
  • 计算很慢(无法并行隐藏阶段)
  • 在实践中,存在梯度消失和爆炸问题,因此很难从许多步骤中获取信息

2.如何训练RNN语言模型在这里插入图片描述

  • 首先需要一个大的文本语料库 x(1),x(2),… ,x(T)

  • 将这些单词序列输入到RNN模型中,计算每一步(step t)的输出分布( y ^ \hat{y} y^(t))

  • 定义损失函数,一般采用分类问题中常见的交叉熵损失函数:
    在这里插入图片描述

  • 取平均值,得到整个训练集的总损失
    在这里插入图片描述

计算整个语料库的损失和梯度需要花费大量时间。 在实践中,可以采用随机梯度下降法批量计算损失和梯度然后进行更新。

3.RNN的反向传播

Question: RNN语言模型反复应用相同的权重矩阵Wh,损失函数的导数是什么?
Answer: 权重矩阵的梯度是所有出现的梯度的总和。

  • 为什么? 多变量链条规则
    在这里插入图片描述
    Question: 如何计算?
    Answer: 反向传播(累积计算而不是分别计算)。
    在这里插入图片描述

4.RNN语言模型的文本生成

基本原理:
在这里插入图片描述

  • 可以选择一种风格的文本训练RNN模型,从而让它生成那种风格的文本。
  • 使用RNN生成的文本确实获得了一些进展,但仍然离人类水平很远。

三、评估语言模型

语言模型的标准评价指标是“perplexity”:
在这里插入图片描述
“perplexity”被定义为:根据语言模型的语料库的逆概率。
在这里插入图片描述
等于交叉商损失J( θ \theta θ)的指数。

  • 因为“perplexity”是语料库的反向概率,所以越小越好。
    在这里插入图片描述
    近年来,RNN在perplexity方面取得了相当大的成功,上图是最近的一个结果表。

四、为什么要关心语言建模?

两个重要原因:

  1. 语言建模是帮助我们衡量我们理解语言的进度的一项基准任务。(可以将语言建模理解为一个非常通用的语言理解任务)
  2. 语言建模是许多NLP任务的一个子部分,尤其是涉及生成文本或估计文本概率的任务。(例如:语音识别,手写识别,作者识别等)

回顾:

  • 语言模型:预测下一个单词的系统
  • RNN模型:
    1.顺序输入任意长度
    2.每一步都应有相同的权重
    3.可以在每一步选择性输出
  • 递归神经网络(RNN) ≠ \not= = 语言模型
  • RNN是构建语言模型的好办法,在其他地方也很有用。可以用RNN生成文本,或者进行标记任务(例如词性标注、命名实体识别),句子分类(例如情绪分类),还可以作为一个编码器模块。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值