인공지능/공부

딥러닝 응용 - 3주차

이게될까 2025. 9. 15. 13:46
728x90
728x90

Multilabel Classification

각각이 하나의 label을 할당받은게 아닌 여러 개의 label에 걸쳐있는 경우 

 

 

더보기

좋아요. 핵심만 딱 잡아 정리해볼게요.
단일 출력(sigmoid·binary)에서 멀티 출력으로 갈 때 “파라미터 업데이트”는 사실 형태만 바뀔 뿐, 공통 패턴은 δ = y − r(예측–정답)입니다. 차이는 출력층의 활성화/손실 조합과 그에 따른 δ의 상호작용(클래스 간 결합 유무)에 있습니다.

1) 문제 유형별 핵심 공식

A. 다중 클래스(단일 라벨, K개 클래스)

  • 출력: s=Wz+b \mathbf{s} = W\mathbf{z}+ \mathbf{b}, y=softmax(s)\mathbf{y}=\mathrm{softmax}(\mathbf{s})
  • 손실: L=−∑i=1Krilog⁡yi\mathcal{L} = -\sum_{i=1}^K r_i \log y_i (one-hot r\mathbf{r})
  • 그라디언트:
    • 로짓: ∂L∂s=y−r≡δout\frac{\partial \mathcal{L}}{\partial \mathbf{s}} = \mathbf{y}-\mathbf{r} \equiv \boldsymbol{\delta}_\text{out}
    • 가중치: ∂L∂W=δout  z⊤\frac{\partial \mathcal{L}}{\partial W} = \boldsymbol{\delta}_\text{out}\; \mathbf{z}^\top
    • 편향: ∂L∂b=δout\frac{\partial \mathcal{L}}{\partial \mathbf{b}} = \boldsymbol{\delta}_\text{out}
  • 업데이트(학습률 η\eta):
    W←W−η δout z⊤,b←b−η δoutW \leftarrow W - \eta\, \boldsymbol{\delta}_\text{out}\, \mathbf{z}^\top,\quad \mathbf{b} \leftarrow \mathbf{b} - \eta\, \boldsymbol{\delta}_\text{out}
  • 특징: softmax로 클래스 간이 결합 → 정답 클래스의 가중치는 올라가고( ri−yi>0r_i-y_i>0 ), 나머지는 내려갑니다.

B. 멀티 라벨(독립된 K개의 이진 라벨)

  • 출력: 각 라벨 kk에 대해 yk=σ(sk),  sk=wk⊤z+bky_k=\sigma(s_k),\; s_k=\mathbf{w}_k^\top\mathbf{z}+b_k
  • 손실: L=∑k=1KBCE(yk,rk)\mathcal{L}=\sum_{k=1}^K \mathrm{BCE}(y_k, r_k)
  • 그라디언트:
    • 로짓: ∂L∂sk=yk−rk\frac{\partial \mathcal{L}}{\partial s_k} = y_k - r_k (각 라벨 독립)
    • 행렬형으로 쓰면 위 다중 클래스와 동일하게 ∂L/∂W=(y−r)z⊤\partial \mathcal{L}/\partial W = (\mathbf{y}-\mathbf{r})\mathbf{z}^\top
  • 특징: 클래스 간 결합 없음 → 어떤 라벨은 올리고(양의 오차), 어떤 라벨은 동시에 내릴 수 있습니다.

C. 다중 출력 회귀(참고)

  • L=12∥y−r∥22⇒∂L∂s=y−r\mathcal{L}=\tfrac12\|\mathbf{y}-\mathbf{r}\|_2^2 \Rightarrow \frac{\partial \mathcal{L}}{\partial \mathbf{s}}=\mathbf{y}-\mathbf{r}, 업데이트 형태는 동일.

2) 은닉층까지의 역전파(공통)

  • 은닉층 로짓/출력: a(ℓ)=W(ℓ)z(ℓ−1)+b(ℓ),  z(ℓ)=ϕ(a(ℓ))\mathbf{a}^{(\ell)}=W^{(\ell)}\mathbf{z}^{(\ell-1)}+\mathbf{b}^{(\ell)},\; \mathbf{z}^{(\ell)}=\phi(\mathbf{a}^{(\ell)})
  • 출력층 델타:
    • softmax+CE, sigmoid+BCE, MSE 모두 δ(L)=y−r\boldsymbol{\delta}^{(L)} = \mathbf{y}-\mathbf{r} (손실-활성화의 표준 조합일 때)
  • 은닉층 델타:
    δ(ℓ)=(W(ℓ+1)⊤δ(ℓ+1))  ⊙  ϕ′(a(ℓ))\boldsymbol{\delta}^{(\ell)} = \big(W^{(\ell+1)\top}\boldsymbol{\delta}^{(\ell+1)}\big)\;\odot\;\phi'(\mathbf{a}^{(\ell)})
  • 가중치/편향 기울기:
    ∂L∂W(ℓ)=δ(ℓ)(z(ℓ−1))⊤,∂L∂b(ℓ)=δ(ℓ)\frac{\partial \mathcal{L}}{\partial W^{(\ell)}}=\boldsymbol{\delta}^{(\ell)}(\mathbf{z}^{(\ell-1)})^\top,\quad \frac{\partial \mathcal{L}}{\partial \mathbf{b}^{(\ell)}}=\boldsymbol{\delta}^{(\ell)}
  • 업데이트: W(ℓ)←W(ℓ)−η δ(ℓ)(z(ℓ−1))⊤W^{(\ell)} \leftarrow W^{(\ell)} - \eta\,\boldsymbol{\delta}^{(\ell)}(\mathbf{z}^{(\ell-1)})^\top

요약: 출력층에서 δ = y − r 를 만들고, (Wᵀ·δ)⊙φ'(·) 로 뒤로 보내며, 각 층은 δ·입력ᵀ의 외적 형태로 업데이트합니다.

3) 직관적 예시 (3-클래스 softmax)

예측 y=[0.6,0.3,0.1]\mathbf{y}=[0.6, 0.3, 0.1], 정답 r=[1,0,0]\mathbf{r}=[1,0,0]
δ=y−r=[−0.4,0.3,0.1]\boldsymbol{\delta}=\mathbf{y}-\mathbf{r}=[-0.4, 0.3, 0.1].
정답 클래스(1번)의 행은 +0.4+0.4만큼 증가 방향(오차의 부호 반대로 업데이트), 나머지 클래스 행은 감소 방향으로 이동합니다.
멀티라벨에서는 각 좌표가 독립이므로, 예컨대 r=[1,1,0]\mathbf{r}=[1,1,0]이면 δ=[−0.4,−0.7,0.1]\boldsymbol{\delta}=[-0.4,-0.7,0.1]이 되어 두 라벨을 동시에 “끌어올리는” 업데이트가 발생합니다.

4) 실전 팁 (PyTorch 기준)

  • 다중 클래스: CrossEntropyLoss는 로짓(softmax 미적용)과 정답 인덱스(one-hot 아님)를 받습니다.
  • 멀티 라벨: BCEWithLogitsLoss를 쓰고, 타깃은 멀티-핫 벡터.
  • 수치 안정성: 로짓에 바로 손실을 적용(CrossEntropy/BCEWithLogits) → 내부에서 안정적 softmax/sigmoid 처리.
  • 라벨 스무딩/가중치: 클래스 불균형·과적합 완화에 유용.
  • 형상 체크: 배치 BB, 은닉 HH, 클래스 KK: 로짓 (B,K)(B,K), 가중치 W∈RK×HW\in\mathbb{R}^{K\times H}, 은닉 (B,H)(B,H). 기울기는 항상 (출력 차원)×(입력 차원).

5) 슬라이드와의 연결고리

  • Softmax 출력의 가중치 업데이트: wo,ij←wo,ij+η (ri−yi) zjw_{o,ij} \leftarrow w_{o,ij} + \eta\,(r_i - y_i)\,z_j
  • 은닉층 업데이트(softmax 다중 출력): wz,ij←wz,ij+η∑k(rk−yk) wo,ki zi(1−zi) xjw_{z,ij} \leftarrow w_{z,ij} + \eta \sum_k (r_k-y_k)\,w_{o,ki}\, z_i(1-z_i)\,x_j
  • 멀티라벨(여러 sigmoid)의 출력/은닉 업데이트도 같은 패턴으로 전개됩니다.

원하는 경우, 위 공식을 바로 쓰는 **간단한 PyTorch 예시(다중 클래스/멀티라벨 각각)**도 제공할게요.

 

짧게 답하면: **대부분의 ML에서 Cross-Entropy의 log는 자연로그(밑 ee)**입니다.

왜 자연로그를 쓰나

  • 목적함수는 음의 로그우도(NLL):   L=−E[log⁡pθ(y∣x)]\;L=-\mathbb{E}[\log p_\theta(y|x)]. 보통 log⁡=ln⁡\log=\ln을 씁니다.
  • ln⁡\ln을 쓰면 소프트맥스 교차엔트로피의 미분이 깔끔해집니다:
    ∂L∂zi=pi−yi\frac{\partial L}{\partial z_i}=p_i - y_i (여기서 zz=logits, p=softmax(z)p=\text{softmax}(z)).
  • 구현도 모두 ln⁡\ln 기준: (예) log_softmax, CrossEntropyLoss, BCEWithLogitsLoss 등은 내부적으로 자연로그를 사용.

밑이 달라지면 무엇이 달라지나

  • 밑을 bb로 바꾸면 log⁡bx=ln⁡xln⁡b\log_b x = \frac{\ln x}{\ln b}.
    손실 값만 상수 배로 스케일됩니다(그래디언트도 1/ln⁡b1/\ln b 배).
    최적해(모델 파라미터)는 동일하며, 실질적 변화는 학습률 재스케일 수준.
  • 단위만 달라집니다.
    • ee: nats
    • 밑 2: bits (정보이론, BPC/BPB 지표에서 자주 사용)
    • 밑 10: bans/hartleys(드묾)

실무 변환

  • bits로 보고 싶으면: lossbits=lossnats/ln⁡2\text{loss}_{\text{bits}} = \text{loss}_{\text{nats}} / \ln 2
    (1 nat ≈ 1.4427 bits)
  • 퍼플렉서티: nats 기준이면 ppl=exp⁡(loss)\text{ppl}=\exp(\text{loss}); bits 기준이면 ppl=2loss\text{ppl}=2^{\text{loss}}.

핵심 정리

  • Cross-Entropy의 log는 기본적으로 ln⁡\ln.
  • 밑을 바꾸면 값은 스케일만 달라지고 **학습의 본질(최적점)**은 변하지 않습니다.
  • 논문/코드에선 혼동 방지 위해 밑을 명시하거나 nats/bits 단위를 함께 표기하세요.

 

728x90