Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

张正作者

Word Embedding Papers | 经典再读之fastText

关于作者:张正,坐标巴黎,上班NLP,下班词嵌入。

词嵌入到句嵌入

到底什么是 fastText

先说结论,fastText 在不同语境中至少有两个含义:

1. 在文章 Bag of Tricks for Efficient Text Classification [1] 中,fastText 是作者提出的文本分类器的名字。与 sub-word 无关!也不是新的词嵌入训练模型!是 word2vec 中 CBOW 模型的简单变种。

2. 作为 Facebook 开源包,fastText [6] 是用来训练词嵌入或句嵌入的,其不仅包括 1 中论文的代码实现,还包括 Enriching Word Vectors with Subword Information [2] 及FastText.zip: Compressing text classification models [3] 两文的代码实现。

本来觉得这些含义区别不重要,直到连我自己都被弄迷糊了。在写这篇解读前,我心中的 fastText 一直是第三种含义:用 sub-word 信息加强词嵌入训练,解决 OOV(Out-Of-Vocabulary)表征的方法。结果带着这个预先的理解读 Bag of Tricks for Efficient Text Classification,越读越迷惑。

为理清思路,第一小节我们就先讲讲 Bag of Tricks for Efficient Text Classification 中的 fastText,第二小节则围绕 Enriching Word Vectors with Subword Information

1.1 Abstract

“本文探索了一种简单有效的文本分类基准(方法)。我们的实验表明,我们的快速文本分类fastText 在准确性方面与深度学习分类器平分秋色,其训练和评估速度(相比深度学习模型更是)要快许多个数量级。

我们可以使用标准的多核 CPU 在不到 10 分钟的时间内用 fastText 训练超过 10 亿个单词,并在一分钟之内将 50 万个句子在 31 万 2 千个类中做分类。”

作者中又出现了托老师,不知道是不是受他影响,这篇文章在表述上也很有 word2vec 的味道,更不用说模型本身。fastTextword2vec 的卖点都是简单高效(快)。

1.2 一句话介绍fastText

word2vec 的 CBOW 模型中将中心词替换为类别标签就得到了 fastText

具体到一些小区别:
  • CBOW 中词袋的大小由 window_size 决定,而 fastText 中就是整个要分类的文本。

  • CBOW 实际运行中用 Hierarchical softmax,fastText 用 softmax 或 Hierarchical softmax,具体试类的数量决定。

这就是一个标配版且可以实际应用的 fastText 了,我要再强调三点它和 CBOW 无区别的地方,因为在别的讲该论文的文章中看到了一些错误的理解:
  • CBOW 和 fastText 都是用平均值来预测的。(CBOW 不是求和,是求平均)

  • N-gram 对于 CBOW 和 fastText 都是锦上添花的元素,不是标配。

  • 词向量初始化都是随机的,fastText 并没有在 word2vec 预训练词嵌入的基础上再训练。


1.3 对N-gram的理解


如果没有重新读这篇文章,我也会下意识地往 character 级别想,但是必须要在此强调:这篇文章和 character 没有任何关系!文章中的 n-gram 出自 Character-level Convolutional Networks for Text Classification [4],是 word 级别的。与我在 word2vec 中提到的 phrases 类似。

在此梳理几个概念:

  • BOW (Bag-Of-Words):给你一个句子,统计每个词在其中出现的次数,这种表征方法就是 BOW。
  • CBOW (Continuous BOW):托老师在 BOW 前加了个 C,就是因为word2vec 并没有基于词频,而是连续的分布式的表征(continuous distributed representation)。

  • n-gram (or word n-gram):“我写知乎”,bi-gram 就是“我写”,“写知”和“知乎”。

  • character-level n-gram:中文不太好讲 word 和 character 的区别,深入到字母级别,把一个词拆成字母串。Enriching Word Vectors with Subword Information 中是 character-level n-gram,这里不是。

作者的实验证明,引入 word n-gram 可以提升一些任务的表现,原因是标配版中只用 word 级别求平均值完全忽略了词序,而 n-gram 保留了小范围的部分词序,对于文本表征是有意义的,从这个角度也可以判断此处的 n-gram 应当是词级别而不是 character 级别的。

这篇文章可以看作是 word2vec 的一个延伸,并不是 fastText 出名的原因。

1.4 “假装看过代码”

我要坦白:我确实没仔细看过 fastText 的源码。因此从代码角度来解释 n-gram 在不同 fastText 版本中的区别我直接引用评论 keep fighting 同学的内容,非常感谢!不同于 word2vecfastText 源码和论文是相互匹配的,可以交叉验证我们对 n-gram 的理解。

1.5 创新性有限的fastText.zip

word2vec 一样,softmax 给模型的计算量、内存占用都带来了很大的负担。对 fastText 而言,随着文本数量和词典规模增大,内存占用会极大地攀升。针对该问题,FastText.zip: Compressing text classification models [5] 研究了如何在对模型效果影响不大的情况下节省内存。

按照惯例,我们还是简单翻一下 abstract:

“我们考虑生成用于文本分类的紧凑架构的问题,从而使整个模型适配有限的内存。在考虑了受 hashing 相关文献启发的不同解决方案后,我们提出了一种基于 PQ 算法(Product Quantization)来存储词嵌入的方法。虽然原始技术会导致准确性下降,但我们将此方法改编为规避量化伪像。

虽然原版方法会导致准确性下降,但我们将此方法改进为可以规避 quantization artefacts 的(我尽力了,但我真的不知道这里怎么翻译,求大神指导)。在几个基准测试上的实验结果表明,我们的方法通常仅需要比 fastText 少两个数量级的内存,而在准确性方面仅稍差一些。就内存使用率和准确性之间的平衡而言,它比现有技术高出许多。”

如 OpenReview 所说,这篇文章是用已经存在的模型压缩方法(如 PQ 算法、用 hashing 来缩小词典内存占用等),创新性有限。何况 ICLR 更关注 DL 模型而不是 NLP 文本分类部分,因此被拒也可以理解。

词嵌入到子词嵌入

接着再聊聊文章 Enriching Word Vectors with Subword Information [7],真 fastText

2.1 Abstract

“在大型未标注语料库上训练的连续词表征对于许多自然语言处理任务有用。通过为每个单词分配不同的向量,学习此类表征的流行模型会忽略单词的词法(形态学)信息。这是一个限制,尤其是对于具有大量词汇和许多罕见词的语言。

在本文中,我们提出了一种基于 skipgram 模型的新方法,其中每个单词都被表示为一个 n- 字袋(我实在找不到特别贴切的中文翻译,此处“ n- 字袋”对应 cbow 里的“词袋”)。一个向量表征与每个 n- 字(符)有关;单词被表示为它们(n- 字表征)的总和。

我们的方法很快速,(它)允许在大型语料库上快速训练模型,并允许我们为未出现在训练数据中的单词计算其表征。我们在词的相似性和类比任务上用九种不同的语言评估我们的词表征。通过与最近提出的(基于)形态学的词表征法进行比较,我们证明了我们的向量在这些任务上实现了最先进的性能。”

原版 abstract 只有一段,为了结构清晰,被我拆成了以上三部分。

fastText 依旧是 skip-gram 模型基础上的延展(毕竟通讯作者是托老师)。但不同于 word2vec 最小单位是词(word),它引入了词中 n 个字(character)的信息。这样做的目的,是为了解决 word2vec 没能解决的 OOV(Out-Of-Vocabulary)问题,即如何表示不在词典中,从未见过的词。当然,按照 fastText 的光荣传统,它不仅局限于英语,而是关注多语词嵌入

2.2 拆!词到子词(subword,n-grams)

这篇文章的精华当然是如何把一个词拆成子词(subword),子词就是词中 n 个字母的集合。

照搬文中给的例子:

你看这个“where”,
它又长又宽,
就像这个猫它又大又圆,
你们来这里阅读,
觉得,图很,好看,
就像我给你们扯淡,
一样很开心。

吸完我家的猫后,来继续说 “where”,假设我们要把它拆成 3 个字母的集合,我们很容易就得到:“whe”,“her”,“ere”。是不是觉得哪里不对,如果这样做的话,如何区分单词 “her” 和 3-grams 中的 “her”。

因此,重点来了,作者提出了给单词头尾加上“<>”符号,“where” 就成了“<where>”,这样其 3-grams 的完全体就是:

“<wh”,“whe”,“her”,“ ere”,“ re>”

而单词“her”就成了“<her>”,就可以与“her”区分开了。

2.3 塞!把子词塞进skip-gram

说完了如何把词拆成子词,那么下面唯一的问题就是怎么把拆出来的塞进 skip-gram 模型了。我们先想下总共有多少种选择?三种。
  • 只有子词

  • 只有词

  • 子词加词

有几个位置可以塞?两个。

回想下 skip-gram 模型,用中心词来预测上下文中的一个词。因此两个位置是:

1. 中心词

2. 上下文词

综上,一共有 6 种选择,当然更准确点说是 5 种,毕竟 a2+b2 是 skip-gram 本尊。

fastText 的选择是:a3+b2

这是一个非常容易被忽视的点,fastText 中是把词本身加入到 n-grams 袋中的。如下原文为证:

We also include the word w itself in the set of its n-grams, to learn a representation for each word (in addition to character n-grams). 


中心词的词向量是 n-grams 袋(n-grams 袋中也包含词本身)中所有向量的和。而要去预测的上下文词,就是正常词向量,没有用到子词信息。
2017 ACL 的 fastText 展示提问环节,有人问过为什么不是 a1,作者的回答是他们试过 a1,发现效果不好。

2.3 当你遇到OOV

word2vec 时期,遇到训练时没遇到的词,它的词向量无法得到。有了 fastText,对于 OOV 词,直接对其 n-gram 向量求和就 ok。

当然,这样做的前提是基于词的拼写、子词在形态学上是有意义的。因此,不同语言,不同效果,作者发现这种方法对阿拉伯语、德语和俄语就比对英语、法语和西班牙语效果好。

中国字的偏旁就像 subword 一样,看一个字的组成也能大概猜想其含义,不知道有没有中国字版的 fastText?希望有知乎大神作答。

2.4 长文如何写?

把一篇文章写长实在太难了:要么你提出的算法非常完整,4 页完全不够写;要么你的实验分析做得非常完善,让人可以通过它对你提出的方法获得全面的理解。这篇文章是 ACL 的一篇长文,是后者的典范。实验和结果分析部分也非常值得学习。

结尾彩蛋,fastText 作者 Armand Joulin 是我非常喜欢的研究者之一,我也很荣幸能邀请到他作我博士答辩委员会的评审之一。

按照惯例,答辩时会给每位评审准备一份演讲 PPT 的缩印版。答辩结束回收这些材料时,看到 Armand 在缩印版上写下了很多有意义的笔记和问题,还顺手留下了两幅大作。(可见我讲的是多么无聊。。。)

希望大家能在其中看出什么惊人的 NLP idea。

Stay Hungry. Stay Foolish.

参考文献

[1] Bag of Tricks for Efficient Text Classification https://arxiv.org/pdf/1607.01759.pdf 
[2] Enriching Word Vectors with Subword Information https://arxiv.org/pdf/1607.04606.pdf 
[3] FastText.zip: Compressing text classification models https://arxiv.org/pdf/1612.03651.pdf 
[4] Character-level Convolutional Networks for Text Classification https://papers.nips.cc/paper/5782-character-level-convolutional-networks-for-text-classification.pdf 
[5] FastText.zip: Compressing text classification models https://arxiv.org/abs/1612.03651 
[6] https://fasttext.cc 
[7] Enriching Word Vectors with Subword Information https://www.aclweb.org/anthology/Q17-1010.pdf
PaperWeekly
PaperWeekly

推荐、解读、讨论和报道人工智能前沿论文成果的学术平台。

理论fastText
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

基准技术

一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

词嵌入技术

词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称。概念上而言,它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量。

文本分类技术

该技术可被用于理解、组织和分类结构化或非结构化文本文档。文本挖掘所使用的模型有词袋(BOW)模型、语言模型(ngram)和主题模型。隐马尔可夫模型通常用于词性标注(POS)。其涵盖的主要任务有句法分析、情绪分析和垃圾信息检测。

语料库技术

语料库一词在语言学上意指大量的文本,通常经过整理,具有既定格式与标记;事实上,语料库英文 "text corpus" 的涵意即为"body of text"。

fastText技术

Facebook开发的文本处理工具,是一个用于高效学习单词表示和句子分类的库。

word2vec技术

Word2vec,为一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。 训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系。该向量为神经网络之隐藏层。 Word2vec依赖skip-grams或连续词袋(CBOW)来建立神经词嵌入。Word2vec为托马斯·米科洛夫(Tomas Mikolov)在Google带领的研究团队创造。该算法渐渐被其他人所分析和解释。

自然语言处理技术

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

交叉验证技术

交叉验证,有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。交叉验证的目标是定义一个数据集到“测试”的模型在训练阶段,以便减少像过拟合的问题,得到该模型将如何衍生到一个独立的数据集的提示。

知乎机构

知乎,中文互联网综合性内容平台,自 2010 年成立以来,知乎凭借认真、专业、友善的社区氛围,独特的产品机制,以及结构化、易获得的优质内容,聚集了中文互联网科技、商业、影视、时尚、文化等领域最具创造力的人群,已成为综合性、全品类,在诸多领域具有关键影响力的内容平台。知乎将AI广泛应用与社区,构建了人、内容之间的多元连接,提升了社区的运转效率和用户体验。知乎通过内容生产、分发,社区治理等领域的AI应用,也创造了独有的技术优势和社区AI创新样本。

zhihu.com
量化技术

深度学习中的量化是指,用低位宽数字的神经网络近似使用了浮点数的神经网络的过程。

暂无评论
暂无评论~