凡拓数创北京seo专业团队

news/2025/9/23 11:44:29/文章来源:
凡拓数创,北京seo专业团队,佛山做网站开发,网站建设 海口Hugging Face预训练GPT微调ChatGPT#xff08;微调入门#xff01;新手友好#xff01;#xff09; 在实战中#xff0c;⼤多数情况下都不需要从0开始训练模型#xff0c;⽽是使⽤“⼤⼚”或者其他研究者开源的已经训练好的⼤模型。 在各种⼤模型开源库中#xff0c;最…Hugging Face预训练GPT微调ChatGPT微调入门新手友好 在实战中⼤多数情况下都不需要从0开始训练模型⽽是使⽤“⼤⼚”或者其他研究者开源的已经训练好的⼤模型。 在各种⼤模型开源库中最具代表性的就是Hugging Face。Hugging Face是⼀家专注于NLP领域的AI公司开发了⼀个名为Transformers的开源库该开源库拥有许多预训练后的深度学习模型如BERT、GPT-2、T5等。Hugging Face的Transformers开源库使研究⼈员和开发⼈员能够更轻松地使⽤这些模型进⾏各种NLP任务例如⽂本分类、问答、⽂本⽣成等。这个库也提供了简洁、⾼效的API有助于快速实现⾃然语⾔处理应⽤。 从Hugging Face下载⼀个GPT-2并微调成ChatGPT需要遵循的步骤如下。 1.安装Hugging Face Transformers库 pip install transformers2.载入预训练GPT-2模型和分词器 import torch # 导⼊torch from transformers import GPT2Tokenizer # 导⼊GPT-2分词器 from transformers import GPT2LMHeadModel # 导⼊GPT-2语⾔模型 model_name gpt2 # 也可以选择其他模型如gpt2-medium gpt2-large等 tokenizer GPT2Tokenizer.from_pretrained(model_name) # 加载分词器 tokenizer.pad_token # 为分词器添加pad token tokenizer.pad_token_id tokenizer.convert_tokens_to_ids() device cuda if torch.cuda.is_available() else cpu # 判断是否有可⽤的GPU model GPT2LMHeadModel.from_pretrained(model_name).to(device) # 将模型加载到设备上CPU或GPU vocab tokenizer.get_vocab() # 获取词汇表 print(模型信息, model) print(分词器信息,tokenizer) print(词汇表⼤⼩, len(vocab)) print(部分词汇示例, (list(vocab.keys())[8000:8005]))3.准备微调数据集 from torch.utils.data import Dataset # 导入PyTorch的Dataset# 自定义ChatDataset类继承自PyTorch的Dataset类 class ChatDataset(Dataset):def __init__(self, file_path, tokenizer, vocab):self.tokenizer tokenizer # 分词器self.vocab vocab # 词汇表# 加载数据并处理将处理后的输入数据和目标数据赋值给input_data和target_dataself.input_data, self.target_data self.load_and_process_data(file_path)# 定义加载和处理数据的方法def load_and_process_data(self, file_path):with open(file_path, r) as f: # 读取文件内容lines f.readlines()input_data, target_data [], []for i, line in enumerate(lines): # 遍历文件的每一行if line.startswith(User:): # 如以User:开头移除User: 前缀并将张量转换为列表tokens self.tokenizer(line.strip()[6:], return_tensorspt)[input_ids].tolist()[0]tokens tokens [self.tokenizer.eos_token_id] # 添加结束符input_data.append(torch.tensor(tokens, dtypetorch.long)) # 添加到input_dataelif line.startswith(AI:): # 如以AI:开头移除AI: 前缀并将张量转换为列表tokens self.tokenizer(line.strip()[4:], return_tensorspt)[input_ids].tolist()[0]tokens tokens [self.tokenizer.eos_token_id] # 添加结束符target_data.append(torch.tensor(tokens, dtypetorch.long)) # 添加到target_datareturn input_data, target_data# 定义数据集的长度即input_data的长度def __len__(self):return len(self.input_data)# 定义获取数据集中指定索引的数据的方法def __getitem__(self, idx):return self.input_data[idx], self.target_data[idx]file_path /kaggle/input/hugging-face-chatgpt-chat-data/chat.txt # 加载chat.txt数据集 chat_dataset ChatDataset(file_path, tokenizer, vocab) # 创建ChatDataset对象传入文件、分词器和词汇表# 打印数据集中前2个数据示例 for i in range(2):input_example, target_example chat_dataset[i]print(f示例 {i 1}:)print(输入, tokenizer.decode(input_example))print(输出, tokenizer.decode(target_example)) 4.准备微调数据加载器 from torch.utils.data import DataLoader # 导入DataLoadertokenizer.pad_token # 为分词器添加pad token tokenizer.pad_token_id tokenizer.convert_tokens_to_ids()# 定义pad_sequence函数用于将一批序列补齐到相同长度 def pad_sequence(sequences, padding_value0, lengthNone):# 计算最大序列长度如果length参数未提供则使用输入序列中的最大长度max_length max(len(seq) for seq in sequences) if length is None else length# 创建一个具有适当形状的全零张量用于存储补齐后的序列result torch.full((len(sequences), max_length), padding_value, dtypetorch.long)# 遍历序列将每个序列的内容复制到张量result中for i, seq in enumerate(sequences):end len(seq)result[i, :end] seq[:end]return result# 定义collate_fn函数用于将一个批次的数据整理成适当的形状 def collate_fn(batch):# 从批次中分离源序列和目标序列sources, targets zip(*batch)# 计算批次中的最大序列长度max_length max(max(len(s) for s in sources), max(len(t) for t in targets))# 使用pad_sequence函数补齐源序列和目标序列sources pad_sequence(sources, padding_valuetokenizer.pad_token_id, lengthmax_length)targets pad_sequence(targets, padding_valuetokenizer.pad_token_id, lengthmax_length)# 返回补齐后的源序列和目标序列return sources, targets# 创建DataLoader chat_dataloader DataLoader(chat_dataset, batch_size2, shuffleTrue, collate_fncollate_fn)# 检查Dataloader输出 for input_batch, target_batch in chat_dataloader:print(Input batch tensor size:, input_batch.size())print(Target batch tensor size:, target_batch.size())breakfor input_batch, target_batch in chat_dataloader:print(Input batch tensor:)print(input_batch)print(Target batch tensor:)print(target_batch)break 5.对GPT-2进行微调 import torch.nn as nn import torch.optim as optim# 定义损失函数忽略pad_token_id对应的损失值 criterion nn.CrossEntropyLoss(ignore_indextokenizer.pad_token_id)# 定义优化器 optimizer optim.Adam(model.parameters(), lr0.0001)# 进行500个epoch的训练 for epoch in range(500):for batch_idx, (input_batch, target_batch) in enumerate(chat_dataloader): # 遍历数据加载器中的批次optimizer.zero_grad() # 梯度清零input_batch, target_batch input_batch.to(device), target_batch.to(device) # 输入和目标批次移至设备outputs model(input_batch) # 前向传播logits outputs.logits # 获取logits# 计算损失loss criterion(logits.view(-1, len(vocab)), target_batch.view(-1))loss.backward() # 反向传播optimizer.step() # 更新参数if (epoch 1) % 100 0: # 每100个epoch打印一次损失值print(fEpoch: {epoch 1:04d}, cost {loss:.6f}) 6.用约束解码函数生成回答 # 定义集束解码函数 def generate_text_beam_search(model, input_str, max_len50, beam_width5):model.eval() # 将模型设置为评估模式不计算梯度# 对输入字符串进行编码并将其转换为张量然后将其移动到相应的设备上input_tokens tokenizer.encode(input_str, return_tensorspt).to(device)# 初始化候选序列列表包含当前输入序列和其对数概率得分我们从0开始candidates [(input_tokens, 0.0)]# 禁用梯度计算以加速预测过程with torch.no_grad():# 迭代生成最大长度的序列for _ in range(max_len):new_candidates []# 对于每个候选序列for candidate, candidate_score in candidates:# 使用模型进行预测outputs model(candidate)# 获取输出logitslogits outputs.logits[:, -1, :]# 获取对数概率得分的top-k值即beam_width及其对应的tokenscores, next_tokens torch.topk(logits, beam_width, dim-1)final_results []# 遍历top-k token及其对应的得分for score, next_token in zip(scores.squeeze(), next_tokens.squeeze()):# 在当前候选序列中添加新的tokennew_candidate torch.cat((candidate, next_token.unsqueeze(0).unsqueeze(0)), dim-1)# 更新候选序列的得分new_score candidate_score - score.item()# 如果新的token是结束符eos_token则将该候选序列添加到最终结果中if next_token.item() tokenizer.eos_token_id:final_results.append((new_candidate, new_score))# 否则将新的候选序列添加到新候选序列列表中else:new_candidates.append((new_candidate, new_score))# 从新候选序列列表中选择得分最⾼的top-k个序列candidates sorted(new_candidates, keylambda x: x[1])[:beam_width]# 选择得分最⾼的候选序列best_candidate, _ sorted(candidates, keylambda x: x[1])[0]# 将输出token转换回文本字符串output_str tokenizer.decode(best_candidate[0])# 移除输入字符串并修复空格问题input_len len(tokenizer.encode(input_str))output_str tokenizer.decode(best_candidate.squeeze()[input_len:])return output_str# 测试模型 test_inputs [what is the weather like today?,can you recommend a good book? ]# 输出测试结果 for i, input_str in enumerate(test_inputs, start1):generated_text generate_text_beam_search(model, input_str)print(f测试 {i}:)print(fUser: {input_str})print(fAI: {generated_text}) 测试1: User: what is the weather like today?|endoftext| AI: you need an current time for now app with app app app app 测试2: User: Can you recommend a good book?|endoftext| AI: ockingbird Lee Harper Harper Taylor模型的回答虽然称不上完美但是我们⾄少能够看出微调数据集中的信息起到了⼀定的作⽤。第⼀个问题问及天⽓模型敏锐地指向“app”应⽤这个存在于训练语料库中的信息⽽查看“应⽤”确实是我们希望模型给出的答案。回答第⼆个问题时模型给出了语料库中所推荐图书的作者的名字“Lee Harper”⽽书名“To kill a Mockingbird”中的mockingbird是⼀个未知token模型把它拆解成了三个token。具体信息如下。 tokenizer.encode(Mockingbird)[44/76, 8629, 16944] tokenizer.decode(44)M tokenizer.decode(8629)ocking tokenizer.decode(16944)bird因此在解码时出现了ockingbird这样的不完整信息但是其中也的确包含了⼀定的语料库内部的知识。 ⽽微调则针对特定任务进⾏优化。这⼀模式的优势在于微调过程通常需要较少的训练数据和计算资源同时仍能获得良好的性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站开发项目的规划与设计文档wordpress upload

《C语言程序设计》课程复习及模拟题讲评;《C语言程序设计》试卷各类题目分数分布情况一、选择题 40分(20小题, 每题2分 ) 主要考核基本概念, 词法, 语法和小程序阅读等。二、阅读题 12分(2小题, 每题6分)三、改错题 12分(2小题, 每题6分)四、设计题 36分(4小题, 每题9分) ;启动…

【SPIE出版、主题宽泛、快速检索】2025年可持续发展与数字化转型国际学术会议(SDDT 2025)

#SPIE 出版-ISSN:0277-786X# #高录用稳检索-快至见刊后1个月EI、Scopus检索# #可持续发展、管理、交通、数字化、社会学、计算机方向及其他交叉学科均可投递# 2025年可持续发展与数字化转型国际学术会议(SDDT 2025) 20…

张家界做网站广告制作公司合同

手机为什么这么卡:闪存I/O测试AndroBench软件名称:Androbench软件版本:4.0.1软件大小:1.01MB软件授权:免费适用平台:Android很多朋友买手机只是为了日常使用,卡顿是最影响日常使用的心情的问题了…

Sping Boot 打包排除相关jar依赖包,CMD 启动方式 pom.xml 说明.

Sping Boot 打包排除相关jar依赖包,CMD 启动方式 pom.xml 说明.Posted on 2025-09-23 11:40 且行且思 阅读(0) 评论(0) 收藏 举报根目录pom.xml<build><plugins><plugin><groupId>org.…

langfuse使用的postgresql异机备份和恢复(docker)并进行langfuse版本升级

环境:OS:Centos 7pg:16.4langfuse旧版本:V2.70.1langfuse新版本:V3.110原langfuse(v2)机器:192.168.1.52新langfuse机器(v3):192.168.1.1351.新机器安装pg并启动(非docker)这一步的目的是进行pg的原库备份后,异机恢复,…

国产化Excel处理组件Spire.XLS教程:Java在 Excel 表格中轻松添加下标

当 Excel 表格中包含化学式、统计脚注或科学数据时,往往需要使用下标来表示。但是,Microsoft Excel 自带的下标功能操作比较繁琐,而且也不支持批量应用,手动操作通常需要花费大量的时间。 基于此,本篇指南将介绍如…

tips图解复杂数组、指针声明

顺转法(顺时针旋转)带你带你看复杂数组和指针 int (*func_ptr_arr[5])();int* ((ptr_to_func)())();int ((arr[2])())[10];int (((*func_returning_ptr)())[4])();int (*((ptr_to_func2)())[2][3])();int* (**(*ptr…

北京市保障房建设投资中心网站瘫痪微信网页设计总结

介于直接使用源码编译安装 QT 耗时较长&#xff0c;而且需要手动编写脚本进行编译&#xff0c;难度较大&#xff0c;这里选择直接以图形化界面的方式安装 QT 。 目录 1、下载 QT 安装包 2、安装 QT 3、添加环境变量 4、cmake 引入 QT 库 5、Failed to find “GL/gl.h“ in…

网站免备案阜新市项目建设网站

EAK厚膜高功率片式电阻器和氮化铝片式端接非常适合大多数需要在小尺寸封装中实现高导热性的应用。AlN 是 BeO 的理想替代品&#xff0c;具有高功耗且对环境或健康无危害。厚膜技术以非常实惠的价格提供稳定的电阻元件。 高稳定性厚膜电阻元件 AlN衬底材料 标准电阻范围为 10Ω…

成都设计网站建设服饰网站建设规划书

服务器数据恢复环境&#xff1a; 服务器面板上的硬盘指示灯显示黄色是一种警告&#xff0c;提示指示灯对应的服务器硬盘已经被服务器识别出存在故障&#xff0c;硬盘即将下线。如果出现这种情况&#xff0c;建议服务器管理员/运维人员及时用完好的硬盘替换显示黄色指示灯对应的…

专业的网站设计制作小学网站asp

一、引言 在工作的时候我们有时候会自己创建项目Demo来实现一些功能&#xff0c;但是又不想把自己的Demo代码放到公司的仓库代码平台&#xff08;gitee&#xff09;中管理&#xff0c;于是就是想自己放到自己的Gitee中管理&#xff0c;于是就需要配置Git多用户。 本文将配置分别…

北滘 网站建设定制网站对公司有什么好处

由于各种原因&#xff0c;行业供应链的数字化转型可能充满挑战。然而&#xff0c;最根本的原因之一是供应链本身固有的复杂性和碎片化。以下是造成这一困难的一些关键因素&#xff1a; 1.缺乏标准化&#xff1a;供应链通常涉及多个组织、系统和流程&#xff0c;这些组织、系统…

高端网站设计定制公司福州公司做网站

1.启动App后: 判断->蓝牙是否打开&#xff08;所有功能必须在打牙打开的情况下才能用) 已打开: 启动代码中的蓝牙通讯Service 未打开: 发布 打开蓝牙意图(系统)&#xff0c;根据Activity返回进场操作 打开成功,启动代码中的蓝牙通讯Service 用户点back或失败 退出App 2.蓝牙…

通过perl或awk实现剪切功能

我有如下文件,我想将第二行的数据,移动到文件的最后一行,如何实现? # cat 1.txt open LOG,">>./a.log"; print LOG "hahh,adfa,adfad"; close LOG;这里我给出了两种方式:AWK和perl语言…

java列队多种实现方式,

在Java中,队列(Queue)是一种常用的数据结构,遵循FIFO(先进先出)原则。Java提供了多种队列实现方式,适用于不同的场景。以下是几种常见的队列实现方式:LinkedList实现 LinkedList实现了Queue接口,可以作为队列…

自定义属性编辑器

自定义属性编辑器需求:将Customer中address属性的值赋值给Address类中的每一个属性 package com.atguigu.selfEditor;public class Address {private String province;private String city;private String town;publi…

Ashampoo Music Studio 12.0.3 音频编辑处理

描述 Ashampoo Music Studio是一个表现良好和强大的工具。它是音频编辑、设计师、创作者和制作人的最爱。该软件是一个集成了视频提取、录制和格式转换的多功能音频处理工具。最新版本还包括创建、编辑和数字管理音乐收…

公司网站优化方案财务软件排行榜前十名

FineReport是一款利用什么语言开发的报表工具&#xff1f; FineReport是一款基于Java语言开发的报表工具。Java是一种广泛使用的编程语言&#xff0c;特别适合于跨平台的软件开发。FineReport利用Java语言的诸多优势&#xff0c;如稳定性、安全性、可移植性和强大的网络功能&a…

建网站html5国外推广网站有什么

在 JavaScript 中&#xff0c;函数内部的 this 关键字是一个特殊的对象&#xff0c;它的值取决于函数被调用的方式。this 可以指向不同的对象&#xff0c;因此在不同的场景中它会有不同的含义。下面是一些常见的场景以及 this 的指向&#xff1a; 全局作用域&#xff1a;当函数…

php网站建设程序模块化wordpress企业主题

WatchBird: 新一代纯PHP防火墙 工具安装 广大研究人员可以使用下列命令直接将项目源码克隆至本地 git clone https://github.com/leohearts/awd-watchbird.git工具部署 1.进入下载好的文件夹目录 2.编译waf.c生成.so文件,参考命令:gcc waf.c -shared -fPIC -o waf.so 3.将w…