【Transformers基础入门篇4】基础组件之Model

文章目录

  • 一、Model简介
    • 1.1 Transformer
    • 1.2 注意力机制
    • 1.3 模型类型
  • 二、Model Head
    • 2.1 什么是 Model Head
    • 2.2 Transformers中的Model Head
  • 三、Model基本使用方法
    • 3.0 模型下载-浏览器下载
    • 3.1 模型加载与保存
    • 3.2 配置加载参数
    • 3.3 加载config文件
    • 3.2 模型调用
      • 3.2.1 带ModelHead的调用
      • 3.2.2 不带ModelHead的调用
      • 3.2.3带ModelHead的调用
  • 四、模型微调代码实例


本文为 https://space.bilibili.com/21060026/channel/collectiondetail?sid=1357748的视频学习笔记

项目地址为:https://github.com/zyds/transformers-code


一、Model简介

1.1 Transformer

既然这个包的名字叫Transformers,那么大部分整个模型都是基于Transformer架构。

  • 原始的Tranformer为编码器(Encoder)、解码器(Decoder)模型
  • Encoder部分接收输入并构建其完整的特征表示,Decoder部分使用Encoder的编码结果以及其他的输入生成目标序列
  • 无论是编码器还是解码器,均由多个TransformerBlock堆叠而成
  • TransformerBloc由注意力机制(Attention)和FFN组成。

1.2 注意力机制

  • 注意力机制的使用是Transformer的一个核心特征,在计算当前次的特征表示时,可以通过注意力机制有选择性的告诉模型使用哪些上下文
    在这里插入图片描述

1.3 模型类型

  • 编码器模型:自编码模型,使用Encoder,拥有双向的注意力机制,即计算每一个词的特征都看到完整的上下文
  • 解码器模型:自回归模型,使用Decoder,拥有单向的注意力机制,即计算每一个词的特征时,都只能看到上文,无法看到下文
  • 编码器解码器模型:序列到序列模型,使用Encoder+Decoder,Encoder部分拥有双向的注意力,Decoder部分使用单向注意力
    在这里插入图片描述

二、Model Head

2.1 什么是 Model Head

  • Model Head是连接在模型后的层,通常为1个或多个全连接层
  • Model Head将模型的编码的表示结果进行映射,以解决不同类型的任务
    在这里插入图片描述

2.2 Transformers中的Model Head

  • *Model: 模型本身,只返回编码结果
  • *ForCausalLM: 纯的解码器模型
  • *ForMaskedLM:像Bert那种,在句子中随机Mask一些token,然后来预测token是什么
  • *ForSeq2SeqLM: 序列到序列的模型
  • *ForMultipleChoice:多项选择任务
  • *ForQuestionAnswering
  • *ForSequenceClassification
  • *ForTokenClassification
  • …其他

下图是Bert刚提出来时,给出的不同任务的解决方案

  • 句子对分类:取CLS 分类
  • 单一句子分类 取CLS 分类
  • 问答: 将Question和Paragraph同时输入,然后对Paragraph做两个全连接,记住起始和结束位置。
  • NER任务(命名实体识别):对每一个token进行分类
    在这里插入图片描述

三、Model基本使用方法

3.0 模型下载-浏览器下载

https://huggingface.co/hfl/rbt3/tree/main
自行下,然后放到hfl/rbt3文件夹
在这里插入图片描述
也可以通过代码下载,在huggingface模型上选
在这里插入图片描述

!git clone "https://huggingface.co/hfl/rbt3"  # 会下载所有模型,包括tf、flax模型
!git lfs clone "https://huggingface.co/hfl/rbt3" --include="*.bin" # 仅下载pytorch模型

3.1 模型加载与保存

在HuggingFace上选一个小模型 hfl/rbt3

from transformers import AutoConfig, AutoModel, AutoTokenizer
model = AutoModel.from_pretrained("../../models/hfl/rbt3")

3.2 配置加载参数

model.config

3.3 加载config文件

# 加载config文件
config = AutoConfig.from_pretrained("../../models/hfl/rbt3")
config

输出BertConfig,那么我们就可以进入BertConfig来看具体的参数
在这里插入图片描述from transformers import BertConfig
查看BertConfig

class BertConfig(PretrainedConfig):r"""This is the configuration class to store the configuration of a [`BertModel`] or a [`TFBertModel`]. It is used toinstantiate a BERT model according to the specified arguments, defining the model architecture. Instantiating aconfiguration with the defaults will yield a similar configuration to that of the BERT[google-bert/bert-base-uncased](https://huggingface.co/google-bert/bert-base-uncased) architecture.Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read thedocumentation from [`PretrainedConfig`] for more information.Args:vocab_size (`int`, *optional*, defaults to 30522):Vocabulary size of the BERT model. Defines the number of different tokens that can be represented by the`inputs_ids` passed when calling [`BertModel`] or [`TFBertModel`].hidden_size (`int`, *optional*, defaults to 768):Dimensionality of the encoder layers and the pooler layer.num_hidden_layers (`int`, *optional*, defaults to 12):Number of hidden layers in the Transformer encoder.num_attention_heads (`int`, *optional*, defaults to 12):Number of attention heads for each attention layer in the Transformer encoder.intermediate_size (`int`, *optional*, defaults to 3072):Dimensionality of the "intermediate" (often named feed-forward) layer in the Transformer encoder.hidden_act (`str` or `Callable`, *optional*, defaults to `"gelu"`):The non-linear activation function (function or string) in the encoder and pooler. If string, `"gelu"`,`"relu"`, `"silu"` and `"gelu_new"` are supported.hidden_dropout_prob (`float`, *optional*, defaults to 0.1):The dropout probability for all fully connected layers in the embeddings, encoder, and pooler.attention_probs_dropout_prob (`float`, *optional*, defaults to 0.1):The dropout ratio for the attention probabilities.max_position_embeddings (`int`, *optional*, defaults to 512):The maximum sequence length that this model might ever be used with. Typically set this to something largejust in case (e.g., 512 or 1024 or 2048).type_vocab_size (`int`, *optional*, defaults to 2):The vocabulary size of the `token_type_ids` passed when calling [`BertModel`] or [`TFBertModel`].initializer_range (`float`, *optional*, defaults to 0.02):The standard deviation of the truncated_normal_initializer for initializing all weight matrices.layer_norm_eps (`float`, *optional*, defaults to 1e-12):The epsilon used by the layer normalization layers.position_embedding_type (`str`, *optional*, defaults to `"absolute"`):Type of position embedding. Choose one of `"absolute"`, `"relative_key"`, `"relative_key_query"`. Forpositional embeddings use `"absolute"`. For more information on `"relative_key"`, please refer to[Self-Attention with Relative Position Representations (Shaw et al.)](https://arxiv.org/abs/1803.02155).For more information on `"relative_key_query"`, please refer to *Method 4* in [Improve Transformer Modelswith Better Relative Position Embeddings (Huang et al.)](https://arxiv.org/abs/2009.13658).is_decoder (`bool`, *optional*, defaults to `False`):Whether the model is used as a decoder or not. If `False`, the model is used as an encoder.use_cache (`bool`, *optional*, defaults to `True`):Whether or not the model should return the last key/values attentions (not used by all models). Onlyrelevant if `config.is_decoder=True`.classifier_dropout (`float`, *optional*):The dropout ratio for the classification head.Examples:```python>>> from transformers import BertConfig, BertModel>>> # Initializing a BERT google-bert/bert-base-uncased style configuration>>> configuration = BertConfig()>>> # Initializing a model (with random weights) from the google-bert/bert-base-uncased style configuration>>> model = BertModel(configuration)>>> # Accessing the model configuration>>> configuration = model.config```"""

3.2 模型调用

3.2.1 带ModelHead的调用

sen = "弱小的我也有大梦想!"
tokenizer = AutoTokenizer.from_pretrained("../../models/hfl/rbt3")
inputs = tokenizer(sen, return_tensors="pt")
output = model(**inputs)

3.2.2 不带ModelHead的调用

model = AutoModel.from_pretrained("../../models/hfl/rbt3", output_attentions=True)
output = model(**inputs)
output.last_hidden_state.size() # 输出序列的输入编码的维度
len(inputs["input_ids"][0]) # 查看输入ID的长度

输出的12就是字的长度
在这里插入图片描述

3.2.3带ModelHead的调用

from transformers import AutoModelForSequenceClassification, BertForSequenceClassification
clz_model = AutoModelForSequenceClassification.from_pretrained("../../models/hfl/rbt3")
clz_model(**inputs)

输出可以看到任务是一个文本分类任务,输出loss,logits .
这时候logits还只有一个二分类模型,我们可以调整成10类
在这里插入图片描述

clz_model = AutoModelForSequenceClassification.from_pretrained("../../models/hfl/rbt3", num_labels=10)
clz_model(**inputs)

在这里插入图片描述
那么怎么看num_labels参数呢?
定位到 BertForSequenceClassification类实现里看到 config里有num_labels

class BertForSequenceClassification(BertPreTrainedModel):def __init__(self, config):super().__init__(config)self.num_labels = config.num_labelsself.config = configself.bert = BertModel(config) classifier_dropout = (config.classifier_dropout if config.classifier_dropout is not None else config.hidden_dropout_prob)self.dropout = nn.Dropout(classifier_dropout)self.classifier = nn.Linear(config.hidden_size, config.num_labels)# Initialize weights and apply final processingself.post_init()

四、模型微调代码实例

  • 任务类型: 文本分类

  • 使用模型: hfl/rbt3

  • 数据集地址 https://github.com/SophonPlus/ChineseNlpCorpus

  • Step1 导入相关包

from transformers import AutoTokenizer, AutoModelForSequenceClassification,BertForSequenceClassification
  • Step2 加载数据
import pandas as pd
data = pd.read_csv("./ChnSentiCorp_htl_all.csv")
data = data.dropna() # 清除数据损坏的部分
  • Step3 创建Dataset

class MyDataset(Dataset):def __init__(self) -> None:super().__init__()self.data = pd.read_csv("./ChnSentiCorp_htl_all.csv")self.data = self.data.dropna()def __getitem__(self, index):return self.data.iloc[index]["review"], self.data.iloc[index]["label"]def __len__(self):return len(self.data)
dataset = MyDataset()
for i in range(5):print(dataset[i])

在这里插入图片描述

  • Step4 划分数据集
rom torch.utils.data import random_split
trainset, validset = random_split(dataset, lengths=[0.9, 0.1])
len(trainset), len(validset)
  • Step5 创建Dataloader

这里读取数据,然后写处理函数传到Dataloder中collate_fn,可以实现批量处理

import torchtokenizer = AutoTokenizer.from_pretrained("../../models/hfl/rbt3")def collate_func(batch):texts, labels = [], []for item in batch:texts.append(item[0])labels.append(item[1])# truncation=True 过长做截断inputs = tokenizer(texts, max_length=128, padding="max_length", truncation=True, return_tensors="pt")inputs["labels"] = torch.tensor(labels)return inputs
from torch.utils.data import DataLoadertrainloader = DataLoader(trainset, batch_size=32, shuffle=True, collate_fn=collate_func)
validloader = DataLoader(validset, batch_size=64, shuffle=False, collate_fn=collate_func)# 查看loader
next(enumerate(validloader))[1]
  • step6 创建模型以及优化器
from torch.optim import Adammodel = AutoModelForSequenceClassification.from_pretrained("../../models/hfl/rbt3")if torch.cuda.is_available():model = model.cuda()
optimizer = Adam(model.parameters(), lr=2e-5)
  • step7 训练与验证
def evaluate():model.eval()acc_num = 0with torch.inference_mode():for batch in validloader:if torch.cuda.is_available():batch = {k: v.cuda() for k, v in batch.items()}output = model(**batch)pred = torch.argmax(output.logits, dim=-1)acc_num += (pred.long() == batch["labels"].long()).float().sum()return acc_num / len(validset)def train(epoch=3, log_step=100):global_step = 0for ep in range(epoch):model.train()for batch in trainloader:if torch.cuda.is_available():batch = {k: v.cuda() for k, v in batch.items()}optimizer.zero_grad()output = model(**batch)output.loss.backward()optimizer.step()if global_step % log_step == 0:print(f"ep: {ep}, global_step: {global_step}, loss: {output.loss.item()}")global_step += 1acc = evaluate()print(f"ep: {ep}, acc: {acc}")
  • step9 模型训练与预测
train()
# sen = "我觉得这家酒店不错,饭很好吃!"
sen = "我觉得这家酒店太差了,饭很难吃!"
id2_label = {0: "差评!", 1: "好评!"}
model.eval()
with torch.inference_mode():inputs = tokenizer(sen, return_tensors="pt")inputs = {k: v.cuda() for k, v in inputs.items()}logits = model(**inputs).logitspred = torch.argmax(logits, dim=-1)print(f"输入:{sen}\n模型预测结果:{id2_label.get(pred.item())}")

尝试pipeline

from transformers import pipelinemodel.config.id2label = id2_label
pipe = pipeline("text-classification", model=model, tokenizer=tokenizer, device=0)
pipe(sen)

输出如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148797.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

*C++:string

一.STL简介 1.STL STL(standard template libaray- 标准模板库 ) : 是 C 标准库的重要组成部分 ,不仅是一个可复用的组件库,而且 是一个包罗数据结构与算法的软件框架 。 2.STL六大组件 二.标准库里的string类 标准string库网址&#xff1…

朴世龙团队《Global Change Biology 》研究成果!揭示生物累积效应对秋季叶片衰老的重要调节作用!

本文首发于“生态学者”微信公众号! 在全球气候变化的背景下,生态系统的季节性变化,尤其是植物的春季叶片展开和秋季叶片衰老(EOS),对碳循环和区域气候调节起着至关重要的作用。然而,关于秋季叶…

腾讯云点播及声音上传

文章目录 1、开通腾讯云点播2、获取腾讯云API密钥3、完成声音上传3.1、引入依赖3.2、参考:接入点地域3.3、参考:任务流设置3.4、首先修改配置:3.4.1、 3.5、TrackInfoApiController --》 uploadTrack()3.6、VodServiceImpl --》 uploadTrack(…

计算存款利息-C语言

1.问题: 假设有本金1000元,想存一年,有三种方法可选择: A活期,年利率为0.0036; B一年期定期,年利率为0.0225; C存两次半年定期,年利率为0.0198。 请分别计算出一年后…

帮13岁小孩哥2分钟完成开发,这位AI程序员究竟是何方神圣?

通义灵码再升级,真AI程序员来了 随着通义系列基础模型能力的全面提升,各个具体领域的应用模型也随之飞升。这次在云栖大会上迎来重磅升级的,就包括用于代码生成的通义灵码。 一年前的通义灵码还只能完成基础的辅助编程任务,很难…

加快软件项目开发进度的6大技巧

加快软件项目的开发进度对于项目的成功与市场竞争力的提升至关重要。此举能够迅速响应市场变化,抢占市场先机,增强竞争力,同时降低开发成本,提升用户满意度。因此,加速开发是确保项目成功与市场竞争力的核心要素。若未…

捷途旅行者8月燃油SUV销量夺冠,遥遥领先!

2023年9月,捷途旅行者这款国内首款旅行越野SUV,如同一匹黑马般闯入国内汽车市场,凭借其方正硬朗的造型与13.99万元的亲民起售价,迅速点燃了消费者的购车热情。时隔一年,这款车的魅力依旧不减,2024年8月的销…

利用Leaflet.js集成强大的船舶管理页面:集成标记/路线/区域绘制和动态显隐功能

引言 在船舶管理领域,地理信息系统(GIS)技术的应用日益广泛。通过GIS技术,管理人员可以实时监控船舶的位置、航线以及与其他重要地理位置的关系。Leaflet.js作为一个轻量级但功能强大的前端地图框架,使得在Web页面上集…

如何用AI论文生成工具撰写一篇高质量的成人教育毕业论文

撰写一篇高质量的成人教育毕业论文并不简单,它有一定的步骤和策略。锐智AI今天就总结了一些关键的步骤,希望对即将毕业的你顺利完成论文写作: 介绍之前简单说下锐智AI,它是一款集论文大纲生成、内容填充、文献引用、查重修改于一…

Microsoft Edge WebView2运行时安装包获取

目前越来越多的软件将WebView2当做运行时,发现一些精简版的系统精简掉了WebView2或者人为误删除,一些软件无法正常运行,我们可以重新安装即可 浏览器访问WebView2官方页面 https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/ …

头戴式耳机百元以内都有哪些推荐?头戴式耳机百元测评推荐

今天跟大家聊一聊头戴式耳机,无论是沉浸在游戏的世界中,还是专注于观看视频课程汲取知识,它都能为我们带来清晰、震撼的音质体验。对程序员来说,在嘈杂的工作环境中(比如机房里),它的降噪功能显…

CVE-2024-44902 Thinkphp反序列化漏洞

Thinkphp v6.1.3至v8.0.4版本中存在反序列化漏洞&#xff0c;攻击者可利用此漏洞执行任意代码。 影响版本 v6.1.3 < thinkphp < v8.0.4 环境搭建 环境&#xff1a;php8.0.2thinkphp8.0.4memcached3.2.0 首先搭建 thinkphp 环境&#xff1a;thinkPHP 8.0.4 安装_thin…

02 BlockChain-- ETH

以太坊与比特币有什么不同&#xff1f; 以太坊立足比特币创新之上&#xff0c;于 2015 年启动&#xff0c;两者之间有一些显著不同。 从宏观的方面&#xff1a; 比特币就仅仅是比特币&#xff1b;以太坊&#xff08;Ethereum&#xff09;包括以太币&#xff08;Ether&#x…

Python可迭代对象(2)

目录 3。字典 字典的构造 字典的添加和修改 字典推导式的使用 以上全部代码编译结果展示 字典复习 4。集合(set) 集合的创建 集合的运算 集合的添加和删除元素 以上全部代码的编译结果 序列解包&#xff08;Sequence unpacking&#xff09; 3。字典 字典的构造 #字…

【第十六章:Sentosa_DSML社区版-机器学习之生存分析】

【第十六章&#xff1a;Sentosa_DSML社区版-机器学习之生存分析】 16.1 加速失效时间回归 1.算子介绍 加速失效时间回归模型Accelerated failure time (AFT)是一个监督型参数化的回归模型&#xff0c;它可以处理删失数据。它描述了一个生存时间的对数模型&#xff0c;所以它通…

Pygame中Sprite实现逃亡游戏1

在《Pygame中Sprite类实现多帧动画》系列中&#xff0c;通过pygame中的sprite类&#xff08;精灵类&#xff09;实现了多帧动画。在该动画的基础上&#xff0c;可以来实现一个逃亡游戏&#xff0c;如图1所示。 图1 逃亡游戏效果 从图1中可以看出&#xff0c;玩家被飞龙追赶&am…

【树莓派】python3程序获取CPU和GPU温度

前言代码以及展示总结 前言 来来来&#xff0c;先放参考文献 如何检查树莓派的温度⇨这个是通过两种指令获取温度&#xff0c;和我之前设置的状态栏显示有点大同小异。 读取树莓派4B处理器(CPU)的实时温度⇨这个也是指令 下面两个是代码了 树莓派实现温度监控并控制风扇散热 获…

powerBi -L4-分组求和

有如下的表格&#xff1a;我们想统计 不同商品的销售次数&#xff0c;根据商品ID进行分类&#xff0c;统计不同ID出现的次数 1.新建列&#xff1a; 2.输入如下的公式 分组统计序列 COUNTROWS(FILTER(数据源,[商品类别]EARLIER(数据源[商品类别])&&[索引]<EARLIE…

3.2 USART 通用同步/异步收发器

文章目录 什么是USARTUSART框图 stm32的Usart串口收发配置初始化发送接收 重定向的几种方法串口发送数据包 什么是USART USART&#xff08;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff09;通用同步/异步收发器USART是STM32内部集成的硬件外设&#xff0…

李沐 模型选择、过拟合和欠拟合相关代码【动手学深度学习v2】

多项式回归 生成数据集 给定x,我们将使用以下三阶多项式来生成训练和测试数据的标签: y=5+1.2x−3.4+5.6+ϵ where ϵ∼( ). 噪声项ϵ服从均值为0且标准差为0.1的正态分布。 在优化