fastText——什么是分层softmax?

fastText的结构与CBOW差不多,只不过fastText的输入为整个文本的单词,输出为分类。
由于这个模型是监督模型,所以所有文本必须先分好类。
如果使用提取特征+softmax预测主题,训练时势必要经过大量计算。(为什么会计算量大?因为分类太多太多了。)

所以采用分层softmax以减少计算量。

先叙述fasttext的结构:
1.文本分词后排成列做输入。
2.lookup table变成想要的隐层维数。
3.隐层后接huffman Tree。这个tree就是分层softmax减少计算量的精髓。

huffman tree是最优二叉树,是编码的好帮手。先根据已标记主题的数量给各个主题编码进huffman tree,
树的结构左0右1。假设共有8个主题,且假设数是完美二叉树,其中一个主题编码为001,从根节点走就是左左右。
fastText——什么是分层softmax?_第1张图片
(为了增加真实感,我假设)对应的输入的文本经lookup table转变为了50维向量X。

从这里开始huffman tree的概率计算:
1.初始化一个θ1为50维,并计算v1=Xθ1,计算s1 = sigmoid(v1),这个数字s1是X第一次被分到树右侧(即1)的概率。而我们想要的是0,所以这里用s1 = 1-sigmoid(v),
这个数越大越好,注意这个数由θ1的变化而变化。
2.重复1,不过要初始一个θ2,同样v2 = X
θ2,计算s2 = sigmoid(v2),而我们希望它是0,所以s2 = 1-sigmoid(v2)
3.注意现在希望它是1。重复1,初始化θ3,同样v3 = X*θ3,计算s3 = sigmoid(v3),而我们希望它是1,所以s3 = sigmoid(v3)不变.

ok,现在有了这三步每一步走的概率s1s2s3,这就可以用到最大似然估计了,L=log(s1s2s3)=logs1+logs2+logs3,令L最大,就令它里面每一项(L1=logs1,L2=logs2,L3=logs3)都最大,
有点像最优路径里初始节点到每个路径内节点都是最优的。
最大似然后,θ1θ2θ3就按更新了一轮,最终他们会收敛在一个值,模型就算训练完成了。

如果按我画的这个树作为分层softmax,那只需要7个50维变量,即每个分叉需要1个。如果是单层softmax,想把50维变成8维的种类,就要50*8的参数。虽然这个例子省的计算量不多,但这个算法是分类越多越有效果。

你可能感兴趣的:(fastText——什么是分层softmax?)