门控循环单元(GRU) 讨论区

http://zh.diveintodeeplearning.org/chapter_recurrent-neural-networks/gru.html

没想到竟然是先讲gru,我以为会先讲讲lstm呢 :grinning:

Ht=Zt⊙Ht−1+(1−Zt)⊙H̃ t
这个更新公式是不是还有一个版本
Ht=(1-Zt)⊙Ht−1+Zt⊙H̃ t
这个更新门乘在哪个位置有讲究吗?
因为我看有的资料是按第二种方式写的

这两种设计对结果应该影响不大。GRU和LSTM都有很多不同的变种,每个变种都有一些细微的区别

我有个疑问,就是在深度学习中一般样本数是行,特征维度是列吗?

比如课件中:
门控循环单元的隐含状态只包含隐含层变量H。假定隐含状态长度为h,给定时刻tt的一个样本数为n特征向量维度为x的批量数据Xt∈Rn×x和上一时刻隐含状态Ht−1∈Rn×h,而且后面的更新门和重置门都是XW+HW的形式,但是好多都是卷积神经网络权重W在前面的形式如WX+WH。

这是就是样本数是n行,特征维度是x列吗?但是一般来说向量就是nx1的列向量吗???

所以想知道在神经网络中这些有惯例的写法吗???

这个其实都行吧,我记得我们用的是样本数x特征维度


您好,关于这行代码仍然不懂,是说假如词典的size是10000,而当前输入的单词是第111个,所以就从weight里挑出第111行/列,跟当前的输入相乘的意思嘛?为啥之前的CNN之类就没有这种embedding的操作呢?

而且不懂embed_dim这个参数的意思是什么,为什么建构rnn模型的时候需要它~

可以这样理解:
单个输入x是n维的onehot向量(n x 1),n是词典大小。假设n是10000,其中第111元素为1,其余为0.
W是embedding weight(n x d)。

矩阵乘法

x^\top W

后,得到1xd向量,也就是W中的第111行被取出来了。它对应词语索引为111的词向量。

embed_dim就是d。

好的,明白了! 既然Wx相乘后本来就能得到h*1向量,那这个embedding的操作的目的,是不是为了减少稀疏矩阵的运算量呢?

最主要还是要学出离散输入(词id)的连续feature(词向量)

明白了!谢谢!


请问老师,为什么每个epoch的一开始都要把hidden 给初始化呢?那之前不就白训练了么~~
一个相关的问题就是,感觉自己其实没有弄懂state的意思,之前在白板上讲RNN模型的时候感觉理解了结构和原理,但一看代码,不知道state对应过去到底指的是什么~~

这段代码好像不是GRU教程里的吧

state指的是hidden variable,就是RNN里h,LSTM里多加一个memory cell,就是c

这里是相邻批量采样,所以每个epoch前初始化h。如果是随机批量采样,每个batch前需要初始化h。这样做的理由在第十四课里有详细介绍。

有没有运行GRU的时候碰到过这个错误,请指教

你用的是最新的代码吗:

解决啦,谢谢;;;感觉很受打击,看别人的也学这个,感觉自己和别人学完全不在一个层次:joy::joy::joy:

d:/deeplearning\utils.py:250: RuntimeWarning: invalid value encountered in greater
if norm > clipping_norm:
Traceback (most recent call last):

File “”, line 8, in
idx_to_char=idx_to_char,char_to_idx=char_to_idx)

File “d:/deeplearning\utils.py”, line 333, in train_and_predict_rnn
exp(train_loss/num_examples)))

OverflowError: math range error

学习率为0.2的时候会这样, 不知道应该如何解决

你的运行环境是什么

请教一下,一般LSTM/RNN 如果不收敛或者收敛的loss很大的话有什么方法改进吗? 增加layer数目?
现在设置:learning_rate:0.005, momentum:0.9, sgd.
很简单的lstm gluon层, 只是sequence长度有3000多

其他参数呢,比如num_steps