大模型词表注入

大模型词表注入(Vocabulary Injection)

大模型词表注入(Vocabulary Injection)是指在预训练语言模型(如GPT、LLAMA等)的基础上,动态扩展其词表(Vocabulary)的技术,以适应特定任务或领域的需求。

一、词表注入的「原理」

  1. 词表结构与嵌入层调整
    • 大模型的词表通常由子词(subword)或词片(token)组成(如BPE、WordPiece算法生成),每个词对应一个嵌入向量(Embedding Vector)。
    • 注入新词时,需要扩展模型的嵌入矩阵(Embedding Matrix),新增词对应的向量,并调整模型输入层(Embedding Layer)和输出层(如LM Head)的维度。
  2. 新词向量的初始化
    • 直接随机初始化新词的嵌入向量可能导致训练不稳定。常见策略是:
      • 复用相似词向量:例如,将新词"LLM"初始化为"language"和"model"的平均向量。
      • 对齐预训练语义空间:通过外部词向量(如Word2Vec)映射到模型的嵌入空间。
  3. 参数适配与微调
    • 注入新词后,通常需要在小规模领域数据上对模型进行微调(Fine-tuning),使新词的嵌入向量与原有参数协同工作。
    • 某些方法(如[《Extending Pre-trained Models with Domain-Specific Vocabulary》](https://arxiv.org/abs/2104.08646))会冻结部分参数,仅训练新词相关部分以减少计算量。

二、词表注入的「原因」

  1. 解决未登录词(OOV)问题
    • 预训练模型的词表固定,无法覆盖领域专有名词(如医学术语“EGFR”)、新造词(如网络流行语“栓Q”)或多语言词汇。
  2. 提升领域任务性能
    • 在特定领域(法律、医疗、金融)中,直接使用原始词表可能导致文本被过度切分为子词,丢失语义信息。注入领域词表可保留关键术语的完整性。
  3. 多语言扩展需求
    • 为支持新语言,需注入该语言的词汇(如中文字符、俄文字母),同时调整模型处理多语言的能力。
  4. 避免全模型重训练
    • 从头预训练大模型成本极高,词表注入允许在原有模型基础上低成本扩展,节省计算资源和时间。

三、技术挑战与解决方案

  1. 嵌入空间对齐
    • 问题:新词向量可能破坏原有语义空间的一致性。
    • 方案:使用对比学习(Contrastive Learning)或跨词注意力(Cross-token Attention)对齐新旧词向量。
  2. 模型结构限制
    • 问题:Transformer的参数量与词表大小相关,盲目扩展词表会显著增加模型体积。
    • 方案:动态词表(Dynamic Vocabulary)、参数共享(如ALBERT的跨层参数共享)。
  3. 训练数据偏差
    • 问题:注入新词后,若微调数据不足,模型可能过拟合或遗忘原有知识。
    • 方案:渐进式训练(Progressive Training)或知识蒸馏(Knowledge Distillation)。

四、典型应用场景

  1. 领域适配
    • 例如,向BERT注入法律术语后,在合同解析任务中表现更佳。
  2. 多语言模型扩展
    • 如为英文训练的GPT-2注入中文词表,支持中英混合生成。
  3. 实时更新
    • 快速响应新事件(如疫情术语“奥密克戎”)或网络热词。

五、代码及微调实验

有两种方法:1.词表注入;2.词表训练–>添加词表

  • 导入原始大模型及tokenier
tokenizer = AutoTokenizer.from_pretrained(model_path,trust_remote_code=True,use_fast=False if model_arch == 'llama' else True
)model = AutoModel.from_pretrained(model_path,trust_remote_code=True,torch_dtype=torch_dtype
)
  • 词表注入
all_words = []
with open(file, 'r', encoding='utf-8') as f:lines = f.readlines()
words = [line.strip() for line in lines]
all_words.extend(words)
tokenizer.add_tokens(all_words)
tokenizer.save_pretrained(save_path)
  • 词表训练

使用sentencepiece==4.1.0 训练词表

sp.SentencePieceTrainer.train(# 只支持 txt 和 tsv 格式input=corpus,# 保存的模型前缀名model_prefix='bpe_expand',# 词表大小vocab_size=vocab_size,# 指定模型的字符覆盖率, 中文日文等推荐为 0.9995, 其余可以尝试 1.0character_coverage=character_coverage,# 分词算法model_type='bpe',# 是否将数字划分为单个 token, 在 llama 中是这么做的split_digits=True if model_arch == 'llama' else False,# 指定在遇到未知或很少的字符时将其分解为 UTF-8 字节, 开启后等效于 bbpebyte_fallback=True,# 指定输入句子的最大长度,以字节为单位max_sentence_length=max_sentence_length

参数说明:

参数重要性推荐场景
input必填所有场景
model_prefix必填所有场景
model_type根据需求选择 unigrambpe
vocab_size通常设为 3200050000 或更高
character_coverage多语言数据设为 0.9995,单语言数据默认 1.0
byte_fallback处理未知字符时设为 True
max_sentence_length处理长文本时需调大(如 16384
split_digits需区分数字时设为 True
  • 添加词表

    词表训练之后需要添加词表,并保存:

    #1.加载bpe model
    sp_bpe = sp.SentencePieceProcessor()
    sp_bpe.load(bpe_model)
    #2.处理词汇
    raw_vocab = [sp_bpe.id_to_piece(id) for id in range(sp_bpe.get_piece_size())]
    clean_vocab = list(set(filter(is_chinese, raw_vocab)))
    #添加词汇并保存zz
    tokenizer.add_tokens(clean_vocab)
    tokenizer.save_pretrained(save_path)
    
  • 维度更新

经过词表注入或者词表训练,两种方法其中之一之后,更新模型的维度参数:

model.resize_token_embeddings(new_length)#new_length 为新词表的词汇量
model.save_pretrained(save_path)
微调对比实验(待补充)

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

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

相关文章

Python----计算机视觉处理(Opencv:图像边缘检测:非极大值抑制,双阈值筛选)

一、 高斯滤波 边缘检测本身属于锐化操作,对噪点比较敏感,所以需要进行平滑处理。这里使用的是一个5*5的高斯 核对图像进行消除噪声。 二、计算图像的梯度和方向 三、非极大值抑制 在得到每个边缘的方向之后,其实把它们连起来边缘检测就算完了…

用Deepseek写扫雷uniapp小游戏

扫雷作为Windows系统自带的经典小游戏,承载了许多人的童年回忆。本文将详细介绍如何使用Uniapp框架从零开始实现一个完整的扫雷游戏,包含核心算法、交互设计和状态管理。无论你是Uniapp初学者还是有一定经验的开发者,都能从本文中获得启发。 …

JS数组方法

数组方法 一、数组 JavaScript 数组的大小是可调整的,并且可以包含不同 数据类型。(当不需要这些特性时,请使用 类型数组。) 注:JavaScript 类型数组是类似数组的对象,它提供了一种在内存缓冲区中读取和写…

string 的接口

我们继续来讲解一些常用的string接口。 一.at接口 我们来看一个越界的问题。 我们运行之后发现这是一个断言错误,直接就终止我们的程序了,不能作为异常被捕捉到,但是我们如果不想让程序直接崩溃该怎么办呢? 此时我们就要用到at关键…

2000-2019年各省地方财政行政事业性收费收入数据

2000-2019年各省地方财政行政事业性收费收入数据 1、时间:2000-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政行政事业性收费收入 4、范围:31省 5、指标说明:地方财政行政事业…

Pytorch学习笔记(九)Learning PyTorch - Deep Learning with PyTorch: A 60 Minute Blitz

这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 Deep Learning with PyTorch: A 60 Minute Blitz 部分, 官网链接:https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html 完整网盘链接: https://pan.baidu.com/s/1L9…

Elasticsearch 的搜索功能

Elasticsearch 的搜索功能 建议阅读顺序: Elasticsearch 入门Elasticsearch 搜索(本文) 1. 介绍 使用 Elasticsearch 最终目的是为了实现搜索功能,现在先将文档添加到索引中,接下来完成搜索的方法。 查询的分类&…

比特币等虚拟货币实时价格使用说明,数字货币价格获取,k线获取,实时价格获取

数据截图 k线数据 websocket 实时价格数据 根据这些数据可以做出自己的产品 获取时间段内的k线数据 在开始之前,你需要知道的知识: 币种缩写英文名币种IDBTCBitcoinbitcoinETHEthereumethereumEOSEOSeosUSDTTethertetherLTCLitecoinlitecoinUSDDol…

初阶7 vector

本章重点 vector的介绍vector的使用vector的模拟实现 1.vector的介绍 vector就类似数据结构中的顺序表 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。 意味着可以采用下标对vector的元素 进行访问,和数…

解码未来:DeepSeek开源FlashMLA,推理加速核心技术,引领AI变革

前言: DeepSeek 兑现了自己的诺言,开源了一款用于 Hopper GPU 的高效型 MLA 解码核:FlashMLA。 项目地址:https://github.com/deepseek-ai/FlashMLA 1:FlashMLA 是什么呀? MLA是DeepSeek大模型的重要技术创新点&…

scss预处理器对比css的优点以及基本的使用

本文主要在vue中演示&#xff0c;scss的基本使用。安装命令 npm install sass sass-loader --save-dev 变量 SCSS 支持变量&#xff0c;可将常用的值&#xff08;如颜色、字体大小、间距等&#xff09;定义为变量&#xff0c;方便重复使用和统一修改。 <template><…

GPU架构与通信互联技术介绍

文章目录 GPU架构介绍SM 和 Warp Scheduler GPU通信互联技术介绍1、GPUDirectGPUDirect Shared AccessGPUDirect P2PGPUDirect for VideoGPUDirect for RDMARDMAGPUDirect RDMA GPUDirect Storage 2、NVLink & NVSwitchNVLinkNVSwitch 3、应用场景总结 GPU架构介绍 SM 和 …

强化学习与神经网络结合(以 DQN 展开)

目录 基于 PyTorch 实现简单 DQN double DQN dueling DQN Noisy DQN&#xff1a;通过噪声层实现探索&#xff0c;替代 ε- 贪心策略 Rainbow_DQN如何计算连续型的Actions 强化学习中&#xff0c;智能体&#xff08;Agent&#xff09;通过与环境交互学习最优策略。当状态空间或动…

day 16

创建链接文件 软链接&#xff1a;又叫符号链接&#xff0c;类似win的快捷方式&#xff0c;是一种用来建立文件的特殊文件&#xff0c;这个文件里的数据都是建立链接的文件&#xff0c;但是它和建立链接的文件不是一个东西&#xff0c;如果建立链接的文件移动或删除&#xff0c…

fork系统调用

基本概念&#xff1a; 在操作系统里&#xff0c;进程是正在运行的程序的实例。fork() 函数的作用是复制当前进程&#xff0c;生成一个新的进程&#xff0c;这个新进程被称作子进程&#xff0c;而原本的进程则是父进程。这两个进程&#xff08;父进程和子进程&#xff09;会从 …

【leetcode刷题记录】(java)数组 链表 哈希表

文章目录 四、题目之&#xff1a;代码随想录(1) 代码随想录&#xff1a;数组[704. 二分查找](https://leetcode.cn/problems/binary-search/)[27. 移除元素](https://leetcode.cn/problems/remove-element/)暴力解:双指针&#xff1a; [977. 有序数组的平方](https://leetcode.…

在线运行vscode

安装 https://github.com/coder/code-server?utm_sourcesyndication&pubDate20250317 运行前预览脚本 curl -fsSL https://code-server.dev/install.sh | sh -s -- --dry-run运行脚本 curl -fsSL https://code-server.dev/install.sh | sh其他 可以通过后台服务运行&am…

【Tauri2】002——Cargo.toml和入口文件

目录 前言 正文 toml文件的基础 注释——# Comment 键值对——Key/Value 表——[table] 内联表——Inline Table 数组——Array package和crate Cargo.toml文件 Cargo.toml——dependencies Cargo.toml——lib crate-type main.rs 前言 【Tauri2】001——安装及…

Netty源码—7.ByteBuf原理三

大纲 9.Netty的内存规格 10.缓存数据结构 11.命中缓存的分配流程 12.Netty里有关内存分配的重要概念 13.Page级别的内存分配 14.SubPage级别的内存分配 15.ByteBuf的回收 9.Netty的内存规格 (1)4种内存规格 (2)内存申请单位 (1)4种内存规格 一.tiny&#xff1a;表示从…

W、M、C练题笔记(持续更新中)

web here are the flag 点击&#xff0c;页面跳转404.php&#xff0c;用bp抓包访问/flag.php页面&#xff0c;得到flag用base64解码 TryToFindFlag 打开后查看源代码 发现是robots协议&#xff0c;访问robots.txt 访问flllaaa......&#xff0c;得到空白页面&#xff0c;查看…