Word Embedding(一)NNLM、word2vec、GloVe

前言

2018年 NLP 领域最大的突破毫无疑问是 BERT 预训练模型的提出,它刷新了11项 NLP 任务,本文打算从 Word Embedding 入手,介绍 NLP 当中的预训练发展过程,可能结合后期项目使用相应的算法,由于涉及实际使用,更新跨度会较大,希望能在学习和使用中有自己的发现和心得。

Embed这个词,英文的释义为"fix firmly and deeply in a surrounding mass"。Embedding在数学领域就表征某个数学结构中的一个实例被包含在另外一个实例中,当我们说某个对象 X 被嵌入到另外一个对象 Y 中,那么 Embedding 就由一个单射的、结构保持的映射 f : X → Y 来给定的。此处的结构保持的具体含义要依赖于X 和 Y 是哪种数学结构的实例而定。Word embedding 是NLP中一组语言模型(language modeling)和特征学习技术(feature learning techniques)的总称,这些技术会把词汇表中的单词或者短语(words or phrases)映射成由实数构成的向量上,比如One-Hot编码、High-dimensional sparse word vector、Low-dimensional sparse word vector,这些都是 Word Embedding 的做法。说白了词嵌入就是作为文本当中的输入数据,类比语音中的声谱MFCC等或是图像中的像素值矩阵,但它相较于这两者的不同之处就是在于它是语言模型训练得到的副产品。

NNLM

首先要提一下统计语言模型N元文法模型(N-gram Model),它的作用是为一个长度为 m 的字符串确定一个概率分布 P ( W 1 ; W 2 ; . . . ; W m ) P(W_1; W_2; ...; W_m) P(W1;W2;...;Wm) ,表示其存在的可能性,其中 W 1 W_1 W1 W m W_m Wm 依次表示这段文本中的各个词。公式如下:
P ( sentence ) = P ( W 0 ) P ( W 1 ∣ W 0 ) P ( W 2 ∣ W 0 W 1 ) P ( W 3 ∣ W 0 W 1 W 2 ) P(\text {sentence})=P(W 0) P(W 1 | W 0) P(W 2 | W 0 W 1) P\left(W 3 | W_{0} W 1 W 2\right) P(sentence)=P(W0)P(W1W0)P(W2W0W1)P(W3W0W1W2)

由此而来的基本语言模型:
L = ∑ 1 m log ⁡ P ( w ∣ c o n t e x t ( w ) ) L=\sum_{1}^{m} \log P(w | c o n t e x t(w)) L=1mlogP(wcontext(w))

其实就是假设当前词只与之前1或者几个词有关系,就是隐马尔可夫的思想嘛,因此它有两个重要应用场景:
(1)基于一定的语料库,利用 N-Gram 预计或者评估一个句子是否合理。
(2)评估两个字符串之间的差异程度。这是模糊匹配中常用的一种手段。

NNLM 即 Neural Network based Language Model,由Bengio在2003年提出,它是一个很简单的模型,由四层组成,输入层、嵌入层、隐层和输出层。模型接收的输入是长度为的词序列,输出是下一个词的类别。首先,输入是单词序列的index序列,例如单词 I 在字典(大小为)中的index是10,单词 am 的 index 是23, Bengio 的 index 是65,则句子“I am Bengio”的index序列就是 10, 23, 65。嵌入层(Embedding)是一个大小为的矩阵,从中取出第10、23、65行向量拼成的矩阵就是Embedding层的输出了。隐层接受拼接后的Embedding层输出作为输入,以tanh为激活函数,最后送入带softmax的输出层,输出概率。
NNLM最大的缺点就是参数多,训练慢。另外,NNLM要求输入是定长,定长输入这一点本身就很不灵活,同时不能利用完整的历史信息。以下就是对句子中某一词 W t W_t Wt 的前 t − 1 t-1 t1 项学习网络,就是最大化: P ( W t ∣ W 1 , W 2 . . . W t − 1 ) P(W_t|W_1,W_2 ... W_{t-1}) P(WtW1,W2...Wt1)
在这里插入图片描述

前面的单词用Onehot编码,与右边的矩阵相乘得到输入向量 C ( W i ) C(W_i) C(Wi) ,每个单词的输入拼起来最后softmax层输出预测下一个单词,所以网络更新的就是右边这个矩阵的参数,而这个矩阵就是语言模型得到的副产品 Word Embedding, V 代表词典大小,m就是 embedding 的编码数。这个网络用Pytorch实现如下:

class NNLM(nn.Module):
    def __init__(self):
        super(NNLM, self).__init__()
        self.C = nn.Embedding(n_class,embed_size)
        self.H = nn.Parameter(torch.randn(n_step*embed_size, n_hidden).type(dtype))
        self.W = nn.Parameter(torch.randn(n_step * embed_size, n_class).type(dtype))
        self.d = nn.Parameter(torch.randn(n_hidden).type(dtype))
        self.U = nn.Parameter(torch.randn(n_hidden, n_class).type(dtype))
        self.b = nn.Parameter(torch.randn(n_class).type(dtype))

    def forward(self,X):
        X = self.C(X)
        X = X.view(-1,n_step*embed_size)
        tanh = torch.tanh(self.d + torch.mm(X,self.H)) # [bs,n_hidden]
        output = self
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值