首页 > 其他分享 >Huggingface | 修改模型的embedding

Huggingface | 修改模型的embedding

时间:2023-07-29 18:33:06浏览次数:36  
标签:embeddings tokenizer 模型 Huggingface tokens embedding print model

目标:

在NLP领域,基于公开语料的预训练模型,在专业领域迁移时,会遇到专业领域词汇不在词汇表的问题,本文介绍如何添加专有名词到预训练模型。

NLP的处理流程:

  1. 对输入的句子进行分词,得到词语及下标
  2. 通过embedding层获得词语对应的embedding
  3. embedding送入到预训练模型,经过attention注意力机制,获得token在句子中的语义embedding向量
  4. 利用语义embedding向量,构建下游任务。

其中,预训练模型是在公开语料上训练的,我们在做迁移学习,把模型迁移到财经领域时,会面临的一个问题,就是财经词汇不在词汇表,会被拆分成单个字,从而会导致专业名词的完整意思的破坏,或者让模型去学习时,不那么直观

在tokenizer中添加新词汇

    1. 在vocab.txt中,利用前100里的[unused],将[unused]换成自己想要添加的。具体有多少个[unused]要看自己的预训练模型,可能100个,可能1000个,但都有限。如果要添加的词汇量小,并且预训练模型确实有vocab.txt文件,则可以,比如bert,目前看对于领域来说,量不够大。
    1. 更加通用的办法:通过tokenizer,向词汇表中追加新的专业词汇,没有不限。特别是现在比较复杂的模型,都没有单独的vocab.txt文件了,只能通过这种方式。
from transformers import AutoModel, AutoTokenizer

# 加载预训练模型和tokenizer
model = AutoModel.from_pretrained("./bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("./bert-base-uncased")

# 添加新词汇到tokenizer的词汇表中
print(len(tokenizer)) # 30522
tokenizer.add_tokens(["newword","awdddd"])
print(len(tokenizer)) # 30524

新词汇embedding的生成

新词汇的加入,势必会不适配原始embedding的维度,原始的embedding维度为[vocab_size,hidden_size],但是我们又不可能重新去训练整个embedding,我们想尽量保留原始embedding参数,因此,这里比较巧妙的运用了reshape技巧,人为添加新词汇的embedding(随机的,没学习),然后使用领域材料进行学习。

这种方法,因为是添加token,需要修改embedding matrix。

实验证明resize matrix不会打扰原始预训练的embeddings。

from transformers import AutoModel, AutoTokenizer

# 加载预训练模型和tokenizer(重要)
model = AutoModel.from_pretrained("./bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("./bert-base-uncased")

# 添加新词汇到tokenizer的词汇表中(重要)
print(len(tokenizer))
tokenizer.add_tokens(["newword","awdddd"])
print(len(tokenizer))

x = model.embeddings.word_embeddings.weight[-1, :]

# 扩展模型的嵌入矩阵,以包含新词汇的嵌入向量(重要)
model.resize_token_embeddings(len(tokenizer))

y = model.embeddings.word_embeddings.weight[-2, :]

z = model.embeddings.word_embeddings.weight[-1, :]

x1 = model.embeddings.word_embeddings.weight[-3, :]
 
print(y.shape) # torch.Size([768])
print(z.shape) # torch.Size([768])
print(x == x1) # 原始token的embedding会改变吗?原来embedding weight 不会变

# 使用新的嵌入向量初始化新词汇的嵌入向量
a = model.get_input_embeddings()
print(a) # Embedding(30524, 768)

tok = tokenizer.convert_tokens_to_ids(["newword"])
print(tok) # [30522]


# 保存微调后的模型和tokenizer(重要)
model.save_pretrained("./gaibian")
tokenizer.save_pretrained("./gaibian")

生成的文件,多了一个added_tokens.json

有了这个初始embedding,经过MLM等任务,就可以训练新词汇的embedding表示了,通过下游任务来学习这个embedding。

huggingface中的added_tokens.json文件

在 Hugging Face 中,added_tokens.json 文件是一个 JSON 格式的文件,用于存储添加到 tokenizer 中的特殊标记(special tokens)。

使用 Hugging Face 的 tokenizer 时,我们可以通过 tokenizer.add_tokens() 方法向 tokenizer 中添加自定义的特殊标记。添加的特殊标记会被保存在 added_tokens.json 文件中,以便在下次使用 tokenizer 时重新加载。

如果您想添加自定义的特殊标记,请确保将其添加到 added_tokens.json 文件中,并使用 tokenizer.add_tokens() 方法将其添加到 tokenizer 中。

加载训练后的模型

from transformers import AutoModel, AutoTokenizer

# 加载预训练模型和tokenizer
model = AutoModel.from_pretrained("./gaibian")
tokenizer = AutoTokenizer.from_pretrained("./gaibian")

print(model) # 模型的框架
print("=====================")
tok1 = tokenizer.convert_tokens_to_ids(["newword"])
tok2 = tokenizer.convert_tokens_to_ids(["awdddd"])
print(tok1) # [30522]
print(tok2) # [30523]

说明可以加载。

标签:embeddings,tokenizer,模型,Huggingface,tokens,embedding,print,model
From: https://www.cnblogs.com/zhangxuegold/p/17590268.html

相关文章

  • 模型选择 欠拟合与过拟合
    #模型选择欠拟合与过拟合#创建数据集frommxnetimportautogradfrommxnetimportndarrayasndfrommxnetimportgluonnum_train=100num_tset=100true_w=[1.2,-3.4,5.6]true_b=5.0#生成数据集X=nd.random_normal(shape=(num_train+num_tset......
  • SAP Fiori Elements 应用 OData 元数据请求 url 里的模型名称决定逻辑
    问题我用yarnstart本地启动一个SAPFioriElements应用,在Chrome开发者工具network面板,观察到一个ODatametadata请求的url如下:http://localhost:8080/sap/opu/odata/sap/SEPMRA_PROD_MAN/$metadata?sap-value-list=none&sap-language=EN这个OData服务名称SEPM......
  • 基于C语言设计的全局光照明模型
    完整资料进入【数字空间】查看——搜索"writebug"Part1Whitted-StyleRayTracingStep0.算法流程为了渲染出一张图片,RayTrace()计算了给定像素点的色彩取值。根据光路可逆原理,可以从人眼作为出发点,沿着指向该pixel的某一点的方向发出一条ray。Step1:射线求交这条ray会碰到一个......
  • OSI(Open Systems Interconnection)的五层(七层)模型
    OSI(OpenSystemsInterconnection)是一个用于计算机网络通信的参考模型,由国际标准化组织(ISO)于1984年提出。它将计算机网络通信过程划分为七个不同的层次,从物理传输层到应用层,每个层次都有其特定的功能和任务。然而,常见的网络模型实际上是TCP/IP模型,它是OSI模型的一种实际应用。TCP/......
  • 推荐带500创作模型的付费创作V2.1.0独立版系统源码
    ChatGPT付费创作系统V2.1.0提供最新的对应版本小程序端,上一版本增加了PC端绘画功能,绘画功能采用其他绘画接口–意间AI,本版新增了百度文心一言接口。后台一些小细节的优化及一些小BUG的处理,前端进行了些小细节优化,针对上几版大家非常关心的卡密兑换H5端及小程序端......
  • 3DSOM软件基于物体的照片构建空间三维模型的方法
      本文介绍基于3DSOM软件,实现侧影轮廓方法的空间三维模型重建。(基于3DSOM的侧影轮廓方法空间三维模型重建)  我们首先从侧影轮廓建模方法开始,对空间三维建模的一些内容加以介绍。本文我们将基于3DSoftwareObjectModeler(3DSOM)这一软件,对上述方法加以完整的操作,并对结果加......
  • AIGC与NLP大模型实战-经典CV与NLP大模型及其下游应用任务实现
    点击下载:AIGC与NLP大模型实战-经典CV与NLP大模型及其下游应用任务实现提取码:hqq8当今社会是科技的社会,是算力快速发展的时代。随着数据中心、东数西算、高性能计算、数据分析、数据挖掘的快速发展,大模型得到了快速地发展。大模型是“大算力+强算法”相结合的产物,是人工智能的发展......
  • softmax回归模型——pytroch版
    importtorchfromIPythonimportdisplayfromd2limporttorchasd2l#fromd2l.mxnetimportAccumulatorbatch_size=256#每次读256张图片,返回训练iter和测试itertrain_iter,test_iter=d2l.load_data_fashion_mnist(batch_size)num_inputs=784num_outputs......
  • softmax回归模型simple——pytroch版
    importtorchfromtorchimportnnfromd2limporttorchasd2lbatch_size=256train_iter,test_iter=d2l.load_data_fashion_mnist(batch_size)#PyTorch不会隐式地调整输入的形状。因此,#我们在线性层前定义了展平层(flatten),来调整网络输入的形状net=nn.Sequenti......
  • 线性回归模型实现——pytorch版
    importrandomimporttorchfromd2limporttorchasd2ldefsynthetic_data(w,b,num_examples):"""生成y=Xw+b+噪声"""x=torch.normal(0,1,(num_examples,len(w)))#01正态分布,num_examples个样本,len(w)列print('len是:'......