首页 > 编程知识 正文

简述云计算的原理,量子计算的逻辑原理

时间:2023-05-04 11:49:30 阅读:272868 作者:3052

前言

     最近一段时间在看研究生导师发的资料,因为导师是做自然语言处理和知识图谱方向的,所以之前学的CNN的知识暂时用不上啦。NLP和KG方面的知识我之前没怎么接触过,所以最近打算写一系列博文来记录一下学习过程,如果有说得不对的地方请大佬指正。

一、Positional Encoding的介绍

    先说说Positional Encoding(位置编码)的由来。我们都知道传统做NLP邻域使用的模型大多是RNN模型(比如说LSTM、Bi-LSTM),基于RNN模型的训练是一个迭代的过程,也就是把一句话中的每一个词按顺序输入模型中,当RNN处理完当前的这个词时才可以输入下一个词,这种方式虽然可以使RNN按顺序读取语义信息,但是由于是串行计算,当语句较长的时候计算效率较低。谷歌大脑在2017年发布的论文《Attention is all you need》中提出了一种新型的NLP处理模型——TransfomerTransfomer的效果非常好并且可以对语句进行并行计算,也就是同时把一句话中的所有词都输入进去同时计算,大大加快了计算效率。但是问题来了,并行计算好是好,但是我们怎么让模型知道一句话中每个字的顺序信息呢?这就要引出我们的Positional Encoding(位置编码)了。

二、Positional Encoding的计算 2.1 Transfomer的输入 Transformer的输入部分

    首先我会先讲一下Positional Encoding(位置编码)的计算过程,然后在根据我自己的理解来讲Positional Encoding(位置编码)的原理。首先给出Transformer的输入部分,如上图所示。指的是初始输入的多语句矩阵,多语句矩阵通过查表,得到词向量矩阵。指的是句子数,指的是输入的句子中最长的句子的字数,指的是词向量的长度(通过查表得到)。和的示意图如下图所示。

两个变量的示意图 2.2 计算

    如上图所示word embedding指的是词向量由每个词根据查表得到,pos embedding就是我们要求的Positional Encoding,也就是位置编码。可以看到word embedding和pos embedding逐点相加得到composition,即既包含语义信息又包含位置编码信息的最终矩阵。pos embedding是根据pos(当前字符在句子中的位置)计算得到的,具体公式为:

其中指当前字符在句子中的位置(如:“你好啊”,这句话里面“你”的),指的是word embedding的长度(比如说:查表得到“民主”这个词的word embedding为,则),的取值范围是:。当的值为偶数是使用上面那条公式,当的值为奇数时使用下面那条公式。当时Positional Encoding(或者说是pos embedding)的计算结果为:

现在是不是好理解一点了,每一个字所计算出来的Positional Encoding并不是一个值而是一个向量,他的长度和这个字的word embedding的长度一致,从而方便他们两个逐点相加得到既包含word embedding又包含位置信息的最终向量。

三、Positional Encoding的原理

    这一节我们来讨论一下Positional Encoding的原理,写这一节的时候我参考了知乎的这个回答,非常感谢原作者!

不知道大家有没有想过为什么我们要用这么复杂的方法计算Positional Encoding,那让我们先来构思一个简单一点的Positional Encoding表达方法。首先,给定一个长为的文本,最简单的位置编码就是计数,即使用作为文本中每个字的位置编码(例如第2个字的Positional Encoding=[1,1,...,1])。但是这种编码有两个缺点:1. 如果一个句子的字数较多,则后面的字比第一个字的Positional Encoding大太多,和word embedding合并以后难免会出现特征在数值上的倾斜;2. 这种位置编码的数值比一般的word embedding的数值要大,对模型可能有一定的干扰。为了避免上述的问题,我们开始考虑把归一化,最简单的就是直接除以,即使用(例如第2个字的Positional Encoding=[1/T,1/T,...,1/T])。这样固然使得所有位置编码都落入区间,但是问题也是显著的:不同长度文本的位置编码步长是不同的,在较短的文本中紧紧相邻的两个字的位置编码差异,会和长文本中相邻数个字的两个字的位置编码差异一致,如下图所示。

由于上面两种方法都行不通,于是谷歌的科学家们就想到了另外一种方法——使用三角函数。优点是:1、可以使PE分布在区间。2、不同语句相同位置的字符PE值一样(如:当pos=0时,PE=0)。但是缺点在于三角函数具有周期性,可能出现pos值不同但是PE值相同的情况。于是我们可以在原始PE的基础上再增加一个维度:,虽然还是可能出现pos值不同但是PE值相同的情况,但是整个PE的周期是不是明显变长了。那如果我们把PE的长度加长到和word embedding一样长呢?就像(是不是有Positional Encoding计算公式内味了),PE的周期就可以看成是无限长的了,换句话说不论pos有多大都不会出现PE值相同的情况。然后谷歌的科学家们为了让PE值的周期更长,还交替使用sin/cos来计算PE的值,于是就得到了论文中的那个计算公式:

参考文献 https://www.zhihu.com/question/347678607https://blog.csdn.net/tiankong_/article/details/88369349https://zhuanlan.zhihu.com/p/57732839

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。