{{위키데이터 속성 추적}}

{{기계 학습}}

[[신경망]]에서 '''주의 집중'''(attention, 어텐션)은 [[인지심리학]]에서의 [[주의]]를 모방하여 고안된 기술이다. 주의 집중은 입력 데이터 중 일부의 효과를 증강시키며, 다른 일부를 감소시킨다. 이는 네트워크가 데이터 중 비중이 적지만 중요한 데이터에 더 집중하게 하기 위해서이다. 데이터 중 어느 부분을 학습하는 것이 다른 부분을 학습하는 것보다 더 중요한지는 문맥에 따라 결정되며, 이는 [[경사하강법]]으로 학습된다.

어텐션이나 이와 유사한 메커니즘은 1990년대에 곱셈 모듈, 시그마 파이 단위, 하이퍼네트워크와 같은 이름으로 도입되었다.<ref name=Lecun2020 /> 주의 집중의 유연성은 런타임 동안 고정되어 있는 표준 가중치와는 달리, 런타임 도중에 변경될 수 있는 '소프트 가중치'로서의 역할에서 온다. 

주의 집중은 뉴럴 튜링 머신의 기억, 미분가능 뉴럴 컴퓨터의 추론 작업,<ref name=Graves2016 /> 트랜스포머 계열 모델의 언어 처리, 지각자(perceiver)의 다중 감각 데이터 처리 (소리, 이미지, 영상, 텍스트) 등에 활용된다.<ref name=allyouneed /><ref name=Ramachandran2019 /><ref name=jaegle2021 /><ref name=tiernan2021 />

== 개요 ==

인덱스 <math>i</math>가 붙은 일련의 [[낱말 분석#토큰|토큰]]이 주어졌을 때, 신경망은 각 토큰에 대하여 <math display="inline">w_i \ge 0</math>이며 <math display="inline">\sum_i w_i = 1</math>인 소프트 가중치 <math>w_i</math>를 계산한다. 각 토큰에는 <math>i</math>번째 토큰의 [[단어 임베딩]]으로부터 계산된 값 벡터 <math>v_i</math>가 할당된다. 가중 평균 <math display="inline">\sum_i w_i v_i</math>이 주의 집중의 출력이다.

쿼리-키 메커니즘은 소프트 가중치를 계산한다. 각 토큰의 단어 임베딩으로부터 각각의 쿼리 벡터 <math>q_i</math>와 키 벡터 <math>k_i</math>가 계산된다. 가중치는 내적 <math>q_i k_j</math>의 [[소프트맥스 함수]]를 취하여 얻는다. 여기서 <math>i</math>는 현 토큰, <math>j</math>는 주의가 기울여지는 토큰을 나타낸다.

== 언어 번역 예시 ==

영어를 프랑스어로 번역하는 기계를 만들려면 기본적인 인코더-디코더를 사용하고 여기에 주의 단위를 접목한다 (하단 다이어그램 참조). 가장 간단한 사례에서, 주의 단위는 순환 인코더 상태(recurrent encoder state)의 내적으로 구성되며 훈련이 필요하지 않다. 실제 모델 학습 상황에서, 주의 단위는 훈련이 필요한 쿼리-키-값(query-key-value)이라고 하는 3개의 완전연결 신경망 [[층]]으로 구성된다. 아래 '변형' 섹션을 참고하시오.

[[파일:attention-animated.gif|섬네일|왼쪽|700픽셀|주의 단위가 있는 인코더-디코더. 왼쪽(검정색 선)이 인코더-디코더, 가운데(오렌지색 선)이 주의 단위, 오른쪽(회색 선)이 계산된 데이터이다. H 행렬 내의 회색 영역과 w 벡터가 0 값이다. 숫자로 된 아래첨자는 벡터 크기, 문자로 된 아래첨자 i와 i - 1은 시간 스텝을 나타낸다.
<br>
정지된 그림을 보려면 여기를 클릭하시오.: {{File:Attention-1-sn.png}}
]]

{| class="wikitable"
|+범례
!Label
!설명
|-
|100
|문장 최대 길이
|-
|300
|임베딩 크기 (단어의 차원)
|-
|500
|은닉 벡터 크기
|-
|9k, 10k
|각각 입력과 출력 언어의 사전 크기
|-
|<u>x</u>, <u>Y</u>
|길이 9,000과 10,000의 원핫 사전(dictionary) 벡터.  <u>x</u> → x implemented as a lookup table rather than vector multiplication.  <u>Y는</u> is the 1-hot maximizer of the linear Decoder layer D; that is, it takes the argmax of D's linear layer output.
|-
|x
|길이 300의 단어 임베딩 벡터. 이 벡터는 보통 GloVe나 Word2Vec 등 다른 프로젝트로부터 미리 계산된다.
|-
|h
|길이 500의 인코더 은닉 벡터.  각 시점에서, 이 벡터는 이보다 앞서 등장하는 모든 단어를 요약한다. 마지막 h는 "문장" 벡터로 볼 수 있다. Hinton은 이를 'thought vector'라 불렀다.
|-
|s
|길이 500의 디코더 은닉 상태 벡터.
|-
|E
|500개의 뉴런 [[순환 신경망|RNN]] 인코더.  500개의 출력. 입력 개수는 소스 임베딩으로부터의 (800–300)개 + 500개의 순환 연결. 인코더는 초기화 목적으로 디코더로 직접 입력되지만 그 이후는 아니다. 즉 직접적 연결은 매우 희미하게 나타난다.
|-
|D
|2층 디코더. 순환층(recurrent layer)은 500개의 뉴런이 있고 완전연결 선형층(fully-connected linear layer)는 10,000개의 뉴런을 갖고있다. (타겟 단어장의 크기).<ref name="pytorch_s2s"/> 선형층 단독으로는 5백만개(500 x 10,000)의 가중치를 갖는다. 이는 순환층보다 최대 10배 많은 가중치이다.
|-
|score
|길이 100의 Alignment 점수
|-
|w
|길이 100의 주의 가중치 벡터.  이들은 학습 단계에서 변하는 "하드" 뉴런 가중치와는 달리, 전방 통로(forward pass)에서 변하는 "소프트" 가중치이다.
|-
|A
|주의 모듈 — 이는 순환 상태의 내적이거나, 쿼리-키-값 완전연결층일 수 있다. 출력은 길이 100의 벡터 w이다.
|-
|H
|500×100. 행렬로 concatenate 된 100개의 은닉 벡터 h.
|-
|c
|길이 500의 문맥 벡터 = H * w.  c는 h 벡터가 w로 weighted된 선형 결합이다.
|}


주의 가중치를 행렬이라고 보면, 이는 네트워크가 문맥에 따라 초점을 조정하는 방법을 보여준다.

{|
|-
|
| I || love || you
|-
| je
| style="background-color:black; color:white; border:1px solid black;" | 0.94
| style="background-color:white; color:black; border:1px solid black;" | 0.02
| style="background-color:white; color:black; border:1px solid black;" | 0.04
|-
| t'
| style="background-color:white; color:black; border:1px solid black;" | 0.11
| style="background-color:white; color:black; border:1px solid black;" | 0.01
| style="background-color:grey ; color:white; border:1px solid black;" | 0.88
|-
| aime
| style="background-color:white; color:black; border:1px solid black;" | 0.03
| style="background-color:black; color:white; border:1px solid black;" | 0.95
| style="background-color:white; color:black; border:1px solid black;" | 0.02
|}

주의 가중치에 대한 이러한 관점은 신경망이 비판받는 "[[설명가능성]]" 문제를 해결한다. 단어 순서에 관계 없이 축어 번역(verbatim translation)을 수행하는 네트워크는 이러한 용어로 분석할 수 있는 경우 대각선으로 지배적인 행렬(diagonally dominant matrix)을 갖게 된다. 비대각선 우성(off-diagonal dominance)은 주의 메커니즘이 더 미묘하다는 것을 보여준다. 디코더를 통한 첫 번째 통로에서 주의 가중치의 94%는 첫 번째 영어 단어 "I"에 있으므로 네트워크는 단어 "je"를 제공한다. 디코더의 두 번째 통로에서 주의 가중치의 88%는 세 번째 영어 단어 "you"에 있으므로 "t'"를 제공한다. 마지막 통로에서는 주의 가중치의 95%가 두 번째 영어 단어 "love"에 있으므로 "aime"을 제공한다.

* 참고: 프랑스어 'je'는 '나', 'aime'은 사랑하다, "t'"는 모음으로 시작하는 동사 앞에 붙어 '너를'이라는 의미이다.

== 변형 ==

주의 집중에는 여러 가지 변형이 있다. 그 중 일부는 내적, 쿼리-키-값,<ref name="allyouneed" /> hard, soft, self, cross, Luong<ref name="xy-dot" />, Bahdanau<ref name=Bahdanau /> 등이다. 이러한 변형 주의 집중은 그 효과를 각 타겟 출력에 재분배하기 위하여 인코더 쪽의 입력을 재결합한다. 종종 상관(correlation) 스타일의 내적 행렬은 계수(coefficient)의 re-weighting을 제공한다. (하단 범례 참고)

{| class="wikitable"
|-
!1. 인코더-디코더 내적
! 2. 인코더-디코더 QKV
! 3. 인코더만 있는 내적
! 4. 인코더만 있는 QKV
! 5. 파이토치 튜토리얼
|-
| [[파일:attn-xy-dot.png |섬네일|주의집중을 계산하려면 인코더와 디코더가 모두 필요하다.<ref name=xy-dot />]]
| [[파일:attn-xy-qkv.png |섬네일|주의집중을 계산하려면 인코더와 디코더가 모두 필요하다.<ref name=xy-qkv />]]
| [[파일:attn-xx-dot.png |섬네일|주의집중을 계산하는 데에 디코더는 사용되지 않는다. corr은 1개의 입력만 가지며, W는 내적의 자기상관이다.  w<sub>'''ij'''</sub> = x<sub>'''i'''</sub> x<sub>'''j'''</sub><ref name=xx-dot />]]
| [[파일:attn-xx-qkv.png |섬네일|주의집중을 계산하는 데에 디코더는 사용되지 않는다.<ref name=xx-qkv />]]
| [[파일:attn-pytorch-tutorial.png |섬네일|주의집중을 계산하기 위하여 내적 상관 대신 완전연결층이 사용된다 .<ref name=pytorch-tutorial />]]
|}

{| class="wikitable"  style="width 55em"
|+ 범례
|-
! Label !! 설명
|- 
| 변수 X, H, S, T || 대문자로 된 변수는 현재 단어가 아닌 전체 문장을 가리킨다. 예를 들어 H는 인코더 은닉 상태의 행렬이다. - 
|-
| S, T || S는 디코더 은닉 상태, T는 타겟 단어 임베딩이다.  파이토치 튜토리얼 변형의 학습 단계에서, T는 사용된 [[teacher forcing]]의 단계에 따라 2개의 소스를 번갈아가며 사용한다. T는 네트워크의 출력 단어의 임베딩일 수 있다. i.e. embedding(argmax(FC output)).  Teacher forcing이 사용될 경우, T는 1/2 등의 상수 forcing 확률로 발생하는, 알려진 정확한 단어의 임베딩일 수 있다.
|-
| X, H || H, 인코더 은닉 상태; X, 입력 단어 임베딩.
|-
| W || 주의 계수
|-
| Qw, Kw, Vw, FC || 각각 쿼리, 키, 벡터를 위한 가중치 행렬. FC는 완전히 연결된 가중치 행렬이다.
|-
| ⊕, ⊗ || ⊕, 벡터 concatenation; ⊗, 행렬곱.
|-
| corr || 열 단위의 소프트맥스 (내적의 모든 조합의 행렬).  내적은 변형 #3 에서 '''x<sub>i</sub>* x<sub>j</sub>''', 변형 #1 에서 '''h<sub>i</sub>* s'''<sub>j</sub> , 변형 #2 에서 column<sub>'''i''' </sub>( Kw * H ) * column<sub> '''j''' </sub>( Qw * S ), 변형 #4에서 column<sub>'''i''' </sub>(Kw * X) * column<sub> '''j''' </sub>(Qw * X)이다. 변형 #5는 계수를 결정하기 위하여 완전연결층을 사용한다. 만약 그 변형이 QKV라면, 내적은 sqrt(d)에 의해 정규화되며 여기서 d는 QKV 행렬의 높이이다.
|}

== 같이 보기 ==

* {{Section link|변환기 (기계 학습)|Scaled dot-product attention}}
* {{Section link|Perceiver|Components}} for query-key-value (QKV) attention

== 참고 문헌 ==

{{각주|refs=
<ref name="pytorch_s2s">{{웹 인용| url = https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html | title = Pytorch.org seq2seq tutorial | access-date=December 2, 2021 }}</ref>

<ref name=Lecun2020>{{영상 인용|people=Yann Lecun |date=2020 |title= Deep Learning course at NYU, Spring 2020, video lecture Week 6 | url=http://www.youtube.com/watch?v=ycbMGyCPzvE?t=3182 | access-date=2022-03-08 | time=53:00 }}</ref>

<ref name=Graves2016>{{저널 인용| date=2016-10-12|title=Hybrid computing using a neural network with dynamic external memory|journal=Nature|language=en|volume=538|issue=7626|doi=10.1038/nature20101|issn=1476-4687|pages=471–476|pmid=27732574|bibcode=2016Natur.538..471G|s2cid=205251479|url=https://ora.ox.ac.uk/objects/uuid:dd8473bd-2d70-424d-881b-86d9c9c66b51|last1=Graves|first1=Alex|last2=Wayne|first2=Greg|last3=Reynolds|first3=Malcolm|last4=Harley|first4=Tim|last5=Danihelka|first5=Ivo|last6=Grabska-Barwińska|first6=Agnieszka|last7=Colmenarejo|first7=Sergio Gómez|last8=Grefenstette|first8=Edward|last9=Ramalho|first9=Tiago|last10=Agapiou|first10=John|last11=Badia|first11=Adrià Puigdomènech|last12=Hermann|first12=Karl Moritz|last13=Zwols|first13=Yori|last14=Ostrovski|first14=Georg|last15=Cain|first15=Adam|last16=King|first16=Helen|last17=Summerfield|first17=Christopher|last18=Blunsom|first18=Phil|last19=Kavukcuoglu|first19=Koray|last20=Hassabis|first20=Demis}}</ref>

<ref name=allyouneed>{{ArXiv 인용|last1=Vaswani|first1=Ashish|last2=Shazeer|first2=Noam|last3=Parmar|first3=Niki|last4=Uszkoreit|first4=Jakob|last5=Jones|first5=Llion|last6=Gomez|first6=Aidan N.|last7=Kaiser|first7=Lukasz|last8=Polosukhin|first8=Illia|date=2017-12-05|title=Attention Is All You Need|class=cs.CL|eprint=1706.03762}}</ref>

<ref name=Ramachandran2019>{{ArXiv 인용|last1=Ramachandran|first1=Prajit|last2=Parmar|first2=Niki|last3=Vaswani|first3=Ashish|last4=Bello|first4=Irwan|last5=Levskaya|first5=Anselm|last6=Shlens|first6=Jonathon|date=2019-06-13|title=Stand-Alone Self-Attention in Vision Models|class=cs.CV|eprint=1906.05909}}</ref>

<ref name=jaegle2021 >{{ArXiv 인용|last1=Jaegle|first1=Andrew|last2=Gimeno|first2=Felix|last3=Brock|first3=Andrew|last4=Zisserman|first4=Andrew|last5=Vinyals|first5=Oriol|last6=Carreira|first6=Joao|date=2021-06-22|title=Perceiver: General Perception with Iterative Attention|class=cs.CV|eprint=2103.03206}}</ref>

<ref name=tiernan2021 >{{웹 인용|last=Ray|first=Tiernan|title=Google's Supermodel: DeepMind Perceiver is a step on the road to an AI machine that could process anything and everything|url=https://www.zdnet.com/article/googles-supermodel-deepmind-perceiver-is-a-step-on-the-road-to-an-ai-machine-that-could-process-everything/|access-date=2021-08-19|website=ZDNet|language=en}}</ref>

<ref name=xy-dot>{{ArXiv 인용|last1=Luong|first1=Minh-Thang| date=2015-09-20 |title=Effective Approaches to Attention-based Neural Machine Translation |class=cs.CL| eprint=1508.04025v5}}</ref>

<ref name=xy-qkv>{{영상 인용|people = Neil Rhodes |date=2021 |title= CS 152 NN—27: Attention: Keys, Queries, & Values | url=https://www.youtube.com/watch?v=rA28vBqN4RM  | access-date=2021-12-22 | time=06:30 }}</ref>

<ref name=xx-dot>{{영상 인용|people = Alfredo Canziani & Yann Lecun |date=2021 |title= NYU Deep Learning course, Spring 2020 | url=https://www.youtube.com/watch?v=f01J0Dri-6k | access-date=2021-12-22 | time=05:30 }}</ref>

<ref name=xx-qkv>{{영상 인용|people = Alfredo Canziani & Yann Lecun |date=2021 |title= NYU Deep Learning course, Spring 2020 | url=https://www.youtube.com/watch?v=f01J0Dri-6k | access-date=2021-12-22 | time=20:15 }}</ref>

<ref name=pytorch-tutorial>{{웹 인용|url=https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html | title = NLP From Scratch: Translation With a Sequence To Sequence Network and Attention | last=Robertson|first=Sean|  website=pytorch.org|access-date=2021-12-22 }}</ref>

<ref name=Bahdanau>{{ArXiv 인용|last=Bahdanau|first=Dzmitry|date=2016-05-19|title=NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE|eprint=1409.0473}}</ref>

}}

== 외부 링크 ==
* [[Dan Jurafsky]] and James H. Martin (2022) [https://web.stanford.edu/~jurafsky/slp3/ ''Speech and Language Processing'' (3rd ed. draft, January 2022)], ch. 10.4 Attention and ch. 9.7 Self-Attention Networks: Transformers
* [[Alex Graves (computer scientist)|Alex Graves]] (4 May 2020), [https://www.youtube.com/watch?v=AIiwuClvH6k&vl=en-GB Attention and Memory in Deep Learning] (video lecture), [[DeepMind]] / [[University College London|UCL]], via YouTube
* [https://www.youtube.com/watch?v=yGTUuEx3GkA Rasa Algorithm Whiteboard - Attention] via YouTube

[[분류:기계 학습]]