
대부분 시퀀스 변환 모델은 RNN/CNN 기반 인코더-디코더 구조. 가장 성능 좋은 모델도 어텐션 메커니즘으로 인코더-디코더 구조
→ 더 심플한 트랜스포머 구조 제안. Recurrent/Convolution 연산 배제
2개 기계 번역 테스크에서 병렬화, 학습 시간 줄이는데 아주 좋아요
8개 GPU로 3.5일 동안 훈련해서 WMT 2014 SOTA 찍음. 우리가 짱
RNN/LSTM/gated-RNN이 그 동안 시퀀스 모델링/변환 문제에서 짜세였음. 많은 사람들이 도전했었음.
RNN의 문제점: 기억력 이슈로 example 간 배치 연산 제한됨 ⇒ 병렬화 안 됨. 최근(2017) 연구 중, factorization, conditional computation 등 일부 발전함 → 하지만 시퀀스 연산에서 제한은 여전히…
어텐션 매커니즘: RNN과 함께 사용됨
반복 피하고 입/출력 종속성을 줄이기 위해 트랜스포머 만들었음. 트랜스포머는 병렬화할 수 있고 GPU 8개 12시간으로 학습해도 번역에서 SOTA임.
시퀀스 연산 줄이려는 시도: Extended Neural GPU, ByteNet, ConvS2S → CNN을 기본 블록으로 사용, 입출력 hidden 계층을 병렬로 연산
위치에 따라 연산량이 ConvS2S에서는 linear, ByteNet에서는 지수적으로 증가 → 멀리 떨어져 있는 시퀀스 학습 힘듦 vs 트랜스포머에서는 일정함
트랜스포머에서 attention 계수에 따라 effective resolution이 낮아짐
출처: https://yonghip.tistory.com/entry/%EB%B6%80%EC%8A%A4%ED%8A%B8%EC%BA%A0%ED%94%84-Transformer-%EC%A0%95%EB%A6%ACeffective resolution이 낮아지는 현상을 Multi-Head Attention으로 해결
Self-attention(intra-attention)은 시퀀스 내 attention임. 시퀀스 내 위치를 연관지어서 시퀀스 표현을 계산함
Self-attention은 독해, 요약, 텍스트 함의, 문장 표현 학습에서 짱짱맨
출처: https://en.wikipedia.org/wiki/Textual_entailment
End-to-end 메모리 네트워크: recurrent attention에 기반함 → 그리고 단순한 QA와 language modeling에서 좋았음!
그러나! 트랜스포머는 최초의 변환(transduction) 모델임. RNN, 콘볼루션 사용 안 함.
transduction는 특수한 케이스 → 특수한 케이스로 대응하는 reasoning이다. conversion이 아닌 이유: conversion은 바뀌는 과정이 단순한 경우에 사용하기 때문. 트랜스포머 작동을 간단하게 설명하면 입력 시퀀스 넣으면 출력 시퀀스가 나오는데, 이는 AI 처음 배울 때 나오는 회귀(Regression)와 다름. 회귀는 입출력 형식(차원)이 정해져 있는 반면, 트랜스포머는 입출력 형식이 정해져 있지 않음. 따라서 입력을 넣으면 출력으로 ‘변환’된다고 표현하는 듯. 우리 STS 강의에서 했던 N21, N2M 생각해보면 좋음. 문장마다 다른 토큰 개수 맞추기 위해 임베딩을 Collation하지만, 본질적으로는 문장마다 ‘특수한’ 케이스를 출력하므로 트랜스포머를 transduction 모델이라고 지칭하는게 아닐까 싶음.
attention 함수는 query, key-value 쌍, output으로 표현됨. 전부 벡터임. query, key로 계산된 계수로 value를 weighted-sum.


query, key의 차원: , value의 차원:
query * key 하고 로 나누고 softmax 취해서 value 곱함
query 묶어서 Q라는 행렬로 표현. key, value도 각각 K, V로.
가장 흔하게 쓰이는 attention 함수는 additive attention, dot-product attention임. dot-product와는 스케일링 인자를 가지는 것 이외는 전부 동일.
Additive attention은 1개 은닉층으로 구성된 FFN를 사용해서 함수(compatibility function)을 계산함
Dot product attention과 Additive attention은 복잡도가 똑같으므로(로 동일. 행렬 곱 연산에서 복잡도 참고.) Dot product가 빠르고 공간을 덜 차지한다.
가 작은 경우에는 두(dot product, additive) 어텐션이 비슷하게 동작하지만, 가 큰 경우에는 additive < dot-product. additive에서 소프트맥스 연산 사용.
반면, dot-product에서 값이 클 수록 소프트맥스 함수를 완전 작은 그래디언트로 만듦. dot-product 결과가 additive로 들어가기 때문에 로 스케일링 함.

쿼리, 키, 값을 학습 가능한 선형 변환(여기서는 행렬 이 학습 대상)을 차원으로 번 투영한게 더 좋음.
각 투영된 쿼리, 키, 값을 병렬로 수행 → 헤드마다 독립적으로 어텐션 수행 → 헤드 별 representation subspace 정보 학습 가능
헤드 별 출력을 concat함 → 다시 투영. 이때도 선형 변환으로 투영하는데, 학습 대상은
멀티 헤드의 이점 다시 정리: 헤드 별로 다른 representation subspace에서 다양한 위치와 정보를 동시에 주목(attend)! 단일 헤드는 이를 방해함.
헤드는 8개. 따라서 헤드 별 차원은 를 8개로 나눈 64
전체 계산량은 동일하지만, 헤드 별로 따로 attention 학습
Encoder-Decoder Attention
쿼리는 이전 디코더 층에서, 메모리 키와 값은 인코더 출력에서 온다. (정확히는 ‘쿼리들, 키들, 값들’)
디코더에 모든 위치가 입력 시퀀스 모든 위치를 attend 하도록 → 전형적인 encoder-decoder attention 모방
Encoder Attention
키, 값, 쿼리가 이전 인코더 층 출력에서 온다. 현재 인코더 위치 별로 이전 인코더 위치 전체를 attend 하도록
Decoder Attention
인코더 어텐션과 비슷: 현재 디코더의 위치 별로 이전 디코더 층 위치 전체를 attend 하도록
하지만 auto-regressive 특성을 살리기 위해 미래(논문 표현 leftward) 정보 참조를 방지함 → scaled dot product 어텐션 내부에 미래 정보를 음의 무한대로 마스킹 → 소프트맥스 입력에서 미래 정보 참조 막기 위함
인코더/디코더에 FFN → 각 위치를 따로, 동등하게 적용함
선형 변환 - 렐루 - 선형 변환
층 별로 가중치 다름.
FFN을 다르게 표현하는 방법: 커널 크기가 1인 2개 conv
패딩은 언급 없으니 0, 스트라이드는 최소 단위인 1, 입력 크기를 n이라고 하면, 
입출력 차원: , FFN 내부 차원

학습된 임베딩: 입출력 토큰을 차원 벡터로 변환
학습된 선형 변환 & 소프트맥스: 디코더 출력을 다음 토큰 확률로 변환
두 임베딩 층(인코더, 디코더)에서 같은 가중치 행렬 공유
선형 변환도 마찬가지
임베딩 층에서 가중치에 곱함
recurrence, convolution 없으므로 상대/절대적 위치 정보를 주입해야 함 → 임베딩에 positional encoding 더 해서 인코더/디코더로 들어감
positional encoding이 와 차원이 같아서 덧셈 가능

pos는 위치, i는 차원 → 각 positional encoding의 차원은 sinusoid와 대응
상대 위치에 따라 모델이 attend 행위를 학습할 수 있다고 가정 → 괴상한 식..
인덱스가 0부터 시작해서 짝홀 순서입니다
| 고주파 - 짝 | 고주파 - 홀 | 저주파 - 짝 | 저주파 - 홀 |
|---|---|---|---|
| 값이 자주 바뀜(증-감-증-감) | 값이 자주 바뀜(감-증-감-증) | 값이 덜 바뀜(증-감-증-감) | 값이 덜 바뀜(감-증-감-증) |
주파수 변화가 지수적으로 이루어진다 → 비대칭 → 같은 토큰이라도 위치가 다르면 비대칭하게 positional encoding을 준다. → 긴 문맥 정보도 학습할 수 있다
함수를 고정해서 학습 중에 보지 못한 위치도 표현 가능
k를 오프셋으로 두어서 위치를 선형 변환함 → sin, cos 합차 공식
비교를 위한 3개의 기준
연산 복잡도 per 층
최소 순차 연산량로 측정되는 병렬화 가능한 계산량 → 순차적인 데이터는 병렬화가 안 됨
네트워크에서 장거리 의존성 간 경로 길이: 최대 경로 길이
시퀀스 앞뒤로 왔다갔다하는게 학습에 영향을 미침 → 짧으면 쉬움
다양한 레이어로 구성된 네트워크에서 경로 길이도 비교 → 셀프 어텐션, CNN, RNN 비교

연산 복잡도 per 층: 이면 Recurrent보다 셀프 어텐션이 더 빠름
순차 연산량: Recurrent는 인데 셀프 어텐션은 상수
제한된 셀프 어텐션 설명: 출력 위치 중심으로 입력 시퀀스 일부만 참조(윈도우 길이 r) → 최대 경로 길이 복잡도는 로 증가
Convolution에서 이면 입출력 위치 연결 X. Recurrent보다 배 연산 복잡함


WMT 2014 영-독 번역에서 big 모델이 BLEU 28.4 달성
WMT 2014 영-프 번역에서 big 모델이 BLEU 41.0 달성
빔 서치 사용함 → 길이는 4, 패널티는
출력 시퀀스가 너무 짧아지는 문제를 해결하기 위해서 패널티를 추가함 
dev set(newstest2013 데이터셋) 실험 후에 선택됨
추론 중 출력 길이 제한을 입력 길이 +50으로 설정. 가능하면 일찍 종료함
부동 소수점 연산 수 추정함: 학습 시간 x GPU 수 x 각 GPU에서 부동 소수점 정밀도(single-precision floating point capacity)

각 구성 요소의 중요성 평가 → 기존 모델 변형. newstest2013 영-독 번역 성능 변화 측정
빔 서치는 썼는데, 체크포인트 평균화는 X
Table 3 (A): 어텐션 헤드 수와 키/값의 차원 변화
Table 3 (B): 어텐션 키 크기 줄여도 모델 품질 저하됨 → 키-쿼리의 유사성 계산에 표현이 부족해지지 않을까? → 더 정교한 함수가 있지 않을까?
Table 3 (C), (D): big 모델이 짱짱, 드롭아웃이 과적합에 좋음
Table 3 (E): positional encoding을 학습 임베딩으로 교체해도 비슷

트랜스포머 범용성 평가하기 위해 영어 구성 구문 분석 실험 수행
주어진 문장: The quick brown fox jumps over the lazy dog.
S
├── NP (The quick brown fox)
└── VP (jumps over the lazy dog)출력이 트리 형식으로 빡세고, 입력보다 길다.
RNN S2S는 작은 데이터셋 환경에서 SOTA 못 했음
4개 층, 설정으로 Penn Treebank에서 추출한 약 4만 개 WSJ 데이터로 학습
정확도 높은 BerkeleyParser corpora 1700만개 문장과 반지도학습 세팅 포함
WSJ만 사용 → 16000개 어휘, 반지도학습 설정 32000개 어휘 사용
어텐션과 residual하게 적용한 드롭아웃, 학습률, 빔 서치 사이즈만 실험하고 나머지는 영-독 기본 모델 설정 그대로
출력 제한을 입력 길이 + 300으로 늘림
빔 크기 21, 패널티 0.3으로 둠
별도로 작업에 특화해서 튜닝 안해도 RNN 이김. 심지어 WSJ 데이터만 사용해도 BerkeleyParser 이김 ㅎㅎ
오직 attention만 사용하는 transduction model인 트랜스포머 제시했음. RNN 안쓰고 멀티헤드어텐션 씀
번역 작업에서 트랜스포머 학습 속도가 RNN/CNN 기반 모델보다 현저히 빠름 → WMT 2014 영-독, 영-프 작업 모두 우리가 SOTA 찍었음. 영-독은 심지어 앙상블도 이김 ㅎㅎ
어텐션 기반 모델의 미래 기대하고 있겠음. 다른 테스크에도 적용해보려고 함. 입출력 modality를 확장해서 이미지, 오디오, 비디오와 같은 대규모 입력과 출력을 효율적으로 처리하고 싶음 → 어텐션 메커니즘 더 파 볼 생각. local: 입력에 일부만, restricted한 어텐션 → 영역 제한해서 거기서 만 어텐션
덜 순차적으로 생성하는 것도 목표임 → 병렬화할 수 있음