前面总体学习了《ChipNeMo: Domain-Adapted LLMs for Chip Design》,因为比较匆忙,对于文章中还有三个细节:领域适配分词、SteerLM和领域数据微调的预训练检索模型,作为遗留问题需要继续学习。
什么是tokenization?
先来看看,什么是tokenization?借助最近比较火的秘塔搜索,简单了解一下。
将文本划分为不同token的过程称为 tokenization。
tokenization是将输入和输出文本分割成更小的单元,可以由 LLM AI 模型处理的数据表示。根据文本的复杂性和可变性,可以使用不同的方法进行tokenization,比如基于规则的方法、统计方法或神经网络方法。
tokenization涉及到将文本分割成有意义的单元,以捕捉其语义和句法结构,可以采用各种tokenization技术,如字级、子字级(例如,使用字节对编码或WordPiece)或字符级。根据特定语言和特定任务的需求,每种技术都有自己的优势和权衡。
tokenization是特定于模型的。根据模型的词汇表和tokenization方案,token可能具有不同的大小和含义。不同模型训练有各自的tokenization方法,而且尽管 LLaMa与ChatGPT同样使用字节对编码(Byte-Pair Encoding,BPE)的子词tokenization方法,但token也与ChatGPT不同。
领域适配分词(Domain-Adaptive Tokenization)
对于领域适配分词,论文《ChipNeMo》的描述非常简略。
在适配一个预训练的分词器时,主要目标是提高领域特定数据的分词效率,保持语言模型在一般数据集上的性能,并尽量减少重新训练/微调的工作量。为了实现这一目标,设计以下方法:
-
使用领域特定数据从头开始训练一个分词器。
-
从新分词器的词汇表中识别出在通用分词器中不存在且在通用数据集中很少出现的token。
-
在第2步中识别出的token基础上,扩展通用分词器。
-
通过使用通用分词器初始化新token的模型嵌入。
对于第4步,具体来说,当遇到一个新token时,首先使用原始预训练的通用分词器对其进行重新分词。LLM 对新Token的嵌入是通过对通用分词器生成的Token的嵌入进行平均来确定的。LLM的新token的最终输出层权重初始化为零。
第2步通过选择性地引入在一般数据集中很少遇到的新token,有助于保持预训练LLM在一般数据集上的性能。第4步通过初始化新token的嵌入来减少重新训练或微调LLM所需的工作量,这是通过通用分词器引导的。这种领域适配分词的方法,旨在通过适应领域特定的术语和模式来提高LLM在芯片设计数据集上的性能,同时保持其在一般数据集上的泛化能力。
对于文章的描述,具体如何操作,看过之后不甚明了,尤其是第四步。文章提到了论文《IndoBERTweet: A Pretrained Language Model for Indonesian Twitter with Effective Domain-Specific Vocabulary Initialization》。前文学习之后,再重新看文章中提到的四个步骤,能够大概理解。当然,如何分词,是一个非常复杂并非常关键的技术,有很多文章,需要更深入更持续的学习。
Domain-Adaptive Tokenization的作用
Domain-Adaptive Tokenization的主要作用和带来的性能提升包括:
-
提高特定领域的文本处理效率:通过为领域特定的术语(例如 RTL 中常见的关键字)定制规则和模式,Domain-Adaptive Tokenization 可以提高分词效率。
-
保持通用数据集上的语言模型性能:在引入新Token时,通过选择在通用数据集中不常见的Token,可以保持预训练语言模型在处理通用数据集时的性能。
-
减少重新训练或微调的工作量:通过使用预训练的通用分词器初始化新Token的嵌入,可以减少对语言模型进行重新训练或微调的工作量。
提高分词效率方面,经过领域适配分词的四步流程,将LLaMA2 分词器(包含 32K Token)调整为芯片设计数据集,大约 9K 个新Token被添加到 LLaMA2 分词器中。在各种芯片设计数据集上,经过领域适配分词,在下游任务的性能可以提高1.6%到3.3%。如下图。
即使在引入新Token之后,分词器在公共数据集上的效率也没有显著变化,这意味着它没有对模型在非领域特定任务上的性能产生负面影响。
通过这些改进,Domain-Adaptive Tokenization 有助于使大型语言模型更好地适应特定的工业应用,如芯片设计,从而在这些专业领域内提高模型的效用和性能。
总结一下领域适配分词的整体方法过程
领域适配分词,在已经有一个预训练的分词器(通用分词器)的基础上,对这个分词器进行扩展,以包含领域特定的词汇,并对领域新增词汇训练完成领域特有词汇的模型嵌入。
以下是这一步骤的实现方法:
-
使用领域特定数据从头开始训练一个分词器,分词逻辑可能是基于规则的方法、统计方法或神经网络方法。
-
扩展词汇表:然后创建一个扩展的词汇表,包括原始预训练分词器的词汇和新的领域特定词汇。这通常涉及到将新词汇添加到词汇表的末尾。
-
初始化新词汇的嵌入:对于新的领域特定词汇,需要初始化它们的嵌入。这可以通过多种方式实现,例如:
-
随机初始化:为新的词汇分配随机的向量值。
-
基于规则的映射:如果有关于新词汇的先验知识(例如,它们与其他已知词汇的语义关系),你可以使用这些信息来指导嵌入的初始化。
-
迁移学习:使用预训练分词器的嵌入层作为起点,通过在新数据上进行微调来调整这些嵌入。
- 微调模型:在初始化了新词汇的嵌入之后,可以在包含领域特定数据的训练集上对整个嵌入层进行微调。这个过程可以通过以下方式实现:
-
冻结预训练嵌入:保持预训练嵌入层的权重不变,只更新新词汇的嵌入权重。
-
联合训练:同时更新预训练嵌入和新词汇的嵌入,使模型能够更好地适应领域特定数据。
- 评估和调整:在微调过程中,需要不断评估模型的性能,确保新词汇的嵌入能够有效地帮助模型理解和处理领域特定文本。根据评估结果,可能需要调整微调策略或进一步优化嵌入层。
这个过程确保了新加入的领域特定词汇能够在模型中获得有意义的表示,同时保留了预训练分词器在处理通用语言任务时的已有知识。通过这种方式,可以创建一个既能够处理通用语言,又能够适应特定领域需求的分词器。
(欢迎关注微信公众号:老无谈藏书票)