지금까지 RNN의 대표적인 모델을 알아보았다. 이제 이 모델들을 활용하여 어떻게 시계열 데이터를 추론할 지에 대해서 알아보자. 여기서 시계열 데이터란 단순히 일련의 순서로 일정 시간동안 수집된 데이터를 일컫는다. 본 포스터에서는 대표적으로 문장과 수식을 예로 들겠다.
1. seq2seq
seq2seq는 이러한 시계열 데이터를 다른 시계열 데이터로 추론하는 모델이다. 예를 들어 한국어로 나는 고양이로소이다 라는 시계열 데이터를 i am a cat이라는 시계열 데이터로 번역하는 것이 여기에 포함된다. 이 모델은 입력 시계열 데이터를 고정 길이의 벡터로 인코딩하는 Encoder와 이 정보를 해석하는 Decoder로 구분된다. 여기서 Encoder와 Decoder는 쉽게 이전에 알아본 LSTM이 연결된 형태라고 생각하면 된다. Encoder는 LSTM으로 문맥을 하나의 고정된 벡터로 압축하고, Decoder에는 그 압축된 문맥을 바탕으로 각 순환에서 state인 h를 추론하면서 softmax를 통해 시계열 데이터로 변환하는 과정까지 거치는 모델이다.
이것을 공부하는 과정에서 눈에 띈 것은 모델 자체보다는 이 모델의 개선이었다. 입력 데이터를 반대로 하는 Reverse와 이전 상태 뿐만 아니라 Encoder에서 압축한 문맥 벡터를 모든 순환에서 참조하는 Peeky로 높은 성능 향상을 보일 수 있었는데, Peeky는 그렇다 쳐도 Reverse의 경우에는 꽤나 흥미로웠다. 이의 아이디어는 입력 데이터의 순서를 반대로하여 Decoder에서 추론하고자 하는 데이터의 원형을 Encoder에서 가깝게 찾을 수 있게 하자는 것이다(평균 거리는 동일하지만). 예를 들어 "나는 고양이이다"를 "i am a cat"으로 변환하고자 한다면 "나"와 I의 거리가 멀기 때문에 "이다 고양이 나는"이라고 넣는다면 "나"와 I의 거리가 짧아져 추론하기 쉬워진다는 논리이다. 개인적으로 이걸 보면서 "이게 범용성이 높은가?"와 "이런 방법으로 성능 향상이 된다는 것 자체가 모델의 문제점이 아닌가?"라는 생각을 들게 하였다. (나중에 더 알아보자.)
또한 이러한 구조를 바탕으로 이미지 캡셔닝이 가능하다는 것도 흥미로웠다. 문장이 아닌 이미지로 Encoder부분을 바꾼다는 것인데 처음엔 사실 이게 의아했다. 이미지에서 시계열 데이터인 문장을 가져올 수 있다고? 라고 생각했는데 좀 더 생각해보니 번역도 이와 같은 이치이고, 그저 특징을 추출해서 문맥데이터를 만드는 방법의 차이이구나 싶었다. 학습 과정에 대해서 알아보니 이러한 이미지 캡셔닝의 Encoder부분은 ImageNet으로 pretrain하고 뒷 부분은 따로 학습하는 걸 알 수 있었다.
모든 데이터는 결국 0과 1인 바이너리일 뿐인데, 너무 사람의 시각에서 바라본게 아닌가 싶었다. 이러한 제한을 스스로 두지 말아야겠다고 생각했다.
2. Attention
seq2seq에서 Encoder는 고정된 크기의 벡터를 만들었다. 하지만 이는 엄청 긴 문장과 짧은 문장이 같은, 고정된 크기의 벡터에 들어간다는 것과 동일하므로, 추론을 어렵게하고 한계가 존재한다. 따라서 Attention은 시계열 데이터 크기에서 추출한 모든 state를 저장하고, Decoder에서 그 모든 state를 보고, 주목해야할 state를 스스로 뽑고, 그 state를 사용하는 방식이다. 예를 들어 나는 고양이로소이다. 를 i am a cat이라고 번역한다고 볼 때 Decoder에서 cat을 추론해야할 차례에서 나/는/고양이/로소/이다/ 에서 추출한 state를 각각 보고, 어떤 state가 추론에 중요한지 판별한 후, 그 state를 중점으로 추론하는 방식이다.
여기서 새로운 개념이 세가지 정도 등장한다. 첫째로는 Encoder에서 모든 state의 저장이고 둘째로는 Decoder에서 저장된 모든 state를 참조하여 현재 추론에 중요한 embedding의 추론이고 셋째로는 추론한 중요 embedding을 바탕으로 output을 만드는 것이다.
첫번째와 세번째는 쉽고, 두번째가 가장 중요하다. 사실 중요 embedding을 선택한다는 문장을 사용하였지만, 학습을 위한 필요 과정인 미분이 선택 연산에 대해 불가능 하므로, 이를 미분이 가능하고, 중요도를 적용할 수 있는 어떠한 연산으로 대치해야한다. 따라서 이를 선택 문제가 아닌, 모든 embedding에 대한 가중치 예측 문제(Attention weight)로 바꾼다. 그리고 그 가중치에 따라 output를 적용한다. (Attention sum)
이렇게 시계열 데이터 크기에 따른 가변 state를 만들고, 그 state를 바탕으로 추론에서 집중해야할 embedding의 가중치를 뽑고 적용시키는 것이 attention이다. 이를 visualize하면 이러한 경향성을 매우 뚜렷하게 확인할 수 있다.
January를 01로 바꿀 때 Input sequence 중 Ja의 weight가 높은 것을 확인할 수 있고, 이에 따라 적절히 학습하였음을 확인할 수 있다.
3. Transformer
Transformer는 이러한 Attention을 적극활용한 모델이다. 잠시 기존 RNN 모델에 대해서 생각해보자. 추론과 학습이 이루어지기 위해서는 이전 상태값이 도출되어야 했다. 하지만 인공지능에서는 GPU를 활용한 병렬연산이 매우 중요한데, 이러한 순차적인 작업을 병렬연산으로 치환할 수 없기 때문에 기존 RNN이 문제가 되었고, 이러한 순차연산을 없애야 할 필요성이 제시되었다. 때문에 하나의 시계열 대이터 내에서 각 원소가 다른 원소들과 어떻게 관련되는지 알아보는 self attention을 이용하여 이러한 순차성을 없애 병령연산을 가능하게 한 것이 Transformer이다.
이러한 의도만 알고 Transformer에 대한 자세한 이해는 다음 포스팅에 이어 하겠다.