【发布时间】:2017-10-23 17:48:06
【问题描述】:
我对实现一个可以处理大型词汇表的分层 softmax 模型感兴趣,比如大约 10M 类。要做到这一点,既可扩展到大类数量又高效的最佳方法是什么?例如,至少one paper 表明,当使用每个节点 sqrt(N) 分类的 2 级树时,HS 可以为大型词汇实现约 25 倍的加速。我也对具有任意分支因子的任意深度树的更通用版本感兴趣。
我在这里看到了几个选项:
1) 为每个批次运行 tf.gather,我们在其中收集索引和拆分。这会产生大批量和胖树的问题,现在系数被大量重复,导致 OOM 错误。
2) 与 #1 类似,我们可以使用 tf.embedding_lookup,它可以帮助解决 OOM 错误,但现在将所有内容都保留在 CPU 上,并大大减慢速度。
3) 使用tf.map_fn 和parallel_iterations=1 分别处理每个样本并返回使用gather。这更具可扩展性,但由于序列化,并没有真正接近 25 倍的加速。
有没有更好的方法来实现 HS?深而窄的树与短而宽的树有不同的方法吗?
【问题讨论】:
-
它们因任务而异。语言模型的批量较大,大约 400 个,隐藏大小大约 300 个;其他任务可能具有较小的批量大小和较大的隐藏大小,例如 imagenet 分类。相对于问题而言,VRAM 和 RAM 相当大(尽管 GPU RAM 不是)。
-
我可以看看你在 Tensorflow 中的 HS 实现吗?我现在也需要它。
-
有点乱,但请看这里:github.com/tansey/sdp/blob/… -- 回想起来,我建议使用 pytorch 或其他动态图框架。
标签: tensorflow softmax