로지스틱 회귀 또는 다항 로지스틱 회귀와 같은 분류 문제는 교차 엔트로피 손실을 최적화합니다 . 일반적으로 교차 엔트로피 계층 은 확률 분포를 생성 하는 소프트 맥스 계층을 따릅니다 .
tensorflow에는 적어도 십여 개의 다른 교차 엔트로피 손실 함수가 있습니다 .
tf.losses.softmax_cross_entropy
tf.losses.sparse_softmax_cross_entropy
tf.losses.sigmoid_cross_entropy
tf.contrib.losses.softmax_cross_entropy
tf.contrib.losses.sigmoid_cross_entropy
tf.nn.softmax_cross_entropy_with_logits
tf.nn.sigmoid_cross_entropy_with_logits
- …
이진 분류에서만 작동하는 것은 무엇이며 다중 클래스 문제에 적합한 것은 무엇입니까? sigmoid
대신 언제 사용해야 softmax
합니까? 어떻게있는 sparse
기능은 다른 사람과 다른 이유가 아니라 softmax
?
관련 (수학 지향적) 토론 : Keras와 TensorFlow에서 이러한 모든 교차 엔트로피 손실의 차이점은 무엇입니까? .
답변
예비 사실
-
기능적 의미에서 시그 모이 드는 클래스 수가 2 일 때 softmax 함수의 부분적인 경우입니다 . 둘 다 동일한 연산을 수행합니다. 로짓 (아래 참조)을 확률로 변환합니다.
단순 이진 분류에서는 둘 사이에 큰 차이가 없지만 다항 분류의 경우 sigmoid는 비 독점 레이블 (일명 multi-labels ) 을 처리 할 수있는 반면 softmax는 독점 클래스를 처리합니다 (아래 참조).
-
로짓 (도 스코어 불리는)는 인 클래스와 연관된 원시 비 눈금 값 확률을 계산하기 전에. 신경망 아키텍처 측면에서 이것은 로짓이 조밀 한 (완전히 연결된) 계층의 출력임을 의미합니다.
Tensorflow 이름 지정은 약간 이상합니다. 아래의 모든 함수는 확률이 아닌 로짓을 받아들이고 변환 자체를 적용합니다 (단순히 더 효율적입니다).
시그 모이 드 함수 제품군
tf.nn.sigmoid_cross_entropy_with_logits
tf.nn.weighted_cross_entropy_with_logits
tf.losses.sigmoid_cross_entropy
tf.contrib.losses.sigmoid_cross_entropy
(지원 중단됨)
앞서 언급했듯이 sigmoid
손실 함수는 이진 분류를위한 것입니다. 그러나 tensorflow 함수는 더 일반적이며 클래스가 독립적 인 경우 다중 레이블 분류를 수행 할 수 있습니다. 즉,
이진 분류를 한 번에 tf.nn.sigmoid_cross_entropy_with_logits
해결 N
합니다.
레이블은 원-핫 인코딩이거나 소프트 클래스 확률을 포함 할 수 있습니다.
tf.losses.sigmoid_cross_entropy
또한 일괄 가중치 를 설정할 수 있습니다 . 즉, 일부 예제를 다른 예제보다 더 중요하게 만듭니다.
클래스 가중치tf.nn.weighted_cross_entropy_with_logits
를 설정할 수 있습니다
(분류는 이진임을 기억하십시오). 즉, 양의 오류를 음의 오류보다 크게 만듭니다. 이것은 훈련 데이터가 균형이 맞지 않을 때 유용합니다.
Softmax 함수 제품군
tf.nn.softmax_cross_entropy_with_logits
(1.5에서 사용되지 않음)tf.nn.softmax_cross_entropy_with_logits_v2
tf.losses.softmax_cross_entropy
tf.contrib.losses.softmax_cross_entropy
(지원 중단됨)
이러한 손실 함수는 다항식 상호 배타적 분류에 사용되어야합니다. 즉, N
클래스에서 하나를 선택해야합니다 . 또한 해당되는 경우 N = 2
.
레이블은 원-핫 인코딩되어야하거나 소프트 클래스 확률을 포함 할 수 있습니다. 특정 예제는 확률이 50 % 인 클래스 A와 확률이 50 % 인 클래스 B에 속할 수 있습니다. 엄밀히 말하면 두 클래스 모두에 속한다는 의미는 아니지만 이런 식으로 확률을 해석 할 수 있습니다.
sigmoid
가족 과 마찬가지로 일괄 가중치tf.losses.softmax_cross_entropy
를 설정할 수 있습니다 . 즉, 일부 예제를 다른 예제보다 더 중요하게 만듭니다. 내가 아는 한, tensorflow 1.3부터는 클래스 가중치 를 설정하는 기본 제공 방법이 없습니다 .
[UPD] tensorflow 1.5에서 v2
버전 이 도입 되었고 원래 softmax_cross_entropy_with_logits
손실은 더 이상 사용되지 않습니다. 유일한 차이점은 최신 버전에서는 역 전파가 로짓과 레이블 모두에서 발생한다는 것입니다 ( 이게 유용한 이유에 대한 설명입니다 ).
희소 함수 제품군
tf.nn.sparse_softmax_cross_entropy_with_logits
tf.losses.sparse_softmax_cross_entropy
tf.contrib.losses.sparse_softmax_cross_entropy
(지원 중단됨)
softmax
위의 평범한 것처럼 이러한 손실 함수는 다항 상호 배타적 인 분류에 사용되어야합니다. 즉, N
클래스에서 하나를 선택해야합니다 . 차이점은 레이블 인코딩에 있습니다. 클래스는 원-핫 벡터가 아닌 정수 (클래스 인덱스)로 지정됩니다. 분명히 이것은 소프트 클래스를 허용하지 않지만 수천 또는 수백만 개의 클래스가있을 때 약간의 메모리를 절약 할 수 있습니다. 그러나 logits
인수는 여전히 각 클래스 당 로짓을 포함해야하므로 최소한 [batch_size, classes]
메모리를 소비 합니다.
위와 같이 tf.losses
버전에는 weights
일괄 가중치를 설정할 수 있는 인수가 있습니다.
샘플링 된 소프트 맥스 함수 제품군
이러한 함수는 엄청난 수의 클래스를 처리하기위한 또 다른 대안을 제공합니다. 정확한 확률 분포를 계산하고 비교하는 대신 무작위 표본에서 손실 추정치를 계산합니다.
인수 weights
와 biases
선택된 샘플의 logits 계산에 사용되는 별도의 완전히 연결된 층을 지정.
위와 같이 labels
원-핫 인코딩이 아니지만 모양이 [batch_size, num_true]
있습니다.
샘플링 된 함수는 훈련에만 적합합니다. 테스트 시간에 softmax
실제 분포를 얻기 위해 표준 손실 (희소 또는 원-핫)을 사용하는 것이 좋습니다 .
또 다른 대안 손실은 잡음 대비 추정tf.nn.nce_loss
을 수행하는입니다 (관심이 있다면이 매우 자세한 설명을 참조하십시오 ). NCE는 한계에서 softmax에 대한 근사치를 보장하기 때문에이 함수를 softmax 제품군에 포함했습니다.
답변
그러나 버전 1.5의 경우 softmax_cross_entropy_with_logits_v2
인수를와 함께 사용하는 동안 대신 사용해야합니다 ( argument key=...
예 :
softmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y,
logits=my_prediction, dim=-1, name=None)