Py学习  »  机器学习算法

传感器数据的深度学习模型应用(二)—— LSTM

智驾社 • 6 月前 • 183 次点击  
长短期记忆网络(Long Short-Term Memory,LSTM)是递归神经网络(Recurrent Neural Network,RNN)的一个变种,专门设计用来解决标准 RNN 在处理长序列数据时遇到的梯度消失或梯度爆炸问题。标准 RNN 在反向传播过程中,由于链式法则的应用,梯度可能会在多层传播中指数级地减小(梯度消失)或增大(梯度爆炸),这使得网络难以学习和记住长时间步的依赖关系。
由于篇幅所限,文章中不能展示全部过程的 MATLAB 代码,如果读者想要测试运行代码,可以扫码后通过提供的链接进行下载。
获取代码
    ◆  

1. 递归神经网络(RNN)

RNN 的核心是其循环结构。在每个时间步,RNN 不仅接收当前输入数据,还接收前一时间步的隐藏状态,正是隐藏状态的设计,使得网络能够记住和利用之前的信息。

图 1 RNN 单元结构

图 1显示了标准 RNN 的单元结构,其中输入向量 xt,输出向量 ot,隐藏状态向量 ht-1。当前隐藏状态向量 h 的计算如下,其输入当前时间步向量 x和前一时间段步的隐藏状态向量 ht-1


中 σ 表示激活函数,Wh 和 Wx 是隐藏状态变换参数和输入变换参数,隐藏状态负责记忆之前时间步上的信息。RNN 的输出向量 o是对隐藏状态做线性变换

中 σ 表示激活函数,Wo 输出变换。Wh 、Wx 和 Wo 是 RNN 要学习的参数。标准的 RNN 结构存在两个主要问题:梯度消失(或增大);长期信息丢失。
  • 梯度消失(或增大)
    在长时间序列中,梯度是消失还是增大,与选择的激活函数有关,这里我们解释梯度消失问题。假设损失函数为 L,在反向传播过程中,针对参数 W的梯度计算为:

    而 ∂h1/∂wh 是通过激活函数做梯度计算,激活函数的取值范围是[-1,1](tanh函数)或[0,1](sigmod函数),因此,连续相乘会产生梯度消失,
  • 长期信息丢失
    对当前隐藏状态向量产生影响的是当前时间步的输入向量和前一个时间步的隐藏状态向量。当前输入数据往往是会携带大量信息,而隐藏状态变量是递归生成的,随着递归次数的增加其变化量也会较少,因此 Wx × xt 的值会大于 Wh × ht-1

2. 长短期记忆(LSTM)

LSTM 是一种新的 RNN 结构,能够有效地保留长期信息并缓解梯度消失问题。LSTM 引入了一个记忆单元(也是单元状态向量),用于存储长期信息。记忆单元通过直接的线性连接在时间步之间传递信息,避免了梯度消失问题 。LSTM 通过三个门(遗忘门、输入门和输出门)来控制信息在时间步间的流动量。

  • 遗忘门: 决定记忆单元中哪些信息需要丢弃。

  • 输入门: 决定哪些新的信息会被加入记忆单元。

  • 输出门: 控制记忆单元的输出部分如何影响最终的输出。

LSTM 的单元结构如图2所示。其中,f、i、o 分别是遗忘门、输入门和输出门,g 表示候选进入单元状态的信息;σg 和 σc表示激活函数, 表示向量对应元素相乘。
图 2 LSTM 单元结构
每个门对输入数据和前一时刻的隐藏状态向量的转换过程可以表示为:

遗忘门:

输入门:

输出门:

候选状态单元:

进一步,单元状态(cell state)表示为:

隐藏状态(hidden state)表示为:

般情况下,激活函数 σg 和 σc分别采用 tanh 函数和 sigmod 函数。正如公式(5)所示,t 时刻的单元状态 ct,是对前一时刻的单元状态做部分遗忘,遗忘的比例由遗忘门 ft 决定;并增加部分输入数据,增加的比例由输入门决定 it。而公式(6)表明,每个时间步的隐藏状态是部分单元状态,比例部分由输出门 ot 决定

正是由于单元状态的引入,可以通过一条直接的路径记住每个时间步的输入数据,也就是长期依赖关系;而输入数据通过加法(类似于残差)引入单元状态中,使得反向传播过程的梯度消失得到缓解。

3. MATLAB 对 LSTM的支持

在 MATLAB 中,lstmLayer 层实现了 LSTM,其提供了多个属性用于设置和初始化 LSTM 的相关参数。

MATLAB 中的 lstmLayer 及其属性

例如 NumHiddenUnits 用于设置隐藏状态向量的维度,隐藏状态包含来自所有先前时间步的信息,其大小也决定了 LSTM 要学习的参数的规模;stateActivateFunction 设置单元状态和隐藏状态的激活函数;gateActivateFunction 用于设置门操作的激活函数;还有一个很重要的属性 outputMode,其有两个值:sequence 和 last。LSTM 单元按时间步顺序处理输入数据,输出是当前时间步的隐藏状态,如图 3 所示。如果 outputMode 的属性值为 sequence,每个时间步的隐藏状态向量都会输出,最终 lstmLayer 输出一个隐藏状态序列,序列长度等于输入序列的长度;如果 outputMode 的属性值为 last,那么 lstmLayer 只输出最后一个时间步的隐藏状态向量。由于 LSTM 是对输入序列递归处理,所以最后一个时间的输出隐藏状态向量已经包含其与之前所有时间步的依赖关系。
图3(a)LSTM单元的每个时间步的输入数据和输出数据;

图3 (b) LSTM递归处理输入序列,并生成相应的输出序列

MATLAB 还同时支持 BiLSTM(Biderectional Long Short-Term Memory),也就是双向 LSTM。BiLSTM 是对 LSTM 的扩展,通过引入双向信息流来增强模型的上下文捕获能力。在 BiLSTM 中,输入序列不仅从前向后处理(正向 LSTM),还从后向前处理(反向 LSTM)。这种双向处理方式允许模型在每个时间步上同时考虑前后文信息,从而提高预测的准确性。

类似于 lstmLayer,MATLAB 中的 bilstmLayer 实现了 BiLSTM。属性 NumHiddenUnits 用于设置隐藏状态向量的维度,其包含先前时间步和后续时间步的信息,而实际输出的隐藏状态向量维度为 2*NumHiddenUnits,即将前向和后向两个处理过程的隐藏状态进行连接。

4. LSTM 在基于信号数据的故障诊断中的应用

基于 LSTM,可以构建分类网络对设备或器件做故障诊断。LSTM 可以捕获传感器数据在时间上的依赖关系,进而可以识别设备的动态特性实现诊断或预测。使用 Deep Network Designer App 构建分类网络,如图 4 所示。

图4 LSTM分类网络

lstmLayer 的隐藏单元向量维度设置为 128,outputMode 设置为 sequence,因此,lstmLayer 层的输出是一个隐藏状态向量序列,并且序列中的每个向量的维度为 128。在 lstmLayer 之后使用 globalMaxPooling1dLayer 层对输出结果在时间方向上做最大值池化(这类似在传感器数据的 深度学习模型应用(一) – Transformer中使用的方法),进而其输出结果为一个128维的向量,最后我们使用两个全连接层做线性变化,最终输出为 3 维的向量对应于故障种类。

使用在传感器数据的深度学习模型应用(一) – Transformer 提到的数据集,该数据集是对原始信号数据做了时域、频域、以及时频域的特征提取,进而将具有 146484 采样点一维数据,转换为 1464×30 的二维矩阵(因此,在 LSTM 分类网络中输入层的维度为 30)。数据集进步划分为训练集和测试集,如下所示:

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

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

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

5. 总结

本文的目的主要是介绍 Long-short term memory(LSTM),以及 MATLAB 对 LSTM 支持和如何在 MATLAB 中构建基于 LSTM 的分类网络。当然基于 LSTM 还可以构建回归网络,实现序列到一个值和序列到序列的预测。本文目的是给读者在序列数据分析提供一种思路,文中的模型设计和训练还有可以优化地方,仅为读者提供参考,也欢迎大家做进一步模型结构调整和精度提升。

扫码获取代码
    ◆  
阅读上期文章:
传感器数据的深度学习模型应用(一)—— Transformer 模型
    ◆  

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/179912
 
183 次点击