fastText原理
对于一个长度为 T T T的句子为 w 1 , w 2 , . . . , w T w_1,w_2,...,w_T w1,w2,...,wT,假设每个词都跟其相邻的词的关系最密切,即每个词都由相邻的词决定的(CBOW模型),或每个词都决定了相邻的词(Skip-gram模型)。
(1)CBOW
CBOW用周围词预测中心词,skip-gram用中心词预测周围词。
以下用具体的例子解释,为什么skip-gram效果普遍比CBOW好?
对于一句话四个词ABCD,在window=1时有:
CBOW:P(B|AC) P(C|BD)
skip-gram:P(B|A) P(A|B) P(C|B) P(B|C) P(D|C) P(C|D)
比较而言,skip-gram对每个词的使用率更高~
(2)skip-gram
为了基于语料库生成模型的训练样本,选取一个长度为2c+1(目标词前后各选c个词)的滑动窗口,从语料库中抽取一个句子:将滑动窗口由左至右滑动,每移动一次,窗口中的词组就形成了一个训练样本。
比如对S=“Today’s weather is great”,窗口长度window=1:
正样本:邻近的词语义更接近;负样本:不相邻的词。
pos={(Today’s, weather), (weather, Today’s), (weather, is), (is, weather), (is, great), (great, is)}
neg={(Today’s, is), (Today’s, great), (weather, great), (is, Today’s), (great, Today’s), (great, weather)}
训练词向量的过程:
哈夫曼树
根据词向量分类的过程:
query的每个词获取embedding,各个词的embedding向量取平均,然后做softmax输出预测。
fastText库的使用
fastText 是一个用于高效学习单词表示和句子分类的库。
中文文档:http://fasttext.apachecn.org/#/doc/zh/support
#安装fastText
$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ make
#调用不带参数的命令来列出可用参数及其默认值
$ ./fasttext supervised
--------------------------------------->
空的输入或输出路径.
以下参数是强制性的:
-input 训练文件路径
-output 输出文件路径
以下参数是可选的:
-verbose 冗长等级 [2]
以下字典参数是可选的:
-minCount 词出现的最少次数 [5]
-minCountLabel 标签出现的最少次数 [0]
-wordNgrams 单词 ngram 的最大长度 [1]
-bucket 桶的个数 [2000000]
-minn char ngram 的最小长度 [3]
-maxn char ngram 的最大长度 [6]
-t 抽样阈值 [0.0001]
-label 标签前缀 [__label__]
以下用于训练的参数是可选的:
-lr 学习速率 [0.05]
-lrUpdateRate 更改学习速率的更新速率 100]
-dim 字向量的大小 [100]
-ws 上下文窗口的大小 [5]
-epoch 迭代次数 [5]
-neg 负样本个数 [5]
-loss 损失函数 {ns, hs, softmax} [ns]
-thread 线程个数 [12]
-pretrainedVectors 监督学习的预训练词向量 []
-saveOutput 是否应该保存输出参数 [0]
以下量化参数是可选的:
-cutoff 要保留的词和 ngram 的数量 [0]
-retrain 微调 embeddings(假如应用 -cutoff 参数的话) [0]
-qnorm 分别量化范数 [0]
-qout 量化分类器 [0]
-dsub 每个子向量的大小 [2]
fastText库的源码***
https://heleifz.github.io/14732610572844.html