1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。
长短期记忆网络(Long-Short Term Memory,LSTM)论文首次发表于1997年。由于独特的设计结构,LSTM适合于处理和预测时间序列中间隔和延迟非常长的重要事件。LSTM的表现通常比时间递归神经网络及隐马尔科夫模型(HMM)更好,比如用在不分段连续手写识别上。2009年,用LSTM构建的人工神经网络模型赢得过ICDAR手写识别比赛冠军。LSTM还普遍用于自主语音识别,2013年运用TIMIT自然演讲数据库达成17.7%错误率的纪录。作为非线性模型,LSTM可作为复杂的非线性单元用于构造更大型深度神经网络。
LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为它可以记忆不定时间长度的数值,区块中有一个gate能够决定input是否重要到能被记住及能不能被输出output。图1底下是四个S函数单元,最左边函数依情况可能成为区块的input,右边三个会经过gate决定input是否能传入区块,左边第二个为input gate,如果这里产出近似于零,将把这里的值挡住,不会进到下一层。左边第三个是forget gate,当这产生值近似于零,将把区块里记住的值忘掉。第四个也就是最右边的input为output gate,他可以决定在区块记忆中的input是否能输出 。LSTM有很多个版本,其中一个重要的版本是GRU(Gated Recurrent Unit),根据谷歌的测试表明,LSTM中最重要的是Forget gate,其次是Input gate,最次是Output gate。
AI 代码解读
传统RNN网络由于结构存在固有缺陷,在参数更新时会存在梯度消失以及梯度爆炸的问题,导致长距离的历史信息丢失,进一步造成网络极难收敛,无法训练出理想的模型。LSTM作为一种改进的循环神经网络,在原有网络结构的基础上加入了细胞状态(cell state)的结构来控制全局信息的传输,并通过遗忘门,输入门,输出门三种门控单元控制细胞状态信息值的更新。LSTM在极大程度上缓解了传统RNN模型存在的长期依赖问题,减少了长距离历史信息的丢失,输出的预测结果更准确 。
AI 代码解读
LSTM通过以下公式进行更新权值矩阵和偏置参数等网络信息:
3.MATLAB核心程序
clear;
close all;
warning off;
addpath(genpath(pwd));
RNN;
LSTM_RNN;
figure
load R1.mat
loglog(1:10:clc_times,errt(1:10:end),'b.');
hold on
load R2.mat
loglog(1:10:clc_times,errt(1:10:end),'r.');
grid on
legend('RNN','LSTM-RNN');
xlabel('迭代次数');
ylabel('误差');
figure
load R1.mat
loglog(1:10:clc_times,smooth(errt(1:10:end),1024),'b.');
hold on
load R2.mat
loglog(1:10:clc_times,smooth(errt(1:10:end),1024),'r.');
grid on
legend('RNN','LSTM-RNN');
xlabel('迭代次数');
ylabel('误差');
% 前向传播
for position = 0:binary_dim - 1
% x---->输出向量:1*input_dim (1*2)
x = [a(binary_dim - position) - '0',b(binary_dim - position) - '0',bias];
% y---->真值标签:1*output_dim (1*1)
y = c(binary_dim - position) - '0';
% 输入门
InGate_in = x * W_I + H(end,:) * U_I + S(end,:) * S_I;
InGate_out = sigmoid(InGate_in);
% 遗忘门
ForgetGate_in = x * W_F + H(end,:) * U_F + S(end,:) * S_F;
ForgetGate_out = sigmoid(ForgetGate_in);
% G门
G_in = x * W_G + H(end,:) * U_G;
G_out = tanh(G_in);
% Cell状态更新
S_t = ForgetGate_out .* S(end,:) + InGate_out .* G_out;
% 输出门
OutGate_in = x * W_O + H(end,:) * U_O + S_t * S_O;
OutGate_out = sigmoid(OutGate_in);
% 记忆模块(隐藏层输出)H
H_t = OutGate_out .* tanh(S_t);
% 输出层输出
output_in = H_t * W_OUT;
output_out = sigmoid(output_in);
% 预测值输出,用于显示
d(binary_dim - position) = round(output_out);
% 输出层的梯度记录
y_delta = [y_delta;(y - output_out).*dsigmoid(output_out)];
% 各门状态保存
I = [I;InGate_out];
F = [F;ForgetGate_out];
O = [O;OutGate_out];
G = [G;G_out];
S = [S;S_t];
H = [H;H_t];
AI 代码解读