<论文>用自回归空白填充技术训练一个GLM

一、摘要

        本文介绍提出大模型GLM的论文——由清华大学团队开展研究,并被ACL2022录用的《GLM: General Language Model Pretraining with Autoregressive Blank Infilling

4dbc3825a2fc4f1ab028678cf42b7be4.png

译文:

        目前已有多种预训练架构,包括自编码模型(如BERT)、自回归模型(如GPT)和编码器-解码器模型(如T5)。然而,没有一种预训练框架在自然语言理解(NLU)、无条件生成和条件生成这三大类任务中表现最佳。我们提出了一种基于自回归空白填充的通用语言模型(GLM)来应对这一挑战。GLM通过添加二维位置编码并允许以任意顺序预测跨度来改进空白填充预训练,这在NLU任务上带来了比BERT和T5更好的性能提升。同时,通过改变空白的数量和长度,GLM可以针对不同类型的任务进行预训练。在广泛的任务中,包括NLU、条件生成和无条件生成,GLM在相同模型规模和数据条件下,表现优于BERT、T5和GPT,并且在单个预训练模型中以1.25倍于BERT Large的参数量实现了最佳性能,展示了其对不同下游任务的广泛适应性。

二、核心创新点

你得到了这样的输出: ```text Raw output tokens: <pad> <unk>: <unk>,<unk>?<unk></s> ``` 这说明: ❌ 模型根本没有正确生成中文内容,而是输出了一堆 `<unk>`(未知 token)和 `<pad>`。 这是一个非常典型的 **分词器(Tokenizer)与训练数据不匹配** 的问题! --- ## 🔍 一、根本原因分析 ### ❌ 问题核心: > **T5 使用的是英文 SentencePiece 分词器,对中文支持极差!** `"伊孜"`、`"在看书"` 这类中文字符在原始 `t5-small` 的词表中不存在 → 全部被切成单字甚至乱码 → 被标记为 `<unk>` → 模型无法学习 → 输出全是乱码。 --- ## ✅ 二、解决方案:使用支持中文的 T5 模型 你需要换一个 **专为中文优化过的 T5 模型**。以下是推荐选项: --- ### ✅ 推荐方案 1:使用 `Langboat/mengzi-t5-small` 这是由中文团队训练的 T5 变体,对中文理解能力强,兼容 Hugging Face 接口。 ```bash pip install transformers tensorflow ``` ```python model_name = "Langboat/mengzi-t5-small" tokenizer = AutoTokenizer.from_pretrained(model_name) model = TFT5ForConditionalGeneration.from_pretrained(model_name) ``` ✅ 特点: - 中文分词效果好 - 支持 UTF-8 字符 - 在中文 NLU 和生成任务上表现优于原生 T5 --- ### ✅ 推荐方案 2:使用 `google/flan-t5-small` + 中文预处理(次选) 虽然 FLAN-T5 主要仍是英文主导,但通过 fine-tuning 可以让它学会一些中文模式。 但它仍然不如 Mengzi 系列适合纯中文任务。 --- ### ✅ 推荐方案 3(最佳性能):切换到 PyTorch + Qwen 或 ChatGLM(非 T5 架构) 如果你的目标是高质量中文对话生成,建议放弃 T5 架构,改用以下模型: | 模型 | 优点 | |------|------| | `Qwen/Qwen-1_8B-Chat` | 阿里出品,原生支持中文,指令遵循强 | | `THUDM/chatglm3-6b` | 清华 GLM,支持多轮对话、工具调用 | | `IDEA-CCNL/Ziya-LLaMA-13B-v1` | 微调自 LLaMA,擅长角色扮演 | ⚠️ 缺点:显存要求高(至少 10GB GPU),但效果远超 T5。 --- ## ✅ 三、立即修复你的代码(使用 Mengzi-T5) 下面是修改后的完整流程: ```python # %% [修复] 使用支持中文的模型 model_name = "Langboat/mengzi-t5-small" tokenizer = AutoTokenizer.from_pretrained(model_name) model = TFT5ForConditionalGeneration.from_pretrained(model_name) # 设置 pad_token(必须) if tokenizer.pad_token is None: tokenizer.pad_token = tokenizer.eos_token ``` 然后重新运行 `preprocess_function` 和训练流程。 --- ## ✅ 四、验证分词器是否能正确处理中文 添加这段调试代码: ```python # %% 调试分词器 test_text = "[Scene] 书房 [Relationship] 情侣 [Emotion] 平常 → 亲密 [Context]\n用户: 你在看什么书?" encoded = tokenizer(test_text, return_tensors="tf") print("Input IDs:", encoded.input_ids[0]) print("Decoded tokens:") for id in encoded.input_ids[0].numpy(): print(f"{id} -> {tokenizer.decode([id])}") ``` 如果输出类似: ```text 100 -> 在 205 -> 看 307 -> 书 ``` ✅ 成功!说明中文被正确切分。 如果还是输出 `<unk>`,那就说明模型根本不认识这些字。 --- ## ✅ 五、为什么你会看到 `<unk>: <unk>,<unk>?<unk>` 我们来看这个输出: ```text <pad> <unk>: <unk>,<unk>?<unk></s> ``` 分解一下: - `<pad>`:填充符 → 表示生成从中间开始 - `<unk>`:未知 token → 所有中文都没被识别 - `:` `,` `?` 是英文符号 → 它们在词表中存在 - `</s>`:句子结束符 👉 结论:模型只认识英文标点,不认识任何中文词汇 → 根本无法训练或推理! --- ## ✅ 六、最终建议路线图 | 阶段 | 建议 | |------|------| | ✅ 当前阶段(快速验证) | 改用 `Langboat/mengzi-t5-small` | | 🚀 下一步(更好效果) | 收集更多数据 + 微调 `mengzi-t5-base` | | 💡 长期方向(角色对话系统) | 切换到 `Qwen` 或 `ChatGLM3` + LoRA 微调 | | 📱 部署需求 | 导出为 ONNX / GGUF 格式用于手机或边缘设备 | --- ## ✅ 示例:测试 Mengzi-T5 是否能生成中文 ```python def test_chinese_generation(): input_text = "[Scene] 书房 [Relationship] 情侣 [Emotion] 平常 → 亲密 [Context]\n用户: 你在看什么书?" inputs = tokenizer(input_text, return_tensors="tf", max_length=512, truncation=True).input_ids outputs = model.generate( inputs, max_length=100, do_sample=True, top_k=50, temperature=0.7, pad_token_id=tokenizer.pad_token_id, eos_token_id=tokenizer.eos_token_id ) response = tokenizer.decode(outputs[0], skip_special_tokens=False) print("Raw Output:", response) test_chinese_generation() ``` 你应该能看到类似: ```text Raw Output: <pad> 伊孜: 在看一本心理学的书~</s> ``` 🎉 成功! ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值