首页 > 其他分享 >大语言模型中一个调皮的EOS token

大语言模型中一个调皮的EOS token

时间:2023-07-15 15:22:22浏览次数:45  
标签:输出 调皮 模型 EOS token LoRA id

背景
最近需要做一个微调的培训,所以不可避免地需要上手一下相关的微调,而受限于机器资源,暂时没法做全参数微调,所以就尝试了目前比较火的两种高效微调方式,分别是PTuning和LoRA。模型选择得自然是现在中文做的比较好的ChatGLM2-6B。

微调的代码分别用的是

PTuning
LoRA
在分别尝试了两个结果后,发现LoRA微调出来的结果有点抽风,喜欢疯狂输出,而它就是咱们今天的主角:ChatGLM2-6B的Tokenizer所使用的EOS(end-of-sequence) token。

EOS token 介绍
其实从名字就可以看出来,EOS的作用就是标记一个序列的结束,这样模型就可以知道这个序列已经结束了,不需要再继续输出了。 如果以为例,一般模型在推理的时候,觉得可以结束一句话了,就会输出,但是模型的脑子里肯定没有的概念呀,它只能输出数字,所以我们需要把转换成数字,这个数字就是EOS token ID。在ChatGLM2-6B的Tokenizer中,EOS token ID是2,而模型输出的时候,输出的也是2,而不是

分析BUG
既然模型会输出文字版的,那是不是模型的输入中,给它喂进去了不合适的语料呢?

进一步查找发现所使用的LoRA库中是这么添加EOS的:

medicalGPT

尝试一下直接用喂给tokenizer,看看tokenizer会怎么处理。

tokenize_s

看到这原因的就很明显了,因为这个EOS添加的是字符,而不是token_id,所以tokenizer有时候会把当成了分开的token,比如</和s和>,模型就把这3它当成了三个token,而不是一个token,所以在推理的时候,遇到结尾,有时候就会输出</+s+>。而transformers的库在推理看一个句子是否以EOS结尾,看的是token_id而不是token。就会认为生成还没有结束,就继续生成了,直到某一次推理,模型想起来预训练时的记忆,在遇到结尾的时候输出了2的token id(也就是),transformers库才会认为生成结束,停止生成。

transformers

既然知道了问题的原因,那么就需要解决这个问题,解决的方法也很简单,就是把EOS token_id添加到输入中,而不是字符。具体代码就是按照PTuning的方式,把EOS token_id添加到输入中。

refactor

改完之后重新train一遍LoRA,模型不再疯狂输出了。

尾声
要改这个bug,其实需要挺多tokenization的知识的,最近没有时间好好研究,之后有时间再来补充一下。

标签:输出,调皮,模型,EOS,token,LoRA,id
From: https://www.cnblogs.com/boydfd/p/17556177.html

相关文章

  • 极光一键登录 鉴别token
    publicfunctioncheckMobile($token){$data['loginToken']=$token;$data['exID']='';//我的默认为空$data=json_encode($data);$url='https://api.verif......
  • java的get请求怎么往请求头里面方token
    项目方案:在Java的GET请求中添加Token到请求头1.简介在很多需要用户认证的应用中,使用Token进行身份验证是一种常见的方式。通常,Token是通过请求头的方式发送给服务器的。本项目方案将介绍如何在Java的GET请求中添加Token到请求头,并提供相关的代码示例。2.实现方案我们将使用Ja......
  • PHP微信接入时的token验证
    微信接入时的token验证//微信token认证$signature=$_GET["signature"];$timestamp=$_GET["timestamp"];$nonce=$_GET["nonce"];$echostr=$_GET["echostr"];//你的设置Token$token="lingqiangkejiToken";//1)将......
  • cesium 加载geoserver wmts
    遇到问题:①加载瓦片服务时,发现{TileRow}/{TileCol}参数不对,刚好是等级大了一倍;解决方法:tileMatrixLabels:["1","2","3","4","5","6","7","8","9","10","11"] ,注意是从1开始,不是从0开始。......
  • Mapbox、GeoServer离线部署矢量地图
    Mapbox、GeoServer离线部署矢量地图关键词:Mapbox、GeoServer、Tomcat、PostgreSQL、PostGis一、地图数据获取使用OpenStreetMap获取中国的矢量地图数据二、安装GeoServer及VectorTiles扩展将下载好的GeoServer.war放入Tomcat,启动Tomcat后将VectorTiles扩展中的四个jar包放入GeoSe......
  • spring-data-redis2.3.9不支持redis6.2提供的GEOSEARCH命令
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId>......
  • 基于 Sa-Token 实现微服务登录鉴权实战
    简介Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权等一系列权限相关问题。官网地址:https://sa-token.cc/SpringBoot微服务实战1、创建项目在IDEA中新建一个SpringBoot项目,命名:sa-token-d......
  • 数组对象如何赋值给JToken
    提问数组对象如何赋值给JToken回答创建一个JsonArray字符串将字符串装维JArrayJArray赋值给JTokenvarstrIps=$"[\"{string.Join("\",\"",rootObject.IpRateLimiting.IpWhitelist)}\",\"::1/10\"]";varips=JArray.Parse(s......
  • 有关access_token与refresh_token 理解
    下面是对接各种平台api的流程一般操作流程是下面的1始通过用户授权获取code,2然后通过code获取到  access_token和 refresh_token   3访问api必须携带  access_token 举例access_token:aaaaexpires_in:10分钟refresh_token :  bbbrefresh_expires_......
  • CHATGPT获取登录token
    先使用web登录chatgpt再使用web打开http://chat.openai.com/api/auth/session,获取token......