-
1. Attention A to N까지(feat. Transformer)NN 2021. 7. 4. 00:12
안녕하세요. 조쉬입니다.
혹시 attention이라는 가중치 산출 방식을 들어보신 적이 있으신가요? Black Box라고 취급당하는 NN계열의 모델들을 해석이 어느 정도나마 가능하도록 방안을 제시해준 방식입니다. 단순이 모델이 예측만 잘하는 것이 아니라 비즈니스적으로 해석하는 것도 중요하다고 생각하는 요즘 머신러닝의 XAI(eXplainable AI)와 더불어 비슷한 용도로 활용이 될 수 있는 NN 구조라고 생각합니다. 또한 Attention이 포함된 2017년도에 소개된 Transformer라는 알고리즘 구조 덕에 자연어 처리 및 활용에 지평이 넓어지고 있기도 하여 딥러닝을 알아갈 때 중요한 메커니즘이라 생각이 들어 소개해보려 합니다. 순서대로 attention의 작동 방식과 transformer에 대해서 간단히 알아보고자 합니다. 논문 링크는 아래를 참고해주세요.
Attention !!?!!
말로 설명하자면 아웃풋에 대한 인풋 내의 중요도라고 할 수 있습니다. 위의 그림을 보시면 오른쪽의 문장에서 특정 단어를 선택하였을 경우, 왼쪽의 문장에서 어느 단어들이 가장 높은 점수를 얻었는지 계산을 하게 됩니다. "나는 학생입니다."를 "I am a student."로 변경을 하는 로직을 구성한다고 가정하겠습니다. "나"는 "I"와의 영향이 클 것이며, "학생"은 "student"에 영향이 클 것입니다. 이러한 sequence 내부의 element들 간의 영향력을 디테일하게 확인할 수 있게 한 것이 attention입니다.
우선 attention이 빠진 seq2seq와 attention이 적용 된 seq2seq를 비교하여 보겠습니다.
source: https://lovit.github.io/machine%20learning/2019/03/17/attention_in_nlp/ [A B C]가 input sequence이고 [w x y z]가 output sequence인 seq2seq 모델입니다. input을 학습하는 encoder RNN과 output을 학습하는 decoder RNN이 공존하는 모델을 확인하실 수가 있습니다. Encoder RNN의 마지막 hidden state를 context vector로 인식한 뒤 해당 벡터를 input으로 받아 decoder RNN이 작동을 하게 됩니다. 여기서 context vector는 한정된 길이의 벡터입니다.
Bahdanau et al., (2014)에서는 이러한 context vector 만 decoder RNN에서 사용하는 부분에 대하여 초기 input sequence의 정보가 지나치게 함축이 되어있다고 판단하여 단어별 가중치를 표현해줄 벡터를 고안하였습니다. 이에 따라 마지막 hidden state만 사용하는 것이 아닌 모든 hidden state vector들을 조합하여 decoder RNN의 시점 별로 input sequence의 가중치를 다르게 계산하는 방법이 탄생을 하게 되었습니다.
Dictionary 자료형을 보면 dict = {"Variable A": "ABC", "Variable B":"DEF"}에서 Key는 Variable A, B이며 해당하는 Value값들은 ABC, DEF가 됩니다.
이와 비슷하게 attention의 기본 요소는 Query, Key, Value입니다. Attention은 주어진 Query에 대한 모든 Key와의 유사도를 각각 구합니다. 그리고 산출된 유사도를 Key와 1:1로 mapping 되어 있는 Value에 반영한 뒤 리턴한 Value를 Attention Value라고 합니다.
Attention 계산하기
source: https://lovit.github.io/machine%20learning/2019/03/17/attention_in_nlp/ 위의 seq2seq 모델은 encoder RNN에 총 3 time step(시점)이 있습니다.
1. 각각의 시점에서의 hidden state(h_j)를 h1, h2, h3라고 하겠습니다. Deconder RNN이 각 time step의 산출물을 y_i라고 정의하고, 이를 산출하기 위해 encoder RNN의 hidden state를 얼마나 이용할지에 대한 값을 a_ij라고 정의하겠습니다.
2. y_i에 대한 context vector c_i는 sigma_j(h_j * a_ij) 이며 sigma_j(a_ij)의 합은 1이며 a_ij >= 0입니다.
3. a_ij를 attention weight라고 하며 NN(feed-forward)에 의해 학습이 되는 방식입니다. 여기서 feed_forward network는 1개의 layer로 구성되어 있습니다.
4. Decoder RNN의 s_i-1과 Encoder RNN의 h_j가 동시에 input으로 feed-forward network를 타고 나오는 결과물이 attention weight이며 softmax 변환을 통해 scaling 된 확률 값으로 나옵니다. 즉, context vector c_i가 생성됩니다.
source: https://lovit.github.io/machine%20learning/2019/03/17/attention_in_nlp/
Transformer (self.attention) 🤖
Attention을 활용하여 RNN을 활용한 모델들이 여러 방면으로 진화를 하게 되었습니다. 하지만 RNN의 태생적인 특징 때문인지 모두 비슷한 단점을 보유하고 있습니다. RNN은 sequence에 기반한 알고리즘이기 때문에 첫 시점부터 마지막 시점까지 모두 계산이 완료가 되어야지 이후의 단계가 진행될 수 있습니다.
(어찌 무산소와 유산소를 동시에 할 수 있겠습니까?)특히 NN 구조상 Back Propagation을 통한 weight와 gradient 산출을 진행하기 위해서는 각 시점에 대한 정보가 모두 존재해야 합니다. Long dependency 학습이 취약하며 병렬적 구조가 아니기 때문에 계산 자원상 손해를 보게 되는 단점도 존재합니다.source: https://arxiv.org/pdf/1706.03762.pdf Self attention은 이를 해결하기 위해 나온 방법입니다. Transformer는 encoder block와 decoder block이 각각 6개가 stack 되어있는 구조입니다. Transformer가 input sequence를 입력받았을 때 제일 처음 하는 행동은 해당 sequence를 input embedding과 positional embedding을 통하여 query, key, value 세 개의 차원으로 변환시키는 것입니다.
1. Encoder
Transformer에서 encoder block은 Multi-Head Attention와 Feed-Forward로 구성됩니다.
source: https://arxiv.org/pdf/1706.03762.pdf Multi-Head Attention은 Attention을 병렬적으로 합쳐놓은 구조입니다. h개의 attention 구조를 합쳤다고 가정할 때 h개의 다른 관점의 attention을 학습시킬 수 있다는 장점이 있습니다. 각 어텐션 헤드 당 8차원의 결과물이 나오고, 총 8개의 헤드가 있다고 가정을 하게 되면 최종 결과는 8*8 = 64차원이 생성이 됩니다. 이때 분할 계산 방식이 한 번에 계산하는 방식보다 계산 자원을 덜 사용한다는 이점이 있습니다. 각각의 attention은 scaled dot project attention으로 진행이 됩니다.
source: https://arxiv.org/pdf/1706.03762.pdf 각각의 query와 key가 d_k개의 차원을 가진다고 가정하였을 때, 해당 query에 대한 모든 key값들을 dot product 연산을 하여 d_k 제곱근으로 나누어 준 뒤 softmax 처리를 하여 Value와 곱해준 값이 최종 attention matrix가 됩니다. 수식은 다음과 같습니다.
source: https://arxiv.org/pdf/1706.03762.pdf 사용성이 좋은 attention 함수는 다음과 같습니다.
1) Additive attention: 단일 hidden layer의 feed-forward 네트워크를 사용하여 호환성 함수를 계산합니다. 가 작을 때 성능이 더 좋습니다.
2) Dot-product attention: 가 더 클 때는 빠른 행렬곱 알고리즘에 힘입어 더 빠르고 더 공간 효율적인 계산이 가능합니다.
2. Position-wise Feed-Forward Networks
인코터와 디코더는 각각 Feed-forward Network를 포함하는데 이는 2개의 ReLU activation function과 2개의 linear transformation을 포함합니다. 수식은 다음과 같습니다.
source: https://arxiv.org/pdf/1706.03762.pdf Linear Transformation은 다른 포지션에 대하여 같게 적용이 되지만, layer마다 서로 다른 파라미터들을 사용하게 됩니다.
3. Embedding and Softmax
여타 다른 sequence transduction model과 같이 학습된 embedding을 통하여 input과 output token을 d_model 차원의 벡터로 변환하였습니다. 학습된 linear transformation과 softmax function을 통하여 decoder output을 변환한 뒤 이후 시점의 token 확률을 예측하도록 하였습니다. 해당 모델에서는 2개의 embedding layer와 pre_softmax linear transformation에서 동일한 가중치 matrix를 사용했습니다. 그리고 embedding layer에서는 가중치에 (d_model)^(1/2)를 곱하여 사용하였습니다.
4. Positional Encoding
RNN과 CNN 구조가 사용된 모델이 아니기에 sequence의 위치 정보를 추가해줘야 합니다. 이에 따라 encoder와 decoder block 앞단에 positional encoding 방식을 추가하게 되었습니다. Embedding과 동일하게 d_model개의 차원을 가지게 되며 해당 모델에서는 싸인과 코싸인 함수를 활용하였습니다. 수식은 다음과 같습니다. 여기서 pos는 위치, i는 차원을 뜻합니다.
source: https://arxiv.org/pdf/1706.03762.pdf 5. Self-Attention
seq2seq 구조에 self-attention이 적합한 이유를 필자는 다음과 같이 서술합니다.
1. layer 당 전체 계산량이 적다
2. 계산이 병렬화될 수 있다. 즉 병렬적으로 한 번에 많은 계산을 할 수 있는데, recurrence의 경우 순차적으로 계산해야 하기 때문에 계산의 병렬화가 거의 불가능하다.
3. 장거리 의존성(long-range 또는 long-term dependency) 때문이다.또한 일반 Attention layer와 비교한 self-attention의 장점은 다음과 같습니다.
1. 보다 다른 위치와의 영향을 찾는 것에 집중을 할 수 있게 한다.
2. Multi-Head 구조를 통하여 다수의 representation subspace를 가질 수 있다.
이와 같은 구조를 통하여 분류 및 다양한 task에서 모델의 판단에 대한 근거로 attention score를 제시하는 것이 가능하게 되었습니다. 이후에 나온 발전된 자연어 처리 모델들에서 transformer 구조를 꾸준하게 사용하고 있는 것으로 보아 아직은 그 활용가치를 톡톡히 해내고 있는 알고리즘이라 생각됩니다. 다음 주제는 다시 기초로 돌아가 NN의 기초 작동 방식과 기초 구조에 대해서 알아보도록 하겠습니다.
참고자료
- https://arxiv.org/pdf/1706.03762.pdf
- https://lovit.github.io/machine%20learning/2019/03/17/attention_in_nlp/
Attention mechanism in NLP. From seq2seq + attention to BERT
Word2Vec 을 제안한 Mikolov 는 “딥러닝을 이용한 자연어처리의 발전은 단어 임베딩 (word embedding) 때문이다”라는 말을 했습니다. 단어 간의 유사성을 표현할 수 있고, 단어를 연속적인 벡터 공간 (co
lovit.github.io
위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
wikidocs.net
- https://www.aclweb.org/anthology/2020.acl-main.312.pdf
- https://wdprogrammer.tistory.com/72
[NLP] Transformer 모델 분석 (Self-Attention)
transformer 현재 Attention is All you Need는 NLP를 한다면 반드시 읽어야 될 논문일 뿐만 아니라 인공지능을 연구한다면 반드시 읽어봐야 할 논문이 되었다. 꽤 오래 전에 읽고 정리해놓은 내용을 기억을
wdprogrammer.tistory.com
Python, Machine & Deep Learning
Python, Machine Learning & Deep Learning
greeksharifa.github.io
- https://arxiv.org/abs/1810.04805
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
We introduce a new language representation model called BERT, which stands for Bidirectional Encoder Representations from Transformers. Unlike recent language representation models, BERT is designed to pre-train deep bidirectional representations from unla
arxiv.org
'NN' 카테고리의 다른 글
6. Temporal Fusion Transformers (0) 2021.12.30 5. TabNet (0) 2021.12.28 4. CNN과 Computer Vision (0) 2021.11.14 3. Neural Network 기초-2 (개념과 구조) (0) 2021.10.09 2. Neural Network 기초-1 ( 데이터 정의 및 활성함수) (0) 2021.09.12