transformers学习笔记1.一些基本概念和编码器字典(代码片段)

编程圈子 编程圈子     2023-02-24     698

关键词:

Transformers学习笔记1. 一些基本概念和编码器、字典

一、基本概念

1. Hugging Face简介

Hugging Face是一家纽约的聊天机器人初创服务商,他们开源了Transformers库,并在开源社区大火起来,其官网地址: https://huggingface.co/


Hugging Face的主要模型可以大致分为几类:

  • 自回归:GPT2, Transfoer-XL, XLNet
  • 自编码:BERT, ALBERT, RoBERTa, ELECTRA
  • Sequence to Sequence: BART, Pegasus, T5

2. Transformers

(1)简介

Transformers是一个NLP自然语言处理库。
开源地址:
https://github.com/huggingface/transformers
文档地址:
https://huggingface.co/docs/transformers/index
教程地址:
https://huggingface.co/transformers/v3.0.2/quicktour.html

安装Transforms可以使用pip:

pip install transformers

(1)预定义模型

Transformers默认框架为PyTorch,也支持TensorFlow,内置了以下神经网络:

  • T5 model
  • DistilBERT model
  • ALBERT model
  • CamemBERT model
  • XLM-RoBERTa model
  • Longformer model
  • RoBERTa model
  • Reformer model
  • Bert model
  • OpenAI GPT model
  • OpenAI GPT-2 model
  • Transformer-XL model
  • XLNet model
  • XLM model
  • CTRL model
  • Flaubert model
  • ELECTRA model

每种模型至少一个预训练模型,在下面这个网址可以找到预训练模型:
https://huggingface.co/models
示例:bert-base-chinese 模型说明界面:

每种模型会围绕三种类型的类构建:

  1. 模型类 model
  2. 配置类 configuration
  3. 编码解码等 tokenizer 类

这些类实例化后,有两种方法在本地保存:

  1. from_pretrained():
  2. save_pretrained()

(2)使用方法

使用Transformers有三种方法:

  • 使用pipeline
  • 指定预训练模型
  • 使用AutoModels 加载预训练模型
    本文主要介绍pipeline。

3. Datasets

Hugging Face的数据集。

pip install datasets

加载数据集示例:

from datasets import load_dataset
datasets = load_dataset("madao33/new-title-chinese")
print(datasets)

查看有哪些公开数据集

方法1: 使用datasets包的list_datasets方法

from datasets import list_datasets
list_datasets()[:10]
# 打印值:
['acronym_identification', 'ade_corpus_v2', 'adversarial_qa', 'aeslc', 'afrikaans_ner_corpus', 'ag_news', 'ai2_arc', 'air_dialogue', 'ajgt_twitter_ar', 'allegro_reviews']

方法2:到网站查看

https://huggingface.co/datasets

二、一些编码器知识

1. BPE算法

全称是byte pair encoder,字节对编码。可以理解为一种压缩算法,把出现频繁最高的字符对用新的字符替换,反复迭代,这样可以减少语料库的数量。

2. WordPiece算法

与BPE算法类似,但在合并时会引入概率计算,选择可以最大化训练数据可能性的组合 ,从而进一步优化合并结果。

3. SentencePiece

SentencePiece是一个无监督的文本标记器和去标记器,主要用于基于神经网络的文本生成系统,它是一个谷歌开发的开源工具。开源地址:
https://github.com/google/sentencepiece

4. tokenizer

tokenizer称为编码器或分词器。自然语言处理中,首先要把句子分词转化为唯一编码。
spaCy和Moses是两个较流行的基于规则的tokenizer。

(1)spaCy

在其官网: https://spacy.io/usage/spacy-101
可以直接在线运行一个demo。

示例中对句子:
Apple is looking at buying U.K. startup for $1 billion进行分析,并输出单词的属性。其中pos_可以大致理解为单词是形容词、副词、动词之类属性, dep_更复杂一些,后面有时间再详细讲解。

Apple PROPN nsubj
is AUX aux
looking VERB ROOT
at ADP prep
buying VERB pcomp
U.K. PROPN dobj
startup NOUN dobj
for ADP prep
$ SYM quantmod
1 NUM compound
billion NUM pobj

(2)Moses

官网:http://www2.statmt.org/moses/
Moses 是一个统计机器翻译系统。

2. transformers编码规则

transformers 模型对语句采用了词级切分和字符级切分的混合,称为子词(subword)切分。该算法依赖这样一种原则 :

  • 常用词不应该被拆分
  • 非常用词应被切分为更有意义的词。
    子词切分是在模型维护的词汇量、保持单词语义方面的一种折衷。

3. 使用tokenizer编解码

(1)使用encode编码函数

from transformers import BertTokenizer

# 定义模型、语料
tokenizer = BertTokenizer.from_pretrained(
	# 预加载模型
    pretrained_model_name_or_path='bert-base-chinese',
    cache_dir=None,
    force_download=False
)

sents = [
    '今天是星期一。',
    '今天天气很好',
    '今天电脑运行有点故障',
    '电脑硬盘好像坏了,读不出数据。'
]

print(tokenizer)
# 打印结果
PreTrainedTokenizer(name_or_path='bert-base-chinese', vocab_size=21128, model_max_len=512, is_fast=False, padding_side='right', truncation_side='right', special_tokens='unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]')

out = tokenizer.encode(
	# 输入的语料
    text=sents[0],
    # 可以输入两条语料
    text_pair=sents[1],
    # 句子长度大于下面的max_length时,是否截断
    truncation=True,
    # 长度不到max_length时,是不是补pad
    padding='max_length',
    
    add_special_tokens=True,
    # 最大长度
    max_length=30,
    # 返回的数据类型不指定,默认为list
    return_tensors=None
)

print(out)
# 打印的结果
[101, 791, 1921, 3221, 3215, 3309, 671, 511, 102, 791, 1921, 1921, 3698, 2523, 1962, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

decodeTxt = tokenizer.decode(out)
print(decodeTxt)
# 打印的结果
[CLS] 今 天 是 星 期 一 。 [SEP] 今 天 天 气 很 好 [SEP] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD]

Tokenizer对中文的处理比较简单,每个汉字都作为一个词。

(2)使用增强编码函数

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained(
    pretrained_model_name_or_path='bert-base-chinese',
    cache_dir=None,
    force_download=False
)

sents = [
    '今天是星期一。',
    '今天天气很好',
    '今天电脑运行有点故障',
    '电脑硬盘好像坏了,读不出数据。'
]

print(tokenizer, sents)

out = tokenizer.encode_plus(
    text=sents[0],
    text_pair=sents[1],
    truncation=True,
    padding='max_length',
    add_special_tokens=True,
    max_length=30,
    # 返回类型,可以是tf(tensorflow),pt(pytorch),np(numpy),默认返回list
    return_tensors=None,
    # 是否返回token_type_ids,结果第一个句子和特殊符号的位置是0,第二个句子的位置是1
    return_token_type_ids=True,
    # 是否返回attention_mask,pad的位置是0,其它位置是1
    return_attention_mask=True,
    # 是否返回special_tokens_mask,特殊符号的位置是1,其它位置是0
    return_special_tokens_mask=True,
    # 返回 length 标识的长度
    return_length=True
)
for k, v in out.items():
    print(k, ':', v)

tokenizer.decode(out['input_ids'])

# 输出结果:
PreTrainedTokenizer(name_or_path='bert-base-chinese', vocab_size=21128, model_max_len=512, is_fast=False, padding_side='right', truncation_side='right', special_tokens='unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]') ['今天是星期一。', '今天天气很好', '今天电脑运行有点故障', '电脑硬盘好像坏了,读不出数据。']
# 和简单编码结果一样
input_ids : [101, 791, 1921, 3221, 3215, 3309, 671, 511, 102, 791, 1921, 1921, 3698, 2523, 1962, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# 第2个句子的位置是1
token_type_ids : [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# 特殊符号位置是1
special_tokens_mask : [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
# pad位置是0,其它是1
attention_mask : [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# 句子的长度
length : 30

(3)批量编码、解码句子

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained(
    pretrained_model_name_or_path='bert-base-chinese',
    cache_dir=None,
    force_download=False
)

sents = [
    '今天是星期一。',
    '今天天气很好',
    '今天电脑运行有点故障',
    '电脑硬盘好像坏了,读不出数据。'
]

print(tokenizer, sents)

out = tokenizer.batch_encode_plus(
    batch_text_or_text_pairs=[sents[0], sents[1]],
    truncation=True,
    padding='max_length',
    add_special_tokens=True,
    max_length=30,
    # 返回类型,可以是tf(tensorflow),pt(pytorch),np(numpy),默认返回list
    return_tensors=None,
    # 是否返回token_type_ids,结果第一个句子和特殊符号的位置是0,第二个句子的位置是1
    return_token_type_ids=True,
    # 是否返回attention_mask,pad的位置是0,其它位置是1
    return_attention_mask=True,
    # 是否返回special_tokens_mask,特殊符号的位置是1,其它位置是0
    return_special_tokens_mask=True,
    # 返回 length 标识的长度
    return_length=True
)
for k, v in out.items():
    print(k, ':', v)

print(tokenizer.batch_decode(out['input_ids']))

输出结果:

PreTrainedTokenizer(name_or_path='bert-base-chinese', vocab_size=21128, model_max_len=512, is_fast=False, padding_side='right', truncation_side='right', special_tokens='unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]') ['今天是星期一。', '今天天气很好', '今天电脑运行有点故障', '电脑硬盘好像坏了,读不出数据。']
input_ids : [[101, 791, 1921, 3221, 3215, 3309, 671, 511, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [101, 791, 1921, 1921, 3698, 2523, 1962, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
token_type_ids : [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
special_tokens_mask : [[1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
length : [9, 8]
attention_mask : [[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
['[CLS] 今 天 是 星 期 一 。 [SEP] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD]', '[CLS] 今 天 天 气 很 好 [SEP] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD]']

4. 字典操作

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained(
    pretrained_model_name_or_path='bert-base-chinese',
    cache_dir=None,
    force_download=False
)

sents = [
    '今天是星期一。',
    '今天天气很好',
    '今天电脑运行有点故障',
    '电脑硬盘好像坏了,读不出数据。'
]

print(tokenizer, sents)

# 定义字典
dict = tokenizer.get_vocab()
print(type(dict), len(dict), '天气' in dict)

# 添加新词
tokenizer.add_tokens(new_tokens=['今天', '天气', '星期一'])
dict = tokenizer.get_vocab()
print(type(dict), len(dict), '天气' in dict)
# 添加新符号
tokenizer.add_special_tokens('eos_token':'[EOS]')
dict = tokenizer.get_vocab()
print(type(dict), len(dict), '天气' in dict)


out = tokenizer.batch_encode_plus(
    batch_text_or_text_pairs=[(sents[0], sents[1])],
    truncation=True,
    padding='max_length',
    add_special_tokens=True,
    max_length=30,
    # 返回类型,可以是tf(tensorflow),pt(pytorch),np(numpy),默认返回list
    return_tensors=None,
    # 是否返回token_type_ids,结果第一个句子和特殊符号的位置是0,第二个句子的位置是1
    return_token_type_ids=True,
    # 是否返回attention_mask,pad的位置是0,其它位置是1
    return_attention_mask=True,
    # 是否返回special_tokens_mask,特殊符号的位置是1,其它位置是0
    return_special_tokens_mask=True,
    # 返回 length 标识的长度
    return_length=True
)
for k, v in out.items():
    print(k, ':', v)

print(tokenizer.batch_decode(out['input_ids']))

输出结果:

PreTrainedTokenizer(name_or_path='bert-base-chinese', vocab_size=21128, model_max_len=512, is_fast=False, padding_side='right', truncation_side='right', special_tokens='unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]'数据结构与算法学习笔记:数据结构基本概念(代码片段)

数据结构与算法基础学习笔记(1):数据结构基本概念​本系列笔记为跟着B站上王卓老师的教程学习所记录的笔记文章目录数据结构与算法基础学习笔记(1):数据结构基本概念一.基本概念和术语1.数据2.数据元素3.数据项4.数据对象5.... 查看详情

spark的transformation和action的操作学习笔记

一、spark的transformation和action区别Spark有一些基本的transformation和action的操作,其中transformation形成各类型的RDD,action不形成RDD,而是对RDD进行累加、合并、保存操作。650)this.width=650;"src="http://s3.51cto.com/wyfs02/M02/87/C7/wKioL1fh3Knhq 查看详情

rabbitmq学习笔记2基本概念

官网:http://www.rabbitmq.com 参考:http://blog.csdn.net/column/details/rabbitmq.html 1基本概念rabbitmqserver(brokerserver):rabbitmq服务client:包括producers和consumermessage:包括payload和labelexchange:produce 查看详情

linuxbpf学习笔记-基本概念[1](代码片段)

【Linux】BPF学习笔记-基本概念[1]本学习笔记来自于阅读BrendanGregg的《BPFPerformanceTools》一、介绍数据包筛选器(BPF)是一种内核执行引擎,用于处理虚拟指令集,并且最近进行了扩展(又称eBPF),这使BPF变成了通用执行引擎... 查看详情

学习笔记elasticsearch(es)基本概念和语句学习笔记(代码片段)

一、ES概念1.ESElasticSearch又称ES,是一个开源的高扩展的分布式全文搜索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。Elasticsearch是面向文档型数据... 查看详情

sas学习笔记-基本原理与概念

1.赋值符号  由一个尖括号和一个符号组成,可以从左到右也可以从右到左,即“->”或者“<-”。  赋值号也可以使用等号“=”。  如果对象已经存在,那么原先的值会被覆盖。除了可以赋一个数值,... 查看详情

[机器学习]ufldl笔记-autoencodersandsparsity

前言  [机器学习]UFLDL笔记系列是以我学习UFLDLTutorial(AndrewNg老师主讲)时的笔记资料加以整理推出的,内容以无监督特征学习和深度学习为主,同时也参考了大量网上的相关资料。  本文的理论部分主要整理... 查看详情

计算机视觉算法——transformer学习笔记

算机视觉算法——Transformer学习笔记计算机视觉算法——Transformer学习笔记1.VisionTransformer1.1网络结构1.2关键知识点1.2.1Self-Attention1.2.2PositionalEmbedding1.2.3LayerNormalization2.SwinTransformer2.1网络结构2.2关键知识点2.2.1W-MSA和SW-WSA结构2. 查看详情

[机器学习]ufldl笔记-sparsecoding(稀疏编码)

前言  [机器学习]UFLDL笔记系列是以我学习UFLDLTutorial(AndrewNg老师主讲)时的笔记资料加以整理推出的,内容以无监督特征学习和深度学习为主,同时也参考了大量网上的相关资料。  本文的理论部分主要整理... 查看详情

[java学习笔记]java核心技术卷1第四章

  第4章对象与类4.1类和对象的基本概念描述了类和对象的基本概念,以及类之间的关系介绍。程序中的很多对象来自于标准库,还有一些自定义的。结构化程序设计:通过设计一系列的过程(算法),选择合适的存储方式来... 查看详情

分布式基本概念

  从这周开始深入学习Zookeeper,主要是看PAXOS到ZOOKEEPER分布式一致性理论与实践以及Zookeeper3.5的源码,在整个学习过程中会整理一些学习笔记。  1.分布式基本概念  分布式系统是一个硬件或者软件组件分布在不同网络计... 查看详情

java学习笔记

一、基本概念1.1常量池概念。1.java的数据类型。  int、Integer:  long、Long:  float、Double:  bigdecimal:  char、Character:  String:  Stringbuffer、Stringbuilder: 一、基本概念 1.1常量池概念。 1.java的数据类型。&nb... 查看详情

深度学习+面经transformer网络学习笔记

...3.1优点3.2缺点4应用领域5面经5.1第一部分5.2第二部分1引言Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。更准确地讲,Transformer主要由多头self-Attenion和FeedForwardNeuralNetwork组成。一个基于Transformer... 查看详情

php学习笔记day1--基本概念,及原理

... 作为一个php新手,我一直在寻找着一种快速而有效的学习方法,最后发现,快速掌握知识最快的方法就是输出,把自己学过的知识从新整理,拿出来给大家看,同时也要学会总结归纳,同一些高手交流,才能最快把知识融入... 查看详情

kafka学习笔记一:基本概念

zookeeper:负责集群元数据管理、控制器的选举等操作producer:将消息发送到brokerbroker:将收到的消息存储到磁盘中consumer:负责从broker订阅并消费消息topic:消息主题(逻辑概念),生产者和消费者都以topic为单位进行生产和消费partition:... 查看详情

斯坦福2014机器学习笔记一----基本概念

  一、纲要    机器学习的定义    监督学习(supervisedlearning)和无监督学习(unsupervisedlearning)    回归问题(regressionproblem)与分类问题(classificationproblem)    鸡尾酒宴问题    单变量线性回归问题   二... 查看详情

简约机器学习复习笔记/速查手册

阅读过一些大家公布在网上自己的机器学习笔记,向这些作者至敬,深知总结和发布文章的不易。这篇文章与其他笔记不同,目的在于快速的帮助回忆起一些概念和算法/模型的结构,基本公式。所以,不会出现有大段的公式推... 查看详情

docker学习笔记docker相关概念,基本操作

计划:Docker学习笔记【2】Docker基础操作实操记录,Docker仓库、数据卷,网络基础学习---40注:所有操作在root下执行--1--概念:1、Docker镜像:镜像就是一个只读的模板,用于创建docker容器。Docker提供了简单的机制创建或者更新现... 查看详情