摘要自《深入浅出Embedding》一问。具体详细内容请移步该书。
简单来说,嵌入是用向量表示一个物体,这个物体可以是一个单词、一条语句、一个序列、一件商品、一个动作、一本书、一部电影等,可以说嵌入(Embedding)涉及机器学习、深度学习的绝大部分对象。这些对象是机器学习和深度学习中最基本、最常用、最重要的对象,正因如此,如何有效表示、学习这些对象就显得非常重要。
Embedding本身也在不断更新,由最初表现单一的静态向表现更丰富的动态延伸和拓展。具体表现为由静态的Word Embedding、Item Embedding、Graph Embedding、Categorical variables Embedding向ELMo、Transformer、GPT、BERT、XLNet、ALBERT等动态的预训练模型延伸。
因机器无法直接接收单词、词语、字符等标识符(token),所以可以采用整型数字标识或编码来处理,目前常用独热编码(One-Hot Encoding)来表示。这种编码方法虽然方便,但非常稀疏,属于硬编码,且无法重载更多信息。此后,人们想到用数值向量或标识符嵌入(Token Embedding)来表示,即通常说的词嵌入(Word Embedding),又称为分布式表示。
不过Word Embedding方法真正流行起来,还要归功于Google的word2vec,word2vec,是一群用来产生词向量的相关模型。
从文本、标识符、独热编码到向量表示的整个过程,如下:
word2vec有两种模型:
两种模型的区别如下:
CBOW 模型是从上下文的多个单词预测中间的单词(目标词);而 skip-gram 模型则从中间的单词(目标词)预测上下文的多个单词。
具体可参考:深入浅出理解word2vec模型 (理论与源码分析)
预训练模型(如ELMo、BERT等)的一般流程如图所示,其中微调是一个重要环节:
word2vec实现了从独热编码到Word Embedding的一大进步,通过word2vec转换后,一个单词对应一个向量,单词的表现更丰富了,甚至一些相近的词在空间上也有明显的表现。
但word2vec还没有解决一词多义的问题,更不用说解决单词随环境变化而变化的问题。
多义词是自然语言中经常出现的现象,也是语言灵活性和高效性的一种体现。比如“Don't trouble trouble”,可翻译为“别烦恼了”,其中trouble这个词就属于一词多义。如果用word2vec模型训练后,trouble只对应一个向量,显然无法区别这个trouble的两个含义。而一词多义,不论是在英语、中文还是在其他语言中,都是普遍存在的问题。ELMo的提出意味着我们从词嵌入(Word Embedding)时代进入了语境词嵌入(Contextualized Word-Embedding)时代!
ELMo的核心思想主要体现在深度上下文(Deep Contextualized)上。与静态的词嵌入不同,ELMo除提供临时词嵌入之外,还提供生成这些词嵌入的预训练模型,所以在实际使用时,EMLo可以基于预训练模型,根据实际上下文场景动态调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题。所以ELMo实现了一个由静态到动态的飞跃。
EMLo的实现主要涉及语言模型(Language Model),当然,它使用的语言模型有点特别,因为它首先把输入转换为字符级别的Embedding,根据字符级别的Embedding来生成上下文无关的Word Embedding,然后使用双向语言模型(如Bi-LSTM)生成上下文相关的Word Embedding。
ELMo整体模型结构如下:
ELMo的优点:
ELMo的缺点:
ELMo模型可以根据上下文更新词的特征表示,实现了词向量由静态向动态的转变。不过因ELMo依赖LSTM的架构,导致其训练只能按部就班,严格遵守从左到右或从右到左的次序进行训练,所以在面对特大语料库时将非常耗时。此外,LSTM虽然也有记忆功能,但其长期记忆的效果并不理想。
具体可参考《深入浅出Embedding》一书第6章。
BERT预训练模型很好的解决了并发以及大规模训练语料库下的性能问题。BERT的整体架构如图所示,它采用了Transformer中的Encoder部分。
Trm指Transformer的Encoder模块,如下所示:
BERT更擅长处理自然语言理解任务(NLU),使用上下文预测单词。
GPT预训练的方式和传统的语言模型一样,通过上文,预测下一个单词。它使用了Transformer的Decoder部分。GPT的整体架构如下:
其中Trm表示Decoder模块,在同一水平线上的Trm表示在同一个单元,E i表示词嵌入,那些复杂的连线表示词与词之间的依赖关系,显然,GPT要预测的词只依赖上文。GPT的Decoder模块如下:
GPT模型采用了传统的语言模型进行训练,即使用单词的上文预测单词。因此,GPT更擅长处理自然语言生成任务(NLG)。
基于Transformer的Encoder模块得到BERT预训练模型,基于Transformer的Decoder得到GPT系列预训练模型。BERT采用MLM,而GPT系列采用LM,它们各有优势,都在很多领域取得很好的效果。