신경망에서 다중 등급, 다중 라벨 분류 작업에 어떤 손실 기능이 있습니까?


64

객체 집합을 n 클래스로 분류하기 위해 신경망을 훈련하고 있습니다. 각 객체는 동시에 여러 클래스에 속할 수 있습니다 (멀티 클래스, 멀티 레이블).

다중 클래스 문제의 경우 일반적으로 mse 대신 손실 함수로 softmax 및 categorical cross entropy를 사용하는 것이 좋습니다. 나는 그 이유를 다소 이해합니다.

다중 레이블에 대한 문제의 경우 각 클래스 확률이 서로 독립적이어야하기 때문에 물론 softmax를 사용하는 것은 의미가 없습니다. 그래서 마지막 레이어는 모든 클래스에 대해 입력을 확률 범위 0..1로 스쿼시하는 S 자형 단위입니다.

이제 어떤 손실 함수를 사용 해야하는지 잘 모르겠습니다. 범주 형 교차 엔트로피의 정의를 보면 1이되어야하고 다른 것을 무시하는 뉴런의 출력만을 고려하기 때문에이 문제에 잘 적용되지 않을 것이라고 생각합니다.

이진 교차 엔트로피는 더 잘 맞을 것 같지만 단일 출력 뉴런의 이진 분류 문제에 대해서만 언급했습니다.

중요한 경우 훈련을 위해 파이썬과 케라를 사용하고 있습니다.


1
softmax "모든 클래스에 대해 입력을 확률 범위 0..1로 스쿼시하는 시그 모이 드 단위" 라고 생각 합니다.
Hong Ooi

softmax를 손실 함수로 사용한 다음 확률을 사용하여 데이터를 다중 레이블링 할 수 있습니다.
balboa

답변:


30

keras를 사용하는 경우 출력 레이어에 시그 모이 드를 배치하고 비용 함수에 binary_crossentropy를 배치하십시오.

tensorflow를 사용하는 경우 sigmoid_cross_entropy_with_logits 를 사용할 수 있습니다 . 그러나 제 경우에는이 직접 손실 기능이 수렴되지 않았습니다. 그래서 나는 명백한 시그 모이 드 교차 엔트로피 손실 . 이 예제 에서처럼 자신을 만들 수 있습니다(yln(sigmoid(logits))+(1y)ln(1sigmoid(logits)))

Softmax와 달리 S 자형은 출력 으로 주위에 확률 분포를 제공하지 않지만 독립적 인 확률을 제공합니다.nclasses

평균적으로 모든 행에 적은 수의 레이블이 할당 된 경우 클래스가 상호 배타적이므로 확률이 없어야 하기 때문에이 손실로 softmax_cross_entropy_with_logits 를 사용할 수 있습니다. 라벨의 각 행이 유효한 확률 분포이면됩니다. 그렇지 않으면 그래디언트 계산이 올바르지 않습니다.


친애하는 Alok, OP에게이 기능을 사용하는 방법과 그 이유를 설명 할 수 있습니까? 둘러 보기에서 알 수 있듯이 링크에서는 답변 만 사이트에 권장되지 않습니다.
Antoine Vernet

keras github에서 좋은 짧은 설명을 볼 수 있습니다 : github.com/fchollet/keras/issues/741
Dr. Hilman

1
교차 엔트로피를 사용할 때는 자체 비용 함수를 작성하지 않는 것이 좋습니다 . 숫자 안정성 문제가 발생할 있습니다. 자세한 내용은 github.com/tensorflow/tensorflow/issues/2462 를 참조하십시오 .
kbrose 2016 년

하나는 멀티 라벨이고 다른 하나는 멀티 라벨 멀티 클래스입니다. S 자형은 0과 1 사이의 출력을 찌그러 뜨리지 만 OP에는 여러 클래스가 있으므로 출력은 예를 들어 0-10이어야합니다. 따라서 출력은 다음과 같아야합니다. [0,5,2,3,1] <--- 이것이 S 자형이 아닙니다 그렇습니다.
mimoralea

비용 함수에서 사용하기 전에 tf.round (logits)해야합니까? 숨겨진 레이어에서 tf.nn.sigmoid로 직접 로그를 사용할 수 있습니까?
스님

9

업데이트 (18/04/18) : 이전 답변이 여전히 내 모델에 유용하다는 것이 입증되었습니다. 트릭은 분할 함수와 분포를 개별적으로 모델링하여 softmax의 성능을 활용하는 것입니다.

벡터 를 포함하는 관측 벡터 를 고려하십시오 . (샘플 i에 레이블 m이 포함되어 있으면 1, 그렇지 않으면 0). 따라서 샘플마다 매트릭스를 모델링하는 것이 목표입니다. 따라서 모델은 합니다. 확장 고려 두 개의 특성을 달성하기 위해 :ymyim=δimF(yi,xi)=logP(yi|xi)yim=ZP(ym)

  1. 분포 함수 :mP(ym)=1
  2. 분할 기능 : 는 레이블 수를 추정합니다.Z

그런 다음 두 가지를 별도로 모델링해야합니다. 분포 함수는 softmax 레이어 로 가장 잘 모델링 되고, 파티션 함수는 선형 단위로 모델링 할 수 있습니다 (실제로 로 클리핑했습니다 . 포아송 단위와 같은보다 정교한 모델링이 더 잘 작동 할 것입니다). 그런 다음 분산 손실 (분산시 KL 및 파티션의 MSE)을 적용하거나 제품에서 다음과 같은 손실을 시도 할 수 있습니다.max(0.01,output)

실제로, 옵티마이 저의 선택은 또한 큰 차이를 만듭니다. 인수 분해 접근법에 대한 나의 경험은 Adadelta에서 가장 잘 작동 한다는 것입니다 (Adagrad는 저에게 효과가 없으며 RMSprop를 시도하지 않았지만 SGD의 성능은 매개 변수에 따라 달라질 수 있습니다).

sigmoid에 대한 측면 의견 : 나는 sigmoid + crossentropy를 확실히 시도했지만 작동하지 않았습니다. 모델은 만을 예측하는 경향이 있었고 분포 함수의 변동을 포착하지 못했습니다. (일명, 파티션을 모델링하는 데 매우 유용하며 그 뒤에 수학 이유가있을 수 있습니다)Z

업데이트 : (임의의 생각) Dirichlet 프로세스를 사용하면 레이블 수에 미리 일부를 통합 할 수 있습니까?

업데이트 : 실험에 의해 수정 된 KL- 분화는 여전히 다중 레이블 출력이 아닌 다중 클래스 출력을 제공하는 경향이 있습니다.


(오래된 답변)

S 자형 교차 엔트로피에 대한 나의 경험은 그리 즐겁지 않았습니다. 현재 수정 된 KL-divergence를 사용하고 있습니다. 그것은 형태를 취합니다

Loss(P,Q)=x|P(x)Q(x)||logP(x)Q(x)|=x|(P(x)Q(x))logP(x)Q(x)|
여기서 는 목표 의사 분포이고 는 예측 된 의사 분포입니다 (그러나 함수는 실제로 대칭이므로 실제로는 중요하지 않습니다)P(x)Q(x)

그것들은 정규화되지 않기 때문에 의사 분포라고합니다. 따라서 특정 샘플에 대해 2 개의 레이블이있는 경우 를 가질 수 있습니다.xP(x)=2

케 라스 추진력

def abs_KL_div(y_true, y_pred):
    y_true = K.clip(y_true, K.epsilon(), None)
    y_pred = K.clip(y_pred, K.epsilon(), None)
    return K.sum( K.abs( (y_true- y_pred) * (K.log(y_true / y_pred))), axis=-1)

내 특정 데이터 세트에서 adam보다 훨씬 낫습니다rmsprop
shadi

교육에 이러한 손실을 사용하는 경우 테스트 단계에서 어떻게합니까? 또한 예측에 softmax를 사용하지만 다중 레이블 클래스를 결정하기 위해 임계 값을 선택하는 방법은 무엇입니까?
karl_TUM


0

실제로 tensorsflow sigmoid_cross_entropy_mean에서는 다중 레이블의 손실 계산 기능으로 여전히을 사용할 수 있습니다. 매우 확인합니다.


설명서 링크
Ivelin

0

나는 여기에 초보자이지만이 질문으로 그것을 시도해 볼 것입니다. 나는 당신과 같은 것을 찾고 있었고 마침내 나는 매우 훌륭한 keras 멀티 클래스 분류 튜토리얼 @ http://machinelearningmastery.com/multi-class-classification-tutorial-keras-deep-learning-library/을 발견했습니다 .

이 튜토리얼의 저자는 categorical cross entropy loss 함수를 사용하며 @ here 솔루션을 찾는 데 도움이되는 다른 스레드가 있습니다 .


3
그것은 다중 클래스 일뿐 만 아니라 다중 레이블이기도합니다.
스님
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.