aihot  2017-12-29 19:04:53  机器学习 |   查看评论   

      到这一步终于要计算正则项的梯度了。Caffe提供两种正则方法——L2和L1,其中L2采用了标准的梯度下降方法,L1采用了sub-gradient的计算方法。L2的优化计算比较简单,没有什么好说的,但是L1的计算还是有点值得玩味的地方的。这里采用的sub-gradient方法其实本身没有什么问题,不过Lasso的优化还可以有其他的方法,这个问题以后可以再细聊。

ComputeUpdateValue

      到这里,我们终于来到了梯度计算的最后一站,这时候我们终于完成了对梯度的计算,下面该考虑lr和梯度结合起来如何计算最终的梯度优化值了。sgd方法主要采用momentum加梯度的优化方法。关于momentum的优势我们前面已经聊过了。除此之外,Caffe还提供了一系列的梯度计算方法,这些优化方法各有特点,以后我们可以慢慢来看。

      当计算完这一步,我们就可以调用Blob中的Update把每个参数的data和diff进行相加,计算出最终的结果。这样,整个优化过程就完成了。至于剩下的一些内容都不是核心过程,就略去不看了。

      如果我们采用单卡训练的策略,那么阅读代码到这里也差不多了。不过多卡训练对于大规模的训练任务来说是必不可少的,所以我们接下来趁热打铁地看看Caffe的多卡训练。

多卡训练算法

      Caffe的多卡训练算法总体思路是数据并行,我们用不同的GPU处理不同的数据,然后将所有的梯度更新汇总。由于Solver在训练中给了两个回调函数,多卡训练也主要利用了这两个回调函数进行:

  1. on_start():将参数拷贝到每一个GPU中。
  2. ForwardBackward():每个GPU各自计算自己的前向后向结果。
  3. on_gradient_ready():将反向梯度汇总到一起。
  4. ApplyUpdate():在汇总的线程上进行参数更新

 

      其中第2步由每一个CPU线程和自己的GPU并行完成,第4步由汇总的CPU和自己的GPU完成,剩下的1,3两步主要是完成数据传输的任务,也是多卡计算中主要完成的部分。

      Caffe采用树型结构进行参数传递,其中一个CPU线程和GPU作为树型结构的根,其他的则作为根下面的节点。为了更快地传输GPU数据,树型结构的构建要考虑GPU之间是否相近,比方说两个GPU之间是否可以进行P2P的直传。在前面的翻译博客中我们已经聊过GPU之间数据传输的问题了,这里的树形结构也主要以此做考虑。

      我们假设4块GPU的拓扑结构如下:

nvidia-smi topo -m
GPU0 GPU1 GPU2 GPU3 
GPU0 X PHB SOC SOC 
GPU1 PHB X SOC SOC 
GPU2 SOC SOC X PHB 
GPU3 SOC SOC PHB X

      那么我们构造出的树型结构如下所示,数据传输也是按照这样的结构传输:

Caffe代码树型结构

      这样1,3的数据传递就解决了,具体的过程请详细阅读代码,这里就不叙述了。

      对Caffe代码的基本介绍就到这里了,我们对代码的整体结构有了比较清晰的认识,下面我们将分析模型中各个部分的特性。

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自Caffe代码阅读——Solver

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]