9.1.1 门控循环单元与普通的循环神经网络之间的关键区别在于: 后者支持隐状态的门控。 应该是 前者,不是后者。
问题4,gru为什么需要两个门,想的不是非常清楚:
重置门和更新门各司其职。重置门单方面控制自某个节点开始,之前的记忆(隐状态)不在乎了,直接清空影响,同时也需要更新门帮助它实现记忆的更新。更新们更多是用于处理梯度消失问题,可以选择一定程度地保留记忆,防止梯度消失。
为什么在RNN里采用过大的batch_size会使得网络往往无法得到收敛,是因为发生了梯度爆炸现象吗
因此,任何预先存在的隐状态都会被重置 为默认值。
请问下这句话怎么理解,实在理解不了,在9.1.1.2中
更新门等于0时,隐状态也就没了,就相当于隐状态会被重置为默认值(第八章实现中,初始隐状态是0)。我是这样理解的,有误请指出。
隐状态被重置为默认值应该是R(重置门)为0吧,更新门是长期依赖关系
之前用的矩阵乘法这里变成了Hadamard积,这有区别吗,为什么这么做?我自己试着改回矩阵乘,效果似乎是一样的,,
是的,谢谢指正,xxxxxxxxxxxx
实际效果应该没啥区别,感觉用哈达玛积的原因可能是为了更好地展示两个门只是对过去的隐状态进行一个线性的放大或缩小(不确定
后面的时间步会依赖于前面时间步的H(隐状态),但是当重置门关闭之后,0*H = 0也就是说在该时间步之后的值不再依赖于之前的H了,相当于在这个时间步把H重置为默认值了。我是这么理解的,有误请指正
对于第一题,我的理解是这样的。
在时间步t‘的时候R门关闭,将H的状态重置为默认值,并且之后Z门一直打开,使t’的H状态一直更新传递到t时间步上。
有误的话请指正
默认值是什么?感觉就是过度阶段的切换而已,因为无论Rt如何Ht必然更新
Rt趋近于0,那么Rt和Ht-1的Hadamard积就接近于0,这个隐状态Ht-1实际上没生效
感觉这章在数学上没有讲透,也查看了发明人的论文,也没有讲数学上的原理。按照上一章的所学,导致梯度消失或爆炸的主要是因为W_hh。从误差反向传播来看,不理解为什r与z能够在W_hh病态的时候就能输出一个较大的负值,从而通过 Sigmoid输出0 ?这点非常关键。想请教一下老师,是否有可以参考的书籍或论文可以进一步学习?还是这个设计本身来自于发明人对训练实际输出的观察而想到的抑制方法,换句话说,更加时一种类似PID一样的工程实践,而非有坚实的数学原理加以支持?
要是两个都打开,一直保持的是旧信息呢?一直使用的是t’时刻的信息加上此时的输入
Traceback (most recent call last):
File “D:\PythonProject\Pytest\Pytest\Deap Learning\Chapter9\section1.py”, line 78, in
d2l_torch.train_ch8(model, train_iter, vocab, lr, num_epochs, device)
File “D:\anaconda3\envs\Pytest\Lib\site-packages\d2l\d2l_torch.py”, line 790, in train_ch8
ppl, speed = train_epoch_ch8(
^^^^^^^^^^^^^^^^
File “D:\anaconda3\envs\Pytest\Lib\site-packages\d2l\d2l_torch.py”, line 759, in train_epoch_ch8
y_hat, state = net(X, state)
^^^^^^^^^^^^^
File “D:\anaconda3\envs\Pytest\Lib\site-packages\d2l\d2l_torch.py”, line 705, in call
return self.forward_fn(X, state, self.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “D:\PythonProject\Pytest\Pytest\Deap Learning\Chapter9\section1.py”, line 62, in gru
H, = state
^^
ValueError: too many values to unpack (expected 1)
总是蹦出来这个错误,H, 这个编译不过去呀,上一章遇到了同样的问题
这里Hadamard的目的,是通过W为目标加上权重来确定那些隐藏状态需要保留,从这个功能角度看,矩阵乘与Hadamard的结果一致,不过是W中不同位置的元素权重而已,在训练过程中,当以Loss减小为条件下,自动会为每个隐藏状态训练匹配的W里的为他加权的元素。
def init_gru_state(batch_size, num_hiddens, device):
return (torch.zeros((batch_size, num_hiddens), device=device), )
盲猜你这段代码少了最后一个逗号