1. 项目概述:LSTM与多头注意力机制的分类实战
在自然语言处理领域,序列建模一直是个核心挑战。传统RNN存在梯度消失问题,难以捕捉长距离依赖关系。LSTM(长短期记忆网络)通过精心设计的门控机制,有效解决了这一问题。而Attention机制则让模型能够动态关注输入序列的不同部分,进一步提升模型性能。本项目将结合这两种强大技术,在Matlab环境下实现一个文本分类器。
Matlab虽然不像Python那样在深度学习领域占据主导地位,但其卓越的矩阵运算能力和直观的可视化界面,使其成为快速原型开发的理想选择。特别是对于工程背景的研究人员和学生,Matlab提供了更贴近数学表达的实现方式。
2. 核心组件解析
2.1 LSTM网络架构
LSTM的核心在于三个门控单元:遗忘门、输入门和输出门。这些门控通过sigmoid函数控制信息流动:
matlab复制% 典型LSTM层的Matlab定义
lstmLayer(numHiddenUnits, 'OutputMode', 'last', ...
'StateActivationFunction', 'tanh', ...
'GateActivationFunction', 'sigmoid');
遗忘门决定从细胞状态中丢弃哪些信息:
code复制f_t = σ(W_f · [h_{t-1}, x_t] + b_f)
输入门控制新信息的更新:
code复制i_t = σ(W_i · [h_{t-1}, x_t] + b_i)
C̃_t = tanh(W_C · [h_{t-1}, x_t] + b_C)
输出门决定最终的输出:
code复制o_t = σ(W_o · [h_{t-1}, x_t] + b_o)
h_t = o_t * tanh(C_t)
2.2 多头注意力机制
多头注意力是Transformer的核心组件,我们将其适配到LSTM架构中:
matlab复制function output = multiheadAttention(query, key, value, numHeads)
d_model = size(query, 2);
depth = d_model / numHeads;
% 分割为多个头
query = reshape(query, [], numHeads, depth);
key = reshape(key, [], numHeads, depth);
value = reshape(value, [], numHeads, depth);
% 计算注意力分数
scores = pagemtimes(query, 'none', key, 'transpose') / sqrt(depth);
attention_weights = softmax(scores, 1);
% 应用注意力权重
output = pagemtimes(attention_weights, value);
output = reshape(output, [], d_model);
end
每个注意力头可以关注序列的不同位置,为模型提供更丰富的表示能力。
3. 数据预处理流程
3.1 文本清洗与分词
matlab复制function documents = preprocessText(textData)
% 转换为小写
textData = lower(textData);
% 移除标点符号
textData = erasePunctuation(textData);
% 分词
documents = tokenizedDocument(textData);
% 移除停用词
documents = removeWords(documents, stopWords);
end
3.2 序列填充与截断
matlab复制sequenceLength = 100;
XTrain = doc2sequence(enc, documentsTrain, ...
'Length', sequenceLength, ...
'PaddingDirection', 'left', ...
'PaddingValue', 0);
提示:左填充通常比右填充效果更好,因为LSTM最后的状态会包含更多有用信息
4. 模型构建与训练
4.1 网络架构定义
matlab复制inputSize = 1;
embeddingDimension = 128;
numHiddenUnits = 100;
numHeads = 4;
layers = [
sequenceInputLayer(inputSize)
wordEmbeddingLayer(embeddingDimension, enc.NumWords)
% LSTM层
lstmLayer(numHiddenUnits, 'OutputMode', 'sequence')
% 多头注意力
functionLayer(@(X) multiheadAttention(X,X,X,numHeads), 'Name', 'attention')
% 全局平均池化
globalAveragePooling1dLayer
fullyConnectedLayer(numClasses)
softmaxLayer
classificationLayer];
4.2 训练配置
matlab复制options = trainingOptions('adam', ...
'MaxEpochs', 30, ...
'MiniBatchSize', 64, ...
'ValidationData', {XValidation, YValidation}, ...
'Plots', 'training-progress', ...
'LearnRateSchedule', 'piecewise', ...
'LearnRateDropFactor', 0.5, ...
'LearnRateDropPeriod', 10);
5. 模型评估与优化
5.1 评估指标计算
matlab复制YPred = classify(net, XTest);
confusionchart(YTest, YPred);
% 计算F1分数
stats = statsOfMeasure(YTest, YPred);
disp(['Macro F1: ', num2str(mean(stats.f1Score))]);
5.2 超参数调优
使用贝叶斯优化进行超参数搜索:
matlab复制vars = [
optimizableVariable('InitialLearnRate', [1e-4, 1e-2], 'Transform', 'log')
optimizableVariable('NumHiddenUnits', [50, 200], 'Type', 'integer')
optimizableVariable('SequenceLength', [50, 200], 'Type', 'integer')
];
results = bayesopt(@(params) trainModel(params, XTrain, YTrain), vars, ...
'MaxObjectiveEvaluations', 30);
6. 实际应用示例
6.1 新文本分类
matlab复制newText = "The machine is making loud noises and vibration";
docNew = preprocessText(newText);
seqNew = doc2sequence(enc, docNew, 'Length', sequenceLength);
label = classify(net, seqNew);
disp(['Predicted class: ', char(label)]);
6.2 注意力可视化
matlab复制% 提取注意力权重
attentionWeights = activations(net, seqNew, 'attention');
% 可视化
figure
heatmap(attentionWeights(:,:,1,1));
xlabel('Key Positions');
ylabel('Query Positions');
title('Attention Weights - Head 1');
7. 常见问题与解决方案
7.1 训练不收敛
可能原因及解决方案:
- 学习率过高/过低:尝试1e-3到1e-5范围
- 梯度爆炸:设置'GradientThreshold'选项
- 数据不平衡:使用classWeights参数
7.2 过拟合问题
应对策略:
matlab复制layers = [
...
dropoutLayer(0.5)
...
];
options = trainingOptions(...
'L2Regularization', 0.001, ...
...);
8. 进阶优化方向
- 混合精度训练:
matlab复制options = trainingOptions(...
'ExecutionEnvironment', 'auto', ...
'Precision', 'mixed', ...
...);
- 结合预训练词向量:
matlab复制emb = fastTextWordEmbedding;
layer = wordEmbeddingLayer(emb, 'Name', 'emb');
- 模型量化压缩:
matlab复制quantNet = quantize(net);
通过这个完整实现,我们构建了一个结合LSTM时序建模能力和Attention动态关注机制的强大分类器。Matlab的实现方式特别适合需要快速验证想法或与现有工程系统集成的场景。
