今天做 transformer 模型改造,发现一个百思不得其解的问题:
旧的模型:词向量分别做了 (head * 3) 次 torch.nn.Linear(dim_token, dim_qkv),得到 (head * 3) 个 Q/K/V;
新的模型:词向量直接做了 torch.nn.Linear(dim_token, dim_qkv * head * 3),然后将输出的 tensor,按序切片成 (head * 3) 个 Q/K/V;
按道理两种方式是完全一致的,但是结果却完全不同,新方法训练速度提高了一倍,但是 loss 下降很慢,到最后也降不到原来的 loss;
我检查了一天了,初始化参数值范围(weight, bias),切片索引,全部没错,百思不得其解,特来求教!
把 Adam 的初始学习率降低了 5 倍,基本回到原来的训练效果了。原以为 Adam 的初始学习率不重要,没想到啊没想到。