NCE는 Noise Contrastive Estimation의 약자로, 머신러닝 및 자연어 처리(NLP)에서 자주 사용되는 확률 밀도 추정 기법을 말합니다.
NCE는 특히 복잡한 확률 분포를 추정하는 과정을 간단히 하고 계산량을 줄이는데 초점을 맞추고 있는데요.
이번편에서는 NCE의 개념과 작동 방식, 그리고 예시를 통해서 보다 심층적으로 이해해보도록 하겠습니다.
1. NCE란?
- NCE란, 데이터를 기반으로 한 실제 분포와 노이즈 분포를 구별하도록 학습하는 방법을 말합니다.
- 일반적인 확률 모델은 확률 분포 p(x)를 직접적으로 추정하려고 하지만, NCE는 이 분포를 추정하는 대신 실제 분포와 노이즈 분포를 분류하는 이진 분류 문제로 전환하여 계산 및 성능적으로 효율성을 보이는데요
- NCE의 핵심 아이디어는 데이터를 분류 문제로 변환하여 확률을 학습한다는 점입니다.
* 이를 수학적으로 표현해봄변 아래와 같습니다.
* 예를들어 자연어 처리에서 NWP(Next Word Prediction)을 한다고 했을때는 다음에 올 단어의 종류가 학습 데이터에 포함된 단어의 사이즈가 커질수록 엄청나게 늘어나게 됩니다. 만약 10,000 개의 단어가 예측해야될 범위에 있다면 최종 soft max 값이 1을 가지고 10,000개의 단어 클래스 분포가 그 확률을 나누어가질 것일 것입니다. 매우 명확한 상황에 대해서는 특정단어의 확률이 1에 가깝게 나오고 나머지는 0에 가깝게 나오겠지만, 애매한 상황이라면 1이라는 확률을 10,000개의 값으로 나눈 확률에 근접한 값이 각 클래스별로 분포될 것이고 이는 0에 가까운 값이기에 특정 클래스를 선택하기 위한 Threshold를 정하기 어려울 것입니다.
이때, 실제 분포 vs 노이즈 분포 인지를 구분하는 binary classifciation으로 전환을 한다면 계산량 및 확률에 따른 클래스를 지정하는 Threshold에 대한 강건성(Robustness)도 높아질 것입니다.
- 이와 같은 NCE의 장점은 아래와 같이 3개로 요약해볼 수 있습니다.
1) 계산 효율성 : 복잡한 정규화를 요구하는 softmax나 MLE보다 빠르고 효율적인 계산이되며, 특히 대규모 데이터셋에서 이 효율성이 극대화 됩니다.
2) 샘플링 기반 학습 : 직접 분포를 전부 계산하지 않고, 샘플간 상대적인 차이를 학습하기때문에 메모리 소모가 적습니다.
3) 적용가능성 : NLP 모델들, 음악 추천 시스템 등 여러분야에서 효과적으로 적용되고 있습니다.
- NCE의 작동원리를 실제 예시를 기반으로 설명해보겠습니다.
* Word2Vec을 예시로 들어보면, (Word2Vec은 단어 임베딩을 생성하는 알고리즘)
Word2Vec의 기본 아이디어는, 주어진 단어를 기준으로 주변 단어의 분포를 예측하는 것으로, 일반적으로 softmax를 사용하기도 하지만 NCE를 사용하면 더 빠르게 학습이 가능합니다.
예시를 들어보면,
1) Positive Samples : 실제 단어 쌍 (ex. King - Queen)
2) Negative Samples : 무작위로 생성된 단어 쌍 (ex. King - Table)
3) 모델은 실제 쌍과 노이즈 쌍을 구분하도록 학습
이라고 볼 수 있습니다.
- 이러한 NCE 방법의 한계 및 개선 방법에 대해서 알아보겠습니다.
먼저 한계점으로는
1) 노이즈 분포의 품질 문제가 있습니다. 적절한 노이즈 분포를 선택하지 않으면 원본 분포와 말도 안되는 분포가 나오게 되어 학습이 잘 이루어지지 않을 수 있습니다. (너무 쉬운 분류문제가 되어버림)
2) 대규모 데이터의 한계가 있습니다. 데이터 크기가 지나치게 커지면 노이즈 샘플의 선택에 따라 모델 성능에 큰 영향을 미칠 수 있기 때문에 강건한 모델이 나오지 못하게 됩니다.
이러한 한계점을 극복하기 위해 Contrastive Learning과의 결합을 통해 그 장점은 살리고 단점은 최소화해가고 있습니다.
2. Python 코드를 통해 알아보는 NCE 예시
이번에는 Pytorch를 활용해 간단한 NCE를 구현한 코드를 알아보겠습니다.
실제 데이터와 이에 노이즈가 더해진 데이터를 구분하기 위해 NCE를 활용하겠습니다.
먼저 초기에는 원본 데이터(True Data)와 Noise (Data)가 비슷해보입니다.
그래서 정의된 NCE 모델 (3개의 Linear Layer w/ ReLU activation fuction)을 활용하니 아래와 같이 학습이 잘되었음을 볼 수 있습니다. 서로 구분을 잘 해간다는 의미이구요.
최종적으로 학습된 모델을 학습전 데이터에 적용해서 분포의 차이를 확인해보면 아래와 같습니다.
이처럼 처음에는 비슷해 보이는 두 분포를, NCE Loss를 활용해 복잡한 비선형 모델을 통해 서로 다름을 구분해낼 수 있었습니다.
'딥러닝 with Python' 카테고리의 다른 글
[딥러닝 with Python] GraphSAGE를 활용한 논문 분류(Node Classification) (1) | 2024.12.09 |
---|---|
[딥러닝 with Python] LangGraph란? (0) | 2024.12.07 |
[딥러닝 with Python] LSTM을 활용한 회귀 분석 (0) | 2024.12.03 |
[딥러닝 with Python] Anomaly Detection(이상탐지) : Deep SVDD (0) | 2024.11.28 |
[딥러닝 with Python] Anomaly Detection(이상탐지) : SVDD(Support Vector Data Description) (0) | 2024.11.27 |
댓글