小面包 面包多
简介
评论
作品封面
永久回看

详解Transformer中位置编码Positional Encoding

¥49.8
投诉
头像
建模先锋 分享信号处理、时序预测、深度学习领域知识代码(购买的代码有答疑解决的请联系QQ:504965502)
作品简介


导读.png


提到 Transformer,大家就会联想到位置编码、注意力机制、编码器-解码器结构,本系列教程将探索 Transformer 的不同模块在故障诊断等信号分类任务中扮演什么样角色,到底哪些模块起作用?

Transformer结构.png

前言

本期基于凯斯西储大学(CWRU)轴承数据,进行 Transformer 中位置编码 (Positional Encoding) 的详细介绍,同时探索位置编码对故障分类任务的影响力。


1 位置编码相关介绍

1.1 数据中的顺序信息

在任何一门语言中,词语的位置和顺序对句子意思表达都是至关重要的。传统的循环神经网络(RNN)中,模型是逐词处理输入序列的,每个时刻的输出依赖于前一个时刻的输出。这种逐序处理的方式使得RNN天生适合处理序列数据,因为它能够隐式地保留序列中词语的顺序信息。


RNN.png


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

位置编码.png


1.2 位置编码的概念

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


一句话概括,Positional Encoding就是将位置信息添加(嵌入)到Embedding词向量中,让Transformer保留词向量的位置信息,可以提高模型对序列的理解能力。


1.3 位置编码分类

对于transformer模型的positional encoding有两种主流方式:


(1) 绝对位置编码:

Learned Positional Embedding方法是最普遍的绝对位置编码方法,该方法直接对不同的位置随机初始化一个 postion embedding,加到 word embedding 上输入模型,作为参数进行训练。

bert_位置编码.png


(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》,实验结果表明使用C omplex embedding相较前两种方法有较明显的提升。



1.4 位置向量与词向量

一般来说,可以使用向量拼接或者相加的方式,将位置向量和词向量相结合。相当于做了输入数据和位置信息数据的矩阵叠加!

输入叠加.png

这里,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 的公式如下:

公式1.png

对应代码实现如下:


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

公式2.png

对于 pos+k 的 positional encoding:

公式3.png


可以看出,对于 pos+k 位置的位置向量某一维 2𝑖 或 2𝑖+1 而言,可以表示为,pos 位置与 k 位置的位置向量的2𝑖 与 2𝑖+1维的线性组合,这样的线性组合意味着位置向量中蕴含了相对位置信息。


2.2 通俗理解

最简单直观的加入位置信息的方式就是使用1,2,3,4,…直接对句子进行位置编码(one-hot)。用二进制转化举个例子:

位置图.png

图中维度0,维度1,维度2,维度3拼成的数字就是该位置对应的二进制表示。可以看到每个维度(每一列)其实都是有周期的,并且周期是不同的。具体来说,每个比特位的变化率都是不一样的,越低位的变化越快(越往右边走,变化频率越快),红色位置0和1每个数字会变化一次,而黄色位,每8个数字才会变化一次。这样就能够说明使用多个周期不同的周期函数组成的多维度编码和递增序列编码其实是可以等价的。这也回答了为什么周期函数能够引入位置信息。


最后,我们需要将位置向量与词向量相结合。一般来说,可以使用向量拼接或直接相加的方式将二者结合起来。下面我们结合轴承故障数据进行实验讲解:


3 轴承故障数据的预处理

2.1 导入数据

参考之前的文章,进行故障10分类的预处理, 凯斯西储大学轴承数据 10分类数据集:

10分类故障图.png

train_set、val_set、test_set 均为按照7:2:1划分训练集、验证集、测试集,最后保存数据


1.2 故障数据预处理与数据集制作

数据集制作.png



2 加入位置编码和 input_embedding 的实验对比

2.1  定义位置编码PositionalEncoding 和 input_embedding

PositionalEncoding.png


对比模型为:

  • 模型 A :Transformer 编码器层 
  • 模型 B :Transformer 编码器层 +   input_embedding -PositionalEncoding 

2.2  西储大学十分类数据集实验对比

(1) 模型 A:

cwur-a.png

模型评估:

准确率、精确率、召回率、F1 Score

cruw-a-模型评估.png


(2) 模型 B:

cwru_b.png


模型评估:

准确率、精确率、召回率、F1 Score

cwru_b_模型评估.png


2.3  东南大学齿轮箱轴承故障-五分类数据集实验对比

(1) 模型 A:

dd_a.png

模型评估:

准确率、精确率、召回率、F1 Score

dd_a_评估.png


(2) 模型 B:

DD_B.png

模型评估:

准确率、精确 率、召回率、 F1 Score

DD_B_PINGG.png


3 实验对比结果分析

实验结果.png

通过两个数据集的对比实验,我们可以发现,仅用Transformer 编码器层在故障信号分类任务上取得了不错的效果,但是加入输入编码和位置编码后,分类效果反而下降了,证明位置编码在故障信号分类任务上作用并不是特别明显!下一期我们将进一步讨论 Transformer 中哪些核心模块对分类精度起着重要作用。


我们将 input_embedding - PositionalEncoding 代码以及对比实验代码、数据已经打包好(仅在西储大学数据集上的对比实验),在如下三个全家桶里面进行了更新,请购买过全家桶的同学及时更新下载!


1.  27个轴承故障诊断模型 | 全网性价比最高全家桶

图片

https://mbd.pub/o/bread/ZZiXm55w


2. 轴承故障诊断—创新模型全家桶

图片

https://mbd.pub/o/bread/ZZiXm55w


3. 轴承故障—交叉注意力创新模型全家桶

交叉注意力.png

https://mbd.pub/o/bread/ZZ6TmZds


单独下载地址:

xxx

面包多.png


往期精彩内容:

Python-凯斯西储大学(CWRU)轴承数据解读与分类处理

Python轴承故障诊断 (一)短时傅里叶变换STFT

Python轴承故障诊断 (二)连续小波变换CWT

Python轴承故障诊断 (三)经验模态分解EMD

Pytorch-LSTM轴承故障一维信号分类(一)

Pytorch-CNN轴承故障一维信号分类(二)

Pytorch-Transformer轴承故障一维信号分类(三)

Python轴承故障诊断 (四)基于EMD-CNN的故障分类

Python轴承故障诊断 (五)基于EMD-LSTM的故障分类

Python轴承故障诊断 (六)基于EMD-Transformer的故障分类

Python轴承故障诊断 (七)基于EMD-CNN-LSTM的故障分类

Python轴承故障诊断 (八)基于EMD-CNN-GRU并行模型的故障分类

基于FFT + CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型

基于FFT + CNN - Transformer 时域、频域特征融合的轴承故障识别模型

Python轴承故障诊断 (九)基于VMD+CNN-BiLSTM的故障分类

Python轴承故障诊断 (十)基于VMD+CNN-Transfromer的故障分类

Python轴承故障诊断 (11)基于VMD+CNN-BiGRU-Attenion的故障分类

交叉注意力融合时域、频域特征的FFT + CNN -BiLSTM-CrossAttention轴承故障识别模型

交叉注意力融合时域、频域特征的FFT + CNN-Transformer-CrossAttention轴承故障识别模型

Python轴承故障诊断入门教学

Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型

Python轴承故障诊断 (14)高创新故障识别模型

Python轴承故障诊断 (15)基于CNN-Transformer的一维故障信号识别模型

Python轴承故障诊断 (16)高创新故障识别模型(二)

独家原创 | SCI 1区 高创新轴承故障诊断模型!

Python轴承故障诊断 (18)基于CNN-TCN-Attention的创新诊断模型

基于 GADF+Swin-CNN-GAM 的高创新轴承故障诊断模型

注意力魔改 | 超强轴承故障诊断模型!

轴承故障—交叉注意力创新模型全家桶

Python轴承故障诊断 (19)基于Transformer-BiLSTM的创新诊断模型

END

1. 版权声明:原创不易,转载请注明转自微信公众号[建模先锋]

2. 喜欢的朋友可以点个关注,给文章点个“在看”,分享朋友圈或讨论群

3. 关注微信公众[建模先锋], 回复”轴承故障“免费获取凯斯西储大学轴承数据集

付费49.8元可获得

购买该全家桶含此作品及其他作品共12件

轴承故障—交叉注意力创新模型全家桶 全家桶

轴承故障—交叉注意力创新模型全家桶

¥1336.7 仅需 ¥240

评论 推荐Ta

暂时还没有评论


头像
建模先锋 分享信号处理、时序预测、深度学习领域知识代码(购买的代码有答疑解决的请联系QQ:504965502)
关注
33 喜欢 12 关注 4393 粉丝 181 作品

在您购买本平台付费作品前,请您认真阅读本声明内容。如果您对这份声明没有异议,则可以继续购买 >>>

  • 主页
  • 私信
登录或购买

详解Transformer中位置编码Positional Encoding

作品简介


导读.png


提到 Transformer,大家就会联想到位置编码、注意力机制、编码器-解码器结构,本系列教程将探索 Transformer 的不同模块在故障诊断等信号分类任务中扮演什么样角色,到底哪些模块起作用?

Transformer结构.png

前言

本期基于凯斯西储大学(CWRU)轴承数据,进行 Transformer 中位置编码 (Positional Encoding) 的详细介绍,同时探索位置编码对故障分类任务的影响力。


1 位置编码相关介绍

1.1 数据中的顺序信息

在任何一门语言中,词语的位置和顺序对句子意思表达都是至关重要的。传统的循环神经网络(RNN)中,模型是逐词处理输入序列的,每个时刻的输出依赖于前一个时刻的输出。这种逐序处理的方式使得RNN天生适合处理序列数据,因为它能够隐式地保留序列中词语的顺序信息。


RNN.png


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

位置编码.png


1.2 位置编码的概念

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


一句话概括,Positional Encoding就是将位置信息添加(嵌入)到Embedding词向量中,让Transformer保留词向量的位置信息,可以提高模型对序列的理解能力。


1.3 位置编码分类

对于transformer模型的positional encoding有两种主流方式:


(1) 绝对位置编码:

Learned Positional Embedding方法是最普遍的绝对位置编码方法,该方法直接对不同的位置随机初始化一个 postion embedding,加到 word embedding 上输入模型,作为参数进行训练。

bert_位置编码.png


(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》,实验结果表明使用C omplex embedding相较前两种方法有较明显的提升。



1.4 位置向量与词向量

一般来说,可以使用向量拼接或者相加的方式,将位置向量和词向量相结合。相当于做了输入数据和位置信息数据的矩阵叠加!

输入叠加.png

这里,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 的公式如下:

公式1.png

对应代码实现如下:


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

公式2.png

对于 pos+k 的 positional encoding:

公式3.png


可以看出,对于 pos+k 位置的位置向量某一维 2𝑖 或 2𝑖+1 而言,可以表示为,pos 位置与 k 位置的位置向量的2𝑖 与 2𝑖+1维的线性组合,这样的线性组合意味着位置向量中蕴含了相对位置信息。


2.2 通俗理解

最简单直观的加入位置信息的方式就是使用1,2,3,4,…直接对句子进行位置编码(one-hot)。用二进制转化举个例子:

位置图.png

图中维度0,维度1,维度2,维度3拼成的数字就是该位置对应的二进制表示。可以看到每个维度(每一列)其实都是有周期的,并且周期是不同的。具体来说,每个比特位的变化率都是不一样的,越低位的变化越快(越往右边走,变化频率越快),红色位置0和1每个数字会变化一次,而黄色位,每8个数字才会变化一次。这样就能够说明使用多个周期不同的周期函数组成的多维度编码和递增序列编码其实是可以等价的。这也回答了为什么周期函数能够引入位置信息。


最后,我们需要将位置向量与词向量相结合。一般来说,可以使用向量拼接或直接相加的方式将二者结合起来。下面我们结合轴承故障数据进行实验讲解:


3 轴承故障数据的预处理

2.1 导入数据

参考之前的文章,进行故障10分类的预处理, 凯斯西储大学轴承数据 10分类数据集:

10分类故障图.png

train_set、val_set、test_set 均为按照7:2:1划分训练集、验证集、测试集,最后保存数据


1.2 故障数据预处理与数据集制作

数据集制作.png



2 加入位置编码和 input_embedding 的实验对比

2.1  定义位置编码PositionalEncoding 和 input_embedding

PositionalEncoding.png


对比模型为:

  • 模型 A :Transformer 编码器层 
  • 模型 B :Transformer 编码器层 +   input_embedding -PositionalEncoding 

2.2  西储大学十分类数据集实验对比

(1) 模型 A:

cwur-a.png

模型评估:

准确率、精确率、召回率、F1 Score

cruw-a-模型评估.png


(2) 模型 B:

cwru_b.png


模型评估:

准确率、精确率、召回率、F1 Score

cwru_b_模型评估.png


2.3  东南大学齿轮箱轴承故障-五分类数据集实验对比

(1) 模型 A:

dd_a.png

模型评估:

准确率、精确率、召回率、F1 Score

dd_a_评估.png


(2) 模型 B:

DD_B.png

模型评估:

准确率、精确 率、召回率、 F1 Score

DD_B_PINGG.png


3 实验对比结果分析

实验结果.png

通过两个数据集的对比实验,我们可以发现,仅用Transformer 编码器层在故障信号分类任务上取得了不错的效果,但是加入输入编码和位置编码后,分类效果反而下降了,证明位置编码在故障信号分类任务上作用并不是特别明显!下一期我们将进一步讨论 Transformer 中哪些核心模块对分类精度起着重要作用。


我们将 input_embedding - PositionalEncoding 代码以及对比实验代码、数据已经打包好(仅在西储大学数据集上的对比实验),在如下三个全家桶里面进行了更新,请购买过全家桶的同学及时更新下载!


1.  27个轴承故障诊断模型 | 全网性价比最高全家桶

图片

https://mbd.pub/o/bread/ZZiXm55w


2. 轴承故障诊断—创新模型全家桶

图片

https://mbd.pub/o/bread/ZZiXm55w


3. 轴承故障—交叉注意力创新模型全家桶

交叉注意力.png

https://mbd.pub/o/bread/ZZ6TmZds


单独下载地址:

xxx

面包多.png


往期精彩内容:

Python-凯斯西储大学(CWRU)轴承数据解读与分类处理

Python轴承故障诊断 (一)短时傅里叶变换STFT

Python轴承故障诊断 (二)连续小波变换CWT

Python轴承故障诊断 (三)经验模态分解EMD

Pytorch-LSTM轴承故障一维信号分类(一)

Pytorch-CNN轴承故障一维信号分类(二)

Pytorch-Transformer轴承故障一维信号分类(三)

Python轴承故障诊断 (四)基于EMD-CNN的故障分类

Python轴承故障诊断 (五)基于EMD-LSTM的故障分类

Python轴承故障诊断 (六)基于EMD-Transformer的故障分类

Python轴承故障诊断 (七)基于EMD-CNN-LSTM的故障分类

Python轴承故障诊断 (八)基于EMD-CNN-GRU并行模型的故障分类

基于FFT + CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型

基于FFT + CNN - Transformer 时域、频域特征融合的轴承故障识别模型

Python轴承故障诊断 (九)基于VMD+CNN-BiLSTM的故障分类

Python轴承故障诊断 (十)基于VMD+CNN-Transfromer的故障分类

Python轴承故障诊断 (11)基于VMD+CNN-BiGRU-Attenion的故障分类

交叉注意力融合时域、频域特征的FFT + CNN -BiLSTM-CrossAttention轴承故障识别模型

交叉注意力融合时域、频域特征的FFT + CNN-Transformer-CrossAttention轴承故障识别模型

Python轴承故障诊断入门教学

Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型

Python轴承故障诊断 (14)高创新故障识别模型

Python轴承故障诊断 (15)基于CNN-Transformer的一维故障信号识别模型

Python轴承故障诊断 (16)高创新故障识别模型(二)

独家原创 | SCI 1区 高创新轴承故障诊断模型!

Python轴承故障诊断 (18)基于CNN-TCN-Attention的创新诊断模型

基于 GADF+Swin-CNN-GAM 的高创新轴承故障诊断模型

注意力魔改 | 超强轴承故障诊断模型!

轴承故障—交叉注意力创新模型全家桶

Python轴承故障诊断 (19)基于Transformer-BiLSTM的创新诊断模型

END

1. 版权声明:原创不易,转载请注明转自微信公众号[建模先锋]

2. 喜欢的朋友可以点个关注,给文章点个“在看”,分享朋友圈或讨论群

3. 关注微信公众[建模先锋], 回复”轴承故障“免费获取凯斯西储大学轴承数据集

创作时间: