- nn对参数的初始化方式非常敏感,我用randn初始化时,怎么都不收敛(即便是只有一条数据的训练集),后来用xavier_uniform_之后结果大大改善。
for name, params in xlnet.named_parameters():
if params.dim() >1:
torch.nn.init.xavier_uniform_(params)
print(name)
- 去掉极端数据(非常长但是个数很少的句子)可以显著提高GPU的利用率
- 当CNN遇到CTC,哪些因素会影响模型的收敛?
CNN的kernal size和stride会影响模型的收敛,ks尽量大一些,stride应当接近或低于ks的一半。
一个极端的例子:ks=3,stride=2,很难收敛,因为帧与帧之间有很高的相似性,这样卷积后不同帧之间的差别就更小了,不利于后续的分类。
- pytorch查看模型参数量:
model = Model()
print('total parameters:', sum(param.numel() for param in model.parameters()))
- low gpu util 遇到这种问题尽量不要用下面的代码显式删除变量
del loss,targets_mask,targets,input_q,target_mapping,perm_mask,input_mask,input_k
torch.cuda.empty_cache()
- transformer的layer最好抽象出来,不要自己建立参数,因为会用到index,backward过程慢。
self.q_proj_weight = nn.Parameter(torch.randn(self.n_layer, self.d_model,
self.n_head, self.d_head))
- linux查看cpu核数:https://www.cnblogs.com/emanlee/p/3587571.html
- 有一些线性变换是不需要加bias的(一般bias都是某一层layer的输出后者最后网络的输出才加),过多的bias会导致模型不能拟合(一直在某个点打转),比如self attention中的线性proj就bias就不需要。