‹ Lecture 3 02 / 21

Soft Dictionary

Python dictionary는 query와 정확히 같은 Key 하나를 찾아 그 Value를 돌려준다. Attention은 정확히 일치하는 항목 하나 대신, Query와 각 Key의 compatibility를 score로 계산하고 여러 Values를 가중합한다. 그래서 soft dictionary라고 볼 수 있다. **무엇을 찾는가(Query), 언제 선택될 것인가(Key), 무엇을 전달할 것인가(Value)**라는 세 역할을 분리하면 계산의 의미가 명확해진다.

  1. Hidden state XX
  2. WQW_{Q} / WKW_{K} / WVW_{V}
  3. QQ / KK / VV
  4. soft lookup

Hard & Soft Lookup

Hard dictionary는 exact key 하나의 value를 반환한다. Soft dictionary는 allowed keys를 query로 score한 뒤 Softmax weights로 values를 섞는다.

q:(1,dk),K:(n,dk)q:(1,d_k),\quad K:(n,d_k) α:(1,n),V:(n,dv)\alpha:(1,n),\quad V:(n,d_v) out:(1,dv)\mathrm{out}:(1,d_v)

QQ=필요한 정보, KK=선택될 조건, VV=전달할 내용이라는 직관이다. Hard dictionary는 정확히 일치하는 Key의 Value를 가져오지만 Soft dictionary는 관련된 여러 Value를 섞는다. 호텔 방을 찾는 비유에서 Query는 원하는 조건, Key는 방을 고를 조건, Value는 선택한 방에서 얻을 내용에 대응한다.

QQ/KK의 폭은 같아야 하지만 VV의 폭은 달라도 된다.

Self-Attention & Cross-Attention

X∈Rn×dmodelX\in\mathbb{R}^{n\times d_{\mathrm{model}}} Q,K∈Rn×dkQ,K\in\mathbb{R}^{n\times d_k} V∈Rn×dvV\in\mathbb{R}^{n\times d_v}

Self-Attention의 XX는 각 token state를 row로 쌓은 matrix다. 같은 입력을 세 learned projections에 통과시켜 서로 다른 역할의 vectors를 만든다.

Q=XWQ,K=XWK,V=XWVQ=XW_Q,\qquad K=XW_K,\qquad V=XW_V WQ,WK∈Rdmodel×dk,WV∈Rdmodel×dvW_Q,W_K\in\mathbb{R}^{d_{\mathrm{model}}\times d_k}, \qquad W_V\in\mathbb{R}^{d_{\mathrm{model}}\times d_v}

Projection은 행의 수 nn을 유지하며 feature 폭을 바꾼다. 구현에서 세 weights를 하나로 이어 붙여 한 번에 곱해도, 서로 같은 parameters를 공유한다는 뜻은 아니다. 처음부터 Q/K/V라는 뜻이 붙은 Token IDs를 입력하는 것도 아니다. 각 projection이 training을 통해 자신의 역할에 맞게 학습되는 것이다.

Cross-Attention에서는 Query를 만드는 sequence와 K/V를 만드는 memory가 다르다. Translation의 “I love you” → “나는 너를 사랑해”에서 Decoder가 사랑해를 생성할 때의 state로 Query를 만들고, Encoder의 원문 states로 K/V를 만들 수 있다. Love 쪽 score가 크더라도 soft lookup이므로 주변 정보도 가중합에 참여할 수 있다.

이 정의는 Encoder–Decoder translation에만 한정되지 않는다. 교수님이 든 image latent의 Query와 text prompt의 K/V, latent array의 Query와 긴 입력의 K/V도 같은 원리다. Query의 출처와 참조하는 memory의 출처가 같으냐가 Self와 Cross를 나누는 기준이다.

Directional Compatibility

왜 같은 XX를 쓰면서 WQW_Q와 WKW_K를 따로 둘까? 둘을 같은 WW로 묶으면 raw score는 다음처럼 symmetric해진다.

S=(XW)(XW)⊤,Sij=SjiS=(XW)(XW)^\top,\qquad S_{ij}=S_{ji}

이때 it이 animal을 참조하는 raw compatibility와 animal이 it을 참조하는 raw compatibility를 독립적으로 줄 수 없다. 서로 다른 projections를 두면 대명사가 antecedent를 찾는 관계와 그 역방향을 다르게 학습할 수 있다. 이는 raw score에 대한 설명이며, row마다 따로 정규화하는 Softmax 이후의 weights까지 항상 symmetric이라고 말하는 것은 아니다.

Self-Attention과 Cross-Attention은 입력의 출처가 다르다. QQ/KK projections를 분리하면 두 방향의 compatibility를 서로 다르게 표현할 수 있다.

QQ/KK/VV는 원래 Token ID의 다른 이름이 아니라 학습한 projections다. QQ와 KK의 width는 같아야 하지만 dvd_{v}=dkd_{k}가 필수는 아니다.

QQ/KK는 같은 폭, KK/VV는 같은 memory positions. VV폭은 달라도 된다.

Check

Self와 Cross-Attention은 계산식보다 어떤 입력 출처가 달라지는가?

Answer

Self는 QQ/KK/VV가 같은 sequence, Cross는 QQ와 KK/VV가 서로 다른 sequence/memory에서 나온다. KK와 VV는 같은 memory position을 대응한다.

WQW_{Q}와 WKW_{K}를 공유하면 raw score의 방향성에 어떤 제약이 생기는가?

Answer

S=XWW⊤X⊤S=XWW^\top X^\top가 symmetric이 된다. 두 방향의 raw compatibility를 독립적으로 표현하기 어렵다. Softmax 이후까지 모든 matrix가 symmetric이라고 확대하지 않는다.

같은 X에서 Q/K/V를 만들면서도 서로 다른 projections를 쓰는 이유는?

Answer

읽을 조건인 Query, 검색될 특징인 Key, 전달할 내용인 Value의 역할이 다르기 때문이다. Q와 K는 내적할 폭이 같아야 하고 K와 V는 같은 memory positions에 대응하지만, Value의 feature width까지 Q/K와 같을 필요는 없다.

Contents