大模型中的分词方法探究

本文探讨了大模型中的不同分词方法,包括word、char和subword粒度(如wordpiece、BPE和BBPE),以及如何通过SentencePiece进行中文词表扩充,以提高LLaMA在中文场景下的编码效率。着重介绍了词表扩充的原因、过程和价值,以及如何结合额外的预训练数据和微调技术提升模型性能。
摘要由CSDN通过智能技术生成

大模型中的分词方法探究

参考 https://mp.weixin.qq.com/s/t8NuPRAVD9czLtvHhkZizg

一 分词单位

1.word词粒度
优点:语义明确,上下文信息
缺点:长尾效应,词表稀疏问题,OOV
2.char字符粒度
优点:字符粒度可以处理任何字符,不需要维护词表,可以解决OOV
缺点:处理效率低,语义信息不明确

二.subword子词粒度

切分到介于字符和词之间的单元。wordpiece方法
3.1 wordpiece方法
将单词拆分成多个前缀符号(比如BERT中的##)最小单元,再通过子词合并规则将最小单元进行合并为子词级别
步骤:
  1.用26个字母+基本符号,或者来自训练集的单个字符,作为初始词表。格式为 ##g,##n等
  2.在训练集中统计这些字符出现的频率,以及对应的pair出现的频率
  3.分数 = 合并pair候选的频率 / (第一个元素的频率 × 第二个元素的频率),用此公式计算分数,最高的先合并
  4.如此递归合并,直到获得词表大小,用该词表来做分词
3.2 BPE方法

提出的思路:

image-20240328104926798

类似wordpiece,是直接统计所有子词对的频率,出现最高的合并,重复合并,直到获得词表
用词表做分词
3.3 BBPE方法
相比BPE,就是最小单元是字节
构建词汇表:一个字节的256位来构建

image-20240326190822817

3.4 sentencepiece的思路

思路是:SentencePiece提出的目的是在给定词汇表大小的前提下,最大化词表信息编码(词频+多样性)subword编码。

它是把句子看做一个整体,再拆成片段,把空格也当做一个特殊字符来处理。实现了从句子中训练得到子词的方法。是个子词开源工具包,集成了BPE,ULM子词算法。sentencepiece还能支持字符和词级别的分词。

优点:
1.以unicode方式编码字符,将所有的输入(英文、中文等不同语言)都转化为unicode字符,解决了多语言编码方式不同的问题。这种策略允许模型学习到单词的一部分,而非整个词,增加了模型的泛化性。
2.将空格编码为‘_’, 如'New York' 会转化为['▁', 'New', '▁York'],这也是为了能够处理多语言问题,比如英文解码时有空格,而中文没有, 这种语言区别
3.优化了速度,如果实时处理输入并对原始输入执行标记化,则速度会太慢。 SentencePiece 通过使用 BPE 算法的优先级队列来加速它来解决这个问题,以便可以将它用作端到端解决方案的一部分。
4.无监督的训练方式。无需人工指定词汇表大小,SentencePiece可以通过数据驱动的方式自动确定最佳的词汇表规模。

三 对中文词表做扩充

词表扩充的常规方法

1.给定训练语料,用sentencepiece训练词表模型
2.合并词表
参考:https://zhuanlan.zhihu.com/p/649543347     对llama模型的词表的扩充
   https://mp.weixin.qq.com/s/-FUCqxIOZZPFb8L3VSVf8A 给baichuan的词表的扩充

原因:llama模型,词表中中文token很少,几百个。对中文进行tokenization时候,一个中文含义要切分为多个token,显著降低编码效率。比如,在扩展词表后的模型中,单个汉字倾向于被切成1个token,而在原版LLaMA中可能就需要2-3个才能组合成一个汉字,显著降低编解码的效率。

扩充词表后的价值:
1.提高模型的编码效率,可以把一些垂直领域的词加入词表中。不至于分词分的稀碎

llama用于中文场景方法:

1.扩充中文词汇表:在中文语料库上训练一个中文tokenizer模型,然后将中文 tokenizer 与 LLaMA 原生的 tokenizer 进行合并,通过组合它们的词汇表,最终获得一个合并后的 tokenizer 模型。

训练中文token模型:

用sentencepiece,输入为一行一个文本,输出为分词模型,
训练命令:
 import sentencepiece as spm
spm.SentencePieceTrainer.train(input=<input>, model_prefix=<model_name>, vocab_size=8000, character_coverage=1.0, model_type=bpe)

合并训练后的模型和原始llama模型:

脚本:merge_tokenizers.py

2.使用增加的中文预训练数据集(Chinese-LLaMA-Alpaca使用了120GB),对模型进行中文继续预训练;

run_clm_pt_with_peft.py

3.加入SFT指令微调训练,以及RLHF训练

run_clm_sft_with_peft.py
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值