当LSTM遇上注意力:手把手教你玩转时序预测
·
Attention-LSTM时序预测,单输入单输出 基于注意力机制attention结合长短期记忆网络LSTM时间序列预测, 单输入单输出模型 MATLAB版本为2020b及其以上 中文注释清晰,非常适合科研小白 评价指标包括:R2、MAE、MSE、RMSE等
时序预测总让人头疼?试试这个能让模型自动"划重点"的Attention-LSTM组合拳。咱们今天用MATLAB实战演练,就算刚入门的同学也能轻松上手。
先看数据准备。假设我们有个温度变化序列,每30分钟采样一次:
% 生成示例数据(替换成真实数据即可)
time = 1:720; % 假设是30天的分钟级数据
temperature = 20 + 5*sin(time/24) + randn(size(time))*0.5;
data = num2cell(temperature'); % 转换为cell格式方便处理
% 划分训练测试集(7:3比例)
trainData = data(1:500);
testData = data(501:end);
接下来是模型的重头戏——自定义注意力层。这里有个小技巧:通过全连接层计算注意力权重
classdef attentionLayer < nnet.layer.Layer
properties
Units
end
methods
function layer = attentionLayer(units)
layer.Units = units;
layer.Name = "attention";
end
function Z = predict(layer, X)
% X的维度 [features, timesteps, batch]
[~, timesteps, batch] = size(X);
% 注意力权重计算
weights = fullyconnect(X, rand(1, size(X,1)), 'DataFormat','CBT');
weights = softmax(weights, 'DataFormat','CB');
% 上下文向量生成
context = sum(X .* reshape(weights,1,timesteps,batch),2);
Z = context; % 输出维度 [features, 1, batch]
end
end
end
模型搭建就像搭积木。注意这个设计:先让LSTM记住长期模式,再用注意力找出关键时间点
inputSize = 1;
numHiddenUnits = 64;
layers = [
sequenceInputLayer(inputSize)
lstmLayer(numHiddenUnits,'OutputMode','sequence')
attentionLayer(32) % 自定义注意力层
fullyConnectedLayer(1)
regressionLayer];
options = trainingOptions('adam', ...
'MaxEpochs',200, ...
'MiniBatchSize',32, ...
'Plots','training-progress');
训练过程可能会有点"过山车",别慌——这是模型在努力学习数据的节奏:
net = trainNetwork(trainData(1:end-1), trainData(2:end), layers, options);
预测阶段要注意维度对齐。这里有个避坑指南:记得用predictAndUpdateState处理连续预测
% 单步预测
net = predictAndUpdateState(net, trainData);
[net, pred] = predict(net, testData(1:end-1), 'SequenceLength',1);
% 可视化对比
plot([cell2mat(testData(2:end))'; pred'], 'LineWidth',1.5)
legend('真实值','预测值')
最后上硬指标,用这些公式给模型打分:
% 评价指标计算
y_true = cell2mat(testData(2:end));
y_pred = cell2mat(pred');
mae = mean(abs(y_true - y_pred));
mse = mean((y_true - y_pred).^2);
rmse = sqrt(mse);
r2 = 1 - sum((y_true - y_pred).^2)/sum((y_true - mean(y_true)).^2);
disp(['MAE:' num2str(mae) ' MSE:' num2str(mse)])
disp(['RMSE:' num2str(rmse) ' R²:' num2str(r2)])
跑完代码如果发现预测曲线像心电图,试试这三板斧:加大LSTM层数、调整注意力维度、增加训练轮次。注意机制有个隐藏福利——可视化注意力权重,能清楚看到模型在哪些时间点"走神"了。
这种组合模型特别适合有周期性波动但又存在异常波动的数据,比如电力负荷预测、股票价格波动分析。下次遇到时序难题,不妨让Attention-LSTM帮你"擦亮眼睛"找关键。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)