LSTM
长短期记忆网络——通常被称为 LSTM,是一种特殊的 RNN,能够学习长期依赖性。由 Hochreiter 和 Schmidhuber(1997)提出的,并且在接下来的工作中被许多人改进和推广。主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
我理解是存在上一网络到下一网络的循环。输入存在上一网络层的信息输入、以及当前输入。
另一张图个人认为更形象
x为当前状态下数据的输入,h表示接收到的上一个节点的输入。
y为当前节点状态下的输出,而h`为传递到下一个节点的输出。
通过上图的公式可以看到,输出 h’ 与 x 和 h 的值都相关。
而 y 则常常使用 h’ 投入到一个线性层(主要是进行维度映射)然后使用softmax进行分类得到需要的数据。
对这里的y如何通过 h’ 计算得到往往看具体模型的使用方式。
LSTM相对于RNN多了一个传递变量。下图左侧为RNN,右侧为LSTM(多了候选记忆元C)。
相比RNN只有一个传递状态h_t ,LSTM有两个传输状态,一个c_t(cell state),和一个h_t (hidden state)。(Tips:RNN中的 h_t对于LSTM中的c_t)
其中对于传递下去的 c_t 改变得很慢,通常输出的 h_t 是上一个状态传过来的 h_t-1 加上一些数值。
而 h_t 则在不同节点下往往会有很大的区别。
1、LSTM的第一步是决定我们要从细胞状态(cell state)中丢弃哪些信息。这个决定是由一个sigmoid层叫“忘记门限层”所决定的。它的输入为ht−1和xt, 输出0到1间的数到细胞转态(cell state)Ct−1。其中1表示“完全的保留”而0表示“完全的放弃”。
让我们回到前面语言模型基于前面所有的信息预测下一个单词。对于这个问题,细胞状态包含了当前主语的类别,因此这正确的代词可以被选择。当我们看到一个新的代词时,可以忘记老的代词。
2、下一步就是决定哪些新的信息需要存储在细胞状态中。这包含两部分:第一部分,一个sigmoid层叫“输入门限层”决定哪些值我们需要去更新。第二部分,一个tanh层,创建一个新的候选向量Ĉ t,会被加入到这状态上。下一步,我们将组合这两个部分产生一个新的更新状态。
在我们的语言模型中,我们想添加这新代词的主语类别到这细胞状态,去取代我们要忘记的老的代词。
3、更新老的细胞状态Ct−1, 到一个新的细胞状态Ct。前面的步骤已经决定了将要做什么,我们仅仅需要去实现它。
我们将旧状态与ft相乘,需要丢弃的我们需要更早的丢弃。然后加上it∗Ĉ t。 这就是这新的候选值,规格化了我们需要去决定有多少状态值需要去更新。
4、最后,我们需要决定需要输出什么,输出是基于我们的细胞状态,但是也有一个过滤后的版本。首先,我们运行sigmoid层,这层决定细胞转态哪些部分需要输出。然后,我们把细胞状态通过tanh(输出-1到1之间的值)进行处理,然后再乘上sigmoid输出。最后我们仅仅会输出我们确定输出的那部分。
在语言模型例子中,因为它仅仅看到了一个代词,也许我们想去输出与动词相关的信息,在这种情况下会发生什么呢?例如,也许输出是否这代词时单数还是复数。如果是动词的话,我也知道动词是否需要进行词形的变化。
class torch.nn.LSTM(*args, **kwargs)
参数列表
input_size:x的特征维度
hidden_size:隐藏层的特征维度
num_layers:lstm隐层的层数,默认为1
bias:False则bih=0和bhh=0. 默认为True
batch_first:True则输入输出的数据格式为 (batch, seq, feature)
dropout:除最后一层,每一层的输出都进行dropout,默认为: 0
bidirectional:True则为双向lstm默认为False
输入:input, (h0, c0)
输出:output, (hn,cn)
输入数据格式:
input(seq_len, batch, input_size)
h0(num_layers * num_directions, batch, hidden_size)
c0(num_layers * num_directions, batch, hidden_size)
输出数据格式:
output(seq_len, batch, hidden_size * num_directions)
hn(num_layers * num_directions, batch, hidden_size)
cn(num_layers * num_directions, batch, hidden_size)
Pytorch里的LSTM单元接受的输入都必须是3维的张量(Tensors).每一维代表的意思不能弄错。
第一维体现的是序列(sequence)结构,也就是序列的个数,用文章来说,就是每个句子的长度,因为是喂给网络模型,一般都设定为确定的长度,也就是我们喂给LSTM神经元的每个句子的长度,当然,如果是其他的带有带有序列形式的数据,则表示一个明确分割单位长度,
第二维度体现的是batch_size,也就是一次性喂给网络多少条句子,或者股票数据中的,一次性喂给模型多少是个时间单位的数据,具体到每个时刻,也就是一次性喂给特定时刻处理的单元的单词数或者该时刻应该喂给的股票数据的条数
第三位体现的是输入的元素(elements of input),也就是,每个具体的单词用多少维向量来表示,或者股票数据中 每一个具体的时刻的采集多少具体的值,比如最低价,最高价,均价,5日均价,10均价,等等