Multi Head Attention - beyondnlp/nlp GitHub Wiki

λ©€ν‹°ν—€λ“œ μ–΄ν…μ…˜μ€ μ™œ λ‚˜μ™”λ‚˜

기쑴의 sequence labeling은 λͺ¨λ‘ μ΄μ „μ˜ μƒνƒœμ— μ˜μ‘΄μ μ΄λ‹€.
rnn도 μ˜ˆμ™Έκ°€ μ•„λ‹ˆλ‹€.
GPUκ°€ 아무리 λ§Žμ•„λ„ ꡬ쑰적인 ν•œκ³„( ν˜„μž¬λŠ” 이전 μƒνƒœμ˜ κ²°κ³Όλ₯Ό μž…λ ₯으둜 λ°›λŠ”λ‹€ )λ•Œλ¬Έμ— 속도 κ°œμ„ μ˜ μƒν•œμ΄ μ‘΄μž¬ν•œλ‹€.
이λ₯Ό 병렬화 ν• μˆ˜ 있고 병렬화가 κ°€λŠ₯ν•˜λ©΄ 속도 이득도 얻을 수 μžˆλ‹€.
이런 λͺ©μ μ„ μ–»κΈ° μœ„ν•΄ μš”μ¦˜ κ°€μ§• κ°κ΄‘λ°›λŠ” κΈ°μˆ μ€‘ ν•˜λ‚˜μΈ μ–΄ν…μ…˜μ„ μ‚¬μš©ν•˜μ—¬ sequence μ •λ³΄κΉŒμ§€λ„ κ³„μ‚°ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ κ°œλ°œλ˜μ—ˆλ‹€.

Transformer architecture

μ„Έκ°œμ˜ μ–΄ν…μ…˜

트랜슀포머 ꡬ쑰도λ₯Ό 보면 총 μ„Έκ°œμ˜ μ–΄ν…μ…˜μ΄ μ‘΄μž¬ν•œλ‹€. 
μ„Έκ°œμ˜ μ–΄ν…μ…˜μ€ 인코더 μ–΄ν…μ…˜, 디코더 μ–΄ν…μ…˜, 인코더 디코더간 μ–΄ν…μ…˜μ΄λ‹€.

이번 μ±•ν„°μ—μ„œλŠ” λ¨Όμ € μ–΄ν…μ…˜ ꡬ쑰λ₯Ό μ‚΄νŽ΄λ³΄κ³  각 μ–΄ν…μ…˜λ³„ μž…λ ₯을 κ³ λ €ν•˜μ—¬ 이야기λ₯Ό μ „κ°œν•˜κ² λ‹€.
인코더 μ–΄ν…μ…˜μ˜ μž…λ ₯ μ„Έκ°€μ§€λŠ” λ‹€μŒκ³Ό κ°™λ‹€
--- λ…Όλ¬Έμ˜ λ‚΄μš© ---
encoder-decoder attention layer
이전 디코더 λ ˆμ΄μ–΄λ‘œλΆ€ν„° 쿼리가 λ“€μ–΄μ˜€κ³ 
μΈμ½”λ”μ˜ 아웃풋이 key, value둜 λ“€μ–΄μ˜¨λ‹€.
이것은 λ””μ½”λ”μ˜ λͺ¨λ“  ν¬μ§€μ…˜μ΄ μž…λ ₯ μ‹œν€€μŠ€μ˜ λͺ¨λ“  ν¬μ§€μ…˜μ— μ°Έμ—¬ν•  수 μžˆλ‹€.
이 방식이 seq2seq λ°©μ‹μ˜ 인코더 디코더 λ§€μ»€λ‹ˆμ¦˜μ„ λͺ¨λ°©ν•œλ‹€.


encoder
μΈμ½”λ”λŠ” μ…€ν”„ μ–΄ν…μ…˜ λ ˆμ΄μ–΄λ₯Ό ν¬ν•¨ν•œλ‹€.
λͺ¨λ“  keys, values, querys의 μ…€ν”„ μ–΄ν…μ…˜ λ ˆμ΄μ–΄λŠ” 같은 λ³€μˆ˜ 값이 μœ μž…λœλ‹€.
μž…λ ₯λ“€κ°„μ˜ 상관관계λ₯Ό μ μš©ν•˜μ—¬ κ·Έ κ°€μ€‘μΉ˜λ₯Ό λ‹€μ‹œ μž…λ ₯에 μ μš©ν•œλ‹€.


decoder
encoder와 μœ μ‚¬ν•˜κ²Œ λ””μ½”λ”μ˜ μ…€ν”„ μ–΄ν…μ…˜ λ ˆμ΄μ–΄λŠ” λ””μ½”λ”μ—μ„œ 각각의 ν¬μ§€μ…˜μ΄ ν˜„μž¬ μœ„μΉ˜κΉŒμ§€μ˜ λͺ¨λ“  ν¬μ§€μ…˜μ— μ°Έμ—¬ν•œλ‹€.
( μΈμ½”λ”λŠ” μž…λ ₯이 μ •ν•΄μ§„ μƒνƒœμ΄κΈ° λ•Œλ¬Έμ— λͺ¨λ“  λ²”μœ„μ— λŒ€ν•΄ μ–΄ν…μ…˜μ„ ν™•μΈν• μˆ˜ μžˆμ§€λ§Œ λ””μ½”λ”λŠ” ν˜„μž¬ μœ„μΉ˜μ—μ„œ μ•žμ— μžˆλŠ” 것에 λŒ€ν•΄μ„œλ§Œ μ–΄ν…μ…˜μ„ κ³„μ‚°ν• μˆ˜ μžˆλ‹€. ) 
λ””μ½”λ”μ—μ„œ the auto-regressive propertyλ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄ 정보가 μ™Όμͺ½ λ°©ν–₯으둜 흐λ₯΄λŠ” 것을 막을 ν•„μš”κ°€ μžˆλ‹€.
κ³„μ‚°μ˜ 편의( softmax에 0이 μž…λ ₯λ˜λŠ” 것을 막기 μœ„ν•΄ ) ν˜„μž¬ μœ„μΉ˜μ˜ λ‹€μŒ μœ„μΉ˜μ— ν•΄λ‹Ήλ˜λŠ” κ³³μ—λŠ” softmax μž…λ ₯의 λͺ¨λ“  값을 ( - λ¬΄ν•œλŒ€ )둜 λ§ˆμŠ€ν‚Ήν•˜μ—¬ scaled dot-product attention λ‚΄λΆ€λ₯Ό κ΅¬ν˜„ν–ˆλ‹€.

3개의 μ–΄ν…μ…˜

def attention(Q, K, V):
        num = np.dot(Q, K.T)
        denum = np.sqrt(K.shape[0])   #DkλŠ” Key의 차원
        return np.dot(softmax(num / denum), V)

Attention Formular

μœ„ μˆ˜μ‹κ³Ό μ•„λž˜ 그림은 μ •ν™•ν•˜κ²Œ λ™μΌν•˜λ‹€.
μˆ˜μ‹μ„ λ¨Όμ € μ„€λͺ…ν•˜λ©΄
QK^tλ₯Ό κ³±ν•˜μ—¬ ROOT dk(DkλŠ” Key의 차원)둜 λ‚˜λˆˆλ‹€. 이 값을 softamxλ₯Ό μ·¨ν•΄ λ‚˜μ˜¨ 값에 Vλ₯Ό κ³±ν•œλ‹€.
그림을 μ„€λͺ…ν•˜λ©΄
Q와 Kλ₯Ό MatMul( Matrix Multiplcation )을 ν•œ ν›„ Scalingν•œλ‹€.
이후에 Mask(opt) -> 이것에 λŒ€ν•΄μ„œλŠ” λ”°λ‘œ μ„€λͺ…
이 값을 softmaxλ₯Ό 거치고
V와 MatMulλ₯Ό ν•œλ‹€.
(dkλŠ” μŠ€μΌ€μΌμ„ λ§žμΆ”κΈ° μœ„ν•œ κ°’μœΌλ‘œ 전체λ₯Ό λ”ν•œ 것을 ν‰κ· ν•œ κ²ƒμœΌλ‘œ 봐도 λœλ‹€ )
μˆ˜μ‹μ— λŒ€ν•œ μ„€λͺ…κ³Ό μˆœμ„œλ„μ— λŒ€ν•œ μ„€λͺ…이 μ •ν™•νžˆ λ™μΌν•œ 것을 λ³Ό 수 μžˆλ‹€.
* Dk둜 λ‚˜λˆ„λŠ” μ΄μœ λŠ” small gradientλ₯Ό 막기 μœ„ν•œ 쑰치( 일반적으둜 attentionμ—λŠ” dot productionκ³Ό additive attention 두 κ°€μ§€κ°€ μžˆλŠ”λ° transformerμ—λŠ” scale이 λ“€μ–΄κ°€λŠ” 것을 μ œμ™Έν•˜κ³€ dot production attentionκ³Ό λ™μΌν•˜λ‹€ )

![Scaled Dot Product Attention](https://github.com/beyondnlp/nlp/raw/master/scaled_dot_product_attention

multi head attention V, K, Q

.png)

μ™œ λ©€ν‹° ν—€λ“œμΈκ°€

μ–΄ν…μ…˜μ΄ 처음 λ‚˜μ™”μ„λ•Œ μ–΄ν…μ…˜μ€ 전체 μž„λ² λ”©μ— ν•˜λ‚˜μ˜ weight값을 μ μš©ν•˜μ˜€λ‹€.
300차원이건 200차원이건 λ™μΌν•˜λ‹€
그런데 이 μ»¬λŸΌλ²‘ν„°λ₯Ό λͺ‡κ°œμ˜ 쑰각으둜 μ–΄ν…μ…˜μ„ μ μš©ν•˜λ©΄ μ’€ 더 νš¨κ³Όμ μ΄μ§€ μ•Šμ„κΉŒ 이것이 λ©€ν‹°ν—€λ“œ μ–΄ν…μ…˜μ˜ λ„μž…μ μ΄λ‹€

multi head attention

multi head attention step

  • self attention의 경우 Q,K,Vκ°€ λͺ¨λ‘ λ™μΌν•˜κ²Œ μž…λ ₯ μž„λ² λ”©μ„ μ‚¬μš©ν•œλ‹€.
  • μ•„λž˜ μ΄λ―Έμ§€λŠ” 그쀑 ν•˜λ‚˜(Q)λ₯Ό 기본으둜 ν•˜κ³  λ§ˆμ§€λ§‰ λ‚΄μ λ§Œ Q*K둜 κ°€μ •ν•œλ‹€. mha

reference