想要了解Transformer以及各种NLP基础知识?推荐一本开源书籍:Speech and Language Processing,由斯坦福Dan Jurafsky教授和科罗拉多大学教授James H. Martin合著,较为通俗且专业地解释了语言和语音处理领域的基础知识。
如果觉得全英文有点肝,再推荐一个笔者用于学习这本书以及相关知识的项目:
https://github.com/BUAADreamer/slpkillergithub.com/BUAADreamer/slpkiller
目前已经整理完了NLP基础知识部分的内容。本文整理自其中Transformer部分的内容
前言
词汇量可以被用于探究从文本中获取的知识量,成年人词汇量一般为30000-100000。成熟的演讲者在日常交流中使用的词汇,是在生命早期通过与照顾者和同伴的口语交流获得的,通常在开始正规学校教育之前,一般在2000左右,这部分定义为活跃词汇。正常小孩需要在20岁之前每天学习7-10个单词才可以达到正常的词汇量要求,这样的增长肯定不光来自课堂上的教授,因为效率很低,最可能的解释就是阅读带来了词汇量,一些研究证明了阅读时间和词汇多样性可能会带来合理的词汇增长速度。
这些研究激发了分布假设distributional hypothesis——即使在现实世界中没有任何基础,也可以学习我们所说的词语含义,仅仅基于我们在生活中遇到的文本的内容。这样的知识基于词汇共现,也是词向量模型比如word2vec,glove以及BERT/GPT等Transformer的最基本原理。
预训练是指通过处理大量的文本来学习单词或句子的某种意义表示,这个过程得到预训练语言模型
自注意力网络:Transformers
Transformer将向量 ( x 1 , . . . , x N ) (x_1,...,x_N) (x1,...,xN) 映射到 ( y 1 , . . . , y N ) (y_1,...,y_N) (y1,...,yN) ,允许网络直接从任意长的上下文中提取和使用信息,而不需要像RNN通过中间循环连接传递信息。
首先介绍自注意力机制,自注意力有两个原则:
- 获得每个输出项时,模型可以获取当前和之前的所有输入项——可以用来构建语言模型和自回归生成
- 每个输出项的计算和其他项的计算是独立的——可以在训练和推理模型时轻松并行
如下图所示,其中每个 x i , y i x_i,y_i xi,yi 都可以看成是一个 d d d 维度向量。Transformer每一层内,每个输出向量 y i y_i yi 由当前位置和之前所有位置的输入向量序列 x 1 , . . . , x i x_1,...,x_i x1,...,xi一起决定。比如对于下面的 y 3 y_3 y3 ,可以简单理解为 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3 向量输入自注意力层得到的
基于注意力的方法核心
注意力的核心是将感兴趣的项与其他项的集合进行比较,以揭示它们在当前上下文中的相关性。
对于自注意力来说,对比的是给定序列中的其他元素,对比的结果被用来为当前输入计算输出。
最简单的例子:要计算 y 3 y_3 y3 ,计算三个分数 x 3 ⋅ x 1 , x 3 ⋅ x 2 , x 3 ⋅ x 3 x_3\cdot x_1, x_3\cdot x_2, x_3\cdot x_3 x3⋅x1,x3⋅x2,x3⋅x3,之后将这三个分数softmax归一化得到权重 α i j \alpha_{ij} αij ,即每个输入与当前输入的相关性。最后利用这个权重对每个输入向量做加权计算得到输出,可以写为如下公式:
s c o r e ( x i , x j ) = x i ⋅ x j α i j = s o f t m a x ( s c o r e ( x i , x j ) ) ∀ j ≤ i y i = ∑ j ≤ i α i j x j score(\boldsymbol {x}_i,\boldsymbol {x}_j)=\boldsymbol {x}_i\cdot \boldsymbol {x}_j\\ \alpha_{ij}=softmax(score(\boldsymbol {x}_i,\boldsymbol {x}_j))\ \forall j\leq i\\ \boldsymbol y_i=\sum_{j\leq i}\alpha_{ij}\boldsymbol x_j score(xi,xj)=xi⋅x