BERT中使用Transformer作特征提取器,其实只使用了Transformer的Encoder。
那么Decoder去哪了呢?显然是被BERT改造了。Transformer其实是个完整地seq-to-seq模型,可以解决诸如机器翻译、生成式QA这种输入输出为不定长句子的任务,在Transformer中,它使用Encoder做特征提取器,然后用Decoder做解析,输出我们想要的结果。
而对于BERT,它作为一个预训练模型,它使用固定的任务——language modeling来对整个模型的参数进行训练,这个language modeling的任务就是masked language model,所以它是一个用上下文去推测中心词[MASK]的任务,故和Encoder-Decoder架构无关,它的输入输出不是句子,其输入是这句话的上下文单词,输出是[MASK]的softmax后的结果,最终计算Negative Log Likelihood Loss,并在一次次迭代中以此更新参数。所以说,BERT的预训练过程,其实就是将Transformer的Decoder拿掉,仅使用Encoder做特征抽取器,再使用抽取得到的“特征”做Masked language modeling的任务,通过这个任务进行参数的修正。
当然了,BERT不仅仅做了MLM任务,还有Next Sequence Prediction,这个由于后序验证对模型的效果提升不明显,所以没有赘述。
注意:我们常说,xxx使用Transformer作为特征抽取器,这其实在说用Transformer的Encoder(主要是Self-Attention和短路连接等模块)做特征抽取器,和Decoder啥关系也没有
Transformer block是由multi-head self-attention + FFN构成的?
其实论文原文以及配图就是这样写的,但这么说不确切。如果你仔细地看过Transformer部分的源码,你会发现,在multi-head self-attention和FFN层之间,还有一个“intermediate layer”,即中间层,【代码详见此处】。这个中间层将前面Attention-layer的hidden size扩大了4倍,然后再做一次非线性变换(即过一个激活函数,如gelu、relu),再将hidden size变回原size。中间这部分的功能,我个人理解,有点类似于“特征组合器”,增大神经元个数,增强Transformer对于distributed的文本特征的组合能力,从而获取更多、更复杂的语义信息。此外,中间层是Transformer中唯一一个过了激活函数的layer,所以也引入了非线性信息,当然从理论上也对提升模型的拟合不同语义信息能力有帮助。(当然,BERT预训练的MLM任务中,在bert_model的输出之后,在接softmax+将结果计算loss之前,有一个hidden_size不变的线性变换Linear + 激活函数激活 + LayerNorm的过程,【代码详见此处】,这里也有个激活函数,但这并非Transformer的结构,这属于接了下游MLM任务的结构,故真正Transformer-block中的非线性映射,只在中间层的激活函数引入)
实际上,“intermediate layer”在bert代码里是集成到FFN类中的,但由于很多人经常把FFN层直接当做一次线性变换(即简单的nn.Linear layer)而忽略了其中的intermediate layer,故在这里单拎出来加以解释。
————————————————
版权声明:本文为CSDN博主「illusion」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41712499/article/details/103993879
Transformer和BERT的位置编码有什么区别?
BERT的位置编码是学习出来的,Transformer是通过正弦函数生成的。
原生的Transformer中使用的是正弦位置编码(Sinusoidal Position Encoding),是绝对位置的函数式编码。由于Transformer中为self-attention,这种正余弦函数由于点乘操作,会有相对位置信息存在,但是没有方向性,且通过权重矩阵的映射之后,这种信息可能消失。
BERT中使用的是学习位置嵌入(learned position embedding),是绝对位置的参数式编码,且和相应位置上的词向量进行相加而不是拼接。
BERT模型结构是什么?
利用Transformer结构构造了一个多层双向的encoder网络。
BERT、GPT、ELMO之间的区别是什么?
(1)特征提取器:elmo采用LSTM进行提取,GPT和bert则采用Transformer进行提取。很多任务表明Transformer特征提取能力强于LSTM,elmo采用1层静态向量+2层LSTM,多层提取能力有限,而GPT和bert中的Transformer可采用多层,并行计算能力强。
(2)单/双向语言模型:
GPT采用单向语言模型,elmo和bert采用双向语言模型。但是elmo实际上是两个单向语言模型(方向相反)的拼接,这种融合特征的能力比bert一体化融合特征方式弱。
GPT和bert都采用Transformer,Transformer是encoder-decoder结构,GPT的单向语言模型采用decoder部分,decoder的部分见到的都是不完整的句子;bert的双向语言模型则采用encoder部分,采用了完整句子。
————————————————
版权声明:本文为CSDN博主「麦格芬230」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42295205/article/details/106152707
————————————————
版权声明:本文为CSDN博主「麦格芬230」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42295205/article/details/106152707
positionencoding
PositionalEmbedding的成分直接叠加于Embedding之上,使得每个token的位置信息和它的语义信息(embedding)充分融合,并被传递到后续所有经过复杂变换的序列表达中的线性组合得到, 也就是乘上某个线性变换矩阵就得到了
Feed Forward Network
每一层经过attention之后,还会有一个FFN,这个FFN的作用就是空间变换。FFN包含了2层lineartransformation层,中间的激活函数是ReLu。其实,FFN的加入引入了非线性(ReLu激活函数),变换了attention output的空间,从而增加了模型的表现能力。把FFN去掉模型也是可以用的,但是效果差了很多。
feed-forward network: 实现 很简单,如果你用 Dense这种实现,那就简单了, ffn_1 = nn.Dense(hidden_size, activation='relu')
ffn_2 = nn.Dense(units, activation='identity')
ffn_2(ffn_1(X))
如果自己写layer 那需要 做一个 reshape操作,因为input 是 3-D (batch,seq,embedding), 这里推荐大家用conv1d去写, kernel_size设置成1就行(后续可以和cv的一些常见操作联系起来,便于理解feed-forward network的意义),另外要注意的是这边第一层的activation是relu,后面 一层是没有activation的
这里如何去理解ffn(feed-forward network)的作用可以从 两个层面去理解:
模型的capacity,第一层映射到更大的空间,无外乎就是用了更大的网络,提升了模型的空间,没有ffn当然也可以,但是效果却明显差了,这点我做过实验
’unique‘ representation: 之前提到推荐用conv1d的方式去实现,会发现这个做法是在cv中网络的最后的位置尝尝出现的,是一个localized transform,因为在前面的attention层的表示中,每个位置已经融合了其他位置的信息了,这里我们想要巩固每一个位置他们自己的 'unique' representation, 做法就是用kernel_size = 1 的conv1d,这个操作不考虑周边邻居的信息,只会对自己的位置的representation进行transform. 这边看上去有点难以理解,其实是说的通的,虽然我们希望每个位置在空间上去融合不同位置的信息(无论是图片 conv block 实现,还是句子 attention 实现),但是我们还是会希望每个位置去保持/巩固 自己原有的信息(而不是简单的对每个位置的信息做加权平均,这里从前面一层的结构 input = input+attention 也可以看出),这里的ffn 我会理解去巩固自己原有信息来获取一个unique representation,不然结果可能每个位置的最后输出会差不太多 (这里其实可以做个实验去掉ffn 看看每个attention block 的每个位置的输出会不会比较相似)
multi-head
Graph Attention Networks‘ ,attention 可以让你关注重点的部分,但是attention 机制使得信息的交互很有限,会损失两者之间一些有用的信息,而使用multi-head 可以增加网络空间,让更多的信息传输
Dropout说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征