bert原理及源码的一些讨论

目录

1.模型原理

2 单词级任务讨论

参考文献:


写在前面:学习了一段时间的nlp后,感觉中文资料大多还是翻译的英文,很多东西找不到更深入的资料。最近在研究超神的bert模型,主要找到的资料也就原始的paper和英文博客。在此想把我的学到的和一些思考写一写,方便大家一起探讨学习。

    做为学渣,介绍一下我学习算法的一般套路,分两步,第一步是跑通demo,理解算法的输入数据格式,输出结果,以及适用的任务,第二部是理解网络结构,损失函数的构造,以及想法的来龙去脉。

    本片没有详细的介绍bert的原理和结构,主要想从paper中没有介绍的一些问题来讨论。

1.模型原理

    bert的模型分两部分来看,一部分是transformer的encoder部分,一部分是掩码语言模型(MLM)。transformer中encoder的网络结构介绍的文章比较多,很经典的一篇是【1】,有中文的翻译。这部分资料比较多,理论也比较复杂,本学渣就不介绍了。不过其中有一个问题是,多头attention的作用是什么,多头attention的结构见盗图1【1】。最近看到苏大神介绍on-lstm【2】及paper[3],该paper是ICLR 2019的两篇最佳论文之一。作者给lstm的神经单元做了层级的划分,认为各个层包含不同的语法信息,见下面的盗图2【2】。

                                                                             盗图1 多头attention机制

                                                                             盗图2 on-lstm层级结构

    单从这一点看,和多头attention的拆分是相似的,那多头attention的作用是什么,是每一个头学习一层(种)语法特征,还是相似于图像的降采样呢,每一个头是一个“小”的复本。这个我也不知道,有条件的可以做一下实验。

    然后就是第二部分,bert的语言模型MLM。原文说了这个他们的主要创新点哈。至于MLM,可能他们在别的网络结构上也尝试过,估计是效果不好,到attention上一尝试,神了。

    MLM的具体实现,paper里没有详细的介绍。有一个问题是一个句子里有多个MASK,怎么做预测,怎么组合损失函数呢,这个在第二章详细介绍。

    还有一点是bert加了是否是下一句的预测,目的是适应句子级的任务。训练过程是用【CLS】的向量表示句子向量,损失函数和词预测的损失函数直接相加。注意这里的句子向量,是一个样本的向量,是sentenceA+sentenceB,不是单独的sentenceA。

2 单词级任务讨论

    主要介绍损失函数的构造,主要讨论mask相关的问题。

    一个训练样本中包含多个mask,这里面包含两个问题,一是多个mask预测如何处理,一是mask的词向量。首先看模型数据数据的格式,见图3,各个字段代表的含义就不介绍了。一个样本中有多个mask,每个mask位置的目标单词不同,且所有的mask字符编号相同,都是103。

                                                                                    图3 bert输入数据

    问题1,一个样本中多个mask问题。一个句子总有多个mask,如何来组合他们的损失函数。其实这是一个迷惑人的问题,也由于paper没有说明,很能迷惑人。既然有句子级任务,那就是单词级任务(叫法不准确),单词级任务就是mask预测。首先记住这一点,然后确定输入数据是怎么构造的。在官方发布的实现中,输入数据的样子如图3所示,输入数据的维度是【batch_size , seq_len , vec_size】,在mask预测的输出层,输入数据的维度为【batch_size*seq_len , vec_size】。可以看到,这里第一维由句子转换为了单词。预测的对象是单词了,已经和句子无关了。直接用每个mask位置的词向量,来预测单词的编码。我们简单看一下,这一步操作的过程。第一步是维度转化,第二步的gather是把mask位置的词向量抽出来,和look_up相似。

    问题2 ,mask代表所有被掩盖的单词,但mask只有一个,出现的情况是V(mask)->Word1 、V(mask)->Word2、、、,即mask在重复使用。对于每个单词,mask向量的差异是怎么来的呢。可能带来差异的有两个地方,首先是加入的位置编码,然后是每一次的self-attention。如果没有位置编码,不同位置的mask词向量完全由初始化决定,收敛的速度估计要慢太多。

    和mask的重复使用相似的是,cls也是重复使用的,每一个句子的cls是在其他句子的cls基础上更新的。我的同事在做句子相似性时发现,即使不相关的句子,余弦相似也在0.8左右,实验是基于单句任务的。在模型训练后期,梯度很小,cls的变化也会很小,这个变化在余弦距离上对应一个很小的角度,造成句子的余弦相似度很大。

参考文献:

【1】https://jalammar.github.io/illustrated-transformer/

【2】https://kexue.fm/archives/6621

【3】《Ordered Neurons: Integrating Tree Structures into Recurrent Neural Networks》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Bert 压缩模型的源代码可以在以下地址获取: - Bert 原始模型的源代码:https://github.com/google-research/bert 如果你想要使用压缩版的 Bert 模型,你可以参考以下项目: - DistilBert:https://github.com/huggingface/transformers/tree/main/src/transformers/modeling_distilbert - TinyBert:https://github.com/huggingface/transformers/tree/main/src/transformers/modeling_tinybert - MobileBert:https://github.com/huggingface/transformers/tree/main/src/transformers/modeling_mobilebert 这些压缩版的 Bert 模型都是在原始的 Bert 模型的基础上进行了改进和优化,使得它们的模型大小更小,推理速度更快,同时保留了较高的准确率。 ### 回答2: bert压缩模型的源码地址可以在GitHub上找到。在GitHub上有许多开源项目,其中有一些是专门为BERT模型压缩而设计的。这些项目通常会提供详细的源代码和使用指南。 一种常见的BERT模型压缩方法是通过稀疏化来减少模型的参数数量。稀疏化可以通过引入稀疏矩阵或掩码的方式来实现。这些方法的目标是识别和删除不重要的参数,从而减少模型的大小。在GitHub上可以找到一些使用这种方法的开源项目,它们提供了压缩BERT模型的源代码。 另一种常见的压缩方法是权重剪枝。这种方法通过将参数的数值范围变得更小来减少模型的体积。通过剪枝掉参数的小值,可以减少模型的参数数量。GitHub上也有一些开源项目提供了使用权重剪枝来压缩BERT模型的源代码。 总之,如果您想要获取BERT模型压缩的源代码地址,建议在GitHub上搜索相关的开源项目,其中会有一些专门为此目的而创建的项目,提供了详细的源代码和使用指南。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值