FASTAI and Fine-Tuning BERT with FastAI

2023-11-15

这是一篇笔记类型文章,主要是从新学习一下fastai,和实践“pytorch-pretrained-BERT”和“pytorch-transformers”对接fastai 后简洁快速实现bert模型的训练和执行任务。

我还是一个小白,大佬看到我的文章奋起拍砖的时候,还请不要打脸。--------现在还只能靠脸吃饭。感谢!

 

The Basics of Fast AI

Fastai框架基于Pytorch,底层的数据处理依旧使用datasets and dataloaders,但包装成Databunch,使用时更加简洁(实用性因人而异)

Since fastai is built on top of PyTorch, it uses the same underlying primitives to handle data (datasets and dataloaders). However, unlike many other frameworks, it doesn’t directly expose the datasets and dataloaders and instead wraps them up in a Databunch.

 

Fastai训练模型大体分为三步:

1、准备数据。

2、确定架构(fastai中叫做Learner),learner 将组合配置数据,定义的模型,损失函数和优化器。

3、确定损失函数和优化器。

这样的框架对于实用bert来做任务时,会比较友好,当然封装得过于厉害,要自己动手做一些改变或者搭一个模型,还是建议用Torch或tf.

 

Using BERT with fastai

Huggingface 搞了BERT 预训练模型的 PyTorch 版本。将“pytorch-pretrained-BERT”改造了“pytorch-transformers”。

这两个包都可以用来与fastai对接,实现bert模型的训练。

 

There are three things we need to be careful of when using BERT with fastai.

  1. BERT uses its own wordpiece tokenizer.                                   #BERT有专门的tokenizer方式
  2. BERT needs [CLS] and [SEP] tokens added to each sequence.#pretrain之前需要加token标记
  3. BERT uses its own pre-built vocabulary.                                     #BERT有自己的"pre-built vocabulary"

pytorch_pretrained_bert 是有tokenizer的:

from pytorch_pretrained_bert import BertTokenizer 
bert_tok = BertTokenizer.from_pretrained("bert-base-uncased")

但是fastai 在执行tokenize的时候,会做一下包装,目的是加上 [CLS] and [SEP] tokens:

class FastAiBertTokenizer(BaseTokenizer): 
    """Wrapper around BertTokenizer to be compatible with fast.ai"""
    def __init__(self, tokenizer: BertTokenizer, max_seq_len: int=128, **kwargs): 
         self._pretrained_tokenizer = tokenizer 
         self.max_seq_len = max_seq_len 
    def __call__(self, *args, **kwargs): 
         return self 
    def tokenizer(self, t:str) -> List[str]: 
    """Limits the maximum sequence length""" 
         return ["[CLS]"] + self._pretrained_tokenizer.tokenize(t)[:self.max_seq_len - 2] + ["[SEP]"]

最后包装的格式是这样的(fastai中,tokenizer即fastai_tokenizer):

fastai_tokenizer = Tokenizer(
                tok_func=FastAiBertTokenizer(bert_tok, max_seq_len=config.max_seq_len),                         
                pre_rules=[], 
                post_rules=[])

当然vocabulary 也需要包装一下:

fastai_bert_vocab = Vocab(list(bert_tok.vocab.keys()))

 

现在,构建databunch 

import pandas as pd
from pathlib import Path

from sklearn.model_selection import train_test_split
DATA_ROOT = Path("..") / "input"
train, test = [pd.read_csv(DATA_ROOT / fname) for fname in ["train.csv", "test.csv"]]
train, val = train_test_split(train)
label_cols = ["toxic", "severe_toxic", "obscene", "threat", "insult", "identity_hate"] 







# read the data into a databunch 
databunch = TextDataBunch.from_df(".", train, val, test,
     tokenizer=fastai_tokenizer, vocab=fastai_bert_vocab,
     include_bos=False,
     include_eos=False, 
     text_cols="comment_text", 
     label_cols=label_cols, 
     bs=config.bs,
     collate_fn=partial(pad_collate, pad_first=False), 
)

#注意设置include_bos=False and include_eos=False ,fastai 会自己根据[CLS] 和[SEP] 默认添加 bos 和 eos 。

Notice we’re passing the include_bos=False and include_eos=False options. This is because fastai adds its own bos and eos tokens by default which interferes with the [CLS] and [SEP] tokens added by BERT. Note that this option is new and might not be available for older versions of fastai.

数据准备完毕,我们处理架构,构建Learner

import torch
import torch.nn as nn
from pytorch_pretrained_bert.modeling import BertConfig, BertForSequenceClassification

bert_model = BertForSequenceClassification.from_pretrained(config.bert_model_name, num_labels=6)

# since this is a multilabel classification problem, we use the BCEWithLogitsLoss
loss_func = nn.BCEWithLogitsLoss()


learner = Learner(
    databunch, bert_model,
    loss_func=loss_func,
)

格式如上,嗯就是很简单。

然后就可以跑起来:

learner.lr_find()
#找一下学习率的区间

learner.recorder.plot()
#打印一下刚刚找到的结果

训练开始:

learner.fit_one_cycle(4, max_lr=3e-5)

嗯是的,就是这么一行代码。

 

利用“pytorch-transformers” 中的

BertTokenizer, BertForSequenceClassification 是一样的。

但需要注意一点,新的 Transformer 所有的模型运行结果,都是 Tuple 。即原先的模型运行结果,都用括号包裹了起来。括号里,可能包含了新的数据。但是原先的输出,一般作为新版 Tuple 的第一个元素。

所以在指定模型的时候,采取如下方式(代码来自这里):

#取tuple第一项作为结果
class MyNoTupleModel(BertForSequenceClassification):
  def forward(self, *args, **kwargs):
    return super().forward(*args, **kwargs)[0]

#构建模型
bert_pretrained_model = MyNoTupleModel.from_pretrained(bert_model, num_labels=2)

 

ok,thanks

 

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

FASTAI and Fine-Tuning BERT with FastAI 的相关文章

  • 不确定我的自动编码器神经网络从 Keras 预测中给出的结果

    我正在尝试构建一个自动编码器神经网络 用于在单列文本列表中查找异常值 我的输入有 138 行 它们看起来像这样 amaze header 2 png amaze header png circle shape xml disableable
  • Java文本输出中的UTF-8编码问题

    我一直致力于测试高棉语 Unicode Wordbreaker 的各种解决方案 高棉语单词之间没有空格 这使得拼写检查和语法检查变得困难 以及从旧高棉语转换为高棉语 Unicode 我得到了一些源代码 现在在线 http www white
  • 卷积神经网络 (CNN) 输入形状

    我是 CNN 的新手 我有一个关于 CNN 的问题 我对 CNN 特别是 Keras 的输入形状有点困惑 我的数据是不同时隙的二维数据 比方说10X10 因此 我有 3D 数据 我将把这些数据输入到我的模型中来预测即将到来的时间段 所以 我
  • 使用 OpenNLP 获取句子的解析树。陷入困境。

    OpenNLP 是一个关于自然语言处理的 Apache 项目 NLP 程序的目标之一是解析一个句子 并给出其语法结构的树 例如 天空是蓝色的 这句话 可能会被解析为 S NP VP The sky is blue where S是句子 NP
  • Keras 可以处理不同尺寸的输入图像吗?

    Keras 可以处理不同尺寸的输入图像吗 例如 在全卷积神经网络中 输入图像可以具有任意大小 然而 我们在用Keras创建网络时需要指定输入形状 因此 我们如何使用 Keras 来处理不同的输入尺寸而不将输入图像调整为相同的尺寸 谢谢你的帮
  • Tensorflow 训练期间 GPU 使用率非常低

    我正在尝试为 10 类图像分类任务训练一个简单的多层感知器 这是 Udacity 深度学习课程作业的一部分 更准确地说 任务是对各种字体呈现的字母进行分类 数据集称为 notMNIST 我最终得到的代码看起来相当简单 但无论如何我在训练期间
  • FastText - 由于 C++ 扩展未能分配内存,无法加载 model.bin

    我正在尝试使用 FastText Python APIhttps pypi python org pypi fasttext https pypi python org pypi fasttext虽然 据我所知 此 API 无法加载较新的
  • 打印出网络架构中每一层的形状

    在 Keras 中 我们可以如下定义网络 有什么办法可以输出每层之后的形状 例如 我想打印出以下形状inputs在定义行之后inputs 然后打印出形状conv1在定义行之后conv1 etc inputs Input 1 img rows
  • NLTK 可用的停用词语言

    我想知道在哪里可以找到 NLTK 停用词支持的语言 及其键 的完整列表 我找到一个列表https pypi org project stop words https pypi org project stop words 但它不包含每个国家
  • R 中带有变音符号的字符列表

    我试图将字符串中的电话 字符 出现次数制成表格 但变音符号单独作为字符制成表格 理想情况下 我有一个国际音标的单词列表 其中包含大量变音符号以及它们与基本字符的几种组合 我在这里给出了仅包含一个单词的 MWE 但对于单词列表和更多类型的组合
  • keras 预测内存交换无限期增加

    我使用keras实现了一个分类程序 我有一大组图像 我想使用 for 循环来预测每个图像 然而 每次计算新图像时 交换内存都会增加 我尝试删除预测函数内部的所有变量 并且我确信该函数内部存在问题 但内存仍然增加 for img in ima
  • 使用 NLP 进行句子压缩 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 使用机器翻译 我可以获得一个句子的非常压缩的版本 例如 我真的很想喝一杯美味可口的咖啡将被翻译为我想喝咖
  • 深度学习——一些关于caffe的幼稚问题

    我试图了解 caffe 的基础知识 特别是与 python 一起使用 我的理解是模型定义 比如给定的神经网络架构 必须包含在 prototxt file 当您使用数据训练模型时 prototxt 您将权重 模型参数保存到 caffemode
  • 使用自定义层运行 Keras 模型时出现问题

    我目前正在攻读学士学位论文FIIT STU https www fiit stuba sk en html page id 749 其主要目标是尝试复制和验证以下结果study http arxiv org abs 2006 00885 这
  • 使用 NLTK 生成字典以将推文分类为预定义类别

    我有一个 Twitter 用户 screen names 列表 我需要根据他们的兴趣领域将他们分为 7 个预定义类别 教育 艺术 体育 商业 政治 汽车 技术 我用 Python 提取了用户的最后 100 条推文 并在清理推文后为每个用户创
  • 如何改进 NLTK 中的荷兰语 NER 词块划分器

    感谢这个伟大的答案 我使用 NLTK 和 Conll2002 语料库训练自己的荷兰语 NE 词块划分器 有了一个良好的开端 NLTK 荷兰语命名实体识别 https stackoverflow com questions 11293149
  • 如何在pytorch中动态索引张量?

    例如 我有一个张量 tensor torch rand 12 512 768 我得到了一个索引列表 说它是 0 2 3 400 5 32 7 8 321 107 100 511 我希望从给定索引列表的维度 2 上的 512 个元素中选择 1
  • 如何从 R keras 中的类似生成器的数据中评估()和预测()

    我有以下代码 数据集可以下载here https www dropbox com s qjt5o31oyqj10m8 data tar gz dl 0 or here https www kaggle com c dogs vs cats
  • 使用tensorflow获取真阳性、假阳性、假阴性和真阴性列表

    这是我的工作 我注释了 活 细胞的图像 约 8 000 和 死 细胞的图像 约 2 000 800 和 200 用于测试集 我正在使用 CNN 带有张量流和 keras 将图像分类为 活 或 死 我训练了我的模型 验证损失 0 35 召回率
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size

随机推荐

  • Python中pip安装与使用

    一 Pip的安装方法 1 在Windows中的安装方法 操作环境 Windows10 Python3 7 其实你在安装python的时候 pip就随同一起安装了 一般情况下 可以直接使用 如果不能使用 基本上就是没有添加环境变量而已 添加下
  • 性能监控诊断,cpu,I/O,内存,网络诊断

    1 内存 cpu 网络 磁盘 2 当系统出现问题时 我们需要从应用程序 操作系统 服务器设备 网络环节系统资源等多方面综合排查 定位分析问题 然后集中解决问题 3 响应时间 服务器响应时间 网络时间 4 总体来说 系统提供了比较多的有用信息
  • 【Mysql】日期、行变列(IF、CASE WHEN THEN)语句总结

    获取昨天的日期 日期相减函数 datediff select datediff curdate INTERVAL 1 DAY 删除Person表中重复的Email数据 只保留id最小的一条 delete p1 from Person p1
  • mock方法常用框架_Mock框架Mockito入门教程

    在开发中 我们经常会依赖同事或者第三方提供的接口 如果该接口无法正常工作 比如接口正在修复 或者网络异常等 那么便会对需要依赖该接口的开发造成很大影响 遇到这种情况 我们可能会想到模拟该接口以提供正常的返回值 用来继续当前的工作 使用Moc
  • Qt信号槽进阶及误区

    lambda写法 Qt 中信号槽lambda表达式优缺点 好处 代码更加紧凑 不用特意费力去定义一个常规的函数 坏处 一旦写的过长 臃肿 代码可读性会变差 C 中lambda表达式构成 capture parameters mutable
  • 数据模型及E-R模型

    数据模型的基本概念 模型就是对现实世界特征的模拟和抽象 数据模型是对现实世界数据特征的抽象 对于具体的模型人们并不陌生 如航模飞机 地图和建筑设计沙盘等都是具体的模型 最常用的数据模型分为概念数据模型和基本数据模型 1 概念数据模型 概念数
  • 不拼花哨,只拼实用:unittest指南,干货为王!

    Python为开发者提供了内置的单元测试框架 unittest 它是一种强大的工具 能够有效地编写和执行单元测试 unittest 提供了完整的测试结构 支持自动化测试的执行 能够对测试用例进行组织 并且提供了丰富的断言方法 最终 unit
  • 网络编程基础

    目录 一 网络的概念 1 认识网络 2 网络的发展 二 协议 1 网络问题的产生 2 什么是协议 3 网络协议 三 协议分层 1 协议分层的概念 2 OSI七层模型 3 TCP IP四层 五层 模型 1 物理层 2 数据链路层 网卡层 3
  • 宝塔面板获取默认账号密码

    bt default
  • 安装ssl证书后报错Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.

    刚刚安装完ssl证书后 报错 org apache catalina LifecycleException Protocol handler start failed at org apache catalina connector Con
  • 物联网毕设 -- 智能热水器(GPRS+APP+OneNET)

    目录 前言 一 连线图 1 原理图 2 PCB效果 3 实物效果 4 功能概括 1 硬件端 2 APP端 3 云平台端 演示视频 二 底层代码使用方式 1 使用说明 2 下载程序 3 查看云平台 三 APP使用方式 1 下载APP 1 操作
  • 【XGBoost】第 5 章:XGBoost 揭幕

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 增益带宽积 压摆率

    带宽 它指的是电路可以保持稳定工作的频率范围 选高速运放能减少对贷款的影响 只要能够完美再现方波 就是高带宽电路 带宽与压摆率同时变化 高频下 增益就缩小了 说明增益是有带宽的 在一定频率内增益才稳定 一倍放大 与 10倍放大输出用1 10
  • AntDesign-vue-Tree组件-拖动排序

  • c++primer plus第一章复习题和编程练习答案

    复习题 c 程序的模块是 函数 include
  • MATLAB —— 低通滤波器设计与信号滤波

    百度百科 简介 低通滤波器是容许低于截止频率的信号通过 但高于截止频率的信号不能通过的电子滤波装置 1 提取滤波器 系数矩阵 打开工具 MATLAB APP Filter Designer 参数设置 滤波器类型 Response Type
  • 爬虫实例——某翻译网站参数sign的构造

    1 网页分析 该翻译网站为进行Ajax加载的网站 针对这种网页的爬取 一般有两种方式 使用Selenium等模拟浏览器的方式进行爬取 这种方式实现起来较为简单 但是爬取速度相对较慢 直接对网站的接口进行请求 爬取速度相对较快 但是某些网站的
  • 7 125 kHz RFID技术

    ATA5577C应答器芯片 芯片性能和电路组成 主要技术性能 低功耗 低工作电压 非接触能量供给和读 写数据 工作频率范围为100 150 kHz EEPROM存储器容量为363位 分为11块 每块33位 具有7块用户数据 每块32位 共2
  • 算法分析02--分治法

    3 分治法 3 1递归 递归是指子程序 或函数 直接调用自己或通过一系列调用语句间接调用自己 是一种描述问题和解决问题的常用方法 使用递归技术往往使函数的定义和算法的描述简洁且易千理解 递归有两个基本要素 边界条件 即确定递归到何时终止 也
  • FASTAI and Fine-Tuning BERT with FastAI

    这是一篇笔记类型文章 主要是从新学习一下fastai 和实践 pytorch pretrained BERT 和 pytorch transformers 对接fastai 后简洁快速实现bert模型的训练和执行任务 我还是一个小白 大佬看