【ICLR2020】Transformer Complex-order:一种新的位置编码方式
补一下昨天没发完的一篇
文中公式若显示不全可左右滑动~
比较有意思的论文[1],关注的点也是在序列建模的位置信息编码。先前的方法通过引入额外的位置编码,在 embedding 层将词向量和位置向量通过加性编码融合,
但是该种方式每个位置向量是独立训练得到的,并不能建模序列的order relationship
(例如邻接或优先关系),作者将此称为the position independece problem
。
针对该问题论文提出了一种新的位置编码方式,将独立的词向量替换成自变量为位置的函数,于是单词表示会随着位置的变化而平滑地移动,可以更好地建模单词的绝对位置和顺序信息。
其中,
表示此表中序号为
的单词在位置
时的单词向量,
表示函数集合,
表示单词到函数的映射,展开即为,
为了达到上述要求,函数应该满足以下两个条件:
Property 1. Position-free offset transformation
对于任意位置 pos 和
,存在变换 Transform
Transform
满足,
特别地,论文考虑 Transform 为线性变换
Property 2. Boundedness
函数应该是有界的,
接下去,论文证明了满足上述两个条件的解函数形式为,
❝贴一下论文给的证明:(看不看无所谓,能用就行 haha) 假设函数
满足上述两个条件,则对于任意位置
,有
因此有
。我们令
以及
,由于
是任意的,有
当pos
时,有
当pos =1时,有
综上将上述所有情况综合有
发现当
,
就不是有界的了,因此限制
后,有
这样就满足有界性的条件了; 又由
和 Transform
pos 得,对所有的位置 pos,
得证。
根据欧拉公式,可以将上述解函数转化为,
在实现过程中,由于上述
的限制会导致优化问题,因此一种自然而然的做法就是固定
,于是上式可以简化为,
最终的 embedding 表示为,
其中振幅
、角频率
和初相
是需要学习的参数。
- 振幅
只和单词本身有关,即原本的词向量;
- 角频率
决定单词对位置的敏感程度。当角频率非常小时(如下图 p1),单词对于所有位置的词向量基本保持不变,这就与标准词向量一样了;
简单看一下文本分类任务的消融性分析结果:
- 增加可学习初相之后效果比设置初相为 0 差:
- "The negative effect of initial phases may be due to periodicity, and cannot be directly regularized with L2-norm penalties."
- 设置参数共享策略之后(word-sharing scheme和dimension-sharing scheme)效果变差,可能是由于参数变少导致学习表征能力下降;
一些思考:
❝1. 要用的话,计算量以及参数量是不是会很大呀;
❝2.好像也没看到跟其他 relative position 的模型比较
reference
- Code Here[2]
- Open Review[3]
本文参考资料
[1]
Encoding Word Order in Complex Embedding: https://openreview.net/pdf?id=Hke-WTVtwr
[2]
Code Here: https://github.com/zhaodongh/Encoding-Word-Order-in-Complex-valued-Embedding
[3]
Open Review: https://openreview.net/forum?id=Hke-WTVtwr
- END -
- 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 数组属性和方法
- 血泪教训,线程池引发的内存泄露
- RestTemplate设置转换类型
- 详解PROTOCOL BUFFERS
- Spring boot常用注解收集
- Go依赖模块版本之Module避坑使用详解
- 【tcl学习】vivado write_edif
- K8s中优雅停机和零宕机部署
- Python读取.edf格式脑电数据文件
- Kotlin修炼指南(三)——奇技淫巧
- 前端|CSS盒阴影和文字阴影
- 一文读懂Spring Boot各模块组件依赖关系
- 谈一谈|MkDocs介绍及应用
- 讲得最明白的Elasticsearch源码调试环境搭建教程
- 史上最全ThreadPoolExecutor梳理(下篇)
- JAVA|多Realm管理基础实现