问题1:为什么labels必须转成float?
问题2:embedding.weight是做什么用的?从观察来看,embedding.weight中存储的是和词嵌入矩阵一模一样的值,既他也是一个词嵌入矩阵,他的作用是什么?
猜测:他是真正被训练的参数。因为我们知道词嵌入矩阵中的词向量数值即是词嵌入模型中的隐含层的参数,再加上下一行我们看到有self.embedding.weight.requires_grad = False if fix_embedding else True
这样一句话,代表weight是可以计算梯度的,所以猜测torch中的embedding模型真正在训练的时候是对这个weight计算梯度下降的。虽然他的值和词嵌入矩阵一模一样,但torch在真正梯度运算的时候是用weight来算的。
问题3:这是一个程序实际运行时的bug,在将dataloader的num_workers参数设置为非默认的时候,每次运行到training()的enumerate dataloader的时候都会突然增加一大堆mainthread,导致内存溢出。不设置dataloader的num_workers之后程序恢复正常。暂时还没搞懂dataloader的这个num_workers有什么坑。
问题4:为什么每个epoch最后一个batch的准确率都低的离谱?5个epoch里每个epoch都是最后一个batch准确度只有30左右,前面1000多个batch准确率都在百分之70左右。