NLP学习

更新流程↓
Task 1: 简介和词向量Word Vectors
Task 2: 词向量和词义Word Senses
Task 3: 子词模型Subword Models
Task 4: Contextual Word Embeddings
Task 5: 大作业
日本人综艺感从昭和时代开始就这么强了吗?
今日份的舒适
常见餐桌礼仪


子词模型Subword Models

文章目录

  • 0. 有关语言学(linguistics)的启发
  • 1. Word-Level Models(单词级模型)
  • 2. Character-Level Models(字符级模型)
  • 3. Subword Models(子词模型)
    •  3.1. Byte Pair Encoding
    •  3.2. SentencePiece Model
  • 4. Hybrid Character and Word-Level Models
  • 5. Chars for word embeddings
    •  5.1. FastText
  • 6. 参考链接

0. 有关语言学(linguistics)的启发

  • 语音学(Phonetics)是一种非常基本的理论,只要是正常人,有着相同的人体器官和相同的发声结构,就会遵循着相同的发声规则和原理。
  • 语音体系(Phonology)是有语义的声音的合集,各国各文明的人都会制定自己的语音体系。
  • 音素(Phoneme)是语音中划分出来的最小的语音单位,分为元音和辅音。

  国际音标(由音素构成)按理来说可以表示所有的语音,但是会发现好多语音是没有语义的,这时我们采取的办法就是看音素的下一级(part of words)。

unfortunate代表没有语义,需要找下一级

  同样的思想我们可以用在深度学习上,如果我们在做翻译任务(Neural Machine Translation,NMT)时发现一些没有含义的单词(也就是不在词汇库中的单词),我们可以通过找比单词更基本的成分来解决问题。
现实生活中做翻译任务时我们确实需要处理很大的,很开放的词汇(所以上述讨论是有意义的):

  • 非常丰富的词形
  • 音译的单词(例如人名)
  • 非正式的拼写(Gooood=Good,u=you,r=are)

  在之前学习的word2vecGloVe是以单词作为最小基本单位的,这样虽然能够用词向量表示词库中的单词,但是若出现OOV(out-of-vocabulary)即词库中没有的单词,而且对于单词的一些词法上的修饰(morphology)处理的也不是很好。
  所以利用比word更小的基本单位来建立模型能更好的解决这些问题。本节思考采用n-gram思想训练Word Vector模型,也就是FastText


1. Word-Level Models(单词级模型)

  以单词最小基本单位的模型,例如word2vecGloVe

  • 优点:能够较为完美地用词向量表示词库中的单词
  • 缺点:会出现OOV(out-of-vocabulary)即词库中没有的单词,例如“Gooooood”。且对于一些单词词法上的修饰(morphology)处理不是很好。

2. Character-Level Models(字符级模型)

  以字符Character最小基本单位的模型,通常针对字符级模型有两种处理思路:

  1. 是把原有的词向量分解处理。先生成character-embedding, 然后为OOV生成word-embedding, 即使用character-embedding来组成word-embedding。
  2. 把连接的语言分解成字符。只生成character-embedding,不考虑word级别。

这两种的方法共同的优缺点如下:

  优点

  1. 能够解决 Word-level 所存在的 OOV 问题。
  2. 拼写类似的单词 具有类似的 embedding。

  缺点:

  1. 由于从单词替换成字符导致处理的序列变长,速度变慢。
  2. 由于序列变长,数据变得稀疏,数据之间的联系的距离变大,不利于学习,训练速度降低。

  为了解决以上缺点问题,Jason Lee, Kyunghyun Cho, Thomas Hoffmann于2017年发表了论文Fully Character-Level Neural Machine Translation without Explicit Segmentation,提出了利用多层conv和pooling和 highway layer的方式来解决该问题来解决了这些问题。

该论文的思路如下所示:

  1. 输入的字符首先需要经过Character embedding层,并被转化为character embeddings表示。
  2. 采用不同窗口大小的卷积核对输入字符的character embeddings表示进行卷积操作,论文中采用的窗口的大小分别为 3、4、5 ,也就是说学习Character-level的3-gram、4-gram、5-gram。
  3. 对不同卷积层的卷积结果进行max-pooling操作,即捕获其最显著特征生成segment embedding。
  4. segment embedding经过Highway Network(有些类似于Residual network,方便深层网络中信息的流通,不过加入了一些控制信息流量的gate)。
  5. 输出结果,再经过单层BiGRU,得到最终的encoder output。
  6. 之后,decoder再利用Attention机制以及character level GRU进行decode。

  通过这种方式不仅能够解决Word-level所存在的OOV问题,而且能够捕获句子的3-gram、4-gram、5-gram信息,这个也是后期FastText的想法雏形。


3. Subword Models(子词模型)

  这是介于Word-Level和Character-Level之间的Subword models,主要有两种趋势,一种是仍采用和Word-Level相同的结构,只不过采用更小的单元——Word pieces,名为Byte Pair Encoding(BPE);另外一种是采用混合结构,Word和Character都有,名为SentencePiece

 3.1. Byte Pair Encoding

  BPE是一种压缩算法,是一种自下而上的算法。将单词作为单词片段处理(Word pieces),以便于处理未出现单词。在NMT任务中,先将训练集单词划分成片段(利用BPE),然后将片段随机赋值后放到RNNs或CNNs中训练出片段的embedding,再将片段组合得出Word-embedding后,进行NMT工作。这样如果在训练集或者其他情况中,遇到生僻词或者未登录词时,直接利用片段进行组合来进行NMT任务。

  1.首先将统计text中单词,做成词汇表(频率-单词),然后按照unigram进行分解。

5  l o w
2  l o w e r
6  n e w e s t
3  w i d e s t词汇表:l, o, w, e, r, n, w, s, t, i, d

  2.寻找频率最大的片段(字符),进行组合,将组合片段加入词汇表。

5  l o w
2  l o w e r
6  n e w es t
3  w i d es t词汇表:l, o, w, e, r, n, w, s, t, i, d, es

  3.继续重复上述操作,直到达到设定的阈值
词汇数+操作数⇒操作数是唯一的超参数词汇数+操作数\Rightarrow操作数是唯一的超参数+

5  l o w
2  l o w e r
6  n e w est
3  w i d est词汇表:l, o, w, e, r, n, w, s, t, i, d, es,est

⇓\Downarrow

5  lo w
2  lo w e r
6  n e w est
3  w i d est词汇表:l, o, w, e, r, n, w, s, t, i, d, es,est,lo

  以此类推,直到词汇库大小达到我们所设定的目标。这个例子中词汇量较小,对于词汇量很大的实际情况,我们就可以通过BPE逐步建造一个较小的基于subword unit的词汇库来表示所有的词汇。

  BPE仅使用一个字符频率来训练合并操作。频繁的子字符串将在早期连接,从而使常用单词作为唯一的符号保留下来(如the and 等)。由罕见字符组合组成的单词将被分割成更小的单元,例如,子字符串或字符。因此,只有在固定的词汇量很小的情况下(通常是16k到32k),对一个句子进行编码所需要的符号数量不会显著增加,这是高效解码的一个重要特征。

 3.2. SentencePiece Model

  sentencepiece model将词间的空白也当成一种标记,可以直接处理sentence,而不需要将其pre-tokenize成单词。
  算法过程:

  拆分句子中有两个变量,一个为词表和句子的切分序列。EM算法,句子的切分序列为隐变量。
  开始时,随机初始化一个词表和随机切分一下句子。

  1. 固定词表,求一个句子困惑度最低的切分序列。
  2. 根据这个切分序列求固定词表,剔除一个词,然后计算困惑度,最后对困惑度设定一个阈值,筛选一些对语料集影响较大的词。

  具体困惑度推导可以通过语言模型中困惑度(perplexity)的推导进行了解。


4. Hybrid Character and Word-Level Models

  这是一个非常出色的框架,主要是在单词级别进行翻译,但是在有需要的时候可以很方便的使用字符级别的输入。核心思想:大部分时候都使用Word-Level的模型来做translate,只有在遇到rare or unseen的Words的时候才会使用Character-Level的模型协助。这种做法产生了非常好的效果。

  其网络结构图如下:
  可以看到输入未知的单词时,采用Character-Level进行编码,输出< unk >时也采用Character-Level级的进行解码。同时训练跟beam-search也时要同时对两个结构进行。

  该模型还同时对Word-Level和Character-Level进行了beam search操作,并且对隐藏层进行了初始化操作。

  对于句子中的 “cute”,其属于 OOV 词汇,为了解决该问题,我们需要构建一个Character-Level表示,但在 decode 过程中遇到 OOV 的特殊符号表示 时,需要采用Character-Level的 decode 进行 解码。

  该训练过程是end2end的,不过损失函数是Word部分与Character-Level部分损失函数的加权叠加。


5. Chars for word embeddings

  在前面,我们已经介绍和比较了Word-Level和Character-Level的优缺点,并根据其特点,提出一种介于Word-Level和Character-Level之间的Model——Subword Model。
那么,我们可不可以采取类似于上面的subword的思路来产生更好的Word embedding呢?FAIR的[FastText]((https://arxiv.org/pdf/1607.04606.pdf or https://fasttext.cc))就是利用subword将word2vec扩充,有效的构建embedding。

 5.1. FastText

  fastText是一个快速文本分类算法,与基于神经网络的分类算法相比的优点:

  1. fastText在保持高精度的情况下加快了训练速度和测试速度
  2. fastText不需要预训练好的词向量,fastText会自己训练词向量

  例如,对于单词“< where >”,以及n=3。则集合可以表示为< wh,whe,her,ere,re >,其中<>代表单词的开始与结束。
  对于每个单词www ,其对应n-gram集合用GwG_wGw 表示,每个n-gram的矢量表示为zg⃗\vec{z_g}zg

,则每个单词可以表示成其所有n-gram的矢量和的形式。
  中心词www 与上下文单词ccc 间的相似度可表示为s(w,c)=∑g∈Gwzg⃗Tvc⃗s(w,c)=\sum_{g\in G_w} {} \vec{z_g}^T\vec{v_c}s(w,c)=gGwzg

T
vc

  于是就可以使用原有的word2vec算法来训练得到对应单词的embedding。其保证了算法速度快的同时,又解决了OOV的问题。


6. 参考链接

  • CS224N Subword Models
  • 12-Subword Models 读书笔记
  • 自然语言处理 cs224n 2019 Lecture 12: Information from parts of words: Subword Models课程笔记
  • CS224N学习笔记(十二)Subword Models
  • CS224N(12)-子词模型
  • BPE(Byte Pair Encoding)算法
  • sentencepiece原理和使用

NLP学习-Task 3: 子词模型Subword Models相关推荐

  1. 斯坦福NLP名课带学详解 | CS224n 第12讲 - NLP子词模型(NLP通关指南·完结)

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://ww ...

  2. Task 3: Subword Models (附代码)(Stanford CS224N NLP with Deep Learning Winter 2019)

    Task 3: Subword Models 目录 Task 3: Subword Models 回顾:Word2vec & Glove 一.人类语言声音:语音学和音系学 二.字符级模型(Ch ...

  3. datawhale 8月学习——NLP之Transformers:编写BERT模型

    前情回顾 1.attention和transformers 2.BERT和GPT 结论速递 跟着教程,阅读了HuggingFace的BERT模型,分为tokenizer和model两大部分,而mode ...

  4. NLP入门 | 通俗讲解Subword Models

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:芙蕖,Datawhale优秀学习者,东北石油大学 对于英文来说,文 ...

  5. NLP学习————实现一个BERT(简记)

    NLP学习-实现一个BERT(简记) 本文主要内容是介绍了BERT的代码结构.具体实现与原理,对BERT的一些简记 内容包括以下几个部分: BERT Tokenization 分词模型(BertTok ...

  6. Task 3: Subword Models

    1.人类语言的声音:语音和语音学 语音是声音流–毫无争议的"物理" 语音学假设一小部分或几组独特的类别单元:音素或独特特征 也许是普遍的类型学,但特定语言的实现 类别感知的最佳证据 ...

  7. fastText中的子词嵌入和高效文本分类:简单高效性能好

    fastText 由Facebook主持的研究.该研究分为两个项目:子词嵌入和高效文本分类.有学者认为fastText只包含高效文本分类,主张它才是该研究的重中之重.不过,在Facebook相关研究的 ...

  8. 2019年CS224N课程笔记-Lecture 12: Subword Models

    资源链接:https://www.bilibili.com/video/BV1r4411 正文内容 人类语言声音:语音学和音韵学( Phonetics and phonology) (课件内容,不是很 ...

  9. CS224n-Lecture12-Information from parts of words (Subword Models)

    (shift,图片复制转存失败问题搞不定,复制黏贴写在本地的文章是真的被恶心到了) 综述 Lecture 12: Information from parts of words: Subword Mo ...

最新文章

  1. TDD与FDD技术对比
  2. 性能优化技巧 - 组表数据更新
  3. html 搜索框 自动补全,自动完成的搜索框javascript实现
  4. [转]将input file的选择的文件清空
  5. [冷枫推荐]:数据库操作,内外联查询,分组查询,嵌套查询,交叉查询,多表查询,语句小结。...
  6. python面试题之你如何管理不同版本的代码?
  7. vim表达式正则替换
  8. ActiveMQ 依赖JDK版本
  9. github private链接访问_Hands-On Design Patterns With C++(十八)访问者模式与多分派(下)...
  10. 41. 和为s的两个数字VS和为s的连续正数序列(C++版本)
  11. android sdk救黑砖,华为EC6108 V9C 8G 救黑砖教程及固件下载
  12. win10 java模拟鼠标_Win10移动体验:模拟鼠标工具
  13. 微擎模块-微信门禁小区物业版(微信开门)
  14. 手机怎么录游戏视频 手机屏幕录制的方法
  15. 【LDO带载能力和两端压差有关】
  16. 齐次线性方程组系数矩阵的秩与解集的秩
  17. excel如何把多张表合并成一个表_excel如何快速把多个工作表合并到一个excel表
  18. 北京跑步入夏--妞妞跑步长大
  19. 小程序emijo表情的正则问题
  20. 人脸检测论文:FaceBoxes: A CPU Real-time Face Detector with High Accuracy及其Pytorch实现

热门文章

  1. 平衡家庭和事业,如何用RPA化解职场女性的痛
  2. 毫米波雷达AWR1642BOOST代码走读学习笔记
  3. gta5的服务器状态,Gta5OL一直处于加载过程中,你可能遇到了这些问题
  4. sklearn preprocessing 数据预处理 OneHotEncoder
  5. Kotlin Jetpack Compose remember 给Icon添加透明度 remember 添加参数来记录其位置
  6. GitLab WorkFlow
  7. 编写一个完整的矩阵向量乘法的MPI编程代码
  8. linux dae文件下载,linux dae命令详解.doc
  9. RabbitMQ高级之如何保证消息可靠性?
  10. [Power]Mockito使用和扩展