NLP入门

3,183 阅读26分钟

PS:对前端和机器学习领域感兴趣的朋友们,可以关注下我的《技术博客》哦!如果对你有帮助,欢迎赠个⭐️,会常更新内容,敬请期待!❤️❤️


NLP简介

什么是NLP

自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。

NLP=NLU(理解语言意思)+NLG(根据意思生成语言)

  1. NLU NLU 是要理解给定文本的含义。本内每个单词的特性与结构需要被理解。在理解结构上,NLU 要理解自然语言中的以下几个歧义性:
  • 词法歧义性:单词有多重含义
  • 句法歧义性:语句有多重解析树
  • 语义歧义性:句子有多重含义
  • 回指歧义性(Anaphoric Ambiguity):之前提到的短语或单词在后面句子中有不同的含义。
  1. NLG NLG 是从结构化数据中以可读地方式自动生成文本的过程。难以处理是自然语言生成的主要问题。 自然语言生成可被分为三个阶段:
  • 文本规划:完成结构化数据中基础内容的规划。
  • 语句规划:从结构化数据中组合语句,来表达信息流。
  • 实现:产生语法通顺的语句来表达文本。

以下是NLP相关模型的发展历程:

NLP模型发展

相关论文:

  1. 顶级会议论文
  • 机器学习顶级会议:NIPS,ICML,UAI,AISTATS,期刊:JMLR,ML,Trends inML,IEEE T-NN
  • 计算机视觉和图像识别:ICCV,CVPR,ECCV,期刊:IEEE T-PAMI,IJCV,IEEE T-IP
  • 人工智能:IJCAI,AAAI,期刊:AI
  1. 搜索引擎
  • 百度学术、谷歌学术、知乎、谷歌、bing

应用场景

  • 文本朗读(Text to speech)/语音合成(Speech synthesis)
  • 语音识别(Speech recognition)
  • 中文自动分词(Chinese word segmentation)
  • 词性标注(Part-of-speech tagging)
  • 句法分析(Parsing)
  • 自然语言生成(Natural language generation)
  • 文本分类(Text categorization)
  • 信息检索(Information retrieval)
  • 信息抽取(Information extraction)
  • 文字校对(Text-proofing)
  • 问答系统(Question answering)
  • 机器翻译(Machine translation)
  • 自动摘要(Automatic summarization)
  • 文字蕴涵(Textual entailment)
  • 情感分析(Emotion Analysis)
  • 聊天机器人(Chatbot)

NLP种深度学习的常见任务:

  • 神经网络:词性标记、分词、实体命名识别、目的提取……
  • 循环神经网络:机器翻译、问答系统、图像描述、句子解析、情感分析、关系分类……
  • 卷积神经网络:句子/文本分析、关系抽取、垃圾邮件检测、搜索词条归类、语义关系提取……

研究难点

  • 单词的边界界定(分词,如何写分词算法,目前有分词库可以直接分词)
  • 词义消歧
  • 词性分析
  • 命名实体识别
  • 依存分析
  • 句法模糊性
  • 有瑕疵或不规范的输入
  • 语言行为与计划
  • 数据稀疏与平滑技术
  • ……
  1. 搭建问答系统流程 核心思想:假设预先有一个知识库,存储了很多(question-answer),根据用户输入的问题,返回相似度最高的问题对应的答案。基本流程:分词——预处理——文本转为向量——计算相似度——排序——返回结果

  2. 文本处理流程

文本处理流程

基本流程:分词——数据清洗——标准化——特征提取——建模——模型评估

以上流程的详细步骤如下:

  • 分词:包括中文分词和英文分词,英文根据已有的空白符可以实现分词,中文则更加困难一些,需要结合语法、词库、语义等进行中文分词
  • 清洗:进一步处理原文本,包括

词向量

词向量

在NLP领域中,为了能表示人类的语言符号,一般会把这些符号转成一种数学向量形式以方便处理,我们把语言单词嵌入到向量空间中就叫词嵌入(word embedding)。 比如有比较流行的谷歌开源的 word2vec ,它能生成词向量,通过该词向量在一定程度上还可以用来度量词与词之间的相似性。word2vec采用的模型包含了连续词袋模型(CBOW)和Skip-Gram模型,并通过神经网络来训练。

  1. one-hot形式的词向量 one-hot形式的维数通常会很大,因为词数量一般在10W级别,这会导致训练时难度大大增加,造成维数灾难。另外这么多维只以顺序信息并且只用1和0来表示单词,很浪费空间。再一个是这种方式的任意两个词都是孤立的,没法看出两个词之间的相似性。
  2. 分布式词向量 鉴于one-hot形式词向量的缺点,出现了另外一种词向量表示方式——分布式词向量(distributed word representation)。 分布式词向量则干脆直接用普通的向量来表示词向量,而元素的值为任意实数,该向量的维数可以在事前确定,一般可以为50维或100维。

CBow(连续词袋模型) 该方法就是将{“The”,“cat”,“over”,“the”,“puddle”}当做一个上下文(或语义背景),然后根据这些单词,预测并产生中心单词“jumped”,这种模型我们称作为CBow模型。

Skip-Gram 这种方法就是通过给出的中心词“jumped”来创建一个模型,来预测和产生周围词汇(或者中心词的上下文)“The”,“cat”,"over,“the”,“puddle”。这里我们称之为“跳跃”的上下文,将这种类型的模型称为Skip-Gram模型。 与CBOW相比,初始化时大部分是相同的,只是我们需要将x和y,就是在CBOW中的x现在是y,反之亦然。我将输入one hot向量记为x,输出向量记为y(c),V、U和CBOW模型一样。

文本预处理

分词

  1. 最大匹配算法(贪心算法) 包括前向最大匹配和后向最大匹配,缺点是不能考虑语义,可能是局部最优
  2. 考虑语义 基本思想:根据输入的句子,生成所有可能的分割,根据LM(语言模型,用来评估句子的合理程度,后面会讲到)选择其中最好的分割方式,但是效率低下。
  3. 维特比算法 如何解决效率问题? ——根据词典概率,构建连接图,使用DP动态规划
维特比算法

核心问题变为:如何找到最短的路径

总结:

  1. 基于匹配规则的方法(max-matching)
  2. 基于概率的方法(LM,HMM,CRF)
  3. 分词可以认为是已经解决的问题,基本不会涉及到重新设计分词,可能会根据业务需求有小的修改

拼写错误纠正

  1. 计算出与用户输入单词编辑距离为1、2的所有单词,过滤掉无用单词;
  2. 使用贝叶斯算法计算p,p(s|c)=p(c|s)*p(c)/p(s),p(s)是定值,只需求出p(c|s)*p(c)的最大值即可

undefined

为什么选择编辑距离为1、2的字符串? 因为这样可以覆盖99%以上的场景。

最小编辑距离算法是怎么样的? 最小编辑距离是指一个单词通过新增、替换、删除三种操作方法,变为另一个单词的最小操作数。使用DP动态规划解决,算法如下:

最小编辑距离

停用词过滤、stemming

停用词过滤:去掉停用词——出现频率很低、不重要的词汇 stemming:标准化操作,将不同状态的词转化为统一状态,如:

went,go,going->go
fly,flies->fli
fast,faster,fastest->fast

Porter Stemmer:

stemmer

Stemmer的操作要依赖于语言学家的经验

文本表示

  1. one-hot表示法 one-hot有以下三种形式
  • boolean-based representation(考虑是否出现,出现是1,否则是0)
  • count-based representation(考虑单词的计数)
  • tfidf-based representation(考虑了单词重要性,不是出现次数越多代表越重要!不是出现次数越少代表越不重要!) tf-idf的计算公式为: tfidf(w)=tf(d,w)*idf(w),其中tf(d,w)表示文档d中w单词出现的词频,idf(w)表示单词的重要性,idf(w)=log(N/N(w)) 其中,TF是指计算词的词频,即某一个词出现在文本中的频率,注意需要进行归一化处理;IDF是指逆向文件频率,是一个词普遍重要性的度量。
  1. 词向量表示法(考虑了单词的语义) 使用词向量word vector表示单词,称为分布式表示法。常见的深度学习模型有skip-gramglove(global vectors for word representation)、CBowRNN/LSTMMF(矩阵分解)……
词向量可视化

使用深度学习训练词向量模型,很多大公司利用丰富的语料库已经训练好了词向量,我们需要知道有哪些词向量模型,并加以利用。但是如果我们像用于特定的使用场景,如金融、医疗、法律等等,我们需要特殊的语料库并自己训练模型。 词向量可以代表单词的含义。

文本相似度计算:

  1. 欧氏距离
  2. 余弦相似度

倒排表

问答系统需要进性相似度匹配,然后返回相似度最高的。时间复杂度为o(n)*o(相似度计算),非常大,完全不能满足时间的要求。

使用“层次过滤”思想,给定输入,先抛掉最不可能是答案的样本,再抛掉最不可能是答案的样本……一直到最后剩下的样本量就不大了,再计算相似度即可(余弦相似度)。过滤器的时间复杂度是层层递增的。

过滤器如何实现呢?需要引入倒排表——一个完整的词典库,分别记录每个单词出现在哪些文档中,例如:

我们:[Doc1,Doc13]
昨天:[Doc2]
在:[Doc1,Doc4,Doc5]
运动:[Doc1,Doc3,Doc5]
什么:[Doc1,Doc6]

这样可以快速找到哪个单词出现在哪个文档中(否则根据单词一个个去搜索文档时间复杂度非常高)

语言模型LM

语言模型是为了判断一句话从语法上的通顺程度(通俗的理解就是这个句子是不是人话)。

类型表达式
unigramp(w1,w2,w3,w4,w5)=p(w1)+p(w2)+p(w3)+p(w4)+p(w5)
bigramp(w1,w2,w3,w4,w5)= p(w1)+p(w2w1)+p(w3w2)+p(w4w3)+p(w5w4)
trigramp(w1,w2,w3,w4,w5)= p(w1)+p(w2w1)+p(w3w1w2)+p(w4w2w3)+p(w5w3w4)

依此类推可得n-gram的表达式。

N-Gram语言模型的评价方法:

  1. 实用方法 通过查看该模型在实际应用中(如拼写检查、机器翻译)中的标显来评价,非常直观实用,但是缺乏针对性、不够客观
  2. 理论方法 perplexity(迷惑度)计算,基本思想是给测试集赋予较高概率值的语言模型较好

评价LM的质量(计算perplexity): perplexity=2^(-x) x是最大似然估计

undefined

perplexity(衡量语言模型的好坏)计算方法:perplexity=2*(-x),perplexity越小越好。 每个likelihood都要计算(后一个词相对前一个词出现的概率),然后分别求对数,再求解平均值,即可得到x。

例如,训练的三个模型unigram、bigram、trigram,perplexity分别为300、200、100,可知此次训练的trigram模型最好。

平滑算法

解决的问题:有些单词会未存在语料库中(新单词),如何评判它的重要程度?

  1. add-one smoothing
  2. add-k smoothing
  3. interpolation
  4. good-turning smoothing(考虑了新的单词) 算法具体计算方法如下:

undefined

其中,add-k smoothing的分母加V是为了确保概率和为1,interpolation是使用unigram、bigram、trigram分别做加权平均,good-turning smoothing方法存在一个问题,就是Nc有数据,但Nc依赖于Nc+1,而Nc+1可能不存在(仅出现过c+1次的单词不存在),这时应该采用曲线拟合来解决。

专家系统

专家系统=推理引擎+知识,利用知识和推理来解决决策问题 专家系统与基于概率的系统的区别:

  1. 专家系统适合于没有数据源或数据源很少的情况,根据专家的经验拟定一条条规则进行匹配
if condition1:
	do something1
else if condition12
	do something2
else if ...
  1. 基于概率的系统是根据给定的数据D={X,Y},学习x到y的映射关系,通常适用于有大量数据源的情况
专家系统

基于概率的系统

使用机器学习方法解决问题

监督学习常用方法:

  • 线性回归
  • 逻辑回归
  • 朴素贝叶斯
  • 神经网络
  • SVM
  • 随机森林
  • Adaboost
  • CNN

非监督学习常用方法:

  • k-means(聚类)
  • PCA(主成分分析)
  • ICA
  • MF(矩阵分解)
  • LSA(latent semantic analysis)
  • LDA(latent Dirichlet analysis)

正则项

  • L0:一般不用
  • L1:sparse参数,会将一些参数变为0,稀疏参数(相当于激活部分神经元)
  • L2:减小参数,但不会减为0

关于模型:

  • 好的模型拥有高的泛化能力
  • 越复杂的模型越容易过拟合
  • 添加正则项是防止过拟合的一种手段,其他还有dropout、early-stopping等等
  • L1正则会带来稀疏特性
  • 选择超参数时使用交叉验证
  • 参数搜索过程最耗费资源

参数搜索策略

如何选择正则项中的超参数λ呢?

  1. grid search
grid search
  1. 随机搜索 λ1区间[a,b],λ2区间[c,d],随机抽取值

  2. 遗传算法 尽量往好的方向去搜索,抛弃不太好的区间(好的个体更倾向于产生的个体)。 尝试λ效果不错的话,不断产生子枝,生成与原来λ有关的新λ,池虚繁殖后代,如果表现不好就直接舍弃

  3. 贝叶斯优化 不断调整先验,使后验概率不断变化,和遗传算法核心思想类似,但是采用的手段不同

MLE/MAP

  • MLE:最大似然估计(仅仅考虑数据本身)
  • MAP:最大后验估计(需要考虑先验知识)

MLE与MAP的直观理解:

  1. MLE(最大似然估计):扔硬币,仅仅通过观测值2/3来预测正/反面向上的概率
  2. MAP(最大后验估计):扔硬币,仍然会得到观测值2/3,但拥有这个硬币的主人告诉我,出现正面的概率大概是80%,会与我的观测值2/3出现偏差(可能我观测到的样本不够多),这时计算正/反面向上的概率应结合先验概率(主人的想法)为66.7%~80%之间

随着样本数杨的增大,先验所起到的作用会越来越小。当样本数N趋近于无穷大时,MAP的解趋近于MLE的解。Gaussian Prior is L2 regularization——高斯先验相当于加了L2正则项,Laplace Prior is L1 regularization——拉普拉斯先验相当于加了L1正则项

lasso

特征选择策略:

  1. exhausted search:考虑所有可能的特征组合,评估各自准确率
  2. greedy approach:贪心算法,前向或后向选择特征,计算组合特征的准确率
  3. via regularization:lasso算法,通过目标函数的方法构建特征组合,包括L1、L2正则

为什么偏向于稀疏特征?

  1. 如果维度太高,计算量也变得很高
  2. 在稀疏性条件下,计算量只依赖于非0项的个数
  3. 提高可解释性

使用L1正则化稀疏变量,但是存在导数不存在的点,使用SGD不容易进行梯度下降。L1正则的导数不是连续的,需要使用coordinate descent进行梯度下降:核心思想是,先固定其他w,只调整一个维度的w寻找最优解,依次找到各个维度w的最优解。lasso objective一定会收敛。

怎么选择下一个coordinate ?

  1. 依次选择dimension
  2. random select

重要模型与算法

attention

attention

Attention 机制的本质来自于人类视觉注意力机制。人们视觉在感知东西的时候一般不会是一个场景从到头看到尾每次全部都看,而往往是根据需求观察注意特定的一部分。而且当人们发现一个场景经常在某部分出现自己想观察的东西时,人们会进行学习在将来再出现类似场景时把注意力放到该部分上。

仍然以循环神经⽹络为例,注意⼒机制通过对编码器所有时间步的隐藏状态做加权平均来得到背景变量。解码器在每⼀时间步调整这些权重,即注意⼒权重,从而能够在不同时间步分别关注输⼊序列中的不同部分并编码进相应时间步的背景变量。

在计算 Attention 时主要分为三步,第一步是将 query 和每个 key 进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;然后第二步一般是使用一个 softmax 函数对这些权重进行归一化;最后将权重和相应的键值 value 进行加权求和得到最后的 Attention。

长输入序列带来的问题: 输入序列不论长短都会被编码成一个固定长度的向量表示,而解码则受限于该固定长度的向量表示。这个问题限制了模型的性能,尤其是当输入序列比较长时,模型的性能会变得很差(在文本翻译任务上表现为待翻译的原始文本长度过长时翻译质量较差)。

Attention机制的基本思想是,打破了传统编码器-解码器结构在编解码时都依赖于内部一个固定长度向量的限制。Attention机制的实现是通过保留LSTM编码器对输入序列的中间输出结果,然后训练一个模型来对这些输入进行选择性的学习并且在模型输出时将输出序列与之进行关联。换一个角度而言,输出序列中的每一项的生成概率取决于在输入序列中选择了哪些项。

Attention在序列预测中的5大应用:

  1. Attention在文本翻译任务上的应用 给定一个法语的句子作为输入序列,需要输出翻译为英语的句子。Attention机制被用在输出输出序列中的每个词时会专注考虑输入序列中的一些被认为比较重要的词。

  2. Attention在图片描述上的应用 给定一张图片作为输入,输出对应的英文文本描述。Attention机制被用在输出输出序列的每个词时会专注考虑图片中不同的局部信息。

  3. Attention在语义蕴涵 (Entailment) 中的应用 给定一个用英文描述的前提和假设作为输入,输出假设与前提是否矛盾、是否相关或者是否成立。

  4. Attention在语音识别上的应用 给定一个英文的语音片段作为输入,输出对应的音素序列。Attention机制被用于对输出序列的每个音素和输入语音序列中一些特定帧进行关联。

  5. Attention在文本摘要上的应用 给定一篇英文文章作为输入序列,输出一个对应的摘要序列。Attention机制被用于关联输出摘要中的每个词和输入中的一些特定词。

self-attention

Self-Attention 可以是一般 Attention 的一种特殊情况,在 Self-Attention 中,Q=K,V 每个序列中的单元和该序列中所有单元进行 Attention 计算。

self-attention思想和attention类似,但是self-attention是Transformer用来将其他相关单词的“理解”转换成我们正在处理的单词的一种思路,我们看个例子: The animal didn't cross the street because it was too tired 这里的 it 到底代表的是 animal 还是 street 呢,对于我们来说能很简单的判断出来,但是对于机器来说,是很难判断的,self-attention就能够让机器把 it 和 animal 联系起来,接下来我们看下详细的处理过程。

  1. 首先,self-attention会计算出三个新的向量,在论文中,向量的维度是512维,我们把这三个向量分别称为Query、Key、Value,这三个向量是用embedding向量与一个矩阵相乘得到的结果,这个矩阵是随机初始化的,维度为(64,512)注意第二个维度需要和embedding的维度一样,其值在BP的过程中会一直进行更新,得到的这三个向量的维度是64。
self attention1
  1. 计算self-attention的分数值,该分数值决定了当我们在某个位置encode一个词时,对输入句子的其他部分的关注程度。这个分数值的计算方法是Query与Key做点成,以下图为例,首先我们需要针对Thinking这个词,计算出其他词对于该词的一个分数值,首先是针对于自己本身即q1·k1,然后是针对于第二个词即q1·k2。
self attention2
  1. 接下来,把点成的结果除以一个常数,这里我们除以8,这个值一般是采用上文提到的矩阵的第一个维度的开方即64的开方8,当然也可以选择其他的值,然后把得到的结果做一个softmax的计算。得到的结果即是每个词对于当前位置的词的相关性大小,当然,当前位置的词相关性肯定会会很大。
self attention3
  1. 下一步就是把Value和softmax得到的值进行相乘,并相加,得到的结果即是self-attetion在当前节点的值。在实际的应用场景,为了提高计算速度,我们采用的是矩阵的方式,直接计算出Query, Key, Value的矩阵,然后把embedding的值与三个矩阵直接相乘,把得到的新矩阵 Q 与 K 相乘,乘以一个常数,做softmax操作,最后乘上 V 矩阵。
self attention4

seq2seq

seq2seq属于encoder-decoder结构的一种,常见是encoder-decoder结构,基本思想就是利用两个RNN,一个RNN作为encoder,另一个RNN作为decoder。encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码,获取语义向量最简单的方式就是直接将最后一个输入的隐状态作为语义向量C。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。

而decoder则负责根据语义向量生成指定的序列,这个过程也称为解码,如下图,最简单的方式是将encoder得到的语义变量作为初始状态输入到decoder的RNN中,得到输出序列。可以看到上一时刻的输出会作为当前时刻的输入,而且其中语义向量C只作为初始状态参与运算,后面的运算都与语义向量C无关。

seq2seq的应用场景如下:

  1. 机器翻译(当前最为著名的Google翻译,就是完全基于Seq2Seq+Attention机制开发出来的)。
  2. 聊天机器人(小爱,微软小冰等也使用了Seq2Seq的技术(不是全部))。
  3. 文本摘要自动生成(今日头条等使用了该技术)。
  4. 图片描述自动生成。
  5. 机器写诗歌、代码补全、生成 commit message、故事风格改写等。

LDA

(1)生成过程 LDA的目的就是要识别主题,即把文档—词汇矩阵变成文档—主题矩阵(分布)和主题—词汇矩阵(分布)

LDA生成流程
  1. 从一个全局的泊松(Poisson)参数为β的分布中生成一个文档的长度 N;
  2. 从一个全局的狄利克雷(Dirichlet)参数为α的分布中生成一个当前文档的θ;
  3. 然后对于当前文档长度 N 的每一个字执行以下两步:1)一是从以θ为参数的多项(Multinomial)分布中生成一个主题(Topic)的下标(Index)z_n;2)二是从以φ和 z 共同为参数的多项分布中产生一个字(Word)w_n。

α->θ的生成、β->Fai的生成, 需要满足条件

  • 和为1 ;
  • 大于0,采用Dirichlet分布生成

θi->Zij的生成(在主题分布中进行主题采样): 需要使用multinomial分布进行采样

(2)PLSA与LDA区别

PLSA确定了主题概率,LDA未确定固定的主题概率,只规定了主题概率服从Dirichlet分布 PLSA

  1. 按照概率P(di)选择一篇文档di
  2. 选定文档di后,确定文章的主题分布
  3. 从主题分布中按照概率P(zk/di)选择一个隐含的主题类别zk
  4. 选定zk后,确定主题下的词分布
  5. 从词分布中按照概率P(wj/zk)选择一个词wij
PLSA与LDA

LDA

  1. 按照先验概率P(di)选择一篇文档di
  2. 从Dirichlet分布α中采样生成文档di的主题分布θiθi由超参数α的Dirichlet分布生成)
  3. 从主题分布θi中采j样生成文档di第j个词的主题zij
  4. 从Dirichlet分布β中采样生成主题zij对应的词分布FAIijFAIij由超参数β的Dirichlet分布生成)
  5. 从词分布中按照概率FAIij选择一个词wij

transform

一句话解释:transformer是带有self-attentionseq2seq,输出能同时计算,可以代替RNN结构(必须按输入的顺序计算),因此transformer对于sequence to sequence的应用场景更为高效。

transformer是首个完全抛弃RNN的recurrence,CNN的convolution,仅用attention来做特征抽取的模型。Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。

(1)transformer结构解读 transformer的模型结构图如下:

transformer计算流程1

上图中,左半部分是Encoder,右半部分是Decoder。

  1. Encoder
  • input会通过input embedding layer变成一个vector
  • 这个vector会加上positional encoding
  • positional encoding接下来会进入灰色的block(灰色block会重复N次)
  • 其中,灰色block的第一层是Muti-head Attention,sequence通过此层会得到另一个sequence
  • 接下来通过Add & Norm,作用是将Muti-Head AttentionoutputMuti-head Attentioninput加起来再做layer normalization(和batch normalization不同)
  • 接下来通过一个Feed Forward layer,会将sequence的每一个vector进行处理
  • 然后再接上另一个Add & Norm
  1. Decoder
  • outputs会通过output embedding layer变成一个vector
  • 这个vector会加上positional encoding
  • positional encoding接下来会进入灰色的block(灰色block会重复N次)
  • 其中,灰色block的第一层是Masked Muti-head Attention(masked:attend on the generated sequence),sequence通过此层会得到另一个sequence
  • 接下来通过Add & Norm
  • 再进入Muti-Head Attention layer接到之前Encoder部分的输出
  • 接下来通过一个Add & NormFeed Forward layerAdd & Norm
  • 再经过LinearSoftmax得到注重的输出。

计算的具体流程如下图:

第1步:根据Wq、Wk、Wv,计算每个vector对应的q、k、v,再根据右上角的公式计算αi

【PS】q、k、v分别代表Query向量(要去查询的,与每个词之间的关系),Key向量(等着被查的词)和Value向量(实际的特征信息),它们是通过3个不同的权值矩阵由嵌入向量X乘以三个不同的权值矩阵Wq、Wk、Wv得到

transformer计算流程1

第2步:对每个αi计算softmax值

transformer计算流程2

第3步:使用右上角的公式,计算每个vector对应的输出b

transformer计算流程3

【注意】以上从x1到xn的运算是可以同时进行的,通过attention值的大小,可以与其他的vector产生上下文关联。

transformer计算的范围

Transformer的可处理文本长度定为512,而不是更大的值,一个很重要的因素是,在计算attention的过程中,需要计算(Multi-head attention并不会减少计算量),这也是为什么Transformer处理长距离依赖问题并不太好的原因之一。

multi-headed机制(通常都是多层,一层的不够的)

多组Q、K、V能得到多组表达(类似CNN中的filter),总综合多种特征提取方案,得到综合的特征表达

  • 通过不同的head得到多个特征表达(一般是8个)
  • 将所有特征拼接在一起
  • 可以通过再一层全连接来降维(乘上全连接矩阵)
multi-headed机制

位置信息如何表达?

加入了位置信息的编码,每个词的位置发生变化,那就不同了。位置信息编码的方法非常多,常见的是加上一个周期信号。

什么是layer normalization?

layer norm

LN 是在每一个样本上计算均值和方差,而不是BN那种在批方向计算均值和方差。

Add & Norm做了残差连接(多条路的选择给模型自己选择)

decoder的特点

  • attention计算方式不同(不只有self-attention,还多了encoder-decoder attention)
  • 加入了mask机制(decoder的输出只能一个个输出,需要依赖前面的vector,因此需要使用mask机制,就是不能预知未来输出的东西)
  • 连softmax层,使用cross-entropy计算loss即可

(2)transformer为何计算速度快 我们可以将以上的计算过程使用一连串的矩阵乘法解决,而矩阵乘法可以轻易地使用GPU来加速。如下图所示:

1. 每个vector的q、k、v的计算都可以使用矩阵相乘Wqa、Wka、Wv*a加以计算:

transformer矩阵计算1

2. α的计算也可以通过矩阵相乘表示不,如下图所示:

transformer矩阵计算3 transformer矩阵计算4

3. b的计算也可以通过矩阵相乘来解决:

transformer矩阵计算5

以下是综合矩阵运算的图解:

transformer矩阵计算6

attention整体计算流程:

  1. 每个词的Q会跟每个K计算得分(重要性越大,得分越高)
  2. softmax后会得到整个加权结果(相当于归一化)
  3. 此时每个词看的不只是他前面的序列,而是整个输入序列
  4. 同一时间能计算出所有词的表达结果(利用矩阵乘法)