Skip to main content

노이즈 대비 추정 손실이란 무엇일까? 코드와 함께 배우는 튜토리얼

Self-Supervised Learning에서 자주 사용되는 손실 함수인 Noise Contrastive Estimation Loss를 다루는 튜토리얼 이 글은 AI 번역본입니다. 오역이 의심되면 댓글로 알려주세요.
Created on September 15|Last edited on September 15

소개

노이즈 대비 추정은 분야에서 자주 등장합니다 자기 지도 학습주로 InfoNCE, InfoNCE++, NT-Xent와 같은 현대적 변형 형태로 가장 흔히 사용됩니다. 이 글에서는 그 동기, 유도 과정, 그리고 다양한 프레임워크를 활용한 구현 방법을 살펴보겠습니다.

목차





노이즈 대비 추정 손실

자기 지도 학습에 대해 알고 있지만, 일단 그 프레임워크는 떼어 놓고 생각해 봅시다. 저는 다음과 같은 접근을 더 선호합니다 Oriol Vinyals는 NeurIPS 2020 초청 강연에서 이를 설명합니다주어진 데이터와 작업 명세(어떤 방식으로든 목표 정보를 제공해야 합니다)를 바탕으로, 입력 데이터의 일부를 활용해 데이터 분포를 모델링합니다.
그런데 왜 이런 방식으로 접근할까요? 본질적으로는 학습해야 할 파라미터 수를 줄이려는 것입니다. 지도 학습에서는 목표값과 함께 전체 입력 분포를 모델링하려고 하며, 이는 결국 분포를 여러 집단으로 나누는 분할 함수(클래스로 생각할 수 있음)를 학습하는 문제로 귀결됩니다.
노이즈 대비 추정(NCE)은 입력 분포를 추정하는 것을 목표로 하지만 없이 전체 분할 함수를 학습하는 방식입니다. 이 접근법은 언어 모델링에서 매우 효과적인 것으로 입증되었습니다. 다음 단어를 추정하는 문제는 NCE를 사용해, 다음 목표 단어와 일부 노이즈 분포에서 뽑은 샘플들을 구분하는 시그모이드 이진 분류기를 학습하는 것으로 접근할 수 있습니다. 우리의 목표는 로짓을 학습해 정답 단어의 확률은 1에 가깝게, 오답 단어의 확률은 0에 가깝게 만들도록 하는 것입니다.
간단한 확률 모델링! 이제 이를 바탕으로 확장해 봅시다.

InfoNCE

간단한 NCE의 재정식화를 통해, 시그모이드 이진 분류기를 학습하는 대신 소프트맥스 비선형성을 추가하여 확률을 다음 범위로 매핑할 수 있습니다 [0,1]\large [0, 1]이 간단한 재정식화는 두 데이터 포인트 간 상호정보량을 추정할 수 있게 해 주며, Self-Supervised Learning에서 대부분의 다른 손실 함수들의 골격 역할을 합니다.
원본 데이터의 표현을 가지고 있다고 가정하면 vi\large v_i (어떤 인코더의 출력일 수도 있는) 표현을 가지고 있다고 할 때, 우리는 InfoNCE 손실을 정의할 수 있습니다 위한 대조학습 다음과 같습니다:
InfoNCEθ=1Bi=1Blogf(vi,vi)1Bjexpf(vi,vj)\huge \text{InfoNCE}_{\theta} = \frac{1}{B} \displaystyle \sum_{i=1}^{B} \log \frac{f (v_i, v_i')}{\frac{1}{B} \sum_j \exp f(v_i, v_j')}

…여기서 f\large f 표현들 사이의 유사도를 추정하는 어떤 함수입니다. 여기서, vi\large v_i' 와 관련된 표현들을 나타냅니다 vi\large v_i.
위와 같은 형식을 유지하면서 손실 함수의 핵심 아이디어를 간단히 정리해 보겠습니다. 아이디어는 소프트맥스 분류기를 학습하는 것입니다(확률을 다음 범위로 표현할 수 있도록 해 줍니다). [0,1]\large [0, 1]) 대상 표현들 사이의 vi\large v_i' 그리고 어떤 노이즈 분포에서 뽑은 몇 개의 샘플들.
더 간단하면서도 수학적·확률론적인 정의는 다음에서 설명된 것입니다 대조 예측 부호화를 통한 표현 학습:
LN=EX[logfk(xt+k,ct)xjXfK(xj,ct)]\huge \mathcal{L}_N = - \mathbb{E}_X [ \log \frac{f_k(x_{t+k}, c_t)}{\sum_{x_j \in X} f_K(x_j, c_t)}]

어디에서 X={x1...xN}X = \{ x_1 ... x_N\} 은(는) 다음으로 이루어진 집합이다 N N 무작위 샘플 중에서 “하나의 양성 샘플을 포함하여” p(xt+Kct)p(x_{t+K} | c_t) 그리고 N1N-1 “제안” 분포에서 뽑은 음성 샘플들 p(xt+k)p(x_{t+k})
일반적인 InfoNCE 정의는 전체 소프트맥스 함수를 추정하는 로짓을 산출하며, 서로 상관된 다양한 뷰들 사이의 상호정보량에 대한 하한을 최대화하는 표현을 제공한다.
대부분의 방법에서는 음성 샘플을 명시적으로 따로 뽑지 않고, 배치에 있는 나머지 모든 샘플을 음성 샘플로 간주한다. 이는 다음과 같은 경우와 유사하다. DINO.

코드

PyTorch에서 InfoNCE 손실 함수를 매우 기초적인 추상 형태로 구현한 예시를 살펴보자. [출처]
import torch

def infoNCE(query, positive_key, temperature=0.1, reduction='mean') -> torch.Tensor:
# Negative keys are implicitly off-diagonal positive keys.
# Cosine between all combinations
logits = query @ positive_key.transpose(-2, -1)

# Positive keys are the entries on the diagonal
labels = torch.arange(len(query), device=query.device)

return F.cross_entropy(logits / temperature, labels, reduction=reduction)

자료

요약

이것으로 Noise Contrastive Estimation 손실에 대한 간단한 튜토리얼을 마칩니다. Self-Supervised Learning과 관련된 더 많은 글을 원하시거나, 수학적 내용과 “처음부터 구현” 코드를 다루는 추가 보고서를 원하시면 아래 댓글이나 저희의 채널에서 알려주세요. 포럼 ✨!
다음 보고서들도 확인해 보세요 완전 연결 다음과 같은 Self-Supervised Learning 주제를 다룹니다: DINO 프레임워크.


이 글은 AI로 번역되었습니다. 오역이 있을 수 있으니 댓글로 알려주세요. 원문 보고서는 다음 링크에서 확인하실 수 있습니다: 원문 보고서 보기