多头注意力文本分类核心是将文本转为带全局语义的向量表示后接分类层,关键在于正确处理输入序列、位置编码、注意力掩码及维度对齐;需用Tokenizer统一长度并生成attention_mask,嵌入后加位置编码与LayerNorm,堆叠2–4层取[CLS]向量分类。

用Python实现多头注意力机制做文本分类,核心是把原始文本转换成带全局语义的向量表示,再接分类层。关键不在堆叠层数,而在正确处理输入序列、位置信息、注意力掩码和维度对齐。
文本预处理与向量编码
原始文本需统一长度并映射为数字ID。推荐用Hugging Face的Tokenizer(如BertTokenizer)自动完成分词、截断、添加特殊标记([CLS]、[SEP])和生成attention_mask。
- 固定max_length(如128),过长截断,过短补0
- attention_mask设为1表示有效token,0表示padding位置,后续传入注意力层避免关注无效位置
- 不建议手写word2vec或one-hot——缺乏上下文建模能力,无法支撑多头注意力发挥效果
构建可训练的多头注意力模块
PyTorch中可用nn.MultiheadAttention,但要注意它默认要求输入形状为(seq_len, batch_size, embed_dim),和常见NLP数据(batch_size, seq_len, embed_dim)相反,需先转置。
- 嵌入层后必须加位置编码(Positional Encoding),可用正弦函数实现或直接使用nn.Embedding学习位置向量
- query/key/value投影矩阵由模块内部自动初始化,无需手动定义;但要确保embed_dim能被num_heads整除
- 输出需加LayerNorm和残差连接,提升训练稳定性
堆叠注意力层与获取句子表征
单层注意力只能捕获局部依赖,通常堆叠2–4层Transformer Encoder。分类任务中,一般取[CLS]位置的输出作为整句向量。
立即学习“Python免费学习笔记(深入)”;
- [CLS] token在输入序列最前端,经过所有注意力层后聚合了全文信息
- 若用自定义数据没加[CLS],可用mean/max pooling对整个序列输出做聚合
- 避免直接flatten全部时序维度——会丢失结构信息,降低分类精度
接分类头并训练优化
将[CLS]向量送入全连接层(+Dropout+ReLU),最后接线性层输出类别logits。损失用CrossEntropyLoss,注意标签是long类型整数。
- 学习率建议用5e-5到2e-5(尤其微调预训练模型时),太大易震荡
- 加入梯度裁剪(torch.nn.utils.clip_grad_norm_)防止梯度爆炸
- 验证阶段用F1-score或Accuracy评估,别只看loss下降
基本上就这些。多头注意力不是黑箱,理解好QKV计算逻辑、掩码作用和维度流转,就能稳稳落地文本分类任务。










