2019년 7월 22일 월요일

논문 설명 - Transformer-XL : Attentive Language Models Beyond a Fixed-Length Context

이번 포스트에서는 Transformer-XL 모델에 대해 써보려고 합니다.

지난 포스트 이후 Universal Transformer 논문을 읽고 정리를 하려고 했으나 워낙 정리를 잘 해놓은 블로그가 있어서 패스하고, 설명이 별로 없었던 Transformer-XL에 대해 쓰려고 했는데, 이해가 잘 안가는 부분들이 많아서 계속 미루어졌습니다. 

그 후에, Transformer-XL을 활용한 XLNet이 나오면서 사람들이 좀 더 관심을 갖게 됐을 것 같은데, 여전히 XLNet에 대한 포스트만 많고, Transformer-XL에 대해서는 별로 없는 것 같습니다. 이 포스트가 Transformer XL 모델을 이해하려고 하는 분들에게 도움이 되길 바랍니다.

논문 정보


저자 : Zihang Dai, Zhilin Yang, Yiming Yang, Jaime Carbonell, Quoc V. Le, Ruslan Salakhutdinov

굉장히 유명한 연구자 두 명의 이름이 보이네요. Quoc V. Le, Ruslan Salakhutdinov!

글을 쓰면서 찾아보니 신기하게도 Universal Transformer는 ICLR 2019에 accept 되었는데, Transformer-XL은 안 됐네요. 쓰다보니 ACL 2019에 aceept된 걸로 나오네요.


요약


기존의 transformer는 고정된 개수의 token들을 갖는 한 개의 segment만을 input으로 사용하여, 연속된 segment들 간의 dependency를 반영하지 못했습니다. 이에 저자들은 현재 segment를 처리할 때, 이전 segment를 처리할 때 계산된 hidden state들을 사용하는 recurrence를 추가하여 이런 문제을 해결하고, 그에 맞게 positional encoding을 변형하였습니다. 이렇게 제안된 Transformer-XL은 Language Modeling에서 State-of-the-art의 성능을 기록하였습니다.


Introduction


Language Modeling task에 많이 쓰였던 RNN 계열의 LSTM은 보통 200 단어(step) 정도를 참고한다고 합니다. 많이 쓰이던 LSTM 외에도, attention을 활용하여 long-term dependency를 학습할 수 있고, 학습 속도와 성능도 개선된 transformer를 사용하여 language modeling을 수행한 시도도 있었습니다. Transformer를 활용하여 character-level language modeling을 수행한 결과 LSTM보다 훨씬 더 좋은 성능을 보였습니다(Al-Rfou el al).

하지만 기본적인 transformer 구조를 그대로 이용하면, input으로 사용되는 segment 안의 character들간의 dependency만 학습할 수 있고, segment 간의 dependency를 학습하지는 못합니다. 그리고 이런 segment들은 문장의 구분, 의미적인 구분이 없이 단순하게 character의 개수를 기준으로 분리되었습니다. 이로 인해 한 segment 안에서, 처음 몇 개의 character를 예측할 때 사용할 수 있는 정보들이 별로 없습니다. 이 문제를 저자들은 'context fragmentation'이라고 부릅니다.

이런 문제를 해결하기 위해 Transformer-XL이란 모델을 제안합니다. 이 모델은 기존의 self-attention 기반 모델에 recurrence 개념을 추가한 모델입니다. 새로운 segment의 hidden state를 계산할 때 이전 segment에서 계산한 hidden state를 이용합니다. 이렇게 재사용된 hidden state는 segment들을 recurrent하게 연결해주는 memory의 역할을 합니다. 그래서 segment들 간의 long-term dependency를 모델링할 수 있게 됩니다. 또한 이런 모델링으로 'context fragmentation' 문제를 해결할 수 있습니다. 그리고 이렇게 모델링하면 추후에 설명할 relative positional encoding이 필요합니다. Recurrence를 추가하는 것과 relative positional encoding은 독립적으로 적용되지 않고, 같이 쓰일 때 큰 의미를 갖습니다. 

이렇게 제안된 Transformer-XL은 character-level language modeling을 포함한 5개의 데이타셋에서 좋은 결과를 냈습니다. 또한 coherent한 긴 text를 만들어내는 것도 가능합니다.


모델 설명


Vanilla Transformer Language Model


위에서 설명한 것처럼 segment 단위로 language modeling을 학습하면, segment 크기를 넘어서는 long-term dependency를 학습할 수 없고, 문장이나 의미를 고려하지 않고 segment가 나눠지는 'context fragmentation' 문제가 발생합니다. 


추가적으로, 이런 방식은 학습이 끝나고 prediction을 수행할 때 중복된 연산이 많아집니다. Prediction 단계에서는 한 segment를 이용하여 segment의 맨 마지막 한 개의 위치에 올 token만 예측하게 됩니다 - [x1, x2, ... xt-1]을 이용하여 xt를 예측. 그리고 segment를 한 칸 옆으로 이동하여 그 다음 위치에 올 token을 예측하게 되는데 - [x2, x3 .. xt]을 이용하여 xt+1을 예측, 이 때 겹치는 token들에 대한 연산을 다시 수행해야 합니다. 아래 그림에서 표시된 부분은 총 3 번의 prediction 단계에서 중복된 연산을 수행하는 영역 - [x3, x4] - 을 나타냅니다.

이런 prediction 방법은 training 때와 달리 항상 segment 길이만큼의 context를 활용하여 다음 token을 예측하며 training을 할 때보다 'context fragmentation' 문제의 영향을 덜 받습니다. 하지만 그만큼 중복되는 연산량이 굉장히 많아집니다. Transformer-xl은 이런 연산량을 줄여 prediction의 속도도 빠르게 향상시킵니다.

Segment-Level Recurrence with State Reuse


이와 같은 문제들을 해결하기 위해 transformer 구조에 recurrence 메카니즘을 도입합니다. 학습 시에, 이전 segment를 처리할 때 계산된 hidden state를 사용합니다. 이전 segment의 hidden state를 활용하면 이전보다 더 긴 long-term dependency를 학습할 수 있게 됩니다.

첫번째 그림에서, x5 시점에서 다음을 예측할 때 x2, x3, x4의 hidden state들을 활용하는 것을 볼 수 있습니다. Recurrence 메카니즘이 없었다면 x5의 input만 참고하여 예측했을 것입니다. 이렇게 항상 segment의 max input개수만큼 예측에 참고할 수 있는 장점이 생깁니다.

이전 segment의 hidden state들이 다음 segment를 처리하기 위해 사용될 때는 gradient에 따라 학습시키지 않고 고정시킵니다. 이 때 학습되는 weight들은 현재 segment에 속한 weight들 뿐입니다.

학습 과정을 수식으로 나타내면 아래와 같습니다.
n : Layer의 층수
h_T : 길이가 L인 input [x_1, x_2 .. x_L]
h_T+1 : h_T의 뒤에 이어진 길이가 L인 input [x_L+1, x_L+2 .. x_L+L]
SG : stop-gradient
[h_u ㅇ h_v] : 두 hidden state를 concatenate.
수식에 나와 있듯 self-attention의 key, value를 계산할 때 이전 segment의 hidden state와 현재 segment의 hidden state를 concatenate하여 얻은 벡터를 이용합니다(h 위의 ~표시).

이런 recurrence 메커니즘은 segment 단위의 recurrence를 만들어냅니다. 그래서 필요한 context가 두 개의 segment를 넘어서서 여러 segment에 걸쳐 전파될 수 있습니다. 하지만 기존 RNN의 recurrence와 다른 점은, recurrence가 두 layer에 걸쳐서 만들어진다는 점입니다 - recurrence가 만들어질 때 layer의 층이 하나 증가합니다; RNN에서의 recurrence는 같은 층에서 만들어지죠. 그래서 가장 긴 dependency 길이가 N X L(N : layer 수, L : segment 길이)이 됩니다. 이 구조는 truncated BPTT를 이용한 RNN과 비슷합니다(BPTT에서 backpropagation time-step을 제한한 알고리즘) .

Recurrence를 활용하면 evaluation(prediction)이 훨씬 빨라집니다. Prediction 시, 이전 segment의 계산 결과를 저장해놓고 활용할 수 있기 때문에 매번 다시 계산할 필요가 없어집니다. 실제로 enwiki-8 데이터를 사용한 실험에서 vanilla 모델보다 1800배 이상 빠른 속도를 보여줬다고 합니다.


Relative Positional Encodings


Transformer 구조에 recurrence 메카니즘을 적용하면 문제가 하나 생깁니다. 바로 transformer 구조에 사용되는 포지션 정보를 어떻게 추가할 것인가 하는 문제입니다. 이전 segment에 사용된 포지션 정보가 현재 segment에도 변함없이 동일하게 적용되기 때문에 h_T[1](이전 segment의 첫번째 input)에 더해진 포지션 정보와 h_T+1[1](현재 segment의 첫번째 input)에 더해진 포지션 정보가 같습니다.

이 문제를 해결하기 위해 기존의 'absolute' 포지션 정보가 아닌 'relative' 포지션 정보를 주입합니다. 'Absolute' 포지션 정보는 현재 input token의 절대적 위치 - 첫번째, 20번째 같은 위치 - 에 대한 정보를 의미하며, 이 포지션 정보는 두 token 간의 attention을 계산할 때 활용됩니다.

Query인 Q와 Key인 K 사이의 attention을 Q^T * K - 수식 (1) - 로 계산하는데요,
여기서 Q = (E + U) * Wq, K = (E + U) * Wk로 얻을 수 있습니다. E는 토큰 임베딩이며 U는 포지션 정보입니다.
이걸 수식 (1)에 대입해보면
위와 같은 식을 얻고, U에 인코딩된 i번째, j번째 absolute 포지션 정보을 통해 두 단어 간의 위치 차이를 반영합니다.

'Absolute' 포지션 정보가 두 수의 차이를 계산하기 위해 a=1, b=2 이렇게 값을 지정하고 그 값으로 차이를 계산하는 방식이라면,  'relative' 포지션 정보는 두 수의 값과는 상관없이 두 수의 차이 값만 갖고 있는 방식입니다. a=1, b=2이든 a=5, b=6이든 상관없이 두 수(위치)의 차이가 1이라는 것만 알려주면 됩니다. 이 방식을 이용한 attention 계산을 수식으로 나타내면 아래와 같습니다.


위의 식에서 R이 'relative' 포지션 정보를 encoding한 matrix를 가리키며 기존에 쓰이던 U를 대체하고 있습니다. 아래 첨자로 표시되어 있듯이 i, j 두 위치의 차이에 대한 포지션 정보를 담고 있습니다. 그리고 R은 'Attention is all you need'에서 제안한 방식대로 학습되는 matrix가 아닌 sinusoid encoding matrix를 그대로 사용합니다.

추가적으로 벡터 형태의 u, v 파라미터가 도입되었습니다. 두 벡터는 query 단어의 위치와 상관없이 같은 값을 갖습니다. 절대 위치를 사용하지 않고, 상대 위치 정보는 R을 통해서만 알 수 있기 때문에 기존 A^abs을 구하는 식의 (c), (d)처럼 Ui * Wq를 계산할 필요가 없습니다(못합니다, 절대 위치 정보인 U가 없기 때문이죠.). 그래서 Ui * Wq를 u, v로 대신하였습니다.

그리고 Wk를 W_k,E와 W_k, R로 분리하였습니다. W_k, E는 token의 임베딩을 이용한 attention 계산에 쓰이고, W_k, R은 상대 위치 정보를 반영한 attention을 계산할 때 쓰입니다.

Technically, it expands the simple multiplication of the Attention Head’s Score (QiKj) to include four parts:  
  1. Content weight – the original score without the addition of the original positional encoding of course.
  2. Positional bias with respect to the current content (Qi). It uses a similar sinusoidal function that receives the distance between tokens (e.g. i-j), instead of the absolute position of the current token.
  3. A learned global content bias – The model adds a learned vector that adjusts the importance of the other token content (Kj).
  4. A learned global bias – Another learned vector that adjusts the importance based only on the distance between the tokens (e.g. the last previous words are probably more important than a word from a previous paragraph).
출처 : https://www.lyrn.ai/2019/01/16/transformer-xl-sota-language-model/

위 수식을 다시 묶으면 아래와 같습니다.
출처 : https://www.notion.so/Transformer-XL-Attentive-Language-Models-Beyond-a-Fixed-Length-Context-19-06-23-62ecd6bfb61b47d1aa3e3a3c91fe2bae

최종적인 Transformer-XL의 계산 과정은 아래와 같습니다.
위의 식에서 m_T는 현재 input segment T가 사용되기 이전에 T-1, T-2 등을 이용하여 이미 계산한 결과를 저장하는 메모리를 말합니다.


Experiments


Main Results



여러 데이터를 이용한 word-level, character-level language modeling에서 sota를 기록했습니다. 문장들이 섞여 있어 long-term dependency가 없는 One Billion Word dataset(table 4)에서도 가장 좋은 성능을 기록한 것이 인상적입니다.

Ablation Study


Transformer-XL에서 제시한 recurrence 메카니즘과 relational positional encoding의 효과를 알아보기 위해 ablation study를 진행했습니다.


Encoding 방법들의 종류는 총 3가지인데, 그 중에서 Saw et al.(2018)은 또다른 relative encoding 방식을 말하며, Vaswani et al.과 AlRfou et al.은 absolute encoding 방식을 뜻합니다.
Half loss는 segment의 뒤쪽 반에만 cross entropy loss를 적용했다는 것을 의미하는데요, absolute encoding 방식이 half loss를 사용했을 때는 잘 동작했다고 합니다. Attention을 조금밖에 사용하지 못한 앞쪽에서 생긴 loss를 제외시켰기 때문입니다. 사실 이 loss를 적용해 본 의미를 잘 모르겠네요.
PPL init은 training할 때 사용한 attention 길이를 evaluation할 때도 그대로 사용했다는 뜻이며, PPL best는 evaluation할 때 attention 길이(사용하는 context - input token의 길이)를 증가시켜가며 얻은 가장 좋은 결과를 의미합니다. 그리고 PPL best를 달성하기 위해 필요한 최소 attention 길이를 Attn Len으로 표기했습니다. 실제 training 시 사용된 attention 길이는 120입니다(글설명하는 글에는 128이라 되어 있는데, 표에는 120으로 되어 있네요;). Atten Len이 커진다는 것은 그만큼 evaluation 시 많은 context를 반영하여 성능을 높일 수 있다는 뜻입니다.

첫번째 실험과 그 다음 실험을 비교해보면, 이 논문에서 제시된 relative positional encoding 방식이 얼마나 효과적인가를 알 수 있습니다. Attn Len이 많이 차이가 나는 것을 볼 수 있습니다. 그리고 전반적으로 recurrence 메카니즘이 적용됐을 때 성능이 개선된 것을 알 수 있습니다.
맨 마지막 블럭을 보면 evaluation 시 attention 길이를 증가시키면 PPL best도 좋아지는 것을 볼 수 있습니다.

Transformer-XL은 recurrence 메카니즘으로 인해 더 많은 메모리가 필요하게 되는데요, 같은 메모리를 사용하도록 제한된 상황에서도 recurrence를 사용한 모델이 더 좋은 성능을 보여주었습니다.



Relative Effective Context Length


기존의 Effective Context Length(ECL)의 문제점을 개선한 RECL이란 평가 지표를 제안합니다. ECL은 context 길이를 늘려가면서 일정 threshold 이상 성능이 증가하는지를 확인하고, 성능 향상이 멈췄을 때의 context 길이를 말합니다.

이 지표의 문제점은 "ECL ignores the fact that it is harder to get improvement when a model already achieves a lower perplexity using only a shorter context, and thus it is not suitable for fair comparison among multiple models" 이라고 합니다. "한 모델이 짧은 context만 갖고 lower perplexity를 달성했다면 더 이상 성능 향상이 어렵고, 이 때문에 여러 모델 간의 공정한 비교가 어렵다." 즉, 모델마다의 특성이 있기 때문에 모델마다 다른 값을 가지며, 비교 지표로 삼기 어렵다 라는 뜻 같습니다. 아마 어떤 모델의 ECL이 길다고 해서 꼭 성능이 좋은 것은 아니다라는 뜻인 것 같습니다.
대충 무슨 말인지 잘 모르겠다는 말입니다ㅜㅜ 앞뒤 문장이 어떻게 'thus'로 이어지는지... 비교 지표로 적합하지 않다라는 말만 알아듣겠네요.

아무튼! 이에 저자들은 비교 대상인 여러 모델들에게 공통적으로 적용할 수 있는 지표인 Relative Effective Context Length를 제안합니다. 수식이 좀 복잡하여 제외하였지만, 비교 대상인 모델들 가운데 가장 좋은 성능을 공통의 평가 지표로 삼아 context length를 늘릴 수 있는지 없는지를 판단합니다.
파라미터 r은 전체 전체 토큰들 중 loss를 계산하는 데 사용할 토큰의 비율을 나타내며, loss 값이 가장 큰 토큰들을 우선하여 선택합니다. 첫번째 비교군은 {Transformer-XL, QRNN, LSTM}이며, 두번째 비교군은 {Transformer-XL, 기존 구조에서 인코딩 방식 변경, 기존 구조에서 recurrence만 제거, Transformer}입니다. 비교군끼리는 같은 수의 파라미터를 가졌으며, 그룹이 다른 모델들 간의 비교보다는 그룹 내의 모델들끼리의 비교가 중요한 것 같습니다.


여러 모델들 중 Transformer-XL의 RECL이 가장 길었으며, relative positional encoding과 recurrence 메카니즘의 효과도 알아볼 수 있는 실험이었습니다.



참고 사이트

Tae Hwan's TIL Paper(or etc.) :
https://www.notion.so/Transformer-XL-Attentive-Language-Models-Beyond-a-Fixed-Length-Context-19-06-23-62ecd6bfb61b47d1aa3e3a3c91fe2bae

LyrnAI Deep Learning explained :
https://www.lyrn.ai/2019/01/16/transformer-xl-sota-language-model/

AI Information
https://ai-information.blogspot.com/2019/06/nl-040-transformer-xl-attentive.html