[python] TensorFlow에서 교차 엔트로피 손실을 선택하는 방법은 무엇입니까?

로지스틱 회귀 또는 다항 로지스틱 회귀와 같은 분류 문제는 교차 엔트로피 손실을 최적화합니다 . 일반적으로 교차 엔트로피 계층 은 확률 분포를 생성 하는 소프트 맥스 계층을 따릅니다 .

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 이름 지정은 약간 이상합니다. 아래의 모든 함수는 확률이 아닌 로짓을 받아들이고 변환 자체를 적용합니다 (단순히 더 효율적입니다).

시그 모이 드 함수 제품군

앞서 언급했듯이 sigmoid손실 함수는 이진 분류를위한 것입니다. 그러나 tensorflow 함수는 더 일반적이며 클래스가 독립적 인 경우 다중 레이블 분류를 수행 할 수 있습니다. 즉,
이진 분류를 한 번에 tf.nn.sigmoid_cross_entropy_with_logits해결 N합니다.

레이블은 원-핫 인코딩이거나 소프트 클래스 확률을 포함 할 수 있습니다.

tf.losses.sigmoid_cross_entropy또한 일괄 가중치 를 설정할 수 있습니다 . 즉, 일부 예제를 다른 예제보다 더 중요하게 만듭니다.
클래스 가중치tf.nn.weighted_cross_entropy_with_logits 를 설정할 수 있습니다
(분류는 이진임을 기억하십시오). 즉, 양의 오류를 음의 오류보다 크게 만듭니다. 이것은 훈련 데이터가 균형이 맞지 않을 때 유용합니다.

Softmax 함수 제품군

이러한 손실 함수는 다항식 상호 배타적 분류에 사용되어야합니다. 즉, 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손실은 더 이상 사용되지 않습니다. 유일한 차이점은 최신 버전에서는 역 전파가 로짓과 레이블 모두에서 발생한다는 것입니다 ( 이게 유용한 이유에 대한 설명입니다 ).

희소 함수 제품군

softmax위의 평범한 것처럼 이러한 손실 함수는 다항 상호 배타적 인 분류에 사용되어야합니다. 즉, N클래스에서 하나를 선택해야합니다 . 차이점은 레이블 인코딩에 있습니다. 클래스는 원-핫 벡터가 아닌 정수 (클래스 인덱스)로 지정됩니다. 분명히 이것은 소프트 클래스를 허용하지 않지만 수천 또는 수백만 개의 클래스가있을 때 약간의 메모리를 절약 할 수 있습니다. 그러나 logits인수는 여전히 각 클래스 당 로짓을 포함해야하므로 최소한 [batch_size, classes]메모리를 소비 합니다.

위와 같이 tf.losses버전에는 weights일괄 가중치를 설정할 수 있는 인수가 있습니다.

샘플링 된 소프트 맥스 함수 제품군

이러한 함수는 엄청난 수의 클래스를 처리하기위한 또 다른 대안을 제공합니다. 정확한 확률 분포를 계산하고 비교하는 대신 무작위 표본에서 손실 추정치를 계산합니다.

인수 weightsbiases선택된 샘플의 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)


답변