Caffe : Tutorial : 損失 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
日時 : 04/01/2017
* 本ページは、Caffe の本家サイトの Tutorial – Loss を翻訳した上で適宜、補足説明したものです:
http://caffe.berkeleyvision.org/tutorial/loss.html
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
Caffe では、機械学習の多くにおけるように、学習は損失関数で駆動されます (エラー、コスト、あるいは目的関数としても知られます)。損失関数は、パラメータ設定 (i.e. 現在のネットワーク重み) をこれらのパラメータ設定の “悪さ” を指定するスカラー値にマッピングすることで学習のゴールを指定します。こうして、学習のゴールは損失関数を最小化する重みの設定を見つけることになります。
Caffe における損失はネットワークの Forward パスで計算されます。各層は入力 (bottom) blob のセットを受け取り出力 (top) blob のセットを生成します。これらの層の出力の幾つかは損失関数で使用されます。one-versus-all 分類タスクのための損失関数の典型的な選択は SoftmaxWithLoss 関数で、ネットワーク定義で次のように使用されます、例えば :
layer { name: "loss" type: "SoftmaxWithLoss" bottom: "pred" bottom: "label" top: "loss" }
SoftmaxWithLoss 関数では、top blob はスカラー (empty shape) でこれはミニ・バッチ全体に渡る (予測ラベル pred と実際のラベル label から計算された) 損失を平均します。
損失重み (Loss weights)
損失を生成する複数の層を持つネット (e.g. SoftmaxWithLoss 層を使用して入力を分類してそして EuclideanLoss 層を使用してそれを再構築 (reconstruct) の両者を行なうネットワーク) のために、損失重みはそれらの相対的な重要性を指定するために使用可能です。
慣例により、suffix Loss を持つ Caffe 層タイプは損失関数に寄与しますが、しかし他の層は純粋に中間的な計算のために使用されると仮定されます。けれども、任意の層は loss_weight フィールド (層により生成される各 top blob に対する層定義への <float> ) を追加することにより損失として使用可能です。suffix Loss を持つ層は暗黙的に loss_weight を持ちます : 最初の top blob に対しては 1 (そして他の任意の追加の top に対しては loss_weight: 0) ; 他の層は全ての top について暗黙的に loss_weight: 0 を持ちます。従って、上の SoftmaxWithLoss は以下のように等価に書くことができます :
layer { name: "loss" type: "SoftmaxWithLoss" bottom: "pred" bottom: "label" top: "loss" loss_weight: 1 }
けれども、backpropagate 可能な任意の層は non-zero loss_weight が与えられるかもしれません、例えば、望むならネットワークのある中間層(群)により生成される活性を正規化することを一つに可能にします。関連する non-zero 損失を持つ non-singleton 出力に対しては、損失は単に blob の全てのエントリに渡って合計することで計算されます。
Caffe における最終的な損失は、それで、ネットワークに渡る合計の重みづけられた損失を加算することで計算されます、次の擬似-コードにあるようにです :
loss := 0 for layer in layers: for top, loss_weight in layer.tops, layer.loss_weights: loss += loss_weight * sum(top)
以上