Self-Attention 이해하기
attention이 무엇을 계산하는지, Q와 K와 V가 각각 어떤 역할인지, 그리고 한 단어를 어떻게 contextualize하는지 간단히 정리해봤다.
attention은 value의 가중 평균#
attention 함수는 세 가지를 입력으로 받는다.
query는 지금 보고 있는 기준(context), key와 value는 비교 대상(references)이다. attention의 출력은 value들의 가중 평균인데, 이때 각 value에 붙는 weight가 query와 그 key의 관련성(relevance)에 비례한다. 관련 있는 대상의 value를 더 많이 가져오는 것이다.
두 가지 차원 조건이 있다. query와 key는 서로 내적해서 관련성을 재야 하므로 같은 차원이어야 한다. value와 attention 출력은 당연히 같은 차원을 가진다.
seq2seq에 대입하면 Q는 decoder의 현재 시점 hidden state, K와 V는 encoder의 모든 시점 hidden state다.
한 단어를 contextualize하기#
self-attention은 입력 시퀀스 안에서 각 단어를 문맥으로 다시 표현한다. 문장 에서 첫 단어 에 대한 attention을 따라가 보면 이렇게 된다.
- 을 로 선형변환해 query 로 보낸다.
- 을 모든 key 와 내적해 유사도를 구한다. (는 각 를 로 변환한 것)
- 각 유사도를 softmax에 통과시켜 확률로 만든다.
- 그 확률을 각 value 에 곱한다.
- 곱한 것들을 모두 더해 하나의 벡터로 합치고, 를 통해 다시 embedding 공간으로 보낸다.
이렇게 나온 은 을 문맥()으로 다시 표현한 결과물이다. 원래의 과 완전히 달라지진 않지만, 관련 있는 다른 단어( 등)의 영향을 받아 조금씩 조정된다. 이 단계를 여러 층 반복할수록 더 깊게 contextualize된다.
정리#
- attention 출력 = value들의 가중 평균. weight는 query와 key의 관련성에 비례한다.
- Q와 K는 같은 차원(내적해야 하므로), V와 출력은 같은 차원. seq2seq에선 Q=decoder hidden, K와 V=encoder hidden이다.
- self-attention은 query를 모든 key와 내적한 뒤 softmax를 거쳐 value를 가중합해, 한 단어를 문맥으로 다시 표현한다. 층을 쌓을수록 더 contextualized된다.
댓글