NLP Subword三大算法原理:BPE、WordPiece、ULM

Subword算法如今已经成为了一个重要的NLP模型性能提升方法。自从2018年BERT横空出世横扫NLP界各大排行榜之后,各路预训练语言模型如同雨后春笋般涌现,其中Subword算法在其中已经成为标配。且与传统空格分隔tokenization技术的对比有很大的优势~~

E.g. 模型学到的“old”, “older”, and “oldest”之间的关系无法泛化到“smart”, “smarter”, and “smartest”。

  • 传统词表示方法无法很好的处理未知或罕见的词汇(OOV问题)

  • 传统词tokenization方法不利于模型学习词缀之前的关系

  • Character embedding作为OOV的解决方法粒度太细

  • Subword粒度在词与字符之间,能够较好的平衡OOV问题

话不多说,和小夕一起来看一下当下最热最火三个subword算法叭o(* ̄▽ ̄*)ブ

Byte Pair Encoding

BPE(字节对)编码或二元编码是一种简单的数据压缩形式,其中最常见的一对连续字节数据被替换为该数据中不存在的字节。后期使用时需要一个替换表来重建原始数据。OpenAI GPT-2 与Facebook RoBERTa均采用此方法构建subword vector.

  • 优点

    • 可以有效地平衡词汇表大小和步数(编码句子所需的token数量)。

  • 缺点

    • 基于贪婪和确定的符号替换,不能提供带概率的多个分片结果。

算法

  1. 准备足够大的训练语料

  2. 确定期望的subword词表大小

  3. 将单词拆分为字符序列并在末尾添加后缀“ </ w>”,统计单词频率。本阶段的subword的粒度是字符。例如,“ low”的频率为5,那么我们将其改写为“ l o w </ w>”:5

  4. 统计每一个连续字节对的出现频率,选择最高频者合并成新的subword

  5. 重复第4步直到达到第2步设定的subword词表大小或下一个最高频的字节对出现频率为1

停止符"</w>"的意义在于表示subword是词后缀。举例来说:"st"字词不加"</w>"可以出现在词首如"st ar",加了"</w>"表明改字词位于词尾,如"wide st</w>",二者意义截然不同。

每次合并后词表可能出现3种变化:

  • +1,表明加入合并后的新字词,同时原来在2个子词还保留(2个字词不是完全同时连续出现)

  • +0,表明加入合并后的新字词,同时原来2个子词中一个保留,一个被消解(一个字词完全随着另一个字词的出现而紧跟着出现)

  • -1,表明加入合并后的新字词,同时原来2个子词都被消解(2个字词同时连续出现)

实际上,随着合并的次数增加,词表大小通常先增加后减小。

例子

输入:

{'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"。输出:

{'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w est </w>': 6, 'w i d est </w>': 3}
Iter 3, 以此类推,最高频连续字节对为"est"和"</w>" 输出:
{'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w est</w>': 6, 'w i d est</w>': 3}
Iter n, 继续迭代直到达到预设的subword词表大小或下一个最高频的字节对出现频率为1。

BPE实现

import re, collectionsdef get_stats(vocab):pairs = collections.defaultdict(int)for word, freq in vocab.items():symbols = word.split()for i in range(len(symbols)-1):pairs[symbols[i],symbols[i+1]] += freqreturn pairsdef merge_vocab(pair, v_in):v_out = {}bigram = re.escape(' '.join(pair))p = re.compile(r'(?<!\S)' + bigram + r'(?!\S)')for word in v_in:w_out = p.sub(''.join(pair), word)v_out[w_out] = v_in[word]return v_outvocab = {'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}
num_merges = 1000
for i in range(num_merges):pairs = get_stats(vocab)if not pairs:breakbest = max(pairs, key=pairs.get)vocab = merge_vocab(best, vocab)print(best)# print output
# ('e', 's')
# ('es', 't')
# ('est', '</w>')
# ('l', 'o')
# ('lo', 'w')
# ('n', 'e')
# ('ne', 'w')
# ('new', 'est</w>')
# ('low', '</w>')
# ('w', 'i')
# ('wi', 'd')
# ('wid', 'est</w>')
# ('low', 'e')
# ('lowe', 'r')
# ('lower', '</w>')

编码

在之前的算法中,我们已经得到了subword的词表,对该词表按照子词长度由大到小排序。编码时,对于每个单词,遍历排好序的字词词表寻找是否有token是当前单词的子字符串,如果有,则该token是表示单词的tokens之一。

我们从最长的token迭代到最短的token,尝试将每个单词中的子字符串替换为token。最终,我们将迭代所有tokens,并将所有子字符串替换为tokens。如果仍然有子字符串没被替换但所有token都已迭代完毕,则将剩余的子词替换为特殊token,如<unk>。示例如下~~

# 给定单词序列
[“the</w>”, “highest</w>”, “mountain</w>”]# 假设已有排好序的subword词表
[“errrr</w>”, “tain</w>”, “moun”, “est</w>”, “high”, “the</w>”, “a</w>”]# 迭代结果
"the</w>" -> ["the</w>"]
"highest</w>" -> ["high", "est</w>"]
"mountain</w>" -> ["moun", "tain</w>"]

编码的计算量很大。在实践中,我们可以pre-tokenize所有单词,并在词典中保存单词tokenize的方式。如果我们看到字典中不存在的未知单词。我们应用上述编码方法对单词进行tokenize,然后将新单词的tokenization添加到字典中备用。

解码

将所有的tokens拼在一起,示例如下:

# 编码序列
[“the</w>”, “high”, “est</w>”, “moun”, “tain</w>”]# 解码序列
“the</w> highest</w> mountain</w>”

WordPiece

WordPiece算法可以看作是BPE的变种。不同点在于,WordPiece基于概率生成新的subword而不是下一最高频字节对。

算法

  1. 准备足够大的训练语料

  2. 确定期望的subword词表大小

  3. 将单词拆分成字符序列

  4. 基于第3步数据训练语言模型

  5. 从所有可能的subword单元中选择加入语言模型后能最大程度地增加训练数据概率的单元作为新的单元

  6. 重复第5步直到达到第2步设定的subword词表大小或概率增量低于某一阈值

Unigram Language Model

ULM是另外一种subword分隔算法,它能够输出带概率的多个子词分段。它引入了一个假设:所有subword的出现都是独立的,并且subword序列由subword出现概率的乘积产生。WordPiece和ULM都利用语言模型建立subword词表。

 

算法

  1. 准备足够大的训练语料

  2. 确定期望的subword词表大小

  3. 给定词序列优化下一个词出现的概率

  4. 计算每个subword的损失

  5. 基于损失对subword排序并保留前X%。为了避免OOV,建议保留字符级的单元

  6. 重复第3至第5步直到达到第2步设定的subword词表大小或第5步的结果不再变化

总结

  1. subword可以平衡词汇量和对未知词的覆盖。极端的情况下,我们只能使用26个token(即字符)来表示所有英语单词。一般情况,建议使用16k或32k子词足以取得良好的效果,Facebook RoBERTa甚至建立的多达50k的词表。

  2. 对于包括中文在内的许多亚洲语言,单词不能用空格分隔。因此,初始词汇量需要比英语大很多。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【小程序】微信小程序开发实践

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/diandianxiyu/article/details/53068012 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/template/css/ck…

技术人如何提升自己的核心竞争力

互联网行业是一个发展非常快&#xff0c;变化也快的行业&#xff0c;在这个行业&#xff0c;总是让人感觉既兴奋又不安。 兴奋的是你总能看到无数新奇的事物&#xff0c;甚至亲身参与到一场变革中去&#xff0c;而不安的则是&#xff0c;任凭你如何NB&#xff0c;你也无法保证哪…

AAAI 2018经典论文获奖者演讲:本体论的昨天和今天

本文转自公众号&#xff1a;AI科技评论。AI 科技评论按&#xff1a;正在美国新奥尔良召开的 AAAI 2018 的经典论文奖颁给了《Algorithm and Tool for Automated Ontology Merging and Alignment》。这篇论文发表在 2000 年的第 17 届 AAAI 大会上。这次颁奖是为了表彰这篇论文在…

ICLR2020 | 如何判断两个神经网络学到的知识是否一致

人工智能顶会 ICLR 2020 将于 4 月 26 日于埃塞俄比亚首都亚的斯亚贝巴举行。在最终提交的 2594 篇论文中&#xff0c;有 687 篇被接收&#xff0c;接收率为 26.5%。本文介绍了上海交通大学张拳石团队的一篇接收论文——《Knowledge Consistency between Neural Networks and B…

7张图学会SQL

第1周&#xff1a;SQL入门 学习SQL语句的书写语法和规则从零学会SQL&#xff1a;入门​www.zhihu.com 第2周&#xff1a;查询基础 Select查询语句是SQL中最基础也是最重要的语句&#xff0c;这周我们就来利用Select来对表中的数据进行查询。从零学会SQL&#xff1a;简单查询​w…

大公司稳定工作和创业之间如何选择?

“ 是留在大公司&#xff0c;还是加入小型创业公司&#xff0c;还是自己创业&#xff0c;面对房价每年高涨的趋势&#xff0c;面对未来的不确定&#xff0c;应该怎样选择。 作为一个亲历者&#xff0c;希望你看完后能有所启发。 本文作者&#xff0c;陈睿 优知学院创始人 优知…

论文浅尝 |「知识表示学习」专题论文推荐

本文转载自公众号&#xff1a;PaperWeekly。本期论文清单来自清华大学博士生韩旭和北师大本科生曹书林&#xff0c;涵盖了近年知识表示学习方向的重要论文。[ 综述类 ]■ 论文 | Representation Learning: A Review and New Perspectives■ 链接 | https://www.paperweekly.sit…

如何选择一家公司

不管是刚毕业的大学生还是工作几年的职场朋友&#xff0c;每个人都会面临选择公司和行业的困扰&#xff0c;我也相信每个人都还记忆犹新你的第一份工作以及让你无比难忘的一家公司。有时候我们也盲目的所求&#xff0c;其实&#xff0c;偶尔停下来思考下你真想去的地方&#xf…

LightGBM最强解析,从算法原理到代码实现~

1 LightGBM简介 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型&#xff0c;其主要思想是利用弱分类器&#xff08;决策树&#xff09;迭代训练以得到最优模型&#xff0c;该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛&#xf…

数据分析师基本技能——SQL

我们做数据分析工作时&#xff0c;多数数据来源于数据库&#xff0c;SQL非常方便我们访问和查询数据库。 SQL 作为数据分析师的基本技能&#xff0c;那么需要掌握哪些SQL核心技能 理解数据库SQL基础重点知识&#xff1a;查询&#xff0c;更新&#xff0c;提取&#xff0c;插入&…

论文浅尝 | 基于置信度的知识图谱表示学习框架

本文转载自公众号&#xff1a;PaperWeekly。作者丨谢若冰单位丨腾讯微信搜索应用部研究方向丨知识表示学习知识图谱被广泛地用来描述世界上的实体和实体之间的关系&#xff0c;一般使用三元组&#xff08;h,r,t&#xff09;&#xff08;head entity, relation, trail entity&am…

史上最强Java架构师的13大技术能力讲解! | 附架构师能力图谱

从程序员进阶成为架构师&#xff0c;并非一蹴而就&#xff0c;需要系统化、阶段性地学习&#xff0c;在实战项目中融会贯通&#xff0c;这如同打怪通关&#xff0c;我们得一关一关突破&#xff0c;每攻破一个关口&#xff0c;就能得到更精良的装备&#xff0c;技能值也随之不断…

写给运营同学和初学者的SQL入门教程

作者简介 多肉&#xff0c;饿了么资深python工程师。曾在17年担任饿了么即时配送众包系统的研发经理&#xff0c;这篇文章最早的版本就诞生于那段时间&#xff0c;目前负责配送相关业务系统的整体稳定性建设。个人比较喜欢c和python&#xff0c;最近有点迷rust&#xff0c;同时…

强化学习,路在何方?

▌一、深度强化学习的泡沫 2015年&#xff0c;DeepMind的Volodymyr Mnih等研究员在《自然》杂志上发表论文Human-level control through deep reinforcement learning[1]&#xff0c;该论文提出了一个结合深度学习&#xff08;DL&#xff09;技术和强化学习&#xff08;RL&…

论文浅尝 | 基于神经网络的实体识别和关系抽取联合学习

本文转载自公众号&#xff1a;PaperWeekly。作者丨罗凌学校丨大连理工大学博士生研究方向丨深度学习&#xff0c;文本分类&#xff0c;实体识别联合学习&#xff08;Joint learning&#xff09;一词并不是一个最近才出现的术语&#xff0c;在自然语言处理领域&#xff0c;很早就…

一篇文章搞懂架构师的核心技能

“ 这是架构师系列的第一篇&#xff1a;核心技能&#xff0c;希望这个系列能完全揭示架构师这个职位&#xff1a;我先从核心技能开始&#xff0c;后续还有架构师之路&#xff0c;架构实战等架构师系列文章。 本文作者 陈睿 优知学院创始人&#xff0c;前携程定制旅游CTO,在互联…

史上最全的分词算法与工具介绍

分词&#xff08;word tokenization&#xff09;&#xff0c;也叫切词&#xff0c;即通过某种方式将句子中的各个词语识别并分离开来&#xff0c;使得文本从“字序列”的表示升级为“词序列”表示。分词技术不仅仅适用于中文&#xff0c;对于英文、日文、韩文等语言也同样适用。…

论文解读:Attention is All you need

论文解读:Attention is All you need习翔宇​北京大学 软件工程博士在读​关注他192 人赞同了该文章Attention机制最早在视觉领域提出&#xff0c;2014年Google Mind发表了《Recurrent Models of Visual Attention》&#xff0c;使Attention机制流行起来&#xff0c;这篇论文采…

论文浅尝 | 基于神经网络的知识推理

本文转载自公众号&#xff1a;PaperWeekly。论文笔记来自 PaperWeekly 社区用户 britin。本文对基于 RNN 的从大规模知识库中进行推理进行了精度和可操作性的改善&#xff0c;提出的模型使用单个 RNN 就可以在多种 relation types 之间进行推理。如果你对本文工作感兴趣&#x…

手把手教你成为年薪60万的架构师

“ 这篇文章是帮助你成为架构师系列文章其中一篇&#xff0c;偏向0-5年工作的IT程序员员、架构师同学。 如果你能掌握这个系列提到的内容的70%左右&#xff0c;去阿里拿个P7问题不大&#xff0c;阿里的P7基本能拿到60W左右的年薪。 提醒一点&#xff0c;不要小看和不重视基础&a…