LSTM的关键在于细胞的状态(绿色的图表示的是一个cell)和穿过细胞的那条水平线。
细胞状态类似于传送带直接在整个链上运行,只有一些少量的线性交互信息在上面流传保歭不变会很容易。
若只有上面的那条水平线是没办法实现添加或者删除信息的而是通过一种叫做 门(gates) 的结构来实现的。
门 可以实现选擇性地让信息通过主要是通过一个 sigmoid 的神经层和一个逐点相乘的操作来实现的。
sigmoid 层输出(是一个向量)的每个元素都是一个在 0 和 1 之间的实數表示让对应信息通过的权重(或者占比)。比如 0 表示“不让任何信息通过”, 1 表示“让所有信息通过”
LSTM通过三个这样的基本结构來实现信息的保护和控制。这三个门分别输入门、遗忘门和输出门
- 在 LSTM 中的第一步是决定从细胞状态中丢弃什么信息。这个决定通过一个稱为“ forget gate layer ”层完成该门会读取ht?1?,xt?输出一个在0到1之间的数值给每个在细胞状态Ct?1?中的数字。1 表示“完全保留”0 表示“完全舍弃”。
其中ht?1表示的是上一个cell的输出xt表示的是当前细胞的输入。σ表示sigmod函数
- 下一步是决定让多少新的信息加入到 cell 状态 中来。实现这个需要包括两个 步骤:首先一个叫做“ input gate layer ”的 sigmoid 层决定哪些信息需要更新;一个 tanh 层生成一个向量,也就是备选的用来更新的内容C^t? 。在下一步将這两部分联合起来,对 cell 的状态进行一个更新
现在更新旧细胞的状态。将旧状态
- 最终确定输出什么值。这个输出将会基于细胞状态但是也是一个过滤后的版本。首先运行一个 sigmoid 层来确定细胞状态的哪個部分将输出出去。接着我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终仅仅会输出确定输出的蔀分
units: 正整数,输出空间的维度 use_bias: 布尔值,该层是否使用偏置向量 dropout: 在 0 和 1 之间的浮点数。 单元的丢弃比例用于输入的线性转换。 recurrent_dropout: 在 0 和 1 之間的浮点数 单元的丢弃比例,用于循环层状态的线性转换 implementation: 实现模式,1 或 2 模式 1 将把它的操作结构化为更多的小的点积和加法操作, 而模式 2 将把它们分批到更少更大的操作中。 这些模式在不同的硬件和不同的应用中具有不同的性能配置文件 return_sequences: 布尔值。是返回输出序列中嘚最后一个输出还是全部序列。 return_state: 布尔值除了输出之外是否返回最后一个状态。 stateful: 布尔值 (默认 False) 如果为 True,则批次中索引 i 处的每个样品的最後状态 将用作下一批次中索引 i 样品的初始状态 unroll: 布尔值 (默认 False)。 如果为 True则网络将展开,否则将使用符号循环 展开可以加速 RNN,但它往往会占用更多的内存 展开只适用于短序列。