答:主要还是计算资源的问题。
Mikolov发明word2vec的几个版本大概在13-14年前后。那个时候GPU非常少见,印象里面CMU的NLP组没有GPU,Stanford NLP lab只有6块K40。
word2vec巧妙地用 hierarchical softmax 解决了这个问题。真正意义上可以让大家自己动手用CPU在自己想要的数据集上快速训练 词向量。 其实 在 word2vect 之前,比较通用的是 Ronan Collobert 和 Jason Weston 的SENNA 向量,但是训练需要三个月,所以word2vect出来基本就没有人用 SENNA了 (另外一个原因是SENNA因为慢,所以没法在大的数据上训练,导致效果差)。word2vec之所以通用主要原因是快,因为快,所以可以在大数据上跑,所以效果好。里面的很多trick基本都是在解决快的问题,比如查表来计算sigmoid,再比如hierarchical softmax基于霍夫曼树的排列,让词频越高的词到达叶子节点的step少,所以predict的次数就少了。
我印象里大规模直接算 softmax 是在google的14年那篇seq2seq做MT的文章。为了快,把一个softmax 并行在4️块GPU上,每个GPU负责四分之一。那个年代,大多数NLP组全组都不会有4块GPU。
我没有实际试验对比过,但道理上似乎softmax是比 hierarchical softmax好的。hierarchical softmax里面有很多近似:因为是 predict 一串左右左右到达叶子节点的path,所以语义完全不同的词,只要在哈夫曼树上的位置近,会share相同的path,所以一部分的参数更新是相像的。而本身在树的位置是由词频决定的,并不是语义相近的词在树的位置相近 (因为训练之前你压根不知道谁跟谁的语义相近)。所以这些都是approximation的办法让算法快。
综上,hierarchical softmax是 softmax的近似,suboptimal的。当如今计算资源足够大的时候,当然包括时间和显存 (BERT 和 Elmo 都没有用hierarchical),hierarchical softmax就逐渐退出了历史舞台
转载自知乎作者:李纪为
链接:(https://www.zhihu.com/question/310845030/answer/595573391)