【NLP】第 3 章 :BERT

2023-11-02

在本章中,您将学习由 Google 开发的 Transformer 架构的实现之一,称为 BERT。

Google AI Language 的研究人员最近所做的工作导致发表了一篇名为“BERT(来自变形金刚的双向编码器表示)”的论文。

BERT取得的最重要的技术进步是将流行的注意力模型Transformer的双向训练 应用于语言建模。根据语言模型的研究结果,与仅在一个方向上训练的模型相比,同时在两个方向上训练的语言模型能够更好地了解语言的流动和上下文。研究人员在出版物中描述了一种他们称之为掩码语言建模 (MLM) 的独特训练方法。 这种方法可以实现模型的双向训练,这在以前是很难做到的。

BERT 还允许我们进行迁移学习 ,这使得预训练的 BERT 模型可以用于各种自然语言应用。

根据模型架构的规模,BERT 有两种不同的预训练版本,分别如下。

BERT-Base 总共有1.1亿个参数,12个注意力头,768个隐藏节点,12层。

BERT-Large 的特点是有 24 层、1024 个隐藏节点、16 个注意力头和 3.4 亿个参数值。

BERT的工作原理

BERT 基于transformer 架构 ,它在内部使用第2章中讨论的注意力机制。BERT 的美妙之处在于理解句子中的上下文并表示单词,同时考虑上下文。这意味着像bank这样的词在金融语境中使用时与在河岸中使用同一个词bank时具有不同的表示。BERT只使用了transformer架构的encoder机制,主要用于创建更好的word representation,然后可以用于更多的下游应用。第2章介绍了变压器的详细工作原理。

Transformer 编码器的输入是一个单词句子,BERT 的架构使其可以双向读取以捕获单词中的上下文,这意味着单词既出现在焦点单词之前,也出现在句子的后面。这克服了发生在LSTM 类型架构 中的顺序读取(虽然双向 LSTM 是可能的,但它们很复杂并且仍然具有顺序处理)。

在训练语言模型 的过程中,必须克服的挑战之一是确定预测目标。大量模型提供关于序列中后续词的预测(例如,“太阳正在下沉 ___”),这是一种定向方法,从本质上限制了上下文学习。BERT 采用两种不同的训练策略来克服这一障碍。

掩码语言模型 (MLM)

为BERT 提供一个句子,然后优化其中包含的权重以在另一侧产生相同的句子,这就是 MLM 的构成。因此,我们给 BERT 一个句子,并要求它产生与输入相同的句子。在我们真正向 BERT 提供输入句子之前,我们掩盖了一些标记。

在输入 BERT 之前,单词序列中有 15% 的单词被 [MASK] 标记替换。这是在将单词序列输入 BERT 之前完成的。然后,该模型将尝试预测被屏蔽词的可能值。它在左右方向上都使用周围单词提供的上下文。

为了预测掩码句子,我们需要在编码器之上增加一个层,这将有助于对掩码句子进行分类。

使用的损失函数仅考虑屏蔽值的预测。其直接结果是,该模型比有向模型收敛得更慢 ;但是,它所拥有的更高的上下文感知弥补了这一缺点。

3-1显示了训练屏蔽语言模型的工作原理。大约 15% 的输入标记被屏蔽,然后前馈神经网络被训练为仅预测这些被屏蔽的标记。

图 3-1 掩码语言模型

3-2显示了MLM 中的推理如何工作的示例,它显示了如何使用掩码语言模型来预测掩码词。

图 3-2 用于标记预测的掩码语言模型 使用

这是使用huggingface 库的截图,我们将在下一章介绍。

下一句预测

下一句预测 (NSP) 协议需要为 BERT 提供两个句子,指定为句子 A 和句子 B。然后,我们询问 BERT,“Hey, does sentence B come after sentence A?” – 根据情况,BERT 会说 IsNextSentence 或 NotNextSentence。

让我们考虑数据集中的三个句子:

1.John went to the restaurant.

2.The kite is flying high in the sky.

3.John ordered a pizza.

现在当我们看这三个句子时,我们可以很容易地看出句子 2 不跟在句子 1 之后,相反,句子 3 跟在句子 1 之后。这种推理模式涉及跨越较长时间段的短语之间的依赖关系,通过NSP 传授给 BERT 。

考虑到 NSP 的训练,BERT 架构将正对和负对作为输入。

正对构成彼此相关的句子,而负对构成序列中彼此不相关的句子。这些负样本和正样本各占数据集中的 50%。

在将输入添加到模型 之前,它会按以下方式进行处理,以便更好地帮助模型区分训练中使用的两个句子:

1.在第一个句子的开头,插入一个 [CLS] 标记,在每个句子的最后,放置一个 [SEP] 标记。

2.每个标记现在都有一个句子嵌入,指示它是属于句子 A 还是句子 B。标记嵌入和句子嵌入在概念上 是词汇量大小为 2 的可比较表示。

3.每个标记都接收一个称为位置嵌入的附加嵌入,以便可以确定其在序列 中的位置。 这在第2章的“位置编码”部分进行了解释。

NSP 中的推理

为了通过NSP 演示推理,我们采用以下三个句子:

1.John went to the restaurant.

2.The kite is flying high in the sky.

3.John ordered a pizza.

计算句子 2 是否跟在句子 1 之后的概率和句子 3 跟在句子 1 之后的概率。

我们将再次使用 huggingface 库(我们将在下一章介绍)来计算个体概率。

请参阅要在 Google Colab 中使用的示例代码。(现在不要担心代码,因为第5章中会有大量示例。)

from torch.nn.functional import softmax
from transformers import BertForNextSentencePrediction, BertTokenizer
mdl = BertForNextSentencePrediction.from_pretrained('bert-base-cased')
brt_tkn = BertTokenizer.from_pretrained('bert-base-cased')
sentenceA = 'John went to the restaurant'
sentenceB = 'The kite is flying high in the sky'
encoded = brt_tkn.encode_plus(sentenceA, text_pair=sentenceB, return_tensors='pt')
sentence_relationship_logits = mdl(**encoded)[0]
probablities = softmax(sentence_relationship_logits, dim=1)
print(probablities)

清单 3-1 用于句子预测的 BERT

我们得到输出为

tensor([[0.0926, 0.9074]], grad_fn=<SoftmaxBackward0>)

这表明句子 2 跟在句子 1 之后的概率非常低。

现在我们对句子 1 和句子 3 进行相同的推理:

sentenceA = 'John went to the restaurant'
sentenceB = 'John ordered a pizza'

我们得到输出为

tensor([[9.9998e-01, 2.2391e-05]], grad_fn=<SoftmaxBackward0>)

这表明句子 1 后面有句子 3的概率 很高。

BERT 预训练模型

BERT 基于 Transformer 架构,主要使用编码器机制。它有许多变体,包括以下内容。

BERT-Base 的transformer块和隐藏层的尺寸比 OpenAI GPT 小,但它具有相同的整体模型尺寸(12 个变换器块、12 个注意力头和 768 的隐藏层尺寸)。

BERT-Large 是一个巨大的网络,可以在 NLP 任务上取得最先进的结果。它的注意力层数是 BERT-Base 的两倍(24 个转换器块,16 个注意力头,隐藏层大小为 1024)。

Huggingface 提供预训练的 BERT 模型,可直接用于下游任务的微调。

3-3显示了 huggingface 上可用的一些预训练 BERT模型 。

图 3-3 来自huggingface 的 Bert 模型

BERT 输入表示

  • 始终将序列中的第一个标记视为 特殊分类标记(也缩写为 CLS)。出于分类任务的目的,将使用与此标记对应的最终隐藏状态。

  • [SEP] 标记用于划分两个句子之间的分隔符。

  • 每当处理一个句子对时,都会添加一个额外的片段嵌入。这种嵌入将指示标记是属于句子 A 还是属于句子 B。

  • 给定标记的输入表示 是通过向标记的表示添加位置嵌入来构建的。

BERT 用例

一旦我们有了编码器生成的正确表示, BERT 就可以用于各种下游任务。这些任务包括情绪分析、总结、问答、文本到 SQL 生成等。

除了使用预训练的 BERT 模型外,我们还可以使用我们特定的文本数据集对其进行微调。这将使我们能够利用我们自己的数据。

与 GPT3 等其他大型学习模型相比,BERT 的源代码是免费向公众开放的,可以在 GitHub 上查看。这使得 BERT 可以在全世界更广泛的环境中使用。这完全改变了动态!

开发人员现在可以快速启动并运行像BERT 这样的尖端模型,而无需在此过程中投入大量时间或金钱。

此外,开发人员可以专注于微调 BERT,以根据其各个项目的特定要求定制模型的性能。

如果不想花时间微调 BERT,他们应该知道有数以千计的开源和免费 BERT 模型已经过预训练,目前可用于特定用例。

BERT 模型已针对各种任务进行了预训练,例如

1.分析 Twitter 和其他社交媒体上的用户情绪

2.恶意评论检测

3.语音转文字

4.问答

还有很多。

我们在下面使用 huggingface 库以BERT 的推文分类示例。

Tweets的情感分析

BERTweet 语言模型 是第一个针对英语推文进行预训练的公开可用的大规模模型。RoBERTa 的预训练技术用于指导 BERTweet 的训练。BERTweet 的预训练数据集包括 8.5 亿条英文推文(160 亿个单词标记和 80 GB)、从 2012 年 1 月 1 日到 2019 年 8 月 8 日流式传输的 8.45 亿条推文,以及与 COVID-19 大流行相关的 500 万条推文。

model = pipeline('sentiment-analysis', model="finiteautomata/bertweet-base-sentiment-analysis")

清单 3-2使用BERT 进行情感分析

通过运行这段代码,我们得到如图3-4所示的以下输出。

图 3-4 清单3-2的执行。这显示了模型和分词器的下载

然后我们将两条推文 输入模型:

data = ["idk about you guys but i'm having more fun during the bear than I was having in the bull.","At least in the bear market it’s down only. Bull market is up and down"]
model(data)

这给出了以下输出:

[{'label': 'POS', 'score': 0.9888675808906555}, {'label': 'NEG', 'score': 0.7523579001426697}]

这显示了 Bertweet 模型如何能够对前面的两条推文进行分类。

POS分数 显示积极情绪,NEG 分数显示消极情绪。

BERT 在各种通用语言任务上的表现

BERT性能 是根据以下几个基准测试得出的:

  1. SQuAD (斯坦福问答数据集):这是来自斯坦福的问答数据集。BERT 在此数据集上的性能远远领先于现有模型,并且与人类相比也好得多。

  1. SWAG:在这里,SWAG 代表 Situations with Adversarial Generations 。这是一个来源于日常场景的数据集,主要测试常识和推理。在这里,BERT 的表现也优于其他模型以及人类表现。

  1. GLUE:代表通用语言理解评估 。这评估了模型在理解特定语言方面的工作方式。这里有一些特定的任务可以评估模型。在这里,BERT 的表现也非常出色 。

概括

BERT 是一种极其复杂和尖端的语言模型,可帮助个人自动化他们的语言理解。它得到了海量数据训练的支持,并利用 Transformer 架构彻底改变了自然语言处理领域,使其能够实现最先进的性能。

得益于 BERT 提供的开源库,以及令人难以置信的 AI 社区为继续改进和共享新的 BERT 模型所做的努力,未触及的 NLP 里程碑似乎拥有光明的未来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【NLP】第 3 章 :BERT 的相关文章

  • 如何计算两个单词之间的相似度以检测它们是否重复?

    我有两个单词 我想计算它们之间的相似度 以便对它们是否重复进行排名 如何使用深度学习 NLP 方法实现这一目标 这里有一些解决文本相似性的方法 基于字符串的方法 给定 2 个句子字符串计算余弦相似度 https stackoverflow
  • 波特 油炸的去梗

    为什么波特词干算法在线 http text processing com demo stem http text processing com demo stem stem fried to fri并不是fry 我不记得任何以以下结尾的单词
  • 如何从另一种语言单词创建英文字母字符串?

    我需要找到一种方法将某些语言的单词 翻译 重写为英语 例如 俄语 听起来像privet 用英语讲 含义和语法并不重要 但我希望它听起来更相似 一切都应该用Python编写 我在网上努力查找 但没有找到好的方法 例如 类似这样的事情 tran
  • Keras 文本预处理 - 将 Tokenizer 对象保存到文件中以进行评分

    我按照以下步骤 大致 使用 Keras 库训练了一个情感分类器模型 使用 Tokenizer 对象 类将文本语料库转换为序列 使用 model fit 方法构建模型 评估这个模型 现在 为了使用此模型进行评分 我可以将模型保存到文件中并从文
  • Python 3 和 NLTK 与 WordNet 2.1 - 这可能吗?

    我将 Python 3 和 NLTK 3 0 0 与 WordNet 3 0 结合使用 我想用该数据 semval2007 https github com alvations pywsd tree master pywsd data se
  • word2vec gensim 多种语言

    这个问题完全超出了我的想象 我正在使用 gensim 训练 Word2Vec 模型 我提供了多种语言的数据 即英语和印地语 当我试图找到最接近 人 的词时 我得到的是 model wv most similar positive man O
  • 如何使用 python 中的 spacy 库将句子转换为问题 [请参阅下面的我的代码进行更正]

    我需要使用 python 中的 spacy 将任何句子转换为问题 我下面的代码太长了 我需要做更多的工作才能将任何句子完成为问题格式 现在在这段代码中我根据以下条件制定条件是形式 需要形式 有形式 做形式通过检查过去时和现在时 输入 尼娜拉
  • NLTK CoreNLPDependencyParser:无法建立连接

    我正在尝试通过 NLTK 使用斯坦福解析器 按照示例here http www nltk org api nltk parse html nltk parse corenlp CoreNLPDependencyParser 20tutori
  • 如何调整 NLTK 句子标记器

    我正在使用 NLTK 来分析一些经典文本 但我在按句子标记文本时遇到了麻烦 例如 这是我从以下内容中得到的片段莫比迪克 http www gutenberg org cache epub 2701 pg2701 txt import nlt
  • python 中单词的动名词形式

    我想获得字符串的动名词形式 我还没有找到调用库来获取动名词的直接方法 我应用了以 ing 结尾的单词的规则 但是因为异常导致我收到了一些错误 然后 我检查 cmu 单词以确保生成的动名词单词正确 代码如下 import cmudict im
  • 如何计算两个文本文档之间的相似度?

    我正在考虑使用任何编程语言 尽管我更喜欢 Python 来从事 NLP 项目 我想获取两个文档并确定它们的相似程度 常见的方法是将文档转换为 TF IDF 向量 然后计算它们之间的余弦相似度 任何有关信息检索 IR 的教科书都涵盖了这一点
  • Spacy 中的自定义句子分割

    I want spaCy使用我提供的句子分割边界而不是它自己的处理 例如 get sentences Bob meets Alice SentBoundary They play together gt Bob meets Alice Th
  • 从文本文件中提取与输入单词最相似的前 N ​​个单词

    我有一个文本文件 其中包含我使用 BeautifulSoup 提取的网页内容 我需要根据给定的单词从文本文件中找到 N 个相似的单词 流程如下 从中提取文本的网站 https en wikipedia org wiki Football h
  • 如何训练斯坦福 NLP 情感分析工具

    地狱大家 我正在使用斯坦福核心 NLP 包 我的目标是对推文直播进行情感分析 按原样使用情感分析工具对文本 态度 的分析非常差 许多积极因素被标记为中性 许多消极因素被评为积极 我已经在文本文件中获取了超过一百万条推文 但我不知道如何实际获
  • NLTK 中的无监督 HMM 训练

    我只是想进行非常简单的无监督 HMM 训练nltk http www nltk org 考虑 import nltk trainer nltk tag hmm HiddenMarkovModelTrainer from nltk corpu
  • SpaCy 模型“en_core_web_sm”的词汇量大小

    我尝试在 SpaCy 小模型中查看词汇量 model name en core web sm nlpp spacy load model name len list nlpp vocab strings 只给了我 1185 个单词 我也在同
  • 快速NLTK解析成语法树

    我正在尝试将数百个句子解析为语法树 我需要快速完成 问题是如果我使用 NLTK 那么我需要定义一个语法 而我不知道我只知道它会是英语 我尝试使用this https github com emilmont pyStatParser统计解析器
  • 是否可以使用 Google BERT 来计算两个文本文档之间的相似度?

    是否可以使用 Google BERT 来计算两个文本文档之间的相似度 据我了解 BERT 的输入应该是有限大小的句子 一些作品使用 BERT 来计算句子的相似度 例如 https github com AndriyMulyar semant
  • 使用正则表达式标记化进行 NLP 词干提取和词形还原

    定义一个函数 名为performStemAndLemma 它需要一个参数 第一个参数 textcontent 是一个字符串 编辑器中给出了函数定义代码存根 执行以下指定任务 1 对给出的所有单词进行分词textcontent 该单词应包含字
  • 如何提取句子中的主语及其各自的从属短语?

    我正在尝试在句子中进行主题提取 以便我能够根据主题获得情感 我在用nltk在 python2 7 中用于此目的 以下面的句子为例 Donald Trump is the worst president of USA but Hillary

随机推荐

  • 游戏场景设计案例精选

    现在我们来讨论一下如何将游戏场景从概念转变为现实 示例场景来自于我2010 年开发的游戏 火星基地 的 游戏的主角汉娜 Hannah 由于宇宙飞船的宝石燃料耗尽而降落在火星 汉娜必须在这个文明的废墟中找到替代的宝石以逃离困境 废墟的文明只是
  • python可视化库以及常见的可视化工具

    因为工作学习需要 日常需要辅助画一些图形 为便于后续方便查找 故整理下相关常见库和工具 首先介绍python可操作性的库 1 matplotlib 这个差不多是把matlab中可以画出的图形 全部迁移到python中 通过python代码就
  • JAVA语言多线程的执行

    这里写目录标题 1 关于多线程的介绍与执行 1 1什么是线程 什么是进程 2 2进程和线程是什么关系 3 3主栈与其它栈的关系 4 4单核cpu和多核cpu 5 5run 和start 的作用和关系 6 6线程的个数判别 7 7实现线程的两
  • Servlet(Servlet的体系结构, Servlet相关配置)

    Servlet的体系结构 Servlet 接口 GenericServlet 抽象类 HttpServlet 抽象类 GenericServlet 将Servlet接口中其他的方法做了默认空实现 只将service 方法作为抽象 将来定义S
  • AGV小车修改地图匹配得分

    用NoMachine连接小车进入工控机内部 在路径 Home okagv2020 install share cartographer ros configuration files 下找到backpack 2d navigation lu
  • 读的一些书

    读书 乖 摸摸头 阿弥陀佛 么么哒 梦的解析 梦的产生 梦的来源 梦的内容 孩提的梦 梦的表现方法 梦的遗忘 活出生命的意义 找寻生命意义的三个途径 意义 集中营中 囚徒 的心理阶段 自我保全的法则 非暴力沟通 由衷的给予 交流 非暴力沟通
  • QT 信号和信号槽

    信号和信号槽机制 signal slot 是Qt的编程基础 是用来在QObject类或其子类间通讯的方法 作为一种通用的处理机制 信号与信号槽非常灵活 可以携带任意数量的参数 参数的类型也由用户自定 同时其本身也是类型安全的 任何一个从QO
  • 和微软合作的garagegames公司推出基于XNA的游戏引擎TorqueX,支持快速开发(近期引擎免费提供使用)

    我们都知道微软的XNA明年就要推出正式版本 在正式版本里将开始直接支持3D的开发 而XNA的3D低层引擎使用的是garagegames公司开发的游戏引擎 garagegames以开发TORQUE系列游戏引擎出名 TORQUE引擎包括2D的T
  • c语言库函数fgets,C语言 标准I/O库函数 fgets 使用心得

    char fgets char s int n FILE stream 参数说明 s 指定存放所读取的数据的位置 n 指定所读取数据的最大长度 这个最大长度包括了字符串结束符 0 所占据的存储空间 因此 实际最大读取的有效字符数是 n 1
  • Oracle PL/SQL 高级编程

    1 复合数据类型 记录类型 语法格式 type 类型名 is record 字段1 字段1类型 not null 表达式1 字段2 字段2类型 not null 表达式2 说明 记录之间相互赋值要求两个记录类型完全相同 案例 举例1 创建表
  • 三维重建(三)相机参数标定与光束平差法(Bundle Adjustment)

    一 针孔成像模型涉及到的坐标系 由于相机的参数总数相对于某种光学模型而言的 这里用到的比较广泛的光学模型就是小孔成像的模型 下面针对小孔成像的光学模型涉及到的坐标系一一介绍 1 世界坐标系 世界坐标系即为三维空间中物体的坐标 用 Xw Yw
  • MES系统是什么

    前言 通俗的来讲 MES系统是一个辅助规范管理的系统 但是我总觉得这样很抽象 达不到一个很好的效果 所以 我打算从业务开始完整的介绍一下MES系统到底是什么 从业务开始 MES系统是什么 在电路板的生产过程中 有很多地方需要进行管理 从开始
  • @程序员,你在颓丧的时候怎么办?

    01 颓丧的感觉 颓丧 一般指精神萎靡不振 情绪消沉 多用于消极的人身上 有时候也用于别处 比如说 红楼梦 第七六回中就有一句 因又叹道 诗固新奇 只是太颓丧了些 不管怎么说 这个词相关的主题很少会在朋友圈看到 因为人们需要树立积极向上的正
  • JAVA操作Elasticsearch指定主键_id生成策略

    目录 前言 1 JAVA操作Elasticsearch手动指定ID 2 JAVA操作Elasticsearch自动生成ID 3 DSL方式手动指定ID 4 DSL方式自动生成ID 前言 Elasticsearch一共有两种主键生成策略 一个
  • Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on

    报错信息 Failed to execute goal org apache maven plugins maven surefire plugin 2 22 1 test default test on project qc offlin
  • 神经元是多输入单输出吗,单输入单输出神经网络

    1 人工神经网络的知识表示形式 人工神经网络的知识表示形式 1 每个神经元都是一个多输入单输出的信息处理单元 2 神经元输入分兴奋性输入和抑制性输入两种类型 3 神经元具有空间整合特性和阈值特性 4 神经元输入与输出间有固定的时滞 主要取决
  • 关于博客积分规则,总是找不着入口

    博客积分规则 博客积分是CSDN对用户努力的认可和奖励 也是衡量博客水平的重要标准 博客等级也将由博客积分唯一决定 积分规则具体如下 1 每发布一篇原创或者翻译文章 可获得10分 2 每发布一篇转载文章 可获得2分 3 博主的文章每被评论一
  • 微信小程序从入坑到放弃二十五:记一次在WXS中使用正则表达式的坑

    摘要 WXS WeiXin Script 是小程序的一套脚本语言 结合 WXML 可以构建出页面的结构 在此次开发中 由于接口返回数据不统一 所以要对某些字段进行过滤 但直接使用replace时竟然报错了 原来在WXS中要生成regexp对
  • 网络编程day3作业

    tftp下载 include
  • 【NLP】第 3 章 :BERT

    在本章中 您将学习由 Google 开发的 Transformer 架构的实现之一 称为 BERT Google AI Language 的研究人员最近所做的工作导致发表了一篇名为 BERT 来自变形金刚的双向编码器表示 的论文 BERT取