로짓, softmax 및 softmax_cross_entropy_with_logits 란 무엇입니까?


350

나는 여기서 tensorflow API 문서를 겪고있었습니다 . tensorflow 문서에서이라는 키워드를 사용했습니다 logits. 무엇입니까? API 문서의 많은 메소드에서 다음과 같이 작성됩니다.

tf.nn.softmax(logits, name=None)

쓰여진 내용 logits만 있는 것이라면 Tensors왜 다른 이름을 유지 logits하는가?

또 다른 것은 내가 구별 할 수없는 두 가지 방법이 있다는 것입니다. 그들은

tf.nn.softmax(logits, name=None)
tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)

그들 사이의 차이점은 무엇입니까? 문서가 명확하지 않습니다. 나는 무엇을 알고 tf.nn.softmax있습니다. 그러나 다른 것은 아닙니다. 예가 정말 도움이 될 것입니다.

답변:


426

로 짓은 단순히 함수가 이전 레이어의 스케일되지 않은 출력에서 ​​작동하고 단위를 이해하기위한 상대적인 스케일이 선형이라는 것을 의미합니다. 이는 특히 입력의 합이 1과 같지 않아 값이 확률 이 아님 을 의미합니다 (입력이 5 일 수 있음).

tf.nn.softmaxsoftmax 기능 을 입력 텐서 에 적용한 결과 만 생성합니다 . softmax는 sum(input) = 1다음과 같이 입력을 "정지"합니다 . 이는 정상화 방법입니다. softmax의 출력 형태는 입력과 동일합니다. 값만 정규화합니다. softmax의 출력은 확률로 해석 될 있습니다.

a = tf.constant(np.array([[.1, .3, .5, .9]]))
print s.run(tf.nn.softmax(a))
[[ 0.16838508  0.205666    0.25120102  0.37474789]]

반대로 tf.nn.softmax_cross_entropy_with_logitssoftmax 함수를 적용한 후 결과의 교차 엔트로피를 계산합니다 (그러나 수학적으로 더 신중하게 계산 함). 다음의 결과와 유사합니다.

sm = tf.nn.softmax(x)
ce = cross_entropy(sm)

교차 엔트로피는 요약 메트릭입니다. 요소 전체의 합계입니다. tf.nn.softmax_cross_entropy_with_logits모양 [2,5]텐서 의 출력은 모양입니다 [2,1](첫 번째 차원은 배치로 처리됨).

당신이 교차 엔트로피를 최소화하기 위해 최적화를 수행하려는 경우 당신이 당신의 마지막 레이어 후 softmaxing하고, 당신은 사용해야 tf.nn.softmax_cross_entropy_with_logits는 수학적으로 올바른 방법으로 수치 적으로 불안정 코너 케이스를 다루고 있기 때문에, 대신 스스로 일을. 그렇지 않으면 여기 저기에 작은 엡실론을 추가하여 해킹하게됩니다.

편집 2016-02-07 : 객체가 하나의 클래스에만 속할 수있는 단일 클래스 레이블이있는 경우 tf.nn.sparse_softmax_cross_entropy_with_logits레이블을 고밀도 one-hot 배열로 변환하지 않아도되도록 사용 하는 것이 좋습니다. 이 기능은 0.6.0 릴리스 이후에 추가되었습니다.


1
softmax_cross_entropy_with_logits에 대해 올바르게 사용하는지 모르겠습니다. 결과는 내 코드에서 안정적이지 않습니다. 동일한 코드가 두 번 실행되며 총 정확도는 0.6에서 0.8로 변경됩니다. cross_entropy = tf.nn.softmax_cross_entropy_with_logits(tf.nn.softmax(tf.add(tf.matmul(x,W),b)),y) cost=tf.reduce_mean(cross_entropy). 그러나 다른 방법을 사용 pred=tf.nn.softmax(tf.add(tf.matmul(x,W),b)) cost =tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1))하면 결과가 안정적이며 더 좋습니다.
Rida

15
첫 번째 라인에서 더블 소프트 맥스를 사용하고 있습니다. softmax_cross_entropy_with_logits는 tf.nn.softmax의 출력이 아닌 스케일되지 않은 로짓을 예상합니다. 당신 tf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W, b))은 당신의 경우에 원합니다 .
dga

7
@dga 코드에 오타가 있다고 생각합니다 b. 대괄호 밖에 있어야합니다.tf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W), b)
jrieke

1
"단위를 이해하기위한 상대적 척도는 선형 적"입니다. 첫 문장의 일부가 의미 하는가?
Charlie Parker

5
공감-하지만 "소프트 맥스의 출력 형태는 입력과 동일합니다-값을 정규화합니다"라고 말할 때 대답이 약간 틀립니다. Softmax는 그 합계가 1이되도록 값을 "스쿼시"하는 것뿐만 아니라 값을 재분배하므로 이것이 사용되는 주된 이유 일 수 있습니다. stackoverflow.com/questions/17187507/… , 특히 Piotr Czapla의 답변을 참조하십시오 .
Paolo Perrotta 2016 년

282

짧은 버전 :

y_hat각 클래스에 대해 계산 된 점수 (예 : y = W * x + b)와 y_true하나의 핫 인코딩 된 실제 레이블 이 포함 된 두 개의 텐서가 있다고 가정합니다 .

y_hat  = ... # Predicted label, e.g. y = tf.matmul(X, W) + b
y_true = ... # True label, one-hot encoded

당신이 점수를 해석하면 y_hat표준화 로그 확률로, 그 후에는 logits .

또한 다음과 같이 계산 된 총 교차 엔트로피 손실 :

y_hat_softmax = tf.nn.softmax(y_hat)
total_loss = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_hat_softmax), [1]))

본질적으로 다음 함수로 계산 된 총 교차 엔트로피 손실과 softmax_cross_entropy_with_logits()같습니다.

total_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true))

긴 버전 :

신경망의 출력 레이어에서 계산과 같은 각 트레이닝 인스턴스에 대한 클래스 점수를 포함하는 배열을 계산할 수 있습니다 y_hat = W*x + b. 예를 들어 아래 y_hat에서 2 x 3 배열로 만들었습니다. 여기서 행은 교육 인스턴스에 해당하고 열은 클래스에 해당합니다. 여기에 2 개의 훈련 인스턴스와 3 개의 수업이 있습니다.

import tensorflow as tf
import numpy as np

sess = tf.Session()

# Create example y_hat.
y_hat = tf.convert_to_tensor(np.array([[0.5, 1.5, 0.1],[2.2, 1.3, 1.7]]))
sess.run(y_hat)
# array([[ 0.5,  1.5,  0.1],
#        [ 2.2,  1.3,  1.7]])

값은 정규화되지 않습니다 (예 : 행의 합이 1이 아님). 정규화하기 위해 입력을 정규화되지 않은 로그 확률 (일명 logits ) 로 해석하고 정규화 된 선형 확률을 출력 하는 softmax 함수를 적용 할 수 있습니다 .

y_hat_softmax = tf.nn.softmax(y_hat)
sess.run(y_hat_softmax)
# array([[ 0.227863  ,  0.61939586,  0.15274114],
#        [ 0.49674623,  0.20196195,  0.30129182]])

softmax 출력의 내용을 완전히 이해하는 것이 중요합니다. 아래에는 위의 출력을보다 명확하게 나타내는 표가 나와 있습니다. 예를 들어, 훈련 인스턴스 1이 "클래스 2"일 확률은 0.619임을 알 수있다. 각 교육 인스턴스의 클래스 확률은 정규화되므로 각 행의 합계는 1.0입니다.

                      Pr(Class 1)  Pr(Class 2)  Pr(Class 3)
                    ,--------------------------------------
Training instance 1 | 0.227863   | 0.61939586 | 0.15274114
Training instance 2 | 0.49674623 | 0.20196195 | 0.30129182

이제 각 훈련 인스턴스에 대한 클래스 확률이 있으며, 여기서 각 행의 argmax ()를 사용하여 최종 분류를 생성 할 수 있습니다. 위에서 우리는 훈련 인스턴스 1이 "클래스 2"에 속하고 훈련 인스턴스 2가 "클래스 1"에 속한다는 것을 생성 할 수 있습니다.

이러한 분류가 정확합니까? 훈련 세트의 실제 레이블을 기준으로 측정해야합니다. one-hot 인코딩 y_true배열 이 필요합니다 . 여기서 행은 학습 인스턴스이고 열은 클래스입니다. 아래에서는 y_true교육 인스턴스 1의 실제 레이블이 "클래스 2"이고 교육 인스턴스 2의 실제 레이블이 "클래스 3"인 one-hot 배열 의 예를 만들었습니다 .

y_true = tf.convert_to_tensor(np.array([[0.0, 1.0, 0.0],[0.0, 0.0, 1.0]]))
sess.run(y_true)
# array([[ 0.,  1.,  0.],
#        [ 0.,  0.,  1.]])

확률 분포는 확률 분포와 y_hat_softmax비슷 y_true합니까? 교차 엔트로피 손실 을 사용하여 오류를 측정 할 수 있습니다 .

교차 엔트로피 손실 공식

교차 엔트로피 손실을 행 단위로 계산하고 결과를 볼 수 있습니다. 아래에서 훈련 인스턴스 1의 손실은 0.479이고 훈련 인스턴스 2의 손실은 1.200입니다. 위의 예에서 y_hat_softmax훈련 인스턴스 1의 가장 높은 확률은 "클래스 2"일 가능성이 있음을 보여 주었 으므로이 결과는 의미 가 있습니다 y_true. 그러나 훈련 사례 2에 대한 예측은 "클래스 1"에 대한 확률이 가장 높았으며 이는 실제 클래스 "클래스 3"과 일치하지 않습니다.

loss_per_instance_1 = -tf.reduce_sum(y_true * tf.log(y_hat_softmax), reduction_indices=[1])
sess.run(loss_per_instance_1)
# array([ 0.4790107 ,  1.19967598])

우리가 정말로 원하는 것은 모든 교육 인스턴스에 대한 총 손실입니다. 따라서 다음을 계산할 수 있습니다.

total_loss_1 = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_hat_softmax), reduction_indices=[1]))
sess.run(total_loss_1)
# 0.83934333897877944

softmax_cross_entropy_with_logits () 사용

대신 tf.nn.softmax_cross_entropy_with_logits()아래와 같이 함수를 사용하여 총 교차 엔트로피 손실을 계산할 수 있습니다.

loss_per_instance_2 = tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true)
sess.run(loss_per_instance_2)
# array([ 0.4790107 ,  1.19967598])

total_loss_2 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true))
sess.run(total_loss_2)
# 0.83934333897877922

참고 그 total_loss_1total_loss_2매우 마지막 자리에서 몇 가지 작은 차이와 생산 본질적으로 동등한 결과. 그러나 두 번째 방법을 사용할 수도 있습니다. softmax가 내부에서 수행되기 때문에 코드 한 줄이 덜 걸리고 수치 오류가 적습니다 softmax_cross_entropy_with_logits().


위의 내용을 모두 확인합니다. 간단한 코드 : M = tf.random.uniform([100, 10], minval=-1.0, maxval=1.0); labels = tf.one_hot(tf.random.uniform([100], minval=0, maxval=10 , dtype='int32'), 10); tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=M) - tf.reduce_sum(-tf.nn.log_softmax(M)*tf.one_hot(labels, 10), -1)어디에서나 0에 가깝게 반환
Sami A. Haija

51

tf.nn.softmaxsoftmax 레이어를 통한 순방향 전파를 계산합니다. 모형이 출력하는 확률을 계산할 때 모형을 평가 하는 동안 이 모형을 사용합니다.

tf.nn.softmax_cross_entropy_with_logitssoftmax 레이어의 비용을 계산합니다. 훈련 중에 만 사용됩니다 .

로 짓은 모형을 출력하는 정규화 되지 않은 로그 확률 (softmax 정규화가 적용되기 전에 출력 된 값)입니다.


2
알겠습니다 왜 tf.nn.softmax_cross_entropy_sans_normalization 함수를 호출하지 않습니까?
auro

8
교차 엔트로피 계산 동안 (내부적으로) 값을 정규화하기 때문에 @auro. 요점은 tf.nn.softmax_cross_entropy_with_logits표준화 된 출력을 제공하지 않고 모델이 골드 라벨에서 얼마나 많이 벗어 났는지 평가하는 것입니다.
erickrf

1
tf.nn.sparse_softmax_cross_entropy_with_logits ()를 사용하는 경우 희소 softmax 레이어의 비용을 계산하므로 훈련 중에 사용해야 새 데이터에 대해 모델을 실행할 때 대안을 사용해야합니다. 이로부터 확률을 얻을 수 있습니까? 하나.
SerialDev

2
@SerialDev,에서 확률을 얻을 수 없습니다 tf.nn.sparse_softmax_cross_entropy_with_logits. 확률을 얻으려면을 사용하십시오 tf.nn.softmax.
Nandeesh

4

위의 답변에는 질문에 대한 설명이 충분합니다.

또한 Tensorflow는 활성화 기능을 적용한 다음 자체 활성화를 사용하여 비용을 계산하고 비용 함수를 계산하는 작업을 최적화했습니다. 따라서 그것은 사용하기 좋은 연습은 다음과 같습니다 tf.nn.softmax_cross_entropy()이상tf.nn.softmax(); tf.nn.cross_entropy()

자원 집약적 모델에서 이들 간의 현저한 차이를 찾을 수 있습니다.


1
위의 대답은 분명히 그 질문을 읽지 못했습니다. 그들은 모두 같은 것을 말하지만, 그 질문 자체에는 대답하지 않습니다
Euler_Salter

@abhish tf.nn.softmax다음 을 의미 했습니까 tf.losses.softmax_cross_entropy?
ankurrc

4

무엇 적으로 이동하는 softmax로짓이며,이 J. 힌튼은 코 세라 비디오의 모든 시간을 반복하는 것이다.


1

Tensorflow 2.0 호환 답변 : Logits 및 관련 기능에 대한 설명 dgastackoverflowuser2010자세한 내용입니다.

사용되는 모든 함수 Tensorflow 1.x는 정상적으로 작동하지만 코드를에서 (으) 1.x (1.14, 1.15, etc)로 마이그레이션 2.x (2.0, 2.1, etc..)하면 해당 함수를 사용하면 오류가 발생합니다.

따라서 모든 기능에 대해 2.0 호환 호출을 지정 1.x to 2.x하면 커뮤니티의 이익을 위해 위에서 마이그레이션 한 경우 위에서 논의했습니다 .

1.x의 기능 :

  1. tf.nn.softmax
  2. tf.nn.softmax_cross_entropy_with_logits
  3. tf.nn.sparse_softmax_cross_entropy_with_logits

1.x에서 2.x로 마이그레이션 할 때의 각 함수 :

  1. tf.compat.v2.nn.softmax
  2. tf.compat.v2.nn.softmax_cross_entropy_with_logits
  3. tf.compat.v2.nn.sparse_softmax_cross_entropy_with_logits

1.x에서 2.x 로의 마이그레이션에 대한 자세한 내용은이 마이그레이션 안내서 를 참조하십시오 .


0

logit으로 분명히 강조하고 싶은 또 하나의 것은 단지 원시 출력, 일반적으로 마지막 레이어의 출력입니다. 음수 값이 될 수도 있습니다. 아래에 언급 된대로 "교차 엔트로피"평가를 위해 사용하는 경우 :

-tf.reduce_sum(y_true * tf.log(logits))

그런 다음 작동하지 않습니다. -ve의 로그가 정의되지 않았습니다. 따라서 o softmax 활성화를 사용하면이 문제를 극복 할 수 있습니다.

이것은 나의 이해입니다. 만약 내가 틀렸다면 정정하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.