我看了classic word2vec sources,如果我正确理解的话,通过多个线程训练神经网络(矩阵syn0,syn1,syn1neg的同步)时,没有数据访问同步。这是培训的正常做法,还是错误?
最佳答案
也许违反直觉,这很正常。 2011年的“ Hogwild”论文是这方面的开创性工作:
https://papers.nips.cc/paper/4390-hogwild-a-lock-free-approach-to-parallelizing-stochastic-gradient-descent
摘要:
随机梯度下降(SGD)是一种流行的算法,可以
在各种机器学习中达到最先进的性能
任务。最近有几位研究人员提出了一些方案来
并行化SGD,但是所有这些都需要破坏性能的内存锁定
和同步。这项工作旨在展示使用新颖的理论
可以实现SGD的分析,算法和实现
没有任何锁定。我们提出了一种称为Hogwild的更新方案,该方案允许处理器访问共享内存(可能)
覆盖彼此的工作。我们证明当关联
优化问题很少,这意味着大多数梯度更新仅
修改决策变量的一小部分,然后Hogwild实现
接近最佳收敛速度。我们通过实验证明
Hogwild优于使用按订单锁定的替代方案
数量级。
事实证明,同步访问比线程覆盖彼此的工作要慢得多,SGD的速度更慢……而且一些结果似乎暗示着,在实践中,额外的“干扰”可能是优化进度的净收益。