딥 러닝을 이용한 자연어 처리 입문
해당 사이트를 개인 공부 목적으로 재구성한 내용입니다.
입력 문장이 길어지면 번역 품질이 떨어지는 seq2seq의 모델의 단점을 보완하기 위해 등장한 기법
디코더에서 출력 단어를 예측하는 매 시점마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고한다.
이때 해당 시점에서 예측해야 할 단어와 연관이 있는 입력 단어 부분에 더 집중(attention) 해서 보게 된다.
Attention(Q, K, V) = Attention Value
여기선 봐도 이해가 안가니까 뒷내용으로 넘어가자!
Q = Query : t 시점의 디코더 셀에서의 은닉 상태
K = Keys : 모든 시점의 인코더 셀의 은닉 상태들
V = Values : 모든 시점의 인코더 셀의 은닉 상태들
어텐션 함수는 주어진 '쿼리(Query)'에 대해서 모든 '키(Key)'와의 유사도를 각각 구한다. 그리고 구해낸 이 유사도를 키와 맵핑되어있는 각각의 '값(Value)'에 반영해준다. 그리고 유사도가 반영된 '값(Value)'을 모두 더해서 리턴한다. 여기서는 이를 어텐션 값(Attention Value)이라고 하는데, 자세한 건 나중에 살펴보자.
어텐션의 종류 중 하나
디코더 세 번째 LSTM 셀에서 출력 단어를 예측하고자 하는 상황
예측을 위해 인코더의 전체 입력 문장을 다시 한 번 참고하고자 한다.
인코더의 소프트맥스 함수에 집중!
소프트맥스 함수를 통해 나온 결괏값
=각 입력 단어(I/am/a/student)가 디코더의 예측에 도움이 되는 정도를 수치화하여 나타낸 값
각 입력 단어가 도움이 되는 정도가 수치화하여 측정되면 이를 하나의 정보로 담아 디코더로 전송한다.
디코더는 이를 참고함으로써 출력 단어를 더 정확하게 예측할 확률이 높아진다.
지금부터 어텐션 메커니즘을 상세히 살펴봅시다.
아 시작 전에! 알아두고 갑시다.
t 시점에서 디코더가 출력 단어를 예측하기 위해 필요한 입력
① t-1 시점의 은닉상태
② t-1 시점에 나온 출력 단어
③ t번째 단어를 예측하기 위한 어텐션 값(NEW!)
seq2seq와 달리 어텐션 메커니즘에서는 3번이 추가된다.
어텐션 스코어
: 현재 시점t에서 디코더가 단어를 예측하고자 할 때,
인코더의 모든 은닉상태 각각이 디코더의 현 시점 은닉상태와 얼마나 유사한지를 판단하는 스코어값.
어텐션 스코어 함수
: 주어진 Query와 모든 Key에 대해서 유사도를 측정하는 함수
어텐션 스코어를 구하는 함수에 따라 어텐션의 종류가 달라진다.
Q. 그렇다면 지금 배우고 있는 어텐션의 이름이 닷-프로덕트 어텐션인 이유는?
A. 내적(dot product)을 통해 어텐션 스코어를 구하기 때문!
인코더의 은닉상태가 디코더의 현 시점 은닉상태와 얼마나 유사한지를 닷-프로덕션을 이용해 구하겠다는 뜻이라고 할 수 있다. 실제로 St와 각 은닉상태를 가지고 내적을 수행함을 밑에서 확인할 수 있다.
St를 전치한 다음 각 은닉상태와 내적을 수행한다.
어텐션 스코어 함수
st와 인코더의 모든 은닉 상태의 어텐션 스코어의 모음값을 et 라고 정의하면 수식은 다음과 같다.
드디어 어텐션 값을 구했다!!!!
이 어텐션 값은 컨텍스트 벡터라고도 불린다. 인코더의 문맥을 포함하고 있기 때문에!
(참고로 seq2seq에서는 인코더의 마지막 은닉상태를 컨텍스트 벡터라고 불렀었다.)
어텐션 값(at)과 디코더의 t시점의 은닉상태(St)를 결합해 하나의 벡터로 만든다.
결합 결과 벡터 Vt를 y 예측 연산의 입력으로 사용한다.
=> 인코더로부터 얻은 정보를 활용하여 y를 더 잘 예측할 수 있다!
여기서 다시 리마인드 해보자.
어텐션 메커니즘의 메인 아이디어는 다음과 같았다.
디코더에서 출력 단어를 예측하는 매 시점마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고한다.
이때 해당 시점에서 예측해야 할 단어와 연관이 있는 입력 단어 부분에 더 집중(attention) 해서 보게 된다.
우리가 구한 어텐션 값(Attenion Value)은 어텐션 가중치(Attention Weight)와 각 인코더의 은닉상태를 곱해서 모두 더한 값이다.
그리고 그렇게 구한 어텐션 값을 디코더의 입력으로 사용함으로써(정확히는 St와 결합한 결과를 입력) 예측력을 높이게 된다.
각 인코더의 은닉상태를 어텐션 가중치와 곱했기 때문에 전체 입력 문장이 참고됐다고 할 수 있으며,
어텐션 스코어에 소프트맥스 함수를 씌운 결과인 어텐션 가중치가 곱해졌기 때문에 디코더의 예측에 있어 전체 입력 문장 중 각 토큰이 가지는 중요도가 반영됐다고 할 수 있다.
(참고로 어텐션 스코어 = 현재 시점t에서 디코더가 단어를 예측하고자 할 때, 인코더의 모든 은닉상태 각각이 디코더의 현 시점 은닉상태와 얼마나 유사한지를 판단하는 스코어값.)
논문에서는 위에서 나온 Vt를 바로 출력층으로 보내지 않고 신경망을 하나 더 거치게끔 했다.
가중치 행렬과 곱한 후 하이퍼볼릭탄센트 함수를 지나도록 하여 출력층 연산을 위한 새로운 벡터인 St를 얻는다. 이 St가 출력층의 입력이 된다.
s∼t를 출력층의 입력으로 사용해 예측 벡터를 얻는다. = 예측 단어를 구한다.
여기서 소프트맥스 함수: 출력층의 활성화함수
Wy: 출력층의 가중치 행렬, by: 출력층의 편향
위에서도 언급했듯, 어텐션 스코어(어텐션 값 말고 어텐션 스코어! 각 은닉상태와 디코더의 은닉상태의 유사도를 계산했던 그 친구)를 구하는 방법에 따라 어텐션의 종류가 달라진다.