cross-entropy 손실함수 완전 정복 — 심화 학습서

03. cross-entropy의 gradient와 최적화 — 왜 $q-y$인가

Contents

02장은 로짓에서 확률을 거쳐 손실 한 숫자까지 왔다. 학습은 그 손실을 줄이는 일이다. 줄이려면 손실을 로짓으로 미분한 gradient(기울기)가 있어야 한다. 이 장의 결론은 한 줄이다.

  Lz=qy  \boxed{\;\dfrac{\partial L}{\partial z} = q - y\;}

softmax와 cross-entropy를 짝지으면 로짓에 대한 gradient가 "예측확률 − 정답"이라는 깔끔한 형태가 된다. 이 한 줄 덕분에 구현이 단순해지고, 틀릴수록 큰 교정 신호가 나오며, MSE(평균제곱오차, mean squared error)가 겪는 포화 문제를 피한다. 이 장은 softmax 야코비안(Jacobian, 미분을 모은 표)부터 시작해 이 결과를 한 줄도 건너뛰지 않고 유도한다. 그다음 MSE와 나란히 대비하고, 02장의 주 예제 z=(2,1,0.1)z=(2,1,0.1)로 한 스텝을 직접 돌린다.


3.1 도입 — gradient가 왜 중요한가

신경망 학습은 손실 LL을 줄이는 파라미터 θ\theta를 찾는 일이다. 경사하강(gradient descent)은 이를 가장 단순하게 푼다.

θθηLθ.\theta \leftarrow \theta - \eta\,\frac{\partial L}{\partial \theta}.

손실의 gradient는 "LL이 가장 가파르게 증가하는 방향"이다. 그래서 그 반대 방향(L/θ-\partial L/\partial\theta)으로 한 발짝 움직이면 LL이 줄어든다. 발걸음 크기 η\eta는 학습률(learning rate)이다.

여기서 결정적인 통찰이 하나 있다. 손실함수를 어떻게 고르느냐가 gradient의 모양을 정하고, 그 모양이 학습 속도를 좌우한다. 같은 모델·같은 데이터라도 손실을 CE로 쓰느냐 MSE로 쓰느냐에 따라 결과가 갈린다. CE는 큰 신호를 준다(qyq-y). MSE는 신호가 거의 0이 되어 학습이 멈추기도 한다((p^y)σ(\hat p-y)\sigma'). 이 장의 나머지는 왜 softmax/sigmoid와 CE의 조합이 이상적인 모양을 내는지 보인다.

전체 그림을 먼저 보자. 로짓 zz가 들어가 손실 LL이 나오고(forward), 그 미분 qyq-y가 되돌아 나온다(backward).

Backward

Forward

dL/dq = -y/q

Jacobian q_i(delta_ij - q_j)

net result: dL/dz = q - y

logits z

q = softmax(z)

L = -sum y log q

위 그림에서 backward로 거치는 두 점선 단계가 약분되어, 굵은 화살표 한 줄 qyq-y로 합쳐진다. 그 약분이 이 장의 핵심이다.


Advertisements

3.2 softmax + cross-entropy의 gradient — 핵심 유도

설정과 기호

먼저 기호를 정해 둔다.

  • 로짓: z=(z1,,zK)z = (z_1,\dots,z_K) — 모델 마지막 선형층의 출력으로, 아직 확률이 아니다.
  • 예측 확률: q=softmax(z)q = \text{softmax}(z), 즉 qi=ezikezkq_i = \dfrac{e^{z_i}}{\sum_{k} e^{z_k}}, iqi=1\sum_i q_i = 1, qi(0,1)q_i\in(0,1).
  • 정답: one-hot 라벨 yy. 정답 클래스 cc에서 yc=1y_c=1, 나머지는 0이다. kyk=1\sum_k y_k = 1.
  • 손실: L=kyklogqkL = -\sum_{k} y_k \log q_k.

yy가 one-hot이라 사실상 L=logqcL=-\log q_c다. 하지만 유도는 일반 yy로 한다. 그러면 soft label(부드러운 정답 분포)에도 그대로 성립한다.

목표는 Lzi\dfrac{\partial L}{\partial z_i}를 구하는 것이다. 전략은 연쇄법칙이다.

Lzi=k=1KLqkqkzi.\frac{\partial L}{\partial z_i} = \sum_{k=1}^{K} \frac{\partial L}{\partial q_k}\,\frac{\partial q_k}{\partial z_i}.

따라서 두 조각이 필요하다. (a) softmax 야코비안 qk/zi\partial q_k/\partial z_i, (b) 손실의 미분 L/qk\partial L/\partial q_k. 야코비안부터 구한다.

(a) softmax 야코비안 — 천천히, 두 경우로

야코비안은 "출력 qiq_i 하나하나를 입력 zjz_j 하나하나로 미분한 표"다. softmax는 모든 출력이 같은 분모를 나눠 쓴다. 그래서 zjz_j 하나를 건드리면 qiq_i 전체가 흔들린다. 이 때문에 두 경우를 갈라야 한다. i=ji=j(자기 자신을 미분)와 iji\ne j(남을 미분)이다.

qi=eziSq_i = \dfrac{e^{z_i}}{S}로 쓰고, 분모를 S=kezkS=\sum_{k} e^{z_k}로 둔다. 먼저 꼭 필요한 사실이 하나 있다. Szj=ezj\dfrac{\partial S}{\partial z_j}=e^{z_j}이다. SS 안의 여러 항 중 zjz_j를 가진 건 ezje^{z_j} 하나뿐이라, 미분하면 그 항만 살아남기 때문이다.

이제 몫의 미분법 (uv)=uvuvv2\left(\dfrac{u}{v}\right)' = \dfrac{u'v - uv'}{v^2}를 쓴다. 여기서 u=eziu=e^{z_i}, v=Sv=S다.

qizj=ezizjS    eziSzjS2=ezizjS    eziezjS2.\frac{\partial q_i}{\partial z_j} = \frac{\dfrac{\partial e^{z_i}}{\partial z_j}\cdot S \;-\; e^{z_i}\cdot \dfrac{\partial S}{\partial z_j}}{S^2} = \frac{\dfrac{\partial e^{z_i}}{\partial z_j}\cdot S \;-\; e^{z_i} e^{z_j}}{S^2}.

두 번째 등호에서 방금 구한 S/zj=ezj\partial S/\partial z_j = e^{z_j}를 넣었다. 이제 남은 분자의 ezizj\dfrac{\partial e^{z_i}}{\partial z_j}가 두 경우로 갈린다.

경우 1: i=ji=j (대각 성분, 내가 나를 미분). ezizi=ezi\dfrac{\partial e^{z_i}}{\partial z_i}=e^{z_i}이므로 첫 항이 살아남는다.

qizi=eziSezieziS2=eziS=qiSeziS=1qi=qi(1qi).\frac{\partial q_i}{\partial z_i} = \frac{e^{z_i} S - e^{z_i} e^{z_i}}{S^2} = \underbrace{\frac{e^{z_i}}{S}}_{=\,q_i}\cdot\underbrace{\frac{S - e^{z_i}}{S}}_{=\,1-q_i} = q_i\,(1 - q_i).

마지막 줄이 핵심이다. 두 분수를 각각 qiq_i1qi1-q_i로 알아봤다. eziS=qi\frac{e^{z_i}}{S}=q_i를 두 번 쓴 셈이다. 둘째 분수는 SSeziS=1qi\frac{S}{S}-\frac{e^{z_i}}{S}=1-q_i다.

경우 2: iji\ne j (비대각 성분, 남을 미분). zjz_jezie^{z_i} 안에 없으니 ezizj=0\dfrac{\partial e^{z_i}}{\partial z_j}=0이다. 그래서 분자의 첫 항이 통째로 사라진다.

qizj=0SeziezjS2=eziS=qiezjS=qj=qiqj.\frac{\partial q_i}{\partial z_j} = \frac{0\cdot S - e^{z_i}e^{z_j}}{S^2} = -\underbrace{\frac{e^{z_i}}{S}}_{=\,q_i}\cdot\underbrace{\frac{e^{z_j}}{S}}_{=\,q_j} = -\,q_i\,q_j.

두 경우를 한 줄로. Kronecker 델타 δij={1i=j0ij\delta_{ij}=\begin{cases}1 & i=j\\ 0 & i\neq j\end{cases}를 쓰면 두 식이 하나로 합쳐진다.

  qizj=qi(δijqj)  \boxed{\;\frac{\partial q_i}{\partial z_j} = q_i(\delta_{ij} - q_j)\;}

이 식이 두 경우를 모두 담는지 검산하자. i=ji=j를 넣으면 δij=1\delta_{ij}=1이라 qi(1qi)q_i(1-q_i)가 되어 경우 1과 맞는다. iji\ne j를 넣으면 δij=0\delta_{ij}=0이라 qi(0qj)=qiqjq_i(0-q_j)=-q_iq_j가 되어 경우 2와 맞는다. 행렬로 쓰면 J=diag(q)qqJ = \mathrm{diag}(q) - q\,q^\top이다. 대각에 qiq_i를 놓고, 전체에서 qiqjq_iq_j를 뺀 대칭행렬이다.

dq_i/dz_j = q_i(delta_ij - q_j)

i = j (diagonal)
= q_i(1 - q_i) >= 0

i != j (off-diagonal)
= - q_i q_j <= 0

raise my logit -> my prob up

raise another logit -> my prob down
(probs sum to 1, they steal from each other)

위 그림은 야코비안의 두 갈래가 무엇을 뜻하는지 보여 준다. softmax는 "확률 합 = 1"이라는 제약 때문에 경쟁적이다. 한 클래스의 로짓을 올리면 그 확률은 오른다(qi(1qi)>0q_i(1-q_i)>0). 동시에 다른 모든 클래스의 확률은 깎인다(qiqj<0-q_iq_j<0). 이 상호작용이 야코비안의 비대각 항이다.

(b) 연쇄법칙으로 Lzi=qiyi\dfrac{\partial L}{\partial z_i} = q_i - y_i

이제 남은 조각, 손실의 미분 L/qk\partial L/\partial q_k를 구한다. L=kyklogqkL=-\sum_k y_k\log q_kqkq_k로 미분한다. 다른 항은 qkq_k를 가지지 않으므로 사라진다. 로그 미분 ddqlogq=1/q\frac{d}{dq}\log q = 1/q를 쓰면

Lqk=ykqk.\frac{\partial L}{\partial q_k} = -\frac{y_k}{q_k}.

두 조각을 연쇄법칙에 대입한다. 여기서 kk는 더미 인덱스, ii는 우리가 미분하는 로짓의 인덱스다. 야코비안에서 qk/zi\partial q_k/\partial z_i는 첫 인덱스가 kk, 둘째가 ii이므로 델타가 δki\delta_{ki}로 들어간다.

Lzi=k=1KLqkqkzi=k=1K(ykqk)qk(δkiqi).\frac{\partial L}{\partial z_i} = \sum_{k=1}^{K} \frac{\partial L}{\partial q_k}\,\frac{\partial q_k}{\partial z_i} = \sum_{k=1}^{K}\left(-\frac{y_k}{q_k}\right)\,q_k(\delta_{ki} - q_i).

여기가 식을 깨끗하게 만드는 한 줄이다. ykqk-\frac{y_k}{q_k}의 분모 qkq_k와 야코비안의 qkq_k가 약분된다(qkqk=1\frac{q_k}{q_k}=1).

=k=1Kyk(δkiqi)=kykδki합 ①  +  kykqi합 ②.= -\sum_{k=1}^{K} y_k(\delta_{ki} - q_i) = \underbrace{-\sum_{k} y_k\,\delta_{ki}}_{\text{합 ①}} \;+\; \underbrace{\sum_{k} y_k\,q_i}_{\text{합 ②}}.

괄호를 풀어 두 합으로 나눴다. 각각을 계산한다.

  • 합 ①: δki\delta_{ki}k=ik=i일 때만 1이다. 그래서 합에서 k=ik=i 항만 남아 kykδki=yi\sum_k y_k\delta_{ki} = y_i가 된다. 앞의 음부호와 합치면 yi-y_i다.
  • 합 ②: qiq_ikk에 안 걸리므로 합 밖으로 뺀다. 그러면 qikykq_i\sum_k y_k가 된다. yy는 확률분포라 kyk=1\sum_k y_k = 1이다(one-hot이든 soft label이든). 따라서 qi1=qiq_i\cdot 1 = q_i다.

두 결과를 대입하면

Lzi=yi+qi=qiyi.\frac{\partial L}{\partial z_i} = -\,y_i + q_i = q_i - y_i.

  Lzi=qiyizL=qy  \boxed{\;\frac{\partial L}{\partial z_i} = q_i - y_i \qquad\Longleftrightarrow\qquad \nabla_z L = q - y\;}

건너뛴 단계 없음 체크 (유도에 쓴 것 전부):

  1. L/qk=yk/qk\partial L/\partial q_k=-y_k/q_k (로그 미분),
  2. softmax 야코비안 qk(δkiqi)q_k(\delta_{ki}-q_i) — 몫의 미분법 두 경우,
  3. qk/qkq_k/q_k 약분 (← 깔끔함의 핵심),
  4. kykδki=yi\sum_k y_k\delta_{ki}=y_i (델타의 선별 성질),
  5. kyk=1\sum_k y_k = 1 (라벨이 확률분포).

결과 해석 — "gradient = 예측 − 정답"

벡터 qyq-y의 각 성분을 보면 학습 신호의 의미가 또렷하다. 정답 클래스 cc에서 yc=1y_c=1, 나머지 jcj\ne c에서 yj=0y_j=0이므로 성분이 두 종류로 갈린다.

성분 부호 경사하강 효과 (zzη(qy)z\leftarrow z-\eta(q-y))
정답 클래스 cc qc10q_c - 1 \le 0 음수 zcz_c를 올린다 → 정답 확률 ↑
오답 클래스 jj qj00q_j - 0 \ge 0 양수 zjz_j를 내린다 → 오답 확률 ↓

크기도 직관적이다.

  • 많이 틀릴수록 큰 gradient. 정답인데 qc0q_c\approx 0이면 qc11q_c-1\approx -1로 크기가 최대다. 그래서 강하게 교정한다.
  • 맞을수록 작은 gradient. qc1q_c\approx 1이면 qc10q_c-1\approx 0이라 거의 안 건드린다.
  • 완벽하면 정확히 0. q=yq=y이면 모든 성분이 0이라 더 배울 게 없다(손실 정지점).

이 "틀린 만큼만, 틀린 방향으로"라는 성질이 cross-entropy를 분류 손실의 표준으로 만든 이유다.

prediction near truth

q_c ~ 1 (well fit)

|q - y| ~ 0
small gradient -> fine tune

prediction far from truth

q_c ~ 0 (very wrong)

|q - y| ~ 1
large gradient -> fast fix

위 그림은 예측이 정답에서 멀수록 gradient가 커지고, 가까울수록 작아지는 모습을 보여 준다.


Advertisements

3.3 sigmoid + BCE의 gradient — 같은 형태 p^y\hat p - y

이진 분류, 또는 여러 라벨을 각 클래스 독립으로 판정하는 multi-label에서는 softmax 대신 sigmoid를 쓴다. 기호를 정한다.

  • 단일 로짓 zz, 예측 확률 p^=σ(z)=11+ez\hat p=\sigma(z)=\dfrac{1}{1+e^{-z}}. 이 p^\hat p는 모델이 매긴 양성확률이다(00장 §0.6).
  • 정답 y{0,1}y\in\{0,1\},
  • BCE(이진 cross-entropy): L=[ylogp^+(1y)log(1p^)]L = -[\,y\log \hat p + (1-y)\log(1-\hat p)\,].

미분하려면 sigmoid의 도함수가 필요하다.

σ(z)=σ(z)(1σ(z))=p^(1p^).\sigma'(z) = \sigma(z)\big(1-\sigma(z)\big) = \hat p(1-\hat p).

유도는 짧다. p^=(1+ez)1\hat p=(1+e^{-z})^{-1}이므로 p^=(1+ez)2(ez)=ez(1+ez)2=p^ez1+ez=p^(1p^)\hat p'=-(1+e^{-z})^{-2}\cdot(-e^{-z})=\dfrac{e^{-z}}{(1+e^{-z})^2}=\hat p\cdot\dfrac{e^{-z}}{1+e^{-z}}=\hat p(1-\hat p)다.

이제 연쇄법칙을 쓴다. 먼저 L/p^=yp^+1y1p^\partial L/\partial \hat p = -\dfrac{y}{\hat p} + \dfrac{1-y}{1-\hat p}를 구하고, 여기에 p^/z=σ\partial\hat p/\partial z=\sigma'를 곱한다.

Lz=Lp^p^z=(yp^+1y1p^)p^(1p^).\frac{\partial L}{\partial z}=\frac{\partial L}{\partial \hat p}\cdot\frac{\partial \hat p}{\partial z} =\left(-\frac{y}{\hat p}+\frac{1-y}{1-\hat p}\right)\,\hat p(1-\hat p).

괄호를 분배하면 여기서도 p^(1p^)\hat p(1-\hat p)가 분모와 약분된다.

=yp^p^(1p^)+1y1p^p^(1p^)=y(1p^)+(1y)p^=y+yp^+p^yp^=p^y.= -\frac{y}{\hat p}\,\hat p(1-\hat p) + \frac{1-y}{1-\hat p}\,\hat p(1-\hat p) = -y(1-\hat p) + (1-y)\hat p = -y + y\hat p + \hat p - y\hat p = \hat p - y.

마지막 전개에서 yp^y\hat p가 서로 상쇄된다.

  Lz=p^y  \boxed{\;\frac{\partial L}{\partial z} = \hat p - y\;}

softmax+CE의 qyq-y와 완전히 같은 형태다. 사실 sigmoid+BCE는 2-클래스 softmax+CE의 특수꼴이다(02장 §2.1). 여기서도 σ=p^(1p^)\sigma'=\hat p(1-\hat p)가 BCE의 1/p^1/\hat p, 1/(1p^)1/(1-\hat p)와 정확히 약분되어 식이 깨끗해진다. 이 약분이 다음 절에서 MSE와 갈리는 분기점이다.


3.4 왜 MSE는 분류에 나쁜가 — 대비

sigmoid + MSE의 gradient와 포화(saturation)

같은 sigmoid 출력 p^=σ(z)\hat p=\sigma(z)에 손실만 MSE로 바꾼다. L=12(p^y)2L = \tfrac{1}{2}(\hat p - y)^2이다. 연쇄법칙으로 Lp^=(p^y)\dfrac{\partial L}{\partial \hat p}=(\hat p-y), p^z=σ(z)=p^(1p^)\dfrac{\partial \hat p}{\partial z}=\sigma'(z)=\hat p(1-\hat p)이므로

  Lz=(p^y)σ(z)=(p^y)p^(1p^)  \boxed{\;\frac{\partial L}{\partial z} = (\hat p - y)\,\sigma'(z) = (\hat p-y)\,\hat p(1-\hat p)\;}

여기 σ(z)=p^(1p^)\sigma'(z)=\hat p(1-\hat p)가 곱해진 채 남아 있다. CE에서는 약분되어 사라졌던 바로 그 항이다. 이게 치명적이다.

포화(saturation)와 vanishing gradient. 시그모이드는 zz가 크게 음수면 p^0\hat p\approx0, 크게 양수면 p^1\hat p\approx1로 포화한다. 두 경우 모두 σ(z)=p^(1p^)0\sigma'(z)=\hat p(1-\hat p)\approx 0이다. 그런데 모델이 크게 틀린 상황이 바로 이런 포화 영역이다. 예를 들어 정답 y=1y=1인데 zz가 크게 음수면 p^0\hat p\approx0이다. 이때

LMSEz=(p^y1)p^(1p^)00.\frac{\partial L_{\text{MSE}}}{\partial z}=(\underbrace{\hat p-y}_{\approx-1})\underbrace{\hat p(1-\hat p)}_{\approx 0}\approx 0.

가장 강하게 고쳐야 할 샘플에서 gradient가 사라져 학습이 멈춘다.

cross-entropy는 정반대다. 같은 상황에서

LCEz=p^y01=1(크기 최대).\frac{\partial L_{\text{CE}}}{\partial z} = \hat p - y \approx 0 - 1 = -1 \quad(\text{크기 최대}).

σ\sigma'가 약분되어 사라졌으므로 포화 영역에서도 gradient가 살아 있다. "틀릴수록 큰 신호"가 그대로 유지된다.

sigmoid + MSE

z very negative, y=1 (very wrong)

dL/dz = (p_hat - y) sigma' ~ (-1)(0) ~ 0
sigma' stays -> gradient vanishes

sigmoid + Cross-Entropy

z very negative, y=1 (very wrong)

dL/dz = p_hat - y ~ -1
sigma' cancels -> gradient survives

위 그림은 같은 "크게 틀린" 입력에서 CE는 gradient가 살고 MSE는 사라지는 갈림을 보여 준다.

표: "크게 틀린 샘플"에서 CE gradient vs MSE gradient

y=1y=1로 고정한다. 여러 로짓 zz에 대해 p^=σ(z)\hat p=\sigma(z), CE gradient p^y|\hat p-y|, MSE gradient (p^y)p^(1p^)|(\hat p-y)\hat p(1-\hat p)|를 직접 계산했다.

zz p^=σ(z)\hat p=\sigma(z) σ(z)=p^(1p^)\sigma'(z)=\hat p(1-\hat p) CE p^y\lvert \hat p-y\rvert MSE (p^y)σ\lvert(\hat p-y)\sigma'\rvert CE/MSE 배율
6-6 0.002473 0.002467 0.997527 0.002460 ≈ 405×
4-4 0.017986 0.017663 0.982014 0.017345 ≈ 57×
2-2 0.119203 0.104994 0.880797 0.092478 ≈ 9.5×
00 0.500000 0.250000 0.500000 0.125000
+2+2 0.880797 0.104994 0.119203 0.012516 ≈ 9.5×
+4+4 0.982014 0.017663 0.017986 0.000318 ≈ 57×
+6+6 0.997527 0.002467 0.002473 0.000006 ≈ 405×

표를 읽는 법은 이렇다. 정답이 y=1y=1인데 z=6z=-6이면 "크게 틀린" 상태다. CE는 gradient 크기 0.998로 강하게 끌어올린다. MSE는 0.0025로 사실상 멈춘다. 약 405배 차이다. 틀릴수록, 즉 표의 위·아래 극단으로 갈수록 이 격차가 더 벌어진다. 이것이 "MSE는 분류에 나쁘다"의 정량적 실체다. 맨 위 행과 맨 아래 행은 각각 "정답인데 크게 틀림"과 "오답인데 크게 확신"의 대칭 상황이다. 둘 다 MSE에서 gradient가 소실된다.

(보조) 볼록성(convexity)

또 다른 차이는 로짓에 대한 손실 곡면의 모양이다. 더 정확히는 마지막 선형층의 가중치에 대한 곡면이다.

  • softmax + CE는 로짓에 대해 볼록(convex)하다. log-sum-exp는 볼록함수이고, 선형항을 더한 NLL(음의 로그우도)도 볼록이다. 그래서 마지막 선형층 기준으로 단일 전역최소를 가진다(국소최소 함정이 없다). 로그가 softmax의 지수와 결합해 볼록성을 보장한다.
  • sigmoid + MSE는 같은 출력에 대해 비볼록이 될 수 있다. 12(σ(z)y)2\frac12(\sigma(z)-y)^2zz에 대해 굴곡과 평탄부가 있어 비볼록이라, 최적화가 더 어렵다.

공정한 단서. "비볼록이라 항상 더 나쁘다"는 과장이다. 전체 심층망은 어느 손실을 써도 비볼록이다. 출력 리셋 같은 기법을 더하면 sigmoid+MSE도 softmax+CE에 견줄 수 있고, 노이즈 데이터에선 더 강건할 수 있다는 연구도 있다(arXiv:2411.11213). 다만 표준 설정에서 sigmoid+MSE가 포화 때문에 느리게 학습한다는 사실은 잘 확립돼 있다. 이 장의 주장은 "기본값으로 CE가 더 안전하고 빠르다"이지 "MSE가 절대 안 된다"가 아니다.


3.5 한 스텝 직접 돌리기 (주 예제 미리보기)

3-클래스 문제다. 로짓 z=(2.0,  1.0,  0.1)z=(2.0,\;1.0,\;0.1), 정답은 클래스 2(인덱스 1, 0부터 셈)다. 즉 one-hot y=(0,1,0)y=(0,1,0)이다. 정답 클래스가 가장 큰 로짓이 아니라서 처음엔 확률이 낮다(틀리기 직전 상태). 학습률은 η=0.1\eta=0.1이다.

① softmax. 분모부터 구한다. S=e2+e1+e0.1=7.389056+2.718282+1.105171=11.212509S=e^{2}+e^{1}+e^{0.1}=7.389056+2.718282+1.105171=11.212509.

q=(7.38905611.212509,  2.71828211.212509,  1.10517111.212509)=(0.659001,  0.242433,  0.098566).q=\Big(\tfrac{7.389056}{11.212509},\;\tfrac{2.718282}{11.212509},\;\tfrac{1.105171}{11.212509}\Big)=(0.659001,\;0.242433,\;0.098566).

② 손실. yy가 클래스 2를 가리키므로 정답 확률의 음로그만 본다. L=logq2=log(0.242433)=1.417030L=-\log q_2=-\log(0.242433)=\mathbf{1.417030}.

③ gradient qyq-y. 정답 성분에서만 1을 뺀다.

qy=(0.6590010,  0.2424331,  0.0985660)=(0.659001,  0.757567,  0.098566).q-y=(0.659001-0,\;0.242433-1,\;0.098566-0)=(\,0.659001,\;-0.757567,\;0.098566\,).

정답(클래스 2) 성분만 음수다. 그래서 z2z_2를 올린다. 다른 둘은 양수라 내린다.

④ 한 스텝. zzη(qy)z\leftarrow z-\eta(q-y), η=0.1\eta=0.1로 갱신한다.

z1=2.00.10.659001=1.934100,z2=1.00.1(0.757567)=1.075757,z3=0.10.10.098566=0.090143.\begin{aligned} z_1 &= 2.0 - 0.1\cdot 0.659001 = 1.934100,\\ z_2 &= 1.0 - 0.1\cdot(-0.757567) = 1.075757,\\ z_3 &= 0.1 - 0.1\cdot 0.098566 = 0.090143. \end{aligned}

⑤ 개선 확인. 새 로짓으로 softmax를 다시 구하면 q=(0.632090,  0.267920,  0.099990)q'=(0.632090,\;0.267920,\;0.099990)이다.

  • 정답 확률: 0.2424330.2679200.242433 \to \mathbf{0.267920} (+0.02549+0.02549, 올라감)
  • 새 손실: L=log(0.267920)=1.317067L'=-\log(0.267920)=\mathbf{1.317067} (ΔL=0.099963\Delta L=-0.099963, 줄어듦)

단 한 스텝에 정답 확률이 오르고 손실이 내렸다. qyq-y gradient가 의도한 방향으로 작동함을 숫자로 확인했다. 이 예제의 완전한 전 과정 추적은 05장 walkthrough에 단일화돼 있다.

z=(2.0, 1.0, 0.1)
true = class2

q=(.659,.242,.099)
L=1.417

grad q - y
=(.659, -.758, .099)

z <- z - 0.1(q - y)
z'=(1.934, 1.076, 0.090)

q'=(.632,.268,.100)
L'=1.317 down

위 그림은 한 스텝의 다섯 단계를 한 흐름으로 잇는다. 로짓에서 출발해 손실이 내려간 로짓으로 끝난다.


3.6 기타 연결

MLE와의 연결 — qyq-y는 음의 로그우도의 자연 gradient

cross-entropy를 최소화하는 일은 최대우도추정(MLE)과 같다(01장 §1.6). 모델이 정답 클래스에 부여한 확률 qcq_c의 로그우도 logqc\log q_c를 최대화하는 것이, 곧 logqc=L-\log q_c=L을 최소화하는 것이다. 이 NLL을 로짓으로 미분하면 자연스럽게 qyq-y가 나온다(§3.2). 즉 qyq-y는 임의로 고른 식이 아니라 확률모델의 우도를 키우는 정확한 방향이다.

미니배치·역전파로 백본까지

L/z=qy\partial L/\partial z=q-y는 출력층 로짓에서의 신호다. 실제 학습에선 이 신호가 세 단계로 퍼진다.

  • 미니배치 NN개에 대해 평균을 낸다. Lˉz(n)=1N(q(n)y(n))\dfrac{\partial \bar L}{\partial z^{(n)}}=\dfrac{1}{N}(q^{(n)}-y^{(n)}).
  • 이 신호가 역전파로 가중치까지 간다. 마지막 층이 z=Wx+bz=Wx+b이면 LW=(qy)x\dfrac{\partial L}{\partial W}=(q-y)\,x^\top, Lb=qy\dfrac{\partial L}{\partial b}=q-y다.
  • 그리고 체인을 따라 백본(은닉층과 특징추출기)까지 그대로 전파된다.

q - y

(q - y) x^T

W^T (q - y)

chain rule

L = CE

logits z = Wx+b

head weights W

backbone features x

backbone params theta

위 그림은 깨끗한 qyq-y가 출력층에서 시작해 백본 파라미터까지 거슬러 흐르는 길을 보여 준다. 출발점이 깔끔해서 backward 전체가 수치적으로 안정적이고 구현이 간단하다. softmax와 CE를 합쳐서 한 번에 미분하므로, 중간의 1/q1/q 같은 불안정한 항을 직접 다루지 않아도 된다.

학습 안정성 한 줄

로짓이 폭주하면, 즉 z|z|가 매우 커지면 eze^z의 오버플로/언더플로로 softmax가 불안정해질 수 있다. 이때는 log-sum-exp trick으로 안정화한다(최댓값 빼기). 필요하면 gradient clipping으로 폭주를 억제한다. 구체적 수치안정 기법은 04장 §4.1에서 다룬다.


softmax+CE의 로짓 gradient는 qyq-y(예측−정답)이고, sigmoid+BCE도 p^y\hat p - y로 같은 꼴이다. 둘 다 약분 덕에 깔끔하고, 그래서 MSE의 포화(405× 격차)를 피한다. 다음 04장은 이 깔끔한 식을 코드로 옮길 때의 현실을 다룬다 — log-sum-exp로 NaN을 막고, label smoothing으로 과확신을 누르며, 흔한 함정을 피하는 법이다.

출처

표준 결과(softmax+CE의 qyq-y, sigmoid+BCE의 p^y\hat p-y, MSE 포화)는 모두 공개 표준 교재·강의·문서와 일치하며, §3.4 표와 §3.5의 숫자는 직접 검산했다.