小白对于BERT细节的一点理解

小白对于BERT细节的一点理解

工作以后跟着同事学习NLP相关内容,之前的一些层归一化、归一化等相关知识还不牢固,希望在周末闲暇时间多多弥补,最近看了BERT的相关内容,在此对其进行记录整理,以便于日后复习回顾,记录有不正确的地方,还请指出。

初相识

最初在博客看过对于BERT的讲解,阅读原始论文,发现BERT主要包括以下三点内容:
1、使用Transformer的进行双向训练。
2、输入向量包括Token embedding、segment embedding、position embedding三部分
3、使用了Mask Language Model(MLM)训练策略。
4、使用了Next Sentence Prediction(NSP)训练策略。
当时还以为只有这些内容,不禁去想,不就这些几句话不就说完了,现在想想真是无知。。。

再相知

随着了解的慢慢深入,逐渐学会去想具体细节,在此站在一个小白的角度以回答的形式对这些细节进行整理。

问题一:BERT使用Transformer进行训练,然而Transformer包括encoders和decoders两部分,是使用了两部分结构进行训练吗?

答案一:不是,只采用了Transformer的encoders部分


问题二:BERT的输入形式为“[CLS]今天天气好去哪玩[SEP]去西湖吧[SEP]”,其中[CLS]和[SEP]的作用分别是什么?

答案二:BERT会在输入的最开头加上[CLS],在每一个句子的末尾添加[SEP],其中[CLS]的由于本身没有任何含义,因此计算attention时,CLS会更加公平的计算其本身对于句子中每个词的attention,因此使用[CLS]在最后一层输出层的输出结果代表整个句子的语义向量,主要应用在分类问题;而[SEP]的作用仅仅是作为句子分隔符


问题三:输入向量中的Token embedding很容易理解,即词向量,而segment embedding、position embedding是指什么,具体又是什么维度,最终是将这三个向量拼接还是对应元素相加?

答案三:BERT的输入包括两种情况,单个句子或者一个句子对,segment embedding是为了区分第一个句子和第二个句子,以“[CLS]今天天气好去哪玩[SEP]去西湖吧[SEP]”为例,对其进行字切分,则“[CLS]今天天气好去哪玩[SEP]”中每一个字的segment embedding是一个1x768的向量,其中每一个向量元素全为0,同理“去西湖吧[SEP]”中每一个字的segment embedding是一个1x768的向量,其中每一个向量元素全为1(768是BERT原始论文采用的向量维度),则整个句子的segment embedding是10x768维度的0向量和5x768维度的1向量的拼接。而此例中的position embedding是随机初始化的15x768的向量,其中15是按字切分后的序列长度,在训练过程中对其进行调整,position embedding的作用是为了记录句子中字词的顺序信息。最终输入到BERT的向量是三个向量对应位置元素相加,而非向量拼接,即最终的输入值维度仍然是15x768。


问题四:采用MLM训练策略预测被MASK词时,采用了双向训练策略,这里的双向具体是指什么?

答案四:在先前的了解中,使用LSTM进行双向训练,是将序列正反向顺序分别输入到LSTM网络中,称之为双向训练,而BERT采用的是Transformer的encoders部分,没有网络结构,只采用注意力机制进行计算,因此这里的双向是指根据被MASK词的上下文内容计算attention。


问题五:网络最后一层如何预测被MASK词?

答案五:总的方面,在BERT模型最初,会采用wordpiece算法进行分词,该算法分词时会产生3万个常用词,预测被MASK词即预测被MASK的词是这3万个常用词的哪一个。细节方面,该问题可以认为是多分类问题,即对被MASK词进行分类,类别则是3万个常用词,原始论文中采用softmax函数对其进行分类,损失函数采用交叉熵损失函数。


问题六:NSP训练策略如何预测是否是下一句子?

答案六:NSP任务同样是二分类问题,标签为“是”和“否”,同样采用softmax函数进行分类,损失函数采用交叉熵损失函数。


问题七:代码中hidden_size和intermediate_size的区别?

答案七:代码中hidden_size和intermediate_size的值分别为768和3072,其中hidden_size是指输入向量维度,经过self-attention计算以后产生的结果同样为768维,该结果输入到前馈神经网络中,此时前馈神经网络的输入层维度是768,隐藏层维度则是3072维(intermediate_size)


问题八:配置文件中的initializer_range = 0.02是什么意思?

答案八:具体什么意思目前也没搞明白,大概知道initializer_range是指初始化范围,目前初始化采用正态分布初始化等初始化方式,0.02是初始化方式中的均值或者偏差等。。。。。。。。。。。。。。

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值