当前位置: 首页 > news >正文

llms 文本分类的微调

文章目录

  • 文本分类的微调
  • 为增加性能,可以微调最后transformer层
  • 微调的损失函数
  • 进行微调
  • spam

文本分类的微调

分类微调模型只能预测它在训练期间看到的类(例如,“垃圾邮件”或“非垃圾邮件”),而指令微调模型通常可以执行许多任务。
注意,微调往往使用监督学习。
准备数据,下载并解压缩数据集。

微调的目标是 gpt2 ,下载 gpt2 的权重并加载进模型。
model_size = CHOOSE_MODEL.split(" “)[-1].lstrip(”(“).rstrip(”)")
settings, params = download_and_load_gpt2(model_size=model_size, models_dir=“gpt2”)

model = GPTModel(BASE_CONFIG)
load_weights_into_gpt(model, params)
model.eval();

目标是替换和微调输出层,为了实现这一点,首先冻结模型,这意味着我们使所有层都不可训练
for param in model.parameters():
param.requires_grad = False
然后,我们替换输出层 ( model.out_head ),它最初将层输入映射到 50,257 个维度(词汇表的大小)
由于我们对二元分类的模型进行了微调(预测 2 个类,“垃圾邮件”和“非垃圾邮件”),因此我们可以替换如下所示的输出层,默认情况下该层是可训练的。
torch.manual_seed(123)

num_classes = 2
model.out_head = torch.nn.Linear(in_features=BASE_CONFIG[“emb_dim”], out_features=num_classes)

为增加性能,可以微调最后transformer层

从技术上讲,仅训练输出层就足够了, 在实验中发现的那样,微调额外的层可以显着提高性能(一开始就忘了,loss 很差而且不收敛)
因此,我们还使最后一个 Transformer 模块和最后一个连接到 Transformer 层的 LayerNorm 模块可训练。
for param in model.trf_blocks[-1].parameters():
param.requires_grad = True

for param in model.final_norm.parameters():
param.requires_grad = True

微调的损失函数

在开始微调(/training)之前,我们首先必须定义要在训练期间优化的损失函数
目标是最大限度地提高模型的垃圾邮件分类准确性;但是,但分类精度不是一个可微函数
因此,将交叉熵损失最小化,作为最大化分类准确性的代理
def calc_loss_batch(input_batch, target_batch, model, device):
input_batch, target_batch = input_batch.to(device), target_batch.to(device)
logits = model(input_batch)[:, -1, :]
# Logits of last output token
# 唯一的不同,只关注最后一个 token
loss = torch.nn.functional.cross_entropy(logits, target_batch)
return loss
基于因果注意机制,第 4 个(最后一个)token 包含的信息在所有 token 中最多,因为它是唯一包含所有其他 token 信息的 token 。

进行微调

微调和预训练一样。根据损失函数来计算梯度,更新权重。
最后看看微调的效果。
text_1 = (
“You are a winner you have been specially”
" selected to receive $1000 cash or a $2000 award."
)

print(classify_review(
text_1, model, tokenizer, device, max_length=train_dataset.max_length
))

spam

text_2 = (
“Hey, just wanted to check if we’re still on”
" for dinner tonight? Let me know!"
)

print(classify_review(
text_2, model, tokenizer, device, max_length=train_dataset.max_length
))

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • seasun测验
  • 机器学习的量子飞跃:推动AI能力的极限
  • 闯关leetcode——13. Roman to Integer
  • python从入门到精通:面向对象
  • 练习:基于TCP协议实现一个网盘系统
  • 在windows下抓空包(monitor网卡+wareshark+MNM)
  • 105页PPT:华为ISC集成供应链变革、模式与方法解析
  • QT如何ui上的QTableWidget控件如何使用
  • 误删文件后的数据救赎实战恢复指南
  • ABB HDS大功率永磁同步伺服电机的创新特性
  • Java stream使用与执行原理
  • 速盾:你知道高防 IP 和高防 CDN 的区别吗?
  • Golang | Leetcode Golang题解之第395题至少有K个重复字符的最长子串
  • 《Python读取 Excel 数据》
  • 美术|基于java+vue的美术外包管理信息系统(源码+数据库+文档)
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • docker python 配置
  • Git学习与使用心得(1)—— 初始化
  • input的行数自动增减
  • JS数组方法汇总
  • leetcode388. Longest Absolute File Path
  • Mysql优化
  • Python_OOP
  • 程序员该如何有效的找工作?
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 计算机在识别图像时“看到”了什么?
  • 聊聊flink的TableFactory
  • 微信支付JSAPI,实测!终极方案
  • 怎样选择前端框架
  • 白色的风信子
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​学习一下,什么是预包装食品?​
  • # 计算机视觉入门
  • #NOIP 2014# day.1 T2 联合权值
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (7) cmake 编译C++程序(二)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (二)pulsar安装在独立的docker中,python测试
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (回溯) LeetCode 40. 组合总和II
  • (四)Controller接口控制器详解(三)
  • (一)WLAN定义和基本架构转
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)关于多人操作数据的处理策略
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net dataexcel winform控件 更新 日志
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .NET下的多线程编程—1-线程机制概述
  • .net中生成excel后调整宽度