/ ai资讯

如何使用MATLAB构建Transformer模型

发布时间:2025-02-06 11:46:09

Transformer 模型在 2017 年由 Vaswani 等人在论文《Attentionis All You Need》中首次提出。其设计初衷是为了解决自然语言处理(Nature LanguageProcessing, NLP)中的序列到序列任务,如机器翻译。Transformer 通过引入自注意力机制使得处理长距离依赖关系时变得高效。因此 Vaswani 等人的论文强调“注意力是所需的一切”。

传感器数据表现为时间序列,并且序列内部往往存在时间上的依赖关系,这些时间上的依赖能够反映出设备的当下或未来的状态,如何发现和挖掘序列内部的知识和依赖关系,是以传感器表征设备状态的工业领域中故障诊断关注的重点。

本文中主要关注 Transformer 在传感器数据中的应用,通过其编码器功能捕获序列内部依赖关系,尤其是长距离的依赖关系,并生成输出数据做进一步处理。后续的内容将对图 1 中的编码器的功能及其在 MATLAB 中的实现做进一步介绍,最后通过一个案例演示在 MATLAB 如如何设计和构建 Transformer 的编码器网络,并在信号数据集中进行训练,同时也展示了经过初步训练后的模型在测试集上的良好测试结果。由于篇幅所限,文章中不能展示全部过程的 MATLAB 代码,如果读者想要测试运行代码,可以扫码后通过提供的链接进行下载

1. Transformer 模型

Transformer 模型的核心是自注意力机制(Self-Attention Mechanism)及完全基于注意力的编码器-解码器架构。图1显示了在论文《Attention is All You Need》中提出的 Transformer 架构,其主要由编码器(Encoder,图 1 中左侧部分)和解码器(Decoder,图1中的右侧部分)两个部分组成,编码器的输出序列将编码器和解码器关联起来,构建跨序列的注意力机制。

图 1 Transformer 架构

Transformer 编码器(Encoder)专门用于处理输入序列,通过引入自注意力机制,使其能够高效地捕捉序列中的长距离依赖关系。而这种依赖关系体现为输入序列不同位置之间的相关性。并且将相关性信息加入到输出序列中,使得输出数据包含丰富的上下文信息。

Transformer 解码器(Decoder)主要负责逐步生成输出结果。解码器根据编码器生成的上下文信息和前一步生成的输出,逐步输出目标序列的每一个元素。在解码器中,采用了带有掩码的自注意力机制,使得在计算输出向量时只考虑当前和之前的输入数据,以保持生成结果的顺序性。同时,解码也采用了交叉注意力机制,将编码器的输出结果引入到解码器中。通过交叉注意力机制,计算与编码器的输出序列的相关性。这一机制保证解码器在生成每个输出向量(输出词)时,不仅要考虑之前输出的词,还要考虑编码器生成的上下文信息。

本文主要关注 Transformer 在时间序列(信号)上的应用,主要利用 Transformer 编码器发现序列内部在时间上的依赖关系。接下来将重点介绍 Transformer 编码器及其在 MATLAB 中的实现,并利用 Transformer 编码器构建分类模型 。

2.Transformer编码器及其在MATLAB中的实现

Transformer 编码器的主要由输入、位置编码(input embedding)、多头注意力(multi-head attention)、残差(Add)、标准化(Norm),以及前馈网络(Feed Forward)组成。对于每一个组成部分,在MATLAB中都对应的网络层。

图 2Transformer 编码器

输入序列

Transformer 的提出是针对序列到序列的自然语言处理任务。自然语言文本首先被转换为固定长度的向量表示,进而形成输入向量序列。我们以自然语言文本“Do you speak MATLAB”为例,MATLAB 中的文本分析工具箱提供FastText预训练词嵌入模型,可以将英文单词转换为 300 维的词向量。例如对于“Do”,通过以下操作可以转为300维的词向量 vec (如下所示):

基于 FastText 生成词向量

其中,fastTextWordEmbedding是FastText预训练词嵌入模型,word2vec将词转换为向量表示。进而,输入的自然语言文本被转换为词向量序列,如图 3 所示

图 3 自然语言文本转换为词向量序列

位置编码(input embedding)

Transformer 不具备内置的序列顺序信息,需要通过位置编码将序列位置信息注入到输入数据中。在 MATLAB 中,通过使用positionEmbeddingLayer层,将序列顺序信息注入到输入数据中,如下所示。positionEmbeddingLayer的OutputSize的属性设置为词向量维度。

自注意力机制

Transformer 模型的核心是自注意力机制。对于输入序列中每个位置对应的向量。自注意力机制首先通过线性变换生成三个向量:查询(Query),键(Key),和值(Value)。然后,通过计算查询和键之间的点积来获得注意力得分(即相关性),这些得分经过 Softmax 归一化后,用于加权求和值向量,即生成输出向量。

以图3中的输入序列为例,假设自然语言文本对应的词向量按顺序分别定义为d, y, s, m。并且定义 Query,Key,Value 的转换矩阵为wq, wk, wv。对于词“you”对应的词向量y,通过线性变换生成的 Query,Key,Value 向量为:

yq = wq × y;

yk = wk × y;

yv = wv × y;

同理,对于词“Do”对应的词向量d,通过线性变换生成的 Query,Key,Value 向量为:

dq = wq × d;

dk = wk × d;

dv = wv × d;

其它两个词向量以此类推。

图 4 词向量的线性变换

对于词“Do”,计算其与其它四个词的相关性,分别为:·

rdd =dq· dk

rdy =dq· yk

rds = dq · sk

rdm =dq· mk

其中,rdd,rdy,rds,rdm,分别表示“Do”与自身、“you”、“speak”、“MATLAB”的相关性。利用 softmax 对相关性做归一化处理,并生成归一化后的相关性srdd,srdy,srds,srdm,将其它词对当前词的影响纳入的新生成的向量do 中,即:

do=srdd× dv srdy× yv srds× sv srdm× mv

使用同样的计算,可以得到输出向量:do,yo,so,mo(如图5所示)。

图 5 输入的序列经过自注意力计算后生成新的输出序列

通过以上介绍,self-attention 机制可以总结出:

通过三个线性变换(也是要学习的参数,当然还包含偏差)对输入序列的每个位置的向量衍生出三个向量,经过相关性计算以及加权平均,又转换为一个输出向量。但是输出向量不仅包含自身的信息,还同时包含了与输入序列其它位置的依赖关系(即其它位置向量的相关性),因此其信息内容更加丰富。

每个输入序列位置上的计算过程都是独立进行,并没有前后依赖关系(类似 LSTM),因此可以通过并行计算进行加速

通过独立计算不同位置间的相关性来捕获输入序列内部的依赖信息,因此其处理长距离的依赖关系更有效,可以避免 LSTM 的长距离依赖关系通过串行传递导致的信息不断衰减问题。

在 MATLAB 中,selfAttentionLayer层实现了自注意力机制。NumKeyChannels属性决定转换后的 Key 向量的维度。因为 Query 要与 Key 做内积,所以 Query 向量的维度与 Key 的维度相同。对于 Value 向量的维度,也可以通过属性NumValueChannels进行设置。如果NumValueChannels设置为“auto”,那么其与 key 向量的维度一致 (如下所示)。

自注意力机制中,线性变换矩阵就是要学习的参数(当然也包含偏差)。而参数规模通过设置生成的 Query、Key 和 Value 向量的维度自动决定。例如,当词向量 d 的维度是 300,如果设置 Key 向量 k 的维度设置为 512,那么变换矩阵wk(Key Weights)大小为:512×300,即:

自注意力中的 Key 向量生成过程

带有掩码的自注意力机制(Masked Self-Attention)

Masked Self-Attention 主要用于处理序列数据中的有序性,使用掩码来限制注意力的范围。具体来说,掩码会遮挡掉未来时间步的信息,确保模型在生成当前位置的输出向量时,只能访问当前位置及之前位置的词向量,以保持生成过程的顺序性。在 MATLAB 中,通过设置selfAttentionLayer层的属性AttentionMask值为“causal”实现带掩码的自注意力机制。

多头自注意力机制

多头自注意力通过并行地执行多个自注意力计算(也就是单头自注意力计算),然后将结果拼接起来。这种方法允许模型在不同的“注意力空间”中捕捉不同类型的信息。这里的“注意力空间”可以用一组 Query、key、Value 向量的线性变换表示。每个“头”使用不同的线性变换对输入序列生成 Query、key、Value,再计算注意力,并生成不同的输出向量。将所有头的输出向量拼接(concatenate)在一起。拼接后的结果可以选择(也可以不选择)通过另一个线性变换整合来自所有头的信息,生成最终的多头自注意力输出向量(如图6所示)。

图 6 多头(2头,two-head)自注意力机制

在 MATLAB 中,通过设置selfAttentionLayer层的属性NumHeads来决定多头自注意力机制的头数(heads)。

在 Transformer 中,除了自注意力机制外的前馈网络、残差链接、以及层归一化,都属于常规网络层,分别对应 MATLAB 中fullyConnectedLayer、additionLayer和layerNormalizationLayer,这些都是常规操作,这里就不做介绍。 ▼

3.Transformer编码器在基于信号数据的故障诊断中的应用

设备故障诊断是涉及通过各种传感器数据检测和识别设备故障。传感器数据内部蕴含了时间上的依赖关系,这种依赖关系表现了设备的动态变化过程,因此,捕获传感器数据蕴含的动态变化过程,可以很好的识别和预测设备的故障状态。

本文的故障诊断案例是针对使用轴承的旋转机械。这些机械系统常常因电流通过轴承放电而导致电机轴承在系统启动后的几个月内发生故障。如果未能及时检测这些问题,可能会导致系统运行的重大问题。

数据集

数据集包含从轴承测试台和真实生产中的旋转机械收集的振动数据。总共有 34 组数据。信号采样频率为 25 Hz。设备状态包含三种:健康(healthy),内圈故障(inner race fault),外圈故障(outer race fault)。

由于轴承电流是由变速条件引起的,故障频率会随着速度变化而在频率范围内上下波动。因此,轴承振动信号本质上是非平稳的。时频表示可以很好地捕捉这种非平稳特性。从信号的时间、频率和时频表示中提取的组合特征可用于提高系统的故障检测性能。图7显示了信号在时域和时频域上的显示。

图 7 输入数据(信号)在时域(上)和时频域(下)上的显示

对于信号数据,MATLAB 提供了特征提取函数,可以分别从时域、频域和时频域上提取特征:

时域 - signalTimeFeatureExtractor

signalTimeFeatureExtractor 可以提取时域上的统计特征,如期望(mean)、均方根(RMS)、标准差(StandardDeviation)、及峰值(PeakValue)。而时域上的其它特征,如ShapeFactor、SNR等在本文案例中并没有提取。signalTimeFeatureExtractor 在做信号特征提取的时候需要设置一个窗口(FrameSize),窗口大小决定了计算统计特征的采样点数量。

频域 – signalFrequencyFeatureExtractor

signalFrequencyFeatureExtractor 用于在频域上提取信号的统计特征,在本文中,主要提取频率期望(MeanFrequency)、频谱峰值位置(PeakLocation)、频谱峰值(PeakAmplitude)、及平均频带功率(BandPower)。频域上的其它特征,如OccupiedBandwidth等在本文中并没有提取。signalFrequencyFeatureExtractor 在做信号特征提取时,同样需要设置一个窗口(FrameSize),用于指定每个帧的采样点数,也是频域特征提取时分析窗口的大小。当处理长时间信号时,将信号分成较小的帧可以更有效地进行频域分析。

时频域 – signalTimeFrequencyFeatureExtractor

signalTimeFrequencyFeatureExtractor 用于在时频域上提取信号的特征,捕捉到信号在时间和频率上的变化。在本文中,时频上提取频谱峭度(SpectralKurtosis)和频谱偏度(SpectralSkewness)。在时频域分析中,谱峭度值描述了信号在特定时间点上的频谱形状的尖锐程度或平坦程度,通过频谱峭度分析,可以识别信号中的瞬态事件或冲击。谱偏度值描述了信号在特定时间点上频谱的对称性或偏斜程度,通过分析频谱偏度,可以识别信号中非对称的频率分布。

原始信号经过分帧并做特征提取,从具有 146484 采样点一维数据,转换为 1464×30 的二维矩阵,如图 8 所示。矩阵的行表示时间点,矩阵的列表示特征。

图 8 经过特征提取的信号数据

对于转换后的数据,每个特征可以抽象成一个传感器,每个采样点同时从 30 个传感器采集数据而组成一个特征向量。一个样本共进行1464次采样。这样就为接下来的 Transformer 编码器模型训练准备好了数据基础

基于Transformer编码器构建分类模型

本文是对照《Attentionis all you need》论文中的 Transformer 编码器,通过Deep Network Designer app构建编码器网络,如图9所示。Transformer 编码器的每个组成部分,在MATLAB中都有对应的网络层,通过这些层可以快速的组建网络,并自定义每层的参数。例如本文中,selfAttentionLayer层的头数是 2,并带有掩码。

图 9 基于Transformer的编码器构建故障诊断模型(分类模型)

编码器的输出是带有上下文信息的向量序列,而在设备的故障诊断中,故障的类型是离散的。本文中,轴承有内圈故障、外圈故障、以及健康状态三种类型。因此,还需要利用编码器的输出向量,进一步来构建三分类模型。

对于 Transformer 编码器的输出向量序列,MATLAB 提供globalAveragePooling1dLayer和globalMaxPooling1dLayer两种全局池化方法,在序列(或时间)方向上做向量每个维度上的数据合并。在本文中,编码器的输出序列向量的维度是 30,序列长度(时间步)是 1464,即 1464×30。经过数据合并后,变为:1×30,如图 10 所示。

图 10 向量序列在时间方向的合并

序列数据做全局池化后的输出结果是一维数据,通过连接全连接网络层fullyConnectedLayer,进一步缩减为三输出,即对应于三分类。最后再通过softmaxLayer转换为概率分布,进而判断所属类别。整体网络模型如图11所示。

图11 基于 Transformer 的编码器构建分类模型

模型训练与测试

本文共收集34条信号数据,采用随机的方式按照 70% 和 30% 进一步将数据集划分为训练集和测试集(由于数据量有限,训练过程并没有使用验证集)。

训练集(上)和测试集(下)

模型训练过程,MATLAB 提供了超参数选项实现模型的进一步调优,而超参数选项是通过 trainingOptions 函数设置的,包括初始学习速率、学习速率衰减策略、minibatch 大小、训练执行环境(GPU、CPU)、训练周期等等。经过 100 个 Epoch 训练的模型在测试集上的测试结果如下:

图 12 模型训练过程(上)和测试集精度(heatmap)(下)

从测试的结果看,Transforme 编码器对长距离依赖关系的捕获效果还是比较好的。

4.总结

本文的目的主要是介绍 Transformer 模型的编码器,以及如何使用 MATLAB 构建 Transformer 模型,并为读者提供一种 Transformer 编码器的应用思路,模型本身以及训练过程还有可以优化地方,仅为读者提供参考,也欢迎大家做进一步模型结构调整和精度提升。

  • matlab matlab 关注

    关注

    185

    文章

    2981

    浏览量

    231010
  • 编码器 编码器 关注

    关注

    45

    文章

    3669

    浏览量

    135245

免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。

如有疑问请发送邮件至:bangqikeconnect@gmail.com