Self-Attention은 n개의 x가 주어지고 n개의 z벡터를 찾는데 각각의 i번째 x벡터를 로 바꿀 때 나머지 n-1개의 x벡터를 같이 고려하는것이 요점이다.
단어가 주어졌을 때(Thinking, Machines) self-attention 구조는 3가지 벡터를 만들어낸다.(3개의 뉴럴네트워크를 만든다.) Queries, Keys, Values
이 3개의 벡터를 통해서 x_1이라고 불리는 첫번째 단어에 대한 embedding 벡터를 새로운 벡터로 바꿔준다.
두 단어 중 Thinking이라는 단어를 embedding 하고 싶을 때,(각각의 단어마다 Queries, Keys, Values 벡터를 만들었는데) 추가로 score 벡터를 만든다.
score 벡터는 내가 인코딩 하고자 하는 벡터(단어)의 Query벡터와 나머지 모든 n개에 대한 key벡터를 구해서 내적하는 것이다. 즉, i번째 단어가 나머지 단어와 얼마나 유사도가 있는지를 이런식으로 정하게 된다.
이 과정을 통해 우리는 단어에 score벡터로 만들 수 있다.
score 벡터가 나오면 key벡터의 dimension으로 나눠준다.(여기서는 64개의 벡터로 만들어서 루트를 씌운 8) -> 이 과정을 통해 score 값 자체가 너무 커지지 않게 하기위해
그 후 softmax를 취하면 단어간에 interaction을 알 수 있다.(여기서는 자기 자신과의 attention weigt는 0.88이되고, 다른 단어와의 attention weight는 0.12가 된다.)
위에서 구한 attention weigh와 Value벡터와 weighted sum을 한 것이 최종적으로 나오는 Thinking이라는 단어에(Thinking이라는 단어에 해당하는 embedded 벡터에) 인코딩된 벡터가 되는 것이다. 이 과정을 모두 거치면 하나의 단어에 대한 인코딩 벡터가 나오게 된다.
주의 할 점 :