Bert (Bi-directional Encoder Representations from Transformers) Pytorch 源码解读(二)

本文是 BERT 模型源码解读的第二部分,关注于 BERT_Training.py 文件,主要实现 BERT 模型的预训练。预训练包括 Masked Language Modeling 和 Next Sentence Prediction 两个任务。文中详细讲解了预训练过程、模型结构、Positional encoding、损失计算、Padding 等关键步骤,并给出了训练代码。
摘要由CSDN通过智能技术生成

前言

这里是 Bert(Bi-directional Encoder Representations from Transformers) 源码解读的第二部分,第一部分主要介绍了 bert_model.py 文件中, bert 模型的定义。而第二部分为 BERT_Training.py 文件,该部分源码主要实现了 Bert 模型的预训练工作。


Bert 源码解读:

1. 模型结构源码: bert_model.py

2. 模型预训练源码:bert_training.py

3. 数据预处理源码:wiki_dataset.py


在开始前,先大致的介绍一下 bert 模型的预训练。bert 的预训练过程是个 Multi Task learning 的过程。其中同时进行的两个任务分别为:

1. Masked Language Modeling。

2. Next sentece Predict(Classification)。

Masked Language Mode(MLM)选择输入序列中的随机token样本,并用特殊的token[MASK]替换。MLM的目标是预测遮挡token时的交叉熵损失。BERT一致选择15%的输入token作为可能的替换。在所选的token中,80%替换为[MASK], 10%保持不变,10%替换为随机选择的词汇表token。MLM 任务在 bert 中的主要任务是建立语言模型,他的原理和 Word2Vec 中的 CBOW 模型以及 Negative Sampling 算法思想类似。

Next Sentece Predict(NSP)是一种二分类损失,用于预测两个片段在原文中是否相互跟随。通过从文本语料库中提取连续的句子来创建积极的例子。反例是通过对来自不同文档的段进行配对来创建的。正、负样本的抽样概率相等。NSP的目标是为了提高下游任务的性能,比如自然语言推理,这需要对句子对之间的关系进行推理。


开始

1. Import & Config

from torch.utils.data import DataLoader
from dataset.wiki_dataset import BERTDataset
from models.bert_model import *
import tqdm
import pandas as pd
import numpy as np
import os


config = {}
config["train_corpus_path"] = "./pretraining_data/wiki_dataset/test_wiki.txt"
config["test_corpus_path"] = "./pretraining_data/wiki_dataset/test_wiki.txt"
config["word2idx_path"] = "./pretraining_data/wiki_dataset/bert_word2idx_extend.json"
config["output_path"] = "./output_wiki_bert"

config["batch_size"] = 1
config["max_seq_len"] = 200
config["vocab_size"] = 32162
config["lr"] = 2e-6
config["num_workers"] = 0

首先导入各种所需要的库,之前定义好的 Bert 模型,以及数据处理模块,其次对一些参数及路径进行设置。参数分别有:batch_sizemax_seq_len 最大序列长度,vocab_size 字典大小,lr 学习率,num_workers 加载数据时的线程数。

2. Pretrain

class Pretrainer:
    def __init__(self, bert_model,
                 vocab_size,
                 max_seq_len,
                 batch_size,
                 lr,
                 with_cuda=True,
                 ):
        # 词量, 注意在这里实际字(词)汇量 = vocab_size - 20,
        # 因为前20个token用来做一些特殊功能, 如padding等等
        self.vocab_size = vocab_size
        self.batch_size = batch_size
        # 学习率
        self.lr = lr
        # 是否使用GPU
        cuda_condition = torch.cuda.is_available() and with_cuda
        self.device = torch.device("cuda:0" if cuda_condition else "cpu")
        # 限定的单句最大长度
        self.max_seq_len = max_seq_len
        # 初始化超参数的配置
        bertconfig = BertConfig(vocab_size=config["vocab_size"])
        # 初始化bert模型
        self.bert_mode
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值