词元分析算法(一) —BPE(Byte Pair Encoding)

LLMs 讲到这个地方,目测还缺少一个环节,那就是最初始的词元分析,即我们平常口中说的分词,所有的NLP 模型,都是先对文本句子进行切分为一个个词元(单词), 然后进行embedding 到一个高维空间(这些高维空间中参数是模型待学习参数的一部分),常见的分词算法有BPE(Byte Pair Encoding), WordPiece,Unigram Language Model等,下面先介绍一下BPE 算法。

BPE是一种子词切分算法,将稀有和未知的单词编码为子词单元的序列。 这种思路是将不同词类通过拆分为比单词更小的单元进行组合(翻译),例如名称(通过字符复制或音译)、复合词(通过组合翻译)、同源词和介词(通过语音和形态转换),BPE 算法主要步骤如下:

1.准备足够大的训练语料

2.确定期望的subword词表大小

3.将单词拆分为字符序列并在末尾添加后缀“ ”,统计单词频率。 本阶段的subword的粒度是字符。 例如,“ low”的频率为5,那么我们将其改写为“ l o w ”:5

4.统计每一个连续字节对的出现频率,选择最高频者合并成新的subword

5.重复第4步直到达到第2步设定的subword词表大小或下一个最高频的字节对出现频率为1

相关分词算法的实现都在Google 开源的sentencepiece 包中已有实现,下面demo如下:

import sentencepiece as spm
spm.SentencePieceTrainer.train(
    input="data/feature/hotel_introduction.tsv",
    model_prefix="data/bpem",
    vocab_size=5000,
    model_type="bpe",
)
sp = spm.SentencePieceProcessor(model_file="data/bpem.model")
out = sp.encode_as_pieces(["爱我中华", "待测试"])
print(out)

[['▁', '爱', '我', '中华'], ['▁', '待', '测', '试']]

在目前已经发布的开源LLM 算法中,GPT-2、RoBERTa、XLM,Llama12、Baichuan12 等都是基于BPE 算法进行词元切分。其不仅在英文模型使用量广泛,在支持中文的模型中使用的越来越多;

对于中文模型使用BPE 算法,其实是在byte 层面进行合并,在UTF-8编码下,一个中文由三个byte 编码而成。这个和西文中一个byte 就是一个字符char 是有所区别的。

展开阅读全文

页面更新:2024-03-31

标签:算法   词表   切分   分词   组合   中文   单词   字符   频率   模型

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top