Attention (2017) 논문 리뷰

@esthrelar·2023년 8월 15일
0

AI를 활용한 기계 번역
-> 이런 것에 방대한 영향을 끼친 논문임.
자연어 처리에 필수적인 논문.

선행 연구에 대한 이해

RNN
일반적으로 문장이 들어와서 문장으로 output을 내놓는 "many to many" 기법이 기계어 번역.
아래 input으로 문장ㅇ이 들어가면 output으로 번역해서 번역을 내놓음.

input과 output 사이에 단어를 그대로 넣지 않고 컴퓨터가 알아들을 수 있게 하기 위해
벡터로 변환해서 넣는데, 이렇게 단어를 벡터로 변환하는 것을 워드 임베딩이라고 함.

각 레이어가 NN으로 연결되어 있는데
현재 word vector에 이전의 값을 계속해서 가져와서 업데이트하며 진행하게 됨.

워드 임베딩
"you say goodbye"
-> say 단어의 벡터를 생성하고자 한다면, say 주변 맥락인 you와 good으로부터 vector를 생성함.

one-hot vector로 표현
그래서 이 두 벡터에 가중치를 곱해서 은닉층을 만들고, 원래의 dimension으로 돌려 놓은 위 softmax를 취함.
그래서 나온 output이 실제 say가 있는 one-hot vector와 비교해서 loss를 구하고,
이 손실을 최소화하는 방향으로 weight를 업데이트 함.
-> 이전의 값을 가져와서 계속 써서 backpropagation 과정에서 vanishing gradient 문제가 발생.
-> 이걸 해결하기 위해서 LSTM 기법이 도입된.
(과거의 기억층에서 최근 기억과 input을 사용하여 과거 기억을 수정해가며 하는 것이 목표인 것)

LSTM의 단점 : 하나의 셀에 4개의 신경망이 있어 속도가 느리다는 단점이 있어서, 이를 개선하고자 신경망이 3개인 GRU로 발전.
하지만, 결국 이런 형태의 seq2swq (sequence to sequence) 모델들의 경우, 고정된 크기의 context vector로 만든다는 문제 존재. (context vector에 소스 문장의 모든 정보를 압축한다는 것)
여기는 병목 현상이 발생해서 성능 저하.
따라서 입력 시퀀스 전체에서 정보를 추출하여 병렬 연산을 하는 방향으로 발전.

Transformer (Attention is all you need)

어텐션 구조 -> single attention을 사용하는 게 아니라 multi로 사용함.
이렇게 single attention을 여러 개 붙여 사용한 것이 multi head attention임.
이 구조를 사용.

Transformer의 내부 구조는 크게 인코더(6개)와 디코더(6개)로 나뉘게 됨.
하지만 꼭 6개가 최적이라는 것은 아님.

  • 인코더 블록 : self attention과 NN으로 구성
  • 디코더 블록 : masked-self-attention과 encodeer decoder self attention, NN으로 구성

과정

우선, 단어들을 벡터로 바꾸는 word embedding 과정이 필요.
각각의 독일어는, 각각의 벡터로 변환됨.
그리고 각각의 word embedding된 벡터들이 한꺼번에 들어가므로 위치 정보가 없음.
따라서 위치 값을 저장해주기 위해서 positional encoding도 함꼐 수행해 줌.
따라서 각각의 embedding된 벡터에는 positioning encoding vector를 더해줘서 최종 인풋으로 들어갈 벡터를 생성해줌. (전체적으로 자신에서 멀어질수록 값이 멀어지는 패턴을 보임)

Attention 부분 :
각각의 embedding된 벡터가 self attention으로 들어오면, output으로 같은 dimension의 벡터를 내보냄. 그리고 해당 벡터는 NN에 각각 들어감.
과정 - "it" 이 어떤 단어를 가리키는가를 찾을 때 사용됨.
원리 - 워드 임베딩 들어오면, 각각의 query weight, key weight, value wight과 연산해서 각각의 query, kwy, value vector를 구함.
그럼 찾고자 하는 it의 query 벡터를 가지고, 해당 문장의 모든 key와 연산을 해 줌. 그럼 가장 쿼리와 유사한 벡터를 갖게 됨 (같은 벡터일수록 내적하면 큰 값을 가지기 때문)
따라서 이렇게 생성된 쿼리 벡터와 모든 key와 내적 연산을 했을 때 가장 값이 큰 것이 가장 유사한 단어임.

따라서, 우선 쿼리와 key vector를 이용해서 softmax에 넣어줘서 score를 구함.
이후 normalization(dimension의 루트씌운 값으로 나눠줌)을 하고 , 모든 임베딩에서 나온 softmax값과 value를 곱해줌.
그 값을 모두 다시 sumation을 하면 output으로 z 벡터로 나오게 됨.

이게 Attention이고, 이걸 동시에 여러번 수행한 것이 multi-head attention.

디코더 안에 3개의 모듈

  • masked multi head attention
    : 디코딩을 수행하는 단어의 뒤에 있는 단어들에게는 무한대 값을 줘서 전체 softmax를 취할 때 뒤의 값들은 거의 0에 수렴하도록 설정함. 이를 해 줌으로써 번역할 단어의 뒷부분을 넣어주지 않아서 치팅을 방지하고 정상적으로 학습을 해줄 수 있음.

인코더 디코더 어텐션 : 디코더의 쿼리가 인코더의 어떤 벡터에 더 많은 가중치를 두는지 계산하는 과정.

  • output 부분
    : 출력된 확률값으로 다음 토큰인 단어를 예측. softmax를 거쳐서 최종 확률이 높은 단어가 output으로 나옴.

참고 영상

https://www.youtube.com/watch?v=URci3Eqz3hc

profile
moved to tistory. ( linked w/ the home btn below. )

0개의 댓글