本文参考Forward and Backward。
前向与反向传播
前向与后向传播是网络中重要的计算部分。
接下来以简单的逻辑回归分类器为例介绍。
前向传播用于计算推理过程中给定输入的输出。在前向传播中,Caffe将每层的计算进行组合从而得到模型所代表的“函数”。此过程由底向上进行。
数据x经过全连接层(内积层)生成 g(x) ,之后通过softmax层产生 h(g(x)) ,从而给出softmax损失 fW(x) 。
反向过称用于计算给定损失的梯度。在反向传播中,Caffe将每层的梯度反向组合以自动计算整个模型的梯度。此即反向传播,此过程由顶向下进行。
反向过程起始于损失值并且计算输出 ∂fW∂h 。模型中剩余部分的梯度将会根据链式法则逐层计算。含有参数的层,如 INNER_PRODUCT层,在反向传播中根据其参数计算梯度 ∂fW∂Wip
这些计算会根据模型的计算立即执行: Caffe会自动执行前向及后向传播。
- Net::Forward()和 Net::Backward()方法计算前向、后向传播,而Layer::Forward()和Layer::Backward()则是计算每一步的前向与后向传播。
- 每层含有forward_{cpu,gpu}() 和backward_{cpu,gpu}()根据计算模式来计算其每一步的传播过程。用户可以根据实际情况,只实现层的CPU或GPU模式。
Solver第一次进行前向传播产生输出和损失,之后进行反向传播算得模型梯度,之后根据梯度更新模型参数以最小化损失。通过将Solver、Net和Layer的分离,从而使Caffe模块化,易于开发。
Caffe中不同类型的层的前向和反向传播的细节,请参见layer catalogue。