1:第一代的神经元模型 3
2:从M-P模型到感知器模型 3
3:前馈神经网络 3
4:后向传播与BP算法神经网络 4
5:深度神经网络DNN 4
6:卷积神经网络CNN 5
7:循环神经网络RNN 8
8:神经网络交叉领域实现与应用 9
两部分知识的连接
1:one-hot 11
2:Word-embeding 词嵌入 11
3:Word2Vec 12
5:Glove模型 13
6:LSTM 14
7:Seq2Seq 16
8:Attention 18
9:Transformer 19
10:Elmo 22
11:Bert 23
图1 神经网络与自然语言处理关系图
现如今,神经网络这样的专业词汇在当今世界已经不再是少数计算机领域的人士才会提及的词语了,神经网络一词已经走入千家万户,很多人即使不知道使用的是否恰当,也会在语句中夹杂些人工智能、大数据、神经网络这样的词汇。那什么是神经网络,他是怎么发展而来的,又能带给我们的生活何种便利呢?下面我将一一为您解答。
在介绍神经网络的发展历史之前,首先介绍一下到底什么是神经网络。神经网络主要是指一种仿造人脑设计的简化的计算模型,这种模型中包含了大量的用于计算的神经元,这些神经元之间会通过一些带有权重的连边以一种层次化的方式组织在一起。每一层的神经元之间可以进行大规模的并行计算,层与层之间进行消息的传递。
第一代的神经元模型是验证型的于1940年诞生,当时的设计者只是为了验证神经元模型可以进行计算,这种神经元模型既不能训练也没有学习能力,可以简单的把它看成是一个定义好的逻辑门电路,因为它的输入和输出都是二进制的,而中间层的权重都是提前定义好的。
验证型神经网络
既不能训练也没有学习能力
可看作逻辑门电路,输入和输出都是二进制的,权重都是提前定义好
所谓M-P模型,其实是按照生物神经元的结构和工作原理构造出来的一个抽象和简化了的模型。
感知器就是基于M-P模型的结构。感知器与第一代神经元模型有很多形似处,但是二者之间存在着一些关键的区别,感知器模型的激活函数可以选择sigmoid函数等,其输入可以选择使用实数向量,而不是神经元模型的二进制向量。与神经元模型不同,感知器模型是一个可以学习的模型。它可以将不同类别的点在N维空间中分离开,对于一些基本的逻辑运算,例如与、或、非,感知器模型可以非常容易地作出判断分类。
可使用sigmoid等其他函数
输入为实数向量
可以学习的模型
八十年代后,由于单层的感知器神经网络的表达能力非常有限,只能做一些线性分类器的任务,神经网络的发展进入了多层感知器时代。其中一个典型的多层神经网络就是前馈神经网络。它包括输入层、节点数目不定的隐层和输
出层。任何一个逻辑运算都可以通过多层感知器模型表示,但这就涉及到三层之间交互的权重学习问题。图中V与W是两个需要学习信息的权重矩阵。
上一层为下一层的输入
表达能力相比感知器模型具有大幅度提升
在前馈神经网络中对于隐层的调控十分有限,所以虽然我们可以计算出其模型输出,但是却不知道它的期望输出是什么,也就没有办法去高效训练一个多层神经网络。这就要引出后向传播与BP算法神经网络。
BP神经网络:是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络。BP算法其实就是一个链式法则,在大多数情况下BP神经网络给出的只是一个局部的最优解,而不是全局的最优解。但是从整体来看,一般情况下BP算法能够计算出一个比较优秀的解。
由上图可以看出bp算法神经网络其实是属于前馈神经网络的一种。这里的“前馈”指的是网络拓扑结构中不存在环或回路,而不是指该网络只能向前传播而不能向后传播相比于多层感知机,BP网络具有误差逆传播算法训练多层前馈网络它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络是一种其主要的特点是:信号是前向传播的,而误差是反向传播的。
影响BP神经网络性能的参数主要有:隐含层节点的个数、激活函数的选择以及学习率的选择等
误差反向传播
按不同层的位置划分,DNN内部的神经网络层与上述神经网络同样可以分为:输入层,隐藏层和输出层,一般第一层是输入层,最后一层是输出层,而中间的层数都是隐藏层。层与层之间是全连接的,即第i层的任意一个神经元一定与第i+1层的任意一个神经元相连。相对于浅层神经网络深度神经网络提取特征能力强于(low level)浅层神经网络,并且达到相同效果,深度神经网络所需要的参数也更少。
缓解局部最优解
信息提取能力显著增强
2012年,在图片分类领域,CNN模型在ImageNet上取得了一个较大的突破。测试图片分类的是一个很大的数据集,要将这些图片分成1000类。在使用深度学习之前,当时最好的结果是错误率为25.8%(2011年的一个结果),在2012年Hinton和它的学生将CNN应用于这个图片分类问题之后,这个指标下降了几乎10%。
自2012年之后,我们从图表中可以观察到每一年这个指标都有很大程度的突破,而这些结果的得出均使用了CNN模型。深度学习模型能取得如此大的成功,在现代人看来主要归功于其层次化的结构,能够自主学习并将数据通过层次化结构抽象地表述出来。而抽象出来的特征可以应用于其他多种任务,这也是深度学习当前十分火热的原因之一。
现在,我们就来了解一下如此出名的卷积神经网络(CNN)到底是拥有什么样的结构,什么样的内部算法。
卷积神经网路,我们可否套用一下我们已知的知识去理解它呢? 其实可以,我们把它的名字拆分开就是“卷积”“神经网络”,“卷积”是什么我们可能不清楚,但“神经网络”我们前几个模型可一直在学习呀,“神经网络”归根结底不就是层次分明的分类器吗。我们看下面这张图,这是CNN的工作流程图,我用红色字标出了对应写出了“卷积”和“神经网络”工作的位置,可以看出“神经网络”确实放置于CNN工作后部,起到分类作用。
“卷积” 放置于CNN工作前部,图中说到它的作用是特征提取器。“卷积”里面我们可以按其功能分为两部分,卷积层与池化层。
卷积层:
卷积核对应image中相应位置进行叠加运算,计算出的结果为此步的卷积特征。这一层就是卷积神经网络最重要的一个层次,也是“卷积神经网络”的名字来源。
在这个卷积层,有两个关键操作:
1:局部关联。每个神经元看做一个滤波器(filter)
2:窗口(receptive field)滑动, filter对局部数据计算
介绍卷积层遇到的几个名词:
1:深度/depth(解释见下图)
2:步长/stride (窗口一次滑动的长度)
3:填充值/zero-padding
那填充值是什么呢?以下图为例子,比如有这么一个5 * 5的图片(一个格子一个像素),我们滑动窗口取22,步长取2,那么我们发现还剩下1个像素没法滑完,那怎么办呢?
那我们在原先的矩阵加了一层填充值,使得变成66的矩阵,那么窗口就可以刚好把所有像素遍历完。这就是填充值的作用。
池化层:
池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。
这里再展开叙述池化层的具体作用。
1.特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。
2.特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。
3.在一定程度上防止过拟合,更方便优化。
池化层用的方法有Max pooling 和 average pooling,而实际用的较多的是Max pooling。这里就说一下Max pooling,其实思想非常简单。对于每个2 * 2的窗口选出最大的数作为输出矩阵的相应元素的值,比如输入矩阵第一个2 * 2窗口中最大的数是6,那么输出矩阵的第一个元素就是6,依此类推。
卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。**CNN一个非常重要的特点就是头重脚轻(越往输入权值越小,越往输出权值越多),呈现出一个倒三角的形态,这就很好地避免了BP神经网络中反向传播的时候梯度损失得太快。**卷积神经网络CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;
再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。
以下是CNN中需要重点思考明白的问题
处理更为复杂的问题
强大的特征抽取与数据压缩
共享卷积核,对高维数据处理无压力
关于循环神经网络的基本原理如下图所示,从图中可以看循环神经网络的输出不仅依赖于输入x,而且依赖于当前的隐层状态,而这个隐层状态会根据前一个x进行更新。从展开图中可以直观的理解这个过程,第一次输入的中间隐层状态S(t-1)会影响到下一次的输入X(t)。循环神经网络模型的优势在于可以用于文本、语言或者语音等此类序列型的数据,即当前数据的状态受到此前数据状态的影响。对于此类数据,前馈神经网络是很难实
现的。
提到RNN,那就不得不介绍一下之前提到的LSTM模型。实际上LSTM并不是一个完整的神经网络,它只是一个RNN网路中的节点经过复杂处理后的结果。LSTM中包含三个门:输入门,遗忘门和输出门。这三个门均用于处理cell之中的数据内容,分别决定是否要将cell中的数据内容输入、遗忘和输出。
处理序列化问题
数据自我迭代
拥有时间深度
最后介绍一个目前非常流行的交叉领域的神经网络的应用,将一个图片转换成描述形式的文字或者该图片的title。具体的实现过程可以简单的解释为首先通过一个CNN模型将图片中的信息提取出来形成一个向量表示,然后将该向量作为输入传送到一个训练好的RNN模型之中得出该图片的描述。
正如8:神经网络交叉领域实现与应用中所提到的,通过CNN与RNN我们可以把一张图片信息用文字描述出来。其中CNN把图片信息向量化表示,RNN进行图片描述,这是因为CNN非常适合图处理例如:面对1000x1000的高清(单色)图片,同样提取10个特征,需要多少参数呢?DNN(深度神经网络)需要1000x1000x10 = 1千万个参数,而CNN(卷积神经网络)需要5x5x10= 250个参数(如果filter是5x5的matrix(矩阵))。DNN制造一个特征,需要1000x1000个参数,这是DNN设计要求。CNN制造一个特征,CNN设计说“随意”,2x2, 3x3, 5x5都行。DNN只能接受全局特征,CNN都可以,更倾向于学习小的局部特征。综上所述,图像处理的任务就交给CNN吧,把提取出的信息,向量化表示给到RNN用于生成文本。
本质上讲,图像是静态的,语音是动态的有时序的。cnn适合静态图像,rnn模拟人脑记忆适合处理时序语音信号。也就是说RNN对于语音类时序性强的内容处理很占优势,那有没有哪种基于神经网路的算法是更有利于文本处理的呢?比如一场多人会议,可否通过语音音色区别,判别且生成某个人的文字文本内容呢?是否需要RNN与别的算法进行搭配完成呢?
故我们不得不引出另一类知识,那就是自然语言处理(NLP)。
很多人听我说到自然语言处理,第一反应是太高大上了,这是个什么呀?自然语言处理,英文Natural Language Processing,简写NLP。NLP这个概念本身过于庞大,很难通过简短的几句定义就能明白它是什么。不妨还用切割方法,把它分成“自然语言”和“处理”两部分。
自然语言:自然语言是人类发展过程中形成的一种信息交流的方式,包括口语及书面语,反映了人类的思维。简单的一句问候“你好”,以及正在看的这篇,都是以自然语言的形式表达。现在世界上所有的语种语言,都属于自然语言,包括汉语、英语、法语等。
处理:通过计算机计算得到某种结果
所以加在一起,自然语言处理:计算机接受用户自然语言形式的输入,并在内部通过人类所定义的算法进行加工、计算等系列操作,以模拟人类对自然语言的理解,并返回用户所期望的结果。正如机械解放人类的双手一样,自然语言处理的目的在于用计算机代替人工来处理大规模的自然语言信息。最后让计算机能够确切理解人类的语言,并自然地与人进行交互。
词向量是通过数字组成的向量来表示一个词,这个向量的构成方式有多种。最简单的方式是one-hot向量。假设在一个语料集合中,一共有n个不同的词,则可以使用一个长度为n的向量,第i个词(0 简单易懂
词嵌入是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量。
具有相似上下文的词,应该具有相似的语义。这个假说被称为distributional hypothesis。词的distributed representation(分布式表示)就是一种表示能够刻画语义之间的相似度并且维度较低的稠密向量表示,例如:
高兴=[0.2,1.6,−0.6,0.7,0.3]
开心=[0.3,1.4,−0.5,0.9,0.2]
这样,便可通过计算向量的余弦相似度,来反映出词的语义相似度。词的分布式表示解决了“词汇鸿沟”问题,并且可以通过计算向量之间的距离(欧式距离、余弦距离等)来体现词与词的相似性。
解决词汇鸿沟
通过欧式距离/余弦距离体现词的相似性
word2vec是谷歌提出的一种word embedding的具体手段,采用了两种模型(CBOW与skip-gram模型)与两种方法(负采样与层次softmax方法)的组合,比较常见的组合为 skip-gram+负采样方法。Mikolov 等研究者在这篇论文中提出了连续词袋模型CBOW和 Skip-Gram 模型,通过引入负采样等可行性的措施,这两种方法都能学习高质量的词向量。
其中,CBOW模型是在已知当前词的上下文的前提下预测当前词,Skip-gram模型是已知当前词的前提下,预测它的上下文。两个模型的结构都是一个三层网络,输入层、投影层和输出层。
如图所示,INPUT是输入层,PROJECTION是投影层,OUTPUT是输出层,w(t)是当前词语(向量),w(t-2),w(t-1),w(t+1),w(t+2)是当前词语的上下文,SUM是上下文的累加和。
没有神经网络层,所以没有耗时的矩阵相乘,只保留了一个softmax层,计算效率高
优化时使用的是随机梯度下降,罕见词不会主导优化目标
NNLM是从语言模型出发(计算概率角度),构建神经网络针对目标函数对模型进行最优化,训练的起点是使用神经网络去搭建语言模型实现词的预测任务,并且在优化过程后模型的副产品就是词向量。
进行神经网络模型的训练时,目标是进行词的概率预测,就是在词环境下,预测下一个该是什么词,目标函数如下式, 通过对网络训练一定程度后,最后的模型参数就可当成词向量使用.
可自定义维度
生成的词向量能够很好的根据特征距离度量词与词之间的相似性。
本模型的目标是进行词的向量化表示,使得向量之间尽可能多地蕴含语义和语法的信息。输入为语料库,输出为词向量。运用方法:首先基于语料库构建词的共现矩阵,然后基于共现矩阵和Glove模型学习词向量。
开始 -> 统计共现矩阵 -> 训练词向量 -> 结束
Glove模型有一点需要着重说明,通常获取词向量基本上有两种思路:
1.利用全局统计信息,进行矩阵分解(如LSA)来获取词向量,这样获得的词向量往往在词相似性任务上表现不好,表明这是一个次优的向量空间结构;
2.利用局部上下文窗口单独训练,但是统计信息作为有用的先验知识,没有很好的利用到。
Glove:结合两种训练方式,获取更好的词向量
Glove与skip-gram、CBOW模型对比
Cbow/Skip-Gram 是一个local context window的方法,比如使用NS来训练,缺乏了整体的词和词的关系,负样本采用sample的方式会缺失词的关系信息。
另外,直接训练Skip-Gram类型的算法,很容易使得高曝光词汇得到过多的权重
Global Vector融合了矩阵分解Latent Semantic Analysis (LSA)的全局统计信息和local context window优势。融入全局的先验统计信息,可以加快模型的训练速度,又可以控制词的相对权重。我的理解是skip-gram、CBOW每次都是用一个窗口中的信息更新出词向量,但是Glove则是用了全局的信息(共线矩阵),也就是多个窗口进行更新
Glove引入词频统计信息,这是很重要的全局信息
上文中的神经网络其实简要介绍过LSTM,其全称是long short term memory。是一种特殊的RNN,与一般的RNN区别是中间的更新状态的方式不同。传统的RNN的更新模块是只有一层tanh层作为激活层。而LSTM的RNN的更新模块具有4个不同的层相互作用。
传统RNN
LSTM-RNN
下图Lstm中C_{t-1}是前一个状态,C_{t}是输出的状态。状态是指记录了到目前为止的所有更新的上下文,前一个状态C_{t-1}输入以后会经过遗忘和添加新的内容,最终输出新的状态到下一个cell。只有部分信息会删除和更新,大部分信息是直接按照以上那条线flow出去的。个人觉得可以把这里的过程看成是流水生产线,加工的产品就是信息。
LSTM-信息传输线
在这里第一个部分是:遗忘
这里的sigma是指sigmoid函数,对于状态C_{t-1}矩阵当中每个输入的值,都会有对应的一个输出的值,输出的值在[0, 1]之间,相当于是决定了遗忘多少部分。如果输出值为1,说明全部保留,不删除原本的记忆,如果是0,说明状态C_{t-1}矩阵对应的这个值全部删除。
LSTM-遗忘
比如:前一个状态可能包含了主语“He”,名字叫“Peter”,国籍是“America”。接下来话锋一转,新出现了一群人,因此这个时候状态矩阵对应主语的这一栏就会删除“He”,以保证接下来的动词的形式不是第三人称单数。
第二部分是:添加新信息到已有状态矩阵当中-更新
这里有两部分同时进行:一个是sigmoid函数决定添加多少部分的新信息到前一个状态矩阵当中(类似于权重),tanh层则根据前一个的输出值h_{t-1}和当前的输入值x_{t-1}产生一个新的当前状态(也就是一个新的候选值向量,这个向量之后要加入到已有的状态矩阵当中)。最后根据前面sigmoid输出的权重和新的候选值向量两个共同更新原有的矩阵。
LSTM-矩阵信息迭代
最终更新新的状态相当于是忘记之后剩下的部分与新添加信息的权重加和。
LSTM-更新叠加
第三部分是:决定输出h_{t},输出由tanh函数激活,但要乘以一个sigmoid函数激活后的输出权重。
LSTM-输出
总体上来说,要掌握几个要点:
1.LSTM模块当中的线就是状态矩阵C和输出h的流动,一般来说变动很少,主线是最上面那条直线,其他的线都是对这条主要流动线进行微加工。
2.里面有一些黄色方块代表层:sigmoid激活层输出0到1的值,代表权重;tanh层表示对输入进行激活,输出新的候选值。
3.粉色的部分代表操作,x号代表矩阵点乘,+代表添加,tanh代表运算(跟tanh层是一样的函数,但是这里的是输出的是预测值)
4.整体流程是:遗忘→根据现有的输入和上一个cell的输出更新状态→根据现有的状态输出预测值
信息全局化处理
有效的门机制,更好解决梯度问题
Seq2Seq与RNN有着密切的关系,Seq2Seq模型是输出的长度不确定时采用的模型,这种情况一般是在机器翻译的任务中出现,将一句中文翻译成英文,那么这句英文的长度有可能会比中文短,也有可能会比中文长,所以输出的长度就不确定了。如下图所,输入的中文长度为4,输出的英文长度为2。
在网络结构中,输入一个中文序列,然后输出它对应的中文翻译,输出的部分的结果预测后面,根据上面的例子,也就是先输出“machine”,将"machine"作为下一次的输入,接着输出"learning",这样就能输出任意长的序列。机器翻译、人机对话、聊天机器人等等,这些都是应用在当今社会都或多或少的运用到了我们这里所说的Seq2Seq。
Seq2Seq属于encoder-decoder结构的一种,这里看看常见的encoder-decoder结构,基本思想就是利用两个RNN,一个RNN作为encoder,另一个RNN作为decoder。
encoder负责将输入序列压缩成指定长度的向量,decoder则负责根据语义向量生成指定的序列,其中要说明的是decoder有两种模式,分别是1语义向量只做初始化参数参与运算
2语义向量参与解码的整个过程。
语义向量只作初始化参数参与运算
可处理输出长度不确定的任务
似乎是为了应对Facebook纯用CNN来做seq2seq的“挑衅”,google就纯用attention,并发表著名的《Attention is All You Need》。
为什么下面即将介绍的attrntion会瞬间超过rnn与lstm的热度呢?
记住RNN和LSTM及其衍生主要是随着时间推移进行顺序处理请参考下图中的水平箭头
RNN中的顺序处理
水平箭头的意思是长期信息需在进入当前处理单元前顺序遍历所有单元。这意味着其能轻易被乘以很多次<0的小数而损坏。这是导致梯度消失问题的原因。为此,今天被视为救星的LSTM模型出现了,有点像ResNet模型,可以绕过单元从而记住更长的时间步骤。因此,LSTM可以消除一些梯度消失的问题。
LSTM中的顺序处理
从上图可以看出,这并没有解决全部问题。我们仍然有一条从过去单元到当前单元的顺序路径。事实上,这条路现在更复杂了,因为它有附加物,并且忽略了隶属于它上面的分支。毫无疑问LSTM和GRU(Gated Recurrent Uni,是LSTM的衍生)及其衍生,能够记住大量更长期的信息,但是它们只能记住100个量级的序列,而不是1000个量级,或者更长的序列。
#下面是对attention的介绍#
attention提出,可以说是NLP另一里程碑式的存在。带attention的seq2seq,远超过上一年的原始seq2seq。Attention机制最关键点是一句话,分配权重系数。
attention机制的本质是从人类视觉注意力机制中获得灵感(可以说很‘以人为本’了)。可理解为我们视觉在感知东西的时候,一般不会是一个场景从到头看到尾每次全部都看,而往往是根据需求观察注意特定的一部分。而且当我们发现一个场景经常在某部分出现自己想观察的东西时,我们就会进行学习在将来再出现类似场景时把注意力放到该部分上。这可以说就是注意力机制的本质内容了。至于它本身包含的‘自上而下’和‘自下而上’方式就不在过多的讨论。
Attention机制其实就是一系列注意力分配系数,也就是一系列权重参数。
下面我来举个例子:当给出一句‘我爱你’中文,要将它翻译成英文‘I love you’(target)时,利用现在深度学习最为流行的model–encoder to decoder,‘我爱你’被编码成C,然后在经过非线性函数来decoder得到目标Target中的每一个单词。可实际上,‘我’这个元素对target中的’I’的结果是影响最大的,其他元素的影响可以说是微乎其微。但是在上述模型中,这个重要程度没有被体现出来,所以这是一个分心的模型。而与其对应的注意力模型就是要从序列中学习到每一个元素的重要程度,然后按重要程度将元素合并。
Attention函数工作机制:
attention函数共有三步完成得到attention value。
一步到位的全局联系捕捉
并行计算减少模型训练时间
模型复杂度小,参数小
相比RNN可以编码更长的序列信息
在输出序列与输入序列“顺序”不容的情况下(翻译、阅读)表现的较好
自Attention机制提出后,加入attention的Seq2seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合rnn和attention的模型,之后google又提出了解决sequence to sequence问题的transformer模型,encoder和decoder都不用RNN,换成了多个attention也可以说用 attention的结构代替了lstm,在翻译任务上取得了更好的成绩。
模型结构如下图:
和大多数seq2seq模型一样,transformer的结构也是由encoder和decoder组成。
1:左右扽别时encoder和decoder
2:enc和dec的底部是embedding;而embedding又分为两部分:input embedding和positional embedding;其中input embedding就是seq2seq中的embedding。而为什么要positional embedding呢?因为transformer中只有attention;回想一下attention,任意一对(query, key)的计算都是完全一样的,不像CNN和RNN,有一个位置或者时序的差异:CNN框住一块区域,随着卷积核移动,边缘的少量点会跟着有序变化;RNN更明显了,随着输入顺序不同(正序,倒序)而不同。因此为了体现出时序或者在序列中的位置差异,要对input加入一定的位置信息,即positional embedding。
3:enc和dec的中部分别是两个block, 分别输入一个序列、输出一个序列;这两个block分别重复N词。enc的每个block里有两个子网,分别是multihead attention和feedforward network(ffn),先别管都在干啥;dec的block里有三个子网,分别是两个multihead attention和一个ffn。这些子网后面都跟了一个add&norm(为了更好的优化深度网络,整个网络使用了残差连接&对层进行了规范化(Add&Norm))
),即像resnet一样加一个跳边,然后做一个layer norm。
Encoder部分
对于Encoder部分来说,整个的Encoder结构里包含6层,每一层里面有两层。分别是一层self-attention层和一层全连接层。需要注意的是,这里的self-attention并不是只有一层。模型中使用的是multi-head-Attention。其实就是多个self-attention,可以把每个self-attention理解为一个head,多个self-attention自然就是多头了。 前面几层的encoder的输出,会作为输入给下一层的encoder。这里要注意,每一个encoder里的两层的输出,都会进入一个add&Norm。最后的encoder会输出给后面的decoder模型。
Decoder部分
每一个单独的decoder与encoder相比,在self-attention层(decoder层中叫masked self-attention)和全连接网络层之间,多了一层Encoder-Decoder-Attention 层。decoder中有两层attention层,decoder结构中,第一层是一个multi-head-self-attention层,这个与encoder中的区别是这里是masked-multi-head-self-attention。使用mask的原因是因为在预测句子的时候,当前时刻是无法获取到未来时刻的信息的。
decoder中的第二层attention层就是一个正常的multi-head attention层。但是这里Q,K,V来源不同。Q来自于上一个decoder的输出,而K,V则来自于encoder的输出。剩下的计算就没有其他的不同了。
关于这两个attention层,可以理解为 mask-self-attention是计算当前翻译的内容和已经翻译的前文之间的关系(上下文关系),而encoder-decoder-attention 是计算当前翻译内容和编码的特征向量之间的关系。最后再经过一个全连接层,输出decoder的结果。
4:dec最后还有一个linear和softMax。
Ffn:可以理解为对每个x进行两次线性映射,也可以理解为对整个序列做一个1*1的卷积
Multihead attention: 原始的attention, 就是一个query (以下简称Q) 和一组key (以下简称K) 算相似度, 然后对一组value (以下简称V) 做加权和; 假如每个Q和K都是512维的向量, 那么这就相当于在512维的空间里比较了两个向量的相似度. 而multihead就相当于把这个512维的空间人为地拆成了多个子空间, 比如head number=8, 就是把一个高维空间分成了8个子空间, 相应地V也要分成8个head; 然后在这8个子空间里分别计算Q和K的相似度, 再分别组合V。这样可以让attention能从多个不同的角度进行结合, 这对于NMT是很有帮助的, 因为我们在翻译的时候源语言和目标语言的词之间并不是一一对应的, 而是受很多词共同影响的. 每个子空间都会从自己在意的角度或者因素去组合源语言, 从而得到最终的翻译结果.
这里需注意️:
1: 模型中使用的是multi-head-Attention。其实就是多个self-attention,可以把每个self-attention理解为一个head,多个self-attention自然就是多头了
2:前面几层的encoder的输出,会作为输入,给下一层的encoder。这里要注意,每一个encoder里两层的输出,都会进入一个add&Norm。最后的encoder会输出给后面的decoder模型。
并行运算,速度提高
建立直接的长距离依赖
在2018年之前,词向量表示的方法主要还是采用CBOW、skip-gram、GloVe等方法,这些方法都是采用一个固定维度的向量来表征每一个词汇或字符,虽然方法简单,但是会存在两个问题,
一方面是没有考虑词汇在不同语境的信息,比如”apple"在一些场景下可以表示水果(苹果),在另一些场景下可能表示苹果公司。
另一方面,采用一个固定的向量表示词汇,没有考虑到语法和语义的信息。因此,在2018年,Matthew等人提出了一种新的方法——ELMo(Embeddings from Language Models),ELMo训练的不再只是一个词向量,而是一个包含多层BiLstm的模型,然后对于每一个句子,都需要传入该模型,分别拿到每个时间步在每个层的输出,最后在具体的NLP任务中,再单独训练每一层的权重向量,对每一层的向量进行线性加权作为每个词汇的最终向量表示。
这样一来,每个词汇在不同的上下文语境中,都可以得到不同的向量表示,因此,在一定意义上可以解决一词多义的问题。
如上图所示,可看出Elmo模型分左右两部分且传递方向相反故称之为双向语言模型。双向语言模型又分为前向语言模型和后向语言模型。
前向语言模型会根据前面的词汇预测当前词汇的概率,最终对每个时间步的输出概率进行累积来作为整个序列的预测概率,并期望该概率越大越好。
后向语言模型则与前向语言模型相反,后向语言模型将词汇序列进行逆排序,因此,对于每一个时间步都是基于后面词汇信息计算预测概率
双向语言模型则将前向语言模型和后向语言模型进行结合,直接最大化前向和后向语言模型的对数概率。
同时考虑语境、语义、语法问题,解决了一词多义的情况
BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,因为decoder是不能获要预测的信息的。模型的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。
BERT模型进一步增加词向量模型泛化能力,充分描述字符级、词级、句子级甚至句间关系特征。那是什么让BERT如此出众?
首先需要说到Embedding,这里的Embedding由三种Embedding求和而成:
其中:Token Embeddings是词向量,第一个单词是CLS标志,可以用于之后的分类任务,Segment Embeddings用来区别两种句子,因为预训练不光做LM还要做以两个句子为输入的分类任务,Position Embeddings和之前文章中的Transformer不一样,不是三角函数而是学习出来的。
其次需要说的是Bert的预训练模型:
Masked Language Model:传统的LM要学习语言特征,都是以前文预测下一个词为训练目标,所以不能拿两个方向的encode来训练。现有的语言模型例如ELMo号称是双向LM(BiLM),但是实际上是两个单向RNN构成的语言模型的拼接。
为了利用好前面词和后面词的概率。BERT提出了Masked Language Model,也就是随机去掉句子中的部分token,然后模型来预测被去掉的token是什么。这样实际上已经不是传统的神经网络语言模型了,而是单纯作为分类问题,根据这个时刻的hidden state来预测这个时刻的token应该是什么,而不是预测下一个时刻的词的概率分布
这里的操作是随机mask语料中15%的token,然后预测masked token,那么masked token 位置输出的final hidden vectors送入softmax即可得到masked token的预测结果。这样操作存在一个问题,fine-tuning的时候没有[MASK]这个token,因此存在pre-training和fine-tuning之间的不匹配,为了解决这个问题,采用了下面的策略:80%的时间中:将选中的词用[MASK]token来代替,例如my dog is hairy → my dog is [MASK]。10%的时间中:将选中的词用任意的词来进行代替,例如my dog is hairy → my dog is apple。10%的时间中:选中的词不发生变化,例如my dog is hairy → my dog is hairy。
Next Sentence Prediction:很多任务都需要句子级别的关系,只有LM是不够的,还需要模型能够捕捉句子级的模式。所以Bert设计了一个句子对任务,该任务的训练语料是两句话,来预测第二句话是否是第一句话的下一句话。具体来说,选择句子A和B作为预训练样本:B有50%的可能是A的下一句,也有50%的可能是来自语料库的随机句子。
Bert预训练的Mask Language Model
Bert预训练的Next Sentence Prediction
双向Transformer的Encoder