Programming/TIL

Multi-Head Attention

R.i.c.K.y 2025. 1. 22. 03:01

이해가 되지 않았다.

기본적인 Attention에 비해, Multi-Head Attention이 갖는 이점에 대해 물었을 때,

가장 먼저 들은 건 "병렬성", 그리고 "다양한 관점에서의 문장 해석"이였다.

 

병렬성이라는 특징은 수긍이 되었다. Query, Key, Value 각각에 h개의 헤드를 동시에 수행함으로써 이루어지는 특징이기에 빠르게 이해가 되었다.

문제는 "다양한 관점에서의 문장 해석"이였다.

물론 직관적으로는 이해가 되었다.

"Query, Key, Value 각각에 여러 헤드가 들어가있으니 한 개만 들어간 것보다는 다각적으로 볼 수 있겠지" 라는 직관이 들었다.

 

허나 원리적으로 이해가 되지 않았다. Self-Attention을 예로 들 때,

"I have a pencil" 이라는 입력이 있다고 하면, 임베딩을 했을 때의 벡터가 정해진 차원만큼 변환될 텐데,

하나의 입력으로부터 여러개의 임베딩 벡터를 어떻게 뽑아내지? 가 나의 궁금증이였다.

결국 병렬적으로 수행한다는 것은, 여러 개의 Query 벡터들이 서로 다른 값을 가지고 있어야 유의미한 것인데,

내 머리속에선 각각 다른 임베딩 함수를 이용하여 도출하는 것이 아닌 한, 하나의 입력 시퀀스에선 하나의 임베딩 벡터가 나올 것이니 이해가 되지 않았던 것 같다.

 

원래 한 덩어리였던 것을 h개로 분할한 거였다.

답은 이 블로그에서 찾았다.

하나의 입력 시퀀스에서 다양한 벡터들을 뽑아내는 것이 아니라, 원래 한 덩어리였던 헤드를 h개로 분할한 후, 각각 어텐션을 취한다고 한다.

이렇게 하면, 기존의 단일 Query, Key, Value에 혼재되어있던 다양한 특징들이 분리되어서 어텐션을 수행하므로, 더욱 특징들 각각에 집중한 결과를 도출할 수 있게 되기에, 책에서 설명한 "다양한 관점에서의 문장 해석"에 대한 이해가 더욱 잘 되었다.

 

마치 Divide-and-Conquer 알고리즘처럼, 각각을 분할하여 어텐션을 수행한 후, 결과들을 concatenate함으로써 멀티 헤드 어텐션을 수행한다는 것을 깨달았다.