본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Aaron van den Oord, Yazhe Li, Oriol Vinyals
[Google DeepMind]
[Submitted on 10 Jul 2018 (v1), last revised 22 Jan 2019 (this version, v2)]
arXiv:1807.03748

 

 

요즘 self-supervised learning에서 가장 많이 쓰이는 loss인 InfoNCE loss에 대해 의문점이 생겨 읽어본 논문이다.

(간만에 포스팅할 수 있는 논문을 읽을 수 있는 시간이 생겨 좋았다..ㅎ)


신경과학적으로 인간의 뇌는 다양한 추상적인 레벨의 관점에서 관찰한다고 한다. 최근 이것을 모티브로 삼아 predictive coding을 많이 사용하게 된다. 여기서 predictive coding은 말 그대로 미래나 contextual 정보를 예측하는 unsupervised learning 기법이다. 말로 풀어쓰니 복잡하긴 한데 그냥 쉽게 NLP에서 다음 단어를 예측하는 것 그리고 vision 쪽에서는 회색 이미지를 보고 색상을 예측하는 문제를 생각하면 된다.

 

저자들 역시 predictive coding 기법을 사용하고자 한다. 주요 intuition은 고차원의 시그널 속 다른 부분들 사이에 있는 shared information을 인코딩한 represenation을 학습하는 것이다. 이는 논문의 말을 그대로 인용한 것이라 제대로 이해하기 힘들 수 있다.

 

다시 쉽게 설명하자면 NLP에서 "나는 멋진 사람입니다." 라는 문장이 주어지면 '나는', '멋진', '사람입니다.' 라는 단어들 사이에 존재하는 공유된 정보를 캐치해내는 학습 방법을 사용한다는 것이다. 이미지를 예시로 들면 이미지를 다른 패치로 나눴을 때 색상의 미묘한 변화나 오브젝트의 파트가 서로 패치들간 걸쳐서 나타나있는 것을 볼 수 있다. 이 때 이 정보가 이미지에서의 shared information이라는 것이다.


Structure

일단 전체적인 Contrastive Predictive Coding의 구조를 그림으로 살펴보자. 아래 그림은 audio를 input으로 했을 때의 예시이다.

image

 

 

학습 방법은 다음과 같다.

  1. 주어진 sequence input을 잘라서 non-linear encoder에 넣는다.
  2. 그러면 각 input들에 대해 \(z\)라는 latent represenation이 나오게 된다. (이 때 \(t\)는 현재 넣고 있는 input의 타임 스텝을 의미한다)
  3. 그 다음 현재 타임 스텝 \(t\)에 대해 autoregressive model을 통해 \(c_t\)라는 context latent representation을 뽑아내야 한다. 근데 이 때 \(c_t\)를 생성하기 위해 autoregressive model에 들어가는 input은 단순히 \(z_t\) 하나가 아닌 \(t\) 타임 스텝 이전의 모든 \(z\)들인 \(z_{\le t}\)를 input으로 한다.
  4. 이렇게 만들어낸 \(c_t\)로 \(t\) 타임 스텝 이후의 \(z\)들을 예측하게 된다.

 

 

아마 자연어 처리를 하는 사람들이라면 이 구조를 빠르게 이해할 수 있을 것이라 생각한다..ㅎ

쨌든 저렇게 시간으로 놓고 보면 \(x_{t+4}\)같은 경우에는 \(c_t\)랑 멀리 있어서 아무런 공유 정보가 없을 것 같은데..? 라고 생각할 순 있다. 물론 극단적으로 멀어지게 되면 예측이 불가능할 것으로 예상한다. 그러나 어느정도 가까이 있는 시간대에는 공유된 정보가 존재하는데 이와 같이 많은 시간 스텝동안 퍼져있는 정보들을 slow feature라고 부른다.

 

Q. 왜 이런 구조를 사용하게 되었을까??

(vision 쪽으로..) 생각을 해보면 input image \(x\)는 label \(y\)와 굉장히 큰 차원의 차이가 존재하는 것을 알 수 있다. 예를 들어, 이미지의 차원은 3✕224✕224인 반면 레이블의 경우 10개의 클래스를 one-hot vector로 나타낸다하면 10차원 밖에 되지 않는다. 그래서 저자들은 이 둘을 바로 모델링하는 것이 부적절하다고 판단한다.

또한 self-supervised learning에서는 label이 없으니 representation들을 서로 비교하게 되는데 그래도 이들은 어느 정도 차원이 높다 (128-dim 과 같이..?). 근데 이런 높은 차원을 mean-squared error나 cross-entropy loss와 같은 unimodal (그래프로 표현했을 때 딱 봉우리가 하나인 경우라고 생각하면 됨) loss로 예측하게 되는 것은 굉장히 어려운 일이라고 한다. 그래서 InfoNCE loss를 사용하게 된다.


Mutual Inforamtion

Loss 부분은 수학 이야기가 가득하다. 일단 대충 정리해본다.. ^^

target x (future)와 context c (present)가 존재할 때 이 둘 사이의 mutual information은 아래와 같이 나타낸다.

image

 

이 식은 정보이론쪽에서 많이 사용되는 식인데 좀 더 상세히 표현하면 아래와 같은 식에서 뽑아낼 수 있다.

\(I(x;c) = \sum_{x,c} p(x,c)log\frac{p(x,c)}{p(x)p(c)} = \sum_{x,c} p(x,c)log\frac{p(x|c)p(c)}{p(x)p(c)}\)

위 식에서 기억해야 할 부분은 mutual information이 density ratio (\(\frac{p(x|c)}{p(x)}\))에 비례한다는 것이다.

Contrastive Predictive Coding

위에서 살짝 언급했듯이 저자들은 generative model인 \(p_k(x_{t+k}|c_t)\)에서 미래의 관찰값인 \(x_{t+k}\)를 직접적으로 생성하는 것이 아닌 \(x_{t+k}\)와 \(c_t\) 사이에 존재하는 mutual information을 담고있는 density ratio f를 모델링한다.

image

 

f는 다양한 식으로 사용이 될 수 있는데 저자들은 log-bilinear model을 사용한다.

image

 

위에서 \(W_kc_t\) 는 \(\hat{z}_{t+k}\) 즉, prediction 값을 의미한다.
이제 representation \(z\)를 사용하여 high-dimensional data인 \(x\)를 표현하므로 확실히 모델이 가질 부담을 줄일 수 있다.

 

Q. 이제 우리는 학습 후에 존재하는 representation이 2개인 것을 안다. 바로 \(z_t\)와 \(c_t\)이다. 이 때 downstream task에서는 어떤 representation을 사용할까?

  • \(c_t\)의 경우 t time step 이전의 \(z_t\)를 모두 담고있는 representation으로써 과거로부터의 추가적인 context 정보가 필요한 경우에 사용이 된다 (e.g. speech recognition).

  • \(z_t\)의 경우는 반대이다. 과거의 정보가 전혀 필요없는 경우 즉, 하나의 representation이 전제 sequence를 위해 필요한 경우에 사용이 된다 (e.g. image classification).

InfoNCE

이제 encoder와 autoregressive model이 joint하게 학습되기 위해 사용하는 loss를 살펴보자. 이 loss는 InfoNCE loss라고 부른다.

전체 데이터 셋은 \(X = \{x_1, x_2, ... , x_N\}\) 즉, N개의 랜덤 샘플들을 가진다. 이 데이터 셋은 \(p(x_{t+k}|c_t)\)에서 샘플링 된 하나의 positive sample과 'proposal' distribution \(p(x_{t+k})\)에서 뽑아낸 N-1개의 샘플들로 이루어져있다.

image

 

최종적으로 위의 loss를 줄이도록 학습이 되어야 하며 log 안의 부분을 모델의 예측값으로 보면 이 loss function은 categorical cross-entropy 모양인 것을 확인할 수 있다.

논문에 있는 식 (5)를 확인하면 이 loss를 optimizing 하면 결국 식 (2) 속의 density ratio \(f_k(x_{t+k}, c_t)\)를 추정하는 문제가 된다고 한다.

쉽게 이해하자면 (4)의 loss를 최소화 시키기 위해서는 log안의 식이 최대화가 되어야하며 이를 최대화 시키기 위해서는 \(f_k(x_{t+k}, c_t)\)를 키우면 된다. 근데 이 때 \(f_k(x_{t+k}, c_t)\)는 mutual information의 개념이라고 했으니 즉, \(x_{t+k}\)와 \(c_t\) 사이의 mutual information을 최대화 시키도록 학습이 진행된다는 것이다.

 

자 이제 이 논문을 읽은 이유 중 하나인 negative sample들의 개수와 관련된 부분이다. 자세한 내용은 Appendix에 있으며 식만 가져왔다.

image

 

 

위 식을 다시 정리하면 아래의 식을 얻을 수 있다.

image

 

Negative sample의 수가 올라갈 수록 log(N)은 커지면서 이는 \(x_{t+k}\)와 \(c_t\) 사이의 mutual information의 lower boundary를 높이게 된다. 그래서 요즘 많이 사용되는 contrastive learning에서 negative sample들의 수를 늘리기 위해 batch 사이즈 등의 노력을 하는 것이다.


CPC (Vision task)

실험 부분은 vision만 정리했다. 앞서 언급하였듯이 이전 타임 스텝의 추가적인 정보가 필요없는 image classification의 경우 encoder에서 뽑아낸 CPC representation인 \(z_t\)를 downstream task에 사용하게 된다.

학습 과정은 아래와 같다.

  1. 256✕256 사이즈의 이미지를 64✕64 사이즈의 패치로 자른다. 이 때 각 패치들은 32 pixels 만큼 겹치게 되며 최종 결과물은 7✕7 개의 이미지 패치가 만들어진다.
  • 이 때 원본 이미지와 패치들은 모두 각각의 data augmentation이 적용이 된다 (자세한 내용은 논문 7쪽에 있음).
  1. 각각의 패치들은 ResNet-v2-101 encoder에 의해 인코딩 되며 3번째 residual block에서 뽑아낸 output들을 pooling 시켜 1024-dim vector로 변환한다. 이렇게 되면 총 결과물은 7✕7✕1024 tensor가 된다.
  2. 이제 PixelCNN-style autoregressive model을 사용하여 \(c_t\)를 출력하게 되며 이 \(c_t\) 값으로 같은 column에 존재하는 다음 스텝 타임들의 \(z_{t+k}\)들을 예측한다. (둘이 비슷하게 되도록 학습하라는 뜻)

논문 3.2에 보면 좀 더 상세한 과정이 나와있고 대략적인 정보들만 추려 영상으로 정리하였다.

 

 

 

실험 결과는 ImageNet 데이터 셋에 대해 top-1,5를 뽑아냈다. 다른 네트워크 구조나 같은 네트워크 구조를 사용했을 때 CPC는 당시 SOTA 성능을 달성하였다.


Summary

저자들은 제안 기법을 다음과 같이 3가지로 요약한다.

  1. 고차원의 데이터를 훨씬 더 간결한 latent embedding space로 압축시켜서 사용한다.
  2. 이 latent space에서 강력한 autoregressive model들을 사용하여 많은 타임스텝 이후의 미래에 대해 예측한다.
  3. InfoNCE loss를 사용하여 end-to-end 학습을 진행한다.

다 읽고...

정말 InfoNCE 부분만 궁금해서 읽어본 논문이다. 정확히 어떠한 메커니즘으로 돌아가는지 궁금했고 negative sample의 수가 많을수록 mutual information의 lower bound가 높아진다는 것을 식으로 증명된 부분을 보니 더 잘 이해할 수 있게 되었다. 다음에 시간이 생기면 이를 좀 더 발전시킨 Data-Efficient Image Recognition with Contrastive Predictive Coding 논문을 읽어볼 예정이다 :)