0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

尝试用QA的形式深入不浅出BERT/Transformer的细节知识点

深度学习自然语言处理 来源:深度学习自然语言处理 作者:深度学习自然语言 2020-11-24 10:02 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

随着 NLP 的不断发展,对 BERT/Transformer 相关知识的研究应用,也越来越细节,下面尝试用 QA 的形式深入不浅出 BERT/Transformer 的细节知识点。

不考虑多头的原因,self-attention 中词向量不乘 QKV 参数矩阵,会有什么问题?

为什么 BERT 选择 mask 掉 15% 这个比例的词,可以是其他的比例吗?

使用 BERT 预训练模型为什么最多只能输入 512 个词,最多只能两个句子合成?

为什么 BERT 在第一句前会加一个 [CLS] 标志?

Self-Attention 的时间复杂度是怎么计算的?

Transformer 在哪里做了权重共享,为什么可以做权重共享?

BERT 非线性的来源在哪里?

BERT 的三个 Embedding 直接相加会对语义有影响吗?

Transformer 的点积模型做缩放的原因是什么?

在 BERT 应用中,如何解决长文本问题?

1.不考虑多头的原因,self-attention 中词向量不乘 QKV 参数矩阵,会有什么问题?

self-attention 的核心是「用文本中的其它词来增强目标词的语义表示」,从而更好的利用上下文的信息。

self-attention 中,sequence 中的每个词都会和 sequence 中的每个词做点积去计算相似度,也包括这个词本身。

如果不乘 QKV 参数矩阵,那这个词对应的 q,k,v 就是完全一样的。

在相同量级的情况下, 与 点积的值会是最大的(可以从 “两数和相同的情况下,两数相等对应的积最大” 类比过来)。

那在 softmax 后的加权平均中,该词本身所占的比重将会是最大的,使得其他词的比重很少,无法有效利用上下文信息来增强当前词的语义表示。

而乘以 QKV 参数矩阵,会使得每个词的 q,k,v 都不一样,能很大程度上减轻上述的影响。

当然,QKV 参数矩阵也使得多头,类似于 CNN 中的多核,去捕捉更丰富的特征 / 信息成为可能。

2.为什么 BERT 选择 mask 掉 15% 这个比例的词,可以是其他的比例吗?

BERT 采用的 Masked LM,会选取语料中所有词的 15% 进行随机 mask,论文中表示是受到完形填空任务的启发,但其实「与 CBOW 也有异曲同工之妙」。

从 CBOW 的角度,这里 有一个比较好的解释是:在一个大小为 的窗口中随机选一个词,类似 CBOW 中滑动窗口的中心词,区别是这里的滑动窗口是非重叠的。

那从 CBOW 的滑动窗口角度,10%~20% 都是还 ok 的比例。

上述非官方解释,是来自我的一位朋友提供的一个理解切入的角度,供参考。

3.使用 BERT 预训练模型为什么最多只能输入 512 个词,最多只能两个句子合成一句?

这是 Google BERT 预训练模型初始设置的原因,前者对应 Position Embeddings,后者对应 Segment Embeddings

在 BERT 中,Token,Position,Segment Embeddings「都是通过学习来得到的」,pytorch 代码中它们是这样的

self.word_embeddings=Embedding(config.vocab_size,config.hidden_size) self.position_embeddings=Embedding(config.max_position_embeddings,config.hidden_size) self.token_type_embeddings=Embedding(config.type_vocab_size,config.hidden_size)

上述 BERT pytorch 代码来自//github.com/xieyufei1993/Bert-Pytorch-Chinese-TextClassification,结构层次非常清晰。

而在 BERT config 中

"max_position_embeddings":512 "type_vocab_size":2

因此,在直接使用 Google 的 BERT 预训练模型时,输入最多 512 个词(还要除掉 [CLS] 和 [SEP]),最多两个句子合成一句。这之外的词和句子会没有对应的 embedding。

当然,如果有足够的硬件资源自己重新训练 BERT,可以更改 BERT config,设置更大 max_position_embeddings 和 type_vocab_size 值去满足自己的需求。

总结下博主的话:就是 Google 规定的,想换大的可以自行尝试!

但这样的解释感觉有些欠妥,可能是 Google 尝试增大 Transorfmer 的最大长度时发现不太适合处理超长句子,所以才有了后面的 Transformer-XL。

4.为什么 BERT 在第一句前会加一个 [CLS] 标志?

BERT 在第一句前会加一个 [CLS] 标志,最后一层该位对应向量可以作为整句话的语义表示,从而用于下游的分类任务等。

为什么选它呢,因为与文本中已有的其它词相比,这个无明显语义信息的符号会「更 “公平” 地融合文本中各个词的语义信息」,从而更好的表示整句话的语义。

这里补充一下 bert 的输出,有两种:

一种是 get_pooled_out (),就是上述 [CLS] 的表示,输出 shape 是 [batch size,hidden size]。

一种是 get_sequence_out (),获取的是整个句子每一个 token 的向量表示,输出 shape 是 [batch_size, seq_length, hidden_size],这里也包括 [CLS],因此在做 token 级别的任务时要注意它。

self-attention 是用文本中的其它词来增强目标词的语义表示,但是目标词本身的语义还是会占主导的,因此,经过BERT的12层,每次词的embedding融合了所有词的信息去更好的表示自己。而[CLS]位本身没有语义,经过12层,得到的是所有词的加权平均,相比其他正常词,可以更好的表征句子语义。当然,也可以通过对最后一层所有词的embedding做pooling去表征句子语义。另外,[CLS]也指示了句子的开始,[SEP]则指示了句子的分割/结尾,BERT应该可以学到这个信息

总结:就是 CLS 是整个句子语义的载体,如果不用 CLS,而是放在第一位进行输出可能会影响到第一个 token 本身的词意表达。如果用全连接层进行分类等,会增加参数。

5.Self-Attention 的时间复杂度是怎么计算的?

Self-Attention 时间复杂度: ,这里 n 是序列的长度,d 是 embedding 的维度。

Self-Attention 包括 **三个步骤:相似度计算,softmax 和加权平均 **,它们分别的时间复杂度是:

相似度计算可以看作大小为 (n,d) 和 (d,n) 的两个矩阵相乘: ,得到一个 (n,n) 的矩阵

softmax 就是直接计算了,时间复杂度为

加权平均可以看作大小为 (n,n) 和 (n,d) 的两个矩阵相乘: ,得到一个 (n,d) 的矩阵

因此,Self-Attention 的时间复杂度是 。

这里再分析一下 Multi-Head Attention,它的作用类似于 CNN 中的多核。

多头的实现不是循环的计算每个头,而是通过 transposes and reshapes,用矩阵乘法来完成的。

In practice, the multi-headed attention are done with transposes and reshapes rather than actual separate tensors. —— 来自 google BERT 源码

Transformer/BERT 中把 d,也就是 hidden_size/embedding_size 这个维度做了 reshape 拆分,可以去看 Google 的 TF 源码 或者上面的 pytorch 源码:

hidden_size (d) = num_attention_heads (m) * attention_head_size (a),也即 d=m*a

并将 num_attention_heads 维度 transpose 到前面,使得 Q 和 K 的维度都是 (m,n,a),这里不考虑 batch 维度。

这样点积可以看作大小为 (m,n,a) 和 (m,a,n) 的两个张量相乘,得到一个 (m,n,n) 的矩阵,其实就相当于 m 个头,时间复杂度是 。

张量乘法时间复杂度分析参见:矩阵、张量乘法的时间复杂度分析

因此 Multi-Head Attention 时间复杂度就是 ,而实际上,张量乘法可以加速,因此实际复杂度会更低一些。

不过,对于做 transposes and reshapes 的逻辑,个人没有理的很明白,希望大佬看到能留言解答一下,感谢。

6.Transformer 在哪里做了权重共享,为什么可以做权重共享?

Transformer 在两个地方进行了权重共享:

(1)Encoder 和 Decoder 间的 Embedding 层权重共享;

(2)Decoder 中 Embedding 层和 FC 层权重共享。

「对于(1」《Attention is all you need》中 Transformer 被应用在机器翻译任务中,源语言和目标语言是不一样的,但它们可以共用一张大词表,对于两种语言中共同出现的词(比如:数字,标点等等)可以得到更好的表示,而且对于 Encoder 和 Decoder,「嵌入时都只有对应语言的 embedding 会被激活」,因此是可以共用一张词表做权重共享的。

论文中,Transformer 词表用了 bpe(Byte Pair Encoding) 来处理,所以最小的单元是 subword。英语和德语同属日耳曼语族,有很多相同的 subword,可以共享类似的语义。而像中英这样相差较大的语系,语义共享作用可能不会很大。

但是,共用词表会使得词表数量增大,增加 softmax 的计算时间,因此实际使用中是否共享可能要根据情况权衡。

该点参考:https://www.zhihu.com/question/333419099/answer/743341017

「对于(2」,Embedding 层可以说是通过 onehot 去取到对应的 embedding 向量,FC 层可以说是相反的,通过向量(定义为 x)去得到它可能是某个词的 softmax 概率,取概率最大(贪婪情况下)的作为预测值。

那哪一个会是概率最大的呢?在 FC 层的每一行量级相同的前提下,理论上和 x 相同的那一行对应的点积和 softmax 概率会是最大的(可类比本文问题 1)。

因此,Embedding 层和 FC 层权重共享,Embedding 层中和向量 x 最接近的那一行对应的词,会获得更大的预测概率。实际上,Decoder 中的「Embedding 层和 FC 层有点像互为逆过程」。

通过这样的权重共享可以减少参数的数量,加快收敛。

但开始我有一个困惑是:Embedding 层参数维度是:(v,d),FC 层参数维度是:(d,v),可以直接共享嘛,还是要转置?其中 v 是词表大小,d 是 embedding 维度。

查看 pytorch 源码发现真的可以直接共享:

fc=nn.Linear(d,v,bias=False)#DecoderFC层定义 weight=Parameter(torch.Tensor(out_features,in_features))#Linear层权重定义

Linear 层的权重定义中,是按照 (out_features, in_features) 顺序来的,实际计算会先将 weight 转置在乘以输入矩阵。所以 FC 层 对应的 Linear 权重维度也是 (v,d),可以直接共享。

7.BERT 非线性的来源在哪里?

前馈层的 Gelu 激活函数和 self-attention,self-attention 是非线性的。

8.BERT 的三个 Embedding 为什么可以直接相加会对语义有影响吗?

引用苏剑林老师的回答:

那只能说明你还不了解 Embedding 的意义。

Embedding 的数学本质,就是以 one hot 为输入的单层全连接。请参考: https://kexue.fm/archives/4122

也就是说,世界上本没什么 Embedding,有的只是 one hot。

现在我们将 token,position,segment 三者都用 one hot 表示,然后 concat 起来,然后才去过一个单层全连接,等价的效果就是三个 Embedding 相加。

引用博主的回答:

这是一个很有意思的问题,苏剑林老师给出的回答,真的很妙:

「Embedding 的数学本质,就是以 one hot 为输入的单层全连接。也就是说,世界上本没什么 Embedding,有的只是 one hot。」

「在这里想用一个简单的例子再尝试理解一下」:假设 token Embedding 矩阵维度是 [4,768];position Embedding 矩阵维度是 [3,768];segment Embedding 矩阵维度是 [2,768]。

对于一个字,假设它的 token one-hot 是[1,0,0,0];它的 position one-hot 是[1,0,0];它的segment one-hot 是[1,0]。那这个字最后的 word Embedding,就是上面三种 Embedding 的加和。

如此得到的 word Embedding,和concat后的特征:[1,0,0,0,1,0,0,1,0],再过维度为[4+3+2,768] = [9, 768] 的全连接层,得到的向量其实就是一样的。

「再换一个角度理解」:

直接将三个one-hot 特征 concat 起来得到的 [1,0,0,0,1,0,0,1,0] 不再是one-hot了,但可以把它映射到三个one-hot 组成的特征空间,空间维度是 4*3*2=24 ,那在新的特征空间,这个字的one-hot就是[1,0,0,0,0...] (23个0)。

此时,Embedding 矩阵维度就是 [24,768],最后得到的 word Embedding 依然是和上面的等效,「但是三个小 Embedding 矩阵的大小会远小于新特征空间对应的 Embedding 矩阵大小」。

当然,在相同初始化方法前提下,两种方式得到的 word Embedding 可能方差会有差别,但是,BERT还有Layer Norm,会把 Embedding 结果统一到相同的分布。

BERT的三个Embedding相加,本质可以看作一个「特征的融合」,强大如 BERT 应该可以学到融合后特征的语义信息的。

引用邱锡鹏老师的回答:

这是个好问题。虽然在深度神经网络里变得非常复杂,本质上神经网络中每个神经元收到的信号也是“权重”相加得来。具体细节的分析这里就不提了,有兴趣的同学可以自己推一推。

这里想说一下宽泛一点的分析(瞎扯)。

在实际场景中,叠加是一个更为常态的操作。比如声音、图像等信号。一个时序的波可以用多个不同频率的正弦波叠加来表示。只要叠加的波的频率不同,我们就可以通过傅里叶变换进行逆向转换。

一串文本也可以看作是一些时序信号,也可以有很多信号进行叠加,只要频率不同,都可以在后面的复杂神经网络中得到解耦(但也不一定真的要得到解耦)。在 BERT 这个设定中,token,segment,position 明显可以对应三种非常不同的频率。

由此可以再深入想一想,在一串文本中,如果每个词的特征都可以用叠加波来表示,整个序列又可以进一步叠加。哪些是低频信号(比如词性?),哪些是高频信号(比如语义?),这些都隐藏在 Embedding 中,也可能已经解耦在不同维度中了。说不定可以是一种新的表示理论:)

参考:https://www.zhihu.com/question/374835153

9.Transformer 的点积模型做缩放的原因是什么?

论文中解释是:向量的点积结果会很大,将 softmax 函数 push 到梯度很小的区域,scaled 会缓解这种现象。怎么理解将 sotfmax 函数 push 到梯度很小区域?还有为什么 scaled 是维度的根号,不是其他的数?

LinT 的回答

为什么比较大的输入会使得softmax的梯度变得很小?

对于一个输入向量 ,softmax函数将其映射/归一化到一个分布 。在这个过程中,softmax先用一个自然底数 将输入中的「元素间差距先“拉大”」,然后归一化为一个分布。假设某个输入 中最大的的元素下标是 k,「如果输入的数量级变大(每个元素都很大),那么 会非常接近1」。

我们可以用一个小例子来看看 的数量级对输入最大元素对应的预测概率 的影响。假定输入 ,我们来看不同量级的 a 产生的 有什么区别。

a = 1 时,

a = 10 时,

a = 100 时, (计算机精度限制)。

我们不妨把 a 在不同取值下,对应的的 全部绘制出来。代码如下:

frommathimportexp frommatplotlibimportpyplotasplt importnumpyasnp f=lambdax:exp(x*2)/(exp(x)+exp(x)+exp(x*2)) x=np.linspace(0,100,100) y_3=[f(x_i)forx_iinx] plt.plot(x,y_3) plt.show()

得到的图如下所示:

可以看到,数量级对 softmax 得到的分布影响非常大。「在数量级较大时,softmax 将几乎全部的概率分布都分配给了最大值对应的标签」。

然后我们来看 softmax 的梯度。不妨简记 softmax 函数为 , softmax 得到的分布向量 对输入 梯度为:

把这个矩阵展开:

根据前面的讨论,当输入 的元素均较大时,softmax会把大部分概率分布分配给最大的元素,假设我们的输入数量级很大,最大的元素是 ,那么就将产生一个接近one-hot的向量 , 此时上面的矩阵变为如下形式:

也就是说,在输入的数量级很大时,「梯度消失为0,造成参数更新困难」。

维度与点积大小的关系是怎么样的,为什么使用维度的根号来放缩?

针对为什么维度会影响点积的大小,在论文的脚注中其实给出了一点解释:

假设向量 q 和 k 的各个分量是互相独立的随机变量,均值是0,方差是1,那么点积 的均值是 0,方差是 。这里我给出一点更详细的推导:

对 , 和 都是随机变量,为了方便书写,不妨记 。这样有

则:

这样 , 和 的均值是 0,方差为 1,又由期望和方差的性质, 对相互独立的分量 ,有 以及 。

所以有 的均值 ,方差 。「方差越大也就说明,点积的数量级越大(以越大的概率取大值)」。那么一个自然的做法就是把方差稳定到1,做法是将点积除以 ,这样有:

「将方差控制为1,也就有效地控制了前面提到的梯度消失的问题」。

可以参考一下。水平有限,如果有误请指出。

参考:https://www.zhihu.com/question/339723385

10.在 BERT 应用中,如何解决长文本问题?

举例:在阅读理解问题中,article 常常长达 1000+, 而 Bert 对于这个量级的表示并不支持。

用 Sliding Window(划窗),主要见于诸阅读理解任务(如 Stanford 的 SQuAD)。Sliding Window 即把文档分成有重叠的若干段,然后每一段都当作独立的文档送入BERT进行处理。最后再对于这些独立文档得到的结果进行整合。(Transformer-XL)

还可以分段来执行,各段可以求平均、求 max、或者加个 attention 融合。

斤木的回答:

可以看下 Amazon 今年 EMNLP 的这篇文章:Multi-passage BERT

主要思路是 global norm + passage rank + sliding window

实验做的很扎实,从 ablation study 看这几个 trick 都很有用。

如果不想切 passages 就上 XLNet 吧。

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模型
    +关注

    关注

    1

    文章

    3652

    浏览量

    51723
  • nlp
    nlp
    +关注

    关注

    1

    文章

    491

    浏览量

    23198

原文标题:【Pre-Training】超细节的 BERT/Transformer 知识点

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【高速数字设计(基础篇)】阅读体验之一--书籍排版设计和目录架构及初步阅读

    的参考。 对于刚从事高速电路设计不久,希望深入了解高速电路原理的朋友来说,这本书是值得推荐入手的。这本书先是从基本的电路知识开始讲起,再深入讲比较高级的知识点,而且整本书的语言比较
    发表于 11-06 22:49

    自动驾驶中Transformer大模型会取代深度学习吗?

    持续讨论。特别是在自动驾驶领域,部分厂商开始尝试将多模态大模型(MLLM)引入到感知、规划与决策系统,引发了“传统深度学习是否已过时”的激烈争论。然而,从技术原理、算力成本、安全需求与实际落地路径等维度来看,Transformer与深度学习并非你死我活的替代
    的头像 发表于 08-13 09:15 3934次阅读
    自动驾驶中<b class='flag-5'>Transformer</b>大模型会取代深度学习吗?

    【社区之星】李金磊:保持热情和兴趣,勇敢尝试新鲜事物

    技能,培养交叉学科素养,大胆尝试。循序渐进,从DIY开始,不断进步和优化项目,获得正反馈,发帖分享和网友讨论,扩展知识面和视野。 然后,还需要打好基础,编程语言需要掌握一到两门,如C和Python等
    发表于 07-24 17:54

    【「Yocto项目实战教程:高效定制嵌入式Linux系统」阅读体验】01初读体验

    书可以比较系统的讲解了yocto的逻知识点,便尝试申请看这本书。幸运的是,最终获得了看此书的机会。 首先,上图: 阅读过程 按照惯例,拿到书后,第一步是阅读推荐序和自序,从推荐序中可以获得他人读这本
    发表于 06-30 21:49

    门老师教你快速看懂电子电路图

    本文从最基本的电容电阻开讲,包含模电数电,以及部分电气知识点深入浅出。 资料介绍: 全文共分7课,以老师授课和师生交流的形式系统地介绍了电子电路识图方面的基本知识和技能,包括电路图的
    发表于 05-16 15:17

    C51单片机及C语言知识点必备秘籍

    单片机关键知识点一览: 系列一 1:单片机简叙 2:单片机引脚介绍 3:单片机存储器结构 4:第一个单片机小程序 5:单片机延时程序分析 6:单片机并行口结构 7:单片机的特殊
    发表于 05-15 14:00

    电机选型计算公式与知识点汇总

    纯分享帖,需要者可点击附件获取完整资料~~~*附件:电机选型计算公式与知识点汇总.pdf 【免责声明】内容转自今日电机,因转载众多,无法确认真正原始作者,故仅标明转载来源。版权归原出处所有,纯分享帖,侵权请联系删除内容以保证您的权益。
    发表于 04-29 16:10

    全面解析新概念模拟电路(建议下载!)

    全文共五册,近50万字,一样的风趣幽默,一样的social化语言,深入浅出地将枯燥深奥的模电知识讲得简单易学。 《新概念模拟电路》内容包含了《晶体管》、《负反馈和运算放大器》、《运放电路的频率特性
    发表于 04-16 13:37

    请问在NXP板的BSP QA过程中采用了哪些具体的测试方法?

    QA 过程中采用了哪些特定的测试方法? 什么是 QA 流程,以及 yocto/linux BSP 在整个 QA 生命周期中如何跟踪和管理缺陷? RSB 3720 板的 QA
    发表于 03-17 08:04

    电气工程师必知必会的100个电⽓知识点分享

    电⽓⼯程师也都是从电⽓学徒⼯⼀步⼀步积累成长起来的。积跬步⾄千⾥,汇细流成江海!朋友们,现在让我们⾛⼀个捷径,花半个⼩时的时间来积累100个必知必会的电⽓知识点吧!
    的头像 发表于 03-14 11:05 1526次阅读

    华邦电子安全闪存关键知识点

    黑客攻击?高温考验?驾驶安全?通通没在怕的!1月15日,华邦电子举办了“安全闪存强化车用电子安全性”为主题的线上研讨会。为了让没能参加这场线上研讨会的邦友们也可以清晰 Get 安全闪存关键知识点,邦
    的头像 发表于 02-12 18:15 1126次阅读

    Docker-镜像的分层-busybox镜像制作

    目录 知识点1:镜像的分层 示例:进入 docker hub查看Jenkins的Dockerfile 知识点2:base镜像 知识点3:scratch镜像 scratch 镜像是什么? 示例:在
    的头像 发表于 01-15 10:44 1023次阅读
    Docker-镜像的分层-busybox镜像制作

    Aigtek功率放大器应用:电感线圈的知识点分享

    电磁驱动是功率放大器的一大基础应用领域,其中我们最常见的就是用功放来驱动电感线圈,那么关于电感线圈的这10大知识点你都知道吗?今天Aigtek安泰电子来给大家介绍一下电感线圈的基础知识
    的头像 发表于 01-07 15:43 1222次阅读
    Aigtek功率放大器应用:电感线圈的<b class='flag-5'>知识点</b>分享

    后悔没有早点看到:天线设计中的知识点

    Cat.1 bis R13架构,天线架构精简为单天线架构,去掉了分集接收天线,因此只需要一根天线。   知识点: Cat.1 bis相对于Cat.1的区别是,后者为两根天线(一根主天线,一根分集天线
    的头像 发表于 12-24 17:11 1615次阅读
    后悔没有早点看到:天线设计中的<b class='flag-5'>知识点</b>!

    【面试题】人工智能工程师高频面试题汇总:Transformer篇(题目+答案)

    ,或者深度学习的框架,还有怎么优化模型,Transformer的一些知识,这些都是加分项,能有效提高面试通过率。本篇小编整理了一些高频的Transformer方面的面
    的头像 发表于 12-13 15:06 2397次阅读
    【面试题】人工智能工程师高频面试题汇总:<b class='flag-5'>Transformer</b>篇(题目+答案)