어텐션 메커니즘이란, 트랜스포머의 기반이 되는 모델이자, seq2seq의 단점을 보완할 수 있는 개념이다.
멀수록 잊혀진다(decoder) --- > 갈수록 흐려지는 정보에 ATTNETION하자!!
seq2seq 모델은 기존 RNN과 같이 고정된 길이의 벡터를 입력으로 받아 고정된 길이의 벡터를 출력하는 구조를 갖고 있음
이 구조는 시퀀스 길이가 길어질수록 정보 손실이 발생함!
이러한 한계를 보완하기 위해 Attention Mechanism이 도입되었다.
어텐션 메커니즘은 입력 문장의 모든 단어를 동일한 가중치로 취급하지 않고, 출력 문장에서 특정 위치에 대응하는 입력 단어들에 더 많은 가중치를 부여하는 원리로 만들어졌다.
이를 통해 입/출력의 길이가 달라도 모델이 상대적으로 더 정확하고 유연하다고 볼 수 있다.
seq2seq
인코더: 입력 시퀀스를 context vector라는 하나의 고정된 크기의 벡터 표현으로 압축
디코더: 이 context vector를 통해서 출력 시퀀스를 만들어냄
문제점: 1 - 하나의 고정된 크기의 벡터에 모든 정보를 압축하려고 하다보니 정보 손실 발생!
2 - RNN의 고질적인 문제인 기울기 소실이 존재!\
1. 어텐션의 기본 아이디어
어텐션의 기본 아이디어는 디코더에서 출력 단어를 예측하는 매 시점(time step)마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고한다는 점이다.
단, 전체 입력 문장을 전부 다 동일한 비율로 참고하는 것이 아니라, 해당 시점에서 예측해야할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중(attention)해서 보는 것이다.
중요하니까 자세히..!!
디코더(Decoder)에서 출력 단어를 예측하는 매 시점(time step)마다 인코더(Encoder)에서의 전체 입력 문장(sequence)을 다시 한 번 참고한다는 것..
단, 전체 입력 sequence를 참고하는게 아니라 해당 시점에서 예측해야할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중해서 보겠다는 것이다.
2. 어텐션 함수(Attention Function)
파이썬의 딕셔너리 함수를 떠올려보자. key-value, 쌍으로 이루어진 자료형이다.
이 딕셔너리 자료형은 키를 통해서 매핑된 값을 바로 찾아낼 수 있다는 특징을 갖고 있다.
dict = {"2017" : "Transformer", "2018" : "BERT"}의 경우, 2017은 키, Transformer은 값(value)에 해당한다.
이 개념을 통해서 어텐션 함수에 대해서 그림을 통해 알아보자.
어텐션을 함수로 표현하면 주로 다음과 같이 표현할 수 있다.
Attention(Q, K, V) = Attention Value
어텐션 함수는 주어진 '쿼리(Query)'에 대해서 모든 '키(Key)'와의 ★ 유사도를 각각 구한다. ★
그리고 구해낸 이 유사도를 키와 매핑되어있는 각각의 값에 반영하고 유사도가 반영된 값을 모두 더해서 리턴.
여기서는 이를 어텐션 값(Attention Value)이라고 하고, 지금부터 배우게 되는 seq2seq + 어텐션 모델에서 Q, K, V에 해당되는 각각의 Query, Keys, Values는 각각 다음과 같다.
Q = Query : t 시점의 디코더 셀에서의 은닉 상태
K = Keys : 모든 시점의 인코더 셀의 은닉 상태들
V = Values : 모든 시점의 인코더 셀의 은닉 상태들
Attention 모델은 인코더 층은 seq2seq층과 동일하지만 디코더 층에서 차이가 남.
디코더 층에서는 RNN계열 층을 지나고 Attention 층을 지나는데 이때 Attention층에서는 시점마다 RNN계열층의 은닉상태(Quary)와 인코더에서의 전체 입력 시퀀스 정보(Key, Value)를 다시 한번 참고한다.
✅ 쿼리 (Query)
• 쿼리는 어텐션 메커니즘에서 주목할 대상을 나타내는 정보
• 쿼리는 보통 출력 시퀀스의 현재 위치 또는 상태와 관련이 있으며, 어텐션 메커니즘을 통해 중요한 입력 요소를 찾는 데 사용
• 기계 번역에서 디코더의 현재 출력 단어에 해당하는 쿼리가 사용될 수 있으며, 이 쿼리는 입력 문장의 어떤 부분에 더 집중해야 하는지를 결정
✅ 키 (Key)
• 키는 입력 시퀀스의 각 요소에 대한 정보를 나타냄
• 키는 쿼리와 비교되어 유사성을 측정하며, 어떤 입력 요소가 현재 쿼리와 얼마나 관련 있는지를 결정하는 데 사용.
• 키는 일반적으로 입력 시퀀스의 각 요소 (예: 단어 또는 문장)에 대한 벡터 또는 표현으로 표현됨
✅ 값 (Value)
• 값은 입력 시퀀스의 각 요소에 대한 정보를 담고 있다.
• 값은 어텐션 메커니즘에서 가중 평균을 계산할 때 사용되며, 쿼리와 키의 유사성에 따라 값에 가중치가 부여된다.
• 값은 주로 입력 시퀀스의 각 요소에 대한 정보를 포함하는 벡터 또는 표현으로 표현된다.
이러한 Q,K,V(쿼리, 키, 벨류)를 가지고 Attention층에서는 Attention 함수가 사용되는데 이때 다양한 함수(Attention Score Function)를 이용해서 Attention Score가 만들어지고 보통 SoftMax 함수를 통해 Attention Value가 생성됨
어텐션 함수는 주어진 쿼리(Query)에 대해 모든 키(Key)와의 유사도를 구한다.
벡터간의 거리(유사도)를 구하는 방법은 내적, 코사인 유사도, 유클리디안 거리 방법 등이 있지만 내적 유사도를 보통 사용한다고 한다.
유사도 개념 중요 ★
여기서 Attention Score 함수 중 Dot-product Attention에 대해서 알아보자!!
아래 그림 참조
인코더의 시점(time step)을 각각 1, 2, ... N이라고 하였을 때 인코더의 은닉 상태(hidden state)를 각각 ℎ1, ℎ2, ... ℎ𝑁라고 합시다. 디코더의 현재 시점(time step) t에서의 디코더의 은닉 상태(hidden state)를 𝑠𝑡라고 해보자.
어텐션 메커니즘의 첫 걸음인 어텐션 스코어(Attention score)에 대해서 배우기전에, 이전 챕터 배웠던 디코더의 현재 시점 t에서 필요한 입력값을 다시 떠올려보자. 시점 t에서 출력 단어를 예측하기 위해서 디코더의 셀은 두 개의 입력값을 필요로 하는데, 바로 이전 시점인 t-1의 은닉 상태와 이전 시점 t-1에 나온 출력 단어다.
그런데 어텐션 메커니즘에서는 출력 단어 예측에 또 다른 값을 필요로 하는데 바로 어텐션 값(Attention Value)이라는 새로운 값이다. t번째 단어를 예측하기 위한 어텐션 값을 𝑎𝑡이라고 해보자.
어텐션 스코어란 현재 디코더의 시점 t에서 단어를 예측하기 위해, 인코더의 모든 은닉 상태 각각이 디코더의 현 시점의 은닉 상태 𝑠𝑡와 얼마나 유사한지를 판단하는 스코어값이다.
닷-프로덕트 어텐션에서는 이 스코어 값을 구하기 위해 𝑠𝑡를 전치(transpose)하고 각 은닉 상태와 내적(dot product)을 수행합니다. 즉, 모든 어텐션 스코어 값은 스칼라입니다. 예를 들어 𝑠𝑡과 인코더의 i번째 은닉 상태의 어텐션 스코어의 계산 방법은 아래와 같습니다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
유튜브(https://www.youtube.com/watch?v=8E6-emm_QVg&t=80s)를 통해서 복습.
결국 어텐션이란 -> decoder의 각각의 상태에서, 시점마다 다른 context vector를 쓴다!!!!
-> 4번째 시점에서 예측할 때는, 4번째에서 context vector를 구해야겠지?
Context Vector 4 = C4라고 하고, dot product를 써보면, C4 = <S4,h1>h1 + <s4,h2>h2 + <s4,h2> + <s4,h3>h3 -> weighted sum이라고 할 수 있음.
weighted sum -> 취사 선택!! 즉, h1,h2,h3 중 어느것을 더 많이 쓸까? (어떤 단어를 더 볼까??~~)
-> 유사도 기준으로 쓰는게 논리적이겠지?? (내적 유사도를 구해보자!!)
-> 유사도가 더 높다 -> 더 닮았다!!! -> 너에게 더 Attention 해주겠다 -> 더 높은 가중치를 부여!
"선형 변환"
Loss를 가장 줄일 수 있는 벡터는 h1,h2,h3중 무엇일까~~요?
S4랑 어떤 단어를 더 가깝게 위치시킬지를 학습시킬까!,
l4 (loss)를 가장 잘 줄이기 위해서, S4랑 어떤 단어를 더 가깝게 놓도록 선형변환해야 좋을까??? 이게 핵심
-> h1이겠지!!!!
그럼 h1에 더 높은 가중치를 주게 되는 것이다!
h1가 가장 높은 가중치를 준 후, c4를 구해 -> s4랑 지지고 볶아서 y hat을 구해. -> 소프트맥스 통과 -> 디코더의 결과
또한, Attention과 Transformer를 통해서, Parallelization이 가능해졌다고 한다!
기존의 RNN연산은 구조적으로 Sequential연산 때문에, 병렬처리가 어려워 CPU로만 했어야 했지만,
Transformer의 등장으로 GPU연산이 가능해졌다고 한다람쥐
참고1: (혁펜하임) https://www.youtube.com/watch?v=8E6-emm_QVg&t=80s
참고2: https://wikidocs.net/22893
참고3:https://velog.io/@sjinu/%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC-Attention-Mechanism
'딥 러닝 > 자연어처리 - 텍스트 전처리' 카테고리의 다른 글
(RNN) 시퀀스-투-시퀀스(seq2seq) (2) | 2024.07.13 |
---|---|
6. 정수 인코딩(Integer Encoding) (0) | 2024.03.09 |
5. 정규 표현식 (Regular Expression) (0) | 2024.03.09 |
정규 표현식 (Regular Expression) (0) | 2024.03.09 |
4. 불용어 처리 (Stopword) (0) | 2024.03.09 |