Subword算法

subword算法

BPE

  1. 构建基础字符集
  2. 不断将最高频率的组合加入词表,并更新频率统计

编码的时候,未出现在词表中的词记为 [UNK]

例:GPT-1词表有40478,基础字符集478个,merge 40000个step

Byte-level BPE

BPE的一个问题是,基础词汇表如果想覆盖所有可能(unicode),可能会非常大。所以直接用单个字节(256个)作为基础字符集 (一个字节当作一个 “字符” )

例:GPT-2词表有50257,基础字符集256个,一个eos,merge 50000个step

应用:

  • GPT-2,Roberta

  • transformers实现的版本,关于子词的部分有两个文件:

    • vocab.json:词表及对应编号,如果词就在这里,直接返回

    • merges.txt:BPE过程中merge得到的所有token;

    • 如果当前子词不在词表中,就用这个文件去重新从byte级开始组合

Wordpiece

选择能最大提高句子likelihood的组合,而不是按频率选

\[ \frac{P(xy)}{P(x)P(y)} \]

应用:

  • BERT
  • transformers实现的版本,关于子词的部分只有一个文件:
    • vocab.json:词表及对应编号,按最长匹配原则匹配子词,不在里面就<UNK>

Unigram Language Model

ULM 的算法思想是从一个巨大的词汇表出发,再逐渐删除其中的词汇,直到size满足预定义。

\[Loss=-\sum_i^Nlog(\sum_{x\in S(x_{xi})}P(x)) \]

假设训练文档中的所有词分别为 \(x_1;x_2...x_N\) ,每个词tokenize的方法是一个集合 \(S(x_i)\) ,每种方法的概率是 \(p(x)\)

如果从词汇表中删除部分词,则某些词的tokenize的种类集合就会变少,\(log(*)\) 中的求和项就会减少,从而增加整体loss。

Unigram算法每次会从词汇表中挑出使得loss增长最小的10%~20%的词汇来删除。

应用:

  • ALBERT,T5
  • transformers实现的版本如果用的SentencePiece,都会结合unigram

SentencePiece

SentencePiece是一个实现了BPE和ULM的子词开源工具包

entencePiece主要解决了以下三点问题:

  1. 以unicode方式编码字符,解决了多语言编码方式不同的问题。
  2. 将空格编码为‘_’, 如'New York' 会转化为['▁', 'New', '▁York'],这也是为了能够处理多语言问题,比如英文解码时有空格,而中文没有, 这种语言区别
  3. 优化了速度

常用模型的subword算法

Bert

wordpiece,忽略空格,用 ##表示非开头的子词

例:

'Emmmmmm, I cryed'

['em', '##mm', '##mm', '##m', ',', 'i', 'cry', '##ed']

GPT2、Roberta

Byte-level BPE,空格用 \(\dot{G}\) 表示

例:

'Emmmmmm, I cryed'

['E', 'mmmm', 'mm', ',', 'ĠI', 'Ġcry', 'ed']

T5

使用sentencepiece,空格用 _ 表示

'Emmmmmm, I cryed'

['_Em', 'm', 'mm', 'mm', ',', '_I', '_cry', 'e', 'd']
posted @   shiiiilong  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示