尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
无监督阅读理解实战:摆脱标注数据,用MLM与自训练构建问答系统
做过NLP的人基本都懂那个潜规则凡是靠监督学习吃饭的任务一半时间不是在调模型而是在跟标注数据搏斗。尤其是阅读理解这类任务——你给模型一篇文章让它回答“文中提到的主角为什么离开城市”看似简单但想凑齐一份高质量训练集得先让标注员通读全文、设计问题、再到原文里框出答案的起止位置还要反复检查歧义和漏洞。一个熟练标注员一天能稳定产出几百个问答对已经算效率爆棚放到大规模落地场景里这个成本会直接让你怀疑人生。这也是“无监督学习”这几年被反复提起的根源之一。简单说我们想让AI在没有标准答案的情况下直接利用海量文本自己摸索出“如何理解一段话并回答相关问题”。本文会从原理、技术路径到可复现代码完整拆解“无监督阅读理解”这件事帮你在标注资源几乎为零的前提下跑通一个能用的阅读理解流程。不管你是面临预算压力的算法工程师还是正在入门NLP的学生这篇文章的内容都能直接拿去做参考。1. 摘掉“标注眼镜”无监督学习解决阅读理解的第一性思考1.1 标注数据为什么是NLP的“阿喀琉斯之踵”先看清楚问题本身。机器阅读理解通常被建模成一个抽取式任务给一段上下文文本再给一个问题模型需要在文本中找到连续片段作为答案。这个任务在监督设定下表现不错前提是有大量三元组数据——(文章, 问题, 答案位置)——用来训练模型。但这类数据远比想象中难获取。首先设计一个好问题本身就需要创造力和对文章结构的把握不同人问出的问题难度差异极大其次答案位置需要精确到字符级稍有偏差就变成噪声样本最后质量控制流程几乎无法完全自动化。一个项目要启动时往往先被标注成本吓退这就是所谓的“标注噩梦”。更要命的是领域迁移问题。你在通用语料上标注好数据并训练完模型换到医疗、法律、工业设备说明书等垂直领域效果迅速下滑又得重新标注。现实的资源约束下很多团队根本撑不到第一版模型上线。无监督学习正是冲着这个痛点去的。它的目标很直接利用几乎无限的非结构化文本让模型在没有任何人工标注的条件下自己构建起“阅读文章、定位关键信息、组织答案”的能力。严格来说无监督不能做到完美的抽取式问答但它可以把冷启动成本从“数十万标注样本”降到“只有一批原始文档”甚至降到零。1.2 无监督学习的本质从数据中挖掘结构无监督学习不是“魔法”它的本质是用数据自身携带的结构来构造监督信号。以自然语言为例一个句子内部存在很强的共现关系、上下文约束和冗余信息这些都可以变成模型的学习目标。最典型的是掩码语言模型Masked Language ModelMLM。随机挖掉句子中一部分词让模型根据剩下的上下文去预测被挖掉的词这就是一个天然的“自监督”任务。做阅读理解需要的能力——理解上下文、推断缺失信息、捕捉实体间关系——在MLM预训练中已经隐含地得到了大量锻炼。也就是说模型其实早就会“阅读”只是我们过去非要再喂一遍人工标注它才愿意在下游任务上“开口答题”。类比起来这很像学外语的沉浸式环境。小孩学母语时并没有人逐句告诉他“这句话是主语、那句是谓语”他通过大量听、读、猜最终自动掌握了语言结构。无监督阅读理解就是想复刻这个过程让AI大量阅读原文自己揣摩词语之间的关系等到真正遇到问题时它已经储备了足够的语义理解能力。这部分被很多人忽视但实际上非常重要无监督不是“不训练模型”而是“把训练目标换成模型能自己生成的内容”。理解了这一点后面所有技术路径就都顺理成章了。2. 三条技术路径AI如何在没有标准答案的情况下学会阅读2.1 掩码语言模型让模型在“完形填空”中建立语感MLM是目前最成熟、也最容易被低估的无监督学习路径。它的逻辑很简单给定一段文本随机掩盖掉其中15%的单词让模型预测被掩盖位置的原文。因为模型不知道原文是什么只能依赖左右两侧的上下文信息所以每一次预测都是一次强制的上下文理解。实操中MLM一般作为预训练阶段的核心任务也可以作为领域自适应的继续训练任务。比如你手上有一批法律文书但下游要做的是“根据合同条文回答争议点”这时不需要任何标注只需要拿这批合同文本继续做MLM训练模型就能快速适应法律文书的用词习惯和句式结构。为什么这有助于阅读理解阅读理解的标准定义是“根据给定文本回答问题”而MLM时刻都在做类似的事它必须根据给定文本预测某个缺失的信息。唯一的差别是阅读理解中缺失的信息是“用户问题的答案”而MLM中缺失的信息是“原文中的某个词”。将二者打通后模型对文本中任何位置的语义关系都有了很强的建模能力。实操中有几个关键细节直接影响MLM的效果掩盖比例一般设为15%太低则任务太简单模型学不到深层关系太高则上下文信息不足训练难以收敛。不要只做token级别的随机掩盖尽量用whole word masking也就是把完整词语的所有子词一起掩盖。否则模型容易通过拼凑子词预测答案而不是理解语义。如果数据量不大建议把MLM训练和原始预训练混合进行避免灾难性遗忘。我见过很多团队把MLM训练当成例行公事随便调几个参数就跑结果下游任务收益甚微。其实MLM训练的质量很大程度决定了无监督阅读理解的上限。2.2 对比学习教会模型区分“相关”与“无关”如果说MLM在训练模型“读懂文本”那对比学习就是在训练模型“找出重点”。阅读理解能力中非常关键的一环是看到一个问题时模型要在文章中定位与问题相关的片段忽略无关信息。对比学习的核心操作是构造“正样本对”和“负样本对”。比如同一篇文档中连续的两个句子语义紧密相关可以作为正样本对不同文档中的句子语义差异较大可以作为负样本对。模型的任务是让正样本对在向量空间中的距离更近负样本对更远。放到无监督阅读理解中一种常见的做法是把“问题”和“包含答案的文档片段”视作正样本对把“问题”和“随机文档片段”视作负样本对。问题是没有标注时我们不知道哪个片段包含答案。不过没关系我们可以利用无监督方式构造近似正样本。例如假设用户问题来自文档A那么文档A中的任意一个完整段落天然比文档B中的段落更可能与问题相关。这种粗略的相关性信号虽然不如人工标注那么精确但已经足够训练一个不错的文本匹配模型。实操中对比学习通常采用如下流程用编码器将句子/段落转换为向量。在一个batch内构造多个正负样本对。使用类似InfoNCE的损失函数拉近正样本、推远负样本。这套思路非常灵活既可以用来做“问题到段落”的粗筛也可以用来做“问题到句子”的精排。需要注意对比学习非常依赖batch size。batch越大负样本越丰富效果越好。有条件的话batch size至少开到128以上可以用梯度累积来模拟大batch。2.3 自训练与伪标注模型给自己出题自己批改自训练是另一种无监督/半监督路线思路更简单粗暴先用某种基础方法让模型对无标注数据做出预测接着把高置信度的预测结果当作“伪标注”再拿伪标注数据继续训练模型。阅读理解场景中这套流程可以这样展开在少量有标注数据上甚至完全没有训练一个初始模型。即使初始模型效果很差也没关系。让初始模型对大量无标注文档进行预测产出候选问答对。根据模型输出的置信度、答案长度、位置分布等信息筛选出可靠样本。将可靠样本加入训练集重新训练模型。重复2到4步若干轮。如果你连少量标注都没有也可以完全无监督启动用规则、词典、语言模型本身来构造初始训练集。比如从文档中抽取名词短语作为候选答案再利用MLM模型判断哪些候选答案在原文中是“实体”且具有信息量从而生成弱标注样本。这轮迭代是典型的“AI教AI”效果上限取决于筛选策略。如果筛选太严样本量太小模型学不到新东西如果筛得太松噪声大量涌入模型被带偏后面几轮会越来越离谱。所以伪标注的置信度阈值和多样性控制是自训练技术中最核心的工程问题。3. 从零搭建一个无监督阅读理解系统的完整实操3.1 环境与数据准备先说明一下这里展示的是一个能跑通的简化流程不代表工业级最终方案但足以让你直观理解“无监督”每一步在做什么。环境方面核心依赖是PyTorch和transformers库。数据方面不需要任何问答标注只需要一批纯文本文档。示例中我用一个本地文本文件作为语料实际项目里可以用爬虫抓取行业文章、产品文档、公开报告等注意版权与合规即可。import torch from transformers import AutoTokenizer, AutoModelForMaskedLM, DataCollatorForLanguageModeling, Trainer, TrainingArguments from datasets import Dataset # 1. 准备无标注语料每行一段文本 with open(corpus.txt, r, encodingutf-8) as f: lines [line.strip() for line in f if len(line.strip()) 20] dataset Dataset.from_dict({text: lines})这里没有“正确答案”但每一段文本都是天然的MLM训练样本。语料规模越大、覆盖面越广后续得到的阅读能力越扎实。3.2 掩码语言模型训练实战加载一个基础编码器模型然后进行领域MLM继续训练。这里选择编码器架构因为它更适合抽取式阅读理解任务。model_name your-pretrained-encoder # 替换为可用的预训练编码器模型 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForMaskedLM.from_pretrained(model_name) def tokenize_function(examples): return tokenizer(examples[text], truncationTrue, paddingmax_length, max_length512) tokenized_dataset dataset.map(tokenize_function, batchedTrue, remove_columns[text]) data_collator DataCollatorForLanguageModeling(tokenizertokenizer, mlm_probability0.15) training_args TrainingArguments( output_dir./mlm_checkpoints, per_device_train_batch_size16, gradient_accumulation_steps4, learning_rate5e-5, num_train_epochs3, save_steps1000, logging_steps100, fp16True, ) trainer Trainer( modelmodel, argstraining_args, train_datasettokenized_dataset, data_collatordata_collator, ) trainer.train()几个参数值得说道说道mlm_probability固定为0.15是经验值不需要频繁调整。如果语料小于10万句建议学习率降到2e-5epochs减少到2防止过拟合到小语料。fp16在支持混合精度的显卡上能明显加快训练、减少显存占用但务必确认操作的稳定性。训练完成后这个模型已经具备了针对当前领域文本的上下文理解能力。下一步我们用它来做无监督的答案定位。3.3 用掩码预测实现无监督答案定位核心思路是把“阅读理解”转化为“掩码预测”。具体做法是将用户问题与文档片段拼接把文档中每个候选答案位置分别掩码掉然后计算模型对掩码位置的预测概率。概率越高说明该片段越可能是用户要找的答案。为了减少计算量先进行粗筛。候选答案通常是文档中的名词短语或命名实体可以用简单的词性规则抽取这里我用一个简化版本演示流程def get_candidate_spans(doc, max_span_len8): # 简化版按标点切分短句再把短句中的连续词窗作为候选 sent doc.split(。) candidates [] for s in sent: words s.split() for i in range(len(words)): for j in range(i1, min(imax_span_len, len(words))1): span .join(words[i:j]) if 2 len(words[i:j]) max_span_len: candidates.append(span) return candidates def score_answer(question, doc, span, model, tokenizer): # 将span替换为[mask]让模型预测span的概率 masked_doc doc.replace(span, tokenizer.mask_token, 1) text question tokenizer.sep_token masked_doc inputs tokenizer(text, return_tensorspt, truncationTrue, max_length512) mask_position (inputs[input_ids] tokenizer.mask_token_id).nonzero()[0, 1].item() with torch.no_grad(): outputs model(**inputs) logits outputs.logits[0, mask_position] span_tokens tokenizer.encode(span, add_special_tokensFalse) score sum([logits[t].item() for t in span_tokens]) / len(span_tokens) return score对所有候选span计算分数后取最高分的span作为预测答案。这套方法听起来有点笨但它是纯无监督的不需要任何训练标注而且实际效果并不差——模型在MLM训练中已经记住了大量常见搭配和语义关联足够识别出“哪个位置填上去最像答案”。如果觉得逐span计算太慢可以把候选span列表按长度聚合一次性构造多个掩码样本送入batch推理速度能提升不少。工程上具体如何做取决于你的实时性要求。4. 踩坑实录无监督阅读理解常见问题与排查技巧4.1 模型“自嗨”学到的特征不具泛化性无监督模型最容易出现的毛病是“看起来损失很低实际问答效果一塌糊涂”。原因通常在于模型只是背下了训练语料中的某些高频模板并没有真正理解语义。比如你问“这篇故事发生在哪个季节”模型总是倾向于预测文档中出现频率最高的名词而不是正确答案。排查技巧单独构造一批测试问题这些问题的答案在文档中出现了但并非高频词。如果模型仍然给出高频词说明MLM训练不足或语料太单一。解决办法是增加语料多样性、提高whole word masking比例并检查是否有数据泄露导致模型记忆了答案。另一个常见问题是学习率过大导致模型在MLM阶段丢失原有预训练知识。如果loss下降过快但下游评估反而变差大概率是灾难性遗忘。此时要降低学习率或者在训练目标中混合一部分通用语料的MLM任务。4.2 伪标注噪声污染如何设置过滤机制自训练路线中伪标注的质量直接决定迭代效果。很多开发者只根据置信度分数过滤但置信度高并不等于正确。例如模型对某个错误答案给出非常自信的预测因为那个位置在语法上很通顺但语义上并不是问题要问的内容。我建议从三个维度共同过滤置信度阈值初步筛选通常取0.7以上。答案位置合理性预测答案不应横跨多个不相关句子不应包含句子开头的虚词。答案可验证性如果候选答案是一个命名实体可以用外部知识库或词表校验如果是普通短语可以要求问题与文档片段的相似度超过某个下限。如果条件允许加一个“多模型投票”机制效果更好同一个问题用两个不同随机种子训练得到的模型分别预测只有二者答案一致时才保留该伪标注样本。4.3 训练不收敛与显存不足的工程化解决无监督MLM训练过程中loss曲线通常表现为“快速下降后缓慢波动”这属于正常现象。但如果loss始终不下降或者反复震荡优先检查数据预处理填充长度是否统一、特殊token是否正确、语料是否有大量乱码。显存不足几乎是必踩的坑。max_length512、batch_size16再加上gradient_accumulation_steps4很容易碰触显存上限。我的习惯是优先降低batch_size到8或4然后增加梯度累积步数尽量保持有效batch size不变这样既缓解显存压力又不影响收敛。如果显存依旧不够可以开启gradient_checkpointing用少量训练时间换取显存空间效果非常明显。还有一个小技巧不要一开始就用512的序列长度。先用128或256做初步训练让模型学会大部分短文本语义再切换到512做收尾训练。这样不仅速度快还能提升长文本理解能力。4.4 评估指标怎么定无监督任务没有标准答案最后聊一个方法论层面的问题无监督阅读理解怎么评估没有人工标注很难算精确的F1和EM。我的实践经验是构建一个小规模的“影子测试集”和“人工抽查池”。影子测试集从公开已有标注的数据集中抽取100到200条样本隐藏掉答案只用来评估最终模型。虽然这些样本没有参与训练但能在一定程度上反映模型的真实阅读能力。人工抽查池随机抽20条模型预测结果让人眼判断“这个答案是否能在原文中找到依据”。不需要精确标注只需要判断“靠谱”和“不靠谱”两个类别。这个工作10分钟就能完成却能避免被单一指标欺骗。这两类评估手段成本都很低但对无监督系统的迭代方向至关重要。否则你根本无法判断调参到底让模型变好了还是变坏了。如果你正准备在标注预算几乎为零的项目里使用阅读理解技术建议先把MLM训练和伪标注流程跑通用影子测试集看一轮效果。不要指望一步到位无监督系统需要几轮迭代才能趋于稳定。但它的长期价值非常大——每一次新语料的注入都不需要人工介入模型自己会持续成长。我个人在实际操作中最大的体会是无监督模式真正解决的并不是“完全不用标注”而是把标注从“前置的大规模工程”变成了“后置的小规模抽检”。这个转变对很多资源有限的团队来说可能才是最终被采纳的决定性因素。数据永远是越攒越多标注成本却不会自己降下来学会让AI自己从文本里吸收知识时间越久优势越明显。
RELATED

相关推荐

拆解 Qwen-Image-Edit-2509-GGUF 架构:Qwen2.5-VL 文本编码器 + 60 层 MMDiT + 16 通道 VAE 如何协同工作

拆解 Qwen-Image-Edit-2509-GGUF 架构:Qwen2.5-VL 文本编码器 + 60 层 MMDiT + 16 通道 VAE 如何协同工作

【免费下载链接】Qwen-Image-Edit-2509-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/Qwen-Image-Edit-2509-GGUF 点击查看 免费下载 Qwen-Image-Edit-2509-GGUF 是通义万相 图像编辑模型 的 GGUF 量化版,支持单图/多图编辑、人脸与商品一…

📅 2026/10/21 5:20:58
C#实战:从零构建股票交易模拟系统,掌握撮合引擎与账户结算

C#实战:从零构建股票交易模拟系统,掌握撮合引擎与账户结算

简介:这是一份面向C#初学者与.NET开发者的股票交易模拟系统源码,适合希望通过完整项目实战掌握桌面应用开发、数据库操作与业务逻辑实现的学习者。系统提供图形化界面与数据库支持,可进行虚拟股票买卖,模拟真实市场环境。压缩包共…

📅 2026/10/21 5:20:58
DEFCON决赛speedrun-001栈溢出漏洞利用复盘:从ROP到ret2libc

DEFCON决赛speedrun-001栈溢出漏洞利用复盘:从ROP到ret2libc

复盘DEFCON CTF Finals 2019的时候,我第一个拿出来重做的是speedrun-001。这个题目在当年的决赛里属于典型的"抢分题",但它的价值恰恰体现在"抢分"这两个字上:保护机制不是全开但足够模拟真实环境,漏洞点明显…

📅 2026/10/21 5:20:58
MORE NEWS

更多资讯

📰

知识工作插件化:构建可编程、可组合的智能工作流底座

1. 项目概述:这不是一个插件,而是一套知识工作者的“操作系统增强层”“knowledge-work-plugins”这个标题乍看像某个开源仓库的命名,但拆开来看——knowledge work(知识工作)、plugins(插件)—…

📰

SQL题目面试避坑指南:从读题拆解到查询优化全链路

写SQL题目刷了几年,也帮不少同学备过面试、带过新人,我最大的感受是:多数人不是不会写SQL,而是根本不知道一道SQL题目到底在考察什么。同一个查询,有人三行搞定,有人磨叽半小时还漏了边界;同一张…

📰

知识工作插件:面向知识工作者的模块化增强协议

1. 项目概述:这不是一个插件,而是一套知识工作者的“操作系统增强层”“knowledge-work-plugins”——光看这个名字,很多人第一反应是“又一个浏览器插件合集”或者“某款笔记软件的扩展包”。但在我过去三年深度参与多个知识管理系统的搭建与…

📰

SchoolDB四表DDL全解析:数据库设计从字段选择到约束实践

最近给团队做内部培训,我又把一套用了很多年的教学示例库脚本翻了出来——SchoolDB。场景很简单:一个学校管理系统,只有4张表:学生、教师、课程、选课。很多人觉得写DDL语句没什么技术含量,敲几行CREATE TABLE谁不会&a…

📰

订单表慢SQL优化实战:联合索引、覆盖索引与深分页方案

1. 场景回顾:慢SQL是怎么暴露出来的做订单系统的同学应该都有体会:订单表往往是整个业务库里面数据量增长最快、查询模式最多样、索引也最容易“被用坏”的一张表。这个实战项目来自某电商平台的中台订单模块,核心表trade_order存放全渠道的订…

📰

Python实战英雄联盟胜率预测:从数据清洗到SHAP模型解释

简介:LeaguePredictor 是一套面向电子竞技数据分析初学者与机器学习实践者的 Python 项目源码,聚焦英雄联盟比赛胜率预测这一具体场景,帮助读者理解如何把分类模型落地到真实赛事数据上。资源包共 24 个文件,以 22 个 py 脚本为主…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬