一文彻底搞懂 bert图解+代码手撕

Transformer 用于学习句子中的长距离依赖关系,同时执行序列到序列的建模。它通过解决可变长度输入、并行化、梯度消失或爆炸、数据规模巨大等问题,比其他模型表现更好。使用的注意力机制是神经架构的一部分,使其能够动态突出显示输入数据的相关特征,仅关注必要的特征/单词。让我们看一个例子:“I poured ...
一文彻底搞懂 bert图解+代码手撕
欢迎关注@机器学习社区 ,专注学术论文、大模型、人工智能、机器学习

Transformer 已迅速成为 NLP 领域的主导架构,超越了CNN、RNN和LSTM等替代神经模型,在自然语言理解和自然语言生成任务的性能方面表现出色。

Transformer 用于学习句子中的长距离依赖关系,同时执行序列到序列的建模。

它通过解决可变长度输入、并行化、梯度消失或爆炸、数据规模巨大等问题,比其他模型表现更好。使用的注意力机制是神经架构的一部分,使其能够动态突出显示输入数据的相关特征,仅关注必要的特征/单词。让我们看一个例子:

“I poured water from the bottle into the cup until it was full.”

这里的“it”指的是杯子

“I poured water from the bottle into the cup until it was empty.”

这里的“it”指的是瓶子

句子中的单一替换改变了对象“it”的引用。对于我或你来说,识别“it”所指的主体/对象是很容易的,但最终的任务是让机器学会这一点。

因此,如果我们翻译这样一个句子或尝试生成文本,机器必须知道单词“it”的指代对象。这可以通过深度学习机制“注意力”来实现。

注意力机制的使用赋予了 Transformer 很高的潜力。Transformer 的一个应用就是 BERT。

BERT 代表双向编码器表示来自Transformer(BERT),用于高效地将高度非结构化的文本数据表示为向量。BERT是一个经过训练的 Transformer 编码器堆栈。

主要有两种模型大小:BERT BASE和BERT LARGE。

上图清楚地显示了BERT BASE和BERT LARGE之间的区别,即编码器的总数量。下图描述了单个编码器的设计。

输入表示可以是单个句子或一对句子。在将输入传递到BERT之前,需要嵌入一些特殊的标记。

[CLS] - 每个序列的第一个标记(指的是传递给BERT的输入标记序列)始终是一个特殊的分类标记。

[SEP] - 句子对被打包成一个序列。我们可以通过这个特殊的标记区分句子。(另一种区分的方法是通过给每个标记添加一个学习嵌入,指示它是否属于句子A或句子B)

给定标记(单词)的输入表示是通过对应的标记、段和位置嵌入求和来构造的。

一旦输入标记准备好,它们就会在层叠中流动。每一层都应用自注意力,将其结果通过前馈网络传递,并将其交给下一个编码器。

在架构方面,它与 Transformer 保持相同。
我们为什么需要 BERT?

当我们已经有词嵌入时,为什么我们还需要 BERT?

一个词在不同的上下文中可能有不同的含义。例如,I encountered a bat when I went to buy a cricket bat.(我去买板球拍时遇到了一只蝙蝠),这里,第一次出现的bat“蝙蝠”,指的是一种哺乳动物,第二次出现的指的是一只球拍。

在这种情况下,bat“蝙蝠”这个词的第一次和第二次出现需要以不同的方式表示,因为它们的含义不同,但是词嵌入将它视为相同的词。

因此,将生成单个词bat“蝙蝠”的表示。这将导致错误的预测。BERT 嵌入将能够通过为同一个词bat“蝙蝠”生成两个不同的向量来区分和捕捉两个不同的语义含义。
使用 BERT 和 Hugging Face 进行情感分析

问题陈述:分析2016年首次共和党总统辩论的推文情感。

Hugging Face 是最受欢迎的自然语言处理社区之一,为深度学习研究人员、实践者和教育工作者提供支持。Transformers 库(以前称为 PyTorch-transformers)为自然语言理解(NLU)和自然语言生成(NLG)提供了广泛的通用架构(BERT、GPT-2、RoBERTa、XLM、DistilBert 等),拥有多种预训练模型。

2.1 下载预训练的 BERT 模型

我们将使用 BERT 基本模型的小写版本。它是在小写的英文文本上训练的。

2.2 分词和输入格式化

下载 BERT 分词器

输入格式化的步骤

输出

解码标记化文本

输出

避免对填充标记索引执行注意力的掩码。 掩码值:未屏蔽的标记为 1,屏蔽的标记为 0。

注意力掩码: [1, 1, 1, 1, 1, 1, 1, 1, 0, 0]

2.3 理解输入和输出

输出

输出

最后一个隐藏状态的形状: torch.Size([1, 10, 768])

CLS 隐藏状态的形状: torch.Size([1, 768])

3.1 加载和读取 Twitter 航空公司数据

输出

(13871, 21)

Output

3.2 文本清洗

定义文本清洗函数

3.3 准备输入和输出数据 准备输出数据

输出

array(['negative', 'neutral', 'positive'], dtype=object) array([1, 2, 1, ..., 1, 0, 1])

准备输入数据

创建注意力掩码

输出:

输出:

4.1 关闭所有参数的梯度

4.2 定义模型架构

输出:

4.3 定义优化器和损失函数

输出:

4.4. 模型训练与评估

训练:Epoch -> Batch -> 前向传播 -> 计算损失 -> 反向传播损失 -> 更新权重

因此,对于每个 epoch,我们有训练和验证阶段。在每个 batch 后,我们需要:

训练阶段

将数据加载到 GPU 上以加速 解包数据输入和标签 清除上一次传递中计算的梯度。 前向传播(将输入数据通过网络) 反向传播(反向传播) 使用 optimizer.step() 更新参数 跟踪变量以监视进度

评估:Epoch -> Batch -> 前向传播 -> 计算损失

评估阶段

4.5 训练模型

4.6 模型评估
结论

BERT在自然语言处理(NLP)领域是一个重要的里程碑,特别是随着谷歌AI语言的出现。它的影响横跨了各种应用,从训练语言模型到命名实体识别。利用transformer中的编码器表示,BERT改变了预训练模型,提高了它们在理解和处理文本数据方面的能力。

机器学习技术,特别是涉及自然语言推理的技术,在BERT和类似模型的整合下取得了显着进步。这些预训练的BERT模型已经成为处理大量训练数据的重要工具,推动了NLP领域所能实现的极限。语言推理方面的最新技术现在严重依赖于编码器机制,这是BERT的核心组成部分。2024-11-07
mengvlog 阅读 11 次 更新于 2025-07-19 08:19:46 我来答关注问题0
檬味博客在线解答立即免费咨询

Python相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部