Tokenizer总结
Introduciton
transformer类型的预训练模型层出不穷,其中的tokenizer方法作为一个非常重要的模块也出现了一些方法。本文对tokenizer方法做一些总结。参考来自hunggingface。
tokenizer在中文中叫做分词器,就是将句子分成一个个小的词块(token),生成一个词表,并通过模型学习到更好的表示。其中词表的大小和token的长短是很关键的因素,两者需要进行权衡,token太长,则它的表示也能更容易学习到,相应的词表也会变小;token短了,词表就会变大,相应词矩阵变大,参数也会线性变多。所以token的粒度通常分为word和char,中文则对应为词级别和字级别;目前比较流行的是subword-子词级别,将词进一步分为有意义的子词,这在英文中比较常见(词根,词缀),其中在transformers模型中常用的subword tokenizer有三种:BPE、WordPiece、SentencePiece。
Byte-Pair-Encoding
BPE(byte-pair-encoding)基于pre-tokenization对训练数据进行切分。Pre-tokenization可以使用简单的空格分割,比如GPT2、RoBERTa;可以使用规则分词方法,如XLM、FlauBERT,GPT;进行完pre-tokenization之后,需要对词进行频率统计,之后会将一批symbol作为基础vocabulary,根据之前的词频统计结果或者别的规则方法作为合并方法对symbol进行合并,并扩充入vocabulary。如此循环直至词表大小达到预先设置值或者合并结束。
Byte-Level BPE
代表模型:GPT。如果将所有unicode字符视为基本字符,则包含所有可能的基本字符的基本词汇表可能相当大。为了获得更好的基础词汇表,GPT-2使用字节作为基础词汇表,这是一个巧妙的技巧,可以强制基础词汇表的大小为256,同时确保每个基础字符都包含在词汇表中。使用一些额外的规则来处理标点符号,GPT2的标记器可以标记每个文本,而不需要<unk>符号。
WordPiece
WordPiece代表模型:BERT、DistilBERT和Electra,与BPE非常相似。WordPiece首先初始化词汇表以包含训练数据中的每个字符,并逐步学习给定数量的合并规则。与BPE相反,WordPiece并没有选择最频繁的符号对,而是选择一个一旦将训练数据添加到词汇表中,就可以最大化训练数据可能性的符号对。下图为词表的生成流程:
Unigram
Unigram也是一种子词的tokenization,虽然在transformer模型中没有直接使用,但是在SentencePiece中会有用到,所以学习一下。unigram方法和上面两种分词器方法相反,先初始化一个包含大量的symbol的基础vocabulary,其中包含预分词生成的word和高频的子词,然后通过修剪方法缩小词表大小。unigram的修剪方法是训练一个语言模型来计算word修剪前后的loss变化,选择去除loss增加最少的词。为了防止out-of-vocabylary,词表会始终保留单个字符。具体流程如下图:
由于unigram没有合并规则,所以在对句子进行tokenizer时会有很多可能的情况。unigram方法会在生成词表时记录每个词的概率,所以可以在tokenizer时会可能出现的情况计算其概率选择概率最大的情况作为最终tokenizer方案。
SentencePiece
SentencePiece代表模型:XLNet、marian、T5、ALBERT。前面描述的tokenizer算法都有相同的问题:假设输入文本使用空格分隔单词。然而,并非所有语言都使用空格分隔单词。一种可能的解决方案是使用特定于语言的预标记器,例如,XLM使用特定的中文、日文和泰文预标记器。为了更普遍地解决这一问题,SentencePiece将输入视为原始输入流,从而包括要使用的字符集中的空间。它一般使用BPE或unigram算法来构造适当的词汇表。
Tokenizer总结相关推荐
- tokenizer.encode() 与 tokenizer.tokenize()对比,言简意赅 转 高人讲学
tokenizer.encode()_不知道起什么名字-CSDN博客_tokenizer.encode tokenizer.encode("说你跑的挺远",add_special_ ...
- Transformers包tokenizer.encode()方法源码阅读笔记
Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode
- Lucene 中的Tokenizer, TokenFilter学习
https://brandnewuser.iteye.com/blog/2305140 lucene中的TokenStream,TokenFilter之间关系 TokenStream是一个能够在被调用 ...
- transformers库的使用【二】tokenizer的使用,模型的保存自定义
使用标记器(tokenizer) 在之前提到过,标记器(tokenizer)是用来对文本进行预处理的一个工具. 首先,标记器会把输入的文档进行分割,将一个句子分成单个的word(或者词语的一部分,或者 ...
- 白话Elasticsearch56-数据建模之 Path Hierarchy Tokenizer 对文件系统进行数据建模以及文件搜索
文章目录 概述 官网 示例 模拟:文件系统数据构造 测试path_hierarchy分词 需求一: 查找一份,内容包括ES,在/workspace/workspace/projects/hellowo ...
- boost::tokenizer模块相关的测试程序
boost::tokenizer模块相关的测试程序 实现功能 C++实现代码 实现功能 boost::tokenizer模块相关的测试程序 C++实现代码 #include <iostream& ...
- ElasticSearch之Tokenizer 分词器
java学习讨论群:725562382 Tokenizer Standard Tokenizer curl -X POST "192.168.0.120:9200/_analyze" ...
- [深度学习TF2][RNN-NPL数据预处理] -Tokenizer函数
TF2-Tokenizer函数 1. 背景介绍 2. 函数Tokenizer 介绍 2.1 设置要保留多少个高频词汇, 2.2 训练数据集, 得到一个统计信息 2.3 把单词转化为数值index 2. ...
- Keras---text.Tokenizer:文本与序列预处理
keras中文文档:http://keras-cn.readthedocs.io/en/latest/preprocessing/text/ 1.简介 在进行自然语言处理之前,需要对文本进行处理. 本 ...
- 7-125 切分表达式——写个tokenizer吧 (20 分)
7-125 切分表达式--写个tokenizer吧 (20 分) [先说点出题背景] 这个题是为低年级同学.学C语言的同学准备的,因为,对这部分同学,这个题目编写起来略有一点复杂.如果是高年级.学过了 ...
最新文章
- 国家哀悼日网站变灰的样式
- Smarty 生成静态页
- 利用栈将中缀表达式转化成后缀表达式
- java命令行选项6_6.jdk命令行工具
- 对Xml文档进行操作(修改,删除)
- Spring学习大杂烩(待续)
- RMI:Java中的分布式计算框架
- github中文版_GitHub 上的 Awesome 系列(资源大全系列)
- Web 方向学习路线
- 手机qq怎么添加相册表情包_手机qq怎么制作表情包配文字
- qtdesigner页面布局
- AVI文件在opencore框架下的解析
- python 化学反应_有意思的Python:用python配平化学方程式
- MIT6.828学习之Lab1
- 《离别小叙》一个感伤的程序员
- s3fs挂载对象存储到本地
- 爬虫项目代理操作和线程池爬取
- 唱吧创始人:可能再过半年,这一波创业潮就彻底消失了
- 《勋伯格和声学》读书笔记(一):大调三和弦的排列与结构
- java的含义是什么
热门文章
- 基于密度聚类的新闻热点发现实现步骤
- 查看休眠文件大小清理休眠文件
- No proposals have been found to fix the unresolvable reference to ‘Exception‘.Click here to manually
- 如何成为一个好的项目技术管理人员
- 自己开发邮编查询,根据地址查邮编代码实现(JAVA)
- 职场小故事,工作大道理(14)
- Java 程序员要掌握的 10 款工具
- jar反编译成java工具
- 有关孔隙比的基本概念和计算公式
- MySQL 亿级数据需求的优化思路(一),交易流水记录的查询