fill-in-the-middle(FIM) 实现与简单应用

1 背景

传统训练的 GPT 模型只能根据前文内容预测后文内容,但有些应用比如代码生成器,需要我们给出上文和下文,使模型可以预测中间的内容,传统训练的 GPT 就不能完成这类任务。

传统训练的 GPT 只能根据上文预测下文
在这里插入图片描述

使用 FIM 训练的能够正确填充中间部分
在这里插入图片描述
FIM 是一种新的训练技巧,使得 GPT 类模型能够根据上下问填充中间部分。

2 原理

通过添加特殊 token, 使得训练数据包含上下文内容
原文
在这里插入图片描述
在这里插入图片描述
调换 suffix 与 middle 位置,此为 PSM 模式
在这里插入图片描述
另外还有 SPM 模型。

3 代码

import os
import random
import numpy as np
import torch
import numpy as np
import tiktoken## Adapted from https://github.com/bigcode-project/Megatron-LM/blob/6c4bf908df8fd86b4977f54bf5b8bd4b521003d1/megatron/data/gpt_dataset.py
def permute(sample,np_rng,suffix_tok_id,prefix_tok_id,middle_tok_id,pad_tok_id,fim_rate=0.5,fim_spm_rate=0.5,truncate_or_pad=False,
):"""Take in a sample (list of tokens) and perform a FIM transformation on it with a probability of fim_rate, using two FIM modes:PSM and SPM (with a probability of fim_spm_rate)."""if np_rng.binomial(1, fim_rate): # 二项分布,以 fim_rate 的概率生成 1, 1-fim_rate的概率生成 0boundaries = list(np_rng.randint(low=0, high=len(sample) + 1, size=2)) # 随机生成两个位置索引, 数值中间部分为 middleboundaries.sort()# 分割前、中、后prefix = np.array(sample[: boundaries[0]], dtype=np.int64)middle = np.array(sample[boundaries[0] : boundaries[1]], dtype=np.int64)suffix = np.array(sample[boundaries[1] :], dtype=np.int64)if truncate_or_pad:new_length = suffix.shape[0] + prefix.shape[0] + middle.shape[0] + 3diff = new_length - len(sample)if diff > 0:if suffix.shape[0] <= diff: # suffix 后缀长度小于 diff/3, 原样返回return sample, np_rngsuffix = suffix[: suffix.shape[0] - diff] # 裁剪后缀使sample长度保持不变elif diff < 0:suffix = np.concatenate([suffix, np.full((-1 * diff), pad_tok_id)]) # (-1 * diff) 负负得正# 内部以 fim_spm_rate 的概率做 spm 变换,以 1-fim_spm_rate 的概率做 PSM 变换if np_rng.binomial(1, fim_spm_rate):# SPM (variant 2 from FIM paper)new_sample = np.concatenate([[prefix_tok_id, suffix_tok_id],suffix,[middle_tok_id],prefix,middle,])else:# PSMnew_sample = np.concatenate([[prefix_tok_id],prefix,[suffix_tok_id],suffix,[middle_tok_id],middle,])else:# 不做任何改变。 don't do FIM preprocnew_sample = samplereturn list(new_sample), np_rng
# 特殊字符
FIM_PREFIX = "<fim-prefix>"
FIM_MIDDLE = "<fim-middle>"
FIM_SUFFIX = "<fim-suffix>"
FIM_PAD = "<fim-pad>"
# bpe分词器
tokenizer = tiktoken.get_encoding("gpt2")
# In production, load the arguments directly instead of accessing private attributes
# See openai_public.py for examples of arguments for specific encodings
enc = tiktoken.Encoding(# If you're changing the set of special tokens, make sure to use a different name# It should be clear from the name what behaviour to expect.name="cl100k_base_im",pat_str=tokenizer._pat_str,mergeable_ranks=tokenizer._mergeable_ranks,special_tokens={**tokenizer._special_tokens,# 添加特殊字符FIM_PREFIX: 50300,FIM_MIDDLE: 50400,FIM_SUFFIX: 50500,FIM_PAD: 50600,})

在这里插入图片描述

# 获取特殊符号id
suffix_tok_id, prefix_tok_id, middle_tok_id, pad_tok_id = (enc._special_tokens[tok] for tok in [FIM_SUFFIX, FIM_PREFIX, FIM_MIDDLE, FIM_PAD])
# 测试
sample = list(np.random.randint(0 , 100, (10, )))
_list = []
for i in range(10):tmp = permute(sample,np_rng,suffix_tok_id,prefix_tok_id,middle_tok_id,pad_tok_id,fim_rate=0.5,fim_spm_rate=0.5,truncate_or_pad=True,)_list.append(tmp[0])

在这里插入图片描述

参考:
Efficient Training of Language Models to Fill in the Middle
loubnabnl/santacoder-finetuning
gpt_dataset.py
tiktoken/core.py
Code Llama — A Comprehensive Overview
Why your AI Code Completion tool needs to Fill in the Middle

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

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

相关文章

vue-element安装富文本编辑器vue-quill-editor教程

在vue ui面板中安装vue-quill-editor依赖 命令安装 npm install vue-quill-editor --save # or yarn add vue-quill-editor 使用方法 在main.js导入富文本编辑器 import VueQuillEditor from vue-quill-editor import quill/dist/quill.core.css // import styles import…

技术博客:市面上加密混淆软件的比较和推荐

技术博客&#xff1a;市面上加密混淆软件的比较和推荐 引言 市面上有许多加密混淆软件可供开发者使用&#xff0c;但哪些软件是最好用的&#xff1f;哪些软件受到开发者的喜爱&#xff1f;本文将根据一次在CSDN上的投票结果&#xff0c;为大家介绍几款在程序员中普及度较高的…

CEC2013(python):五种算法(ABC、PSO、CSO、OOA、DBO)求解CEC2013(python代码)

一、五种算法简介 1、人工蜂群算法 &#xff08;Artificial Bee Colony Algorithm, ABC&#xff09; 2、粒子群优化算法PSO 3、鸡群优化算法CSO 4、鱼鹰优化算法OOA 5、蜣螂优化算法DBO 二、5种算法求解CEC2013 &#xff08;1&#xff09;CEC2013简介 参考文献&#xff…

机器学习 项目结构 数据预测 实验报告

需求&#xff1a; 我经过处理得到了测试值&#xff0c;然后进一步得到预测和真实值的比较&#xff0c;然后再把之前的所有相关的参数、评估指标、预测值、比较结果都存入excel,另外我还打算做测试报告模板&#xff0c;包括敏感性分析等。您建议我这些功能如何封装这些功能&…

源码部署MySQL

MySQL 1.准备环境 关闭防火墙 [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#systemctl disable firewalld 关闭selinux [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#sed -i %s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config 验证是否通网 …

WINDOWS(WIN11)通过IP添加网络打印机

点击添加设备 点击手动添加 使用IP地址或主机名添加打印机 选择TCP/IP设备&#xff0c;输入打印机地址 如果有正确驱动就安装&#xff0c;没有就取消。 通过手动设置添加本地打印机或网络打印机 使用现有的端口 根据打印机IP&#xff0c;选择标准端口。 成功&#xff01; 到…

警惕Kann勒索病毒的最新变种.kann,您需要知道的预防和恢复方法。

导言&#xff1a; 勒索病毒已经成为网络安全的一大威胁&#xff0c;其中之一就是.kann勒索病毒。本文将深入介绍.kann勒索病毒&#xff0c;包括其攻击方式、数据加密机制&#xff0c;以及如何有效恢复被加密的数据文件&#xff0c;并提供一系列预防措施以保护系统免受.kann勒索…

element ui el-avatar 源码解析零基础逐行解析

avatar功能介绍 快捷配置头像的样式 avatar 的参数配置 属性说明参数size尺寸type string 类型 &#xff08;‘large’,‘medium’,‘small’&#xff09;number类型 validator 校验shape形状circle (原型) square&#xff08;方形&#xff09;icon传入的iconsrc传入的图片st…

阿里lindorm与MyBatis Plus集成

lindorm与MyBatis Plus集成 1 添加依赖&#xff1a; 在项目的pom.xml文件中添加lindorm和MyBatis Plus的依赖。 <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>lindorm-jdbc</artifactId><version>1.1.1…

机器学习笔记:支持向量机回归SVR

1 主要思想 主要思路类似于机器学习笔记&#xff1a;支持向量机SVM_支撑向量学习-CSDN博客 和SVM的区别主要有 解法和SVM区别不大&#xff0c;也是KKT 2 和线性回归的区别 对SVR&#xff0c;如果f(x)和y之间的差距小于阈值ε【也即落在两条间隔带之间】&#xff0c;则不计算…

SQL面试题挑战03:奖金瓜分问题(拼多多)

目录 问题&#xff1a;SQL解答&#xff1a; 问题&#xff1a; 在活动大促中&#xff0c;有玩游戏瓜分奖金环节。现有奖金池为10000元&#xff0c;代表奖金池中的初始额度。用户的分数信息如下&#xff1a; user_id score 100 60 101 45 102 40 103 3…

模拟组建网络的过程

DNS是域名系统&#xff0c;作用是将域名解析成ip地址 要求 1.使用172.16.0.0网段组建网络 2.使用3台pc&#xff0c;可以配置DHCP服务自动分配ip 3.添加两个网站服务器 第一台是www.taobao.com 第二台www.jd.com 他们可以通过DNS服务器为客户解析域名 172开头的是B类ip地…

标准库中的string类(上)——“C++”

各位CSDN的uu们好呀&#xff0c;好久没有更新小雅兰的C专栏的知识啦&#xff0c;接下来一段时间&#xff0c;小雅兰就又会开始更新C这方面的知识点啦&#xff0c;以及期末复习的一些知识点&#xff0c;下面&#xff0c;让我们进入西嘎嘎string的世界吧&#xff01;&#xff01;…

【论文简述】High-frequency Stereo Matching Network(CVPR 2023)

一、论文简述 1. 第一作者&#xff1a;Haoliang Zhao 2. 发表年份&#xff1a;2023 3. 发表期刊&#xff1a;CVPR 4. 关键词&#xff1a;立体匹配、MVS、深度学习、高频信息、LSTM 5. 探索动机&#xff1a;(1)当涉及到估计的视差图的更精细的特征时&#xff0c;大多数当前…

Java反序列化工具ysoserial使用

ysoserial是一款用于生成 利用不安全的Java对象反序列化 的有效负载的概念验证工具。 项目地址 https://github.com/frohoff/ysoserial主要有两种使用方式&#xff0c;一种是运行ysoserial.jar 中的主类函数&#xff0c;另一种是运行ysoserial中的exploit 类&#xff0c;二者…

蓝桥杯-每日刷题-023

统计字符 一、题目要求 题目描述 给出一个字符串&#xff0c;统计其中的英文字母、空格、数字的个数。输入格式 输入一行&#xff0c;为给定字符串输出格式 输出参考样例。输入样例 aaaaaa 11111 2223www输出样例 letter9 space2 digit9 二、完整代码 #include <iostrea…

未来十年,人工智能就业方向及前景如何?

人工智能&#xff08;AI&#xff09;是一个快速发展的领域&#xff0c;对于未来的就业方向和前景有着巨大的影响。以下是一些可能的发展趋势和就业前景&#xff1a; 1、增长趋势&#xff1a;人工智能正在全球范围内经历巨大的增长&#xff0c;预计在未来十年内将继续保持这一趋…

一个正则快速找到在ES中使用profile的时产生慢查询的分片

在es中使用profile分析慢查询的时候&#xff0c;往往因为分片过多&#xff0c;或者因为查询条件太复杂&#xff0c;分析的结果几十万行。在kibana上点半天&#xff0c;也找不到一个耗时长的分片。 kibana上可以通过正则来匹配。其实我们只需要匹配到耗时大于10秒的请求。 检索语…

connect信号槽的异步性导致多线程中的数据被更改及Qt::BlockingQueuedConnection作用

目录 1. 问题现象 2. 原因分析 3. 解决方法 1. 问题现象 因为业务需求&#xff0c;需要利用子线程向主线程发送数据。像这种子线程和主线程进行数据交互时&#xff0c;一般都是通过Qt的信号槽机制来实现。如下代码&#xff1a; void myClass::doBusiness() {…

0x42 树状数组

0x42 树状数组 若一个正整数 x x x的二进制表示为 a k − 1 a k − 2 . . . a 2 a 1 a 0 a_{k-1}a_{k-2}...a_2a_1a_0 ak−1​ak−2​...a2​a1​a0​&#xff0c;其中等于1的位是 { a i 1 , a i 2 , . . . , a i m } \{a_{i_1},a_{i_2},...,a_{i_{m}}\} {ai1​​,ai2​​,...…