programing

로짓이 뭐죠?softmax와 softmax_cross_entropy_with_logits의 차이점은 무엇입니까?

sourcetip 2022. 9. 19. 22:50
반응형

로짓이 뭐죠?softmax와 softmax_cross_entropy_with_logits의 차이점은 무엇입니까?

Tensorflow API 문서에서는 다음과 같은 키워드를 사용합니다.logits.그것은 무엇일까요?많은 방법이 다음과 같이 기술되어 있습니다.

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

한다면logits그냥 범용일 뿐이죠.Tensorinput, 왜 이름이 붙여졌습니까?logits?


둘째, 다음 두 가지 방법의 차이점은 무엇입니까?

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

좋은 수가 있어요.tf.nn.softmax그렇긴 한데, 다른 건 아니에요예를 들면 정말 도움이 될 것 같아요.

softmax+logits는 단순히 함수가 이전 레이어의 밀봉되지 않은 출력에서 작동하고 단위를 이해하는 상대적 척도가 선형임을 의미합니다.이는 특히 입력의 합계가 1이 아닐 수 있으며 값이 확률이 아니라는 것을 의미합니다(입력 값이 5일 수 있음).내부적으로 먼저 softmax를 비스케일링 출력에 적용한 다음 이들 값의 교차 엔트로피 대 라벨에 의해 정의된 대로 "필요한" 값을 계산합니다.

tf.nn.softmax입력 텐서에 소프트맥스 함수를 적용한 결과를 생성합니다.softmax는 입력을 "스퀴징"하여sum(input) = 1는 입력을 로그 확률(logits)로 해석하여 0 ~1의 원시 확률로 변환함으로써 매핑을 수행합니다.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]]

DNN에서 softmax가 널리 사용되는 이유에 대한 자세한 내용은 이 답변을 참조하십시오.

tf.nn.softmax_cross_entropy_with_logits는 softmax 스텝과 softmax 함수를 적용한 후의 크로스 큐 손실 계산을 조합하지만 수학적으로 더 신중한 방법으로 이 모든 것을 함께 수행합니다.이는 다음과 같은 결과와 유사합니다.

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

교차 엔트로피는 요약 메트릭입니다. 요소 전체에 걸쳐 집계됩니다.의 출력tf.nn.softmax_cross_entropy_with_logits모양대로[2,5]텐서는 모양이다[2,1](첫 번째 치수는 배치로 처리됩니다).

크로스 엔트로피를 최소화하기 위해 최적화를 수행하고 마지막 레이어 이후에 소프트맥스를 사용하는 경우tf.nn.softmax_cross_entropy_with_logits수치적으로 불안정한 코너 케이스를 수학적으로 정확하게 커버하기 때문에 직접 하는 것이 아닙니다.그렇지 않으면 여기저기서 작은 에필론을 추가하여 해킹을 하게 됩니다.

2016-02-07 편집: 객체가 하나의 클래스에만 속할 수 있는 단일 클래스 레이블이 있는 경우 이제 사용을 고려할 수 있습니다.tf.nn.sparse_softmax_cross_entropy_with_logits따라서 라벨을 고밀도 원핫 어레이로 변환할 필요가 없습니다.이 기능은 릴리즈 0.6.0 이후에 추가되었습니다.

쇼트 버전:

텐서가 두 개 있다고 가정해 봅시다.y_hat각 클래스에 대해 계산된 점수(예: y = W*x +b)를 포함합니다.y_true에는 원핫 부호화된 True Label이 포함되어 있습니다.

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

의 점수를 해석하면y_hat정규화되지 않은 로그 확률로 지정되면 로그가 됩니다.

또한 다음과 같은 방법으로 계산된 총 교차 엔트로피 손실:

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개의 트레이닝 인스턴스와 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이 되지 않음).이들을 정규화하기 위해 softmax 함수를 적용할 수 있습니다.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"에 속한다는 것을 생성할 수 있습니다.

이 분류가 맞습니까?트레이닝 세트에 기재되어 있는 실제 라벨과 대조하여 측정할 필요가 있습니다.원핫 인코딩이 필요합니다.y_truearray. 여기서 행은 교육 인스턴스이고 열은 클래스입니다.아래에 예를 작성했습니다.y_true트레이닝 인스턴스 1의 실제 라벨은 "클래스 2"이고 트레이닝 인스턴스 2의 실제 라벨은 "클래스 3"입니다.

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교차 엔트로피 손실을 사용하여 오류를 측정할 수 있습니다.

Formula for cross-entropy loss

행 단위로 교차 엔트로피 손실을 계산하여 결과를 확인할 수 있습니다.다음으로 트레이닝 인스턴스1의 손실이 0.479인 반면 트레이닝 인스턴스2의 손실은 1.200인 것을 알 수 있습니다.위의 예에서 이 결과는 의미가 있습니다.y_hat_softmax트레이닝 인스턴스 1의 가장 높은 확률은 "클래스 2"로, 이는 트레이닝 인스턴스 1과 일치합니다.y_true그러나 훈련 사례 2에 대한 예측은 "Class 1"에 대해 가장 높은 확률을 보였으며, 이는 진정한 클래스 "Class 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_1그리고.total_loss_2맨 마지막 자릿수에 약간의 차이를 두고 본질적으로 동일한 결과를 도출한다.단, 두 번째 접근방식을 사용하는 것이 좋습니다.이 접근방식은 softmax가 내부에서 실행되기 때문에 코드 행이1줄 줄어들고 수치 에러가 적어집니다.softmax_cross_entropy_with_logits().

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

tf.nn.softmax_cross_entropy_with_logits는 softmax 레이어 비용을 계산합니다.훈련 에만 사용합니다.

로짓은 모델 출력(소프트맥스 정규화가 적용되기 전에 출력되는 값)에서 정규화되지 않은 로그 확률입니다.

용어의 수학적 동기

출력을 0과 1 사이에서 제한하고 싶지만 모델 아키텍처가 제한되지 않은 값을 출력하는 경우 정규화 레이어를 추가하여 이를 적용할 수 있습니다.

일반적인 선택은 S자형 1함수입니다.이항 분류에서는 일반적으로 로지스틱 함수이며, 다항 2로지스틱 함수(소프트맥스라고도 함)는 다항 로지스틱 함수입니다.

만약 우리가 우리의 새로운 최종 계층의 출력을 '확률'로 해석하고 싶다면, 우리의 S자형에 대한 제약 없는 입력은 (암시에 의해) 다음과 같아야 한다.inverse-sigmoid(가능성).로지스틱의 경우 이는 확률의 로그 오드(, 오즈의 로그) a.k.a. 로짓과 동일합니다.

그렇기 때문에 에 대한 주장은softmax라고 불리고 있다logitsTensorflow - 왜냐하면 다음과 같은 가정하에서softmax는 모델의 최종 레이어이며 출력 p는 확률로 해석되며 이 레이어에 대한 입력 x는 로짓으로 해석됩니다.

enter image description here enter image description here

일반화 용어

기계 학습에서는 수학/통계/컴퓨터 과학에서 빌린 용어를 일반화하려는 경향이 있으며, 따라서 Tensorflow에서는logit(유추에 의해)는 많은 정규화 함수에 대한 입력의 동의어로 사용된다.


  1. 이것은 쉽게 달라질 수 있고 앞서 언급한 확률론적 해석과 같은 훌륭한 특성을 가지고 있지만, 다소 자의적이다.
  2. softmaxargmax 함수의 부드러운 근사치이기 때문에 softargmax라고 더 정확하게 불릴 수 있습니다.

위의 답변은 질문에 대한 충분한 설명입니다.

또한 Tensorflow는 활성화 함수를 적용한 후 자체 활성화와 비용 함수를 사용하여 비용을 계산하는 연산을 최적화하였다.따라서 다음을 사용하는 것이 좋습니다.tf.nn.softmax_cross_entropy()에 걸쳐서tf.nn.softmax(); tf.nn.cross_entropy()

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

Tensorflow 2.0 호환 답변:의 설명dga그리고.stackoverflowuser2010매우 Logits고 관련 기능에 대한 자세한.

때 Tensorflow 1.x에서 사용되는 모든 이러한 기능, 건강하지만, 만약 당신이 1.x(1.14, 115등)에서 2.x(2.0, 2.1, 등.)코드 늘어나면서, 이러한 기능 오류 발생을 사용하여 작동할 것이다.

만약 우리가 1.x에서 2.x로 이주한다 따라서, 2.0버전 호환 요구하는 모든 기능을 위해 지정하여, 우리가 위에, 공동체의 이익을 위해 논의했다.

1.x에서 기능:

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

Respective 기능할 때 1.x에서 2.x에 Migrated:.

  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.x2.x까지 자세한 내용은 이 이주 지침서 참조해 주세요.

나는 확실히 logit로 강조하고 싶어 하는 한가지 더 있는 단지 원출력, 마지막 층은 일반적으로 출력.이건 부정적인 값이다.만약 우리가 그것을 사용해 아래와 같이. 그것"크로스 엔트로피"평가를 위해: 있다.

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

효과가 없을 거야-ve의 로그가 정의되어 있지 않기 때문에.따라서 o softmax 액티베이션을 사용하면 이 문제를 해결할 수 있습니다.

제 이해는 이렇습니다만, 제가 틀렸다면 정정해 주세요.

로짓은 뉴럴 네트워크의 비정규화된 출력입니다.Softmax는 뉴럴 네트워크의 출력을 모두 0에서 1 사이, 합계가 1이 되도록 스퀴즈하는 정규화 함수입니다.Softmax_cross_entropy_with_logits는 뉴럴 네트워크의 출력(softmax에 의해 압축된 후)과 이러한 출력의 진정한 라벨을 받아들여 손실값을 반환하는 손실함수입니다.

언급URL : https://stackoverflow.com/questions/34240703/what-are-logits-what-is-the-difference-between-softmax-and-softmax-cross-entrop

반응형