查看原文
其他

层次分解位置编码,让BERT可以处理超长文本

苏剑林 PaperWeekly 2022-03-17


©PaperWeekly 原创 · 作者|苏剑林

单位|追一科技

研究方向|NLP、神经网络


大家都知道,目前的主流的 BERT 模型最多能处理 512 个 token 的文本。导致这一瓶颈的根本原因是 BERT 使用了从随机初始化训练出来的绝对位置编码,一般的最大位置设为了 512,因此顶多只能处理 512 个 token,多出来的部分就没有位置编码可用了。当然,还有一个重要的原因是 Attention的 复杂度,导致长序列时显存用量大大增加,一般显卡也 finetune 不了。
本文主要面向前一个原因,即假设有足够多的显存前提下,如何简单修改当前最大长度为 512 的 BERT 模型,使得它可以直接处理更长的文本,主要思路是层次分解已经训练好的绝对位置编码,使得它可以延拓到更长的位置。


位置编码

BERT 使用的是训练出来的绝对位置编码,这种编码方式简单直接,效果也很不错,但是由于每个位置向量都是模型自己训练出来的,我们无法推断其余位置的编码向量,因此有了长度限制。

解决这个问题的一个主流思路是换成相对位置编码,这是个可行的办法,华为的 NEZHA [1] 模型便是一个换成了相对位置编码的 BERT 模型。相对位置编码一般会对位置差做个截断,使得要处理的相对位置都在一个有限的范围内,因此相对位置编码可以不受限于序列长度。

但相对位置编码也不是完美的解决方案,首先像 NEZHA 那样的相对位置编码会增加计算量(如果是 T5 那种倒是不会),其次是线性 Attention 则没法用相对位置编码,也就是不够通用。

读者可能会想起 Attention is All You Need 不是提出了一种用 表示的 Sinusoidal 绝对位置编码吗?直接用那种不就不限制长度了?理论上是这样,但问题是目前没有用 Sinusoidal 位置编码的模型开放呀,难道我们还要自己从零训练一个?这显然不大现实呀。


层次分解

所以,在有限资源的情况下,最理想的方案还是想办法延拓训练好的 BERT 的位置编码,而不用重新训练模型。下面给出笔者构思的一种层次分解方案。

▲ 位置编码的层次分解示意图
具体来说,假设已经训练好的绝对位置编码向量为 ,我们希望能在此基础上构造一套新的编码向量 ,其中 。为此,我们设:

其中 是一个超参数, 是该套位置编码的“基底”。这样的表示意义很清晰,就是将位置 层次地表示为 ,然后 i, j 对应的位置编码分别为 ,而最终 的编码向量则是两者的叠加。不难理解,要求 是为了区分 (i, j) 和 (j, i) 两种不同的情况。
我们希望在不超过 n 时,位置向量保持跟原来的一样,这样就能与已经训练好的模型兼容。换句话说,我们希望 ,这样就能帮助我们把各个 给确定下来了:

这样一来,我们的参数还是 ,但我们可以表示出 个位置的编码,并且前 n 个位置编码跟原来模型是相容的。


自我分析

事实上,读懂了之后,读者就会发现其实这个分解几乎没什么技术含量,就是一个纯粹的拍脑袋的结果而已。

至于为什么会觉得这样做有效?一是由于层次分解的可解释性很强,因此可以预估我们的结果具有一定外推能力,至少对于大于 n 的位置是一个不错的初始化;二则是下一节的实验验证了,毕竟实验是证明 trick 有效的唯一标准。

本质上来说,我们做的事情很简单,就是构建一种位置编码的延拓方案,它跟原来的前 n 个编码相容,然后还能外推到更多的位置,剩下的就交给模型来适应了。这类做法肯定有无穷无尽的,笔者只是选择了其中自认为解释性比较强的一种,提供一种可能性,并不是最优的方案,也不是保证有效的方案。

此外,讨论一下 的选取问题,笔者默认的选择是 。理论上来说, 都成立,但是从实际情况出发,还是建议选择 的数值。
因为我们很少机会碰到上万长度的序列,对于个人显卡来说,能处理到 2048 已经很壕了,如果 n=512,那么这就意味着 i = 1, 2, 3, 4 而 ,如果 的话,那么从分解式(1)看 就会占主导,因为位置编码之间差异变小,模型不容易把各个位置区分开来,会导致收敛变慢;如果 ,那么占主导的是 ,位置编码的区分度更好,模型收敛更快一些。


实践测试

综上所述,我们可以几乎无成本地延拓 BERT 的绝对位置编码,使得它最大长度可以达到 !这绝对能满足我们的需求了吧?该改动已经内置在 bert4kera>=0.9.5 中,用户只需要在 build_transformer_model 中传入参数 hierarchical_position=True 即可启用,True 也可以换为 0~1 之间的浮点数,代表上述 的值,为 True 时则默认

至于效果,笔者首先测了 MLM 任务,直接将最大长度设为 1536,然后加载训练好的 RoBERTa 权重,发现 MLM 的准确率大概是 38% 左右(如果截断到 512,那么大概是 55% 左右),经过 finetune 其准确率可以很快(2000 步左右)恢复到 55% 以上。

这个结果表明这样延拓出来的位置编码在 MLM 任务上是行之有效的。如果有空余算力的话,在做其他任务之前先在 MLM 下继续预训练一会应该是比较好的。

然后测了两个长文本分类问题,分别将长度设为 512 和 1024,其他参数不变进行 finetune(直接 finetune,没有 MLM 继续预训练),其中一个数据集的结果没有什么明显变化;另一个数据集在验证集上 1024 的比 512 的要高 0.5% 左右。

这再次表明本文所提的层次分解位置编码是能起作用的。所以,大家如果有足够显存的显卡,那就尽管一试吧,反正在 bert4keras 下就是多一行代码的事情,有提升就是赚到了,没提升也没浪费多少精力。

最后提供一个 finetune 阶段最大长度与最大 batch_size 的参照表(RoBERTa Base 版,24G 的 TITAN RTX):

文章小结

本文分享了笔者构思的一种基于层次分解的位置编码延拓方案,通过这个延拓,BERT理论上最多可以处理多达 26 万长度的文本,只要显存管够,就没有 BERT 处理不了的长文本。
所以,你准备好显存了吗?



参考文献

[1] https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/NEZHA-TensorFlow
[2] https://github.com/bojone/bert4keras


更多阅读




#投 稿 通 道#

 让你的论文被更多人看到 



如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。


总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 


PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。


📝 来稿标准:

• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向) 

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接 

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志


📬 投稿邮箱:

• 投稿邮箱:hr@paperweekly.site 

• 所有文章配图,请单独在附件中发送 

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通



🔍


现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧



关于PaperWeekly


PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存