BERT 模型提出已经有接近两年的时间了,学术界和工业界也都在不断迭代。想要深入掌握的话,不仅要知道原理,更要懂得源码细节,以及亲手实战 BERT 精调,了解这两年来一系列模型的发展脉络。想要全面地学习这些知识点的话,可以学习 bienlearn 上的 BERT 专栏。
这个 BERT 专栏由自然语言处理领域的 KOL——「夕小瑶的卖萌屋」作者团主笔,帮助新手以及有一定基础的同学快速上手 BERT,既包括原理、源码的解读,还有 BERT 系的改进串讲与高级精调技巧。不管是准备面试、项目实战还是比赛刷分,都可以找到对应的内容。
目前在限时优惠,更详细的内容大家可以点击下方卡片查看。
正文:
感谢@贪心科技,听到@蓝振忠 老师亲自讲解ALBERT感觉赚到了:)
附上NLP系列第四场《从BERT到ALBERT》笔记整理;本篇文章仅在于记录课程内容略加入自己的理解与扩充,如有错误,请交流指正~
btw 如果文章对您有帮助,可以在文末戳赞同表示支持~(据说收藏不点赞的都是耍流氓 [狗头保命]
ALBERT(A Lite BERT) —— 参数数量更少的轻量级BERT模型
https://arxiv.org/abs/1909.11942arxiv.org一、背景
在计算机视觉领域,提升性能的主要方法是通过将网络加深实现的;
同样地,BERT也可以通过将网络变深变宽来提升性能;
因此,起初的想法是也让网络变大,但网络变宽导致参数爆炸;
因此,“怎样做到减少参数,而不减弱performance”,成为ALBERT关注的主题;
二、ALBERT的改进策略
减少参数首先要知道Transformer的参数来源于哪儿;
对Transformer的网络结构不理解的可以移步:
宅家NLP(三) —— 从Transformer到BERT模型zhuanlan.zhihu.com参数主要来源于两个模块:token embedding映射模块 和 attention与FFN模块;
其中,前者的参数量大约占整体参数量的20%,后者约占80%;
1、对embedding参数因式分解
ALBERT采用因式分解的方式减少embedding映射模块的参数量,即将词的one-hot向量映射到一个低维(大小为E)的空间,再映射回一个高维(大小为H)的空间,这样就把参数量从O(V×H)降低到了O(V×E+E×H),当E<<H时参数量减少的很多。
可以这样做的原因是token embeddings是上下文独立的(由one-hot向量转化成dense向量),而hidden-layer embeddings是上下文依赖的,因此hidden-layer embeddings应该包含更多的信息,所以可以利用一个小于H的E做中介将词的one-hot向量先经过一个低维的embedding矩阵再经过一个高维的embedding矩阵映射到隐藏层空间;
效果如下图所示:
2、共享层与层之间的参数
这样做的原因是,在对L=2,L=4,L=6各层参数效果可视化后(没有截到图,后续补充)得到结论:各层参数相似,都是在[CLS] token和对角线上分配更多的注意力;
跨层的参数共享有两种方案:attention模块的参数共享 和 FFN的参数共享,效果如下图;
可以看到,共享FFN的参数是导致结果下降的主要原因;
ALBERT采用了attention模块和FFN模块的参数都共享的方案,尽可能减少参数量,而对performance不会产生大的影响;
- 再次尝试对ALBERT变宽和变深之后的表现:
3、 构建自学习任务-句子连贯性预测
在预训练任务上提高:改造NSP任务,强化网络学习句子的连续性;
NSP任务实际上是一个二分类任务,即预测两句话是采样于同一个文档中的两个连续的句子(正样本),还是采样于两个不同的文档中的句子(负样本)。NSP任务实际上包含两个子任务,即topic预测和关系一致性预测,而topic预测其实很简单;NSP在很多实践中被证明没有太好效果;
因此,ALBERT选择去除topic预测的影响,只保留关系一致性预测,于是提出了一个新的任务 Sentence-Order Prediction (SOP),SOP的正样本和NSP的获取方式一样,负样本把正样本的两句话顺序反转;
效果如下图所示:
4、去掉dropout
dropout在防止过拟合上有显著效果,但是实际上MLM很难过拟合,去掉dropout,由于可以腾出很多临时变量占用的内存而使得内存上有所提升;
三、总结
总而言之,ALBERT的贡献可以总结成以下四点:
一些将来的和正在推进的工作:
四、Code
github:https://github.com/google-research/ALBERT
btw 如果文章对您有帮助,可以在文末戳赞同表示支持~(据说收藏不点赞的都是耍流氓 [狗头保命]