annotated-transformer-master复现注意点
最近复习了transformer但感觉之前都是看一小部分源码 或者模棱两可的去学习,最近终于有时间看一下2000行的比较完整的github开源项目:Transformer-pytorch版本
说一下心得体会,代码有一些问题和不合理的地方(可能只是我没理解):
1.LayerNorm位置有些提前 应该放后面一些
2.在进行KL求损失的时候 我们的预测概率可能有的是0 log之后变成-inf 这样会报错
我的做法是把-inf变成-1e10
x = torch.where(torch.isinf(x), torch.tensor(-1e10, dtype=x.dtype), x)
直到看到训练的时候 才了解到我输入的target是完整的 是模拟自回归而不是真正的自回归
每一行数据是一个单独batch对应预测的词进行损失计算。而我们在采样的时候才是真正的自回归
每次把预测到的词放到后面然后这时候感觉掩码就没什么作用。只是为了一致性
4.关于mask掩码src_mask 和tgt_mask 的维度一定要自己去debug看 为什么要这么设置 否则只会云里雾里。
5.由于包的更新过快torch torchtext torchdata会不兼容 我用了cpu的torch 再把源码中一些cuda的代码注释就好了 或者老版本的GPU应该也可以不过我没尝试
6.一些代码和论文不太一样比如Norm的顺序 还有位置编码的函数 但是无伤大雅
6.文中关于一些没讲到的知识:
BPE:这个很推荐huggingface 的nlp课程 里面很详细的讲解了BPE算法(OpenAI) WorldPiece(Bert)Unigram(T5,Bart)三种主流的分词算法 讲的很好
集束搜索:吴恩达老师的深度学习课程有讲的很好可以去b站搜
模型权重平均:让鲁棒性更好
7.突然想起来还有一个难点:spacy库en需要自己去github下载还有那个德语数据集 有问题 直接解包会报错 需要自己去github搜第三方 然后自己去解压!!! 不要让python去解压 否则会报utf-8的错误
8.平滑化标签 防止模型过拟合 增强鲁棒性 就是把标签权重由独热编码变平均一些
9.分布式训练应该挺重要 但我没看
9.warmup代表学习率预热
10.学习率函数是自己定义的
11.构建Batch tgt和tgt_y很重要
还有很多很多细节只有看源码才会知道。
nlp任重道远 加油加油!!!