word2vec 教程示例是否暗示潜在的次优实现?

does word2vec tutorial example imply potential sub-optimal implementation?

机器规格:

(顺便说一句 word2vec 示例(word2vec.py 和 word2vec_optimized.py)中有一个错误,如果没有给出设备指令,它会 运行 出错。我添加了一个 with tf.device('/cpu:0') 来解决)

超参数设置:

分析结果:

(优化版本与Mikolov的原始实现相当,标准版本明显慢)

CPU训练时的利用率大致相同(优化版高一点)

我查看了两个实现的代码,我无法弄清楚为什么标准实现(word2vec.py)比 C++ 手写内核(word2vec_kernels.cc)慢 20 倍

word2vec_kernel.cc 似乎没有做任何特别的加速(它首先进行批量随机抽样,然后 运行 在单个批次中对样本进行循环)

word2vec.py 版本对我来说也不是最理想的,它使用标准的 tensorflow 操作并且批处理似乎是合适的。

你们有没有做过内部分析来找出标准版本的性能瓶颈是什么?一般而言,性能错误是否会对其他神经网络的训练性能构成威胁?

你们有没有做过内部分析来找出标准版本的性能瓶颈是什么? 答:是的。我们做到了。分析导致我们决定编写优化版本。

性能错误是否会威胁到其他神经网络的训练性能? A:这是一个复杂的问题,答案取决于场景。我不会做出这样的概括。在许多其他模型中(至少对于我玩过的一些模型),计算通常由 "heavy operations" 主导,如 matmul、卷积等。在这些模型中,损失及其梯度的计算相对便宜。另一方面,word2vec很特别,训练步骤基本上是embedding lookup + loss's gradient + apply gradient,因为这些操作不是"fused",执行这些操作会产生更高的内存带宽。 TF计划开发编译器优化技术来自动融合这些操作,这将在一定程度上避免需要手动融合操作来优化性能。