cs336 BPE 分词器学习
实际上我们很想脱离分词器,期待得到一种端到端的、按字节处理的,但目前还没有做到,所以学习分词器是有必要的。
前面叽里呱啦讲了很多种分词方法,然后通过词表大小、压缩率来评判,最后要重点讲的是 BPE(Byte Pair Encoding)
压缩率:tokenizer能不能用较少的token表示同一段文本,\(\frac{原始字节数}{token 数}\)
BPE 简述
用原始文本训练分词器,构建为数据量身定制的词表,常见的序列会被表示成一个token,罕见的序列会被拆成多个token
为什么 token 数少很重要?
Transformer 的成本和序列长度强相关,self-attention 的计算量近似是 \(O(n^2)\)
还影响上下文长度,上下文长度一般以 token 为单位
BPE 是一个启发式的、数据驱动的
即使之后不需要学分词器了,取代他的技术也需要有以下几个特性
- 模型应该在序列的 chunk,也就是抽象后的文本块上运行
- 这些 chunk 应该是可变的,从而把更多模型能力分配给更值得处理的部分(难的部分获得更多计算)
啥是 chunk?
- 一小段连续字节
- 一组字符
- 一个自动学习出来的文本片段
- 或者这段文本经过局部网络压缩后形成的向量
我误以为 latent 就是一种 chunk,实际 chunk 指的是哪些输入放在一起,而 latent 是模型内部对某些信息形成的隐藏表示,一个 chunk 可能会被编码成一个 latent,
暂时不去花太多时间做分词器的代码实践了,时间不够