2026/2/14 4:09:07
网站建设
项目流程
深圳做网站价比高的公司性,wordpress博客怎么写,网站开放培训,廊坊哪里做网站好1#xff09;是什么
BERT Bidirectional Encoder Representations from Transformers
中文翻译#xff1a;双向编码器表示#xff0c;来自Transformer。
它是一个由 Google 在 2018 年提出的预训练语言模型#xff0c;是 NLP 领域的“里程碑”式作品。你可以把它想象成一个…1是什么BERT Bidirectional Encoder Representations from Transformers中文翻译双向编码器表示来自Transformer。它是一个由 Google 在 2018 年提出的预训练语言模型是 NLP 领域的“里程碑”式作品。你可以把它想象成一个“语言通才”——它先在海量文本上自学了语言规律然后可以被“调教”去干各种任务比如问答、情感分析、命名实体识别等等。 核心特点双向理解它能同时看一个词左边和右边的上下文。基于 Transformer 架构尤其是编码器部分。使用掩码语言建模MLM 和 下一句预测NSP两种预训练任务。 比喻一下BERT 就像一个刚进学校的孩子老师没教具体知识但让他反复玩两个游戏1.“你看到一句话其中某些字被遮住了猜一猜是什么”MLM2.“这两句话是不是连续的”NSP通过这两个游戏孩子学会了语言的“语感”。之后只要告诉他“现在你要做阅读理解”他就能立刻上手。2为什么在 BERT 出现之前主流方法是RNN / LSTM 或 Word2Vec等它们有两大硬伤❌ 单向性只能从左到右或从右到左读句子无法同时利用两边信息。❌ 无法捕捉长距离依赖就像听一段话时前面说了啥后面忘了。而 BERT 的突破在于✅双向上下文理解比如“苹果”这个词在“我吃了苹果”中是水果在“苹果公司发布了新手机”中是公司。BERT 能根据前后文判断出正确含义。✅预训练 微调先在大量无标注文本上学习通用语言知识再在特定任务上微调大大降低了对标注数据的依赖。 举个例子以前模型看到“银行”只知道它是“金融机构”但如果上下文是“我在河边钓鱼”BERT 能意识到这里的“银行”可能是“河岸”。这就是“上下文感知”的力量3什么时候用BERT 是“瑞士军刀”级别的工具适合以下情况需要深度语义理解的任务文本分类如情感分析命名实体识别NER问答系统如 SQuAD 数据集机器翻译作为编码器文本相似度计算比如推荐系统标注数据少但有大量无标注文本可以先用 BERT 预训练再微调效果远超传统模型。追求高精度的 NLP 项目比如客服机器人、智能搜索、法律文书分析等。 小贴士如果你要做一个“理解人类说话意图”的系统BERT 是非常好的起点。4什么时候不用虽然强大但 BERT 并不是万能药。这些时候你应该考虑其他方案资源有限时BERT 模型大Base 版就有 1.1 亿参数推理慢显存占用高。如果你在手机端或嵌入式设备部署可能要用更轻量的模型比如 DistilBERT、ALBERT 或 TinyBERT。实时性要求极高BERT 推理速度慢不适合毫秒级响应的场景比如实时语音助手。任务简单不需要复杂语义理解比如简单的关键词匹配、规则引擎用 BERT 大材小用还浪费算力。多语言支持不足早期版本原始 BERT 主要是英文虽然有 mBERT多语言 BERT但在低资源语言上表现仍不如专门优化的模型如 XLM-RoBERTa。⚠️ 总结BERT 是“大力出奇迹”的代表但不是所有问题都需要“核弹级”解决方案。5总结1.BERT 是一个双向、基于 Transformer 的预训练语言模型能深刻理解上下文。2.它通过“掩码预测”和“下一句判断”学会语言再微调完成具体任务实现“一次学习处处可用”。3.它强大但不万能适合高精度语义任务但需权衡计算成本和实际需求。 评价“别迷信 BERT但别忽视它。它不是终点而是通往更好模型的跳板。”概念Bert和GPT的一个简单对比图中表示的是Bert相比于GPT它是一个双向的RNN结构。Bert通过双向自注意力机制在建模每个 token 表示时同时整合左右两个方向的上下文信息从而获得更准确、更丰富的语义表示。1. 概述Bert是典型的基于标准的编码器构建的预训练模型。它提供了两种模型规模分别是BERT-base和BERT-large。BERT 的设计更侧重于自然语言理解类任务广泛应用于文本分类、序列标注、句子匹配等场景。模型发布后在多个语言理解基准测试中取得了前所未有的领先成绩推动 NLP 研究全面转向“预训练 微调”的通用建模范式。模型版本参数量推理速度CPU显存占用FP16适用场景BERT-base1.1亿50 ms/句400 MB中小项目、API服务、移动端蒸馏目标BERT-large3.4亿120 ms/句1.2 GB高精度任务如法律文书分析、医学问答 案例阿里客服机器人初期用 BERT-base响应快法院智能判案系统用 BERT-large因为“一字之差可能影响判决”。⚠️ 注意BERT-large 并非总是更好在小数据集上容易过拟合。2. 结构2.1 输入层BERT 的每个输入 token 表示由三部分嵌入相加组成Token Embedding词本身的语义表示Position Embedding表示 token 在序列中的位置为可学习向量Segment Embedding用于区分句子对任务中的两个句子分别用一个可学习的向量表示。特殊tokenCLS句首标志其输出向量常用于下游的文本分类任务SEP句间分隔符出现在每个句子末尾实战建议Token用途注意事项[CLS]序列级任务的“代表”- 微调时接一个全连接层做分类- 不要用于生成任务BERT 不是生成模型[SEP]分隔句子- 单句任务也需加 [SEP] 在末尾符合预训练格式- 多句任务可多个 [SEP]但原始 BERT 只支持两段 案例句子对任务如问答匹配输入[CLS] 谁是美国总统 [SEP] 奥巴马曾担任美国总统。 [SEP]Token Embedding→ “美国” 和 “总统” 各自有语义向量来自 WordPiece 词表Position Embedding→ 即使“总统”出现在两个位置问句 vs 答句模型知道它们是不同的“角色”Segment Embedding→ 所有问句 token 标为 A答句 token 标为 B让模型区分“谁问谁答” 为什么重要如果没有 Segment Embedding模型会把 [CLS] A [SEP] B [SEP] 当成一个长句子无法理解“这是两个独立句子”。 生动比喻就像开会时主持人[CLS]、发言人1A段、发言人2B段——即使说同样的话身份不同意义不同2.2 编码器层编码器层基本与同原始的Transfomer相同之前的架构图如下 但关键差异如下特性BERT原始 TransformerEncoder注意力方向双向Bi-directional双向编码器本来就是双向训练目标MLM NSP无原始用于机器翻译位置编码可学习Learned正弦/余弦Sinusoidal 为什么用可学习的位置编码Google 发现让模型自己学“位置怎么表示”比硬编码公式更灵活尤其对中文等语言效果更好。2.3 输出层根据下游任务的类型BERT 可以接入不同的任务输出头Token-Level 任务如命名实体识别使用每个位置的输出表示Sequence-Level 任务如文本分类、句子对分类使用特殊 token [CLS] 的输出表示输入时被加在序列开头专门用于汇总整个序列的语义信息。BERT 是“主干网络”不同任务接不同“头部”任务类型输出头结构案例文本分类Linear(768 → num_classes)情感分析、新闻分类句子对匹配Linear(768 → 2)判断两句话是否矛盾NLI命名实体识别NERLinear(768 → num_tags)识别“张三”是人名“北京”是地名问答SQuAD两个 Linear 层start_logits end_logits找出答案在原文中的起止位置 SQuAD 问答案例Question: 谁发明了电话 Context: 亚历山大·贝尔发明了电话。 → 模型输出 start0, end1 → 亚历山大·贝尔 BERT 不生成新词而是从原文中抽取片段——这就是为什么它适合“理解”不适合“创作”。3. 预训练Bert的预训练阶段包含了两个核心的任务掩码语言模型MLM和下一句预测NSP前者用于学习词语级语义后者用于学习句子间逻辑关系3.1 掩码语言模型Masked Language Model, MLM 定义随机遮蔽输入中的一些 token让模型根据上下文预测被遮蔽的词。✅ 目标学习词级语义和上下文依赖关系 案例中文 MLM假设原始句子是“我喜欢吃苹果。”BERT 会随机遮蔽一个词比如把“苹果”换成 [MASK]“我喜欢吃[MASK]。”然后模型要预测这个位置应该填什么词。 正确答案苹果 可能干扰项香蕉、西瓜、蛋糕 模型怎么学看左边“我 喜欢 吃” → 表示食物看右边“。” → 句子结束综合判断最可能是水果类名词。 为什么用 MLM 而不是传统语言模型方法方向性缺点传统 LM如 LSTM单向左→右无法利用后文信息BERT 的 MLM双向前后都看能同时利用上下文✅关键突破BERT 是第一个真正实现 双向上下文建模 的预训练模型 比喻一下就像考试时老师给你一段话但中间几个字被涂黑了你要根据前后的意思猜出来。这比只看前面猜单向更准确⚠️ 注意事项1.不是所有词都遮蔽BERT 默认只遮蔽 15% 的 token其中80% 用 [MASK] 替换10% 用随机词替换10% 保持不变 目的防止模型“作弊”比如总是记住了“[MASK]”就是原词增强鲁棒性。2.遮蔽的是 token不是字符中文通常是按字character遮蔽英文可能是 subword如 play → pl, ay示例“I love playing football” → [MASK] love pl ay ing football3.不能直接用于生成任务因为它不支持自回归生成没法一步步生成新词所以 GPT 才用因果语言模型Causal LM3.2 下一句预测 定义给定两个句子 A 和 B判断 B 是否是 A 的下一句。✅ 目标学习句子间的逻辑关系是否连贯 案例NSP 正例 vs 反例✅ 正例IsNextTrueA: “昨天下雨了。” B: “地面变得湿滑。” → 关系因果 → 应该预测为 True❌ 反例IsNextFalseA: “昨天下雨了。” B: “苹果公司发布了新手机。” → 关系无关 → 应该预测为 False模型怎么学学习句子之间的主题一致性、逻辑连贯性例如如果 A 是关于天气B 是关于科技就不太可能是连续句。 为什么需要 NSP在 BERT 出现之前大多数模型只能理解单个句子内部的关系比如“银行”是“金融机构”还是“河岸”“苹果”是水果还是公司但很多任务需要跨句理解比如问答系统问题在第一句答案在第二句自然语言推理前提和假设是否一致文档摘要哪些句子是核心内容所以 BERT 加入 NSP就是为了教会模型“这两个句子是不是‘一家人’”⚠️ 注意事项1.NSP 任务效果有限后续研究发现NSP 主要是让模型学会“判断两个句子是否来自同一文档”而不是真正的“逻辑关系”例如两个句子都在讲“体育”即使不连贯也可能被判为“是下一句”2.RoBERTa 去掉了 NSP实验表明去掉 NSP只用 MLM性能反而更好因为 MLM 已经足够强大NSP 可能引入噪声3.NSP 不适合多段文本原始 BERT 只支持两句话AB如果你想处理长文档需要用其他方法如 Longformer、Document-BERT3.3 两种预训练小结任务输入格式输出目标学习内容代表模型MLM[CLS] 我 喜欢 吃 [MASK] 。 [SEP]预测被遮蔽词词级语义、上下文依赖BERT, RoBERTaNSP[CLS] A [SEP] B [SEP]判断 B 是否是 A 的下一句句子间逻辑关系BERT早期4. 微调Bert主要的微调任务分为以下4种4.1 句子对分类任务输入格式[CLS] 句子1 [SEP] 句子2 [SEP] 定义判断两个句子之间的关系如是否矛盾、蕴含、相似等。 典型场景自然语言推理NLI判断前提与假设的关系语义相似度判断两句话是不是在说同一件事问答匹配问题和答案是否相关 案例中文 NLI自然语言推理前提今天下雨了。 假设地面湿了。 → 关系蕴含entailment✅ 输入格式[CLS] 今天下雨了。 [SEP] 地面湿了。 [SEP] 为什么用 [SEP] 分隔让模型知道这是两个独立句子Segment Embedding 能区分 A 和 B 段预训练时 NSP 任务就是这么做的 → 保持一致性。⚠️ 注意事项不要直接拼接成“今天下雨了地面湿了” → 会丢失“句子对”的结构信息若使用 Hugging Face 的 AutoModelForSequenceClassification它自动提取 [CLS] 输出做分类。4.2 单句分类任务输入格式[CLS] 句子 [SEP] 定义对单个句子进行分类如情感分析、主题分类等。 案例电商评论情感分析输入这款手机续航真差 输出负面情绪negative✅ 输入格式[CLS] 这款手机续航真差 [SEP] 为什么加 [SEP]虽然只有一个句子但 BERT 预训练时所有输入都以 [SEP] 结尾保证编码器输入结构统一避免位置编码混乱。⚠️ 注意事项如果你不加 [SEP]可能会导致 tokenization 错误或 embedding 失准使用 AutoModelForSequenceClassification它会自动处理 [CLS] 的输出。4.3 问答任务输入格式[CLS] 问题 [SEP] 段落 [SEP] 定义根据问题和上下文段落找出答案在段落中的起止位置。 案例SQuAD 风格问答问题谁发明了电话 段落亚历山大·贝尔于1876年发明了电话。 → 答案“亚历山大·贝尔”✅ 输入格式[CLS] 谁发明了电话 [SEP] 亚历山大·贝尔于1876年发明了电话。 [SEP] 为什么这样设计问题和段落分开让模型理解“问什么”、“在哪找”BERT 在预训练阶段就学过“掩码语言建模”MLM擅长定位词输出是两个向量start_logits 和 end_logits分别预测答案的开始和结束位置。⚠️ 注意事项不能只给问题或只给段落答案必须是原文连续片段BERT 是抽取式问答不是生成式建议使用 AutoModelForQuestionAnswering它自带 start/end head。4.4 序列标注任务输入格式[CLS] 句子 [SEP] 定义为每个 token 分配一个标签如命名实体识别NER、分词、词性标注等。 案例中文命名实体识别NER输入张三在北京工作。 标签[B-PER, I-PER, B-LOC, I-LOC, O]✅ 输入格式[CLS] 张 三 在 北 京 工 作 。 [SEP] 为什么用这个格式每个字对应一个隐藏状态hidden state模型输出每个 token 的分类结果不依赖 [CLS]而是用整个序列的输出。⚠️ 注意事项必须使用 AutoModelForTokenClassification标签体系需提前定义如 BIO 格式中文通常按字级标注英文可按词级word-level。4.5 四种任务小结任务输入格式输出目标典型数据集推荐模型类句子对分类[CLS] A [SEP] B [SEP]类别如 entailmentMNLI, LCQMCAutoModelForSequenceClassification单句分类[CLS] 文本 [SEP]类别如 positiveIMDB, THUCNewsAutoModelForSequenceClassification问答[CLS] Q [SEP] C [SEP]起始/结束位置SQuAD, CMRC2018AutoModelForQuestionAnswering序列标注[CLS] 文本 [SEP]每个 token 的标签CoNLL-2003, MSRA-NERAutoModelForTokenClassificationBert的局限性问题说明改进方案不是生成模型无法像 GPT 那样写文章用 BART、T5 等 encoder-decoder 架构NSP 任务效果存疑RoBERTa 证明去掉 NSP 反而更好用 RoBERTa 或 ALBERT静态分词WordPiece 对 OOV 词处理弱用 SentencePiece如 XLNet或字符级模型 BERT 下游任务速查任务输入格式用哪个输出典型数据集文本分类[CLS] text [SEP][CLS] 向量IMDb, THUCNews句子对分类[CLS] A [SEP] B [SEP][CLS] 向量MNLI, LCQMC中文NER[CLS] w1 w2 … wn [SEP]每个 wi 的 hidden stateCoNLL-2003, MSRA-NER问答[CLS] Q [SEP] C [SEP]每个 token 的 start/end scoreSQuAD, CMRC2018中文