0 引言
长短期记忆网络(Long Short-Term Memory, LSTM)是一种特殊的RNN循环神经网络变体,LSTM通过引入独特的门控机制,成功克服了RNN模型误差反馈修正过程出现梯度消失或者梯度爆炸等问题,极大地提升了对时序数据的学习和表达能力。
2 LSTM的结构
LSTM是一种常用于处理序列数据的深度学习模型,与c相比,LSTM引入了三个门( 输入门、遗忘门、输出门)和一个 细胞状态(记忆单元),如下图1所示,其中yt、ht的值一样,前者为预测值,后者为循环值;xt为输入向量;Ct为记忆单元;σ为sigmoid激活函数。
图1 LSTM结构图
3 LSTM的运算流程
LSTM的运算流程是通过遗忘门和输入门来形成共同参与下次迭代记忆单元(新的记忆单元),其中遗忘门是控制上一迭代数据(旧数据)中应当保留和舍弃的数据量、输入门来控制当前迭代数据(新数据)应当被记住的数据。输出门的输出值与新的记忆单元整合形成模型预测值。对预测结果与真实值进行误差对比反馈修正特殊门中权值阈值,从而开心新一轮迭代运算,直至达到最大迭代次数。
3.1 遗忘门
遗忘门:该数学模型决定上一迭代记忆单元那些值应该被保留和丢弃,数学模型输出ft,值域为区间0到1,输出值与Ct-1进行点乘。0表示完全舍弃,1表示完全保留。(简单可以吧遗忘门输出值看出概率,目的为了保留/舍弃上一迭代记忆多少)
图2 遗忘门数学模型图
3.2 输入门
输入门:该数学模型决定当前迭代数据中哪些新数据应该加入记忆单元中。这里包括俩个部分,σ输出是决定当前哪些值会被更新,tanh输出当前迭代记忆单元。二者相乘形成加入记忆单元的值。(简单可以σ输出看作概率,tanh输出看作待加入记忆单元候选值,只有通过概率多少才能保留多少进行记忆单元)
图3 输入门数学模型图
3.3 记忆单元
记忆单元:更新新的记忆细胞Ct,数学模型包括俩部分,第一个部分是旧记忆单元Ct-1哪些值会被保留,第二部分是当前迭代记忆细胞那些值会被保留,二者相加构成新的记忆细胞。(简单点就是概率*旧记忆+概率*当前记忆=新的记忆)
图4 记忆单元数学模型图
3.3 输出门
输出门:输出预测值,该数学模型是运用σ层来确定被tanh处理过的细胞状态Ct(记忆单元)哪些部分可以输出为预测值。
图5 输出门数学模型图
3.4 迭代原理
LSTM是一种特殊循环神经网络,既是神经网络需要进行误差反馈,所以LSTM通过选择误差反馈算法(常用adam)来修正权值阈值进而降低损失函数(预测值和真实值误差)
4 matlab代码
4.1 时间序列matlab代码注释
时间序列、回归模型
%% 清空环境变量
clear all
close all
warning all
clc
%% 导入数据集
rem = xlsread('国内某基金4年数据.xlsx');
%% 长度设计
L = length(rem);
inputnum = 20; %输入节点
outputnum = 1; %跨点预测
hiddennum = 6; %隐藏层节点,一般模型单隐藏层足已
%% 划分数据集
for i = 1:L-inputnum-outputnum+1
res(i,:) = [reshape(rem(i:i+inputnum-1),1,inputnum), ...
rem(i+inputnum+outputnum-1)];
end
%% 划分训练集和测试集
temp = 1:1:L-inputnum-outputnum+1; % 计算数据集个数
temp = randperm(length(temp)); % 随机分布提高模型泛化能力
probability = 0.8;% 划分比例
num = round(length(temp)*probability); %测试集大小
input_train = res(temp(1 : num),1:20)';
output_train = res(temp(1 : num),21)';
input_test = res(temp(num+1 : end),1:20)';
output_test = res(temp(num+1 : end),21)';
M = size(input_train, 2);
N = size(input_test, 2);
%% 归一化处理
[inputn, inputps] = mapminmax(input_train, 0, 1);
[outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps);
outputn_test=mapminmax('apply',output_test,outputps);
%% 设置符合LSTM包的形式
% 转换为4维double类型向量(xyzw)模型括号内容分别是,待转换2为数据,20行,1列,1树深。共M数量。
inputn = double(reshape(inputn, 20, 1, 1, M));
inputn_test = double(reshape(inputn_test, 20, 1, 1, N));
outputpn = outputn';
outputpn_test = outputn_test';
% 转为树包形式
for i = 1: M
inputpn{i, 1} = inputn(:, :, 1, i);
end
for i = 1: N
inputpn_test{i, 1} = inputn_test(:, :, 1, i);
end
%% 模型结构
layers = [sequenceInputLayer(inputnum) % 输入层
lstmLayer(hiddennum,'OutputMode','last') % lstm层,可以修改构建多层的LSTM模型
fullyConnectedLayer(outputnum) % 为全连接层
regressionLayer]; % 回归问题模块
%% 模型参数
maxepoch = 100;
miniBatchSize = 30; % 分批大小,数据量大选择大点,数据量小选择小点
L2 = 0.01;
lr = 0.01;
options = trainingOptions('adam', ... %算法
'MaxEpochs',maxepoch, ...%训练轮
'MiniBatchSize',miniBatchSize, ...%分批迭代,为每次迭代使用的训练数据量,为了提高
模型训练的综合性能,节约模型训练时间同时不损失模型精度。
'InitialLearnRate',lr, ...
'LearnRateSchedule','piecewise', ...%学习率策略,‘none’或者’piecewise’
'LearnRateDropFactor',0.1, ...%学习率下降因子,[0,1]之间,降低之后学习率为:当前学习率*下降因子
'LearnRateDropPeriod',round(maxepoch*0.8), ...%学习率下降周期,即几个迭代后降低学习率
'Shuffle', 'every-epoch',...% 每次训练打乱数据集
'L2Regularization',L2, ...% L2正则化因子
'Shuffle','never', ...
'Plots','training-progress', ...
'Verbose',false);
%% 模型训练
net = trainNetwork(inputpn,outputpn,layers,options);
%% 模型测试
an = predict(net,inputpn_test);
%% 反归一化
test_sim = mapminmax('reverse',an,outputps);
%% 模型分析器
analyzeNetwork(net)
%% 精度指标
% R2
R2 = 1 - norm(output_test- test_sim')^2 / norm(output_test- mean(output_test))^2;
disp(['相关系数R2为:', num2str(R2)])
% MAE
MAE= sum(abs(output_test - test_sim' )) ./ N ;
disp(['绝对值误差MAE为:', num2str(MAE)])
% MSE
MSE=sum((output_test - test_sim').^2) ./ N ;
disp(['均方误差MSE为:', num2str(MSE)])
% RMSE
RMSE = sqrt(sum((output_test - test_sim' ).^2) ./ N);
disp(['测试集数据的RMSE为:', num2str(RMSE)])
% MAPE
MAPE=mean(abs(output_test - test_sim')./output_test) ;
disp(['均方根误差MAPE为:', num2str(MAPE)])
%%可视化
figure
plot(output_test,'bo-','linewidth',1.2)
hold on
plot(test_sim,'r*-','linewidth',1.2)
legend('真实值','预测值')
xlabel('时间')
ylabel('单位净值')
xlim([1,N])
title('LSTM预测')
set(gca,'fontsize',12)
4.2 LSTM代码输出深度学习网络分析图解释
下图为模型分析器讲解:LSTM层:inputweights(输入权重):24*20,20为输入节点,24为遗忘门、输入门、输出门中4个隐藏层权重故24=4*6;recurrentweights(循环权重):24*6,6为隐藏层节点,循环值来自ht,为上一迭代输出值,权值6*1,参与本次输入ht,经过遗忘门、输入门、输出门中4个隐藏层权重故24=4*6。故24=4*6;Bias(阈值):24*1,1为每个激活函数中1个阈值,24为遗忘门、输入门、输出门中4个隐藏层权重故24=4*6。
5 视频讲解
B站搜索:‘ 不想学习的陈成 ’