关于作者:张正,坐标巴黎,上班NLP,下班词嵌入。
先说结论,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。
“本文探索了一种简单有效的文本分类基准(方法)。我们的实验表明,我们的快速文本分类器 fastText 在准确性方面与深度学习分类器平分秋色,其训练和评估速度(相比深度学习模型更是)要快许多个数量级。
我们可以使用标准的多核 CPU 在不到 10 分钟的时间内用 fastText 训练超过 10 亿个单词,并在一分钟之内将 50 万个句子在 31 万 2 千个类中做分类。”
作者中又出现了托老师,不知道是不是受他影响,这篇文章在表述上也很有 word2vec 的味道,更不用说模型本身。fastText 和 word2vec 的卖点都是简单高效(快)。
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 预训练词嵌入的基础上再训练。
如果没有重新读这篇文章,我也会下意识地往 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 出名的原因。
我要坦白:我确实没仔细看过 fastText 的源码。因此从代码角度来解释 n-gram 在不同 fastText 版本中的区别我直接引用评论 keep fighting 同学的内容,非常感谢!不同于 word2vec,fastText 源码和论文是相互匹配的,可以交叉验证我们对 n-gram 的理解。
同 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。
“在大型未标注语料库上训练的连续词表征对于许多自然语言处理任务有用。通过为每个单词分配不同的向量,学习此类表征的流行模型会忽略单词的词法(形态学)信息。这是一个限制,尤其是对于具有大量词汇和许多罕见词的语言。
在本文中,我们提出了一种基于 skipgram 模型的新方法,其中每个单词都被表示为一个 n- 字袋(我实在找不到特别贴切的中文翻译,此处“ n- 字袋”对应 cbow 里的“词袋”)。一个向量表征与每个 n- 字(符)有关;单词被表示为它们(n- 字表征)的总和。
我们的方法很快速,(它)允许在大型语料库上快速训练模型,并允许我们为未出现在训练数据中的单词计算其表征。我们在词的相似性和类比任务上用九种不同的语言评估我们的词表征。通过与最近提出的(基于)形态学的词表征法进行比较,我们证明了我们的向量在这些任务上实现了最先进的性能。”
原版 abstract 只有一段,为了结构清晰,被我拆成了以上三部分。
fastText 依旧是 skip-gram 模型基础上的延展(毕竟通讯作者是托老师)。但不同于 word2vec 最小单位是词(word),它引入了词中 n 个字(character)的信息。这样做的目的,是为了解决 word2vec 没能解决的 OOV(Out-Of-Vocabulary)问题,即如何表示不在词典中,从未见过的词。当然,按照 fastText 的光荣传统,它不仅局限于英语,而是关注多语词嵌入。
这篇文章的精华当然是如何把一个词拆成子词(subword),子词就是词中 n 个字母的集合。
照搬文中给的例子:
你看这个“where”,
它又长又宽,
就像这个猫它又大又圆,
你们来这里阅读,
觉得,图很,好看,
就像我给你们扯淡,
一样很开心。
吸完我家的猫后,来继续说 “where”,假设我们要把它拆成 3 个字母的集合,我们很容易就得到:“whe”,“her”,“ere”。是不是觉得哪里不对,如果这样做的话,如何区分单词 “her” 和 3-grams 中的 “her”。
因此,重点来了,作者提出了给单词头尾加上“<>”符号,“where” 就成了“
“
而单词“her”就成了“
说完了如何把词拆成子词,那么下面唯一的问题就是怎么把拆出来的塞进 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,发现效果不好。
word2vec 时期,遇到训练时没遇到的词,它的词向量无法得到。有了 fastText,对于 OOV 词,直接对其 n-gram 向量求和就 ok。
当然,这样做的前提是基于词的拼写、子词在形态学上是有意义的。因此,不同语言,不同效果,作者发现这种方法对阿拉伯语、德语和俄语就比对英语、法语和西班牙语效果好。
中国字的偏旁就像 subword 一样,看一个字的组成也能大概猜想其含义,不知道有没有中国字版的 fastText?希望有知乎大神作答。
把一篇文章写长实在太难了:要么你提出的算法非常完整,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 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得或技术干货。我们的目的只有一个,让知识真正流动起来。
???? 来稿标准:
• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)
• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接
• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志
???? 投稿邮箱:
• 投稿邮箱:[email protected]
• 所有文章配图,请单独在附件中发送
• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通
????
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
关于PaperWeekly
PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。