Transformers Assemble(PART III)
写在前面
这一期魔改Transformers主要关注对原始模型中位置信息的讨论与优化,
- 「Self-Attention with RPR from Google,NAACL2018」
- 「Self-Attention with SPR from Tencent,EMNLP 2019」
- 「TENER from FDU」
- Encoding Word Order in Complex Embedding,ICLR2020
考虑到加上第四篇就太长了,所以额外分一篇在后面讨论吧。「
第四篇也非常有趣提出将独立的词向量替换成自变量为位置的函数,引入了复数空间综合了词向量和位置向量」
好啦进入本期正题
Self-Attention with Relative Position Representations[1]
一篇短文不是很难理解,文章要解决的痛点也非常清晰:self-attention机制在处理序列输入时无法编码位置信息。在原始Transformer里是采取sin/cos函数显示地引入位置信息,考虑的是绝对位置:
其中,
表示token在序列中的位置,
表示position embedding的第
维,总共有
维。另外,作者在原文中指出,sin/cos函数的周期性形式可以允许模型进一步学习到相对位置的信息。但是这种方式学习到的相对位置信息仍然是存在较大缺陷的,参考文章【浅谈 Transformer-based 模型中的位置表示】[2]。
针对以上问题,这篇论文提出一种相对位置信息引入Transformer的方法。
1.1 Vanilla Transformer
为了方便两者的对比,给出原始Transformer里self-attention的计算:
❝「
」: the scaled dot product of token
and token
; 「
」: the weight coefficient of token
and token
; 「
」: the output representation of token
1.2 Relative Position Representations
输入被看成是有向全连接图,两个token
、
之间的边设置了权重
,用做attention时key-value对添加相对位置信息。
作者认为,在token之间超过一定距离之后相对位置信息就没有意义,因此设置了一个最大截断
,且截断可以更好地提升模型泛化能力。计算公式如下:
其中,上面的
和
都是需要学习的,即需要学习的为
公式可能不好理解,举个栗子,假设序列长度N=9,截断窗口k=3,则RPR嵌入的lookup表如下图,感觉跟「滑动窗口」有点像:
1.3 Relation-aware Self-Attention
理解上面RPR之后,就可以对原始self-attention进行改写,将相对位置信息融入进去:
虽然论文基本概念相对简单(自注意力机制中包含了相对位置信息),但是它极大地提高了两个机器翻译任务的翻译质量。
1.4 Reference
- Code Here[3]
- How Self-Attention with Relative Position Representations works[4]
Self-Attention with Structural Position Representations[5]
不管是transformer原文的绝对位置编码还是上文引入的相对位置编码,都属于「sequential information」。作者从Hewitt和Manning发表的论文[6]中得到启发:句子的潜在结构可以通过结构深度和距离来捕获,于是他们提出了absolute structural position
来编码元素在句法树中深度,relative structural position
来编码元素之间的距离。
上图左边属于两种序列位置编码表示,具体在上一节已经有介绍;右边是本文提出的结构位置编码,分为两种:
- 「Absolute Structural Position」:把句子的主要动词(如上图"held")作为origin,然后通过计算句法树中目标词语origin之间的距离作为绝对结构位置信息:
- 「Relative Structural Position」:相对位置信息考虑的单词对之间的关系,
- 如果单词
和
在句法树的同一条边上,则相对位置即为绝对位置之差:
- 如果在不同的边上,相对位置为绝对位置之和乘上一个系数
当两个单词正序时系数为1;相同时系数为0;逆序时系数为-1:
接下去就是将结构位置信息整合进SAN,
- 对于绝对位置,通过一个非线性函数将序列位置和结构位置融合得到位置表示:
- 对于相对位置,采用同上一篇论文一致的方法
TENER: Adapting Transformer Encoder for Named Entity Recognition[7]
针对命名实体识别任务的一个工作,虽然Transformer系在NLP很多领域都取得了非常大的进步,但是在NER任务上表现不佳。作者分析了注意力机制与特定的NER任务,发现原始实现中的「位置信息编码」、「注意力稀疏性」方面不太适用于NER。下面来一一分析。
3.1 位置信息编码
- 「距离性」 vanilla transformer中位置信息使用sin/cos函数嵌入,由公式定义
可以推导出
可见两个元素的点积只与它们之间的距离
有关(「距离敏感」),但是进一步研究可以发现,当position embedding被映射到自注意力的键值对时,其就会失去距离敏感性,如下图,最上面的曲线表示
,可以反映对称性;下面两条曲线表示
,无距离特性。
❝论文中说
中的
是随机的,但是这个参数是可学习的,在模型训练之后会不会效果变好?
- 「方向性」
此外,由上述推导可知,令
,有
因此这也是「方向不敏感」的
由上分析可知该种嵌入方式并不能反映方向性和距离性,但是对于NER任务而言距离和方向都是尤为重要的。为此本文对注意力分数计算进行改进,将绝对位置改成相对位置:
与transformer-xl里的比较像。
3.2 注意力稀疏
注意到修改后的Attention计算最后没有用到「scaling系数」
,这是因为对于NER任务只需要attend几个相对重要的context就足够了,scaled后的attention分布过于平滑会引入噪音。
这篇论文感觉主要重点在工程意义,在NER任务达到最好的效果;针对NER任务做了专门的修改,除了上面的相对位置信息和系数注意力,由于NER数据集相对较小,也减少了模型的可学习参数避免过拟合。
3.3 reference
- Code Here[8]
- TENER: Adapting Transformer Encoder for NER[9]
本文参考资料
[1]
Self-Attention with Relative Position Representations: http://xxx.itp.ac.cn/pdf/1803.02155.pdf
[2]
【浅谈 Transformer-based 模型中的位置表示】: https://zhuanlan.zhihu.com/p/92017824
[3]
Code Here: https://github.com/THUNLP-MT/THUMT/blob/d4cb62c215d846093e5357aa17b286506b2df1af/thumt/layers/attention.py
[4]
How Self-Attention with Relative Position Representations works: https://medium.com/@init/how-self-attention-with-relative-position-representations-works-28173b8c245a
[5]
Self-Attention with Structural Position Representations: https://arxiv.org/abs/1909.00383
[6]
Hewitt和Manning发表的论文: https://www.aclweb.org/anthology/N19-1419/
[7]
TENER: Adapting Transformer Encoder for Named Entity Recognition: http://xxx.itp.ac.cn/abs/1911.04474
[8]
Code Here: https://github.com/fastnlp/TENER
[9]
TENER: Adapting Transformer Encoder for NER: https://zhuanlan.zhihu.com/p/91557813
- END -
- python爬虫(二)_HTTP的请求和响应
- python迭代器
- python正则表达式
- Python迭代
- Python爬虫(二十二)_selenium案例:模拟登陆豆瓣
- Python爬虫(二十三)_selenium案例:动态模拟页面点击
- Python爬虫(二十四)_selenium案例:执行javascript脚本
- Kubernetes服务网格(第10部分):服务网格API
- Python爬虫Scrapy(二)_入门案例
- python_IO编程
- Python爬虫(十七)_糗事百科案例
- 上千亿巨头撑腰 双拼妥妥被他拿了
- Python爬虫(十八)_多线程糗事百科案例
- Python爬虫(十九)_动态HTML介绍
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PostgreSQL drop table 空间不释放的问题解决
- R语言预测人口死亡率:用李·卡特模型、非线性模型进行平滑估计
- Dockerfile 指令
- Docker 构建容器Tomcat+Nginx+MySQL
- 三种动态控制SAP CRM WebClient UI assignment block显示与否的方法
- TCGA数据库中癌症名称缩写
- CloudFlare自定义节点优化网站
- 什么是SSL?为什么要为WordPress网站使用SSL?
- R语言再保险合同定价案例研究
- SAP CRM附件的技术属性设计原理
- R语言对混合分布中的不可观测与可观测异质性因子分析
- R替换函数gsub
- R语言泊松回归对保险定价建模中的应用:风险敞口作为可能的解释变量
- asp dotnet core 提供大文件下载的测试
- R语言模拟人类生活预期寿命动态可视化动画图gif