세상의 변화에 대해 관심이 많은 이들의 Tech Blog search

BST(Behavior Sequence Transformer for E-commerce Recommendation in Alibaba) 설명

|

이번 글에서는 Alibaba에서 발표한 추천시스템 알고리즘인 BST에 대해 다뤄보도록 하겠습니다. 논문 원본은 이 곳에서 확인할 수 있습니다. 본 글에서는 핵심적인 부분에 대해서만 살펴보겠습니다.


Behavior Sequence Transformer for E-commerce Recommendation in Alibaba 설명

1. Background

Alibaba는 Taobao라고 하는 거대한 쇼핑몰을 갖고 있는데, 본 논문은 이 Taobao에서 발생한 로그의 일부를 효과적으로 활용하여 고객들에게 더 나은 구매경험을 제공하기 위한 방법에 대해 설명하고 있습니다.

예를 들어 어떤 고객이 순서를 갖고 여러 아이템을 클릭했다고 하면 분명 노이즈는 존재하긴 하겠습니다만 이러한 고객의 행동 시퀀스에는 구매행동에 관한 시그널이 존재할 가능성이 높습니다.

Wide & Deep이나 Deep Interest Network에서도 이러한 문제를 풀기 위해 방법을 제시하였지만 여러 한계점이 존재합니다.

본 논문에서는 BST라고 하는 알고리즘을 제시하고 있고, 이 방법론은 기존의 한계를 극복하기 위해 고객의 행동 시퀀스 속에 있는 시그널을 효과적으로 포착/통합하기 위해 설계되었습니다.


2. Architecture

Bert4Rec이나 Transformers4Rec에 비해 복잡한 편은 아니지만, 구조를 잘 들여다보면 생각해볼 부분이 꽤 있습니다. 고객의 행동 시퀀스를 $S(u) = { v_1, v_2, …, v_n }$ 이라고 표기해보겠습니다. 이 때 고객 $u$ 는 총 $n$ 개의 아이템에 대해 클릭을 행했다고 가정하는 것입니다.

고객의 특성, 고객이 만든 feedback(click) sequence, 타겟 아이템의 특성 등을 모델링에서 활용할 수 있을 것입니다. 이러한 특성을 활용하는 데에는 여러가지 방법을 취할 수 있습니다. 이제 상세히 설명하겠지만 BST에서는 각 아이템 사이에서 일어나는 상호작용을 Transformer Layer를 통해 포착하고, 이 결과물을 user feature과 함께 연결하여 최종적으로 downstream task를 푸는 방식으로 추천/예측 알고리즘을 전개해나가고 있습니다.

2.1. Embedding Layer

Embedding Layer는 2개로 구분되어 있습니다.

1번째: other features의 embedding layer
2번째: sequence item features의 embedding layer

이 때 sequence item featuers는 고객이 반응한 아이템의 시퀀스를 의미하고, 논문에서는 오직 아이템의 ID와 카테고리만을 사용하고 있습니다. 만약 본인이 해결해야 할 문제에서 아이템의 정보가 부족하고 오직 ID 정도만을 사용할 수 있더라도 이와 같이 접근할 수 있다고 생각하면 될 것 같습니다.

other features로는 user profile features, target item features, context features 등이 있고 쉽게 말해서 위 sequence item features를 제외한 모든 것이라고 보면 됩니다.

항목 표기 Shape
sequence item feature embedding matrix $\mathbf{W}_v$ $(\vert V \vert, d_v)$
other feature embedding matrix $\mathbf{W}_o$ $(\vert D \vert, d_o)$

이 때 $\vert V \vert$ 는 아이템의 수를, $d_o, d_v$는 각각 세팅한 임베딩 dimension을 의미합니다.
$\vert D \vert$ 는 other features의 feature 수 입니다. 그런데 논문에 나온 것처럼 임베딩을 하기 위해서는 사실 모든 other features는 categorical variable이어야 합니다. 따라서 원-핫 인코딩 및 구간화를 통해 모든 변수를 categorical하게 변환하는 과정을 거치거나 아니면 이 대신 간단하게 projection layer를 사용할 수도 있을 것입니다. task의 성격이나 성능 등을 고려하여 설계를 해야될 것으로 보입니다.

sequence item features는 positional embedding 과정을 거치게 됩니다. BST에서는 vanilla transformer에 등장하였던 sin, cos 함수가 아닌 아래와 같은 식으로 시간 순서를 반영합니다.

[pos(v_i) = t(v_t) - t(v_i)]

논문에서는 위와 같이 추천 시간에서 해당 아이템이 클릭된 시간을 뺀 것으로 정의되는데, 이는 Alibaba의 연구 상에서는 이 방법이 더 뛰어났기 때문이라고 합니다. 이 부분은 본인의 task에 맞게 선택적으로 수용하면 될 것 같습니다.

2.2. Transformer Layer

Transformer Layer는 고객의 행동 시퀀스를 통해 여러 아이템 사이의 관계를 포착하는 역할을 수행합니다.

1번째: self-attention layer
2번째: point-wise feed-forward network

먼저 self-attention layerAttention is all you need를 비롯하여 수 많은 논문에서 등장하는 그 형태 그대로입니다.

[Attention(\mathbf{Q, K, V}) = softmax(\frac{\mathbf{QK}^T}{\sqrt{d}}\mathbf{V})]

이 연산은 아이템 임베딩을 input으로 취하고 이를 linear projection을 통해 3개의 행렬로 변환한 뒤 attention layer로 투입하는 역할을 수행합니다.

[\mathbf{S} = MH(\mathbf{E}) = concat(head_1, head_2, …, head_h) \mathbf{W}^H]

[head_i = Attention(\mathbf{EW}^Q, \mathbf{EW}^K, \mathbf{EW}^V)]

이 때 $\mathbf{W}$ 들은 모두 $(d, d)$ 의 shape을 취하고 있습니다.

point-wise feed-forward network는 이후에 비선형성을 강화하는 역할을 수행합니다.

[\grave{\mathbf{S}} = LayerNorm(\mathbf{S} + Dropout(MH(\mathbf{S})))]

[\mathbf{F} = LayerNorm(\grave{\mathbf{S}} + Dropout(LeakyReLU(\grave{\mathbf{S}} \mathbf{W^{1} + b^{1}})\mathbf{W}^{2} + b^2 ))]

여기까지가 이후에 나올 MLP layer 이전의 형태입니다.

2.3. MLP layers and Loss Function

이후 과정은 간단합니다. other features의 결과물과 transformer layer의 결과물을 모두 concat한 뒤 몇 개의 fully connected layer를 거치면 최종 output을 반환하게 됩니다. 손실 함수로는 cross-entropy를 사용하였다고 밝히고 있습니다.

여기까지가 BST의 구조인데, 본인의 task에 맞게 세부 구성을 수정할 수 있습니다. 예를 들어 MLP layer의 input을 결정할 때 논문에서처럼 모두 concat하는 방식을 취할 수도 있지만, SRGNN에서처럼 soft attention을 이용하여 session embedding vector를 만들 수도 있을 것입니다.

[\alpha_i = \mathbf{q}^T \sigma ( \mathbf{W}_s \mathbf{v}_i + \mathbf{c} )]

[\mathbf{s}g = \Sigma{i=1}^n \alpha_i \mathbf{v}_i]

결국은 아이템 간의 상호작용을 어떻게 포착할 것인가, 그리고 그 과정이 끝난 아이템 벡터들을 어떻게 통합할 것인가는 연구자/분석가가 편의에 맞게 설정할 수 있는 것입니다.


3. Experiments and Conclusions

논문에서의 실험은 Taobao 앱 데이터를 통해 이루어 졌습니다. 7일치를 학습데이터로 사용하고 마지막 1일을 테스트 데이터로 사용하였다고 합니다. AUC, CTR, Response Time 등을 측정하였고 Adagrad를 통해 gradient descent를 수행하였습니다.

BST가 비교 대상인 WDL, DIN을 outperform하였는데, 이는 Transformer Layer를 통해 고객의 행동 시퀀스에 내재되어 있는 sequential signal을 더욱 잘 포착했기 때문이라고 논문은 서술하고 있습니다.

BST의 경우 transformer를 이용한 다른 알고리즘과 마찬가지로 시퀀스에 유의미한 정보가 포함되어 있을 경우 그 효과를 발휘할 수 있을 것으로 기대됩니다. 또한 user feature와 같은 보조적인 정보도 충분히 활용할 수 있다는 장점을 갖습니다.

Comment  Read more

Action Recognition Models(Two-stream, TSN, C3D, R3D, T3D, I3D, S3D, SlowFast, X3D)

|

이 글에서는 Video Action Recognition Models(Two-stream, TSN, C3D, R3D, T3D, I3D, S3D, SlowFast, X3D)을 정리한다.

  • Two-stream 계열: 공간 정보(spatial info)와 시간 정보(temporal info)를 별도의 stream으로 학습해서 합치는 모델.
  • 3D CNN 계열: CNN은 3D로 확장하여 (iamge $\rightarrow$ video) 사용한 모델. Facebook이 주도해 왔다.

Two-stream Approach

논문 링크: Two-Stream Convolutional Networks for Action Recognition in Videos

말 그대로 spatial info와 temporal info를 별개의 stream에서 각각 학습한 뒤 마지막에 fusion하는 모델이다. Action Recognition 연구 초기에는 이런 식으로 접근했었다.

여기서 Optical Flow라는 개념이 나온다.

다음 프레임으로 넘어갈 때 각 픽셀이 어디로 이동했는지를 벡터로 나타낸 것이라고 간단히 생각하면 된다. 이를 모델 입력에 사용되는 프레임마다 구하여 temporal stream convNet에 태운다. 논문에서는 수평 방향($u$)과 수직 방향($v$)로 나누어 계산한다.

추가 설명: optical flow를 계산할 때 기본 가정이 있는데, (어떻게 보면 당연한 것들이다) 다음 프레임으로 갈 때

  • Brightness Consistency: 각 object의 같은 지점은 밝기가 거의 같게 유지된다.
  • Temporal Persistence: 각 object는 먼 거리를 이동하지 않는다.
  • Spatical Coherence: 인접한 점들은 거의 같은 방향으로 이동한다.

모델 설명:

Spatial stream은 이미지 한 장을 사용하므로 2D convNet을 사용한다. AlexNet과 거의 유사하다.

Temporal stream은 image sequence를 입력으로 받는다. 그래서 어디선가 이 정보들을 합치는 과정이 필요한데,

  • Optical flow stacking: $L$ frame에 대해 각 방향 $u, v$가 있으므로 $2L$개의 channel이 있다.
  • Trajectory stacking: optical flow vector를 그냥 쌓는 대신 flow를 따라가면서 sampling한다. 채널 수는 같게 유지된다.

단순한 방법임을 알 수 있다. 따라서 단점이 있다.

  • Missing Long range temporal info: 다음 frame의 flow만 계산하므로 장거리 의존성에 대한 학습이 이루어지지 않는다.
  • False label assignment: 어떤 frame을 선택하느냐에 따라 다른 label을 할당할 수 있다.
  • Optical flow를 매번 계산하므로 비싸고 오래 걸린다.
  • 2개의 stream을 따로 학습하므로 end-to-end 학습이 될 수 없다. (추후 논문에서 개선됨)

이후 개선점

  • 논문 링크: Convolutional Two-Stream Network Fusion for Video Action Recognition

  • 마지막(scoring step)에 2 stream을 합치는 대신 중간에서 합치는 방식을 사용한다.

    • 중간에 합치면 성능을 해치지 않으면서도 계산량을 줄일 수 있다.
    • conv layer 중에서는 마지막 conv layer에서 합치는 것이 첫 부분에서 합치는 것보다 낫다.

TSN(Temporal Segment Networks)

논문 링크: Temporal Segment Networks: Towards Good Practices for Deep Action Recognition

  • 더 나은 long-range temporal modeling을 위해 $K$개의 부분으로 나누어서 2-stream model을 각각 돌려준다.
  • optical flow에 더해 2개의 temporal stream을 추가하는데,
    • Warped optical flow: 카메라 움직임을 보정하기 위해 actor에 집중하여 계산함.
    • RGB difference: 픽셀의 rgb 변화를 측정하는데 큰 도움은 안 됐다고 한다.
  • overfitting을 줄이기 위해 batch-norm, pre-training, drop-out 등을 사용하였더니 성능이 더 좋아졌다.

위의 그림을 보면 비디오를 여러 clip으로 나눈 뒤 각각 two-stream model을 돌려서 공간 정보/시간 정보끼리 합친 것을 볼 수 있다.


Hidden Two-stream(Hidden Two-Stream Convolutional Networks for Action Recognition)

논문 링크: Hidden Two-Stream Convolutional Networks for Action Recognition

  • 미리 계산한 optical flow를 사용하는 대신 그때그때 계산한다.
    • spatial stream에는 변화가 없다.
    • MotionNet이 temporal stream 앞에 추가되어 optical flow를 추정한다.
  • MotionNet
    • 연속된 이미지 $I_1, I_2$가 주어지면 그 차이 $V$를 계산한다.
    • Reconstruction Loss: $I_2 - V \simeq I_1$
    • 이 차이 $V$가 Temporal Stream CNN에 입력으로 주어진다.

C3D: Learning Spatiotemporal Features with 3D Convolutional Networks

논문 링크: Learning Spatiotemporal Features with 3D Convolutional Networks

어쩐지 AlexNet이 생각나는 모델 구조를 갖고 있는데, 2D CNN을 시간 축으로 한 차원 더 확장하여 3D CNN을 적용한 것이라고 보면 된다.

꽤 좋은 성능을 가지며 구조로 상당히 간단한 편이다.

단점은,

  • 여전히 장거리 의존성을 잘 모델링하지 못하며,
  • 계산량이 2D일 때보다 크게 늘어나서 상당히 많으며
  • 아직 hand-crafted feature가 필요하다.

R3D: Learning Spatio-Temporal Features with 3D Residual Networks for Action Recognition

논문 링크(약간 불확실): Learning Spatio-Temporal Features with 3D Residual Networks for Action Recognition

ResNet을 3D로 확장한 모델이다.

차이가 있다면

  • 3D는 계산량이 더 많기 때문에 152가 아닌 34개의 block을 사용하였고
  • 3x3 conv가 아닌 3x3x3 conv 사용(3D니까 당연하다)

정도의 차이가 있다.

입력 차원은 $(L \times 112 \times 112 \times 3)$이며 stride는 conv1에서 1x2x2(시간 차원 1, 공간 차원 2x2), conv2부터는 2x2x2(시간 차원도 2배로 줄어듦)이다. 한 층을 지나갈 때마다 크기는 2배로 줄고 채널은 2배로 늘어난다.


R(2+1)D: ConvNet Architecture Search for Spatiotemporal Feature Learning

논문 링크: ConvNet Architecture Search for Spatiotemporal Feature Learning

R3D와 비슷하지만 시간에 대한 kernel과 공간에 대한 kernel을 분리해서 학습한다. 어떻게 보면 two-stream model과 비슷한 논리이다. 단 optical flow 같은 것을 쓰는 대신 conv 연산으로 수행한다는 점이 다르다.

같은 크기의 모델을 쓸 때 성능 상으로 이점이 있다고 한다.


T3D: Temporal 3D ConvNets: New Architecture and Transfer Learning for Video Classification

논문 링크: Temporal 3D ConvNets: New Architecture and Transfer Learning for Video Classification

DenseNet: Densely Connected Convolutional Networks 기반으로 만든 single stream 모델이다.

다양한 길이의 temporal feature를 얻기 위해 dense block 뒤에 Temporal Transition Layer를 추가하여 temporal pooling을 수행한다. GoogLeNet에서 Inception module과 비슷한 아이디어이다.

사전학습된 2D ConvNet을 일종의 teacher로서 사용하는데, 2D ConvNet에서 transfer learning하는 것과도 비슷하다고 할 수도 있다. 2D 부분은 고정시켜 두고, 3D stream만 update하는데, 2D net의 mid-level feature를 갖고 지도학습을 시키는 방식이다.


아래부터는 two-stream과 3D conv(C3D)의 아이디어를 합친 논문이다.

I3D: Two-Stream Inflated 3D ConvNet

논문 링크: Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset

  • Two-stream 방법에서, spatial stream을 3차원으로 확장하였다.
  • Temporal stream은 여전히 미리 계산된 optical flow를 입력으로 하되 이제 early fusion 대신 3D conv 방식을 사용한다.

Architecture는 GoogLeNet(Inception-V1)에 기초하지만 바뀐 점은 2D가 아닌 3D로 확장한 버전이다.

Optical flow를 여전히 써야 하는가? 하는 의문을 던지는데,

  • 3D ConvNet은 여전히 순수 feed-forward 계산을 사용하는데, optical flow는 어떤 recurrent한 계산을 수행한다(flow field에서 반복적 최적화를 수행한다).

그러나 사실 이 논문 이후로는 optical flow가 사실상 사용되지 않는다.


S3D: Seperable 3D CNN

논문 링크: Rethinking Spatiotemporal Feature Learning: Speed-Accuracy Trade-offs in Video Classification

R3D를 R(2+1)D로 바꾼 것과 비슷한데 I3D의 Inception block의 3D를 2D+1D로 바꾼 것이다.


SlowFast

논문 링크: SlowFast Networks for Video Recognition

  • 낮은 rate로 frame을 조금 뽑아서 사용하는 Slow pathway(spatial info에 집중)
  • 높은 rate로 frame을 많이 뽑아서 사용하는 Fast pathway(temporal dynamics에 집중됨)

2개의 pathway를 사용하는 어떻게 보면 R3D와 비슷한 구조를 사용한다.

전체 구조를 표로 나타내면 다음과 같다.

Slow pathway에서는,

  • stide가 16이라 다음 프레임으로 넘어가면 정보가 많이 바뀐다.
  • 시간 차원이 1인데, 이는 이미지를 한 장으로 처리한다는 뜻이므로 시간 정보가 포함되지 않는다. res4, res5에 와서야 한 번씩 차원이 3이 되므로, 전체적으로 spatial info에 집중한다는 것을 알 수 있다.
  • 더 많은 channel을 사용한다.

Fast pathway에서는,

  • Slow보다 8배 더 많이 뽑는다(stride 2).
  • 시간 차원이 늘어서 정보를 더 많이 쓰고, orange색 숫자를 보면 채널이 그만큼 줄어들었다는 것을 의미한다.

연결 부분에서는,

  • pathway 간 연결을 중간에 추가하는데, fast 쪽에서 slow 쪽으로만 연결을 추가해도 성능이 괜찮아졌다고 한다.
  • 단, 정보를 갖다 쓰려면 conv output의 크기가 같아야 한다. 위의 표에서, 공간 정보의 차원은 slow에서나 fast에서나 갈은 것을 볼 수 있다.

X3D: Expand 3D CNN

논문 링크: X3D: Expanding Architectures for Efficient Video Recognition

X: expand이다. 간단한 stepwise network expansion을 각 step의 한 축마다 확장을 시켜본다.

전체 구조는 아래와 같은데, 아래의 각 색깔로 표시된 부분을 조금씩 늘려 보면서 가장 좋은 결과를 찾아내는 방법이라 생각하면 된다.

  • X-Fast($\gamma_\tau$): 입력의 frame rate.
  • X-Temporal($\gamma_t$): 입력의 frame 개수.
  • X-Spatial($\gamma_s$): sampling resolution.
  • X-Depth($\gamma_d$): residual stage 당 layer의 수.
  • X-Width($\gamma_w$): 모든 layer의 채널의 수.
  • X-Bottleneck($\gamma_b$): 중간 conv filter의 inner channel width.

실험을 매우 많이 해본 논문이라 보면 된다. 특별히 반짝이는 아이디어는 없다.


참고할 만한 자료

Comment  Read more

PCREC(Pre-training Graph Neural Network for Cross Domain Recommendation) 설명

|

이번 글에서는 GNN을 활용하여 CDR(Cross Domain Recommendation) 문제를 풀어본 논문에 대해서 다뤄보도록 하겠습니다. 논문 원본은 이 곳에서 확인할 수 있습니다. 본 글에서는 핵심적인 부분에 대해서만 살펴보겠습니다.


Pre-training Graph Neural Network for Cross Domain Recommendation 설명

1. Introduction

추천 시스템을 만든다고 할 때 cold start problem과 data sparsity issue는 흔히 겪는 문제입니다. 이를 해결하기 위해 cross-domain recommendation를 떠올려 볼 수 있는데, 이에 관하여 평소의 카드 결제 기록을 바탕으로 어떤 커머스 샵의 상품을 추천해주는 시스템을 예로 들 수 있겠습니다.

만약 2가지 domain이 존재한다고 하면 대부분의 기존 연구들은 이를 결합하여 한 번에 학습시키는 형태를 보여왔는데, 이 경우 학습된 임베딩이 편향된 정보를 포함하고 있는 source domain에 의해 크게 영향(dominated) 받을 수 있습니다.

이러한 문제를 해결하기 위해 본 논문에서는 PCRec 이라는 방법론을 제시하고 있습니다. 설명을 읽어보면 아시겠지만 구조 자체는 어렵지 않고 많이 본 듯한 느낌이 듭니다. 논문 내에서 서술된 내용 중에서 인사이트를 얻을 수 있는 부분에 집중하면 더욱 좋을 것 같습니다.

기본적으로 CDR 에서는 정보가 source domain에서 target domain으로 전달됩니다. CDR의 핵심 아이디어는 두 도메인에 있는 common user를 활용하여 관련된 정보를 전달하는 것인데, 이는 2가지 모델링 방법으로 구체화할 수 있습니다.

source domain의 user 정보를 target domain에서 보조적인 정보로 활용하는 것이 첫 번째이고, 두 domain에서 공유가능한 parameter를 jointly train하는 것이 두 번째 방법입니다. 최근의 연구 중에서는 이 2가지 방법을 결합한 형태도 존재한다고 합니다. 그런데 이러한 방법을 적용할 때 생각해야 할 것이, 꼭 source domain이 우리가 target domain에서 풀고자 하는 예측 목표와 관련이 깊다고 말하기 어려울 수도 있다는 것입니다. 그리고 만약 source domain이 target domain에 대해 dominant bias를 갖고 있다면 이는 성능 저하의 주요 요인이 될 수 있습니다.

따라서 CDR을 잘 해내기 위해서는 우리는 반드시 아래 2가지를 동시에 달성해야 합니다.

  • 정보를 효과적으로 전달할 것
  • source domain에서 발생하는 편향으로부터 target domain에서의 예측을 보호할 것

pre-trained model에서 획득한 임베딩이 우리가 전달해야 할 정보라고 생각할 수 있겠습니다. 그리고 이 정보가 target domain에서 도움이 될 수 있도록 이를 fine-tuning 하는 작업이 수반되어야 할 것입니다.

본 논문에서는 pre-train 과정에서 graph structural information을 사용하고 이 때 학습은 SSL(Self-Supervised Learning)의 형태로 이루어집니다. query node가 존재할 때 이 node와 positive/negative 관계를 맺고 있는 node들을 추출한 뒤 각각의 pair에 대해 contrasive learning을 적용하면 됩니다. 이 아이디어는 이전 여러 연구에서도 자주 사용되었습니다.

fine-tuning의 본체가 될 모델로 Matrix Factorization을 사용하였는데, 본 논문은 이 간단한 모델이 사실 LightGCN과 같은 좀 더 복잡한 모델보다 더 나은 성능을 보여주었다고 여러 차례 강조하고 있습니다.


cross-domain recommendation과 contrasive learning의 개념에 대해 보충 설명하고 있는 부분입니다.

본 논문에서 제시된 방법론은 user/item relevance에 집중하는 embedding-based transfer 방법을 취하고 있다는 점만을 기록하며, 나머지 부분에 대해서는 논문을 직접 참고하길 바랍니다.


3. Proposed Model

A. Preliminary

source/target domain graph를 각각 $\mathcal{G}^s, \mathcal{G}^t$ 라고 표기합니다. 학습을 진행하기 위해 각 node에 대해 r-ego network에서 context 정보를 추출한다고 하는데, 이는 그냥 r-hop neighbor까지 subgraph를 추출한다고 생각하시면 됩니다. node $u$ 에 대해 subgraph를 추출했다고 하면 이는 $\mathcal{S}_u$ 라고 표기합니다.

B. Pre-training on Source Domain

B~C 과정이 위 그림에 나와있습니다. Pre-training은 앞서 설명한 것처럼 self-supervised learning으로 진행됩니다. 먼저 query node $u$를 고릅니다. 그리고 이 node $u$ 에 대해 random walk를 수행하여 subgraph를 생성합니다. 이 subgraph는 $g^q$ 입니다. 그리고 같은 node에 대해 한 번 더 subgraph를 생성합니다. 이 subgraph는 $g^k$ 입니다. 이 2개의 subgraph들은 positive pair로 선택된 것입니다.

그리고 node $u$ 와 다른 node 하나를 선택했다고 해봅시다. 이 node에서 다시 random walk를 수행하여 $n$ 개의 subgraph를 생성합니다. 이 subgraph들은 $g^1, g^2, …, g^n$ 으로 표기합니다. 위 그림에서는 n=2인 예시를 보여준 것입니다.

이제 positve/negative pair로 사용할 subgraph 추출은 끝났습니다. 이를 활용하여 GNN Encoder를 학습시켜야 합니다. 이 때 2개의 구분된 graph encoder가 존재하는데, $f^q$ 는 query node를 위한 encoder이고 $f^k$ 는 그 외의 key nodes를 위한 encoder입니다. GIN: Graph Isomorphism Network가 학습 네트워크로 사용되었는데, 이에 대해 상세히 알고 싶다면 이 글을 참조하시길 바랍니다.

최적화를 위한 Loss Function은 아래와 같습니다.

[\mathcal{L}{infoNCE} = -log \frac{exp(e^T_q e_k / \tau)} {\Sigma{i=1}^n exp(e^T_q e_i / \tau)}]

이 때 $\tau$ 는 hyperparameter입니다.

contrasive learning에서 K-size look-up key set을 유지하는 것은 굉장히 중요한데, 이 크기를 증가시키면 직관적으로 생각했을 때, 더 나은 sampling 전략이 될 것입니다.

하지만 계산량을 고려하여 본 논문에서는 queue와 moving-averaged encoder를 활용하여 key의 dynamic set을 유지하는 MoCo training scheme을 사용합니다.

C. Fine-tuning on Target Domain

Pre-trained된 모델의 결과물인 user/item embedding을 그대로 사용하는 것은 source domain graph의 structural bias를 그대로 반영하는 결과를 초래하게 될 것입니다. 따라서 이를 target domain에 맞게 fine-tuning하는 작업이 필요합니다.

본 논문에서는 MF 모델을 통해 이를 성취하며 아래와 같이 BPR(Bayesian Personalized Ranking) Loss를 통해 최적화를 수행합니다.

[\mathcal{L}{BPR} = -\Sigma{i=1}^M \Sigma_{i \in \mathcal{N}u} \Sigma{j \notin \mathcal{N_u}} log \sigma(\hat{y}{ui} - \hat{y}{uj}) + \lambda \Vert \Theta \Vert^2]

D. Recommendation

최종 결과 임베딩을 사용하여 목적에 맞게 최종 추천 시스템을 구현하면 됩니다.

4. Experiments

본 논문에서는 위 표에 나온 데이터를 사용하여 실험을 진행하였습니다. GGF가 source이고 PP가 target domain입니다. sparsity 문제는 현실 데이터에서도 정말 많이 마주하는데, 본 논문에서는 이 점을 고려하여 GGF 데이터셋에서는 10-core setting을, PP 데이터셋에서는 5-core setting을 사용하였습니다. 이는 최소 몇 개의 transaction을 발생시킨 user만을 대상으로 학습/예측을 진행하겠다는 규칙을 만든 것이라고 보면 됩니다. 저도 과거에 sparsity가 심한 대규모 데이터셋에 대해 이와 같은 제한을 적용했던 경험이 있습니다.

본 논문에서는 실험을 3가지 측면에서 분석하였습니다.

Step1: 기존 방법에 비해 우월한가?
Step2: r-hop neighbor에서 r은 어떻게 정하는가?
Step3: source domain에서 target domain으로 정보를 효율적으로 전달하기 위해서는 어떻게 해야하는가?

위의 결과를 보면 알겠지만, PCRec은 모든 비교 모델을 압도하는 성과를 보여줍니다. 2-hop neighbor 설정이 3-hop neighbor 설정 보다 더 나은 결과를 보여준 것은 놀랍지 않습니다. SIGN 논문에서도 기술하고 있듯이 단지 네트워크를 깊게 만들고 더 넓은 범위의 neighbor를 커버하는 것은 그리 효과적인 방법이 아닐 때가 많습니다.

pre-trained된 모델만을 사용했을 때, pre-trained된 모델의 임베딩을 fine-tuning의 초깃값으로 그대로 사용했을 때, 그리고 pre-trained된 모델로 하여금 fine-tuning 초깃값을 새로 생성하게 했을 때를 모두 비교해보면 마지막 결과가 가장 훌륭합니다. 이것이 3번째 질문에 대한 답이 될 것입니다.

5. Conclusion

본 논문은 복잡한 수식이나 새로운 Graph Convolutional Filter를 소개하는 것이 아니라 cross-domain recommendation 문제에 대해 기존의 여러 방법론들을 조합하여 접근한 논문입니다. 추천 시스템을 현실에서 구현할 때 마주하는 여러 문제를 해결하기 위해 참고하기에 훌륭한 연구자료로 판단됩니다.

Comment  Read more

VQ-VAE 2 논문 설명(Generating Diverse High-Fidelity Images with VQ-VAE-2)

|

이 글에서는 2019년 NIPS에 게재된 Generating Diverse High-Fidelity Images with VQ-VAE-2(VQ-VAE2) 논문을 살펴보고자 한다.

중요한 부분만 적을 예정이므로 전체가 궁금하면 원 논문을 찾아 읽어보면 된다.


Generating Diverse High-Fidelity Images with VQ-VAE-2

논문 링크: Generating Diverse High-Fidelity Images with VQ-VAE-2

Github: https://github.com/rosinality/vq-vae-2-pytorch

  • 2019년 6월, NIPS 2019
  • DeepMind
  • Ali Razavi, Aaron van den Oord, Oriol Vinyals

초록(Abstract)

이 논문에서는 VQ-VAE(Vector Quantized Variational AutoEncoder)로 large-scale 이미지 생성 문제를 다루려 한다. 이를 위해 prior를 더욱 강화하여 이전보다 더 일관성, 현실성 있는 이미지를 만들었다. 모델은 단순한 feed-forward encoder와 decoder를 사용하였으며 회귀모델은 오직 latent space 안에서만 쓰여 pixel space에서는 기존보다 더욱 빠른 속도를 갖는다. 최종적으로 GAN과 비슷한 성능을 보이면서도 mode collapsing과 같은 GAN의 고질적인 문제를 겪지 않는 생성 모델을 만들었다.


1. 서론(Introduction)

Deep Generative model은 최근 크게 발전하며 실제와 분간이 힘든 이미지를 생성할 수 있는 수준에 이르렀다. GAN은 minimax 방식을 사용하여 현실적인 이미지를 생성하였지만 실제 세상의 이미지 분포를 그대로 따라가지 못하는 문제가 존재한다. 또한 생성한 이미지를 평가하기도 매우 어려워서 근사하는 방식인 FID 등의 metric으로 평가를 해야 한다.

VQVAE2

이와는 대조적으로 likelihood 기반 방식은 NLL을 최적화하며 이는 모델 비교와 아직 보지 못한 일반화 성능을 측정할 수 있게 한다. 또 모델은 학습 셋의 모든 example에 대한 확률을 최대화하므로 분포 문제에서도 자유로운 편이다. 그러나 이 방식 역시 어려운 점이 있는데,

  • Pixel space에서의 NLL은 sample의 품질을 측정하기 적합하지 않고
  • 다른 model class 사이의 비교하는 데 사용하기도 어렵다.

본 논문에서는 무시해도 되는 정보를 모델링하는 데 드는 노력을 최소화하도록 lossy compression으로부터 얻은 아이디어를 사용한다. 사실 JPEG 압축 방식은 이미지 품질에 영향을 주지 않는 선에서 80%의 용량을 줄일 수 있는 방식이다. 이와 비슷한 아이디어로, 본 논문에서는 이미지를 매우 작은 discrete latent space로 옮겨 저장하는 방식을 취한다. 이는 30배 더 작은 공간을 차지하면서도 decoder가 원래 이미지를 (눈으로 보기에) 거의 비슷하게 복원할 수 있게 한다.

이산표현에서 prior는 PixelCNN + self-attention으로 모델링이 가능하여(PixelSnail), prior로부터 sampling할 때 디코딩된 이미지는 복원 시 고품질과 높은 coherence를 가진다. 인코딩된 이미지는 원본 이미지보다 30배 가량 작고 또 모델의 속도도 빨라서 기존의 생성모델에 비견될 만한 성능을 보인다.


2. 배경(Background)

2.1 Vector Quantized Variational AutoEncoder

VQ-VAE는 Variational AutoEncoder와 거의 비슷한 구조를 갖는데, 가장 중요한 차이점은 latent space가 discrete하다는 것이다. 지정된 크기(ex. 512)의 codebook(embedding space)을 유지하면서 이미지의 각 부분을 하나의 embedding의 인덱스에 대응시켜 이미지를 표현한다. Encoder는 입력 $x$에 대해 $x \mapsto E(x)$의 역할을 수행한다. 이 벡터 $E(x)$는 codebook vector $e_k$와의 거리에 기반하여 quantized되며 이는 decoder로 전달된다.

[\text{Quantize}(E(x)) = \textbf{e}_k \qquad \text{where} \quad k = \argmin_j \Vert E(x) - \textbf{e}_j \Vert]

Decoder는 이미지를 표현한 인덱스를 다시 대응되는 codebook vector로 mapping한다.

VQ-VAE는 다음 식으로 최적화된다.

[L = \log p(x \vert z_q(x)) + \Vert \text{sg}[z_e(x)]-e \Vert_2^2 + \beta \Vert z_e(x)-\text{sg}[e] \Vert_2^2 , \qquad (3)]

Encoder의 출력과 codebook의 벡터 공간을 일치시키는 것에 대해 두 가지 loss를 포함한다.

  • codebook loss: 오직 codebook에만 영향을 준다. 선택된 codebook $\textbf{e}$를 encoder의 출력 $E(x)$에 가까워지도록 한다.
  • the commitment loss: encoder의 weight에만 영향을 준다. encoder의 출력이 선택된 codebook 벡터에 가까워지도록 해서 여러 codebook 사이를 자꾸 왔다갔다하지 않도록 하는 역할을 한다.

본 논문에서는 여기에 exponential moving average를 적용시킨다.


3. 방법(Method)

두 단계로 이루어진다.

  1. 이미지를 discrete latent space로 mapping하기 위해 VQ-VAE를 학습시킨다.
  2. 모든 데이터를 사용하여 PixelCNN prior를 이 discrete latent space에 fit시킨다.
VQVAE2

3.1 Stage 1: Learning Hierarchical Latent Codes

vanilla VQ-VAE와 다른 점은 더 큰 이미지를 다룰 수 있기 위해 vector quantized codes를 계층 구조로 사용한다는 것이다.

VQVAE2

위 그림에서 원본 이미지를 인코딩하여 얻은 bottom latent code는 세부적인 부분을 모델링하고, 이 bottom latent code를 한번 더 인코딩한 Top latent code는 global한 특징을 모델링한다. 여기서 bottom latent code는 top latent code에 의존하는데, 그래야 top latent code가 세부적인 특징까지 혼자 다 모델링하려고 하는 현상이 방지된다(분업한다고 생각하면 된다).

256 x 256 이미지는 bottom level에서 64 x 64로 줄어들고, top level은 32 x 32 크기를 갖는다. Decoder 부분에서는 인코딩된 vector quantized code를 전부 받아서 디코딩을 수행한다. 이는 residual block과 strided transposed convolution으로 수행된다.

VQVAE2

3.2 Stage 2: Learning Priors over Latent Codes

이미지 압축 및 stage 1에서 학습한 모델로부터 샘플링을 할 수 있도록 prior를 latent code로 학습시키는 단계이다. Prior를 학습 데이터로 학습시킴으로써 성능을 향상시키고 marginal posterior와 prior 간 괴리를 줄이며, 학습된 prior로부터 샘플링된 latenr variable은 decoder가 학습하는 동안 관찰한 것과 비슷해진다.
이러한 관점에서, prior를 학습된 posterior에 fit하는 과정은 latent variable을 re-encoding함으로써 latenr space를 무손실 압축하는 것으로 볼 수 있다(결과는 Shannon’s entropy에 가깝다). 따라서 학습된 prior의 NLL과 true entropy의 괴리를 줄이고, 더 실제적인 이미지 샘플을 기대할 수 있다.

VQ-VAE framework에서, 이 auxiliary prior는 post-hoc, stage 2에서 PixelCNN과 같은 강력한 회귀모델로 모델링된다.

  • Top latent map에서의 prior는 전체 구조를 모델링하는 책임이 있으므로 multi-head self-attention layer를 사용, spatial location 간 상관관계를 얻기 위해 더 큰 receptive field를 사용할 수 있다.
  • 이와 대조적으로, bottom level에서의 조건부 prior는 local info를 모델링한다. 여기서는 메모리 문제 때문에 self-attention layer를 쓰는 것은 힘들고, 대신 large conditioning stacks를 사용한다.
  • 더 자세한 내용은 알고리즘 3 참조.

Top-level prior는 32 x 32 latent variable을 모델링한다.

  • 매 5개의 layer마다 residual gated conv layer + causal multi-headed attention을 추가한다.
  • 각 attention matrix, residual block 뒤에 dropout을 추가한다.
  • PixelCNN stack에다가 1x1 conv로 구성된 deep residual net을 추가하는 것은 학습 시간이나 메모리 사용량을 별로 늘리지 않으면서 likelihood를 증가시킬 수 있다.

Bottom level에서는 64 x 64 latent variable을 사용한다.

  • 앞서 언급했듯 여기서 같은 방식을 사용하면 자원 사용량이 너무 많아지다.
  • 그래서 attention layer를 따로 사용하지 않는다.

3.3 Trading off Diversity with Classifier Based Rejection Sampling

GAN과는 다르게 Maximum Likelihood 기반 확률모델은 모든 학습 데이터 분포(+ 모든 mode에 대한 데이터)를 모델링하는 것이 강제된다. 최근 GAN framework 중에서는 다양성과 품질을 trade-off하는 샘플 선택을 자동화하는 과정을 제안하기도 했다.

우리가 생성한 샘플이 실제 data manifold에 더 가까울수록, 그 샘플들이 사전학습된 분류기에 의해 올바른 class label로 분류될 가능성이 더 증가한다는 직관에 기반해서, 이 논문에서는 샘플의 다양성과 품질을 trade-off하는 자동화된 방법을 제안한다. 특히, 분류기가 올바른 class로 분류할 확률에 따라 샘플의 점수를 매기기 위해 ImageNet에서 학습된 분류 network를 사용한다.


4. 관련 연구(Related Works)

  • VQ-VAE
  • Gated PixelCNN(+self-attention)
  • BigGAN: 구조적인 이점, 안정화 방법, TPU로 모델을 scale up하는 것 등으로 FID/Inception score에서 SOTA 모델이다.

5. 실험(Experiments)

256 x 256 ImageNet에서 학습한 모델의 양적/질적 결과를 (BigGAN-deep과) 비교한다.

5.1 Modeling High-Resolution Face Images

데이터 상 매우 긴 범위의 의존성을 잡아내기 위한 방법으로 이 논문에서 제시한 multi-scale 접근법을 평가하기 위해 FFHQ dataset(1024 x 1024)에서 3-level 계층 모델을 학습시킨다. 이 데이터셋은 성별, 인종 등 다양한 domain으로 구성된 7만 개의 고품질 초상화 (사진)으로 구성되어 있다.

초장거리 의존성의 예: 인물 사진의 경우 양쪽 눈이 (거의) 대칭적으로 이루어져 있어야 한다. 이는 수백 pixel 떨어진 곳에서 동일한 색상+ 비슷한 크기 등으로 이미지를 생성해 내야 하는, 장거리 의존성에 대한 이해가 필수이다.

VQVAE2
VQVAE2
VQVAE2

5.2 Quantitative Evaluation

5.2.1 Negative Log-Likelihood and Reconstruction Error

Likelihood 기반 생성모델을 사용하는 핵심 이유 중 하나는 일반화에 대한 성능 평가가 가능하여 over-fitting이 일어나는지를 관찰할 수 있다는 것이다.
일반적으로 사용되는 FID와 Inception score의 경우 일반화 문제를 무시한다.

그래서 NLL(+MSE)로 top & bottom prior에 대한 결과가 아래 표에 있다. 여기서 NLL 값은 같은 사전학습 VQ-VAE를 사용한 경우에만 비교가 유효하다.

VQVAE2

5.2.2 Precision - Recall Metric

PR metric은 GAN에서 FID와 Inceptino score의 대안으로서 제안되었다. 아래 그림에서 BigGAN-deep와 비교한 결과를 볼 수 있다. Precision은 VQ-VAE가 조금 낮지만, Recall은 더 높다.

VQVAE2

5.3 Classification Accuracy Score

최근 제안된 평가방법인 Classificatino Accuracy Score(CAS)로도 비교하였다. 이는 ImageNet 분류기를 후보 모델에서 생성된 샘플에서만 학습하고 test set의 real image에서 분류 정확도를 측정하여 결과적으로 품질과 다양성을 평가할 수 있는 방법이다. 결과는 아래와 같다.

VQVAE2

VQ-VAE의 경우 압축 때문에 high-frequency signal(~noise)이 부족하다.

VQ-VAE reconstruction은 “domain gap”을 좁히고 분류기를 재학습시키지 않고도 더 높은 CAS score를 받았다.

5.3.1 FID and Inception Score

단점이 존재하기는 하지만 GAN을 평가하는 가장 일반적인 방법인 FID와 Inception score로도 평가를 진행하였다. 결과는 위에 있는 그림 7a에서 볼 수 있다.

다양성과 품질을 trade-off하는 방법으로 classifier-based rejection sampling을 사용하였다.

VQ-VAE는 FID와 IS 모두 향상되었다(30 $\rightarrow$ 10). BigGAN-deep에서 rejection sampling은 BigGAN 논문에서 제안된 truncation method보다 낫다.


6. 결론(Conclusion)

VQ-VAE와 강력한 회귀모델을 prior로 사용하여 다양한 고해상도 이미지를 생성하는 간단한 방법을 제시하였다. 계층적 구조의 latent map을 사용하여 SOTA GAN과 비슷한 수준의 이미지 생성 결과를 보여주었고 GAN 방식이 아닌 생성 모델의 한 갈래를 제시했다는 점에서 높이 평가할 만한 논문이다.


참고문헌(References)

논문 참조!


부록 A(Architecture Details and Hyperparameters)

A.1 PixelCNN Prior Networks

VQVAE2
VQVAE2

A.2 VQ-VAE Encoder and Decoder

VQVAE2

부록 B(Additional Samples)

논문 전체 및 무손실 압축으로 rendering된 결과 등을 추가로 보고 싶다면 아래 링크를 참조하면 된다.

  • https://drive.google.com/file/d/1H2nr_Cu7OK18tRemsWn_6o5DGMNYentM/view?usp=sharing
Comment  Read more

VQ-VAE 논문 설명(Neural Discrete Representation Learning)

|

이 글에서는 2017년 NIPS에 게재된 Neural Discrete Representation Learning(흔히 VQ-VAE라 부른다) 논문을 살펴보고자 한다.

중요한 부분만 적을 예정이므로 전체가 궁금하면 원 논문을 찾아 읽어보면 된다.


Neural Discrete Representation Learning

논문 링크: Neural Discrete Representation Learning

Github(not official?): https://github.com/1Konny/VQ-VAE

  • 2017년 11월, NIPS 2017
  • DeepMind
  • Aaron van den Oord, Oriol Vinyals, Koray Kavukcuoglu

초록(Abstract)

어떠한 지도 없이 유용한 표현을 학습하는 것은 머신 러닝의 핵심 과제로 남아 있다. 본 논문에서는 이러한 이산 표현을 학습하는 간단하면서도 강력한 생성 모델을 제안한다. 제안하는 VQ-VAE(Vector Quantised-Variational AutoEncoder) 모델은 두 가지 면에서 VAE와 다르다:

  1. Encoder network는 연속적인 codes를 생성하나 VQ-VAE는 이산 codes를 출력한다.
  2. Prior는 정적(static)이지 않고 대신 학습이 가능하다.

이산 잠재 표현을 학습하기 위해 벡터 양자화(VQ: Vector Quantisation)의 아이디어를 통합하였다. VQ 방법을 사용하면 모델이 강력한 autoregressive decoder와 짝을 이룰 때 latent들이 무시되는 “Posterior Collapse” 문제(VAE framework에서 곧잘 나타난다)를 피할 수 있다.

이러한 표현을 autoregressive prior와 짝지으면 모델은 고품질 image, video, audio을 생성할 수 있을 뿐만 아니라 speaker conversion 및 음소의 비지도 학습을 수행하여 학습된 표현이 유용함을 보일 수 있다.


1. 서론(Introduction)

Image, audio, video를 생성하는 분야에서는 많은 발전이 있었다. 어려운 과제인 few-shot learning, domain adaptation, RL 등은 학습된 표현에 크게 의존하였으나 일반적 표현을 얻는 것은 여전히 한계가 있다. Pixel domain에서 가장 효과적인 모델은 PixelCNN(1, 2)이지만, 연속적인 표현을 사용한다. 이 논문에서는, 연속(continuous)이 아닌, 이산적(discrete)인 표현을 다룬다.

언어는 본질적으로 이산적인 성질을 가지며(단어의 수는 한정적이며, 단어와 단어 사이 중간쯤이 명확히 정의되지 않음을 생각하면 된다), 음성도 비슷한 특성을 가진다. 이미지는 언어로 표현될 수 있다. 이러한 점에서, 이산적인 표현은 이러한 이산적인 domain에 잘 맞을 것이라 생각할 수 있다.

이 논문에서는 VAE와 이산표현을 결합한 새로운 생성모델(VQ-VAE)을 제안한다. Vector Quantisation(VQ)를 사용하여 너무 큰 분산으로 생기는 어려움을 피하면서 학습하기 편하고 Posterior Collapse 문제를 회피할 수 있다. 그러면서도 연속표현을 사용하는 모델과 비등하면서도 이산표현의 유연함을 제공한다.

VQ-VAE는 데이터 공간을 효과적으로 사용할 수 있게 하여, 큰 차원의 데이터(이미지의 픽셀, 음성의 음소, 텍스트의 메시지 등)에서 local이라 부르는 작은 부분, noise에 집중하는 대신 중요한 feature만을 성공적으로 모델링할 수 있게 한다.

또 강력한 prior를 제공할 수 있는데, 단어나 음소에 대한 어떤 사전 지식 없이도 언어의 구조를 파악할 수 있거나, 말하는 내용은 그대로 두면서 목소리만 바꿀 수(speaker conversion)도 있다.

그래서 이 논문이 기여한 바는,

  • “posterior collapse” 문제에서 자유롭고 큰 분산 문제가 없는, 이산표현을 사용하는 VQ-VAE 모델을 제안한다.
  • 이산표현 모델 VQ-VAE는 연속표현 모델만큼이나 성능이 좋음을 보인다.
  • 강력한 prior가 있을 때, sample은 speech/video generation과 같은 다양한 응용 분야에서 뛰어난 결과를 생성한다.
  • 어떤 명시적인 지도 없이도 언어의 속성을 파악하고 speaker를 바꿀 수도 있다.

2. 관련 연구(Related Work)

VAE는 여러 방면에서 연구되어 왔지만, discrete domain을 가지는 분야에서조차 연속표현을 사용해왔다.

사실 이산적인 변수는 backprop이 불가능하여, 이산표현의 특성을 일부 가지면서도 미분이 가능하도록 대체 방안이 연구되었다. Concrete softmaxGumbel-softmax가 대표적인 예이다.

또, PixelCNN, Vector Quantisation 등이 연관 분야로 수록되어 있다.


3. VQ-VAE

VAE가 가장 연관이 있을 분야라고 논문에서는 언급한다(그러나 사실 VAE가 아니라 AE에 더 가깝다고 생각되기도 한다).

VAE는 input data $x$, prior distribution $p(z)$가 주어질 때,

  • 이산 latent random variable $z$에 대해 posterior distribution $q(z \vert x)$를 parameterise하는 encoder,
  • input data에 대한 분포 $p(x \vert z)$를 다루는 decoder

로 구성된다.

VAE에서 내부적으로 취급하는 분포는 대개 Gaussian 분포를 따른다고 가정한다. 확장 버전은 autoregressive prior, posterior model, normalising flow, inverse autoregressive posterior 등을 포함하기도 한다.

VQ-VAE는 여기에 이산 표현을 다루도록 한다. VQ른 사용하면서, posterior과 prior distribution은 categorical하며, 이 분포로부터 생성된 sample은 embedding table을 indexing한다. 이 embeddings는 decoder의 입력으로 들어간다.

3.1 Discrete Latent variables

VQVAE

위 그림에서 embedding $e \in R^{K \times D}$가 이산표현을 나타낸다. 이를 codebook이라 하며, $K$는 이산 표현 공간의 크기($K$-way categorical과 같음), $D$는 각 embedding vector $e_i$의 차원이다.

즉 $e_i \in R^D, i \in 1, 2, …, K$이며, embedding vector가 $K$개가 있는 것이다.

모델의 encoder는 입력 $x$를 받아 $z_e(x)$를 출력한다. 이산표현벡터 $z$는 embedding space $e$에서 가장 가까운 embedding vector를 찾는다(look-up).

VQVAE

그래서 이 모델을 VAE라 할 수 있으며(논문 주장), $\log p(x)$를 ELBO로 bound할 수 있다. 제안한 분포 $q(z=k \vert x)$는 deterministic하고 $z$에 대해 단순균등 prior를 정의함으로써 KL divergence를 상수($\log K$)로 얻을 수 있다.

표현 $z_e(x)$는 식 1, 2에 주어진 대로 임베딩 $e$ 중 가장 가까운 원소를 찾고 discretisation bottlenect으로 전달된다.

[z_q(x) = e_k, \quad \text{where} \quad k=\argmin_j \Vert z_e(x) - e_j \Vert_2 \qquad (2)]

3.2 Learning

한 가지 중요한 점은 식 2에서는 real gradient가 없다는 점이다.

  • 이는 straight-through estimator와 비슷한 방법을 사용하여 gradient를 근사할 수 있다.
  • decoder input $z_q(x)$를 encoder output으로 gradient를 복사하면 된다.
  • Quantisation operation을 통해 subgradient를 사용할 수도 있지만, 본 논문의 실험에서는 위의 단순한 estimator만으로도 충분했다.

Forward에서는 $z_q(x)$가 decoder로 전달된다.
Backward에서는 gradient $\nabla_zL$이 encoder로 그대로 전달된다.

Encoder의 출력과 Decoder의 입력은 $D$ 차원의 같은 공간에 존재하여, gradient가 어떻게 변화해야 하는지 정보를 줄 수 있다.

전체 objective는 다음 식으로 표현된다.

[L = \log p(x \vert z_q(x)) + \Vert \text{sg}[z_e(x)]-e \Vert_2^2 + \beta \Vert z_e(x)-\text{sg}[e] \Vert_2^2 , \qquad (3)]

  1. 1번째 항은 reconstruction loss으로 위에서 설명한 estimator를 통해 decoder와 encoder를 모두 최적화한다.
  2. 임베딩 $e_i$는 어떤 gradient도 받지 못하기 때문에 Vector Quantisation(VQ)를 사용한다.
    • VQ objective는 각 e를 encoder의 출력 $z_e(x)$로 이동하게끔 한다. 이 부분이 2번째 항이다.
  3. embedding space는 무한하기 때문에 $e_i$는 encoder parameter만큼 빠르게 학습되지 않을 수 있다. Encoder가 embedding과 출력이 grow할 수 있게 만들기 위해 3번째 항 commitment loss를 추가한다.

sg는 stop gradient를 의미한다. 또 $\beta$는 commitment loss의 중요도를 정하는 hyperparameter인데, 논문의 저자는 모델이 이 값에 robust하다고 한다. $\beta$는 0.1~2.0의 값에서 최종 결과가 그다지 변하지 않았으며 모든 실험에서 $\beta=0.25$를 사용했다고 한다.

Embedding $e_i$들은 벡터의 형태로 설명하였지만, ImageNet 등 image에서는 2차원 이상의 형태를 갖는다(ImageNet: 32 x 32, CIFAR10: 8 x 8 x 10). embedding vector의 수는 총 $K$개이며, k-means와 commitment loss를 계산할 때 평균을 취한다.

논문의 이 부분에는 $N$이라 되어 있는데, 이후 부분 및 다른 논문들은 embedding space(codebook)의 크기를 $K$로 쓴다.

모델 $\log p(x)$는 다음과 같다.

[\log p(x) = \log \sum_k p(x \vert z_k)p(z_k)]

decoder $p(x \vert z)$는 MAP 추론으로부터 $z=z_q(x)$로 학습되었다.

따라서 $z \ne z_q(x)$인 경우에 decoder는 어떤 확률밀도도 구할 필요가 없다. 즉,

[\log p(x) \approx \log p(x \vert z_q(x))p(z_q(x))]

이다. Jensen’s equality를 생각하면 부등호로 바꿔 쓸 수 있다.

3.3 Prior

Discrete latents $p(z)$에 대한 prior distribution은 categorical distribution이며, feature map 안에서 다른 $z$에 의존하여 autoregressive하게 만들어질 수 있다. VQ-VAE를 학습하는 동안 prior는 상수로, 균등하게 유지된다.

학습 후에는, $z$에 대한 자동회귀 분포에 맞춰서 ancestral sampling을 통해 $x$를 생성할 수 있다.

Image에 대해서는 PixelCNN을, raw audio에 대해서는 WaveNet 모델을 사용한다. Prior와 VQ-VAE를 같이 학습시킴으로써 더 좋은 결과를 얻는 것은 추후 연구로 남겨두었다.

4. 실험(Experiments)

4.1 Comparison with continuous variables

VQ-VQE, 그냥 VAE(continuous variables 사용), VIMCO(독립 Gaussian or categorical prior)를 비교한다. 각 모델은 각각 다음과 같은 값을 갖는다.

VAE VQ-VAE VIMCO
4.51 bits/dim 4.67 bits/dim 5.14 bits/dim

중요한 목표는 discrete latent를 사용해도 continuous latent를 사용했을 때와 비교해서 성능이 충분히 좋은지를 확인하는 것인데, 그 목표는 달성된 듯 하다.. 이후 결과에서 생성 결과를 볼 수 있다.

4.2 Images

ImageNet의 $128 \times 128 \times 3$ 크기의 이미지를 purely deconvolutional $p(x \vert z)$를 통해 $z=32 \times 32 \times 1$의 discrete space로 압축한다($K=512$이다). 따라서 $z$의 하나의 unit에 담긴 정보는 다음과 같다.

[\frac{128 \times 128 \times 3 \times 8}{32 \times 32 \times 9} \simeq 42.6]

바꿔 말하자면 42.6배 압축되었다고도 볼 수 있다. $32 \times 32$의 각 bit는 embedding space의 index를 나타내며, 9라는 숫자는 $\log K=\log(512)=9$에서 나왔다(9bit면 512개의 숫자를 표현할 수 있음을 생각하면 된다).

그리고 encoder에 의해 생성된 $z$를 갖고 prior인 PixelCNN를 학습시킨다. 이는 학습이나 sampling 속도를 크게 향상시켜주는 방법은 아니지만, 너무 디테일한 부분(noise 등)보다는 이미지의 전체적인 부분을 잡아낼 수 있도록 하는 것에 가깝다.

VQVAE

왼쪽 사진을 $z$로 변환했다가 VQ-VAE의 decoder로 다시 복원한 게 오른쪽 이미지들이다. 디테일은 살짝 사라졌으나(약간 blurry해짐) 거의 원상복구된 것을 볼 수 있는데, 이는 discrete encoding을 통해 차원을 매우 줄였음에도 중요한 정보는 잃지 않고 압축할 수 있음을 보여준다.

PixelCNN을 discretised $32 \times 32 \times 1$ latent space에서 학습시킨 다음 생성한 이미지는 아래에서 볼 수 있다.

VQVAE

DeepMind Lab 환경에서 얻은 $84 \times 84 \times 3$의 이미지에 같은 실험을 한 결과는 아래에서 볼 수 있다.

VQVAE

마지막으로, DM-Lab frame에서 1번째 VQ-VAE에서 얻은 $21 \times 21 \times 1$ latent space 상에서 2번째 VQ-VAE를 PixelCNN decoder로 학습시켰다. 이러한 세팅은 “posterior collapse” 문제를 피할 수 있게 해 준다. 여기서 latent variable은 단 3개만 사용하여, 전체 bit는 $3 \times 9 = 27$bit로 float32보다도 작게 된다. 결과는 그림 5에서 볼 수 있다.

VQVAE

4.3 Audio

참고: 생성된 오디오 샘플은 홈페이지에서 확인할 수 있다.

109명의 speaker의 음성 녹음본이 포함된 VCTK 데이터셋을 학습에 사용했다. 6 strided convolution, stride 2, window-size 4를 사용하여 원본 파일보다 64배 압축하는 데 성공했다. latent는 512차원이며, decoder는 latent와 speaker를 나타내는 one-hot embedding 모두에 의존성을 갖는다.

VQVAE

우선 VQ-VAE를 오직 long-term 상관관계(정보)만을 보존하도록 latent space를 만든 뒤 decoder로 복원하는 작업을 수행하였다. 홈페이지에서 예시를 들어보면 알 수 있겠지만, 그 내용은 변하지 않았으나 운율은 상당히 바뀐 것을 들을 수 있다. 이는 VQ-VAE가 어떤 언어적 지도 없이 고수준의 추상공간을 이해하고 중요하지 않은 부분은 버리며 음성의 내용만을 잡아냈음을 뜻한다.

다음은 unconditional sample을 분석하는 실험인데,

  • audio에서 추출한 latent representation이 주어지면
  • 이걸로 prior을 학습시켜 데이터의 장기(long-term) 의존성을 모델링하는 것이다.

결과적으로,

  • 40960 timestep을 320 latent timestep으로 줄였다.
  • 원래 WaveNet에서는 상당히 시끌벅적한?(babbling) 소리가 생성된 반면에 VQ-VAE는 상대적으로 깨끗한 소리를 생성하였다.
  • 이는 가장 기본적인 음소 수준을 모델링할 수 있음을 보여준다.

3번째 실험은 speaker를 바꾸는 것이다. 즉, A라는 사람이 말한 내용을 그대로 말하되 B의 목소리로 바꾸는 것인데, 홈페이지를 가서 들어보면 꽤 잘 바뀌었다.

마지막으로 볼 것은 latent를 더 잘 이해하기 위해 각 latent를 GT phoneme-sequence와 비교한 것이다. 각 latent를 41개의 음소와 대응시켜서 classification을 수행해 보면 49.3%로 랜덤인 경우 7.2%에 비해 매우 높음을 볼 수 있다. 즉 VQ-VAE의 latent는 어떤 언어적 지도 없이도 음소 정보를 터득했다고 볼 수 있을 듯하다.

4.4 Video

DeepMind Lab 환경에서 처음 6 frame이 주어지면 나머지 10 frame을 이어지는 내용으로 채우는 task인데, 여기서 VQ-VAE가 하는 것은 오직 latent space($z_t$) 상에서만 생성할 뿐 이미지를 직접 생성하지는 않는다.

sequence $x_i$ 안의 각 이미지는 prior model만 사용하여 모든 latent를 생성한 후 deterministic decoder로 대응되는 latent와 mapping시켜서 생성하게 된다. 따라서 VQ-VAE는 latent space 안에서만 수행하고 pixel space에서는 작업하지 않는다. 생성 결과는 아래 그림과 같다.

VQVAE

5. 결론(Conclusion)

  • VAE와 discrete latent 표현을 위한 VQ를 결합하여 새로운 생성 모델을 만들었다.
  • VQ-VAE는 long-term dependency를 잘 모델링할 수 있다.
  • 원본 source를 작은 latent로 수십 배 압축할 수 있다.
  • 이러한 latent는 discrete하며, continuous latent와 비교하여 성능이 필적할 만하다.
  • Image, audio, video 모두에 대해서 잘 모델링 및 압축한 후 중요한 내용을 잘 보존하면서 복원이 가능하다.

즉, 이 논문은 discrete latent representation을 잘 정립한 논문이라 할 수 있겠다.


참고문헌(References)

논문 참조!


Comment  Read more