word Embedding 大杂烩

世界上有这么多 word embedding,都有啥区别啊?ELMO,BERT这都是啥?

李宏毅老师 YouTube 课程

为什么要 Embedding

  • one-hot 编码占据大量的运算空间,基本都是0,空间利用率很低,且运算速度很慢
  • 不能充分表现词与词之间的联系,one-hot 表现出的词都是不相关的。

传统 Embedding 方法

此处指包括word2vec等方法。

用one-hot做输入,做一个随机embedding初始化,然后嵌入输出去参加一个nlp task,比如情感判断等问题。最后我们拿来用的就是embedding矩阵。

在一些细节问题上的不同产生了CBOW N-grams等方法,以及 hierachical softmax、Negative Sampling 等优化方法。

ELMO

论文

ELMO,Embeddings from Language Model。相较于传统的词嵌入模型,ELMO 其实是有所改良的,我们首先来看一个 word2vec 的问题。

众所周知,不论是英语还是汉语,经常有一个词代指多个含义的情况。

money bank
river bank
flood bank

上面三个词虽然都有 bank,但是很明显“银行”和“河床”的意思相差很大,一个单词用同样的 vector 表现力匮乏,于是有人提议,一个意思一个 vector 不就好了么?

“血库”的 bank 和“银行”是不是一个意思,有人说不是,有人说都有存储是同一个意思,为了避免这样的麻烦,ELMO 用一个 vector 表示一个 token,一个 word 可以有多个 token,也就有多个 vector,距离可以估计语义的相似度。比如 flood bank 和 money bank 不是一个向量,但是距离更近一些。

train

ELMO 训练不需要你去标记任何 label,只需要大量的语料。它是一个基于 RNN 模型的,输入上一个 token,预测下一个 token 这样的任务。最中,我们找出 hidden layer 用作 embedding。比如给出 “fall” 的 hidden,预测“in”,我们有理由相信这个传过来的 hidden 就是 “fall” 的语义。

当然把 RNN 替换成 LSTM 或 GRU 是没有问题的。

Contextualized

如果你理解了前面的训练过程,相信你一定同意 ELMO 是 Contextualized 的。为了让 ELMO 看过上下文再给出答案,正向一次,反向一次,两次的 hidden 拼接起来就可以。

如果你看了上面的论文原文,会发现还有个 deep 的特点,基于 RNN 可以 deep,我们可以产生\(N\)个 embedding,论文中把所有的 hidden 分配权重相加,得到需要用的 embedding vector。

如产生\(h_1 , h_2\),两个 learnable 参数\(\alpha_1, \alpha_2\) 会影响我们最终的 embedding 输出,这两个参数可以在后续任务中和矩阵参数一起去学。

\[e = \alpha_1 h_1 + \alpha_2 h_2 \]

论文中有在不同 tasks 中这个公式中不同权重展示。

BERT

论文

BERT,Bidirectional Encoder Representations from Transformers。BERT的模型结构与 Transformer 的 encode 结构是一样的,如果不了解 Transformer,我在这里记录了我对 Transformer 的了解。

总的来说,Transformer 是一个基于 self-attention 的模型,encoder 结构将输入序列编码成一个向量,decoder 将这个向量解码。decoder 在调整注意力的时候,还需要考虑很多复杂因素。

而 BERT 模型就是用了 Transformer 的编码器,输入是一个序列,输出也是一个序列。对应位置的输出表示这个 token 的 embedding。

train

BERT 论文中有两个训练方法。

  1. Masked LM
    盖住语料中一定比例 character,比如 15% 的词是用一个<MASK> token 来代替。让 BERT 预测这些位置的词是什么。如BERT后接一个简单的线性多分类器,由于最后结构简单性,BERT 必须已经有对不同 token 强大的表达能力,相似语义的词在句子中进行替换依然是符合语义的,所以我们这样的训练方法是有效的。

  2. Next Sentence Prediction(NSP)
    除了句子本身意思之外,BERT 还相当关注两个句子之间的关系,所以它还有预测两个句子之间是否有相邻的。
    训练的两个句子间用<SEP>隔开,表示这是句子的分界位置。输出用一个二分类器去预测。

    Specifically,when choosing the sentences A and B for each pretraining example, 50% of the time B is the actual next sentence that follows A (labeled as IsNext), and 50% of the time it is a random sentence from the corpus (labeled as NotNext).

论文说,这两种训练方法一起做比较好,我们用<CLS>表示这个句子要做任务 2 也就是 NSP。

BERT 在各种任务中都有很好的表现,可以在训练后面 downstream tasks 时一起训练 BERT,也可以那时候再微调 BERT。关于它的各种任务处理方法后面有机会慢慢总结(论文中有一部分展示了)。

Transformer 的 encoder 也是可以堆叠好几层的,所以BERT也能产生很多层 embedding,我们像再 ELMO 中一样,为不同层分配不同权重做后面 finetune。

GPT

Generative Pre-Training 有两个版本,第二个版本尤其巨大。

GPT 其实是Transformer的 decoder,训练方法依然是输入句子,依次输出下一个目标词汇。详细过程参考 Transformer。GPT 一个最大的特点就是不需要任何训练资料(zero-shot learning),如 Reading Comprehension,不需要理解的数据集,只需要语料。

而且GPT效果也很不错,第二版巨大模型功能很强大,如果参数能小一点,或许应用会更加广阔。

posted @ 2020-04-18 18:26  TABball  阅读(224)  评论(0编辑  收藏  举报