CS336 note

BPE

为什么要预分词?
我们希望BPE得到的分词结果是真实词汇的子集,而不是跨单词、包含标点符号的分词结果。预分词从训练数据中提取真实词汇,为pair的首次生成划定了范围(不允许跨预分词边界合并)。并且预分词还会统计每个词汇在语料库的出现次数。

BPE过程需要的数据:
预分词结果:包含token和token出现次数
根据预分词的token进行字节对生成,同时基于token出现次数统计每个pair的次数
并且维护一个pair_to_original_token字典,key是pair,value是原始token(未进行分词)的set
维护一个pair_frequencies字典,用来记录和更新pair的出现次数
维护一个token_seq字典,用来记录和更新每个真实token当前的分词结果

基于上述数据完成下面的循环流程,每次merge一个循环
首先通过max确定这次循环内要处理的最高出现次数的pair,根据pair去pair_to_original_token里遍历每个真实token,再去token_seq中拿到真实token现在的分词形式current_token_seq。然后首先减去在pair_frequencies中当前current_token_seq中每个pair的出现频率,随后进行对目标pair进行合并,合并完成后重新遍历current_token_seq中的pair,并在pair_frequencies中增加计数和创建新的pair(如果有)。
完成上述操作后,在token_seq中更新当前token的实际编码方式。

Tokenizer

list的查找复杂度o(N),dict查找复杂度o(1) (hash)
为了加速对一个list的查找,可以把它转换为dict

若有special_tokens,则采用正则表达式的奇偶分割法处理输入文本
加速查找merge_pair:检查当前token所有pair是否存在于merges中,若有则选择min pair进行本次合并

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注