Transformer 结构中最后一层 softmax 为什么不再使用层次化softmax 了呢?

公众号关注 “Python遇见机器学习

设为“星标”,第一时间知晓最新干货~

转自https://www.zhihu.com/question/310845030/answer/595573391


我认为主要还是计算资源的问题。

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就逐渐退出了历史舞台。


推荐阅读

•  Understanding LSTM Networks

•  不能更全!Pytorch的19个损失函数总结

•  有了StyleGAN再也不缺头像了!

•  重要通知!动物森友会首届「AI 顶会」ACAI 2020即将召开