没写完,,,勿看

10017

Tokenization是所有NLP任务的第一步,有许多不同的实现方法。今天主要介绍LLaMA中采用的tokenizer:Byte Pair Encoding,实现方法用的是Google提供的分词工具SentencePiece。

基础知识

简单来说,BPE就是,限定一个目标词表数量上限,然后在给定的语料库中进行训练,算法会不断将高词频的词组合在一起(比如说“机器”和“学习”组成“机器学习”),直到达到设定的词表数量上限。

词表的生成是从字符level开始的,假设我们有一个corpus:

1
2
3
4
5
[5] low_  # [5] 表示出现频数,即数量
[2] lowest_
[6] newer_
[3] wider_
[2] new_

注意一定要将空格也记为一个字符,因为est_和est是不一样的,前者代表的是lowest这种词的结尾,而后者则不作为结尾,可能出现在像estate这种词中。

| 字符 | 频次 |
| … | … |
| _ | 18|

LLaMA代码

首先我们需要下载LLaMA的Tokenizer看一下:

1
2
3
4
from transformers import LlamaTokenizer

base_model = 'decapoda-research/llama-7b-hf'
tokenizer = LlamaTokenizer.from_pretrained(base_model)

会显示以下warning是因为,huggingface.transformers改过一次LlamaTokenizer的名字,和用之前库训练的模型中保存的信息对不上了,不用管

1
2
3
The tokenizer class you load from this checkpoint is not the same type as the class this function is called from. It may result in unexpected tokenization. 
The tokenizer class you load from this checkpoint is 'LLaMATokenizer'.
The class this function is called from is 'LlamaTokenizer'.