BERT相关——(6)BERT代码分析
BERT相关——(6)BERT代码分析
引言
上一篇介绍了如何利用HuggingFace的transformers从头开始预训练BERT模型,所使用的AutoModelForMaskedLM函数可以实例化为transformers library中现有的masked language model中的模型类之一。这一篇将分析transformers中实现BERT模型相关的源码,以便我们可以设计自己的模型。
回顾一下从头开始预训练BERT模型的几个步骤,分别对应了各个模块的源码:
利用Tokenizer对语料分词——BertTokenizer;
重新配置模型——BertModel(其中又包括了各个子模块,如下图所示);
编写满足训练任务的处理代码:每个句子进行掩膜并组成句子对的正负样本集合以完成BERT训练的两个任务——数据预处理相关的类;
数据输入模型进行训练——数据加载入模型相关类如:Dataset、DataLoader、DataCollator。
这一篇主要分析前两步的代码。
Tokenizer对语料分词——BertTokenizer
Bert ...
BERT相关——(5)Pre-train Model
Bert相关——(5)Pre-train Model
引言
过去NLP领域通常是一个任务一个模型,但今天已经逐渐迈向:模型先了解普遍的语言,再去解各式各样的NLP任务——pre-train+fine tuning范式。
根据大量无标注的文字资料来训练一个模型,希望这个模型能读懂文字,这个训练过程就叫Pre-train预训练。接下来针对不同的下游任务再收集少量对应的、有标注的训练资料去Fine-tune微调预训练的模型,然后就可以让机器去完成不同的下游任务。
之前介绍了BERT的原理,BERT可以用于Pre-train+fine tuning范式。
这篇先介绍BERT的pre-train方法,并介绍如何利用HuggingFace(抱抱脸)的Transformers包进行BERT预训练。
Pre-train
Pre-train Model做的是”represent each token by a embedding vector“,这个vector应该包含了这个token的语义,意思相近的token应该有相似的embedding,且embedding的某些维度应该是代表某些特 ...
BERT相关——(4)GPT-2模型
BERT相关——(4)GPT-2模型
引言
与BERT不同,GPT-2 是使用 Transformer 的 Decoder 模块(但实际上也不是完整的Decoder模块)构建的。且GPT-2 和传统的语言模型一样,一次输出一个token,这也与BERT不同。此外,GPT-2 能够处理 1024 个 token,这比原始的Transformer能处理的最长序列(512)要长。
因为之前“Transformer相关”系列的博客已经将 Transformer 的 Decoder 模块解剖过了,所以在基于Transformer 内部模块的模型介绍中,对这部分的内容都会比较简单地带过。有易忘记得回看一下之前的内容~
GPT-2模型
GPT-2模型结构
处理非监督文本\((y_1,y_2,...,y_m)\)的普通方法是用语言模型去最大化语言模型的极大似然。
\(L_1(X)=\sum_i\log P(y_i|y{i−k},...,y{i−1}:θ)\)
OpenAI 的 GPT-2 使用了与Transformer 中原始Decoder 模块非常类似的模块进行堆叠,但它们去掉了第二 ...
BERT相关——(3)BERT模型
BERT相关——(3)BERT模型
引言
BERT是一种基于微调的多层双向Transformer编码器,但实际上BERT只包括了Transformer的Encoder结构。
BERT
BERT模型结构
BERT输入与原始Transformer类似(input embedding和position encoding结合),然后进入由多个Encoder堆叠而成的Encoder堆栈;最后进行输出。
BERT有两个版本的BERT模型,在两个版本中前馈大小都设置为4层:
BERT BASE:L=12,H=768,A=12,Total Parameters=110M
BERT LARGE:L=24,H=1024,A=16,Total Parameters=340M
其中层数(即Transformer blocks块)表示为L,隐藏大小表示为H,自注意力的数量为A。
BERT设计了两种方式来更好地学习Contextualized Word Embedding。
Masked Language Model(MLM 语言模型)
Encoder中的Self Attent ...
BERT相关——(2)Contextualized Word Embedding和ELMO模型
BERT相关——(2)Contextualized Word Embedding和ELMO模型
引言
文字要如何转为数字化表示呢?
文字特征表示
1-of-N Encoding
其实就是把字典作one-hot编码。每一个词汇都当作一个不同的符号,最常见的做法就是1-of-N Encoding,如下图所示,把词表中的每一个词用一个独热编码表示。这种编码下,每个词汇都是完全没有关系的(特征表示向量正交)。
Word Class
Word Class是将词表中每个词分类,用这个类别表示其中的所有词汇,但仍然太粗糙了,忽视了同一类中每个词的意义。
Word Embedding
Word Embedding是指把每一个词汇都用高维向量表示,这个向量的每一个维度可能就表示了这个词汇某些方面的意思。这样语义相近的词汇,其向量也更加接近,如上图所示,run和jump都是动词,它们的高维向量经过降维后显然更接近。
Contextualized Word Embedding
Word Embedding仍有一个问题,那就是同一个词汇,无论上下文如何变化,其表示都是固定的,无法表达 ...
BERT相关——(1)语言模型
BERT相关——(1)语言模型
引言
BERT模型的全称是Bidirectional Encoder Representations from Transformers,它是一种基于Transformer中Encoder结构的新型语言模型,18年底由谷歌提出。自它提出以后,NLP逐步进入了BERT时代,基于BERT改进的模型相继霸榜。
这一篇开始的“BERT相关”的博客会总结BERT触及的相关知识,帮助更好地理解BERT家族的模型。
想深入了解BERT模型和BERT家族中的模型,我们需要知道语言模型是什么和Transformer结构,后者在“Transformer相关”的系列中做了介绍,在这个系列中就不再详细解释。
语言模型Language Model-LM
语言模型是对一段文本的概率进行估计即针对文本\(Y\),计算\(P(Y)\)的概率。但语言模型仅仅对句子出现的概率进行建模,并不尝试去理解句子的内容含义。其对信息检索,机器翻译,语音识别等任务有着重要的作用。语言模型可以根据句子的一部分预测下一个词,就像下面这张图一样。
语言模型分为统计语言模型和神经网络语言模型 ...
Transformer相关——(10)Transformer代码分析
Transformer相关——(10)Transformer代码分析
引言
原理是原理,道理大概都懂了,代码也不能落下。这篇就把Transformer代码拿出来分析一下。代码来源:Pytorch编写完整的Transformer,我进一步做了一些修改和补充。
和之前一样,先把每个小模块分析一下,然后再把它们串起。来构建一整个model。
主要包括以下几个部分:
”input“ embedding
position encoding
Multi-Head attention
Add&Norm
子模块
”input“ embedding
这一步其实就是之前说的”将真实问题转为数学问题“,比如输入的数据是图像、语音、文本、用户ID等等,把这些内容转成数值矩阵。
像图像这种自带数值输入数据,可以经过转换直接作为input embedding,如下图所示:
对于语音、文本这一类数据,就需要用特殊的技巧转成数字信号输入。比如在文本中,就是使用词嵌入。示意图如下所示。
那么词嵌入(word embedding)怎么获得呢?
我觉得总的来说可以有 ...
Transformer相关——(9)训练Transformer
Transformer相关——(9)训练Transformer
引言
现在已经对Transformer的前向传播过程了解比较清晰了,这一篇总结一下Transformer模型的训练和预测过程。主要参考了李宏毅老师的21年春季的课程。
Transformer的Loss function
以语音识别任务为例,每一个语音识别过程实际上和分类任务很像。
Decoder的输出经过一个输出维度大小等于字典(或者说类别)的线性层,再经过一个softmax层求得各个词(或者说类别)的概率分布;
然后计算每一个词的概率分布和 Ground Truth之间的 Cross Entropy(Cross Entropy是分类常用的损失函数,其他任务损失函数的选择可参考:深度学习中常见的激活函数与损失函数的选择与介绍),每一个位置的预测都相当于是一次分类,最终计算一个batch总和的Cross entropy,minimize这个 Cross Entropy 的值。
由上图可以看到,在训练的时候,Decoder在输入的时候就给了正确答案(直接逐步喂入目标序列的embed ...
Transformer相关——(8)Transformer模型
Transformer相关——(8)Transformer模型
引言
千呼万唤始出来,前面做了那么多Transformer内部相关模块扩展和铺垫,现在让我们正式地来看一下Transformer模型。
这一篇会对前面的各个模块是如何在Transformer中结合的,也就是会对Transformer的结构和运行机制进行介绍。虽然各个模块都拆解完毕了,但是连接和运行机制还是有设计的嗷,又是亿个小细节~
Transformer模型由\(N\)个Encoder层和\(N\)个Decoder组合而成,接下来分别介绍单个Encoder层和Decoder层内部的结构和运行机制,然后会介绍Encoder和Decoder之间是如何交互的。
Encoder层
我们先来看Encoder部分,从最下方的\(Inputs\)开始,这里就输入了一个序列\(a_1,a_2,...a_N\)(比如在NLP中,输入了一个句子),然后获得每一项\(a_i\)的embedding(嵌入),这里的embedding其实是\(a_i\)的特征向量。
接着利用前面提到的位置编 ...
Transformer相关——(7)Mask机制
Transformer相关——(7)Mask机制
引言
上一篇结束Transformer中Encoder内部的小模块差不多都拆解完毕了,Decoder内部的小模块与Encoder的看上去差不多,但实际上运行方式差别很大,小模块之间的连接和运行方式下一篇再说,这里我们先来看一下Decoder内部多头注意力机制中的一个特别的机制——Mask(掩膜)机制。
Mask机制
Mask机制经常被用于NLP任务中,按照作用总体来说可以分成两类:
用于处理非定长序列的padding mask(非官方命名);
用于防止标签泄露的sequence mask(非官方命名)。
Transformer中同时用到了这两种Mask机制。
padding mask
在NLP任务中,文本通常是不定长的,所以在输入一个样本长短不一的batch到网络前,要对batch中的样本进行truncating截断/padding补齐操作,以便能形成一个张量的形式输入网络,如下图所示。对于一个batch中过长的样本,进行截断操作,而对于一个长度不足的样本,往往采用特殊字符"<PAD> ...