손실 함수 및 메트릭
CNTK 여러 가지 일반적인 미리 정의된 손실 함수(또는 학습에서 최적화하기 위한 학습 기준) 및 메트릭(또는 성능 추적을 위한 평가 기준)을 포함합니다. 또한 사용자 지정 손실 함수/메트릭을 BrainScript 식으로 정의할 수 있습니다.
CrossEntropy(), CrossEntropyWithSoftmax()
범주 간 엔트로피 손실(또는 두 확률 분포 간의 교차 엔트로피)을 계산합니다.
CrossEntropy (y, p)
CrossEntropyWithSoftmax (y, z)
매개 변수
y
: 레이블(1 핫) 또는 더 일반적으로 참조 배포입니다. 최대 1을 합산해야 합니다.p
(forCrossEntropy()
): 참조에 대해 점수를 매기는 후방 확률 분포입니다. 최대 1을 합산해야 합니다.z
(forCrossEntropyWithSoftmax()
): 참조에 대해 점수를 매기기 위해 후방 확률 분포를 계산하기 위한 Softmax 작업에 입력
반환 값
이 연산은 두 확률 분포와 p
다음으로 정의된 엔트로피 간 엔트로피를 계산합니다y
.
ce = E_y{-log p} = -sum_i y_i log p_i
의 i
모든 요소를 y
반복하는 p
경우 의 경우 CrossEntropyWithSoftmax()
입력 p
매개 변수 z
에서 다음과 같이 계산됩니다.
p = Softmax (z)
Description
이러한 함수는 두 확률 분포의 교차 엔트로피 를 계산합니다. 범주 간 엔트로피는 단일 클래스 분류에 대한 가장 일반적인 학습 기준(손실 함수)이며, 여기서 y
범주 레이블을 원 핫 벡터로 인코딩합니다.
또 다른 사용은 확률 분포 회귀에 대한 손실 함수로, 일치하는 y
대상 분포 p
입니다.
손실 함수로 사용되는 경우 CNTK SGD 프로세스는 미니배치에 있는 모든 개별 샘플의 교차 엔트로피 값을 합산하고 전체 epoch에 대해 이러한 항목을 집계하여 epoch당 손실을 계산합니다.
그러면 샘플당 평균 손실 수와 S
샘플 수가 다음과 L
같은 형식 L * S
으로 보고됩니다. 예를 들어 -1.213 * 3600000
평균 -1.213의 엔트로피 간 손실이 평균 3,600,000개 샘플에 비해 평균이 됨을 의미합니다.
CrossEntropyWithSoftmax()
는 특정 형식의 Softmax를 활용하는 범주 간 엔트로피의 가장 일반적인 사용 사례에 대한 최적화입니다.
정규화된 확률 대신, "logit"라고도 하는 정규화되지 않은 버전의 Log Softmax와 동일한 Softmax 연산에 대한 인수를 입력으로 허용합니다.
이는 범주 간 엔트로피 기준을 계산하는 CNTK 권장되는 방법입니다.
범주 간 엔트로피는 1을 포함하는 둘 이상의 위치를 포함하는 다중 클래스 레이블 y
에 적합한 손실 함수가 아닙니다.
이 경우 손실이 있는 Softmax 대신 사용하는 Sigmoid()
것이 Logistic()
좋습니다.
이 문서도 참조하세요.
대체 정의
CrossEntropyWithSoftmax()
는 현재 제한 사항이 있는 CNTK 기본 형식입니다.
보다 유연하고 권장되는 대안은 수동으로 다음과 같이 정의하는 것입니다.
CrossEntropyWithSoftmax (y, z) = ReduceLogSum (z) - TransposeTimes (y, z)
스파스 레이블
스파스 레이블(예: 읽기 사용(./Inputs#input)){..., sparse=true}
을 사용하여 Input
크로스 엔트로피를 계산하려면 위의 대체 양식을 사용해야 합니다.
1위를 차지한>텐서의 소프트맥스
1순위>의 텐서에 적용할 때(예: 2D 그리드에서 위치를 결정하는 작업)를 계산 CrossEntropyWithSoftmax()
하려면 다른 대체 양식을 사용해야 합니다.
CrossEntropyWithSoftmax (y, z, axis=None) = ReduceLogSum (z, axis=axis) - ReduceSum (y .* z, axis=axis)
또한 이 양식을 사용하면 특정 축을 따라 Softmax 연산만 적용할 수 있습니다.
예를 들어 입력 및 레이블에 셰이프 [10 x 20]
가 있고 Softmax를 각각 20개의 열에 대해 독립적으로 계산해야 하는 경우 지정 axis=1
합니다.
예제
labels = Input {9000}
...
z = W * h + b
ce = CrossEntropyWithSoftmax (labels, z)
criterionNodes = (ce)
스파스 레이블과 동일합니다.
labels = Input {9000, sparse=true}
...
z = W * h + b
ce = ReduceLogSum (z) - TransposeTimes (labels, z)
criterionNodes = (ce)
로지스틱{}, WeightedLogistic{}
로지스틱 손실 함수를 계산합니다.
Logistic (y, p)
WeightedLogistic (y, p, instanceWeight)
매개 변수
y
: 접지 레이블, 0 또는 1p
: 클래스의 후방 확률1
반환 값
다음과 같이 정의된 (가중치) 로지스틱 손실을 계산합니다.
ll = -sum_i { y_i * log(p_i) + (1-y_i)*log(1-p_i))} * weight
(여기서 Logistic()
무게는 1)입니다.
Description
이 함수는 로지스틱 손실 함수입니다.
Logistic (y, Softmax (z))
는 2클래스 문제와 동일합니다 CrossEntropyWithSoftmax (y, z)
. 여기서 두 가지(보완적인) 지상 진리 레이블 중 하나만 지정 Logistic()
됩니다.
다중 클래스 분류자 학습에 대한 이 문서 도 참조하세요.
예제
multiLabels = Input {1000} # 0 or 1 for each value
...
p = DenseLayer {1000, activation=Sigmoid} (h) # element-wise predictor for 1000 values
ll = Logistic (multiLabels, p)
trainingCriterion = (ll)
ClassificationError{}
범주 레이블 예측에 대한 오류 비율을 계산합니다. 이진 레이블의 경우 해밍 손실을 사용할 수 있습니다.
ClassificationError (y, z)
매개 변수
y
: 원 핫 형식의 범주 레이블z
: 예측 점수의 벡터(예: 로그 확률)
반환 값
최대값 z
이 1인 위치에 y
있으면 1이고, 그렇지 않으면 0이면 전체 미니배치를 합산합니다.
Description
이 함수는 각 요소가 클래스 또는 범주의 일치 점수를 나타내는 후방 확률, logits 또는 기타 일치 점수의 벡터를 허용합니다.
이 함수는 가장 높은 점수 매기기 위치가 1을 포함하는지 테스트하여 가장 높은 점수 매기기 클래스가 레이블 입력 y
에서 나타내는 클래스와 같은지 여부를 결정합니다.
평가 조건으로 사용되는 경우 SGD 프로세스는 Epoch에 대한 모든 값을 집계하고 평균(예: 오류율)을 보고합니다.
ClassificationError()
스파스 레이블과 함께 사용할 수 없습니다.
참고: 버전 1.7 이전의 CNTK 이 작업을 호출ErrorPrediction()
했습니다.
이름은 계속 사용할 수 있지만 더 이상 사용되지 않습니다.
예제
labels = Input {9000}
...
z = W * h + b
errs = ClassificationError (labels, z)
evaluationNodes = (errs)