最近在作分佈式模型實現時,使用到了這個函數. 能夠說很是體驗很是的好. 速度很是快,效果和softmax差很少.
咱們知道softmax在求解的時候,它的時間複雜度和咱們的詞表總量V同樣O(V),是性線性的,從它的函數方程式中,咱們也能夠很容易得出:
softmax:
f(x) = e^x / sum( e^x_i ) ;
它的須要對全部的詞 e^x 求和; 因此當V很是大的時候,哪怕時間複雜度是O(V),這個求解的過程耗時也比較「嚴重」;
設想一下,當咱們在訓練模型時, 咱們知道目標詞x,可是咱們卻須要去求解全部的詞,並求和。
固然,有不少去研究如何優化這一過程,提出過各類各樣的設想,其中 Hierarchical softmax 就是其中璀璨的一種。分佈式
那麼說道這,什麼是 Hierarchical softmax ?函數
形如:
優化
咱們去構造一棵這樣的樹,這不是通常的二叉樹,是依據訓練樣本數據中的單詞出現的頻率,構建起來的一棵Huffman tree ,頻率越高,
節點越短.
當咱們構造了這樣以後,以下:
咱們發現對於每個節點,都是一個二分類[0,1],也就是咱們可使用sigmod來處理節點信息;
sigmod函數以下:
,
此時,當咱們知道了目標單詞x,以後,咱們只須要計算root節點,到該詞的路徑累乘,便可. 不須要去遍歷全部的節點信息,時間複雜度變爲O(log2(V))
ui
【參考資料】:
1. https://towardsdatascience.com/hierarchical-softmax-and-negative-sampling-short-notes-worth-telling-2672010dbe08
2.http://building-babylon.net/2017/08/01/hierarchical-softmax/.net