IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 为什么Transformer会出现位置编码(Positional Encoding)? -> 正文阅读

[人工智能]为什么Transformer会出现位置编码(Positional Encoding)?

??Transformer被提出首先应用在NLP领域,处理的数据对象为语言的序列数据,既然是序列数据,则序列的顺序对于语言的表达是至关重要的。在这之前,RNN已经被提出用于解决NLP中的机器翻译、文本生成等任务,且RNN是按照序列顺序逐个对句子中的单词进行处理,使得序列的顺序自然而然地保存在模型中。而Transformer的输入是将句子中的所有单词一次性输入到网络中进行学习,这使得序列的顺序信息丢失。因此我们需要通过其他途径将序列的顺序信息加入到模型中,Transformer提出了一种解决方案就是文章中的Positional Encoding。

??但是为什么Positional Encoding是文章中的那种形式呢?让我们从零开始考虑,如果我们希望给一个句子添加位置信息,首先想到的是PE = pos = 0,1,2,…,N-1这样的位置编码方式,但是很容易想到这样的编码方式存在很大问题,如果我们现在有一个很长的句子(5000个单词),那么最后一个单词的位置编码就变成了4999,这显然不合理,因为这么大的数字会取代单词自身的Embedding作为单词的主要特征,我们添加位置编码的初衷是使得句子包含位置信息,而不是让位置信息取代句子本身的信息;另外,最后面和最前面的位置编码(如4999和0)相差太大,使得模型会更加关注最后面的单词而忽略前面的单词。

??因此,我们为了解决上面的问题,很容易想到的一种解决方案是将上面的所有数值控制在0~1之间,因此通过下面的公式即可实现:
在这里插入图片描述
??这样所有的单词位置编码都限制在了0~1之间,但是这又会出现新的问题——不同长度的句子位置编码的步长是不一致的,比如我们有一个长度为11和长度为101个单词的句子,根据上面公式计算,长度为10个单词的句子位置编码为0,0.1,0.2,…,1,而长度为0,0.01,0.02,…,1,显而易见,他们的步长一个为0.1,一个为0.01,这使得同样的两个相邻单词在不同长度的文本中的位置编码存在差异,比如长度为11和长度为101的句子中都有‘I love China’,显然‘love’和‘China’在这两种长度的句子中位置编码信息存在很大差异,使得模型进行学习时误认为二者并不相同。

??因此,现在我们明确一下现在我们希望得到的位置编码是什么样的:a)位置编码需要体现一个单词在不同位置的差异;b)位置编码需要有顺序关系,且位置编码不依赖于序列长度;c)位置编码需要被体现在一定的区间内。
满足上面条件的可以是一个有界的周期函数,比如sin和cos,当然不一定非得是这两个函数,其他满足上面条件的有界周期函数也可以。于是我们能想到的是下面这样的一个周期函数位置编码:

在这里插入图片描述

??其中用来调节sin函数的波长,当比较小时,sin函数的周期很小,使得相邻的两个单词的位置编码之间相差较大,并且可能会在长文本中出现不同位置的单词位置编码相同(位于sin函数两个周期的同一y值位置),反之,当比较大时,相邻的单词之间的位置差异不明显。因此需要对进行一定的改进,因为NLP中的每一个单词都有一定的维度,比如每个单词的维度为,则可以对单词的每个维度进行位置编码,通过在不同的维度上使用不同周期的函数来控制某单词的位置编码使得每个单词的位置编码重复的概率大大降低,甚至我可以不只是用sin函数,可以使用cos函数或者二者并用,也就出现了Transformer论文中提到的位置编码函数:
在这里插入图片描述

??其中2i和2i+1表示每个单词的第偶数位和第奇数位个维度,比如i=0表示的是该单词第0维和第1维上的位置编码值,这里分母上还有个,应该是为了对单词的每个维度进行缩放,使得其值在0~1的范围内。分析到这里还是有些疑惑为什么sin和cos可以表示位置信息?下面我们考虑二进制编码的例子:

在这里插入图片描述

??如上图是一组数字(0~15)的二进制编码格式,每个数字由其相应的四位二进制数表示,我们逐位进行分析,首先看最后一列(图中红色)二进制数字,他的变化为0,1,0,1,…,0,1,则很容易看出其周期为2,同理,蓝色的变化为0,0,1,1,…,0,0,1,1,其周期为4,绿色为8,橙色为16,分析到这里大家应该明白了,二进制数的每一位的周期变化是不是类似不同周期的sin或者cos函数的周期变化?图中的四种颜色可以理解为是Transformer中每个单词的Embedding维度(上图中=4),而每一种颜色表示的是不同周期的函数(sin或者cos),则整个四位的二进制数表示的就是某个位置的位置编码,比如图中‘8’这个数字(可以看作NLP中一个单词)的位置编码为‘1000’,这样大家应该清楚为何sin和cos可以表示位置编码了,至于论文中为什么既使用sin又使用cos,这个只是丰富了位置编码的形式,可以只用sin或者cos,但可能作者都尝试过,但最终选择了二者的结合形式。

??参考知乎@TniL以及@月球上的人两位大佬的回答,根据自己理解重新梳理了一下https://www.zhihu.com/question/347678607/answer/864217252,https://zhuanlan.zhihu.com/p/338592312。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 11:54:48  更:2021-07-17 11:55:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/22 11:15:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码