文章目录

  • 前言
  • 1. 下载数据集
  • 2.训练一个分词器(tokenizer)
  • 3. 从零开始训练语言模型
    • 定义这个模型的配置文件
    • 建立训练数据集
  • 检查LM是否受过训练
  • 总结

huggingface教程翻译,原文博客地址,cloab地址

前言

在过去的几个月,我们对transformers库和 tokenizers库进行了一些改进,目标是使得从头开始训练新的语言模型变得容易。

在这个demo里,展示了怎么在Esperanto训练一个"small"模型((84 M parameters = 6 layers, 768 hidden size, 12 attention heads)) ,这是和DistilBERT有相同的层和头的数量。然后在下游的词性标注任务进行微调。

1. 下载数据集

首先,在Esperanto上找到数据集文本。这里,我们使用来自INRIA.OSCAR的OSCAR语料库的Esperanto部分,它是一个庞大的多语言语料库,它是通过对网络上Common Crawl转储进行语言分类和过滤得到的。

在数据集的Esperanto部分仅有299M,因此我们将会拼接Leipzig Corpora Collection的Esperanto子语料库,它来自不同的文本,包括(新闻, 文学,维基百科)组成。

最后训练的语料库有3GB,对于你的模型,它仍然是小的,获得的语料越多,预训练效果越好

# in this notebook we'll only get one of the files (the Oscar one) for the sake of simplicity and performance
!wget -c https://cdn-datasets.huggingface.co/EsperBERTo/data/oscar.eo.txt

2.训练一个分词器(tokenizer)

我们选择来训练一个byte-level的字节对编码分词器(像GPT-2),和RoBERTa一样的特殊tokens。我们任意取它的大小为52000。

我们推荐训练byte-level水平的BPE(而不是像BERT的WordPiece tokenizer),因为它将从单个字节的字母表开始构建词汇表,因此,所有的单词都会被分解(不再有标记!)

# We won't need TensorFlow here
!pip uninstall -y tensorflow
# Install `transformers` from master
!pip install git+https://github.com/huggingface/transformers
!pip list | grep -E 'transformers|tokenizers'
# transformers version at notebook update --- 2.11.0
# tokenizers version at notebook update --- 0.8.0rc1
%%time
from pathlib import Pathfrom tokenizers import ByteLevelBPETokenizerpaths = [str(x) for x in Path(".").glob("**/*.txt")]# Initialize a tokenizer
tokenizer = ByteLevelBPETokenizer()# Customize training
tokenizer.train(files=paths, vocab_size=52_000, min_frequency=2, special_tokens=["<s>","<pad>","</s>","<unk>","<mask>",
])

保存文件到磁盘

!mkdir EsperBERTo
tokenizer.save_model("EsperBERTo")

现在有一个vocab.json文件,它是一个按照字符频率排序的列表,还有一个merges.txt的合并文件

{"<s>": 0,"<pad>": 1,"</s>": 2,"<unk>": 3,"<mask>": 4,"!": 5,"\"": 6,"#": 7,"$": 8,"%": 9,"&": 10,"'": 11,"(": 12,")": 13,# ...
}# merges.txt
l a
Ġ k
o n
Ġ la
t a
Ġ e
Ġ d
Ġ p
# ...

我们的tokenizer是根据Esperanto优化的。相比与普通的基于英语的tokenizer,拥有更多的本地单词由一个单独的、未拆分的token表示。例如:在Esperanto中的单词——ĉ、ĝ、ĥ、ĵ、ŝ和ŭ——都是本地编码的。我们还用一种跟有效的方式表示序列。在这个语料库中,编码序列的平均长度比使用预训练的GPT-2标记器时小约30%。

下面是如何在tokenizers中使用它,包括处理RoBERTa中的特殊tokens–当然,你也可以在transformer中使用它。

from tokenizers.implementations import ByteLevelBPETokenizer
from tokenizers.processors import BertProcessingtokenizer = ByteLevelBPETokenizer("./EsperBERTo/vocab.json","./EsperBERTo/merges.txt",
)
tokenizer._tokenizer.post_processor = BertProcessing(("</s>", tokenizer.token_to_id("</s>")),("<s>", tokenizer.token_to_id("<s>")),
)
tokenizer.enable_truncation(max_length=512)
tokenizer.encode("Mi estas Julien.")
tokenizer.encode("Mi estas Julien.").tokens

3. 从零开始训练语言模型

更新:本节遵循run_language_modeling.py脚本,使用新的Trainer。你可以任意挑选你最喜欢的方法。

我们将会训练一个类似RoBERTa的模型,它是一个类似bert的模型但是又有一些改进(详细信息可以看文档)

因为是类似bert的模型,我们训练这个任务在Masked language modeling,例如,预测如何填充我们在数据集中随机屏蔽的任意标记。这是由示例脚本处理的。

# Check that we have a GPU
!nvidia-smi
# Check that PyTorch sees it
import torch
torch.cuda.is_available()

定义这个模型的配置文件

from transformers import RobertaConfigconfig = RobertaConfig(vocab_size=52_000,max_position_embeddings=514,num_attention_heads=12,num_hidden_layers=6,type_vocab_size=1,
)

现在在teansformers中重新创建tokenizer

from transformers import RobertaTokenizerFasttokenizer = RobertaTokenizerFast.from_pretrained("./EsperBERTo", max_len=512)

最后,我们来初始化模型

重要的是:

当我们从头开始训练时,我们只从配置进行初始化,而不是从现有的预先训练过的模型或检查点。

from transformers import RobertaForMaskedLMmodel = RobertaForMaskedLM(config=config)
model.num_parameters()
# => 84 million parameters

建立训练数据集

我们通过应用我们的tokenizer到文本文件来建立我们的数据集。

在这里,因为我们只有一个文本文件,我们甚至不需要自定义我们的Dataset。 我们将使用LineByLineDataset

%%time
from transformers import LineByLineTextDatasetdataset = LineByLineTextDataset(tokenizer=tokenizer,file_path="./oscar.eo.txt",block_size=128,
)

像run_language_modeling.py脚本中描述的一样,我们需要定义一个 data_collator

这是一个小助手,这将帮助我们将数据集的不同样本批处理到一个Pytorch知道如何执行的backprop中.

from transformers import DataCollatorForLanguageModelingdata_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=True, mlm_probability=0.15
)

最后,我们将设置Trainer的初始值

from transformers import Trainer, TrainingArgumentstraining_args = TrainingArguments(output_dir="./EsperBERTo",overwrite_output_dir=True,num_train_epochs=1,per_gpu_train_batch_size=64,save_steps=10_000,save_total_limit=2,
)trainer = Trainer(model=model,args=training_args,data_collator=data_collator,train_dataset=dataset,prediction_loss_only=True,
)

开始训练

%%time
trainer.train()

保存最终的模型(+ tokenizer + config)到磁盘

trainer.save_model("./EsperBERTo")

检查LM是否受过训练

除了查看训练和评估的loss外,检查我们的语言模型是否学习了任何有趣的东西最简单的方法就是通过FillMaskPipeline.

管道是标记器和模型的简单包装器,而“fill-mask”可以让您输入一个包含屏蔽标记的序列(这里是),并返回最可能被填充的序列及其概率的列表。

from transformers import pipelinefill_mask = pipeline("fill-mask",model="./EsperBERTo",tokenizer="./EsperBERTo"
)
# The sun <mask>.
# =>fill_mask("La suno <mask>.")

好的,简单的语法可以工作。 让我们尝试一个更有趣的提示:

fill_mask("Jen la komenco de bela <mask>.")# This is the beginning of a beautiful <mask>.
# =>

总结

最后的上传模型可以直接参考原文

如何使用Transformers和Tokenizers从头开始训练新的语言模型相关推荐

  1. 谷歌新作:视觉Transformer超越ResNet!!!从头开始训练!

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 When Vision Transformers Outperform ResNets without ...

  2. Tensorflow2.0 + Transformers 实现Bert FGM对抗训练惩罚梯度损失函数

    Tensorflow2.0 + Transformers 实现Bert FGM对抗训练惩罚梯度损失函数 前言 变种实现 Transformers中的word_embeddings 代码修改 实验效果 ...

  3. 从头开始训练一个依存分析器

    文章目录 从头开始训练一个依存分析器 重要概念 关系标签 标注关系 应用场景 一.自定义模型 1.导入所需要的包与模块 2.导入训练样本 二.训练模型 1.模型参数的注解(语种.输出目录以及训练迭代次 ...

  4. 从头开始训练一个 NER 标注器

    文章目录 从头开始训练一个 NER 标注器 一.自定义模型 1.导入所需要的包与模块 2.导入训练样本 二.训练模型 1.对现有的模型进行优化 2.创建内置管道组件 3.添加train data的标签 ...

  5. 从头开始训练一个词性标注模型

    文章目录 从头开始训练一个词性标注模型 自定义模型 一.导入所需要的包与模块 二.自定义词性 三.词性标注 训练模型 一.模型参数的注解(语种.输出目录以及训练迭代次数) 二.创建一个空白的语言模型 ...

  6. pytorch:如何从头开始训练一个CNN网络?

    文章目录 前言 一.CNN? 二.用单批量测试模型 1.引入库 2.读入数据集 3. 建造Module实例 4. 训练 总结 前言 在刚开始学习Deep Learning时,一件几乎不可能的事情就是知 ...

  7. mini-imagenet数据处理过程_从头开始训练

    mini-imagenet miniImageNet包含100类共60000张彩色图片,其中每类有600个样本,每张图片的大小被resize到了84×84.这里,这个数据集的训练集和测试集的类别划分为 ...

  8. 从头开始训练自己的 Tesseract 5 LSTM 识别库(超详细)

    最新工作中涉及到OCR的内容,用了百度的OCR精度不错,但是速度有点慢,看网上有提到Tesseract这一开源的项目,下载试了一试发现速度是比百度快不少,但是精度差很多,所以研究了下怎么可以提高识别的 ...

  9. 深度学习笔记13_猫狗分类案例 - 从头开始训练一个神经网络

    在小型数据集上从头开始训练一个卷积神经网络 小型数据集的模型构建的策略 小型数据集:"很少的"样本可能是几百张图像,也可能是几万张图像. 接下来的示例中,主要用来猫狗分类:4000 ...

最新文章

  1. 如何锁定计算机硬盘,Win7系统怎么锁住磁盘|Win7系统锁住磁盘的详细步骤
  2. mongodb 主从配置,带auth验证模式
  3. 产品经理必备知识之网页设计系列(一)-创建出色用户体验
  4. 货物移动_免费收货(MvT511)
  5. x-code 4.61 无证书真机调试
  6. VTK:绘制BorderPixelSize边框像素大小用法实战
  7. 错误An entity with the same identity already exists in this EntitySet RIA
  8. H3C S1526交换机端口镜像配置
  9. visio2007大括号_Microsoft Office Visio如何绘制大括号及其他特殊符号?Microsoft Office Visio绘制大括号及其他特殊符号的方法教程...
  10. CCNA学习指南 第七章 下载
  11. html5网页设计大作业-dw企业网页设计带图片轮播留言 hbuilder大学生网页设计作业成品模板|百岁山矿泉水网页设计
  12. python如何截长图_Python网页截图/屏幕截图/截长图如何实现?
  13. robocode机器人案例
  14. 数据库设计—图书管理数据库系统设计
  15. 计算机中计算排名用什么公式,最全面的Excel函数排名公式汇总
  16. CSS3技巧:利用css3径向渐变做一张优惠券
  17. python打开ie浏览器_python+selenium启动IE浏览器
  18. 新疆上半年工业品价格总水平创十七年新低
  19. 计算机连接网络被限制,电脑本地连接受限制或无连接怎么办?
  20. 算法设计例题分析 食物链

热门文章

  1. ThinkpadT420加装上网卡
  2. PEST分析顺丰服务需求_顺丰内外部环境分析.doc
  3. 呆萝卜与每日优鲜竞品分析
  4. Redis docker安装及redis.conf配置文件解析
  5. int类型的整数能够表示的最大数字
  6. js函数提升和变量提升_关于在js中提升的真相
  7. 存储系统性能 - 带宽计算
  8. 【bioinfo】sam文件可选区域字段(Optional Feild)含义
  9. 什么是SEO,为什么要做SEO?
  10. mongo connect error no reachable servers