[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연산을 추가로 적용해 XX'으로 변환해 다음 층에 전달한다.
이때, 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를 줘서 성능을 개선한다.
즉, convolution층을 흐르는 feature map에 attention weight를 적용해 feature를 강조하거나 약화하는 것이다.

- Self-Attention은 image를 구성하는 element 상호 간의 attention을 결정한다.

위의 그림은 self-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

 

 

 

 

 

 

 

 

 

 

 

자연어의 경우, 단어가 나타나는 순서가 중요해서 시간개념이 중요하다.

[RNNLSTM] _ NLP

 

🧐  RNN (Recurrent Neural Network)

일반적으로 i의 단어는 그 이전에 발생한 i-1개 단어와 상호작용한다.
RNN




 

 

🧐  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를 가중합하는 방법을 주로 사용한다.

Non-local Neural Network
ex) f(xi, xj)의 xi와 xj가 query와 key에 해당하고, g(xj)가 value에 해당한다.


query-key-value로 attention 계산하기

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행렬이고 KVnxd행렬이다.
이때, 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가 무엇이 되어야 위와 같이 될 수 있는지 살펴보자.

 

 

+ Recent posts