自然语言处理(NLP)模型的发展历史
1.统计方法时期:使用贝叶斯方法、隐马尔可夫模型、概率模型等传统统计方法
2.机器学习时期:支持向量机(SVM)、决策树模型、随机森林、朴素贝叶斯等传统机器学习方法
3.深度学习革命:各种新的深度学习模型,比如CNN、RNN(以及变体LSTM、GRU)
4.Transformer架构:提出的Self-Attention机制可以更好的捕捉长距离依赖问题,同时该架构允许并行处理元素,极大的提高了训练速度
5.预训练模型:随着Bert模型的发布,预训练成为了NLP的一个新标准。这些模型首先在一个大规模语料库上进行无监督预训练,然后针对具体任务进行微调,例如GPT系列
1 从NNLM到word2Vec
NNLM(Neural Network Language Model):最早尝试使用神经网络来预测序列中下一个词的概率的模型之一
- 通过一个连续的词向量空间来表示词,使得相似的词在向量空间中距离较近。
- 将前几个词的词向量作为输入,并通过一个隐藏层来预测下一个词。
- 引入了softmax函数来计算每个词的概率分布。
Word2Vec:一种词嵌入技术,即把每个词映射到一个固定大小的向量空间中。
1.1 从向量表示到词嵌入
假设我们对求职人员进行人格测试,会给一个人的很多维度进行打分,内向/外向是其中之一,然后用0~100(内向→外向)来表示程度,假设有一个叫Jay的人得分为38/100,则可以用下图表示该得分:
为了更好的表达数据,我们将范围压缩至-1到1(类似归一化):
对于一个人,一个维度显然不足,我们再加一个得分作为第二维度:
我们就可以认为这个人的性格被这个向量表示出来了,假设我们想找的另一个和Jay性格相仿的人,则可使用该表示法进行比较。
由图可得,Person #1更合适,但如果是三维、四维或者更高维,则可以使用余弦相似度公式进行计算
以上述例子计算得
也可得出Person #1更合适,这就是将性格向量化,对于字词也是同样得,我们可以将词向量化,而生成词向量(Word Vectors) 的具体方法就是词嵌入(Word Embeddings) ,词嵌入是指将单词映射到一个稠密的向量空间中的过程,其中的每个维度都代表了某种语言特征。
这里以GloVe向量为例,它是一种用于生成词向量的方法,下面是的单词’king’的词嵌入:
[ 0.50451 , 0.68607 , -0.59517 , -0.022801, 0.60046 , -0.13498 , -0.08813 , 0.47377 , -0.61798 , -0.31012 , -0.076666, 1.493 , -0.034189, -0.98173 , 0.68229 , 0.81722 , -0.51874 , -0.31503 , -0.55809 , 0.66421 , 0.1961 , -0.13495 , -0.11476 , -0.30344 , 0.41177 , -2.223 , -1.0756 , -1.0783 , -0.34354 , 0.33505 , 1.9927 , -0.04234 , -0.64319 , 0.71125 , 0.49159 , 0.16754 , 0.34344 , -0.25663 , -0.8523 , 0.1661 , 0.40102 , 1.1685 , -1.0137 , -0.21585 , -0.15155 , 0.78321 , -0.91241 , -1.6106 , -0.64426 , -0.51042 ]
根据它们的值对单元格进行颜色编码(如果它们接近2则为红色,接近0则为白色,接近-2则为蓝色):
然后将’king’与其他单词进行比较
可以明显看到’Man’和’Woman’更相似,即该词嵌入很好的展示了单词的联系,下面再举一个例子:
大家可以根据色条的相似度,得出不同词之间的相似情况。
1.2 NNLM模型
NNLM的核心是一个多层感知机,它将词向量序列映射到一个固定长度的向量表示,然后将这个向量输入到一个softmax层中,计算出下一个词的概率分布,假设我们输入’Thou shalt’,然后该模型会按下面三个步骤进行预测:
最后’not’的得分最高,所以选择向用户推荐’not’。
其中Look up Embedding,由于模型在经过另外一个训练之后可以生成一个映射单词表所有单词的矩阵,也称词嵌入矩阵,从而在进行预测的时候,我们可以在这个词嵌入矩阵中查询输入的单词。
1.2.1 如何构建词嵌入矩阵
首先收集大量的文本数据,然后建立一个滑动窗口(滑动窗口的大小可以自定义),构建滑动窗口内+滑动窗口后一个单词的训练+预测样本,就可以得到一套用于训练用的数据集
下面是数据集,即不同的单词组合后面会出现的单词:
1.3 Word2Vec的两种架构:CBOW和Skipgram
CBOW: 为了更好的预测,不仅要考虑目标单词的前两个单词,还要考虑其后两个单词,这种通过“通过上下文词汇预测当前词”的架构就是连续词袋(CBOW)
Skipgram: 根据当前词推测当前单词的前后单词的架构就是Skipgram
1.4 Word2vec训练流程
- 首先创建两个矩阵:词嵌入Embedding矩阵(是网络Onehot层到Embedding层映射的网络参数矩阵,相当于一个初始化的Embedding矩阵)、上下文Context矩阵
- 前向传播:将上下文词的词向量求平均或相加,形成一个上下文向量,将上下文向量乘以一个权重矩阵(通常称为输出权重矩阵),并通过softmax函数计算每个词作为中心词的概率分布。
- 损失计算:计算预测的概率分布与真实标签(中心词的真实索引)之间的交叉熵损失。
- 反向传播:利用损失函数的梯度更新词向量矩阵和输出权重矩阵。
- 迭代重复
训练结束后,会得到一个全新的词嵌入Embedding矩阵,并用于之后的预测
2 从Seq2Seq到Seq2Seq with Attention
2.1 Seq2Seq(Sequence-to-sequence)
字面意思:输入一个序列,输出另一个序列
2.1.1 Encoder-Decoder模型
特别适用于序列到序列(seq2seq)的任务,如机器翻译、文本摘要、对话系统等。
-
编码器(Encoder):编码器负责读取输入序列,并将其转换为一个固定长度的向量,这个向量被称为“上下文向量”或“编码向量”。编码器通常是一个递归神经网络(RNN),它可以逐个元素地处理输入序列,并生成一个状态向量,最终状态向量就是编码向量。
-
解码器(Decoder):解码器接收编码器产生的上下文向量,并根据这个向量生成输出序列。解码器也是一个RNN,它通过逐个元素地生成输出序列中的元素,每次生成一个新元素时都会考虑到之前的状态和编码向量。
2.2 Attention机制
Encoder-Decoder模型有一个缺陷,序列较长时,所有语义完全转换为一个中间语义向量C来表示,可能会丢失许多信息,而Attention机制就让Eecoder 不再将整个输入序列编码为固定长度的「中间向量C」,而是编码成一个向量的序列(包含多个向量)。
Attention机制通过计算输入序列中各个部分与当前任务的相关性,从而为每个部分分配一个权重,这些权重反映了各个部分对当前任务的重要性。
假设图书馆(source)里有很多书(value),为了方便查找,我们给书做了编号(key)。当我们想要了解漫威(query)的时候,我们就可以看看那些动漫、电影、甚至二战(美国队长)相关的书籍。
计算步骤
- 计算query和key的点积,得到权值
- 将权值归一化,即将原始计算分值整理成所有元素权重之和为1的概率分布,或者说通过SoftMax的内在机制更加突出重要元素的权重
- 将权重和 value 进行加权求和
最后便会得到一个Attention值,反应某元素对该任务的重要性。
2.2.1 举例说明Attention的计算步骤
假设输入为:The cat is sitting on the mat
我们想将该句子翻译为中文,步骤如下
- 将句子转化为词嵌入向量序列(Embedding Vectors)
- 输入到Encoder中,Encoder会计算每个输入词的隐藏状态 h i h_{i} hi, i i i表示在输入序列中的位置
- 初始化解码器状态,假设要生成第一个词“这”(对应“The”),解码器会根据编码器的最后一个隐藏状态或所有隐藏状态的一个加权平均和来初始化解码器的状态,该初始状态包含了整个输入句子的信息
- attention机制,计算注意力得分、使用softmax函数将得分转化为注意力权重,这些权重决定了输入序列中的哪些位置最重要
- 计算上下文向量,使用注意力权重来加权求和所有Encoder隐藏状态
- 结合上下文向量和解码器的状态(通常是拼接),再输入到一个前馈神经网络,最后会得到一个输出词汇的概率分布表,选取概率最高的输入
- 重复该步骤,直到所有词汇翻译完毕
3 Transformer架构
3.1 Transformer编码
Transformer的提出即是为了更好的解决机器翻译问题,下面是一个简单步骤说明:
一个输入句子经过Transformer后,会被翻译成另一个句子,我们聚焦于中的模型:
其中:
- 编码组件部分由一堆Encoder构成(具体个数可以调)
- 解码组件部分也是由相同数量的Decoder组成
然后我们再聚焦于单个编码器和解码器:
步骤如下:
- 句子输入到编码器后,经过self-attention层,会帮助编码器在对每个单词编码时关注输入句子中的的其他单词,即可以捕捉到输入句子中词语之间的关系,而不仅仅是相邻的词。
- 然后传入前馈神经网络,进行特征提取
- 流入解码器,解码器也有self-attention层,但用于处理输出序列;编码-解码注意力层许解码器关注编码器的输出,帮助模型确定输入句子中最相关的部分,从而提高翻译的准确性;最后传入前馈神经网络,进行特征提取然后输出
3.1.2 举例说明
1.首先将每个输入词转化为词向量(这里的维度是演示作用,实际中可以自己调整)
2.输入到解码器中
便发现了Transformer的两个特点:
- 每个单词都是单独流入编码器,而不是排队进入
- 在前馈神经网络中,计算是独立的,即可以并行计算
3.2 Self-attention机制
假定现在要翻译下列句子:
“The animal didn’t cross the street because it was too tired”,那其中的it是指animal还是street呢?对人很容易,但对算法很难
但通过self-attention机制后,模型会得出it和animal更相关
3.3 self-attention计算方法
3.4 求和归一化
Transformer架构中,还需再提一下编码器中的一个细节:每个编码器中的每个子层都有一个残差连接,然后做了一个:层归一化(layer-normalization)
残差连接 (Residual Connection):残差连接引入了跳跃连接的思想,使得输入可以直接绕过一层或多层传递到后面的层。这种连接有助于缓解深层网络中的梯度消失/爆炸问题,并促进信息和梯度的流动。
层归一化 (Layer Normalization):层归一化是在神经网络层中对激活值进行归一化的技术,它可以帮助控制每一层的输出的统计特性(均值和方差),从而减少内部协变量移位(internal covariate shift),使得训练更加稳定。
3.5 解码器中的两个注意力层
我们观察解码器,会发现其中有两个注意力层
-
一个带masked的Multi-Head Attention,本质是Self-Attention,该自注意力层只允许关注已输出位置的信息,屏蔽了未输出的信息。
例如在翻译“我是学生”为“I am a student”的过程中,当解码器开始生成“I”时,它只能看到自己之前生成的词(在这里是起始标记),而不能看到后续的任何词。 -
一个不带masked的Multi-Head Attention,即Encoder-Decoder Attention,这个注意力层允许解码器关注编码器产生的表示,以找到输入序列中与当前生成的输出最相关的部分。这有助于解码器在生成每个词时,能够利用到整个输入句子的信息。
例如在翻译“我是学生”为“I am a student”的过程中,当解码器生成“I”时,它不仅会考虑之前生成的词,还会通过编码器-解码器注意力层去关注输入序列“我是学生”中的相关信息,从而更好地生成下一个词。 -
List item
3.6 最后的线性层和softmax层
它们的作用是把Decoder输出的浮点型向量,变成一个词。
假设我们的模型词汇表是10000个英语单词,它们是从训练数据集中学习的。那logits向量维数也是10000,每一维对应一个单词的分数。然后,softmax层将这些分数转化为概率(全部为正值,加起来等于1.0),选择其中概率最大的位置的词汇作为当前时间步的输出。
4 BERT模型
4.1 从Word Embedding到ELMO
4.1.1 Word Embedding的缺陷
在第一部分中,介绍了word2vec技术,作为Word Embedding的一类,它也存在Word Embedding的一些缺陷,便是无法处理多义词问题
4.1.2 ELMo(Embedding from Language Models)
是一种创新的词嵌入方法,它通过语言模型来生成词向量,特别之处在于它能够提供上下文相关的词表示,有着以下特点:
- 上下文敏感性: 与传统的词嵌入方法(如Word2Vec或GloVe)不同,ELMo为每个词生成的向量不是固定的,而是取决于该词出现的上下文。这意味着同一个词在不同的句子中可能会有不同的向量表示,这更符合自然语言的真实使用情况。
- 双向语言模型: ELMo 使用了两个长短期记忆网络(LSTM)作为语言模型,一个正向LSTM(从左到右读取文本),一个反向LSTM(从右到左读取文本)。通过结合这两种方向的语言模型,ELMo能够捕捉到词在句子中的前后关系。
- 层次结构: ELMo的LSTM语言模型有多层,每一层都可以捕获不同粒度的语义信息。最终的词嵌入是这些层的加权平均,这使得ELMo能够综合考虑局部和全局的上下文信息。
一个句子通过ELMo之后会得到三个Embedding,如下图所示:
假设我们将“i am a student”翻译为“我是学生”
- 预训练阶段: ELMo 需要在大量未标注的文本数据上进行预训练,以生成上下文敏感的词向量。输入“i am a student”,会分别通过正向和反向LSTM,去获得每个词基于前面词/后面词的概率分布。
- 第一个Embedding,是单词的Word Embedding
- 第二个Embedding,是双层双向LSTM中第一层LSTM对应单词位置的Embedding,这层编码单词的句法信息更多一些
- 第三个Embedding,是双层双向LSTM中第二层LSTM对应单词位置的Embedding,这层编码单词的语义信息更多一些
通过ELMo生成的词向量,比传统的词嵌入技术(如 Word2Vec 或 GloVe)更具有动态性和语境适应性,因此在输入到分类/预测模型中之后,会有更好的效果。
4.2 微调(Fine-tuning)
把在源数据集上训练的源模型的能力迁移到新数据新模型上
迁移学习(Transfer learning) ,就是把已训练好的模型(预训练模型)参数迁移到新的模型来帮助新模型训练。现迁移学习有以下三种手段:
- Transfer Learning:冻结预训练模型的全部卷积层,只训练自己定制的全连接层
- Extract Feature Vector: 先计算出预训练模型的卷积层对所有训练和测试数据的特征向量,然后抛开预训练模型,只训练自己定制的简配版全连接网络
- Fine-tuning:冻结预训练模型的部分卷积层(通常是靠近输入的多数卷积层,因为这些层保留了大量底层信息)甚至不冻结任何网络层,训练剩下的卷积层(通常是靠近输出的部分卷积层)和全连接层
假设我们想从图像中识别出不同种类的椅子,然后将购买链接推荐给用户。一种可能的方法是:
先找出100种常见的椅子,为每种椅子拍摄1,000张不同角度的图像,便收集到的10万张图像数据集(目标数据集)
- 在源数据集(如ImageNet数据集)上预训练一个神经网络模型,即源模型
- 创建一个新的神经网络模型,即目标模型,它复制了源模型上除了输出层外的所有模型设计及其参数,我们假设这些模型参数包含了源数据集上学习到的知识,且这些知识同样适用于目标数据集,我们还假设源模型的输出层与源数据集的标签紧密相关,因此在目标模型中不予采用。
- 为目标模型添加一个输出大小为目标数据集类别个数的输出层,并随机初始化该层的模型参数
- 在目标数据集上训练目标模型,我们将从头训练输出层,而其余层的参数都是基于源模型的参数微调得到的
4.3 生成式的预训练之GPT:预训练(单向Transformer) + Fine-tuning
ELMo方法使用的是LSTM去提取数据特征,但随着Transformer的出现,它的特征抽取能力要强于LSTM,所以特征提取自然就采用了Transformer,但它采用的是单向Transformer
4.3.1 为什么要采用单向transformer呢?
GPT使用的Transformer结构就是将Encoder中的Self-Attention替换成了Masked Self-Attention,即屏蔽了未输出的词,理由如下:
- 生成连贯的文本序列。
- 避免信息泄露,即模型不会提前知道它还没有生成的信息。
4.4 BERT:双向Transformer版的GPT
4.4.1 BERT模型的架构:预训练(双向Transformer) + Fine-Tuning
即BERT模型综合了ELMo的双向优势和Transformer的特征提取优势
下图是BERT、GPT、ELMo的结构图对比:
4.4.2 BERT对输入、输出部分的处理
为了适配多任务下的迁移学习,BERT设计了更通用的输入层和输出层。
BERT的输入部分是个线性序列,两个句子之间通过分隔符「SEP」分割,最前面是起始标识「CLS」,每个单词有三个embedding:
- 单词embedding,有的单词会拆分成一组有限的公共子词单元,例如下图示例中‘playing’被拆分成了‘play’和‘ing’
- 句子embedding,用于区分两个句子,例如B是否是A的下文(对话场景,问答场景等)
- 位置信息embedding,句子有前后顺序
把单词对应的三个embedding相加,就形成了BERT的输入。
BERT在预训练的输出部分如参考下图:
4.4.3 BERT的创新点
- 掩码语言模型(Masked Language Model, MLM):在训练过程中,输入的一段文本会被随机地遮盖一部分词汇(通常大约15%的词汇会被遮盖)。这些被遮盖的词汇将被特殊标记(如[MASK])替换,能更好地捕捉到词汇的多义性和上下文依赖性。
- 下一句预测(Next Sentence Prediction, NSP):即判断句子B是否是句子A的下文,这个关系保存在BERT输入表示图中的[CLS]符号中,通过NSP任务,BERT模型可以学到句子级别的上下文关系
参考文献
ransformer通俗笔记:从Word2Vec、Seq2Seq逐步理解到GPT、BERT