fastText详解(扩展)

原文:https://zhuanlan.zhihu.com/p/32965521
这里加入自己的标注、笔记和理解,用于面试。

这里有一点需要特别注意,一般情况下,使用fastText进行文本分类的同时也会产生词的embedding,即embedding是fastText分类的产物。除非你决定使用预训练的embedding来训练fastText分类模型,这另当别论。

1. 字符级别的n-gram

word2vec把语料库中的每个单词当成原子的,它会为每个单词生成一个向量。这忽略了单词内部的形态特征,比如:“apple” 和“apples”,“达观数据”和“达观”,这两个例子中,两个单词都有较多公共字符,即它们的内部形态类似,但是在传统的word2vec中,这种单词内部形态信息因为它们被转换成不同的id丢失

为了克服这个问题,fastText使用了字符级别的n-grams来表示一个单词。对于单词“apple”,假设n的取值为3,则它的trigram有

其中,<表示前缀,>表示后缀。于是,我们可以用这些trigram来表示“apple”这个单词,进一步,用这5个trigram的向量叠加来表示“apple”的词向量。(这样就把字符级别的信息考虑进来了!)

这带来两点好处

  1. 对于低频词生成的词向量效果会更好。因为它们的n-gram可以和其它词共享
  2. 对于训练词库之外的单词,仍然可以构建它们的词向量。我们可以叠加它们的字符级n-gram向量

2. 模型架构

fastText模型架构和word2vec的CBOW模型架构非常相似。下面是fastText模型架构图:
fastText详解(扩展)_第1张图片
注意:此架构图没有展示词向量的训练过程
fastText 在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。

可以看到,和CBOW一样,fastText模型也只有三层:输入层、隐含层、输出层,输入都是多个 经 向量表示的单词,输出都是一个特定的target,隐含层都是对多个词向量的 叠加平均

不同的是,CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征(具体输入仍不是很清楚,网上也没有明确的说明),这些特征在一起 用来表示单个文档;CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过;CBOW的输出是目标词汇,fastText的输出是文档对应的类标

值得注意的是,fastText在输入时,将单词的字符级别的n-gram向量作为额外的特征;在输出时,fastText采用了分层Softmax,大大降低了模型训练时间

fastText相关公式的推导不展开。

3. 核心思想

现在抛开那些不是很讨人喜欢的公式推导,来想一想fastText文本分类的核心思想是什么?

仔细观察模型的后半部分,即从隐含层输出到输出层输出,会发现它就是一个softmax线性多类别分类器分类器的输入是一个用来表征当前文档的向量;模型的前半部分,即从输入层输入到隐含层输出部分,主要在做一件事情:生成用来表征文档的向量

那么它是如何做的呢?叠加构成这篇文档的所有词及n-gram的词向量,然后取平均叠加词向量背后的思想就是传统的词袋法,即将文档看成一个由词构成的集合。

于是fastText的核心思想就是:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类
这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类。

4. 关于分类效果

为何fastText的分类效果常常不输于 传统的非线性分类器?

假设我们有两段文本:

我 来到 达观数据
俺 去了 达而观信息科技(原文的例子)

这两段文本意思几乎一模一样,如果要分类,肯定要分到同一个类中去。
在传统的分类器中,用来表征这两段文本的向量可能差距非常大
传统的文本分类中,你需要计算出每个词的权重,比如tfidf值, “我”和“俺” 算出的tfidf值相差可能会比较大,其它词类似,于是,VSM(向量空间模型)中用来表征这两段文本的文本向量差别可能比较大

但是fastText就不一样了,它是用单词的embedding叠加获得的文档向量,词向量的重要特点就是向量的距离可以用来衡量单词间的语义相似程度,于是,在fastText模型中,这两段文本的向量应该是非常相似的,于是,它们很大概率会被分到同一个类中。

使用词embedding而非词本身作为特征(tf-idf),这是fastText效果好的一个原因
另一个原因就是字符级n-gram特征的引入对分类效果会有一些提升


文中有非常非常细节的内容,仍不是很理解,但面试差不多够了,主要网上也没有明确的相关内容描述信息。大家都是抄来抄去。

总结:
传统意义上的fasttext,可以认为是在做分类,然后模型的副产物即为词向量,那么模型的输入对于传统fasttext来说,是字符级别的n-gram(可以与Word2vec进行对比,上文中有对比的具体描述,这里不赘述)。fasttext最大的一个优势是速度快,并且效果和很多深度学习方法差不到哪去,这是最大的一个优势;并且与传统机器学习方法相比,其效果也远远好于机器学习方法。

你可能感兴趣的:(NLP(包含深度学习),自然语言处理,深度学习,机器学习,python,fastText)