蜂口|N-gram特征,浅谈FastText文本分类利器解读(2)

知道了FastText原理之后,我们来说说在使用过程中的一些注意事项,到目前为止,FastText有个比较突出的问题,就是丢失了词顺序的信息,因为隐层是通过简单的求和取平均得到的。为了弥补这个不足,FastText增加了N-gram的特征。
何为N-gram特征
为了处理词顺序丢失的问题,FastText增加了N-gram的特征。具体做法是把N-gram当成一个词,也用embedding向量来表示,在计算隐层时,把N-gram的embedding向量也加进去求和取平均。举个例子来说,假设某篇文章只有3个词,W1,W2和W3,N-gram的N取2,w1、w2、w3以及w12、w23分别表示词W1、W2、W3和bigram W1-W2,W2-W3的embedding向量,那么文章的隐层可表示为:
蜂口|N-gram特征,浅谈FastText文本分类利器解读(2)
文章图片

通过back-propogation算法,就可以同时学到词的Embeding和n-gram的Embedding了。具体实现上,由于n-gram的量远比word大的多,完全存下所有的n-gram也不现实。FastText采用了Hash桶的方式,把所有的n-gram都哈希到buckets个桶中,哈希到同一个桶的所有n-gram共享一个embedding vector。如下图所示:
蜂口|N-gram特征,浅谈FastText文本分类利器解读(2)
文章图片

图中Win是Embedding矩阵,每行代表一个word或N-gram的embeddings向量,其中前V行是word embeddings,后Buckets行是n-grams embeddings。每个n-gram经哈希函数哈希到0-bucket-1的位置,得到对应的embedding向量。用哈希的方式既能保证查找时O(1)的效率,又可能把内存消耗控制在O(buckets * dim)范围内。不过这种方法潜在的问题是存在哈希冲突,不同的n-gram可能会共享同一个embedding。如果桶大小取的足够大,这种影响会很小。
Tricks
FastText为了提升计算效率做了很多方面的优化,除了上节提到的Hash方法外,还使用了很多小技巧,这对我们实际写代码的时候提供了很多的借鉴。
首先,对计算复杂度比较高的运算,FastText都采用了预计算的方法,先计算好值,使用的时候再查表,这是典型的空间或时间的优化思路。比如sigmoid函数的计算,源代码如下:
蜂口|N-gram特征,浅谈FastText文本分类利器解读(2)
文章图片

其次,在Negative Sampling中,FastText也采用了和word2vec类似的方法,即按照每个词的词频进行随机负采样,词频越大的词,被采样的概率越大。每个词被采样的概率并不是简单的按照词频在总量的占比,而是对词频先取根号,再算占比,即
蜂口|N-gram特征,浅谈FastText文本分类利器解读(2)
文章图片

其中fw表示词w的词频。这里取根号的目的是降低高频词的采用概率,同时增加低频词的采样概率,具体代码如下:
蜂口|N-gram特征,浅谈FastText文本分类利器解读(2)
文章图片

这样一来,不仅完美了解决了词顺序丢失的问题,计算效率也随之明显提高。
【蜂口|N-gram特征,浅谈FastText文本分类利器解读(2)】更多人工智能专技术干货,加V: fengkou-IT
感谢您的阅读,更多精彩请持续关注蜂口微信小程序!

    推荐阅读