跳转至

cs336 BPE 分词器学习

实际上我们很想脱离分词器,期待得到一种端到端的、按字节处理的,但目前还没有做到,所以学习分词器是有必要的。

前面叽里呱啦讲了很多种分词方法,然后通过词表大小、压缩率来评判,最后要重点讲的是 BPE(Byte Pair Encoding)

压缩率:tokenizer能不能用较少的token表示同一段文本,\(\frac{原始字节数}{token 数}\)

BPE 简述

用原始文本训练分词器,构建为数据量身定制的词表,常见的序列会被表示成一个token,罕见的序列会被拆成多个token

为什么 token 数少很重要?

Transformer 的成本和序列长度强相关,self-attention 的计算量近似是 \(O(n^2)\)

还影响上下文长度,上下文长度一般以 token 为单位

BPE 是一个启发式的、数据驱动的

即使之后不需要学分词器了,取代他的技术也需要有以下几个特性

  1. 模型应该在序列的 chunk,也就是抽象后的文本块上运行
  2. 这些 chunk 应该是可变的,从而把更多模型能力分配给更值得处理的部分(难的部分获得更多计算)
啥是 chunk?
  • 一小段连续字节
  • 一组字符
  • 一个自动学习出来的文本片段
  • 或者这段文本经过局部网络压缩后形成的向量

我误以为 latent 就是一种 chunk,实际 chunk 指的是哪些输入放在一起,而 latent 是模型内部对某些信息形成的隐藏表示,一个 chunk 可能会被编码成一个 latent,

暂时不去花太多时间做分词器的代码实践了,时间不够