赞
踩
LSTM (Long Short-Term Memory)也称长短时记忆结构,它是传统RNN的变体,与经典RNN相比能够有效捕捉长序列之间的语义关联,缓解梯度消失或爆炸现象.同时LSTM的结构更复杂,它的核心结构可以分为四个部分去解析:
●遗忘门
●输入门
●细胞状态
●输出门
与RNN很类似,LSTM有两个输出,下一个时间步有三个输入
●与传统RNN的内部结构计算非常相似,首先将当前时间步输入x()与上-个时间步隐含状态h(t-1)拼接, 得到[x(t), h(t-1)],然后通过-个全连接层做变换, 最后通过sigmoid函数进行激活得到f(),我们可以将f(t)看作是门值,好比一扇门开合的大小程度,门值都将作用在通过该扇门的张量,遗忘门门值将作用的上一层的细胞状态上,代表遗忘过去的多少信息,又因为遗忘门门值是由x(t), h(t-1)计算得来的,因此整个公式意味着根据当前时间步输入和上一个时间步隐含状态h(t- 1)来决定遗忘多少上一层的细胞状态所携带的过往信息。
用于帮助调节流经网络的值,sigmoid函数将值压缩在0-1之间
i
t
i_t
it代表输入,
C
t
C_t
Ct代表细胞状态
●输入门结构分析: :
●我们看到输入门的计算公式有两个,第-个就是产生输入门门值的公式, 它和遗忘门公式几乎相同,区别只是在于它们之后要作用的目标上.这个公式意味着输入信息有多少需要进行过滤.输入门的第二个公式是与传统RNN的内部结构计算相同.对于L STM来讲,它得到的是当前的细胞状态,而不是像经典RNN- -样得到的是隐含状态。
细胞状态更新图与计算公式
●细胞更新的结构与计算公式非常容易理解,这里没有全连接层,只是将刚刚得到的遗忘门门值与上一个时间步得到的C(t 1)相乘,再加上输入门门值与当前时间步得到的未更新C(t)相乘的结果.最终得到更新后的C()作为下一一个时间步输入的一部分.整个细胞状态更新过程就是对遗忘门和输入门的应用。
●输出门部分的公式也是两个,第一个即是计算输出门的门值,它和遗忘门,输入门计算方式相同.第二个即是使用这个门值产生隐含状态h(t),他将作用在更新后的细胞状态C(t)上,并做tanh激活,最终得到h(t)作为下一时间步输入的一部分.整个输出门的过程,就是为了产生隐含状态h(t)。
Bi-LSTM即双向LSTM,他没有改变LSTM本身任何的内部结构,只是将LSTM应用两次且方向不同,再将两次得到的LSTM结果进行拼接作为最终输出。
BiLSTM结构分析:
●我们看到图中对我爱中国"这句话或者叫这个输入序列,进行了从左到右和从右到走两次LSTM处理,将得到的结果张量进行了拼接作为最终输出。这种结构能够捕捉语言语法中一些特定的前置或后置特征,增强语义关联,但是模型参数和计算复杂度也随之增加了一倍, 一般需要对语料和计算资源进行评估后决定是否使用该结构。
●位置:在torch.nn工具包之中,通过torch.nn.LSTM可调用.
●input size: 输入张量x中特征维度的大小
●hidden. size:隐层张量h中特征维度的大小
●num. layers:隐含层的数量
● bidirectional: 是否选择使用双向LSTM,如果为True,则使用;默认不使用
●input: 输入张量x
● h0:初始化的隐层张量h
●c0: 初始化的细胞状态张量c
#定义LSTM的参数含义: (input_ size, hidden_ size, num_ layers) #定义输入张量的参数含义: (sequence_ length, batch. size, input_ size) #定义隐藏层初始张量和细胞初始状态张量的参数含义: # (num_layers * num_ directions, batch_ size,hidden_ size) import torch.nn as nn import torch #实例化LSTM对象 #第一个参数: input_ size(输入张量x的维度) #第二个参数: hidden_ size( 隐藏层的维度,隐藏层神经元数量) #第三个参数: num_ .layers (隐藏层的层数) lstm= nn.LSTM(5, 6,20) #设定输入的张量x #第一个参数: sequence_ length( 输入序列的长度) #第二个参数: batch Isize(批次的样本数) #第三个参数: input_ _size(输入张量x的维度) input1 = torch. randn(1, 3,5) #设定初始化的h0,和细胞状态c0 #第一个参数: num_ .layers * num_ directions (层数*网络方向数) #第二个参数: batch_ size( 批次的样本数) #第三个参数: hidden_ size( 隐藏层的维度) h0 = torch. randn(2, 3,6) c0 = torch. randn(2, 3,6) #输入input1,h0,c0放入LSTM中,得到输出张量结果 output, (hn, cn) = lstm(input,(h0,c0)) output ''' tensor([[[ 0.0447,-0.0335,0.1454,0.0438,0.0865,0. 0416], [0.0105,0.1923,0.5507,-0.1742,0.1569,-0.0548], [-0.1186,0.1835,-0.0022,-0.1388,-0.0877,-0.4007]]],grad_ fn=<StackBackward>)''' hn ''' tensor([[[ 0.4647,-0.236,0.0645,-0.3996,-0.0500,-0.0152], [0.3852,0. 0704,0.2103,-0.2524,0 .0243,0. 0477], [ 0.2571,0. 0608,0.232, 0.1815,-0.0513,-0. 0291]], [[ 0.0447,-0.0335,0.1454, 0.0438,0.0865,0.0416], [0.0105,0.1923,0.5507,-0. 1742,0.1569,-0.0548 ], [-0.1186,0.1835,-0.0022,-0. 1388,-0.0877,-0.4007]]], grad_fn=<StackBackward> )''' cn ''' tensor([[[ 0.8083,-0.5500,0.1009,-0.5806,-0.0668,-0.1161], [0.7438,0.095,0.5509,-0.7725,0.0824,0.0626 ], [ 0.3131,0.0920,0.8359,0.9187,-0.4826,-0.0717]],grad_fn=<StackBackward> )'''
LSTM的门 门结构能够有效减缓长序列问题中可能出现的梯度消失或爆炸,虽然并不能杜绝这种现象,但在更长的序列问题上表现优于传统RNN。
●由于内部结构相对较复杂,因此训练效率在同等算力下较传统RNN低很多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。