[Attention의 배경]
🧐 고전적인 Attention Algorithm
1. Feature Selection
- feature selection은 유용한 특징을 남기고 나머지는 제거하는 방법이다.
여기서 유용한 특징이란 예를 들어 분별력이 강한 특징 등을 말한다.
- 즉, feature selection은 분별력이 높은 특징에 "주목(attention)"한다 해석할 수 있다.
매우 원시적인, primitive한 attention이라 생각할 수 있다.
2. Saliency map
- 사람이 feature를 설계하는 방식(color, 명암, 방향 등등으로 saliency map 즉, 돌출맵을 설계)
- 사람이 눈으로 바라보는 곳을 추적하는 장치를 사용해 saliency map dataset을 구축하고 모델을 학습시켰다.
🧐 Attention Algorithm with Deep Learning
0. Computer Vision에서 Attention의 발전과정
cf. SENet (Squeeze-and-Excite Network)
Classification, Detection, Segmentation, Tracking 등의 신경망에 두루두루 적용할 수 있는데, 이는 dataset의 의도에 따라 attention이 적용되어 그에 맞게끔 학습이 되기 때문이다.SENet은 feature map의 어떤 channel에 주목(Attention)할 지 알아낸다.
- Attention이 없는 기존의 신경망은 mxnxk feature map에 convolution을 적용해 X로 표기된 m'xn'xk' feature map을 만들어 다음 층에 전달한다.
- SENet은 Squeeze와 Excite, Scale연산을 추가로 적용해 X를 X'으로 변환해 다음 층에 전달한다.
이때, X'은 더 중요한 channel이 강조된 feature map이다.
<Squeeze>
- GAP을 적용해 각 channel의 pixel평균을 계산, z 벡터의 해당 원소에 저장한다.
- z는 k'개 원소를 갖는 벡터가 된다.
<Excite>
- 2개의 Fully-Connected layer를 이용해 z를 적당한 크기로 줄이고 기존 크기의 s벡터로 복원한다.
이때, 줄이는 층에는 U1, 늘리는 층에는 U2 이라는 "학습으로 알아낸" 가중치를 사용한다.
<Scale>
- s를 channel별로 중요한 정도를 나타내는 벡터로 여긴다.
즉, n번원소가 0.2이고 m번원소가 0.4라면 m이 2배 더 중요하다 여긴다.
📌 Self-Attention
- 앞선 attention은 image의 중요부분에 더 큰 weight를 줘서 성능을 개선한다.
위의 그림은 self-attention을 개념적으로 설명한다.
즉, convolution층을 흐르는 feature map에 attention weight를 적용해 feature를 강조하거나 약화하는 것이다.
- Self-Attention은 image를 구성하는 element 상호 간의 attention을 결정한다.
- Attention의 경우, a~c는 큰 가중치, d~e는 낮은 가중치로 feature를 강조,약화시켜 성능향상을 하지만
- Self_Attention의 경우, 원반이 다른 위치에 주목하는 정도에 대한 선의 굵기로 표현되어있는데, 이는 원반에 해당하는 영역이 원반을 잡으려하는 개와 사람에 많이 주목하고 하늘이나 땅에는 별로 주목(attention)하지 않는다.
cf. Non-local Network
Non-local Network는 self-attention을 computer vision에 처음 도입한 모델이다. [Wang2018; https://arxiv.org/abs/1711.07971]
- 이 신경망은 아래 식으로 self-attention을 계산한다.
- output feature map y은 input feature map x와 같은 크기이다.
- yi는 x의 모든 위치의 값인 g(xj)의 가중치의 합이다.
- weight f(xi, xj)는 xi가 xj에 얼마나 주목해야하는지 나타내는 값이다.
즉, 위의 그림에서 빨간색 선의 굵기가 가중치에 해당한다.
- 보통 위의 식은 연산량이 많아서 convolution이 여러번 거친 후 7x7처럼 작아진 feature map에 적용한다.
이후 Transformer의 등장으로 아래와 같이 다양한 transformer model들이 등장한다.
∙Classification을 위한 ViT
∙Detection을 위한 DETR
∙Segmentation을 위한 SETR
∙Tracking을 위한 MOTR
📌 같은 구조의 Transformer로 위의 task들을 한번에 푸는 Swin
자연어의 경우, 단어가 나타나는 순서가 중요해서 시간개념이 중요하다.
[RNN과 LSTM] _ NLP
🧐 RNN (Recurrent Neural Network)
일반적으로 i의 단어는 그 이전에 발생한 i-1개 단어와 상호작용한다.
🧐 Long Term Dependency과 LSTM(Long Short-Term-Memory)
Long Range Dependency : RNN은 시간을 처리할 수 있는 능력을 갖추지만 길이가 긴 sample에는 한계가 있다.
hi는 1, 2, ..., i 순간에 발생하는 단어의 정보가 혼합되기에 오래된 단어의 정보는 희미해진다.
즉, 앞쪽단어와 멀리있는 단어가 밀접하게 상호작용하는 long-range dependency를 제대로 처리하지 못하는 문제가 발생한다.
LSTM : RNN을 개조해 long-term dependency를 처리하는 능력을 강화한다.
input과 output을 열거나 막는 gate를 두어 선별적으로 기억하는 기능으로 여닫는 정도를 조절한다.
이때, 여닫는 정도는 학습으로 알아낸 가중치로 결정된다.
[seq2seq ] _ NLP
🧐 seq2seq
seq2seq : Sequence to Sequence[Sutskever2014; https://arxiv.org/abs/1409.3215]의 혁신성은 "가변길이의 문장을 가변길이의 문장으로 변환"할 수 있다는 것이다.
ex) 한국어→영어로 번역 시, 둘의 문장길이가 달라 seq2seq model이 필요하다. - 학습 시 Decoder의 input부분과 output부분이 모두 동작한다.
즉, 정답에 해당하는 출력을 알려주는 교사강요(teacher forcing)방법을 사용한다.
- 예측 시 정답을 모르기 때문에 위의 회색표시한 input 부분을 제외하고 자기회귀(auto-regressive) 방식으로 동작한다.
자기회귀에서 <SOS>가 입력되면 첫 단어 'That'을 출력하고 'That'을 보고 그 다음 둘째 단어 'can't'를 출력한다.
즉, 이전에 출력된 단어를 보고 현재단어를 출력하는 일을 반복하며, 문장끝을 나타내는 <EOS>가 발생하면 멈춘다.
- 한계 : 가장 큰 문제는 encoder의 마지막 hidden state만 decoder에 전달한다는 점이다.
그림에서 보면 h5만 decoder로 전달된다.
따라서 encoder는 마지막 hidden state에 모든 정보를 압축해야하는 부담이 존재한다.
[query-key-value로 계산하는 attention] _ NLP
🧐 query-key-value
QKV : attention을 계산하는 방법을 여러가지인데, 최근에는 query가 key와 유사한 정도를 측정하고 유사성 정보를 가중치로 사용해 value를 가중합하는 방법을 주로 사용한다.
ex) f(xi, xj)의 xi와 xj가 query와 key에 해당하고, g(xj)가 value에 해당한다.
query와 key의 유사도 벡터 s는 벡터의 내적으로 계산한다 가정하며
attention 벡터 a는 유사도벡터 s에 softmax를 적용한 벡터이다.
이때, s = (s1, s2, s3, s4)이고 a = (0.1895, 0.1843, 0.4419, 0.1843)이 된다.
이제 a를 가중치로 사용해 value의 가중합을 구하면 context 벡터 c는
c = 0.1895*(1 2 5) + 0.1843*(1 1 5) + 0.4419*(3 2 4) + 0.1843*(6 1 2)
= (2.8053 1.6314 4.0052).
벡터의 차원을 d라 하면, q는 1xd행렬이고 K와 V는 nxd행렬이다.
이때, n은 key와 value가 갖는 벡터의 개수이다.
[seq2seq with Attention] _ NLP
seq2seq는 입력문장의 모든 정보를 encoder의 마지막 hidden state h5에 압축해 넣어야하는 부담이 있다.
Bahdanau는 아래 식의 attention을 이용해 decoder가 encoder의 모든 state(h1, h2, ... , h5)에 접근할 수 있게 허용하여 성능을 향상한다.[Bahdanau2014; https://arxiv.org/abs/1409.0473]
🧐 Bahdanau Attention
위의 seq2seq의 경우, decoder는 i=6일 때, encoder가 i=2일 때, 단어 '저절로'에 주목해야 'itself'라는 단어를 제대로 생성할 수 있다.
decoder가 i=6일 때, (.01 .9 .02 .03 .04)처럼 2번째 원소값이 큰 attention vector a를 생성하면 encoder의 두번째 단어 '저절로'에 더 주목할 수 있어 성능이 향상될 수 있다.
- 이에 대해 query, key, value가 무엇이 되어야 위와 같이 될 수 있는지 살펴보자.