Faxttext 快速文本分类

馋奶兔 提交于 2020-04-28 05:09:32

Fasttext 文本分类模型

只讲关键,不讲具体训练、loss的设计技巧。

1. 词嵌入模型

​ NLP的首要问题就是寻求恰当的文本表示方法。因为,良好的文本表示形式,是后续进一步处理的基础。传统的机器学习方法使用 词袋模型,把每个词都做为独立的特征。然而这种方式,丢弃了词语之间的相关信息,往往限制了模型的泛化能力,而且模型输入数据具有上百万的维度,难以处理。因此,另一种词表征方式 "词嵌入" 应运而生。

​ 词嵌入背后的直觉很简单,自然文本中,同时出现的单词在语义上有联系,那么我们可以用某个模型来学习这些联系,这样训练好后,就可以拿出隐含层,作为词的一种表示(降维,embedding),词向量。训练好的词向量的几何性质与词语的语义性质存在着对应关系,比如聚类性质,语义类似的向量之间的距离总是较小,因而这些词会倾向于聚成一类。例如,距离狗(dog)最近的词向量是猫(cat)、鼠(mouse)等等,这些词都代表了动物。聚类性在几何上对应为向量间的距离。

2. 词嵌入的训练方式

word2vec(CBOWskip-gram) 和Glove模型是无监督训练词向量的热门方式,后面word2vec的作者去了Facebook之后又在CBOW的基础上,提出了fasttext文本分类模型,利用标签的监督信息,训练词向量。

2.1 无监督训练方法-CBOW

  • continuous bag-of-word mode,连续词袋模型
  • 根据一个词的上下文,预测这个词语本身

2.2 有监督训练方法-fasttext

架构和CBOW其实是一样的,不同之处:

  • fasttext 输出是分类标签,用分类标签的监督信息训练词向量
  • fasttext 输入是一个句子的所有词,而CBOW是词的词窗内的词语

还加了几个小技巧(在我们模型中没有使用):

  • N-garm

    ​ 词袋模型,丢弃了句子中词语的顺序信息,因此fasttext使用N-garm,把几个词作为一个特征。具体做法是把N-gram当成一个词,也用embedding向量来表示,在计算隐层时,把N-gram的embedding向量也加进去求和取平均。通过bp算法,就可以同时学到每个词的Embeding和n-gram的Embedding了。

    ​ 具体实现上,由于n-gram的量远比word大的多,完全存下所有的n-gram也不现实。Fasttext采用了Hash桶的方式,把所有的n-gram都哈希到buckets个桶中,哈希到同一个桶的所有n-gram共享一个embedding vector。

  • subwords

    ​ 词语char-level含有词语的部分语义信息,比如英文中前缀,后缀,词根等。把整个词当做一个整体,其实丢弃了每个字的信息。。。

    ​ 因此,将一个词被表示为 n-gram 的词袋,为了区分前后缀情况,”<”, “>”符号被加到了词的前后端。除了词的子串外,词本身也被包含进了 n-gram字母串包。以 where 为例,n=3 的情况下,其子串分别为 <wh, whe, her, ere, re>,where 。然后 word vector 就与每一项 n-gram 都相关,表示为 n-gram vector 的和。(这个是在《Enriching Word Vectors with Subword Information》里面提出的)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!