词向量 - fastText

简介

fasttext是一个被用于对词向量和句子分类进行高效学习训练的工具库,采用c++编写,并支持训练过程中的多进程处理。你可以使用这个工具在监督和非监督情况下训练单词和句子的向量表示。这些训练出来的词向量,可以应用于许多处理数据压缩的应用程序,或者其他模型的特征选择,或者迁移学习的初始化。

FastText支持使用negative sampling,softmax或层次softmax损失函数等方法来训练CBOW或Skip-gram模型。

核心 - 创新点

fasttext可以在词向量的训练和句子分类上取得非常好的表现,尤其表现在对罕见词进行了字符粒度上的处理。

在word2vec的基础上,额外的创新点有:

  1. 把n-gram也当做词训练word2vec模型, 最终每个词的vector将由这个词的Ngrams得出. 这个改进能提升模型对morphology的效果, 即”字面上”相似的词语distance也会小一些.
  2. subword
  3. 句子vector

N-gram subword特征

我们常用的特征是词袋模型。但词袋模型不能考虑词之间的顺序,因此 fastText 还加入了 N-gram 特征。
每个单词除了单词本身外还被表示为多个字符级别的n-grams(有时也称为N元模子)。

在 fasttext 中,每个词被看做是 n-gram字母串包。为了区分前后缀情况,”<”, “>”符号被加到了词的前后端。除了词的子串外,词本身也被包含进了 n-gram字母串包。以 where 为例,n=3 的情况下,其子串分别为
<wh, whe, her, ere, re>,以及其本身 。
其中<和>是作为边界符号被添加,来将一个单词的ngrams与单词本身区分开来。

这么做刚好让一些短词以其他词的ngram出现,有助于更好学习到这些短词的含义。从本质上讲,这可以帮助你捕捉后缀/前缀的含义。

对于输入的上下文中的每一个词,都进行基于词的n-gram,之后将所有的n-gram和原词相加,来代表上下文信息。这种做法的好处是英文单词中,可以由前缀或者后缀等语言形态上的相似性,在词与词之间建立联系。

见Enriching Word Vectors with Subword Information

可以通过-minn-maxn这两个参数来控制ngrams的长度,这两个标志分别决定了ngrams的最小和最大字符数,也即控制了ngrams的范围。这个模型被认为是一个词袋模型,因为除了用于选择n-gram的滑动窗口外,它并没有考虑到对单词的内部结构进行特征选择。它只要求字符落在窗口以内,但并不关心ngrams的顺序。你可以将这两个值都设为0来完全关闭n-gram,也就是不产生n-gram符号,单纯用单词作为输入。当您的模型中的“单词”不是特定语言的单词时或者说字符级别的n-gram没有意义的时候,这会变得很有用。最常见的例子是当您将id作为您的单词输入。在模型更新期间,fastText会学习到每个ngram以及整个单词符号的权重。

rethink

多视角看fastText

  • = window_size=1的卷积 + average pooling的CNN
    • 如果是ngram,则对应window_size=n的char-level cnn
  • = word2vec的CBOW模型,把中间词替换为label

trick

hierarchical softmax类别数较多时,通过构建一个霍夫曼编码树来加速softmax layer的计算,和之前word2vec中的trick相同N-gram features只用unigram的话会丢掉word order信息,所以通过加入N-gram features进行补充用hashing来减少N-gram的存储

缺陷

The movie is not very good , but i still like it .
The movie is very good , but i still do not like it .
I do not like it , but the movie is still very good .
其中第1、3句整体极性是positive,但第2句整体极性就是negative。如果只是通过简单的取平均来作为sentence representation进行分类的话,可能就会很难学出词序对句子语义的影响。

总结

对简单的任务来说,用简单的网络结构进行处理基本就够了,
但是对比较复杂的任务,还是依然需要更复杂的网络结构来学习sentence representation的。

在合适的任务上应当使用合适的方法,像文本分类这样的任务,如果是长文本,即使用BOW也能做很不错的效果。

用了deep的结构之后,效果没有提升的原因是很多的,比如

  1. 数据量不够,过拟合严重
  2. 数据标记质量有限,本身的标记中就有一定的噪音。

fasttext宣扬了一种思想,如果只是简单的任务,用简单的模型如LR就能够达到目的,而没有必要一定去用复杂的模型。

疑问

所有n-gram的subword都会考虑吗,那样会词典特别大吧?会对词典按词频截断吗?oov怎样处理?

参考