RNN和LSTM数据是如何喂入的

刚开始接触自然语言处理的时候对于rnn已经sltm倒是是如何训练的一值一知半解,在看了很多知乎大神的讲解,再此写下了我的感悟,如有错误,希望即使指正。

Recurrent NNs,一般看的最多的图是这个:

RNN和LSTM数据是如何喂入的
但是这个图对初学者相当不太友好。个人认为,目前所有的关于描述RecurrentNNs的图都画得不好,不够明确,里面的细节丢失了。(事实上里面一个"A"仅仅表示了一层的变换。)

我在网上找到了一个图能够比较详细的展示数据是如何喂给rnn的
RNN和LSTM数据是如何喂入的
待我用一个例子好好讲解在自然语言中,rnn是如何训练的
比如这里有一句话
sentence=“我爱我的国”
进行句字的分词后是:
我 爱 我的 国
可以表示为4个n维的词向量,这里n我用8表示
RNN和LSTM数据是如何喂入的
这里有四个时间步,每个时间步分别喂入我 爱 我的 国 四个词向量
这就是我对rnn循环神经网络是如何训练的给出的自己的理解

接下来讲讲sltm是如何训练的

RNN和LSTM数据是如何喂入的
如同一个细胞表示一个时间步,每一个时间步里面有四层网络结构,每个时间步都可分别喂入一个词向量,如图有三个网络结构我们可以喂入三个词向量,打个比方如 我 爱 中国三个词向量

在tensorflow中对于tf.nn.rnn_cell.BasicLSTMCell参数n_hidden的理解很多人可能都不太理解,在此我也给出了我的见解。https://www.cnblogs.com/wushaogui/p/9176617.html我是在这篇文章中领悟出来的的什么是n_hidden,比如我们的每个lstm输出的结果的维度可以称为n_hidden,如图:
RNN和LSTM数据是如何喂入的
给一个stlm喂入的数据包括之前h(t-1)和x(t),其中h(t-1)是10维的,x(t)是5维的,如果我们的n_hidden设置为10,那么我们输出的f(t)就是10味的,我们得到的结果也是10维的。在比如你输进去的数据是(batch_size,time_steep,6),这表示每批次为batch_size,有time_steep个lstm,输入的x(t)是6维的,当n_hidden设置为10时,你得到的结果为(batch_size,time_steep,10)

rnn的dropout

RNN和LSTM数据是如何喂入的
如图表示3层,6时间步的lstm或rnn,共18个单位
Dropout只能是层与层之间(输入层与LSTM1层、LSTM1层与LSTM2层,LSTM2层与LSTM3层)的Dropout;同一个层里面,T时刻与T+1时刻是不会Dropout的。