企业宣传,产品推广,广告招商,广告投放联系seowdb

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

© 版权声明
评论 抢沙发
加载中~
每日一言
不怕万人阻挡,只怕自己投降
Not afraid of people blocking, I'm afraid their surrender