层次Softmax(Hierarchical Softmax) 是一种优化 softmax 计算的方法,旨在加速大规模词汇表的计算过程。
背景
在传统的 softmax 函数中,我们计算目标词与所有词汇之间的概率分布,具体公式如下:
P ( w t ∣ C ) = e v w t T v w c ∑ w ′ e v w ′ T v w c P(w_t | C) = \frac{e^{v_{w_t}^T v_{w_c}}}{\sum_{w'} e^{v_{w'}^T v_{w_c}}} P(wt∣C)=∑w′evw′TvwcevwtTvwc
其中:
- w t w_t wt 是目标词。
- w c w_c wc 是上下文词。
- v w t v_{w_t} vwt 和 v w c v_{w_c} vwc 是目标词和上下文词的词向量。
这种计算方法需要遍历整个词汇表,计算每个词的概率,这对于大型词汇表非常低效。因此,层次Softmax通过将词汇表构造成树形结构,从而减少了计算量,特别是在计算时只需要经过树的部分路径,而不是整个词汇表。
层次Softmax的工作原理
层次Softmax通过将词汇表中的所有词汇表示为一个二叉树(或多叉树)来简化计算。树中的每个叶子节点对应一个词汇,树的非叶子节点则代表决策路径。通过这种方式,计算概率不再是对整个词汇表做计算,而是通过树的路径逐步进行决策,从根节点到叶节点的路径包含了从目标词到上下文词的概率信息。
树形结构的构建
-
树的构建:层次Softmax使用 霍夫曼编码(Huffman coding) 构建一个二叉树。在霍夫曼树中,频率较高的词会被放在离根节点较近的位置,而频率较低的词会被放在离根节点较远的位置。
- 每个词是树的叶节点。
- 内部节点则表示决策,决定了目标词是否属于某个分支。
-
路径表示:为了计算目标词与上下文词的相似度,我们沿着霍夫曼树的路径,从根节点开始,逐步经过一些二叉决策节点,最终到达目标词对应的叶节点。每个决策节点有两个分支,分别代表选择“左”还是“右”。
-
预测上下文词:在层次Softmax中,我们不再计算整个词汇表的概率,而是通过路径的概率来进行预测。每个路径上的节点都代表一次二分类决策,目标是最大化路径上每个节点的概率。
计算过程
- 给定一个目标词 w t w_t wt,上下文词 w c w_c wc,我们通过霍夫曼树计算从目标词到上下文词的路径概率。
- 每一条路径可以看作是二分类任务,即对于每一个节点,判断当前词是否属于该节点的“左”或“右”分支。
- 通过 sigmoid 函数计算路径的每一步概率,最终得到完整路径的概率。每一步的目标是最大化正确路径的概率,最小化不正确路径的概率。
数学公式
在层次Softmax中,目标是计算路径的概率,假设我们从根节点到叶节点的路径上有多个节点,每个节点的决策为二分类问题,模型的目标是最大化路径上每个节点的概率。
具体来说,对于目标词 w t w_t wt,路径 P P P 到达目标词,我们的目标是最大化:
P ( w t ∣ C ) = ∏ k = 1 L σ ( v w t T v n k ) P(w_t | C) = \prod_{k=1}^{L} \sigma(v_{w_t}^T v_{n_k}) P(wt∣C)=k=1∏Lσ(vwtTvnk)
其中:
- L L L 是路径的长度(即路径上的节点数)。
- n k n_k nk 是路径上的第 k k k 个节点(非叶子节点)。
- v w t v_{w_t} vwt 是目标词的词向量。
- v n k v_{n_k} vnk 是路径节点 n k n_k nk 的词向量。
每一个路径的概率通过 sigmoid 函数计算:
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1
损失函数
层次Softmax的损失函数是基于路径上所有节点的概率进行计算的,即最大化路径上每个节点的 log-sigmoid 损失:
L = − log ∏ k = 1 L σ ( v w t T v n k ) \mathcal{L} = - \log \prod_{k=1}^{L} \sigma(v_{w_t}^T v_{n_k}) L=−logk=1∏Lσ(vwtTvnk)
可以进一步展开为:
L = − ∑ k = 1 L log σ ( v w t T v n k ) \mathcal{L} = - \sum_{k=1}^{L} \log \sigma(v_{w_t}^T v_{n_k}) L=−k=1∑Llogσ(vwtTvnk)
通过反向传播优化模型,使得目标词与上下文词之间的路径概率最大化。
优点
-
计算效率高:与传统的 softmax 方法相比,层次Softmax显著减少了每次训练中需要计算的词汇数目。通过将词汇表构建成树形结构,模型只需要计算从根节点到目标词的路径上的节点,而不是整个词汇表。这使得计算量大大减少,尤其是在词汇表非常大的时候。
-
适用于大规模词汇表:层次Softmax特别适用于大规模词汇表的情况,它能够有效处理具有百万级甚至亿级词汇表的任务,避免了计算整个词汇表概率的计算瓶颈。
-
节省内存:由于每个词只需要保存树中的路径信息,层次Softmax相较于传统的 softmax 节省了大量内存空间。
-
霍夫曼编码优化:霍夫曼编码根据词的频率动态调整树的结构,频繁出现的词会被分配较短的路径,从而进一步提高了计算效率。
缺点
-
训练复杂度较高:虽然层次Softmax减少了每次计算的词汇数,但构建霍夫曼树的过程比较复杂,尤其是在训练过程中。需要不断构建树并更新路径信息,因此在某些应用中可能会增加一定的复杂度。
-
适用于固定词汇表:层次Softmax依赖于固定的霍夫曼树结构,对于动态词汇表(比如增加新词)而言,需要重新构建树,这可能带来额外的计算开销。
-
路径不一定表示语义:霍夫曼树虽然是基于词频来构建的,但路径本身并不一定完全代表词语的语义关系。对于一些语义相似的词,可能被分配到树中的不同分支上。
与负采样的比较
负采样 和 层次Softmax 都是优化 softmax 的方法,但它们的工作原理不同:
- 负采样:从词汇表中随机选择负样本,优化目标词与上下文词的内积,同时减少计算量。
- 层次Softmax:将词汇表构建为一颗霍夫曼树,通过路径决策来优化目标词与上下文词之间的相似度。
在计算效率上,层次Softmax通常比负采样稍微复杂一些,因为它需要在树上进行路径遍历;而负采样则通过随机选择负样本来降低计算量,因此两者有各自的适用场景。
总结
层次Softmax是一种加速 softmax 计算的技术,通过将词汇表构建成霍夫曼树并沿着树的路径进行概率计算,从而减少了每次训练时需要计算的词汇数目。它适用于大规模词汇表的任务,能够显著提高计算效率。尽管它在某些方面可能增加计算复杂度,但仍然是处理大规模自然语言处理任务时的有效工具。