Fasttext 文本分类模型
只讲关键,不讲具体训练、loss的设计技巧。
1. 词嵌入模型
NLP的首要问题就是寻求恰当的文本表示方法。因为,良好的文本表示形式,是后续进一步处理的基础。传统的机器学习方法使用 词袋模型,把每个词都做为独立的特征。然而这种方式,丢弃了词语之间的相关信息,往往限制了模型的泛化能力,而且模型输入数据具有上百万的维度,难以处理。因此,另一种词表征方式 "词嵌入" 应运而生。
词嵌入背后的直觉很简单,自然文本中,同时出现的单词在语义上有联系,那么我们可以用某个模型来学习这些联系,这样训练好后,就可以拿出隐含层,作为词的一种表示(降维,embedding),词向量。训练好的词向量的几何性质与词语的语义性质存在着对应关系,比如聚类性质,语义类似的向量之间的距离总是较小,因而这些词会倾向于聚成一类。例如,距离狗(dog)最近的词向量是猫(cat)、鼠(mouse)等等,这些词都代表了动物。聚类性在几何上对应为向量间的距离。
2. 词嵌入的训练方式
word2vec
(CBOW
,skip-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》里面提出的)