Transformer (Attention Is All You Need) 2017
Abstract ~ Background
Transformer model -> RNN, CNN 사용하지 않고 Self-Attention으로만 구현 된 Sequence model
입력 문장 내의 단어들이 서로 어떤 연관이 있는지를 스스로 파악하게 해서 문맥을 이해함
(CNN을 사용한 모델들도 있지만 멀리 떨어진 단어의 관계를 파악하려면 Layer를 깊게 쌓아야 함 -> 연산 증가)
RNN, LSTM, GRU와 같은 Recurrent model들은 순차적으로 계산하고 hidden state를 생성
이와 같은 특성 때문에 학습 시 병렬 처리 불가능 + 연산 속도 느림 (+ 장기 의존성 문제)
Transformer는 Self-Attention을 통해 문장 내 단어 거리에 상관없이 한 번의 연산(O(1)) 으로 관계를 파악함
Complexity per Layer: 레이어당 연산 복잡도
Sequential Operations: 순차적 연산 횟수 (= 병렬 처리 가능한지 여부)
Maximum Path Length: 최대 경로 길이 (= 장기 의존성 해결 증명)
Model Architecture
Encoder, Decoder 모두 Self-Attention, fully connected layer를 포함하고 있음
Encoder and Decoder Stacks
Encoder
6개의 동일한 layer stack으로 구성됨 (N=6) stack마다 2개의 sub layer가 있음1. Multi-Head Attention 2. Feed Forward Network 이 두 개의 sub layer에 대해 residual connection(잔차 연결, input + output) 사용 + 정규화
Decoder
Encoder stack의 output에 대해 Multi-Head Attention 수행 Encoder와 동일한 구조에 하나의 layer가 추가된 구조 1. Masked Multi-Head Attetion 2. Multi-Head Attetion 3. Feed Forward Decoder는 순차적으로 결과를 만들어야 함 n번째 position인 단어를 predict한다고 하면, n보다 전에 있는 output에만 의존하여 predict를 해야하기 때문에 Masking을 이용 함
Scaled Dot-Product Attention
input: d_k의 Query, Key와 d_v의 Value
-> Q와 모든 K를 내적(Dot-Product, 두 벡터를 입력하면 하나의 수가 나오도록) 하고
각각 sqrt(d_k)로 나눔 (= 차원이 커질수록 내적 값이 커져 기울기 소실이 일어나기 때문에 이를 방지)
이후 softmax를 취해 V에 대한 weight를 얻음
Mask (opt. // option)
-> 아까 Masked Multi-Head Attention 일 때 사용됨
Decoder의 순차적으로 결과를 만들어야 하는 성질 때문에, 접근 불가의 position에 대해
-inf와 가까운 아주 작은 값으로 설정하여 softmax 함수를 지날 때 0에 수렴하도록 설계 하는 방식임
내적을 사용하기 때문에 연산이 빠르고 메모리 효율이 좋음
output: Value vector의 가중합
-> d_v 크기를 가진 벡터가 나오게 되는 것
Multi-Head Attention
input: d_k, d_v의 Query, Key와 Value
-> 전체 차원을 한 번에 계산하지 않고 h개의 서로 다른 Head로 나눔 (Linear Projection)
각각의 Head에서 앞서 설명한 Scaled Dot-Product Attention을 병렬로 수행
계산이 끝난 h개의 결과값들을 하나로 Concat 시킴
이때 결과값 = 옆으로 나란히 있는 상태 (정보들끼리 매칭되지 않음)
따라서 이후에 가중치 행렬을 곱해줌 (W^O) (=Linear 역할, 나열된 정보를 융합 -> 차원 일치시킴)
한 번의 Attention만 수행하면, 단어들 사이의 한 가지 관점 밖에 파악 못 함
여러 개의 Head로 나눠 병렬로 처리하면, 각 Head마다 다양한 관점을 동시에 파악할 수 있음
+ 차원을 h개로 나눠 연산하여, 연산량도 효율적이게 됨
output: 여러 Head에서 파악한 정보가 하나로 융합된 형태
Applications of Attention in our Model
Attention을 적용하는 방법은 sub layer에 속해있는 Attention마다 다름
Encoder-Decoder Attention layer (Decoder 위치) Q: Decoder 내의 이전 layer의 output K, V: Encoder의 최종 output input sequence의 모든 position에 접근 가능Self-Attention layer (Encoder 위치) Q, K, V: 모두 이전 Encoder layer의 output input sequence의 모든 position에 접근 가능Masked Self-Attetion layer (Decoder 위치) Q, K, V: 모두 이전 Decoder layer의 output input sequence의 모든 position에 접근 불가능 -> 해당 position 이전의 position까지만 접근 가능함 이전에 설명한 Masking 방식이 적용 되었기 때문임
Positional Encoding
Transformer에는 Positional Encoding layer 가 있음
단어의 위치(Position)을 알려주는 역할이며 이를 Encoder와 Decoder 하단에 배치함
왜 필요한지?
이전에 RNN은 단어를 순서대로(Sequential) 넣었음
Transformer는 모든 단어를 한 번에 병렬로(Simultaneously) 통째로 집어넣기 때문
따라서 단어의 위치 정보가 필요함
논문에서는 모델이 학습하는 위치 값(Learned)과 주기 함수인 sin/cos을 이용한 고정된 위치 값(Sinusoidal)을 비교
-> 결론적으로는 sinusoidal version을 택함
모델이 훈련되는 동안 마주친 길이보다 더 긴 sequence에 대해서 처리했기 때문임
Why Self-Attention
다른 기법들과 Self-Attention을 비교한 결과,
layer당 총 계산 복잡도가 줄어듦 병렬 처리가 가능한 계산이 늘어남 보다 더 긴 장거리 학습이 가능함
카페 게시글
과제게시판
Transformer, Attention Is All You Need (2017), review
신민서
추천 0
조회 82
26.03.17 21:22
댓글 6
북마크
번역하기
공유하기
기능 더보기
다음검색
첫댓글 decoder 블럭의 아래쪽의 outputs의 값의 의미를 설명하고 위쪽에 있는 output과 어떤관계인지 설명
언어번역의 예를 들어 실제로 반복실행할때마다 outputs 값이 어떻게 변해가는지 설명할것
decoder의 마스크 행렬은 계산할때마다 값이 변경되나요?
간단한 문장번역의 예를 들어 트랜스포머의 동작을 단계적으로 설명해볼것
디코더 하단의 outputs는 현재까지 생성된 누적 단어들을 의미합니다
상단에서 예측된 최종 output 단어가 다시 입력으로 추가되는 구조입니다
모델 추론 시 'I like apples'를 번역할 때 하단 입력이 <BOS>에서 시작해
<BOS> 나는, <BOS> 나는 사과를, 순서대로 <EOS>를 예측할 때까지 하나씩 만드는 구조입니다
모델 학습 시에는
<BOS> 나는 사과를 좋아한다 <EOS>
에서 shifted right (논문에서 디코더 하단의 output에 있는 의미) 오른쪽으로 한 칸 밀어서
<BOS> 나는 사과를 좋아한다
로 한 번에 넣고 병렬 처리를 하는 구조입니다
디코더의 마스크 행렬에 세팅한 -inf 값 (디코더 성질 auto-regressive을 유지하기 위함) 자체는 고정되어 있습니다
<BOS>(=SOS) : Beginning of sequence
<EOS> : End of sequence
모든 단어(토큰)들은 임베딩 벡터 즉, R^n 공간의 한점(n차원 실수벡터)으로 대응되는데 이런 관점에서 언어번역의 문제를 수학적으로 설명하면 뭐가 되나요?
한글 단어들을 n차원 실수 벡터로 대응시킨후 모아놓은 벡터공간 V과 영어단어들을 모아놓은 n차원 실수벡터들을 모아놓은 벡터공간 W사이의 대응관계 w=f(v), w in W and v in V를 찾는 문제로 해석해도 되는가 검토해볼것
decoder 블럭의 multi head attention블럭은 outputs에서 온 입력을 query로 사용하고 key,value는 encoder에서 온값을 사용한다. 이것의 의미는 무엇인가?
임베딩 벡터공간에서 두 벡터의 유사도는 어떻게 측정하는가?
임베딩 벡터공간에서 두벡터의 차이(거리)는 어떤의미를 갖는가?
한글임베딩공간에서 남자,여자 벡터의 거리와 영어임베딩공간에서 man, woman벡터의 거리는 비슷할까?
한글임베딩공간에서 나는 너를 사랑해의 각벡터를 이은 경로와 영어임베딩공간에서 i love you의 각 벡터를 이은 경로가 비슷할까?
어텐션은 임베딩공간에서 단어 벡터사이의 관계를 어떻게 파악하는가?
참고동양상 https://youtu.be/_Z3rXeJahMs
PLAY