BERT网络的原理与实战

这篇具有很好参考价值的文章主要介绍了BERT网络的原理与实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介

BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer架构的预训练语言模型,由Google在2018年提出。BERT可以在大规模的未标注文本上进行预训练,然后在各种下游NLP任务上进行微调,取得了很好的效果。

BERT的主要贡献在于将双向预训练引入了Transformer架构中,使得模型能够更好地理解上下文信息,从而在下游任务中表现更加出色。本文将介绍BERT网络的原理与实战,包括预训练和微调两个部分。

二、原理

1. Transformer

首先,我们需要了解一下Transformer架构。Transformer是一种基于自注意力机制(Self-Attention)的序列到序列模型,由“编码器”和“解码器”组成。在BERT中,只使用了编码器部分。

Transformer的核心思想是将输入序列映射到一个高维空间中,然后通过自注意力机制计算每个位置与其他位置之间的关系,得到一个加权和,表示每个位置在整个序列中的重要性。这个加权和就是每个位置的向量表示,也可以看作是语义信息的编码。

2. BERT

BERT通过双向预训练来学习上下文信息。具体来说,BERT使用了两种预训练任务:Masked Language Model(MLM)和Next Sentence Prediction(NSP)。

2.1 MLM

在MLM任务中,BERT随机将输入文本中的一些词汇替换成“[MASK]”标记,然后让模型预测这些被替换的词汇是什么。这个任务可以让模型学习到上下文信息,因为模型需要根据上下文来预测被替换的词汇。

2.2 NSP

在NSP任务中,BERT给定两个句子,让模型预测它们是否是连续的。这个任务可以让模型学习到句子级别的语义信息,从而更好地理解上下文。具体来说,NSP任务包括两个句子A和B,模型需要判断B是否是A的下一句话。

通过这两个预训练任务,BERT能够捕捉到上下文信息,从而在下游任务中表现更加出色。

3. Fine-tuning

在下游任务中,我们可以使用BERT的预训练模型作为初始模型,然后通过微调来适应具体的任务。微调过程中,我们一般会加上一个任务特定的输出层,然后在任务特定的数据集上进行训练。

在微调过程中,我们可能需要对BERT模型进行一些修改,以适应特定的任务。例如,对于文本分类任务,我们可以在BERT模型的输出上加上一个全连接层,然后使用softmax函数来进行分类。

三、实战

下面我们将以一个文本分类任务为例,介绍如何使用BERT进行微调。

1. 数据集

我们将使用IMDB电影评论数据集,这是一个常用的文本分类数据集,包含了50,000个电影评论,其中25,000个用于训练,25,000个用于测试。每个评论被标记为正面或负面。

2. 预处理

在使用BERT进行微调之前,我们需要对数据进行预处理。具体来说,我们需要将每个评论转换为BERT模型的输入格式。BERT的输入格式包括三个部分:input ids、segment ids和attention masks。

  • input ids:将每个单词映射为一个唯一的整数,这个整数称为token id。对于未登录词,我们可以将其映射为一个特殊的token id。
  • segment ids:用于区分两个句子,对于单个句子的任务,可以将其全部设置为0。
  • attention masks:用于指示哪些token是真实输入,哪些是padding。在BERT中,我们使用[CLS]和[SEP]标记来表示句子的开始和结束,因此我们需要将attention masks设置为1,对于padding部分设置为0。

3. 模型训练

在预处理完数据之后,我们可以开始训练模型了。在这里,我们使用PyTorch实现BERT模型的微调。首先,我们需要加载预训练的BERT模型和tokenizer,并对数据进行处理,生成input ids、segment ids和attention masks。文章来源地址https://www.toymoban.com/news/detail-466843.html


import torch
from transformers import BertTokenizer, BertForSequenceClassification

# 加载预训练的BERT模型和tokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')

# 处理数据
def process_data(texts, labels):
    input_ids = []
    attention_masks = []
    token_type_ids = []

    for text in texts:
        encoded_dict = tokenizer.encode_plus(
                            text,                      # 文本
                            add_special_tokens = True,  # 添加特殊标记
                            max_length = 128,           # 最大长度
                            pad_to_max_length = True,   # 填充
                            return_attention_mask = True,   # 添加attention mask
                            return_tensors = 'pt',       # 返回PyTorch张量
                       )
        
        input_ids.append(encoded_dict['input_ids'])
        attention_masks.append(encoded_dict['attention_mask'])
        token_type_ids.append(encoded_dict['token_type_ids'])
    
    input_ids = torch.cat(input_ids, dim=0)
    attention_masks = torch.cat(attention_masks, dim=0)
    token_type_ids = torch.cat(token_type_ids, dim=0)
    labels = torch.tensor(labels)

    return input_ids, attention_masks, token_type_ids, labels

# 加载数据集
train_texts = [...]  # 训练集文本
train_labels = [...]  # 训练集标签
test_texts = [...]   # 测试集文本
test_labels = [...]   # 测试集标签

# 处理数据
train_input_ids, train_attention_masks, train_token_type_ids, train_labels = process_data(train_texts, train_labels)
test_input_ids, test_attention_masks, test_token_type_ids, test_labels = process_data(test_texts, test_labels)

# 设置训练参数
optimizer = torch.optim.Adam(model.parameters(), lr=2e-5)
criterion = torch.nn.CrossEntropyLoss()

# 训练模型
num_epochs = 3
batch_size = 32

for epoch in range(num_epochs):
    model.train()
    total_loss = 0

    for i in range(0, len(train_input_ids), batch_size):
        # 获取一个batch的数据
        batch_input_ids = train_input_ids[i:i+batch_size]
        batch_attention_masks = train_attention_masks[i:i+batch_size]
        batch_token_type_ids = train_token_type_ids[i:i+batch_size]
        batch_labels = train_labels[i:i+batch_size])

        # 清空梯度
        optimizer.zero_grad()

        # 前向传播
        outputs = model(input_ids=batch_input_ids, 
                        attention_mask=batch_attention_masks, 
                        token_type_ids=batch_token_type_ids, 
                        labels=batch_labels)

        loss = outputs[0]
        total_loss += loss.item()

        # 反向传播
        loss.backward()

        # 更新参数
        optimizer.step()

    # 打印损失
    print("Epoch {}/{}: Loss {:.4f}".format(epoch+1, num_epochs, total_loss/len(train_input_ids)))

# 测试模型
model.eval()
with torch.no_grad():
    outputs = model(input_ids=test_input_ids, 
                    attention_mask=test_attention_masks, 
                    token_type_ids=test_token_type_ids)

    # 计算准确率
    logits = outputs[0]
    preds = torch.argmax(logits, dim=1)
    acc = torch.sum(preds == test_labels).item() / len(test_labels)

    print("Test Accuracy: {:.4f}".format(acc))
    ~~~

到了这里,关于BERT网络的原理与实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【论文精读】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    自然语言处理(Natural Language Processing,NLP)领域内的 预训练语言模型 ,包括基于RNN的ELMo和ULMFiT,基于Transformer的OpenAI GPT及Google BERT等。预训练语言模型的成功,证明了我们可以从海量的无标注文本中学到潜在的语义信息,而无需为每一项下游NLP任务单独标注大量训练数据。

    2024年02月14日
    浏览(70)
  • 大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解、Bert模型原理介绍

    预训练属于迁移学习的范畴。现有的神经网络在进行训练时,一般基于反向传播(Back Propagation,BP)算法,先对网络中的参数进行随机初始化,再利用随机梯度下降(Stochastic Gradient Descent,SGD)等优化算法不断优化模型参数。而预训练的思想是,模型参数不再是随机初始化的

    2024年02月17日
    浏览(49)
  • [PyTorch][chapter 53][Auto Encoder 实战]

    前言:      结合手写数字识别的例子,实现以下AutoEncoder      ae.py:  实现autoEncoder 网络      main.py: 加载手写数字数据集,以及训练,验证,测试网络。 左图:原图像 右图:重构图像  ----main-----  每轮训练时间 : 91 0 loss: 0.02758789248764515  每轮训练时间 : 95 1 loss: 0.024654

    2024年02月10日
    浏览(42)
  • Kubernetes网络插件flannel原理简介

    Flannel是kubernetes的网络插件之一,通过构建k8s集群节点之间的overlay网络,实现跨节点通信等功能。flannel常用的网络转发模式有hostgw、udp、vxlan等,在实际生产中常用的是vxlan模式。 k8s会为每个集群节点划分子网,这样pod调度到某节点时,就会按照该节点的子网网段分配ip,保

    2023年04月18日
    浏览(37)
  • BERT架构简介

      BERT沿用原始Transformer模型中的编码器层,具有编码器的堆叠。但BERT没有使用解码器层,因此没有掩码多头注意力子层。(BERT的设计者认为,对序列后续部分进行掩码会阻碍注意力过程)。于是,BERT引入了 双向注意力机制 ,即一个注意力头从左到右,另一个注意力头从

    2024年02月21日
    浏览(22)
  • 网络协议从入门到底层原理学习(一)—— 简介及基本概念

    一、简介 1、网络协议的定义 什么是网络协议? 网络协议是由定义网络上两个或多个设备之间通信的规则、过程和格式组成的正式标准和策略 它们确保计算机网络设备可以使用一种通用语言传输和接收数据,而不管它们的设计、硬件或基础设施如何。 网络协议管理及时、安全

    2024年02月09日
    浏览(49)
  • BERT原理&Fine Tuning&Bert变种

    BERT全称为Bidirectional Encoder Representation from Transformer,从名字可以知道,BERT是Transformer的Encoder部分。BERT的最大的改进是在模型的训练核数据的输入部分。 BERT是一个动态词向量模型,其主要功能就是抽取每个词在句子中的语义信息,并且表示出来。 训练时的任务 BERT在训练时,

    2024年02月05日
    浏览(35)
  • Bert基础(十七)--Bert实战:中文情感识别

    前面说了中文分类的过程,这次说一下情感分类相关的代码,其实情感分类也属于中文多分类的一种,知识情感分类一般会专门区分出来,但是代码基本是一致的, 基本步骤: 数据集我们使用hugging face上的数据集,打开hugging face–》datasets task选择 “Text Classification“ langua

    2024年04月28日
    浏览(31)
  • 深度学习体系结构——CNN, RNN, GAN, Transformers, Encoder-Decoder Architectures算法原理与应用

    卷积神经网络(CNN)是一种特别适用于处理具有网格结构的数据,如图像和视频的人工神经网络。可以将其视作一个由多层过滤器构成的系统,这些过滤器能够处理图像并从中提取出有助于进行预测的有意义特征。 设想你手头有一张手写数字的照片,你希望计算机能够识别出

    2024年04月28日
    浏览(50)
  • 〖Python网络爬虫实战①〗- HTTP原理

    订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+                 python项目实战                  Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付费专栏,

    2023年04月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包