图解BERT,非常详细收藏这一篇就够了
2018年对于处理文本的机器学习模型(或者更确切地说,对于自然语言处理,简称NLP)而言,是一个关键的转折点。我们对于如何以最佳方式来表征单词和句子,从而精准捕捉其潜在含义与相互关系的概念性认知,正迅速地发展演变。此外,自然语言处理领域不断推出极为强大的组件,你可以免费下载这些组件,并将其运用到自己的模型和处理流程当中(这一现象被称为自然语言处理领域的“ImageNet时刻”,之所以这样说,是借鉴了多年前类似的发展极大地推动了计算机视觉任务中机器学习发展的情况)。

在这一发展进程中,最近的一个里程碑事件是BERT的发布,这一事件被视为标志着自然语言处理新时代的开端。BERT是一个在处理基于语言的任务方面表现卓越、打破了多项纪录的模型。在描述该模型的论文发表后不久,其团队还将模型的代码开源,并提供了已在大规模数据集上预训练好的模型版本供人们下载。这是一项重大的进展,因为这使得任何构建涉及语言处理的机器学习模型的人,都能够将这个强大的模型作为现成的组件来使用,从而节省了原本需要从零开始训练一个语言处理模型所耗费的时间、精力、专业知识和资源。

BERT建立在近期自然语言处理领域中涌现出的诸多巧妙理念之上——其中包括但不限于Semi-supervised Sequence Learning 、ELMo、ULMFiT 、OpenAI transformer,以及最初的he Transformer。
Semi-supervised Sequence Learning: https://arxiv.org/abs/1511.01432ELMo: https://arxiv.org/abs/1802.05365ULMFiT:https://arxiv.org/abs/1801.06146OpenAI transformer:https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdfthe Transformer:https://arxiv.org/pdf/1706.03762.pdf
要想真正理解BERT是什么,人们需要了解一些相关概念。所以,在探讨BERT模型本身所涉及的概念之前,我们先来看看使用BERT的一些方式。
示例:句子分类
使用BERT最直接的方式是用它来对单个文本进行分类。这样的模型大概是下面这样:

要训练这样一个模型,你主要需要训练分类器,在训练阶段对BERT模型本身只需做极少的改动。这个训练过程被称为微调,它的概念源于半监督序列学习和通用语言模型微调(ULMFiT)。
对于不熟悉这个领域的人来说,既然我们在讨论分类器,那么我们就处于机器学习的监督学习范畴。这意味着我们需要一个带标签的数据集来训练这样的模型。以这个垃圾邮件分类器为例,带标签的数据集会是一个包含电子邮件信息的列表,并且每个信息都有一个标签(“垃圾邮件”或者“非垃圾邮件”)。

这种应用场景的其他例子还包括:
情感分析
输入:电影或产品评论。输出:该评论是正面的还是负面的?
示例数据集:斯坦福情感树库(SST)
事实核查
输入:句子。输出:“陈述”或“非陈述”
更具野心或更具前瞻性的例子:
输入:陈述性句子。输出:“真”或“假”
“完全事实”(Full Fact)是一个致力于开发自动事实核查工具以服务公众的机构。他们的工作流程中有一部分是使用一个分类器,该分类器读取新闻文章并检测其中的陈述内容(将文本分类为“陈述”或“非陈述”),这些内容随后可以进行事实核查(目前是由人工进行,希望以后能通过机器学习来完成)。
视频:用于自动事实核查的句子嵌入——列夫·康斯坦丁诺夫斯基(Lev Konstantinovskiy)
模型架构
既然你已经在脑海中有了一个关于BERT如何被使用的示例应用场景,那我们就来更深入地看看它是如何工作的。

这篇论文提出了BERT的两种模型规模:
-
BERT基础版(BERT BASE)—— 其规模与OpenAI的Transformer相当,以便于比较性能。
-
BERT大型版(BERT LARGE)—— 一个极其庞大的模型,取得了论文中所报道的当前最优结果。
BERT本质上是一个经过训练的Transformer编码器堆栈。现在正是引导你去阅读我之前的文章《图解Transformer》的好时机,这篇文章解释了Transformer模型——这是BERT的一个基础概念,也是我们接下来要讨论的概念基础。

两种规模的BERT模型都有大量的编码器层(论文中称之为Transformer模块)——基础版有12层,大型版有24层。与最初那篇关于Transformer的论文中参考实现的默认配置(6层编码器、512个隐藏单元和8个注意力头)相比,它们还拥有更大的前馈神经网络(分别有768个和1024个隐藏单元),以及更多的注意力头(分别有12个和16个)。
模型输入

出于稍后会解释清楚的原因,第一个输入标记会附带一个特殊的 [CLS] 标记。这里的 CLS 代表 “分类”(Classification)。
就像 Transformer 的普通编码器一样,BERT 接收一个单词序列作为输入,这些单词会在堆叠的层中不断向上传递。每一层都应用自注意力机制,然后将结果通过一个前馈神经网络,再传递给下一个编码器。

在架构方面,到目前为止,除了大小(这只是我们可以设置的配置参数)之外,它与 Transformer 是完全相同的。而在输出端,我们才开始看到两者的不同之处。
模型输出
每个位置都会输出一个大小为隐藏层维度(在 BERT 基础版本中为 768)的向量。对于我们上面提到的句子分类示例,我们只关注第一个位置的输出(也就是我们传入特殊 [CLS] 标记的那个位置)。

现在,这个向量可以用作我们选择的分类器的输入。论文中通过仅使用一个单层神经网络作为分类器,就取得了很好的效果。

如果你有更多的标签(例如,如果你是一个电子邮件服务提供商,要将电子邮件标记为“垃圾邮件”“非垃圾邮件”“社交类”和“促销类”),你只需调整分类器网络,使其拥有更多的输出神经元,然后让这些神经元的输出经过 softmax 函数处理。
与卷积神经网络的相似之处
对于那些有计算机视觉背景的人来说,这种向量传递的方式应该会让人联想到像 VGGNet 这样的网络中,卷积部分和网络末端的全连接分类部分之间所发生的情况。

词嵌入的新时代
这些新的发展带来了单词编码方式的新转变。到目前为止,词嵌入在主流的自然语言处理(NLP)模型处理语言的方式中一直是一股重要力量。像 Word2Vec 和 GloVe 这样的方法已被广泛用于此类任务。在指出现在发生了哪些变化之前,让我们先回顾一下这些方法是如何使用的。
词嵌入回顾
为了让机器学习模型能够处理单词,它们需要某种形式的数值表示,以便模型在计算中使用。Word2Vec 表明,我们可以使用一个向量(一组数字)来恰当地表示单词,这种方式能够捕捉语义或与意义相关的关系(例如,能够判断单词是相似的、相反的,或者像 “斯德哥尔摩” 和 “瑞典” 这一对单词之间的关系,与 “开罗” 和 “埃及” 之间的关系是相同的),以及句法或基于语法的关系(例如,“had” 和 “has” 之间的关系与 “was” 和 “is” 之间的关系是一样的)。
该领域很快意识到,使用在大量文本数据上预训练的词嵌入是个很棒的主意,而不是在通常规模较小的数据集上与模型一起训练词嵌入。因此,现在可以下载通过 Word2Vec 或 GloVe 预训练生成的单词列表及其词嵌入。这是单词 “stick” 的 GloVe 词嵌入示例(嵌入向量大小为 200)。

注:单词 “stick” 的 GloVe 词嵌入——一个由 200 个浮点数组成的向量(四舍五入到小数点后两位)。它包含两百个数值。
由于这些向量数值众多且数量很大,在我帖子里的图表中,我会使用下面这种基本的图形来表示向量:

ELMo:上下文很重要
如果我们使用这种 GloVe 表示方法,那么无论上下文是什么,单词 “stick” 都会由这个向量来表示。许多自然语言处理研究人员表示:“等一下”,“stick” 根据其使用的语境会有多种含义。为什么不根据它使用的上下文来为它生成一个词嵌入呢?这样既能捕捉该上下文中单词的含义,又能捕捉其他上下文信息。” 于是,语境化词嵌入就诞生了。
https://arxiv.org/abs/1705.00108https://arxiv.org/abs/1708.00107https://arxiv.org/pdf/1802.05365.pdf

图注:语境化词嵌入能够根据单词在句子语境中所承载的含义,为它们赋予不同的词嵌入表示。
ELMo 不是为每个单词使用固定的词嵌入,而是在为句子中的每个单词分配词嵌入之前,先考量整个句子。它使用了在特定任务上训练的双向长短期记忆网络(bi-directional LSTM),从而能够生成这些词嵌入。

ELMo 在自然语言处理(NLP)的预训练方面迈出了重要的一步。ELMo 的长短期记忆网络(LSTM)会在与我们数据集语言相同的大规模数据集上进行训练,然后我们可以将其用作其他需要处理语言的模型中的一个组件。
ELMo 的秘诀是什么呢?
ELMo 通过被训练来预测单词序列中的下一个单词这一任务(称为语言建模)获得了它的语言理解能力。这很方便,因为我们有大量的文本数据,这样的模型可以从中学习而无需标签。

图注:ELMo 预训练过程中的一个步骤:将 “Let’s stick to” 作为输入,预测下一个最有可能出现的单词——这是一个语言建模任务。当在一个大型数据集上进行训练时,该模型开始掌握语言模式。在这个例子中,它不太可能准确猜出下一个单词。更现实的情况是,在像 “hang” 这样的单词之后,它会给 “out”(组成 “hang out” 这个短语)这样的单词分配比 “camera” 更高的出现概率。
我们可以看到,每个展开的长短期记忆网络(LSTM)步骤的隐藏状态从 ELMo 的 “背后” 显现出来。在完成这种预训练后的词嵌入过程中,这些隐藏状态会派上用场。
实际上,ELMo 更进一步,训练了一个双向长短期记忆网络(bi-directional LSTM)—— 这样一来,它的语言模型不仅能感知到下一个单词,还能感知到前面的单词。

ELMo 通过以特定方式(先拼接,然后进行加权求和)将隐藏状态(以及初始词嵌入)组合在一起来生成语境化的词嵌入。

ULM-FiT:确定自然语言处理中的迁移学习
ULM-FiT 引入了一些方法,能够有效地利用模型在预训练过程中学习到的大量知识 —— 不仅仅是词嵌入,也不仅仅是语境化的词嵌入。ULM-FiT 引入了一种语言模型,以及一种可以针对各种任务对该语言模型进行有效微调的流程。
自然语言处理领域终于有了一种能够像计算机视觉领域那样出色地进行迁移学习的方法。
Transformer:超越长短期记忆网络(LSTM)
Transformer 相关论文和代码的发布,以及它在机器翻译等任务上取得的成果,开始让该领域的一些人认为它可以取代 LSTM。而 Transformer 比 LSTM 能更好地处理长期依赖关系这一事实,更是强化了这种观点。
Transformer 的编码器-解码器结构使其非常适合机器翻译任务。但要如何将它用于句子分类呢?又要如何用它来预训练一个可以针对其他任务(该领域将那些利用预训练模型或组件的监督学习任务称为下游任务)进行微调的语言模型呢?
OpenAI Transformer
为语言建模预训练一个 Transformer 解码器
事实证明,对于自然语言处理任务而言,我们并不需要完整的 Transformer 来采用迁移学习以及构建一个可微调的语言模型。我们仅使用 Transformer 的解码器就可以做到。选择解码器是个不错的方案,因为对于语言建模(预测下一个单词)来说,它是一个自然而然的选择,因为它在设计上会屏蔽未来的标记 —— 当它逐词生成翻译时,这是一个很有价值的特性。

该模型堆叠了十二个解码器层。由于在这种设置中没有编码器,这些解码器层就不会有普通 Transformer 解码器层所具有的编码器-解码器注意力子层。不过,它仍然会有自注意力层(并且是掩码自注意力层,这样它就不会提前看到未来的标记)。
有了这种结构,我们就可以在同样的语言建模任务上训练该模型:利用大规模(无标注的)数据集来预测下一个单词。只需向它输入 7000 本书的文本内容,让它去学习就好了!对于这类任务来说,书籍是非常好的训练材料,因为这能让模型学会将相关信息联系起来,即使这些信息在文本中相隔较远 —— 而这是例如在使用推文或文章进行训练时所无法实现的。

迁移学习到下游任务
既然 OpenAI 的 Transformer 模型已经完成了预训练,并且其各层也已调整到能够合理地处理语言的状态,我们就可以开始将它用于下游任务了。我们先来看看句子分类任务(比如将一封电子邮件分类为 “垃圾邮件” 或 “非垃圾邮件”):

OpenAI 的论文概述了一些输入转换方法,用于处理不同类型任务的输入。论文中的下图展示了模型的结构以及为执行不同任务而进行的输入转换情况。

BERT:从解码器到编码器
OpenAI 的 Transformer 为我们提供了一个基于 Transformer 的可微调预训练模型。但在从长短期记忆网络(LSTM)向 Transformer 转变的过程中,缺失了一些东西。ELMo 的语言模型是双向的,然而 OpenAI 的 Transformer 只训练了一个单向的语言模型。我们能否构建一个基于 Transformer 的模型,其语言模型既能向前看又能向后看(用专业术语来说,就是 “以左右上下文为条件”)呢?
“看我的”,略显大胆的 BERT 如是说。
掩码语言模型
“我们将使用 Transformer 编码器。” BERT 说道。
“这太疯狂了。” 厄尼回应道,“谁都知道双向条件会让每个单词在多层上下文中间接地看到自身。”
“我们会使用掩码。” BERT 自信地说道。

找到合适的任务来训练由多个编码器组成的 Transformer 堆叠结构是一个复杂的障碍,而 BERT 通过采用早期文献中 “掩码语言模型” 的概念(在文献中它被称为完形填空任务)解决了这个问题。
除了对 15% 的输入进行掩码处理之外,BERT 还做了一些调整,以便在后续对模型进行微调时提升效果。有时候,它会随机地用另一个单词替换某个单词,然后让模型预测该位置上的正确单词。
双句子任务
如果你回顾一下 OpenAI 的 Transformer 为处理不同任务所进行的输入转换,就会注意到有些任务要求模型对两个句子给出合理的判断(例如,它们是否只是彼此的改述版本?将一篇维基百科条目作为输入,再将关于该条目的一个问题作为另一个输入,我们能否回答这个问题?)。
为了让 BERT 能更好地处理多个句子之间的关系,预训练过程中加入了一项额外的任务:给定两个句子(A 和 B),B 是否很可能是跟在 A 后面的句子呢?

图注:BERT 预训练的第二个任务是一个双句子分类任务。在这张图中,分词的展示过于简化了,因为实际上 BERT 使用的是词片(WordPieces)作为标记,而不是单词——所以有些单词会被拆分成更小的片段。
特定任务模型
BERT 的相关论文展示了多种将 BERT 用于不同任务的方法。

用于特征提取的 BERT
微调方法并非使用 BERT 的唯一方式。就像 ELMo 一样,你可以使用经过预训练的 BERT 来创建语境化的词嵌入。然后,你可以将这些词嵌入输入到你现有的模型中 —— 相关论文表明,在诸如命名实体识别这样的任务中,通过这种方式得到的结果与对 BERT 进行微调后得到的结果相差不大。

哪一个向量最适合作为语境化的词嵌入呢?我认为这取决于具体的任务。相关论文研究了六种选择(与之对比的是,经过微调的模型获得了 96.4 的分数):

体验一下 BERT
试用 BERT 的最佳方式是通过托管在 Google Colab 上的 “使用 Cloud TPU 对 BERT 进行微调” 的笔记本。如果你以前从未使用过 Cloud TPU,这也是一个很好的尝试起点,因为 BERT 代码既可以在 TPU 上运行,也能在 CPU 和 GPU 上运行。
接下来的步骤是查看 BERT 代码仓库中的代码:
-
模型是在 modeling.py 文件中的 BertModel 类里构建的,并且它与普通的 Transformer 编码器几乎相同。
-
run_classifier.py 是微调过程的一个示例。它还为监督模型构建了分类层。如果你想构建自己的分类器,可以查看该文件中的 create_model() 方法。
有几个预训练模型可供下载。这些模型涵盖了 BERT 基础版和 BERT 大型版,以及英语、中文等语言的模型,还有一个在维基百科上训练的涵盖 102 种语言的多语言模型。
BERT 并不将单词视为标记。相反,它处理的是词片(WordPieces)。tokenization.py 是一个分词器,它会将你的单词转换为适合 BERT 的词片。
你也可以查看 BERT 的 PyTorch 实现版本。AllenNLP 库使用这个实现版本,以便在任何模型中使用 BERT 的词嵌入。
一、大模型风口已至:月薪30K+的AI岗正在批量诞生

2025年大模型应用呈现爆发式增长,根据工信部最新数据:
国内大模型相关岗位缺口达47万
初级工程师平均薪资28K
70%企业存在"能用模型不会调优"的痛点
真实案例:某二本机械专业学员,通过4个月系统学习,成功拿到某AI医疗公司大模型优化岗offer,薪资直接翻3倍!

二、如何学习大模型 AI ?
🔥AI取代的不是人类,而是不会用AI的人!麦肯锡最新报告显示:掌握AI工具的从业者生产效率提升47%,薪资溢价达34%!🚀
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
1️⃣ 提示词工程:把ChatGPT从玩具变成生产工具
2️⃣ RAG系统:让大模型精准输出行业知识
3️⃣ 智能体开发:用AutoGPT打造24小时数字员工
📦熬了三个大夜整理的《AI进化工具包》送你:
✔️ 大厂内部LLM落地手册(含58个真实案例)
✔️ 提示词设计模板库(覆盖12大应用场景)
✔️ 私藏学习路径图(0基础到项目实战仅需90天)





第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
* 大模型 AI 能干什么?
* 大模型是怎样获得「智能」的?
* 用好 AI 的核心心法
* 大模型应用业务架构
* 大模型应用技术架构
* 代码示例:向 GPT-3.5 灌入新知识
* 提示工程的意义和核心思想
* Prompt 典型构成
* 指令调优方法论
* 思维链和思维树
* Prompt 攻击和防范
* …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
* 为什么要做 RAG
* 搭建一个简单的 ChatPDF
* 检索的基础概念
* 什么是向量表示(Embeddings)
* 向量数据库与向量检索
* 基于向量检索的 RAG
* 搭建 RAG 系统的扩展知识
* 混合检索与 RAG-Fusion 简介
* 向量模型本地部署
* …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
* 为什么要做 RAG
* 什么是模型
* 什么是模型训练
* 求解器 & 损失函数简介
* 小实验2:手写一个简单的神经网络并训练它
* 什么是训练/预训练/微调/轻量化微调
* Transformer结构简介
* 轻量化微调
* 实验数据集的构建
* …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
* 硬件选型
* 带你了解全球大模型
* 使用国产大模型服务
* 搭建 OpenAI 代理
* 热身:基于阿里云 PAI 部署 Stable Diffusion
* 在本地计算机运行大模型
* 大模型的私有化部署
* 基于 vLLM 部署大模型
* 案例:如何优雅地在阿里云私有部署开源大模型
* 部署一套开源 LLM 项目
* 内容安全
* 互联网信息服务算法备案
* …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

更多推荐
所有评论(0)