大模型中分词方法的探究

大模型中的分词方法探究

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

一 分词单位

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

二.subword子词粒度

切分到介于字符和词之间的单元。wordpiece方法,BPE方法,BBPE方法

相比于提前预定义一个词表,以下三种方法,都是先用一份训练语料中,生成出一个词表,再用该词表对海量数据做分词。

生成的方法:先定义最基本初始集合,类似26个字母,再将训练语料split为wordpiece单元的格式,再统计两两piece的分数/频率对,等各种指标,统计结果大的,先两两合并为一个新的单元,再继续迭代统计。每次把最高值对应的pair 加入词表集合中,最终得到一个有效词表。

image-20240709203222565

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

提出的思路:

类似wordpiece,是直接统计所有子词对的频率,出现最高的合并,重复合并,直到获得词表
最小单元是字符级别
3.3 BBPE方法
相比BPE,就是最小单元是字节
步骤:
1.构建词汇表:一个字节的256位来构建
2.构建频率统计:统计两个连续的字节单元对在文本中的频率
3.选择最高的,合并,append到词汇表
4.重复合并
5.得到最终词汇表。用该词汇表对文本进行分词。

上述分词算法实现工具:sencencepiece工具包。

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、付费专栏及课程。

余额充值