关于init_hidden(self, bsz, requires_grad=True) 的问题
SuMarsss opened this issue · 3 comments
SuMarsss commented
你好,褚博士
为什么hidden需要grad,下一个seq只需要hidden中的值,不需要hidden的梯度啊
ZeweiChu commented
这个在训练的时候主要是为了防止sequence太长,back prop距离太远,内存会不够用。如果在hidden位置截断gradient就不会一路back prop回去了。
SuMarsss commented
我的意思是detach就可以截断grad反向传播到上个序列,即使hidden的requires_grad=False。这里为什么要指定requires_grad=True?
SuMarsss commented
我认为这里的参数requires_grad=True是多余的,hidden不需要grad。
- requires_grad=True 不能起到阻止back prop的作用,detach才能起到阻止back prop的作用。训练时,将hidden的requires_grad设置为False,代码依然可以正确运行。
- 从整段代码上来看,hidden不是权重,应该不需要grad,torch里应该只有权重tensor才需要设置requires_grad=True。
- 如果需要back prop追踪到第一个seq的初始hidden,也只需要loss.backward(retain_graph=True),并不需要设置hidden的requires_grad=True