Transformer模型添加新的[token]

使用场景

在Transfomer模型输入的文本中常常会额外使用一些特殊[token]来表示一些特殊含义,比如希望对LLM通过设计prompt提升下游任务效果。

最开始在Bert预训练文本中就约定俗成用[CLS]表示句子开头、[SEP]表示隔开两个句子的符号、[UNK]表示未登录词、[PAD]表示该位置补充0。同时将特殊token加入模型词汇表vocab后可以防止tokenzier在切词时将该[token]切开,在文本编码时保留该[token]为一个整体。

常见使用场景在Bert表征文本时,你需要再使用一些特殊的[token]加入输入的文本中,能起到额外补充一些信息的作用。当然效果好的前提是需要足够多数据让模型finetune。如果数据量少,不如采用词表中已有的特殊[token]去做训练。

实现方法

常见实现方式有以下:

  • 1.直接修改词表vocab.txt,具体通过替换其中[unuesd]的token。
  • 2.通过tokenizer.add_tokens() 添加,再使用model.resize_token_embeddings() 随机初始化权重。
  • 3.通过tokenizer.add_special_tokens() 添加,再使用model.resize_token_embeddings() 随机初始化权重。

这里面方法1,经实验已经无效,无法通过直接修改vocab.txt实现添加新的自定义token,方法2和3的效果等价。

model.resize_token_embeddings()的作用是将模型的embedding size重新进行变换。

new_num_tokens大于原先的max word的话,会在末尾pad新随机初始化的vector ; 小于原先的max word的话,会把末尾的word embedding vector删掉。而且这个操作只是pad 新的token或cut已有的token,其他位置token的预训练词向量不会被重新初始化。因此可以实现仅对新增加的自定义[token]进行随机初始化。

在这里插入图片描述

实践方法

from transformers import BertConfig
from transformers import BertTokenizer
from transformers import BertModel

model_name = "hfl/chinese-roberta-wwm-ext/"
model_dir = "models/pretrain_models/" + model_name

config = BertConfig.from_pretrained(model_dir)
model = BertForMaskedLM.from_pretrained(model_dir)
tokenizer = BertTokenizer.from_pretrained(model_dir)

add_tokens = ["[desc]", "[title]"]
tokenizer.add_tokens(add_tokens)                                #返回一个数,表示加入的新词数量(2)

special_tokens_dict = {'additional_special_tokens': add_token}. # add_special_tokens 传入是一个key为additional_special_tokens的dict
tokenizer.add_special_tokens(special_tokens_dict)               # 效果与add_tokens等价

model.resize_token_embeddings(len(tokenizer))  #关键步骤,重新调整所有的向量数量,即vocab size
tokenizer.save_pretrained(model_dir)           #将当前tokenizer保存本地,实现保留增加[token]。

执行完tokenizer.save_pretrained(model_dir) 后,你可以在原保存model目录下,查看vocab.txt中[unused]被替换掉,同时如果之前没有就会生成added_tokens.json,special_tokens_map文件。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Transformer模型中,token是指输入序列中的每个词语或图像中的每个图像块。在NLP中,每个单词被视为一个token,并且通常还有一个特殊的token称为CLS,用于标注句子的语义。在CV中,图像被切割成不重叠的patch序列,每个patch也被视为一个token。\[1\]\[3\] 在Transformer模型中,tokenization是指将文本或图像划分为不同的token。这些token可以是单词、图像块或其他形式的输入单元。\[1\] 在Transformer模型中,embedding层用于将token转化为向量表示。这些向量表示被称为word-embedding,它们使用浮点型的稠密矩阵表示token。每个token的向量表示具有不同的维度,可以是100、256、300等等。这些向量的值是超参数,初始时是随机生成的,并在训练过程中进行学习。通过将文本或句子转化为向量表示,可以更好地表示和处理文本数据。\[1\] 在Transformer模型中,还有两个重要的概念是cls_token和Positional Encoding。cls_token是在输入序列的首位置添加的特殊token,用于对所有的token进行信息汇聚,以用于后续的分类任务。Positional Encoding用于为输入序列中的每个token添加位置信息,以帮助模型捕捉序列中的顺序关系。\[2\] 总结起来,Transformer模型中的token是指输入序列中的每个词语或图像中的每个图像块。它们经过tokenization分割,并通过embedding层转化为向量表示。在NLP中,还有一个特殊的token称为CLS,用于标注句子的语义。在CV中,图像被切割成不重叠的patch序列,每个patch也被视为一个token。同时,还有cls_token和Positional Encoding用于信息汇聚和位置编码。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [Transformer超详细整理](https://blog.csdn.net/Sakura_day/article/details/118341728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Transformer](https://blog.csdn.net/weixin_41677138/article/details/127137986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [transform中的token理解(单词或词语的标记)](https://blog.csdn.net/weixin_43135178/article/details/118877976)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值