知乎有个老哥介绍了原理,可以看看: 就是他!让你的python内核莫名挂掉 | KMP_DUPLICATE_LIB_OK=TRUE 的始作俑者 - 知乎 (zhihu.com)
请问,这里的反向传播过程中,为什么使用l.sum().backward()而不是l.mean().backward()呢,小批量梯度下降中梯度应该对样本求均值吧?还是说nn.optim.Adam优化器中会求均值之后再更新参数呢?
由于这段测试代码,在用 “i”向前迭代的过程中,使得时间向前延max_setps移动了
因此导致看起来16-step preds
与原x产生了较大的偏差,其实将相位对准后会发现16-step preds
拟合得还是不错的呢
# 列i(i>=tau)是来自(i-tau+1)步的预测,其时间步从(i)到(i+T-tau-max_steps+1)
for i in range(tau, tau + max_steps):
features[:, i] = net(features[:, i - tau:i]).reshape(-1)
感觉对于梯度来说,在这个模型上,sum和mean是等价的,不影响梯度计算
我认为这段翻译的似乎有些问题:
这两种情况都有一个显而易见的问题:如何生成训练数据? 一个经典方法是使用历史观测来预测下一个未来观测。 显然,我们并不指望时间会停滞不前。 然而,一个常见的假设是虽然特定值 $x_t$ 可能会改变, 但是序列本身的动力学不会改变。 这样的假设是合理的,因为新的动力学一定受新的数据影响, 而我们不可能用目前所掌握的数据来预测新的动力学。 统计学家称不变的动力学为静止的 (stationary)。 因此,整个序列的估计值都将通过以下的方式获得:
这里序列的“动力学”我怎么都理解不了,去翻了英文版,实际上是dynamics of the sequence ,所以我认为翻译成序列的动态特征似乎更能清楚地表达序列随时间变化的特点。
我也感觉,他一开始创建features时候的是(T-tau,tau),这个实际上是(996,4)的数组,没有997个样本,因此它才那么写的,实际相当于(996,997,998,999)这一组样本无法使用,因为999需要作为(995,996,997,998)这一组的label
loss不再明显下降就好了,在5个epoch后loss已经收敛在0.05附近,是很低的值了
loss = nn.MSELoss(reduction='none')
l.sum().backward()
改写成
loss = nn.MSELoss(reduction='sum')
l.backward()
训练结果完全不一样,原因是什么?
epoch 1, loss: 0.852841
epoch 2, loss: 0.778558
epoch 3, loss: 0.758861
epoch 4, loss: 0.829508
epoch 5, loss: 0.800305
请问在x = torch.sin(0.01 * time) + torch.normal(0, 0.2, (T,))这一行代码中,为什么torch.normal可以接受(T,)这样一个元组作为参数传递呢
999要作为最后一行的label,最后一行的feature只能是[995, 996, 997, 998],而第一行的feature是[0, 1, 2, 3],所以总行数是996,features.shape是[996, 4]