赞
踩
参考文章:深入理解NLP Subword算法:BPE、WordPiece、ULM
使用API:
Subword算法如今已经成为了一个重要的NLP模型性能提升方法。自从2018年BERT横空出世横扫NLP界各大排行榜之后,各路预训练语言模型如同雨后春笋般涌现,其中Subword算法在其中已经成为标配。所以作为NLP界从业者,有必要了解下Subword算法的原理。
总结:即传统的按空格分词方法对于词的泛化能力不够
BPE(字节对)编码或二元编码是一种简单的数据压缩形式,其中最常见的一对连续字节数据被替换为该数据中不存在的字节[2]。 后期使用时需要一个替换表来重建原始数据。OpenAI GPT-2 与Facebook RoBERTa均采用此方法构建subword vector.
1.准备足够大的训练语料
2.确定期望的subword词表大小
3.将单词拆分为字符序列并在末尾添加后缀“ </ w>”,统计单词频率。 本阶段的subword的粒度是字符。 例如,“ low”的频率为5,那么我们将其改写为“ l o w </ w>”:5
4.统计每一个连续字节对的出现频率,选择最高频者合并成新的subword
5.重复第4步直到达到第2步设定的subword词表大小或下一个最高频的字节对出现频率为1
注意:貌似不采用后缀"</ w>"也可,例如调用的subword api 中使用的方法是在非词尾加上_,只要能区分出词尾和中间词,主要是用于word合并?
每次合并后词表可能出现3种变化:
实际上,随着合并的次数增加,词表大小通常先增加后减小。
输入:
{
'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w e s t </w>': 6, 'w i d e s t </w>': 3}
Iter 1, 最高频连续字节对"e"和"s"出现了6+3=9次,合并成"es"。输出:
{
'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w es t </w>': 6, 'w i d es t </w>': 3}
Iter 2, 最高频连续字节对"es"和"t"出现了6+3=9次, 合并成"est"。输出:
Iter 3, 以此类推,最高频连续字节对为"est"和"" 输出:
{
'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w est</w>': 6, 'w i d est</w>': 3}
import re, collections
def get_stats(vocab):
pairs = collections.defaultdict(int)
for word, freq in vocab.items
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。