Caffe Tutorial 4. Loss
Loss
대부분의 기계학습과 마찬가지로 Caffe에서도 loss function에 의해서 학습이 좌지우지됩니다. 이는 곧 error, cost, objective function이라고도 불리우기도 합니다. Loss function은 학습의 목표를 정의해주는 함수로, 이는 현재의 파라미터 세팅을 하나의 스칼라 값으로 매핑함으로써, 파라미터 세팅의 "나쁜 정도"를 정의하는 역할을 합니다. 따라서 여기서의 학습의 목표는 loss function을 최소화하도록 하는 가중치들의 세팅을 찾는 것이라고 할 수 있습니다.
Caffe에서의 loss는 network의 Forward pass에 의해 계산됩니다. 각 layer는 그것의 입력 (bottom) blob들을 이용하여 출력(top) blob들을 만들어냅니다. 그 중 어떤 layer들의 출력은 loss function에서 이용될 수 있습니다. 1대 다 분류 문제를 위한 loss function은 일반적으로 사용되는 것은 SoftmaxWithLoss로 network 정의 시 다음과 같이 사용됩니다.
1 2 3 4 5 6 7 8 9 |
layer { name: "loss" type: "SoftmaxWithLoss" bottom: "pred" bottom: "label" top: "loss" } |
SoftmaxWithLoss 함수에서는, top blob은 스칼라로 전체 미니 배치에 대한 평균 loss를 나타냅니다. 이때 loss는 예측된 레이블 pred와 실제 레이블 label을 이용해서 계산됩니다.
Loss weights
여러 layer들을 가진 nets에서 loss를 계산하고 싶을 때가 있습니다. 예를 들면, SoftmaxWithLoss 층을 이용해서 분류 작업을 하고 동시에 EuclideanLoss 층을 이용하여 그것을 복원하는 상황 같이 말입니다. 이러한 경우 둘간의 상대적인 중요도를 정의하기 위해 loss weights가 사용될 수 있습니다.
관례적으로 Caffe의 layer 타입 중 Loss가 붙은 것들은 loss function에 기여하는 것들입니다. 하지만 그렇지 않은 다른 layer들은 순수하게 중간 계산을 위한 것들입니다. 하지만 어떠한 layer라도 그것을 정의할 때 top blob 부분에 loss_weight: <float>
를 추가한다면 layer를 loss로써 사용될 수 있습니다. Loss가 붙은 Layer들은 암묵적으로 top blob에 loss_weight: 1
을 가지고 있다고 할 수 있습니다. 따라서 여기에 추가되는 나머지 top blob들은 loss_weight: 0
으로 생각하면 됩니다. 반대로 Loss가 붙지않은 layer들은 암무적으로 모든 top들에 대해서 loss_weight: 0
입니다. 따라서 위의 SoftmaxWithLoss layer는 다음과 같이 작성한 것과 동일합니다.
1 2 3 4 5 6 7 8 9 10 |
layer { name: "loss" type: "SoftmaxWithLoss" bottom: "pred" bottom: "label" top: "loss" loss_weight: 1 } |
하지만 어떤 layer라도 역전파가 가능한 layer는 어떤 것이라고 0이 아닌 loss_weight
를 할당할 수 있습니다. 이는 예를 들어, network의 중간 layer에서 만들어진 activation을 regularize하고자 할 때 사용될 수 있습니다. Loss가 0이 아닌 non-singleton 출력에서는, 전체 blob에 대한 loss를 모두 더하는 것으로 loss가 계산됩니다.
최종적으로 loss는 network 전체의 loss의 가중치 합으로 계산됩니다. 이는 다음의 수도코드와 같이 동작합니다.
1 2 3 4 5 6 |
loss := 0 for layer in layers: for top, loss_weight in layer.tops, layer.loss_weights: loss += loss_weight * sum(top) |