2019년에 발표된 Unsupervised Scalabe Representation Learning for Multivariate Time Series라는 페이퍼에서 시계열 데이터 임베딩 방법론을 제시했는데, 이 방법론의 특징은 다음과 같다.
- 입력 길이에 완전 무관하다. (라고 쓰여 있으나 "완전히"는 아니다. 후술할 내용 참조.)
- 다변수 시계열(multivaraite Time Series)를 데이터의 차원에 무관하게 임베딩할 수 있다.
- 완전히 비지도 학습으로, general purpose representation을 생성할 수 있다.
어떻게 구현했을지 한 번 알아보자.
Encoder Architecture
인코더 자체는 특별할 것 없다. (data length, feature dimension) 형태의 텐서 $x$가 주어질 때 $f(x;\theta)=y$
관계에서 $\theta$가 파라미터, $f$는 인코더, $y$는 임베딩 표현이 된다.
Dilated Convolutional Neural Network
인코더는 Dilated Convolutional Network 기반으로 되어 있는데, WaveNet이나 VideoPose3D에서 쓰이는 그 모델과 똑같다.
dilation rate를 조절하면 그에 따라 컨볼루션 레이어의 입출력 길이가 지수적으로 변하게 만들 수 있다. 예를 들어 $N$층의 컨볼루션 레이어를 쌓으면 $\text{len}(x)=L\ (L \ge 2^N)$일 때 $\text{len}(f(x; \theta))=L-(2^N-1)$이 된다.
아래 이미지는 두 개의 dilated convolution 레이어를 쌓은 VideoPose3D 모델의 그림이다. VideoPose3D는 WaveNet과 다르게 dilation의 지수를 3으로 설정하여 길이 감소가 $2^N$이 아니라 $3^N$ 단위로 변한다.
dilated convolution는 일반적으로 적용하면 causal한지 symmetric한지 차이가 없으나 up/down sampling 과정에서 (resnet처럼) residual을 더하면 차이가 생긴다. 이때 padding을 어떻게 주는지, residual를 어떻게 자르는지가 중요하다.
본문에서 다루는 페이퍼는 Causal한 모델을 적용했다.
Adaptive Average Pooling
자 이제 길이가 $\text{len}(f(x; \theta))=L-(2^N-1)$인 dilated convolutional network의 output이 있다. 여전히 입력에 따라 가변 길이인 데이터이다. 이를 어떻게 fixed size vector로 만들 수 있었을까?
되게 심플했는데, 그냥 Pooling을 활용했다. 이 페이퍼에서는 AdaptiveAvgPool1d를 적용했다. Pooling의 출력 길이를 1로 설정하면 shape이 $\text{(batch_size, channels, }L-(2^N-1))$인 출력이 $\text{(batch_size, channels, 1)}$이 된다. 이를 squeeze하고 $\text{(batch_size, channels)}\rightarrow\text{(batch_size, output_length)}$로 변환하는 linear layer를 하나 쌓으면 인코더 구조가 완성된다.
불완전한 길이 대응
페이퍼에서는 입력 길이에 상관 없다고 했지만, 그렇지 않다. dilated convolution이 만약 $L$길이의 입력을 $L-k$ 길이 입력으로 변환시킨다고 하자. 이는 최소한 $k$ 길이만큼의 입력을 필요로 한다는 뜻이 된다. 따라서 입력 길이가 짧은 시퀀스의 경우에는 이 페이퍼에서 제안하는 방법론을 적용하기 힘들 것이다.(그러나 길이가 짧다면 어떤 모델을 가져와도 사용하기 힘들 것이다.)
weight normalization
페이퍼에서는 그다지 강조되지 않았는데, batch normalization이 아니라 weight normalization을 활용한다. 검색을 해보면 둘 중 어느 것이 더 좋은가에 대한 찬반 토론이 참 많다. 그러나 이 페이퍼에서는 weight norm이 더 좋아서 쓴다기보다, batch norm이 의미가 없기에 쓴다는 게 맞겠다.
배치 정규화가 의미가 없는 이유는, 애초에 이 모델은 미니 배치 훈련이 적용되기 어렵기 때문이다. 서로 다른 길이의 시퀀스를 인코딩해야 하는데, shape이 다른 시퀀스들은 모델에 한 번에 넣기 어렵다. 결국 한 번에 하나의 샘플만을 모델에 입력해야 하므로 입력 batch_size가 1로 고정된다.(이거 직접 구현해보면 훈련 시간 진짜 오래 걸린다. 공식 코드가 그나마 어떻게 시간을 줄이려는 노력을 한 것 같긴 하다.)
게다가 batch norm을 활용하는 모델에 input batch size가 1인 상태로 훈련을 반복하면 VRAM usage가 계속 증가하여 결국 OOM 에러가 나고 말았다. 이 문제가 어떤 원인으로 나타나는진 모르겠지만 weight norm으로 바꾸니 문제가 사라졌었다.
그러므로 모델을 구현할 적에는 weight norm을 활용한다는 사실을 잊지 말자.
Triplet Loss
인코더는 마련되었다. 이제 적절한 레이블만 있으면 이것만으로도 embedding을 생성하는 훈련 과정을 설계할 수 있다. 그러나 이 페이퍼에서는 unsupervised representation learning을 목표로 하고 있으므로, 레이블이 없는 상황에서 임베딩을 생성해야 한다. 여기서 활용한 방법은 triplet loss이다.
triplet loss는 특정 샘플에 대해 positive한 데이터와 negative한 데이터를 샘플링해 표현 공간에서의 거리를 기반으로 계산되는 loss이다.
$$\text{Loss} = \max(||f(x)-f(x_{pos})||^2-||f(x) - f(x_{neg})||^2+\alpha, 0)$$
이를 통해 적절한 표현이 학습됨은 꽤 많은 연구들을 통해 증명되었다.
하지만 레이블이 없는데 positive/negative 샘플을 어떻게 구분하겠다는 걸까?
이 부분이 바로 이 페이퍼의 핵심이다. 레이블 없이 positive/negative 샘플을 구분하여 triplet loss로 인코더를 학습하는 unsupervised laerning 방법론을 알아보자.
Inspired by word2vec
NLP 분야의 유명한 고전 임베딩 방법론 중 하나인 CBOW 모델의 word2vec을 생각해보자. 그 발상은 다음과 같다.
어떤 단어의 문맥에 대한 표현은 __아마 그 중 하나의 단어의 표현과 가까울 것이다. 반면 임의로 선택된 단어의 표현과는 떨어져 있을 것이다. (아마도 처음 선택한 "어떤 단어"와 무관한 의미를 가질 것이기에)
직역한 거라 정말 이해하기 힘든 문장인데, 풀어서 말하면 다음과 같다.
어떤 문서에서 선택한 임의의 문맥(context) $C$(연속된 단어 시퀀스 또는 하나의 문장)를 선택했다. $C$에 포함되는 하나의 단어 $W$를 또 선택했다. 그리고 같은 문서 안에 있거나 다른 문서에 있는 임의로(randomly) 선택한 다른 word 또는 context $N$을 선택했다. $C, W, N$에 대한 각각의 표현을 $x_C, x_W, x_N$이라고 하면 $|x_C - x_W| < |x_C - x_N|$가 성립하기를 기대한다.
당연히 randomly selected context $N$은 $C$와 관련이 있을 수 있다. 그래서 본문에서도 should나 probably라는 표현을 반복적으로 쓴다. 하지만 그럴 확률이 낮고, $N$을 고르는 샘플링 작업을 반복한다면 대부분의 randomly selected contexts는 $C$와 연관성이 낮을 것이다.
이러한 일련의 과정을 네거티브 샘플링(negative sampling)이라고 하며, (context, word)와 (context, random word)의 pair를 분리한다. 전자는 triplet loss에서 postive한 pair이고 후자는 negative한 pair이다.
이 페이퍼는 네거티브 샘플링으로부터 영감을 받아 다음과 같은 방법론을 취한다.
각각 임의의 길이를 가지는 series $(y_i)$가 있을 때,
- $y_i$의 임의 길이 subseries $x^{ref}$를 추출한다.
- $x^{ref}$의 임의 길이 subseries $x^{pos}$를 추출한다.
- 임의로 선택된 K개의 다른 series $y_j$($j$ is random)들을 샘플링한다.
- $y_j$의 임의 길이 subseries $x^{neg}$를 추출해 $(x^{neg}k){k\in[1,K]}$ 집합을 만든다.
표현에서 짐작했겠으나, $x^{ref}, x^{pos}, (x^{neg}k){k\in[1,K]}$가 각각 word2vec에서의 context, word, random word에 해당한다.
이들에 inner-product를 적용하여 triplet loss로 학습한다.
$\text{Triplet Loss}=-\log(\sigma(f(x^{ref})^\intercal f(x^{pos})))-\sum_{k=1}^K\log(\sigma(-f(x^{ref})^\intercal f(x^{neg}_k))))$
첫 항은 $x^{ref}, x^{pos}$가 가까울수록 값이 작아지며, 뒷 항은 멀수록 값이 작아진다.
자세한 샘플링 알고리즘은 다음과 같다.
subseries 샘플링할 때 주의점
subseries를 샘플링하는 알고리즘을 위 의사코드대로 정확하게 구현해야 한다. 필자도 처음엔 대충 했는데, 생각해보니 구현 방식에 따라 subseries의 길이 분포가 변하기 때문이다.
이에 관해 본문에 작성했으나, 길이가 길어지고 본문의 원 주제에서 멀어지는 듯하여 별도의 포스팅으로 분리하였으니 참고 바란다.
이 논문을 구현하고자 하는 사람이면 읽어보길 추천한다.
이렇게 Dilated Convolution+Adative Average Pooling+Linear 구조의 Encoder와 negative sampling을 통한 triplet loss 기반 학습이 이 페이퍼의 방법론 되시겠다.
본 포스팅은 방법론의 설명/요약을 목표했기에 추가적인 내용은 설명하지 않겠다.
이 페이퍼의 핵심 가정은 $x_{ref}$와 $x_{pos}$가 유사하고, $x_{neg}$와는 그렇지 않다는 데 있다. 이 방법론을 도입할 것이라면 사용할 데이터가 이 가정에 들어맞는지 꼭 확인해야 할 것이다.
'개발 > 논문 정리' 카테고리의 다른 글
[리뷰] 3D HPE에서 Length-Direction Decomposition이 별로 선호되지 않는 이유 (0) | 2022.09.24 |
---|---|
CVPR 2022 3D Human Pose Estimation 관련 Paper 모음 (0) | 2022.08.27 |
시계열 데이터 Augmentation 방법 정리 - TimeSeries Data Augmentation for Deep Learning: A Survey (0) | 2022.07.09 |
[논문] Neural Graph Collaborative Filtering (0) | 2022.07.09 |
[논문] BERT-QE: Contextualized Query Expansion for Document Re-ranking (0) | 2022.07.09 |