I love the music of the Cranberries, who sings with mysterious voices.
The Cranberries had cranberries too much, so they look for a hospital.
사자가 이상한 소리를 듣고서 포효를 했는데 그 소리는 사람들에게 위압감을 느끼게 하였다
Self Attention 의 기능
위의 3 문장은 한 문장이지만 문장내에서 동사의 주어가 무엇인지 대명사는 어떤 명사를 가리키는지 Transformer 는 모름
따라서 같은 문장을 서로 비교하게 하여서 토큰(단어)간 관계 또는 유사도(Relation=Similarity) 에 가중치를 부여하여서 혼동을 피하게 해줌.
왼쪽의 'sing'의 주체가 'i' 인지 'Cranberries' 인지 매우 혼동스러움. 인간은 'sings'의 주체가 'Cranberries' 임을 알 수 있고 두 토큰에 가중치를 높에 배정. 'who' 도 관계대명사로 동사 'sings' 와 관계가 높음
두 번째의 '소리'도 첫번째 '소리'와 밀접한 관계가 있는지 '포효'의 소리를 가리키는지 딥러닝은 모름. 따라서 사람이 높은 가중치를 사용하여 두번째 '소리'와 '포효' 토큰을 연결
‘sings’토큰과 왼쪽 모든 토큰들간 유사도는 책정됨 (비록 관계가 ‘0’이더라도) 그림에서는 연결선이 없는 것은 Similarity ‘0’
그림을 보면 연결선이 없는 부분도 있다. 사실 트랜스포머의 셀프 어텐션은 관계가 매우 적은 경우에도 관계가 있다고 본다(관계가 없다고 하지 않는다)
Encoder and Encoder-Decoder Attention
트랜스포머 아키텍처는 3가지 종류의 다른 Attention 을 사용한다.(중요)
인코더
Multi-head Self-Attention = Encoder Self-Attention → "영어문장"(자기자신) 에서 어디에 어텐션을 주어야하는지 자기자신과 self 비교하여 답이 여러개(멀티헤드)로 나뉠 수 있다.
디코더
Multi-head Self-Attention = Masked Decoder Self-Attention → 디코더의 입력으로 들어온 정답지 "프랑스어 문장" 에서 디코더의 위치 이후의 토큰들을 Masking 하여 자기자신인 "영어문장" 과 대조해 Attention 을 구하는 것이다.
Multi-head Attention = Encoder-Decoder Attention
인코더에서는 입력 문장(영어 문장)을 토큰화하고 각 토큰을 임베딩 벡터로 변환합니다. 이러한 임베딩 벡터는 Multi-head Self-Attention 계층에 입력으로 주어져 입력 문장 내의 토큰 간의 상호 작용을 모델링합니다. 이 과정을 통해 얻은 결과는 "context vector" 또는 "인코더의 출력"으로, 입력 문장의 정보를 요약한 것입니다.
디코더에서는 프랑스어 문장을 생성하는 작업을 수행합니다. 디코더의 현재 위치에서는 생성할 프랑스어 문장의 이전 단어를 인코더의 출력과 유사한 방식으로 임베딩 벡터로 변환합니다. 그런 다음 이전 단어의 임베딩 벡터와 인코더의 출력 간의 어텐션을 계산하여 현재 위치에서의 입력 문장(영어)과 출력 문장(프랑스어) 간의 관계를 모델링합니다. 이러한 어텐션을 사용하여 다음 단어를 예측하고 번역 작업을 수행합니다.
Query-Key-Value in Attention
DBMS 와의 차이
DBMS 에서는 쿼리를 적용하게 되면 key 를 1개를 찾지만, 트랜스포머의 어텐션에서는 매칭되는 것은 모조리 찾아줌 (1개가 아님 - 연관성이 있는지 없는지 모두 찾아줌.)
Query 와 Keys
위 문장이 Tokenization 을 통해 단어로 쪼개지고, 이 단어 하나하나가 Query 이다.
쿼리 토큰을 모든 키 토큰과 비교한 후 가중치에 따라 값이 결정된다(attention=relation)
Multi-head Self-Attention 이기 때문에 Query 와 Key 가 같고, 하나의 쿼리 토큰에 대해서 9개의 키 토큰과의 similarity 를 계산하므로, 따라서 총 9 x 9 = 81 개의 쿼리가 생성됨.
쿼리 토큰이 'Michael'일 때, 'Michael', 'Director', 'Bay' 키 토큰은 쿼리 토큰 'Michael'과 밀접한 관련이 있기 때문에 비중(점수)이 클 가능성이 높다.
Keys 와 Value
value 라는것은 찾고자 하는 단어나 값을 리턴해주는 것인데 셀프 어텐션이니까 value 도 쿼리와 key 와 같이 같은 문장을 사용하고, 그 사이에 설정된 weight 값들을 그대로 사용한다.
쿼리와 key 의 관계처럼 values 또한 similarity 를 구하는 과정 -> 한번 더 해준다 reweighting
앞에서는 'Michael' 이라는 토큰 하나만 가지고 했었는데, 이 과정을 모든 9개의 토큰을 대상으로 반복해야함 (9개의 멀티 헤드인셈)
정리
값은 어떻게 계산되는지
Attention Function 은 주어진 쿼리와 모든 키 사이의 각 유사성을 계산합니다
그러면 Attention은 유사성을 가중치로써 모든 키에 매핑된 값에 할당하고 모든 가중치를 합산/반환합니다
리뷰: DBMS 에서 쿼리, 키, 값:
쿼리: 중간고사 성적이 어떻게 되나요?
DBMS 는 쿼리에 대해 하나의 key 값에 해당하는 value 를 찾는 것.
Query, key, value
Q= query : Source Token (찾고자 하는 정보. 찾는 정보)
K=Key : Target Tokens (Query 와 비교되는 Tokens. Query와 비교한 Target Tokens, key가 가중치를 받는 경우)
V=Value : 유사도 점수(가중치를 반영한 유사도 점수
Attention 에서 모델은 키와 쿼리를 비교한 후 유사성 점수를 가진 모든 키를 반환하지만 DBMS는 일치하는 쿼리-키 쌍(튜플) 하나만 반환합니다
쿼리(Query)와 키(Key) 행렬을 내적(dot product)하면 어텐션 스코어(attention scores = Q∗KT)가 생성됩니다. 이 스코어는 각 쿼리와 각 키 간의 관계를 나타내며, 어떤 키에 더 집중해야 하는지를 결정하는 데 사용됩니다.
어텐션 스코어를 소프트맥스(softmax) 함수를 사용하여 확률 분포로 변환합니다. 이렇게 하면 각 키에 대한 가중치(어텐션 가중치)가 생성됩니다.
어텐션 가중치를 사용하여 값(Value) 행렬과 가중합을 계산합니다. 이것이 어텐션된 값(Attention-weighted values)을 나타내며, 쿼리와 키 간의 관련성을 기반으로 값을 조정한 결과입니다.
따라서, 쿼리와 키를 내적하여 얻은 가중치를 사용하여 값을 가중합하여 어텐션된 값을 계산합니다. 이 어텐션된 값을 보통 "reweighted values" 또는 "어텐션 값(Attention values)"이라고 합니다.
이러한 각 밸류의 토큰(reweighted values)을 다 더해준다.
Positional Encoding (Sinusoid Positional Embedding) in Transformer
RNN 기반의 인코더와 트랜스포머의 인코더 비교
RNN 기반 Seq2Seq 에서는 토큰(단어)이 순차적 으로 입력되므로 모델이 토큰 위치 정보(Advantage)를 유지할 수 있습니다
하지만 활성함수를 반복적으로 사용하면서 gradient vanishing 문제가 있어 학습이 잘 되지 않는다는 단점이 존재.
그러나 Transformer에서 토큰(word)은 병렬적 으로 동시에 입력되므로 모델이 토큰들의 순서를 지킬 필요가 없지만, 모델이 토큰 위치 정보를 기억할 수 없다(단점)
멀티헤드를 사용할 수 있는 장점은 있다.
어떻게 그 단점을 극복할 수 있을지
각 토큰의 위치를 기억해주기 위해 추가적인 매트릭스 사용하는 positional encdoing 이 있다.
임베딩 : I 라는 단어를 숫자로 변환
임베딩 된 것을 포지셔널 인코딩 해줘야 각 토큰들의 위치 정보를 포함시킬 수 있다.
In Sinusoid Positional Embedding 에서는 사인과 코사인의 두 가지 함수를 사용합니다