LSTM架构详解-lstm模型结构

2023-08-07 22:27:22

 

1.逐步理解 LSTM

https://www.jianshu.com/p/9dc9f41f0b29

在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取 ht−1h_{t-1}xtx_t ,输出一个在 0011 之间的数值给每个在细胞状态 Ct−1C_{t-1} 中的数字。 11 表示“完全保留”, 00 表示“完全舍弃”。

让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。

决定丢弃信息

下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid 层称 “输入门层” 决定什么值我们将要更新。然后,一个 tanh 层创建一个新的候选值向量, Ct~\widetilde{C_t} ,会被加入到状态中。下一步,我们会讲这两个信息来产生对状态的更新。在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语。

​确定更新的信息

现在是更新旧细胞状态的时间了, Ct−1C_{t-1} 更新为 CtC_t 。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。

我们把旧状态与 ftf_t 相乘,丢弃掉我们确定需要丢弃的信息。接着加上 it∗Ct~i_t * \widetilde {C_t} 。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。

在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方。

更新细胞状态

最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 −1-111 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

在语言模型的例子中,因为他就看到了一个 代词,可能需要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化。

输出信息

2. LSTM内部的神经网络

https://jinzengnju.github.io/2018/03/26/LSTM%E5%8F%82%E6%95%B0%E5%92%8C%E7%BD%91%E7%BB%9C%E6%9E%B6%E6%9E%84%E8%A7%A3%E9%87%8A/

2.1. LSTM参数详解

LSTM输入:输入参数batch_size,time_step,输入词向量维度,另外还需要定义隐藏层神经元个数num_units。

对于每个时间步:输入数据维度为【batch_size*输入词向量维度】,

矩阵W维度为【输入词向量维度即输入层单元,num_units】,隐层输出数据【batch_size*num_units】这里的输出层是指​输出,还没有加入全连接层或者softmax等层。

矩阵U的维度为【num_units,num_units】,这里的U其实就是 WhW_h ​矩阵,上一时刻的输出 ht−1h_{t-1} 数据​维度为【num_units】(实际上是【batch_size*num_units】,因为有batch_size个输入数据),

所以U矩阵也就是 WhW_h ​矩阵的维度为【​ ht−1h_{t-1} 的维度,隐藏层维度(num_units)】,即【num_units,num_units】。

每个时间步都是这样的,即权重都是共享的,所以隐层在所有时间步乘上权重后, 形成的Tensor为[time_step,batch_size ,num_units]或者[batch_size,time_step,num_units]

2.2 LSTM内部的神经网络

gategate 即​实际上就是一层全连接层,它的输入是一个向量,输出是一个0到1之间的实数向量。门(​ gategate )的激活函数为 sigmoidsigmoid ​函数,计算当前输入的单元状态​ CtC_t 所用的激活函数是​ tanhtanh 函数: Ct=ft∗Ct−1+it∗gtC_t = f_t * C_{t-1} + i_t * g_t ​, gtg_t 来自于 tanhtanh ​函数计算。

可以看到中间的cell 里面有四个黄色小框,每一个小黄框代表一个前馈网络层,num_units(即HIDDEN_SIZE, 隐藏层结点个数)就是这个层的隐藏神经元个数。其中1、2、4的激活函数是 sigmoidsigmoid ​,第三个的激活函数是 tanhtanh ​。

cellcell 的权重是共享的,这是什么意思呢?这是指这张图片上有三个绿色的大框,代表三个 cellcell 对吧,但是实际上,它只是代表了一个 cellcell 在不同时序时候的状态,所有的数据只会通过一个 cellcell ,然后不断更新它的权重。

注意: num_nuitsnum\_nuits ​定义的是一个门的隐层神经元个数,比如遗忘门,输入维度为 ht−1h_{t-1} ​ 拼接 xtx_t ​,隐层为 num_unitsnum\_units ​,所以遗忘门的参数为 num_units∗(ht−1+xt)num\_units * (h_{t-1} + x_t) ​。其他两个门和输入激活的分析同上,

所以LSTMcell参数个数为: 4∗num_units∗(ht−1+xt)4 * num\_units * (h_{t-1} + x_t) ​。

中间层的参数就是这样,不过还要加上输出的时候的参数,假设是10个类的话,就是​的 num_units∗10num\_units * 10 W 参数和10个 ​ biasbias 参数(注意,输出层图中没有画出)

上图是实际的沿时间展开的网络图:​ OitO_i^t 是最终输出结果,图中是接了全连接层。(注意​ OitO_i^t 和输出门 OO ​不是同一个东西)

2.3 多隐藏层LSTM

上面考虑的仅仅是只有一个隐藏层的,但是很多时候隐层往往是多层甚至是深层的,所以你经常看到的应该是这样的: 图中可以看到,​ hth^t 传递到下一层LSTM,作为下一层LSTM的输入 xtx^t ​, 而state(即 hth^t 和 ​ CtC^t ) 则传递到当前LSTM的下一时刻。

多隐藏层LSTM就是多个LSTM叠加,第一层LSTM的隐藏层输出 hth_t ​, ​ hth_t 作为输入传递到第二层LSTM, 传入第二层LSTM的隐藏层。接着重复上述步骤,传入第n层LSTM, 再传给隐藏层,最后接全连接层,softmax层或者其他输出层。例如下图:

一共4层LSTM:第一层LSTM输入维度为5,隐藏层结点为128,传入第二层LSTM;

第二层LSTM的输入就是第一层LSTM的输出 ​,隐藏层结点为64,传入第三层LSTM;

第三层LSTM的输入就是第二层LSTM的输出 ​,隐藏层结点为32,传入第四层LSTM,

第四层LSTM的输入就是第三层LSTM的输出 ​,隐藏层结点为8,第四层LSTM接全连接层,结点数为1。


以上就是关于《LSTM架构详解-lstm模型结构》的全部内容,本文网址:https://www.7ca.cn/baike/60121.shtml,如对您有帮助可以分享给好友,谢谢。
标签:
声明