이 글은 Attention 에 대해 직관적으로 이해하고 이해한 바를 잊지 않기 위해 여러 글을 참고하여 작성 / 정리해둔 글입니다.
1. Attention 배경
Seq2Seq?
RNN은 출력이 바로 이전 입력까지만 고려해서 정확도가 떨어진다. 전체 입력 문장을 고려하지 않고 다음 문장을 생성하기 때문이다. 그래서 등장하게된 것이 seq2seq.
Seq2Seq Network [Encoder Decoder Network] 는 두 개의 RNN [1D CNN도 가능] 으로 구성된 모델이다.
1) Encoder 는 입력 시퀀스를 읽고 단일 벡터[Context Vector]를 출력한다.
2) Decoder 는 이 Context Vector를 읽어 출력 시퀀스를 생성한다.
Seq2Seq 추론 방식
1) 입력 시퀀스 -> 상태 벡터로 변환
2) 크기가 1인 목표 시퀀스로 시작 [시퀀스의 시작 문자에만 해당]
3) 상태 벡터들과 크기가 1인 목표 시퀀스를 decoder에 넣어 다음 문자에 대한 예측치 생성
4) 예측치들 사용하여 다음 문자의 표본 출력 [argmax 사용]
5) 목표 시퀀스에 샘플링된 문자 붙임
Seq2Seq 장점
모든 입력에 해당하는 출력이 있는 단일 RNN의 시퀀스 예측과 달리 Seq2Seq 모델은 시퀀스 길이와 순서를 자유롭게 하여 서로 다른 도메임으로 변환 [ex. 두 언어간의 번역] 과 같은 task에 활용하기 좋다. 또한 전체 input을 살펴본 후, 임의의 context vector [고정된 사이즈의 벡터] 를 출력하는 형태는 전체적인 맥락을 파악한다는 의미이다.
RNN에 기반한 seq2seq 모델에는 크게 두 가지 문제가 있다.
1) 하나의 고정된 크기의 벡터에 모든 정보를 압축하려다 보니 정보 손실이 발생한다.
2) RNN의 고질적인 문제인 기울기 소실 [vanishing gradient] 문제가 존재한다.
이 두 가지 문제는 기계 번역 분야에서 입력 문장이 길면 번역 품질이 떨어지는 현상으로 나타났다. 이를 위한 대안으로 입력 시퀀스가 길어지면 출력 시퀀스의 정확도가 떨어지는 것을 보정해주기 위해 중요한 단어에 집중하여 디코더에 바로 전달하는 Attention이 나오게 되었다.
[Attention이 처음 나오게 된 배경은 "Many-to-many" 중 "기계 번역" task 를 더 잘 풀기 위함이다.]
Attention을 Sparse하게 가져갈 것인지, Hard하게 가져갈 것인지에 따라 모델이 다르고, Attention을 이미지에 적용할 수도, 그래프에 적용할 수도 있다. Attention에 관련된 연구로, Attention 개념을 제공한 연구[Bahdanau Attention]와 Attention 개념을 깔끔하게 정립한 연구[Luong Attention]이 있다. 두 논문 또한 리뷰를 작성할 예정이다.
2. Attention 아이디어
기본 아이디어는 디코더에서 출력 단어를 예측하는 매 시점[step]마다, 인코더의 입력 시퀀스를 다시 참고하는 것이다. 단, 전체 입력 시퀀스를 동일한 비율로 참고하는 것이 아닌, 해당 시점에서 예측해야 하는 단어와 관련이 있는 입력 단어에 집중하여 보게 된다.
3. Attention 작동 방법
$Attention(Q, K, V) = Attention value$
seq2seq + attention 모델에서 Q, K, V 는 다음과 같다.
$Q : Query$ : t 시점의 디코더 셀에서의 은닉 상태
$K : Key$ : 모든 시점의 인코더 셀의 은닉 상태들
$V : Value$ : 모든 시점의 인코더 셀의 은닉 상태들
주어진 Query에 대해 모든 Key의 유사도를 각각 구한다. 이 유사도를 Key와 매핑되어 있는 각각의 Value에 반영해준다. 그 후 유사도가 반영된 Value를 모두 더해서 리턴한다. 이 값을 어텐션 값이라고 한다.
4. Attention 종류 / Dot-Product Attention 이해
seq2seq + 어텐션 모델에 쓰일 수 있는 어텐션의 종류가 다양한데 이는 중간 수식[어텐션 스코어 함수]의 차이로 나눠진다.
이 중 가장 간단한 Dot-Product Attention 을 예시로 꼼꼼하게 보려고 한다.
Dot-Product Attention [닷-프로덕트 어텐션] : 어텐션 스코어를 구하는 방법이 내적
위 그림에서 디코더의 첫번째, 두번째 LSTM 셀은 이미 어텐션 메커니즘을 통해 je와 suis를 예측하는 과정을 거쳤다고 가정한다.
디코더의 세번째 LSTM 셀은 출력 단어를 예측하기 위해서 인코더의 모든 입력 단어들의 정보를 다시 한 번 참고한다. 이 때 주목해야 하는 부분은 인코더의 소프트맥스 함수이다. 소프트맥스 함수를 통해 나온 값은 I, am, a, student 단어 각각이 출력 단어를 예측할 때 얼마나 도움이 되는지의 정도를 수치화한 값이다. [위의 그림에서는 빨간 히스토그램의 크기로 소프트맥스 함수의 결과값의 크기를 표현했다. 그 크기가 클수록 도움이 되는 정도의 크기가 크다.] 각 입력 단어가 디코더의 예측에 도움이 되는 정도가 수치화하여 측정되면 이를 하나의 정보로 담아서 디코더로 전송된다. [위의 그림에서는 초록색 삼각형이 이에 해당된다.] 즉, 디코더가 새로운 단어를 예측하는데 있어서 Recurrent하게 전달된 정보 외에도 input sequence의 정보를 참고할 수 있게 된다.
인코더의 시점 [time step] 을 각각 1, 2, .... N 이라고 했을 때,
$h_t$ : t 시점에서 encoder의 hidden state
$s_t$ : t 시점에서 decoder의 hidden state
만약 Attention 기법을 사용하지 않는다면 디코더의 time step $t$ 에서 새로운 단어를 예측하기 위해 이전 step의 hidden state인 $s_{t-1}$ 와 이전 step의 output $\hat{y}_{t-1}$ 총 2개가 필요하다.
Attention 기법을 사용할 경우 위의 2개와 더불어 Attention value $a_t$ 를 추가로 필요하다.
$a_t$ 를 구하려면?
1) $h_t$ , $s_t$ 를 활용하여 Attention Score[$e_t$] 를 구한다.
2) softmax 를 활용해 Attention Distribution 을 구한다.
3) 인코더에서 2번에서 구한 분포를 토대로 결정한 가중치와 hidden state를 가중합하여 Attention Value $a_t$ 를 구한다.
1) Attention Score 를 구한다.
Attention Score 란 현재 디코더의 시점 t에서 새로운 단어를 예측하기 위해, 인코더의 모든 은닉 상태 각각[$h_1$ ~ $h_N$] 이 디코더의 현 시점의 은닉 상태 $s_t$ 와 얼마나 유사한지를 판단하는 점수이다.
Dot-Product Attention 의 경우 Attention Score 는 아래 식으로 결정된다.
$score(s_t, h_i) = s^T_th_i$ -> 이 때 결과 값은 scalar가 된다.
디코더의 time step 은 $t$ 인 반면, 참고하는 인코더의 time step 은 1~N 까지 있기 때문에, 인코더의 모든 은닉 상태에 대해 계산하면 아래와 같다.
$e^t = [s_t^Th_1, ... , s_T^Th_N]$ -> $e^t$ 는 attention score의 모음값을 뜻함
2) Softmax 함수를 통해 Attention Distribution을 구한다.
위에서 얻은 Attention Score $e^t$ 에 softmax 함수를 적용하여, 모든 값의 합이 1이 되는 확률 분포 [Attention Distribution] 을 얻는다. 이 때 각각의 값은 Attention Weight [어텐션 가중치] 라고 한다. 이 부분을 식으로 나타내면 다음과 같다.
$\alpha^t = softmax(e^t)$
3) 인코더의 각 Attention Weight 와 그에 대응하는 hidden state 를 가중합하여 Attention Values 를 구한다.
위에서 구한 각 인코더의 Attentin Weight 와 각 hidden state 를 통해 최종적인 Attention Value $\alpha_t$ 를 얻는다.
$a_t = \sum_{i=1}^{N}\alpha^t_ih_i$
이 때 $a_t$는 인코더의 맥락을 포함하고 있기 때문에 Context vector [맥락 벡터] 라고도 불린다. [정확히는 decoder 내 time step 의 context vector 이며, seq2seq 에서는 인코더의 마지막 은닉 상태를 Context vector 라고 부르는 것과 비교 가능]
4) 어텐션 값과 디코더의 t 시점의 은닉 상태를 연결[Concatenate] 한다.
위에서 구한 $a_t$ 를 단순하게 디코더의 t 시점의 hidden state $s_t$ 와 연결[concatenate] 해준다. 연결한 벡터를 $v_t$ 라고 가정하면, $v_t$ 는 기존의 Recurrent 하게 얻은 디코더의 hidden state 정보 외에도 인코더에서의 모든 hidden state 를 고려한 정보 또한 포함하고 있기 때문에, 이 $v_t$ 를 $\hat{y}$ 예측 연산의 입력으로 사용할 때 sequence 가 길어지더라도 정보를 크게 소실하지 않는다.
* 단 참고한 연구에서는 $v_t$ 에서 $\hat{y}$ 를 바로 반환하는 것이 아닌, 추가적인 신경망 연산을 통해 차원을 다시 $s_t$ 와 맞춰준 다음 $\hat{y}$ 를 반환한다.
5) 출력층 연산의 input이 되는 $\widetilde{s}_t$ 를 계산하고 최종 예측 $\hat{y}_t$ 를 얻는다.
$\widetilde{s}_t = tanh(W_c[a_t; s_t] + b_c)$
$W_c$ 는 학습 가능한 가중치 행렬이고, $b_c$ 는 편향이다. 위에서 구한 $v_t$ 가 $v_t = [a_t ; s_t]$ 의 형태로 들어간다. ';' 는 concat을 나타낸다. [그림에서 편향은 제외하였다.]
이렇게 구한 $\widetilde{s}_t$ 를 출력층의 입력으로 사용하여 예측 벡터를 얻는다.
$\hat{y}_t = Softmax(W_y\widetilde{s}_t + b_y)$
5. 참고
[개념정리] Attention Mechanism
Transformer의 기반이 되는 Attention 기법에 대해 정리한 글입니다.
velog.io
밑바닥부터 이해하는 어텐션 메커니즘(Attention Mechanism)
glee1228@naver.com 며칠 전부터 포항공대 한보형 교수팀과 구글 콜라보의 논문인 Large-Scale Image Retrieval with Attentive Deep Local Features, 이른바 DELF(Deep Local Feature) 로 잘 알려진 논문을 보기 시작했습니다.
glee1228.tistory.com
15-01 어텐션 메커니즘 (Attention Mechanism)
앞서 배운 seq2seq 모델은 **인코더**에서 입력 시퀀스를 컨텍스트 벡터라는 하나의 고정된 크기의 벡터 표현으로 압축하고, **디코더**는 이 컨텍스트 벡터를 통해서 출력 …
wikidocs.net
Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)
Translations: Chinese (Simplified), French, Japanese, Korean, Persian, Russian, Turkish, Uzbek Watch: MIT’s Deep Learning State of the Art lecture referencing this post May 25th update: New graphics (RNN animation, word embedding graph), color coding, el
jalammar.github.io
'ML-DL > LLM' 카테고리의 다른 글
Transformer Model [트랜스포머 모델] 정리 - [3] (1) | 2024.10.28 |
---|---|
Transformer Model [트랜스포머 모델] 정리 - [2] (4) | 2024.10.28 |
DPO [Direct Preference Optimization] 이란? (1) | 2024.10.26 |
Transformer Model [트랜스포머 모델] 정리 - [1] (3) | 2024.09.18 |
Retrieval-Augmented Generation : RAG 란 ? (3) | 2024.09.04 |