LSTM
比较好的博客 收藏:
http://blog.csdn.net/jerr__y/article/details/58598296
https://zhuanlan.zhihu.com/p/27345523
http://blog.echen.me/lstm-explorer/#/network?file=counter 这个是lstm可视化的东西,打开可能很慢
http://blog.csdn.net/jerr__y/article/details/61195257 这个包含了具体的tensorflow识别3这个数字的可视化展示
vanilla rnn:
对上述图的理解:w1、w2和w3权值共享(参数比较好控制)
一个小圆圈并不代表一个神经元,它只代表一个时刻某个层做的事情,神经元数量是另外一件事情
input layer 的第一个小黑圈可能含有50个神经元,比如他输入的是一个单词word embedding后的50维的向量,hidden layer 的第一个小黑圈可能含有128个小黑圈
vanilla rnn 发展方向有两个:
- 隐藏层功能增强
- 网络的双向化以及加深
LSTM属于第一种
在思考RNN的时候,因为你永远都要想到两个序列,数据具有序列性质,然后训练的参数在时间的维度也是有前后序列性质的
t 永远指的是时刻time,所以它可以指的是时间维度
c 在rnn里c指的是上下文context,在LSTM里指得是细胞cell
h 隐藏层,这个概念重RNN里继承来的
block的概念就是丰富了RNN中的一个小黑圈做的事情,全称是memory block
cell state和hidden state这两个参数也都会进行BP传播
cell状态描述为一种长期记忆,而hidden 状态是一种提取和聚焦这些记忆的方法,形成工作记忆;
当记忆与当前无关时,我们可能会期望隐藏状态可以关闭
通过输入xt(t时刻的特征向量),它会输出一个结果ht(t时刻的状态或者输出)。网络中的循环结构使得某个时刻的状态能够传到下一个时刻。
卡比兽的讲解真的很形象
Ak关于LSTM的讲解
理解C和H是最关键的东西,h的输出可以看作是x的输出,c是一个一直在自我较劲的东西
遗忘门(Forget Gate)想知道对于现在的Ht-1和Xt,应该忘记Ct-1的什么(读cell的操作)
会丢弃cell状态的信息(0意味着完全忘记,1意味着完全记住),所以我们期望当它需要记住一些确切的东西时,它可以被完全激活;当不再需要这些信息时,它可以被再次关闭。
首先是 LSTM 要决定让哪些信息继续通过这个 cell,比如上面的卡比兽的敌人位置信息,就是通过一个叫做“forget gate layer ”的sigmoid 神经层来实现的。它的输入是ht−1和xt,输出是一个数值都在 0,1 之间的向量(向量长度和 cell 的状态 Ct−1 一样),表示让 Ct−1 的各部分信息通过的比重。 0 表示“不让任何信息通过”, 1 表示“让所有信息通过”。
ft代表忘记后的通过比例与Ct-1逐点相乘
传入门(Input Gate,“保存门”)想知道对于现在的Ht-1和Xt,把什么加入到忘记后的Ct-1中并最终形成新的Ct(读到自己,将两次读的写到cell,并且复位)
决定了是否从新输入中保存信息到cell中。因此它需要在遇到无用信息时关闭。
下一步是决定让多少新的信息加入到 cell 状态 中来。实现这个需要包括两个步骤:首先,一个叫做“input gate layer ”的 sigmoid 层决定哪些信息需要更新;
一个 tanh 层生成一个向量,也就是备选的用来更新的内容,Ct~ 。在下一步,我们把这两部分联合起来,对 cell 的状态进行一个更新。
通过更新之后,想下一个cell传递的cell值就产生
输出门(output gate)想要的是输出值,想知道对于现在的Ht-1和Xt,应该直接输出什么东西,然后结合Ct最终确定ht输出给下一个cell的工作记忆,去让下一个cell ht+1去找到ht有好有坏(将复位的cell和新的东西写成输出)
主要是依赖于更新后的Ct,Ct通过一个 tanh 层(把数值都归到 -1 和 1 之间),然后把 tanh 层的输出和 sigmoid 层计算出来的权重相乘,这样就得到了最后输出的结果。
理解完上面这些,下面这两幅图就好理解了,而且你会觉得第一幅图超级艺术,言简意赅
其实对于上面所讲的那么多,这个里面都包含了,上面那个那根黑线,就是中间的Cell加上和它有关的几根线,因为对于cell来说,他所做的事情就是在拿到新的输入进来,在新的输出进来后决定自己保存多少东西,最后给出新的输出。永永远远就是这一个cell,在进行记忆
对应好上面这段话,就基本能看懂下面这个图想说什么,关于虚线,你需要知道一个LSTM很流行的变形,由 Gers & Schmidhuber (2000) 提出的,增加了 “peephole connection”。是说,我们让 门层 也会接受细胞状态的输入
首先是这幅图,其实先要理解的三个箭头,就是network的输入
f是gate的激活函数
g是输入时的激活函数,h是输出是的激活函数
关于梯度消失的极端例子,input gate不进行输入一直关闭,则cell一直不会更新,到了n时刻,仍然和开始的时刻对开始数据的敏感度相同
和贺博交流明白了参数的形状,强化了矩阵和向量的认识
50维的输入 设置hidden_size=60
则自动110维,设置w.shape=[50,110](变形的话是[50,170])并不是[50,60]
对于tensorflow来说,定义的隐藏单元个数后,下面第一句就实现了h_state c_state都是一维向量,形状为[hidden_size],第二句同时初始化两个state,第三句返回这两个state,final_state[0]是c,[1]是h;
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden_units, forget_bias=1.0, state_is_tuple=True)
init_state = lstm_cell.zero_state(batch_size, dtype=tf.float32)
outputs, final_state = tf.nn.dynamic_rnn(lstm_cell, X_in, initial_state=init_state, time_major=False)