Attention

Xpert·2024년 3월 31일
0

모델 아키텍쳐

목록 보기
6/7

기계번역에서 기존에 사용되던 RNN 기반의 seq2seq는 문장이 길수록 품질이 떨어지는 문제가 있었는데, 이를 위해 인코더의 문장을 매번 참조하는 기법인 Attention이 등장하게 되었다.

어텐션의 기본 아이디어는 디코더에서 출력 단어를 예측하는 매 시점(time step)마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고한다는 점이다. 단, 전체 입력 문장을 전부 다 동일한 비율로 참고하는 것이 아니라, 해당 시점에서 예측해야할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중(attention)해서 보게 된다.

Encoder와 Decoder

Encoder : 입력 시퀀스를 읽고 단일 벡터를 출력하고 이 단일벡터는 Context Vector라고 불립니다.
Decoder : Context Vector를 읽어 출력 시퀀스를 생성합니다.

Attention Function

Attention(Q, K, V) = Attention Value

Q = Query : t 시점의 디코더 셀에서의 은닉 상태 (s_t)
K = Keys : 모든 시점의 인코더 셀의 은닉 상태들 (h_i)
V = Values : 모든 시점의 인코더 셀의 은닉 상태들

어텐션 함수는 주어진 '쿼리(Query)'에 대해서 모든 '키(Key)'와의 유사도를 각각 구합니다. 그리고 구해낸 이 유사도를 키와 맵핑되어있는 각각의 '값(Value)'에 반영해줍니다. 그리고 유사도가 반영된 '값(Value)'을 모두 더해서 리턴합니다. 여기서는 이를 어텐션 값(Attention Value)이라고 하겠습니다.

이 부분이 지금 이해 안되더라도 아래에서 다시 설명될 것이다.

Dot-Product Attention

Dot-Product Attention 매커니즘을 이용하여 어텐션이 어떻게 동작하는지 이해해보자.

왼쪽 주황색 셀들이 인코더이고, 오른쪽 초록색 셀들이 디코더이다. 단어들은 개별적으로 임베딩되어서 LSTM에 입력된 상태이다. 현재는 디코더의 세번째 LSTM 셀 (S_t) 에서 출력 단어를 예측하고자 하는 상황이며, 이를 위해 인코더의 모든 입력 단어들의 정보를 다시 한번 참고하고자 한다.

Attention Score

인코더의 시점(time step)을 각각 1, 2, ... N이라고 하였을 때 인코더의 은닉 상태(hidden state)를 각각 h1, h2, ... , hn 이라고 하자. 또한 디코더의 현재 시점(time step) t에서의 디코더의 은닉 상태(hidden state)를 s_t 라고 하자.

디코더의 현재 시점 t에서 출력 단어를 예측하기 위해서 디코더의 셀은 두 개의 입력값을 필요로 하는데, 이전 시점인 t-1의 은닉 상태와 이전 시점 t-1에 나온 출력 단어이다. 여기에 어텐션 매커니즘에서는 현재 시점 t에서의 Attention Value인 a_t가 추가적으로 필요하다. 이 a_t를 구하기 위한 값이 Attention Score이다.

어텐션 스코어란 현재 디코더의 시점 t에서 단어를 예측하기 위해, 인코더의 모든 은닉 상태 각각이 디코더의 현 시점의 은닉 상태 s_t 와 얼마나 유사한지를 판단하는 스코어값입니다.


s_t를 transpose하고, h_i와 내적하면 스칼라 값이 나오는데 이 값이 바로 인코더의 i번째 은닉상태에서의 Attention Score이다.

Attention Distribution

각 i에서의 Attention Score에 대해 소프트맥스를 적용하면 합이 1이 되는 확률 분포값이 나오며 이를 Attention Distribution 또는 Attention Weight 라고 부른다. 이것은 인코더의 개별 단어에 대한 일종의 가중치라고 볼 수 있다.

Attention Value

어텐션의 최종 결과값을 얻기 위해서 각 인코더의 은닉 상태와 어텐션 가중치값들을 곱하고, 최종적으로 모두 더합니다. 요약하면 가중합(Weighted Sum)을 진행합니다. 아래는 어텐션의 최종 결과. 즉, 어텐션 함수의 출력값인 어텐션 값(Attention Value) a_t에 대한 식을 보여줍니다.

Attention Value는 인코더의 문맥 정보를 포함하고 있다고 하여 컨텍스트 벡터(context vector) 라고 불리기도 한다.

Attention Value를 조금 더 직관적으로 설명하자면,
1. 현재 시점의 디코더 state를 인코더 개별 시점 state와 연산하여 유사도에 따른 가중치를 얻어내는 것이고
2. 이러한 가중치들을 다시 인코더 개별 시점 state들과 곱하고 더해서 결국 인코더의 어떤 부분에 대해 집중(Attention) 하면 되는지에 대한 Vector를 구해내는 것이다.

최종 연산

a_t를 s_t와 concat하여 하나의 vector로 만들고 이를 예측 연산의 입력으로 사용한다. 인코더에서 얻은 정보를 바탕으로 더 잘 예측하게 하는 방법인 것이다.

Q,K,V 를 이용한 설명

Attention 메커니즘은 주어진 "query"에 대해 가장 관련이 높은 "key"들을 찾아내고, 그에 해당하는 "value"들을 집계(aggregating)하는 과정입니다. 이를 통해, 모델은 입력 정보 중 어떤 부분에 "집중"해야 하는지를 결정할 수 있습니다. Q, K, V는 이러한 과정을 구현하기 위한 벡터 표현입니다.

  • Query (Q): 현재 분석하고 있는 대상의 표현입니다. 예를 들어, 디코더에서 생성하려는 현재 단어의 상태 또는 문맥을 나타냅니다.

  • Key (K): 비교 대상의 표현입니다. 인코더의 각 시점에서의 상태를 나타내며, Query와 비교하여 유사도를 계산하는 데 사용됩니다.

  • Value (V): 실제로 집중해야 할 정보의 표현입니다. Key와 함께 나타나며, Key가 Query와 얼마나 일치하는지에 따라 해당 Value에 가중치가 부여됩니다.

Attention 연산 과정

유사도 계산: 먼저, Query와 모든 Key들 사이의 유사도(내적 또는 코사인 유사도 등)를 계산합니다. 이 유사도는 각 Key가 Query와 얼마나 관련이 있는지를 나타내는 점수로 해석됩니다.

가중치 계산: 유사도 점수에 소프트맥스 함수를 적용하여, 각 Key에 대한 정규화된 가중치를 계산합니다. 이 가중치는 Query가 각 Key(따라서 Value)에 얼마나 "주의"를 기울여야 하는지를 결정합니다.

가중합: 각 Value에 해당하는 가중치를 곱한 후, 이들을 모두 더하여 최종 출력을 생성합니다. 이 출력은 Query가 주어진 모든 정보 중 어떤 부분에 집중해야 하는지를 반영한 벡터입니다. (Context Vector)

Attention 메커니즘에서 Key와 Value

여기서 주의할 점은 key가 dict에서 hash로 표현되는 진짜 key는 아니고 비유일 뿐이라는 점이다. 여기서의 key는 유사도 계산을 위한 기준 값일 뿐이지, O(1)로 연산되는 형태의 그런 key가 아니라는 점에 유의

Attention Score Functions

위 매커니즘에서 중간에 내적 취하는 부분을 대체할 수 있는 여러 방식이 있다.

profile
Python, CV, ML, Backend

0개의 댓글

관련 채용 정보