fasttext
word-level Model
以word(词)作为基本单位的模型,这种方式可以很好地对词库中每一个词进行向量表示
存在问题:
- OOV问题:容易出现单词不在词库中地情况
解决办法:最佳语料规模,使系统能够获得更多地词汇量 - 误拼障碍
解决办法:拼写矫正、规则约束 - 做翻译问题时,音译姓名比较难做到
Character-Level Model
基于char(字符)作为基本单位的模型,这种方式可以很好地对字库中每一个char进行向量表示
优点:
- 能够解决word-level存在的OOV问题
- 类似的单词,具有类似的embedding
存在问题:
- char-level的输入句子变长
- 数据变得稀疏
- 对远距离的依赖难以学到
- 训练速度降低
Fasttext
一种介于 word-level Model 和 Character-level 之间的 Model —— Subword Model。
FastText就是利用subword将word2vec扩充,有效的构建embedding。
fasttext:将每个 word 表示成 bag of character n-gram 以及单词本身的集合。
那么,对于word
w
w
w,其n-gram集合用
G
w
G_w
Gw表示,每个n-gram的矢量表示为
z
g
z_g
zg,则每个单词可以表示成其所有n-gram的矢量和。而中心词
w
w
w与上下文词
c
c
c的分数可表示为:
之后可以按照经典的word2vec算法训练得到特征向量,即保持了word2vec计算速度快的优点,又解决了训练集中的OOV表示问题。
fasttext网络结构
每个单词通过嵌入层得到词向量
将所有词向量取平均得到文本的向量表达
利用分类器,使用softmax计算各个类别的概率。
fastText 要使用词内的n-gram信息
依据词/字符级别的训练方法都存在问题,例如
依据词的:低频词、罕见词,由于其出现的次数少,得不到足够的训练;OOV问题。
依据字符的:词表过大,训练速度慢、输入句子变长、数据稀疏。
因此fasttext采用subword级别的方法可以解决上述问题。
fastText 词内的n-gram信息
- 将一个单词打散到字符级别
- 利用字符级别的n-gram信息来捕捉字符间的顺序关系,从而丰富单词内部更细微的语义。
fastText 词内的n-gram信息 的 训练过程
- 每个n-gram都会训练为一个向量
- 原单词的词向量就由它对应的所有n-gram向量求和得到。
- 所有的单词向量以及字符级别的n-gram向量同时相加求平均作为分类器的输入。
fastText 词内的n-gram信息 存在问题
参数过多,模型可能比较膨胀
解决办法:
- L采用hash-trick:由于n-gram原始的空间太大,可以用某种hash函数将其映射到固定大小的buckets中去,从而实现内存可控;
- 采用quantize命令:对生成的模型进行参数量化和压缩;
- 减小最终向量的维度。