循环神经网络的从零开始实现

若干问题:
1.原文“因此当前小批量数据最后一个样本的隐状态, 将用于初始化下一个小批量数据第一个样本的隐状态”,此处的样本是不是应该改为时间步,因为rnn()内部是依赖它来推进,不是样本
2. for X, Y in train_iter中为什么可以在多个epochs间迭代,看代码是用完即止的
–补充
3. 这个num_steps改为100或8时perplexity比默认35更高。这个如何解释呢
4.缩略语恢复为原文是否改善效果,类似于统一为小写 ? eg. it’s → it is

下面是一些测试结果

I found there’s a small problem that the lr here is too large.
image
which make the loss value overflows and can’t get a proper result.
I tested locally and found lr = 5e-4 here should be better.

no doubt。几个版本的调用均有误,但关键依然是这个参数,因为顺序采样可看作是随机中的特例

补充问题 5:既然gradient clipping可以防止梯度爆炸,那么采样类似的方法也应该可以防止梯度消失吧,只是方向不同而已
问题6:使用kind='char’别说语义,连基本的词法都很难达标,改为kind='word’更加有保障

为什么激活函数换成 ReLU 就不会出现梯度爆炸呢,ReLU 函数的导数要么是 0 要么是 1,但 tanh 的导数也是 <= 1 的,按理论 tanh 函数的表现应该和 ReLU 差不多 ?

有同学在Mac上训练过吗?我设置device=torch.device(‘mps’),训练完全不收敛。一模一样的代码换到gpu上,设置device=torch.device(‘cuda:0’),训练就成功了。这是为什么啊?

还有权重的影响呢,H=φ(WX+B) 对x求导的结果,是H对φ的导数×权重W, 这样连乘下去,即使φ导数比较小,梯度也可能很大。

1 Like

你好,我认为 gradient clipping不能防止梯度消失。从文中的公式来看:
image
梯度裁剪只会将梯度大小限制在参数theta以内(梯度大于theta,则裁剪为theta;梯度小于theta,则梯度不变。)因此,当梯度消失时,梯度裁剪只会保留原来的梯度,即梯度裁剪失效。

ReLU应该是解决梯度消失问题的吧,tanh有可能梯度消失。

这里训练的时候是每个小批量有35个时间步;但是预测的时候是放入1个时间步,产成1个新时间步(1个新的词元)。这样预测为什么是合理的?

把代码里的SGD换成Adam后发现效果很差这是为什么?


请问有人知道为什么会有前面“<Figure size 350x250 with 1 Axes>”这种输出吗?还有就是为什么我预测的结果特别奇怪,但是图和困惑度都出来了,没什么问题?

个人理解:隐状态的更新方式和权重、偏置的更新方法不同,而计算图中主要是方便用来进行梯度计算的。但是隐状态的更新是不需要使用到梯度的,所以可以将state从计算图中拿出来

1 Like

老师,请问最新的英文版https://github.com/d2l-ai/d2l-en/blob/master/chapter_recurrent-neural-networks/rnn-scratch.md什么时候出中文版啊。分享一下RTX4090与torch1.12.0不兼容问题的解决办法。按照书中的安装教程,pip3 install torch==1.12.0 torchvision==0.13.0 d2l==0.17.6, 运行rnn-scratch.ipynb代码会出现cuda不匹配错误(torch1.12.0自带cuda10.2)。用pip3 install torch==2.0.1安装torch2.0.1(自带cuda11.7)解决了。注意d2l版本0.17.6,虚拟环境的python版本为python3.7~python3.10,否则安装d2l0.17.6会报错ERROR: Ignored the following versions that require a different python version: 1.21.2 Requires-Python >=3.7,<3.11; 1.21.3 Requires-Python >=3.7,<3.11; 1.21.4 Requires-Python >=3.7,<3.11; 1.21.5 Requires-Python >=3.7,<3.11; 1.21.6 Requires-Python >=3.7,<3.11。

对于RTX4090,安装torch1.12.0还可以使用
conda install pytorch==1.12.0 torchvision==0.13.0 torchaudio==0.12.0 cudatoolkit=11.6 -c pytorch -c conda-forge
或者pip install torch==1.12.0+cu116 torchvision==0.13.0+cu116 torchaudio==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu116。


想跟各位请教一下这个报错需要怎么处理,核对了代码也没有问题,不知道原因在哪

其他时间步的信息已经存在因变量h里面了(20个字)

train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
for X, y in train_iter
这里的X维度是32*35,请问32和35分别代表什么呢?


这里应该在最前面加一行train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps, use_random_iter=True),按原文那样train_iter并没有从data中拿到随机数据

这个抖动不算剧烈吧…毕竟纵轴的尺度变得已经很小了

batch_size和num_steps