
本文为365天深度学习训练营 中的学习记录博客 原作者K同学啊总结1. 数据预处理中的“动态拼接Collate_batch”传统的文本处理如 CNN/RNN通常需要设定一个max_len对短句子补零Padding长句子截断。案例中使用的collate_batch配合nn.EmbeddingBag采用了一种更高级的做法。它把一个 Batch 里的所有句子首尾相连拼成一维的长向量text_list同时用offsets记录每个句子开头的索引位置。这种做法完全避免了无效 Padding 的计算浪费在处理变长文本时非常高效。2. 位置编码Positional Encoding对 Transformer 的绝对必要性Transformer 本质上是基于自注意力机制Self-Attention的它的矩阵计算是并行的。如果不加干预模型眼里“我想看和平精英”和“精英和平看我想”是完全没有任何区别的也就是失去了语序信息。代码中的PositionalEncoding类通过三角函数Sine Cosine为每个词生成了独一无二的位置向量并直接加到词向量上。位置编码是 Transformer 能够理解“句意逻辑”和“先后顺序”的灵魂。3. 多分类任务中的“样本不均衡”与“模型过拟合在最初使用极少量的简单模拟数据时模型轻而易举就拿到了1.0000的满分这是典型的过拟合Overfitting模型只是死记硬背了答案。引入真实的train.csv后数据量达到了 12,100 条。通过对数据分布的观察FilmTele-Play等类别有 1300 多条而Other只有 200 多条。真实的分类任务往往伴随着类别不均衡。最终模型在 12 个复杂的口语化分类中拿到0.4975的准确率这才是基准模型的正常表现。想要突破这个瓶颈通常需要引入诸如 AdamW 优化器、学习率衰减Scheduler或者直接上预训练模型如 BERT。4. 跨平台硬件Mac M系列芯片的算子兼容坑使用 PyTorch 的device torch.device(mps)去调用 Mac 的 GPU 固然能加速但苹果的 MPS 驱动对 PyTorch 算子的支持目前并不完美比如本例中的nn.EmbeddingBag直接抛出NotImplementedError。在做深度学习开发时“能跑通”永远优先于“在哪里加速”。当遇到底层算子不支持的报错时果断降级到device cpu是最明智的策略。因为文本分类的特征维度较小现代 CPU 的多线程性能完全可以在几分钟内轻松搞定一万条数据的多轮迭代。