-
2021-02-11 21:18:31
本发明属于行人导航定位修正领域,具体涉及一种基于双向长短期记忆网络的定位修正方法。
背景技术:
近些年来,随着室内定位技术的不断发展,很大程度弥补了类似gps等利用卫星信号进行定位而卫星信号穿透力较差导致室内定位不精确的问题。现有的室内定位技术大部分都利用已有的信号源进行高精度定位,如wi-fi信号定位技术,uwb定位技术等。但是现有技术存在以下问题:但是,由于利用惯性元器件进行定位过程中需要使用二次积分,导致系统在长距离、长时间的定位过程中出现目标轨迹发散的现象,难以维持较高的精度。
技术实现要素:
针对现有技术中的上述不足,本发明提供的一种基于双向长短期记忆网络的定位修正方法解决了现有技术存在的问题。
为了达到上述发明目的,本发明采用的技术方案为:一种基于双向长短期记忆网络的定位修正方法,包括以下步骤:
s1、采集行人运动的原始数据,并对原始数据进行预处理,得到处理数据;
s2、构建双向长短期记忆网络,并对其进行训练;
s3、将原始数据输入训练完成的双向长短期记忆网络,获取零速判断结果;
s4、当零速判断结果为零速时,根据处理数据,利用卡尔曼滤波器对导航坐标系下的速度和位置信息进行修正。
进一步地,所述步骤s1包括以下分步骤:
s1.1、将惯性测量单元佩戴在使用者脚部,进行原始数据采集;
s1.2、根据原始数据中载体坐标系下的角速度,获取方向余弦矩阵;
s1.3、将原始数据中载体坐标系下的加速度经过固定窗口长度和步长的滑动窗口进行处理;
s1.4、将处理过后的加速度经过一次积分,得到在导航坐标系中的速度;
s1.5、将处理过后的加速度经过二次积分,得到在导航坐标系中的位置;
s1.6、将方向余弦矩阵、导航坐标系中的速度和导航坐标系中的位置作为处理数据。
进一步地,所述步骤s1.3中滑动窗口的步长为1,其窗口长度为256。
进一步地,所述双向长短期记忆网络包括依次串联的输入层、第一双向长短期记忆层、第二双向长短期记忆层、第一全连接层、第二全连接层和输出层。
进一步地,所述第一双向长短期记忆层的单元数为128,其输出为每一个方向的每一个时间步拼接在一起的结果;所述第二双向长短期记忆层的单元数为64,其输出为每一个方向的最后一个时间步拼接到一起的结果;所述的第一全连接层设置有32个神经元;所述第二全连接层设置有1个神经元,其输出为零速判断结果。
进一步地,所述步骤s2中对双向长短期记忆网络进行训练的具体方法为:
a1、根据原始数据中的加速度和角速度,采用人工标记的方式将零速时刻打上标签,得到标签数据;
a2、将原始数据和标签数据输入双向长短期记忆网络,将均方根误差作为损失值,并以损失值最小为目标对双向长短期记忆网络进行训练;
a3、采用adam算法作为网络参数优化算法,训练至损失值小于0.01时,将此时的网络参数保存为最终的网络参数,得到训练完成的双向长短期记忆网络。
进一步地,所述步骤s3具体为:将原始数据中载体坐标系下的加速度和角速度输入训练完成的双向长短期记忆网络,得到对应的零速判断结果。
进一步地,所述步骤s4包括以下分步骤:
s4.1、当零速判断结果为零速时,将此时导航坐标系中的速度、导航坐标系中的位置和速度观测量输入卡尔曼滤波器,得到速度误差向量、位置误差向量和姿态误差向量;
s4.2、根据速度误差向量、位置误差向量和姿态误差向量,对方向余弦矩阵以及导航坐标系下的速度和位置信息进行修正。
本发明的有益效果为:
(1)本发明能够精准的进行零速判断,实施的复杂度低,具有高的计算效率和拥有良好的鲁棒性。
(2)本发明成本低,通过对行人导航时进行零速检测,寻找出导航时产生的误差,最终通过位置误差进行定位修正,可以保证长时间的精准行人导航定位。
附图说明
图1为本发明提出的一种基于双向长短期记忆网络的定位修正方法流程图。
图2为本发明提出的双向长短期记忆网络结构图。
具体实施方式
下面对本发明的具体实施方式进行描述,以便于本技术领域的技术人员理解本发明,但应该清楚,本发明不限于具体实施方式的范围,对本技术领域的普通技术人员来讲,只要各种变化在所附的权利要求限定和确定的本发明的精神和范围内,这些变化是显而易见的,一切利用本发明构思的发明创造均在保护之列。
下面结合附图详细说明本发明的实施例。
如图1所示,一种基于双向长短期记忆网络的定位修正方法,包括以下步骤:
s1、采集行人运动的原始数据,并对原始数据进行预处理,得到处理数据;
s2、构建双向长短期记忆网络,并对其进行训练;
s3、将原始数据输入训练完成的双向长短期记忆网络,获取零速判断结果;
s4、当零速判断结果为零速时,根据处理数据,利用卡尔曼滤波器对导航坐标系下的速度和位置信息进行修正。
在本实施例中,原始数据包括行人运动的角速度、加速度和速度观测量。
其中,所述步骤s1包括以下分步骤:
s1.1、将惯性测量单元佩戴在使用者脚部,进行原始数据采集;
s1.2、根据原始数据中载体坐标系下的角速度,获取方向余弦矩阵;
s1.3、将原始数据中载体坐标系下的加速度经过固定窗口长度和步长的滑动窗口进行处理;
s1.4、将处理过后的加速度经过一次积分,得到在导航坐标系中的速度;
s1.5、将处理过后的加速度经过二次积分,得到在导航坐标系中的位置;
s1.6、将方向余弦矩阵、导航坐标系中的速度和导航坐标系中的位置作为处理数据。
其中,所述步骤s1.3中滑动窗口的步长为1,其窗口长度为256。
如图2所示,所述双向长短期记忆网络包括依次串联的输入层、第一双向长短期记忆层、第二双向长短期记忆层、第一全连接层、第二全连接层和输出层。
其中,所述第一双向长短期记忆层的单元数为128,其输出为每一个方向的每一个时间步拼接在一起的结果;所述第二双向长短期记忆层的单元数为64,其输出为每一个方向的最后一个时间步拼接到一起的结果;所述的第一全连接层设置有32个神经元;所述第二全连接层设置有1个神经元,其输出为零速判断结果。
在本实施例中,输入层的维度为(256,6),其中256表示窗口大小,6表示陀螺仪和加速度计的三轴数据,输出层采用softmax函数进行零速判断结果的输出,输出1表示该时间戳对应的为零速时刻,0表示该时间戳对应的不是零速时刻。
其中,所述步骤s2中对双向长短期记忆网络进行训练的具体方法为:
a1、根据原始数据中的加速度和角速度,采用人工标记的方式将零速时刻打上标签,得到标签数据;
a2、将原始数据和标签数据输入双向长短期记忆网络,将均方根误差作为损失值,并以损失值最小为目标对双向长短期记忆网络进行训练;
a3、采用adam算法作为网络参数优化算法,训练至损失值小于0.01时,将此时的网络参数保存为最终的网络参数,得到训练完成的双向长短期记忆网络。
其中,所述步骤s3具体为:将原始数据中载体坐标系下的加速度和角速度输入训练完成的双向长短期记忆网络,得到对应的零速判断结果。
其中,所述步骤s4包括以下分步骤:
s4.1、当零速判断结果为零速时,将此时导航坐标系中的速度、导航坐标系中的位置和速度观测量输入卡尔曼滤波器,得到速度误差向量、位置误差向量和姿态误差向量;
s4.2、根据速度误差向量、位置误差向量和姿态误差向量,对方向余弦矩阵以及导航坐标系下的速度和位置信息进行修正。
在本实施例中,误差向量δxt为:
其中,表示t时刻的姿态误差向量,δθt表示t时刻的翻滚角,δγt表示t时刻的俯仰角,δψt表示t时刻的航向角,δpt表示t时刻的位置误差向量,δvt表示t时刻的速度误差向量。
根据姿态误差向量对t时刻的方向余弦矩阵的修正,修正公式为:
其中,表示修正后的t时刻方向余弦矩阵,表示t-1时刻的方向余弦矩阵,i3×3表示3×3的单位矩阵,δω表示姿态误差向量构成的反对称矩阵,b表示载体坐标系,n表示导航坐标系。
所述反对称矩阵δω为:
根据速度误差向量对t时刻的速度进行修正,修正的公式为:
其中,表示t时刻的速度修正值,表示t-1时刻的速度值。
根据位置误差向量对t时刻的位置进行修正,修正的公式为:
其中,表示修正后t时刻的位置,表示t-1时刻的位置。
本发明能够精准的进行零速判断,实施的复杂度低,具有高的计算效率和拥有良好的鲁棒性。本发明成本低,通过对行人导航时进行零速检测,寻找出导航时产生的误差,最终通过位置误差进行定位修正,可以保证长时间的精准行人导航定位。
更多相关内容 -
基于长短期记忆网络的工控网络异常流量检测
2021-05-06 12:08:42针对目前工控网络异常流量检测方法存在识别准确率不高和识别效率低的问题,结合工控网络具有周期性的特点,提出一种基于长短期记忆网络(LSTM)的时序预测的异常流量检测模型.该模型以LSTM网络模型为核心,用前15... -
简单理解LSTM长短期记忆网络
2021-01-06 18:09:26LSTM(Long Short Term Memory,长短期记忆网络)介绍 介绍:LSTM,也就是长短期记忆网络,是一种 RNN 特殊的类型,可以学习长期依赖信息。要想较好理解LSTM请先查看之前写的RNN的简单理解文章。在传统RNN训练经常会... -
使用 CNN 长短期记忆网络的图像字幕-研究论文
2021-06-10 07:03:38近年来,各种深度学习模型已被用于从... CNN 长短期记忆网络 (CNN-LSTM) 架构的组合非常适合处理具有图像等空间输入的序列预测模型。 我们观察到合并模型 CNN-LSTM 证明机器可以很好地看到图像,因为图像被正确标注。 -
LSTM(Long Short-Term Memory)长短期记忆网络
2019-01-24 11:28:33LSTM(Long Short-Term Memory)是长短期记忆网络,是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。 LSTM 已经在科技领域有了多种应用。基于 LSTM 的系统可以学习翻译语言、控制... -
基于深度学习长短期记忆网络结构的地铁站短时客流量预测.pdf
2021-08-18 23:38:25基于深度学习长短期记忆网络结构的地铁站短时客流量预测.pdf -
LSTM(Long Short-Term Memory)是长短期记忆网络 一篇不错的文章
2018-11-11 21:04:52一篇不错的关于LSTM(是长短期记忆网络)的文章, 对于LSTM有一种不一样的理解 -
m-treelstm:语义表示的可乘树结构长短期记忆网络
2021-05-16 07:23:41语义表示的可乘树结构长短期记忆网络。 第七届词汇与计算语义学联合会议论文集(* SEM-18):ACL 276-286。 美国新奥尔良,2018年6月要求PyTorch(0.3.0) Python3(3.6.1) Java8(用于斯坦福解析器)用法下载以下... -
LSTM 算法 长短期记忆网络
2017-10-17 14:36:11长短期记忆网络详解 ,内含详细的解释。英文资源。对理解LSTM网络的结构有很大的帮助! -
基于多因子与多变量长短期记忆网络的股票价格预测
2021-05-06 12:35:06同时为了使模型适应多因子输入,因此在单变量长短期记忆网络的基础上建立了一个多变量长短期记忆网络股票价格预测模型.实验结果表明,随着多因子模型的引入,不仅提升了长短期记忆网络股票价格预测的准确率,同时在... -
采用长短期记忆网络的深度学习方法进行网页正文提取.pdf
2021-08-18 00:34:06采用长短期记忆网络的深度学习方法进行网页正文提取.pdf -
基于长短期记忆网络的矿工不安全行为研究-论文
2021-07-08 13:10:58矿工不安全行为的出现是复杂的非线性动力过程,为预测不安全行为时间序列,选择具有"记忆"功能和解决梯度消失问题的长短期记忆网络。使用TensorFlow下Keras搭建基于长短期记忆网络的不安全行为时间序列预测模型,使用A... -
LSTM长短期记忆网络
2021-12-29 09:56:251、 长短期记忆 LSTM 中引入了3个门,即输入门(input gate)、遗忘门(forget gate)和输出门(output gate),以及与隐藏状态形状相同的记忆细胞(某些文献把记忆细胞当成一种特殊的隐藏状态),从而记录额外的...1、 长短期记忆
LSTM 中引入了3个门,即输入门(input gate)、遗忘门(forget gate)和输出门(output gate),以及与隐藏状态形状相同的记忆细胞(某些文献把记忆细胞当成一种特殊的隐藏状态),从而记录额外的信息。
1.1 输入门、遗忘门和输出门
I t = s i g m o i d ( X t W x i + H t − 1 W h i + b i ) I_t=sigmoid(X_tW_{xi}+H_{t-1}W{hi}+b_i) It=sigmoid(XtWxi+Ht−1Whi+bi)
F t = s i g m o i d ( X t W x f + H t − 1 W h f + b f ) F_t=sigmoid(X_tW_{xf}+H_{t-1}W{hf}+b_f) Ft=sigmoid(XtWxf+Ht−1Whf+bf)
O t = s i g m o i d ( X t W x o + H t − 1 W h o + b o ) O_t=sigmoid(X_tW_{xo}+H_{t-1}W{ho}+b_o) Ot=sigmoid(XtWxo+Ht−1Who+bo)1.2 候选记忆细胞
接下来,长短期记忆需要计算候选记忆细胞 C t ^ \hat{C_t} Ct^ 。它的计算与上面介绍的3个门类似,但使用了值域在 [−1,1]的tanh函数作为激活函数
C t ^ = t a n h ( X t W x c + H t − 1 W h c + b c ) \hat{C_t}=tanh(X_tW_{xc}+H_{t-1}W_{hc}+b_c) Ct^=tanh(XtWxc+Ht−1Whc+bc)1.3 记忆细胞
C t = F t ∗ C t − 1 + I t ∗ C t ^ C_t=F_t*C_{t-1}+I_t*\hat{C_t} Ct=Ft∗Ct−1+It∗Ct^1.4 隐藏状态
H t = O t ∗ t a n h ( C t ) H_t=O_t*tanh(C_t) Ht=Ot∗tanh(Ct)2、代码定义模型
- 初始化参数
num_inputs, num_hiddens, num_outputs = vocab_size, 256, vocab_size print('will use', device) def get_params(): def _one(shape): ts = torch.tensor(np.random.normal(0, 0.01, size=shape), device=device, dtype=torch.float32) return torch.nn.Parameter(ts, requires_grad=True) def _three(): return (_one((num_inputs, num_hiddens)), _one((num_hiddens, num_hiddens)), torch.nn.Parameter(torch.zeros(num_hiddens, device=device, dtype=torch.float32), requires_grad=True)) W_xi, W_hi, b_i = _three() # 输入门参数 W_xf, W_hf, b_f = _three() # 遗忘门参数 W_xo, W_ho, b_o = _three() # 输出门参数 W_xc, W_hc, b_c = _three() # 候选记忆细胞参数 # 输出层参数 W_hq = _one((num_hiddens, num_outputs)) b_q = torch.nn.Parameter(torch.zeros(num_outputs, device=device, dtype=torch.float32), requires_grad=True) return nn.ParameterList([W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc, b_c, W_hq, b_q]) def init_lstm_state(batch_size, num_hiddens, device): return (torch.zeros((batch_size, num_hiddens), device=device), torch.zeros((batch_size, num_hiddens), device=device))
- 模型定义
def lstm(inputs, state, params): [W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc, b_c, W_hq, b_q] = params (H, C) = state outputs = [] for X in inputs: I = torch.sigmoid(torch.matmul(X, W_xi) + torch.matmul(H, W_hi) + b_i) F = torch.sigmoid(torch.matmul(X, W_xf) + torch.matmul(H, W_hf) + b_f) O = torch.sigmoid(torch.matmul(X, W_xo) + torch.matmul(H, W_ho) + b_o) C_tilda = torch.tanh(torch.matmul(X, W_xc) + torch.matmul(H, W_hc) + b_c) C = F * C + I * C_tilda H = O * C.tanh() Y = torch.matmul(H, W_hq) + b_q outputs.append(Y) return outputs, (H, C)
-
动手学深度学习(四十)——长短期记忆网络(LSTM)
2021-11-11 09:56:04文章目录一、长短期记忆网络(LSTM)1.1 门控记忆单元1.2 输入门、遗忘门与输出门1.3候选记忆单元1.4 记忆单元1.5 隐藏状态二、从零实现LSTM2.1 初始化模型参数2.2 定义网络模型2.3 训练和预测2.4 简洁实现小结练习 ...文章目录
一、长短期记忆网络(LSTM)
最早用来处理隐变量模型存在的长期信息保存和短期输入跳跃问题的方法(long short-term memory LSTM)。其拥有许多门控循环单元相同的属性。LSTM比GRU更复杂,但是其比GRU早诞生20年左右。
1.1 门控记忆单元
LSTM引入了存储单元(memory cell),简称为单元(cell)。有些文献认为存储单元是隐藏状态的一种特殊类型,它们与隐藏状态具有相同的形状,其设计目的是用于记录附加的信息。为了控制存储单元,我们需要许多门。其中一个门用来从单元中读出条目。我们将其称为 输出门(output gate)。另外一个门用来决定何时将数据读入单元。我们将其称为 输入门(input gate)。最后,我们需要一种机制来重置单元的内容,由遗忘门(forget gate)来管理。这种设计的动机与门控循环单元相同,即能够通过专用机制决定什么时候记忆或忽略隐藏状态中的输入。让我们看看这在实践中是如何运作的。
- 遗忘门:将值朝0方向减少
- 输入门:决定是否忽略输入数据
- 输出门:决定是不是使用隐藏状态
1.2 输入门、遗忘门与输出门
就如在门控循环单元中一样,当前时间步的输入和前一个时间步的隐藏状态作为数据送入长短期记忆网络门中,如下图所示。它们由三个具有 sigmoid 激活函数的全连接层处理,以计算输入门、遗忘门和输出门的值。因此,这三个门的值都在 ( 0 , 1 ) (0, 1) (0,1) 的范围内。
数学描述,假设有 h h h 个隐藏单元,批量大小为 n n n,输入数为 d d d。因此,输入为 X t ∈ R n × d \mathbf{X}_t \in \mathbb{R}^{n \times d} Xt∈Rn×d,前一时间步的隐藏状态为 H t − 1 ∈ R n × h \mathbf{H}_{t-1} \in \mathbb{R}^{n \times h} Ht−1∈Rn×h。相应地,时间步 t t t 的门被定义如下:输入门是 I t ∈ R n × h \mathbf{I}_t \in \mathbb{R}^{n \times h} It∈Rn×h,遗忘门是 F t ∈ R n × h \mathbf{F}_t \in \mathbb{R}^{n \times h} Ft∈Rn×h,输出门是 O t ∈ R n × h \mathbf{O}_t \in \mathbb{R}^{n \times h} Ot∈Rn×h。它们的计算方法如下:
I t = σ ( X t W x i + H t − 1 W h i + b i ) , F t = σ ( X t W x f + H t − 1 W h f + b f ) , O t = σ ( X t W x o + H t − 1 W h o + b o ) , \begin{aligned} \mathbf{I}_t &= \sigma(\mathbf{X}_t \mathbf{W}_{xi} + \mathbf{H}_{t-1} \mathbf{W}_{hi} + \mathbf{b}_i),\\ \mathbf{F}_t &= \sigma(\mathbf{X}_t \mathbf{W}_{xf} + \mathbf{H}_{t-1} \mathbf{W}_{hf} + \mathbf{b}_f),\\ \mathbf{O}_t &= \sigma(\mathbf{X}_t \mathbf{W}_{xo} + \mathbf{H}_{t-1} \mathbf{W}_{ho} + \mathbf{b}_o), \end{aligned} ItFtOt=σ(XtWxi+Ht−1Whi+bi),=σ(XtWxf+Ht−1Whf+bf),=σ(XtWxo+Ht−1Who+bo),
其中 W x i , W x f , W x o ∈ R d × h \mathbf{W}_{xi}, \mathbf{W}_{xf}, \mathbf{W}_{xo} \in \mathbb{R}^{d \times h} Wxi,Wxf,Wxo∈Rd×h 和 W h i , W h f , W h o ∈ R h × h \mathbf{W}_{hi}, \mathbf{W}_{hf}, \mathbf{W}_{ho} \in \mathbb{R}^{h \times h} Whi,Whf,Who∈Rh×h 是权重参数, b i , b f , b o ∈ R 1 × h \mathbf{b}_i, \mathbf{b}_f, \mathbf{b}_o \in \mathbb{R}^{1 \times h} bi,bf,bo∈R1×h 是偏置参数。
1.3候选记忆单元
接下来,设计记忆单元。由于还没有指定各种门的操作,所以先介绍 候选记忆单元(candidate memory cell) C ~ t ∈ R n × h \tilde{\mathbf{C}}_t \in \mathbb{R}^{n \times h} C~t∈Rn×h。它的计算与上面描述的三个门的计算类似,但是使用 tanh \tanh tanh 函数作为激活函数,函数的值范围为 ( − 1 , 1 ) (-1, 1) (−1,1)。下面导出在时间步 t t t 处的方程:
C ~ t = tanh ( X t W x c + H t − 1 W h c + b c ) , \tilde{\mathbf{C}}_t = \text{tanh}(\mathbf{X}_t \mathbf{W}_{xc} + \mathbf{H}_{t-1} \mathbf{W}_{hc} + \mathbf{b}_c), C~t=tanh(XtWxc+Ht−1Whc+bc),
其中 W x c ∈ R d × h \mathbf{W}_{xc} \in \mathbb{R}^{d \times h} Wxc∈Rd×h 和 W h c ∈ R h × h \mathbf{W}_{hc} \in \mathbb{R}^{h \times h} Whc∈Rh×h 是权重参数, b c ∈ R 1 × h \mathbf{b}_c \in \mathbb{R}^{1 \times h} bc∈R1×h 是偏置参数。
候选记忆单元的图示如下
1.4 记忆单元
在门控循环单元中,有一种机制来控制输入和遗忘(或跳过)。类似地,在长短期记忆网络中,也有两个门用于这样的目的:输入门 I t \mathbf{I}_t It 控制采用多少来自 C ~ t \tilde{\mathbf{C}}_t C~t 的新数据,而遗忘门 F t \mathbf{F}_t Ft 控制保留了多少旧记忆单元 C t − 1 ∈ R n × h \mathbf{C}_{t-1} \in \mathbb{R}^{n \times h} Ct−1∈Rn×h 的内容。使用与前面相同的按元素做乘法的技巧,得出以下更新公式:
C t = F t ⊙ C t − 1 + I t ⊙ C ~ t . \mathbf{C}_t = \mathbf{F}_t \odot \mathbf{C}_{t-1} + \mathbf{I}_t \odot \tilde{\mathbf{C}}_t. Ct=Ft⊙Ct−1+It⊙C~t.
如果遗忘门始终为 1 1 1 且输入门始终为 0 0 0,则过去的记忆单元 C t − 1 \mathbf{C}_{t-1} Ct−1 将随时间被保存并传递到当前时间步。引入这种设计是为了缓解梯度消失问题,并更好地捕获序列中的长距离依赖关系。
这样就得到了流程图,如下。
1.5 隐藏状态
最后,我们需要定义如何计算隐藏状态 H t ∈ R n × h \mathbf{H}_t \in \mathbb{R}^{n \times h} Ht∈Rn×h。这就是输出门发挥作用的地方。在长短期记忆网络中,它仅仅是记忆单元的 tanh \tanh tanh 的门控版本。这就确保了 H t \mathbf{H}_t Ht 的值始终在区间 ( − 1 , 1 ) (-1, 1) (−1,1) 内。
H t = O t ⊙ tanh ( C t ) . \mathbf{H}_t = \mathbf{O}_t \odot \tanh(\mathbf{C}_t). Ht=Ot⊙tanh(Ct).
只要输出门接近 1 1 1,我们就能够有效地将所有记忆信息传递给预测部分,而对于输出门接近 0 0 0,我们只保留存储单元内的所有信息,并且没有进一步的过程需要执行。
下面是全部数据流的图形化演示。
二、从零实现LSTM
import torch from torch import nn from d2l import torch as d2l # load data iter batch_size, num_steps = 32, 35 train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
2.1 初始化模型参数
# 随便初始化,这里采用标准差为0.01的高斯分布初始化,偏置使用0 def get_lstm_params(vocab_size,num_hiddens,device): num_inputs = num_outputs = vocab_size def normal(shape): return torch.randn(size=shape,device=device)*0.01 def three(): return(normal((num_inputs,num_hiddens)), normal((num_hiddens,num_hiddens)), torch.zeros(num_hiddens,device=device)) W_xi, W_hi, b_i = three() # 输入门参数 W_xf, W_hf, b_f = three() # 遗忘门参数 W_xo, W_ho, b_o = three() # 输出门参数 W_xc, W_hc, b_c = three() # 候选记忆单元参数 # 输出层参数 W_hq = normal((num_hiddens, num_outputs)) b_q = torch.zeros(num_outputs, device=device) # 附加梯度 params = [ W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc, b_c, W_hq, b_q] for param in params: param.requires_grad_(True) return params
2.2 定义网络模型
在初始化函数之中,LSTM的隐藏状态需要返回一个额外的记忆单元,其单元的值为0,形状为(批量大小,隐藏单元数)。
def init_lstm_state(batch_size,num_hiddens,device): return (torch.zeros((batch_size,num_hiddens),device=device), torch.zeros((batch_size,num_hiddens),device=device))
# 实际模型的定义与前面定义相同,提供三个门和一个额外的记忆单元。只有隐藏状态才会传递到输出层,而记忆单元不直接参与输出计算 def lstm(inputs,state,params): [W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc, b_c,W_hq, b_q] = params (H,C) = state outputs = [] for X in inputs: I = torch.sigmoid((X@W_xi)+(H@W_hi)+b_i) F = torch.sigmoid((X @ W_xf) + (H @ W_hf) + b_f) O = torch.sigmoid((X @ W_xo) + (H @ W_ho) + b_o) C_tilda = torch.tanh((X @ W_xc) + (H @ W_hc) + b_c) C = F * C + I * C_tilda H = O * torch.tanh(C) Y = (H @ W_hq) + b_q outputs.append(Y) return torch.cat(outputs, dim=0), (H, C)
2.3 训练和预测
vocab_size, num_hiddens, device = len(vocab), 256, d2l.try_gpu() num_epochs, lr = 500, 1 model = d2l.RNNModelScratch(len(vocab), num_hiddens, device, get_lstm_params,init_lstm_state, lstm) d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)
perplexity 1.1, 49112.9 tokens/sec on cuda:0 time traveller for so it will be convenient to speak of himwas e traveller abcerthen thing the time traveller held in his ha
2.4 简洁实现
num_inputs = vocab_size lstm_layer = nn.LSTM(num_inputs, num_hiddens) model = d2l.RNNModel(lstm_layer, len(vocab)) model = model.to(device) d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)
perplexity 1.1, 281347.3 tokens/sec on cuda:0 time traveller for so it will be convenient to speak of himwas e travelleryou can show black is white by argument said filby
长短期记忆网络是典型的具有重要状态控制的隐变量自回归模型。多年来已经提出了其许多变体,例如,多层、残差连接、不同类型的正则化。然而,由于序列的长距离依赖性,训练长短期记忆网络和其他序列模型(例如门控循环单元)的成本是相当高的。在后面的内容中,我们将遇到可在某些情况下使用的替代模型,如 Transformer。
小结
- 长短期记忆网络有三种类型的门:输入门、遗忘门和控制信息流的输出门。
- 长短期记忆网络的隐藏层输出包括“隐藏状态”和“记忆单元”。只有隐藏状态会传递到输出层,而记忆单元完全属于内部信息。
- 长短期记忆网络可以缓解梯度消失和梯度爆炸。
练习
- 你需要如何更改模型以生成适当的单词,而不是字符序列
在输入的时候,我们需要将一个个单词当成vocab进行编码,但是这样的话,onehot编码的大小可能需要变得非常大了。进行数据整理,给每个单词一个对应的编号,对这个编号进行onehot编码也可以。
- 在给定隐藏层维度的情况下,比较门控循环单元、长短期记忆网络和常规循环神经网络的计算成本。要特别注意训练和推理成本。
- 既然候选记忆单元通过使用 tanh \tanh tanh 函数来确保值范围在 ( − 1 , 1 ) (-1,1) (−1,1) 之间,那么为什么隐藏状态需要再次使用 tanh \tanh tanh 函数来确保输出值范围在 ( − 1 , 1 ) (-1,1) (−1,1) 之间呢?
I t = σ ( X t W x i + H t − 1 W h i + b i ) , F t = σ ( X t W x f + H t − 1 W h f + b f ) , O t = σ ( X t W x o + H t − 1 W h o + b o ) , \begin{aligned} \mathbf{I}_t &= \sigma(\mathbf{X}_t \mathbf{W}_{xi} + \mathbf{H}_{t-1} \mathbf{W}_{hi} + \mathbf{b}_i),\\ \mathbf{F}_t &= \sigma(\mathbf{X}_t \mathbf{W}_{xf} + \mathbf{H}_{t-1} \mathbf{W}_{hf} + \mathbf{b}_f),\\ \mathbf{O}_t &= \sigma(\mathbf{X}_t \mathbf{W}_{xo} + \mathbf{H}_{t-1} \mathbf{W}_{ho} + \mathbf{b}_o), \end{aligned} ItFtOt=σ(XtWxi+Ht−1Whi+bi),=σ(XtWxf+Ht−1Whf+bf),=σ(XtWxo+Ht−1Who+bo), C ~ t = tanh ( X t W x c + H t − 1 W h c + b c ) , \tilde{\mathbf{C}}_t = \text{tanh}(\mathbf{X}_t \mathbf{W}_{xc} + \mathbf{H}_{t-1} \mathbf{W}_{hc} + \mathbf{b}_c), C~t=tanh(XtWxc+Ht−1Whc+bc), C t = F t ⊙ C t − 1 + I t ⊙ C ~ t . \mathbf{C}_t = \mathbf{F}_t \odot \mathbf{C}_{t-1} + \mathbf{I}_t \odot \tilde{\mathbf{C}}_t. Ct=Ft⊙Ct−1+It⊙C~t. H t = O t ⊙ tanh ( C t ) . \mathbf{H}_t = \mathbf{O}_t \odot \tanh(\mathbf{C}_t). Ht=Ot⊙tanh(Ct).
-
简单介绍长短期记忆网络 - LSTM
2022-01-01 14:45:36简单说明了循环神经网络RNN的一些不足,对长短期记忆网络-LSTM的一个简单介绍文章目录
一、引言
1.1 什么是LSTM
首先看看百科的解释。
长短期记忆(英语:Long Short-Term Memory,LSTM)是一种时间循环神经网络(RNN),论文首次发表于1997年。由于独特的设计结构,LSTM适合于处理和预测时间序列中间隔和延迟非常长的重要事件。1为了更好地理解长短期记忆网络 - LSTM(下文简称LSTM),可以先了解循环神经网络-RNN(下文简称RNN)的相关知识,这里有一些相关的文章。LSTM只是RNN的一个变种,LSTM是为了解决RNN中的梯度消失的问题而提出的。
二、循环神经网络RNN
2.1 为什么需要RNN
人的思想是有记忆延续性。比如当你在阅读这篇文章,你会根据你曾经对每个字的理解来理解这篇文章的字,而不是每次都要思考一个字在这篇文章的语境下到底如何理解(从一个字或词的多种解释来选择一个符合当下语境的解释)。
举个例子:要识别这么一个句子:
The cat, which already ate cakes, () full.2假设对其中的单词从左到右一个一个地处理,前面已经cat的识别结果是一个单数名词,到后边()里的内容,到底是填were 还是 was,那么就需要根据前边cat的识别结果进行判断。这就是RNN需要做的。
使用神经网络来预测句子中下一个字的解释。传统的神经网络在模型训练好了以后,在输入层给定一个x,通过网络之后就能在输出层得到特定的y。利用这个模型可以通过训练拟合任意函数,但是只能单独的取处理一个个的输入,前一个输出和后一个输出是完全没有关系的。
神经网络的结构如下:
但是,在理解一句话的意思的时候,一个字的意思是跟前面的字相关联的,即前面的输出和后面的输出是有关系的。所以仅仅利用这样的模型是不够的的,为了解决这个问题,有人提出了RNN。
RNN模型构造:
RNN神经网络示意图:
蓝色部分的是隐藏层,RNN利用隐藏层将信息向后传递。
我们来看看RNN隐藏层里发生了什么,将上图按时间线展开3:符号 意义 X 一个向量,输入层的值 S 一个向量,隐藏层的值 O 一个向量,输出层的值 U 输入层到隐藏层的权重矩阵 V 隐藏层到输出层的权重矩阵 W 隐藏层上一次的值作为这一次输入的权重 再给出一个更具体的图,给出各层元素的对应关系
现在看上去就比较清楚了,这个网络在 t 时刻接收到输入 x t x_t xt 之后,隐藏层的值是 s t s_t st ,输出值是 o t o_t ot 。关键一点是, s t s_t st 的值不仅仅取决于 x t x_t xt ,还取决于 s t − 1 s_{t-1} st−1 。 我们可以用下面的公式来表示RNN的计算方法:
用公式表示如下:
O t = g ( V ⋅ S t ) O_t = g(V·S_t) Ot=g(V⋅St)S t = f ( U ⋅ X t + W ⋅ S t − 1 ) S_t = f(U·X_t + W ·S_{t-1}) St=f(U⋅Xt+W⋅St−1)
注意:为了简单说明问题,偏置都没有包含在公式里面。这样,就可以做到的在一个序列中根据前面的输出来影响后面的输出。
三、长短时记忆神经网络LSTM
3.1 为什么需要LSTM
回到我们的例子:
The cat, which already ate …, () full.这个例子与之前的例子稍微有一些不同,这里的cat 和()之间已经相隔了较长的一段距离,这时候用RNN来处理这样的长期信息就不太合适。
因为RNN在反向传播阶段有梯度消失等问题不能处理长依赖问题,这里的梯度消失是由于RNN在计算过程中使用链式法则。
具体来说,RNN使用覆盖的方式来计算状态: S t = f ( S t − 1 , x t ) S_t = f(S_{t-1},x_t) St=f(St−1,xt),这类似于复合函数,根据链式求导的法则,复合函数求导:设 f f f 和 g g g 为 x x x 的可导函数,则 ( f ∘ g ) ′ ( x ) = f ′ ( g ( x ) ) g ′ ( x ) (f \circ g)'(x) = f'(g(x))g'(x) (f∘g)′(x)=f′(g(x))g′(x),这是一种连乘的方式,如果导数小于或大于1,会发生梯度下降以及梯度爆炸。梯度爆炸可以通过剪枝算法解决,但是梯度消失却没办法解决。
梯度消失可能不太好理解,可以简单理解为RNN中后边输入的数据影响越大,前面的数据的影响小,因此不能处理长期信息。后来,有学者在一篇论文Long Short-Term Memory 4 提出了LSTM,LSTM通过选择性地保留信息,有效地缓解了梯度消失以及梯度下降的问题,可以说LSTM正是为了适合学习长期依赖而产生的。
3.2 LSTM结构分析
回顾一下RNN的模型构造:
可以看到,RNN循环网络模型的链式结构非常简单,通常仅含有一个tanh层。LSTM模型构造:
而LSTM的链式结构中,循环单元结构不同,里边有四个神经网络层。先来解释一下图中符号含义:
符号 含义 黄色矩形 神经网络层 粉色圆 结点操作,比如向量相加 箭头 从一个结点的输出到另外的结点的输入 箭头合并 链接 箭头分叉 内容复制后副本流向不同的位置 LSTM结构(图右)和普通RNN的主要输入输出区别如下所示:
相比RNN只有一个传递状态 h t h^t ht , LSTM有两个传输状态,一个 c t c^t ct (cell state), 和一个 h t h^t ht (hidden state)。(RNN中的 h t h^t ht 对应LSTM中的 C t C^t Ct)3.3 LSTM背后的核心思想
LSTM的核心思想,LSTM的关键是细胞状态(cell state),即下图中上边的水平线。cell state像是一条传送带,它贯穿整条链,其中只发生一些小的线性作用。信息流过这条线而不改变是非常容易的。5 改变cell state需要三个门的相互配合。
如下图所示:
LSTM删除或添加信息到cell state,是由被称为门的结构控制的。LSTM中有三个门,“遗忘门” “输入门” 以及“输出门”,用来保护和更新cell的状态。
门是筛选信息的方法,由一个sigmoid网络层和一个点乘操作组成。
如下图:
sigmoid层作为激活函数,将输出控制在(0,1)区间内,Sigmoid的函数图形如下:
可以看到,绝大多数的值都是接近0或者接近1的。利用这一个性质,0 表示不允许任何通过,1 表示允许一切通过。3.4 LSTM的运行机制
第一步,需要决定从cell state中丢弃什么样的信息,这个由“遗忘门”的sigmoid层决定。根据输入 h t − 1 h_{t-1} ht−1 和 x t x_t xt,得到的输出是0和1之间的数。0 代表“完全保留这个值”,1代表“完全丢弃这个值”。
回到开始的例子,原来的主语是"cat",之后遇到了一个新的主语"cats"。这时需要把之前的"cat"给忘掉,以便确定接下来是要使用"were",而不是"was"。如下图:
第二步,需要决定在cell state里存储什么样的信息。这一步划分为两个部分,一是称为“输入门”的sigmoid层决定哪些数据需要更新。然后,tanh层创建一个新的候选值向量 C ~ t \widetilde{C}_t C t,这些值能加入state中。第二部分,需要将这两个部分合并以实现对state的更新。在例子中,这里对应于把新的"cats"加入到"cell state"中,以替代需要遗忘的"cat"。如下图:
在决定好需要遗忘的以及需要加入的记忆之后,就可以把旧的cell state C t − 1 C_{t-1} Ct−1更新到新的cell state C t C_t Ct。 这一步中,把旧的state C t − 1 C_{t-1} Ct−1 与 f t f_t ft 相乘,遗忘先前决定遗忘的东西,之后加上新的记忆信息 i t ∗ C ~ t i_t \ast \widetilde{C}_t it∗C t。这里为了体现对状态值的更新度是有限制的,可以把 i t i_t it当成一个权重。如下图:
最后,需要决定输出。这个输出将会基于cell state ,这是一个过滤后的值。首先,使用“输出门”的sigmoid层决定输出cell state的哪些部分的。然后,将cell state放入tanh(将数值限制在-1到1),最后将结果与sigmoid门的输出相乘,这样就可以只输出需要的部分。如下图:
3.5 LSTM如何避免梯度下降
上边提到了RNN中的梯度下降以及梯度爆炸问题,是是因为在计算过程中使用链式法则,使用了乘积。而在LSTM中,状态是通过累加的方式来计算, S t = ∑ τ = 1 t Δ S τ S_t = \sum_{\tau =1}^t \Delta S_{\tau} St=∑τ=1tΔSτ。这样的计算,就不是复合函数的形式,它的导数也就不是乘积的形式,就不会发生梯度消失的情况。
四、入门例子
下面给出LSTM的一个入门实例-根据前9年的数据预测后3年的客流6,感谢原作者的代码,完整的代码见GithubYonv1943。这里简单说一下这个代码实例的结果,需要了解更加详细的代码细节可以看看原作者的原文详解。
考虑有一组某机场1949年~1960年12年共144个月的客流量数据。使用这个数据中的前9年的客流量来预测后3年的客流量,再和实际的数据进行比对,可以看出LSTM的对这类具有时序关系的拟合效果。
结果图:
- 数据:机场1949~1960年12年共144个月的客流量数据。数据具有三个维度[客运量,年份,月份]。其中前75%(前9年)的数据作为训练集,后25%(后3年)的数据作为测试集。
- 纵坐标:标准化处理:变量值与平均数的差除以标准差,给出数值的相对位置。横坐标为月数。
- 图解释:竖直黑线左边是训练集(前9年)。右边(后3年)红色的是预测数值,蓝色的是实际数值。
可以看到在这个LSTM对这个数据集的拟合效果是比较好的,在这样的实际场景中,可以利用LSTM这样的工具来对客流量做一个预测,以便对客运高峰等情况做好预备方案。
五、总结
- RNN的计算中存在多个偏导数连乘,导致梯度消失或梯度爆炸,难以处理长依赖的信息。
- LSTM通过三个选择性地保留信息,可以选择最近的信息或者很久之前的信息。
- LSTM更新cell state是采用了线性求和的计算,因此不会出现梯度消失问题,可以处理长期依赖的信息。
六、参考资料
-
基于循环神经网络CNN+长短期记忆网络的锂离子电池SOC估计方法
2022-07-05 22:16:23使用python来完成锂电池SOC的估计,使用CNN和LSTM来训练和测试数据,代码中有详细的注释,有助于对代码的理解。 -
LSTM(长短期记忆网络)原理介绍
2021-11-29 18:25:35LSTM算法(Long Short Term Memory, 长短期记忆网络 ) LSTM算法是一种重要的目前使用最多的时间序列算法,是一种特殊的RNN(Recurrent Neural Network,循环神经网络),能够学习长期的依赖关系。 所有RNN都具有神经... -
5-3 长短期记忆网络.mp4
2021-01-09 16:27:39长短期记忆网络,基于长短期记忆网络的文本分类模型 -
长短期记忆网络(LSTM)
2022-01-25 15:23:34本次分享的内容也是基于GRU循环单元的强化版:长短期记忆网络(long short-term memory,LSTM)门控制循环单元。 图1 :LSTM和GRU结构图 二.长短期记忆(LSTM) 通过图1可以很明显的发现LSTM比GRU“门”的数量.. -
『NLP学习笔记』长短期记忆网络LSTM介绍
2022-03-14 00:50:03长短期记忆网络的设计灵感来自于 计算机的逻辑门。 长短期记忆网络引入了 记忆元(memory cell),或简称为 单元(cell)。 -
基于神经网络和长短期记忆网络的网络入侵检测
2021-07-07 06:21:26针对网络入侵检测准确率偏低而误报率偏高的问题,提出一种融合卷积神经网络(CNN)与双向长短期记忆( BILSTM)网络的网络入侵检测方法。对 Kddcup99数据集进行预处理,并分别使用CNN模型、 BILSTM模型提取局部特征... -
基于数据挖掘的长短期记忆网络模型油井产量预测方法.pdf
2021-07-14 12:11:31基于数据挖掘的长短期记忆网络模型油井产量预测方法.pdf -
四、长短期记忆网络(LSTM)数据驱动模型
2022-03-02 21:14:13长短期记忆网络(LSTM)数据驱动模型 5.1 基本原理 长短时记忆网络(Long Short Term Memory Network, LSTM),是一种改进之后的循环神经网络,可以解决RNN无法处理长距离的依赖的问题。在原始的 RNN 模型中,隐藏层... -
长短期记忆网络(LSTM)
2020-08-26 18:53:06长短期记忆网络(LSTM) 1.LSTM介绍 LSTM 表示长短期记忆网络,当我们的神经网络需要在记忆最近的事物和很久以前的事情之间切换时,LSTM 是非常有用的。 2.RNN vs LSTM RNN存储的都是短期记忆,并不擅长长期记忆,... -
机器学习——LSTM长短期记忆网络(初入门)
2022-05-01 13:57:47LSTM(Long Short-Term Memory)是长短期记忆网络,是一种时间递归神经网络(RNN),主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。... -
长短期记忆网络LSTM-读书笔记
2022-01-28 17:15:49长短期记忆网络门: (1)忘记门FtF_tFt:将值朝0减少 Ft=σ(XtWxf+Ht−1Whf+bf)(1)F_t=\sigma(X_tW_{xf}+H_{t-1}W_{hf}+b_f)\tag 1Ft=σ(XtWxf+Ht−1Whf+bf)(1) (2)输入门ItI_tIt:决定是不是... -
循环神经网络(RNN)与长短期记忆网络(LSTM)讲解
2019-10-01 12:54:17与DNN不同的是,循环神经网络(RNN)赋予了网络对前面的内容的一种“记忆功能”,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的... -
循环神经网络(RNN) 和 长短期记忆网络(LSTM)
2020-12-31 15:09:15循环神经网络(RNN) 循环神经网络是一种用于处理...是上一隐藏层的状态,用于记忆状态(对于文本而言,就是前文留下的对推断后文有用的信息)。 基于 Encoder-Decoder 的 RNN 模型可应用于机器翻译,输入是英文句... -
白话机器学习-长短期记忆网络LSTM
2022-04-04 22:03:53长短时记忆网络(Long Short Term Memory Network)LSTM,是一种改进之后的循环神经网络,通过门控机制有选择的记忆重要的内容,可以解决RNN无法处理长距离的依赖的问题,目前比较流行。LSTM结构(图右)和普通RNN的...