Encoding 详解Transformer中位置编码Positional

提到 Transformer,大家就会联想到位置编码、留意力机制、编码器-解码器结构,本系列教程将探求 Transformer 的不同模块在缺点诊断等信号分类义务中表演什么样角色,究竟哪些模块起作用?

前言

本期基于凯斯西储大学(CWRU)轴承数据,启动 Transformer 中位置编码 (Positional Encoding)的详细引见,同时探求位置编码对缺点分类义务的影响力。

1位置编码相关引见

1.1 数据中的顺序消息

在任何一门言语中,词语的位置和顺序对句子意思表白都是至关关键的。传统的循环神经网络(RNN)中,模型是逐词解决输入序列的,每个时辰的输入依赖于前一个时辰的输入。这种逐序解决的模式使得RNN天生适宜解决序列数据,由于它能够隐式地保管序列中词语的顺序消息。

由于Transformer模型没有RNN(循环神经网络)或CNN(卷积神经网络)结构,句子中的词语都是同时进入网络启动解决,所以没有明白的关于单词在源句子中位置的相对或相对的消息。为了让模型了解序列中每个单词的位置(顺序),Transformer论文中提出了经常使用一种叫做 Positional Encoding(位置编码) 的技术。这种技术经过为每个单词参与一个额外的编码来示意它在序列中的位置,这样模型就能够了解单词在序列中的相对位置。

1.2 位置编码的概念

RNN作为特色提取器,是自带词的前后顺序消息的;而Attention机制并没有思考先后顺序消息,但前后顺序消息对语义影响很大,因此须要经过Positional Embedding这种模式把前后位置消息加在输入的Embedding上。

一句话概括,Positional Encoding就是将位置消息参与(嵌入)到Embedding词向量中,让Transformer保管词向量的位置消息,可以提高模型对序列的了解才干。

1.3 位置编码分类

关于transformer模型的positional encoding有两种干流模式:

(1)相对位置编码:

Learned Positional Embedding方法是最广泛的相对位置编码方法,该方法间接对不同的位置随机初始化一个 postion embedding,加到 word embedding 上输入模型,作为参数启动训练。

(2)相对位置编码

经常使用相对位置编码,不同位置对应的 positional embedding 诚然不同,然而位置1和位置2的距离比位置3和位置10的距离更近,位置1和位置2、位置3和位置4都只相差1,这些表现了相对位置编码。

罕用的相对位置编码方法有Sinusoidal Positional Encoding 和 Learned Positional Encoding。其中,Sinusoidal Positional Encoding 是经过将正弦和余弦函数的不同频率运行于输入序列的位置来计算位置编码;Learned Positional Encoding 是经过学习一组可学习参数来计算位置编码。

(3)复杂编码-Complex embedding

在《Attention is all you need》里提到,Learned Positional Embedding和Sinusoidal Position Encoding两种模式的成果没有显著的差异。在论文 《Encoding Word Oder In Complex Embeddings》,试验结果标明经常使用Complex embedding相较前两种方法有较显著的优化。

1.4 位置向量与词向量

普通来说,可以经常使用向量拼接或许相加的模式,将位置向量和词向量相联合。相当于做了输入数据和位置消息数据的矩阵叠加!

这里,input_embedding 是经过惯例Embedding层,将每一个token的向量维度,也就是输入维度,从数据自身的维度映射到 d_model。由于是相加相关,则 positional_encoding 也是一个 d_model 维度的向量。(原论文中,d_model=512)

关于这个 d_model:

在深度学习和Transformer模型的高低文中,d_model中的“d”通常代表“dimension”,即“维度”的简写。因此,d_model指的是模型中向量的维度大小,这是一个关键的参数,d_model 定义了每层的大小、嵌入层的大小、自留意力机制的大小、前馈网络的输入和输入大小。

选用适宜的d_model对模型的功能有严重影响。假设d_model太小,模型或许不可捕捉到足够的消息;而假设d_model太大,则会参与计算老本和过拟合的危险。因此,在设计模型时须要细心考量d_model的大小。

2位置编码原理

2.1 原了解析

Transformer论文中,经常使用正余弦函数示意相对位置,经过两者乘积获取相对位置。由于正余弦函数具备周期性,可以很好地示意序列中单词的相对位置。咱们以Sinusoidal Positional Encoding为例,启动解说。

首先解释下论文中的公式,并给出对应代码,Positional Encoding 的公式如下:

对应代码成功如下:

class PositionalEncoding(nn.Module):"Implement the PE function."def __init__(self, d_model, dropout, max_len=5000):super(PositionalEncoding, self).__init__()self.dropout = nn.Dropout(p=dropout)# Compute the positional encodings once in log space.pe = torch.zeros(max_len, d_model)position = torch.arange(0, max_len).unsqueeze(1)div_term = torch.exp(torch.arange(0, d_model, 2) *-(math.log(10000.0) / d_model))pe[:, 0::2] = torch.sin(position * div_term)pe[:, 1::2] = torch.cos(position * div_term)pe = pe.unsqueeze(0)self.register_buffer('pe', pe)def forward(self, x):x = x + Variable(self.pe[:, :x.size(1)],requires_grad=False)return self.dropout(x)

从公式中可以看出,一个词语的位置编码是由不同频率的余弦函数组成的,这样设计的好处是:pos+k 位置的 positional encoding 可以被 pos 线性示意,表现其相对位置相关。只管Sinusoidal Position Encoding看起来很复杂,然而证实pos+k 可以被 pos 线性示意,只有要用到高中的正弦余弦公式:

关于 pos+k 的 positional encoding:

可以看出,关于 pos+k 位置的位置向量某一维 2

您可能还会对下面的文章感兴趣: