对LSTM中每个batch都初始化隐含层的理解
不知道有没有人和我有一样疑惑
在LSTM相关的代码中,为什么每个batch都会将隐藏层重新初始化,
这样不会把以前训练出来的参数丢掉吗??
比如
代码来自GitHub
看了一些解释是h与c是状态,不是参数,每个batch中都需要初始化为0,LSTM 中的参数是W,b。
网络中训练的是参数,不是状态。
说真的。。。当时我没怎么看懂。。。
咨询了实验室的师兄后,我有了自己的理解
产生误解的主要原因是我对RNN和LSTM的结构理解不深入,我们通常看到RNN结构图基本都是这样的
说实话,这个图对我这种初学者并不友好
RNN实际上应该是这样的
举个例子,解释一下RNN是如何训练的
比如这里有一句话,而这句话,就是一个batch
sentence=“我爱我的国”
进行句字的分词后是:
我 爱 我的 国
可以表示为4个n维的词向量,这里n我用8表示
这里有四个时间步(time_steps),每个时间步分别喂入我 爱 我的 国 四个词向量
下一句话是另一个batch,比如 “我 要 漂亮 小姐姐”
在这两个batch之间,并没有啥逻辑关系,如果我们不重新初始化
在测试的时候,batch之间的顺序会去影响 测试的结果。。。
换句话说,如果不重新初始化,两个没有什么逻辑的batch之间,会被我们人为的加上逻辑,上一句的“国”,和下一句的“我”就被联系起来了
而对于下一句的batch而言应该是一个新的开始,所以当然要初始化h和c了
也许有小伙伴要问了,这样初始化,在做文本识别的时候,句与句之间的联系,不也被初始化掉了吗?
师兄给的解释是:“一般不会这么做,一般不考虑句与句之间的联系,如果必须要考虑,那么这一段落都是一个batch中的sampler,这两句话不会分到两个batch中”
在这里偷偷挂上我的大佬级师兄Kenn7,如果他的解释不对。。。请偷偷告诉我,让我去打脸,哈哈哈
今天就分享到这里,祝大家变得更强