NL-076, Reformer: The Efficient Transformer (2020-ICLR)
◼︎ Comment
- 전체적으로는 논문이 좀 어려운 편이라고 생각한다..
- 논문을 다 읽기 빡셀 수 있기 때문에 comment을 좀 긹게 써보자면..
- Reformer은 Transformer의 일부 단점을 보완하기위해 나온 것이다.
- 단점으로 말한 것은 Transformer은 full (self) attention이기 때문에 메모리를 많이 먹는다.
- 이것 때문에 긴 시퀀스를 처리하기 힘들기도 하다.
- 뭐 Reformer말고도 긴 시퀀스를 처리하려는 기존의 논문 XLNet등도 있지만, XLNet은 긴 시퀀스를 처리할 때 옛날 context을 잘 기억하려고 하는 방향이었다.
- XLNet은 따라서 성능은 좋을지라도 마찬가지로 메모리가 더욱 많이 들게 된다.
- Reformer은 그런개념이 아니라 메모리 사용을 줄여서 사용할 수 있게 하는 방향의 논문인 것이다.
- 구조자체는 Reverisible LSH Transformer라고 볼 수 있다.
- 즉 쓰이는 테크닉은 크게 2개라고 볼 수 있다.
- LSH / Reversible
- LSH attnetion
- 일종의 clustering 기법인데, 고차원의 벡터를 저차원의 벡터로 보내서 distance를 측정해도 고차원의 distance를 비교하는 것과 비슷한 결과가 나온다는 개념이다.
- 따라서 이것으로 모든 token끼리 attention을 하는 것이 아니라 clustering된 chunks끼리 attention을 취하는 것이다.
- 추가적으로 attention할 때, Q와 K는 같은 파라미터를 가지게 하며 (즉 Q=K)
- Q*K^T 대신 qi*K^T로 처리를 해서 메모리 사용량을 줄여준다.
- Reversible
- 이것은 이미 나와있는 논문의 기술을 가져온 것인데 여기서 처음 알았는데 되게 신선하다.
- 목적은 backprop을 하기 위해서는 그래프 중간 중간 값들을 기억해줘야 한다.
- 이러면 메모리가 많이 들기 때문에, 중간 중간 값들을 기억안해주기 위한 방법이다.
- ResNet 식으로 x+F(x)을 되어 있는 구조를 바꾸는 구조이다.
- 즉 ResNet으로 안되어있는 어떤 모델은 reversible 방법 적용은 안된다고 볼 수 있음
- 어떻게 보면, 새로운 모델 구조를 가지게 하는 것이고 이렇게 하면 기존보다 기억해야할 메모리는 줄어들지만, 성능적으로는 비슷하다는 결과이다.
- ref논문을 안읽어봤지만 스크리닝해보면, 여기서 reversible의 효과를 수식적으로 증명하기보단 실험적으로 보여주는 식이다.
- 여기서도 실험적으로 비슷하다는 결과를 도출한다.
- 크게 위의 두 가지 기술로 기존 Transformer을 학습할 때, 메모리 사용량은 크게 줄여주게 되고 비슷한 성능을 달성한다.
- 따라서 이 모델을 가져와 inference or fine-tuning할 때도 적은 메모리로도 사용가능하다는 컨트리부션을 가진 논문이다.
- 추가적으로 이 효과로 긴 시퀀스를 처리할 수 있기 때문에 긴 문장을 생성해야하는 태스크에서 쓰일 것 같다는 논문의 평이 있다.
0. Abstract
- Large Transformer models은 반복적으로 많은 task에서 SoTA 결과를 달성하나 이러한 모델들을 학습하는 것은 매우 비싸다.(특별히 long sequences에 대해서)
- 우리는 두 가지 테크닉으로 Transformers의 효율을 향상시킨다.
- 한 가지는, 우리는 locality-sensitive hashing을 사용하여 dot-product attentiond을 O()에서 O(L*logL) complexity로 바꾼다. (L은 sequence의 길이)
- 게다가, 우리는 일반적인 residuals 대신에 reversible residual layers을 사용하고 이것은 학습 과정에서 N번 대신, 한 번만 activations을 저장하면 된다. (N은 layer 수)
- 결과 모델인 Reformer는 트랜스포머 모델과 동등한 성능을 유지하면서 긴 시퀀스에서 훨씬 더 메모리 효율적이고 훨씬 빠릅니다.
1. INTRODUCTION
- Transformer 구조는 NLP에서 널리쓰이고 많은 task들에서 현재 SoTA을 달성하고 있다.
- 이러한 결과를 얻기 위해, 연구자들은 더 큰 Transformer 모델을 학습하는 것에 의존해왔다.
- (Shazeer et al., 2018)에보고 된 가장 큰 구성에서 매개 변수의 수는 레이어 당 0.5B를 초과하는 반면 (Al-Rfou et al., 2018)에서 레이어 수는 최대 64 개입니다.
- Transformer 모델들은 또한 점점 더 긴 sequences에서 사용된다.
- (Liu et al., 2018)에서 하나의 예제에서 텍스트의 11000개 tokens까지 프로레스가 진행되고 음악 (Huang et al., 2018) 및 이미지 (Parmar et al., 2018)와 같은 다른 모달리티를 처리 할 때도 더 긴 시퀀스가 일반적입니다.
- 이러한 large-scale long-sequence 모델들은 좋은 결과들을 야기하지만, 일부 사람들은 이러한 추세가 NLP 연구를 중단하고 있다고 주장하는 시점까지 리소스를 부담합니다.
- 많은 대형 트랜스포머 모델은 대규모 산업 연구 실험실에서만 현실적으로 훈련 할 수 있으며 모델 병렬 처리로 훈련 된 모델은 단일 GPU 단계에서 메모리 요구 사항에 따라 다중 가속기 하드웨어 설정이 필요하기 때문에 단일 GPU에서 미세 조정할 수 없습니다.
- 큰 Transformer 모델은 원천적으로 방대한 리소스을 요구하는지? 혹은 그것이 비효율적인지?
- 다음의 계산을 고려해야한다.
- the 0.5B parameters used in the largest reported Transformer layer account for 2GB of memory.
- 64K 토큰들, 1024 embedding size, batch size 8의 활성은 64K × 1K × 8 = 0.5B floats을 요구하고 2GB의 다른 메모리도 요구한다.
- 만약 우리의 메모리가 layer당 한 개만 사용한다면, 우리는 하나의 가속기에 64K 길이의 시퀀스에도 큰 Transformer를 꽤 쉽게 장착해야 한다.
- 더 나아가서, BERT 학습에 사용된 전체 코퍼스는 오직 17GB을 저장하도록 요구된다.
- 그렇다면 왜 우리는 이 모델들을 단일 기계에서 미세 조정조차 할 수 없는 것일까?
- 위의 추정치는 layer별로 메모리 및 입력 활성화 비용만 포함하며 Transformer에서 다음과 같은 주요 메모리 사용 소스를 고려하지 않는다.
- 활성화가 back-propagation을 위해 저장해야하기 때문에 N-layers을 가지는 모델의 메모리는 하나의 layer을 가지는 모델보다 N배 많다.
- 중간층의 feed-forward layers의 depth d_ff는 attention 활성화의 d_model보다 훨씬 크기 때문에 이것은(feed-forward) 많은 메모리 사용을 설명한다.
- 시퀀스 길이 L의 attention은 계산량과 메모리 복잡도 모두 O()이고 64K 토큰의 단일 시퀀스라도 가속기 메모리를 소진할 수 있다.
- We introduce the Reformer model which solves these problems using the following techniques:
- Reversible layers로 Gomez에서 첫 번째로 소개되었고 오직 전체모델에서 한번 activations의 copy를 저장하여 N factors가 사라진다.
- feed-forward 레이어 내부의 활성화를 분할하여 chunks로(하나의 학습 단위) 처리하면 d_ff 팩터가 제거되고 feed-forward 레이어 내부의 메모리가 절약된다.
- locality-sensitive hashing을 기반으로 한 대략적인 attention 계산은 attention층의 O() 인자를 O(L Log L)로 대체하므로 긴 시퀀스에서 작동이 가능하다.
- 우리는 이러한 기술들을 연구하고 그들이 스탠다드 Transformer와 비교하여 학습 프로세스에 큰 영향이 없다는 것을 보여준다.
- 활성화를 분리하는 사실은 오직 implementation에 영향이 있다.
- it is numerically identical to the layers used in the Transformer.
- 표준의 것 대신 reversible residuals을 적용하는 것은 모델을 바꾸나 실험을 통해서 모든 매개변수의 학습에서 무시할만한하다.
- 마침내, attention에서 locality-sensitive hashing은 좀 더 중요한 변화이고 이것은 동시에 사용되는 hashes수에 의존하는 동적 학습에 영향을 미칠 수 있다.
- 우리는 이 파라미터를(=hashes 수인 듯?) 연구하고 사용하기 효율적이고 full attention과 비슷한 결과를 보여주는 값을 찾는다.
- 우리는 다음의 task들에서 실험한다.
- a text task (enwik8) with sequences of length 64K
- an image generation task (imagenet-64 generation) with sequences of length 12K.
- In both cases we show that Reformer matches the results obtained with full Transformer but runs much faster, especially on the text task, and with orders of magnitude better memory efficiency.
2 LOCALITY-SENSITIVE HASHING ATTENTION
- Dot-product attention
- Multi-head attention.
- Memory-efficient attention.
- 식 1을 이용해서 설명한다.
- Let us assume that Q, K and V all have the shape [batch size, length, dmodel].
- 메인 이슈는 QK^T이고 이것은 [batch size, length, length]의 모양을 가진다.
- 실험 섹션에서, 우리는 모델을 길이 64K을 가지는 시퀀스로 학습하는데,
- 이 경우에는, batch-size을 1을 가진다고 해도 64K x 64K 행렬이고 32-bit floats는 16GB의 메모리를 가진다.
- 이것은 비실용적이며 긴 시퀀스에 대한 트랜스포머 사용에 방해를 해왔다.
- 그러나, QK^T 행렬은 메모리에서 fully materialized(구체화할)일 필요는 없다.
- attention은 실제로 각 query qi에 분리되서 계산되고 오직 을 메모리에서 한 번만 계산하면 되고 그리고 나서 gradients가 필요할 때 backward pass에서 재계산하면 된다.
- attention을 계산하는 이 방법은 아마도 덜 효율적이나 length가 차지하는 메모리 길이에 비례하는 메모리만을 사용한다.
- 우리는 attention에서 메모리 효율적인 실행을 실행하고 full-attention 베이스라인을 실험 섹션에서 설명한다.
- Q대신 qi을 쓰는게 끝인가?
- 근데 이러면 백프롭할 때, 다시 재계산을 한다는 단점이 뭔 말이지..?
- Where do Q, K, V come from?
- 위에서 설명한 다중 헤드의 주의는 keys, queries and values에 대해 작동하지만, 보통 우리는 단일 활성화 A인 (batch size, length, dmodel)만을 받는다.
- 즉 이는 문장의 embedding vector을 의미한다.
- A로부터 Q, K, V를 구축하기 위해 Transformer는 서로 다른 파라미터로 A를 Q, K, V로 투영하는 3개의 다른 선형 레이어를 사용한다.
- LSH attention 모델의 경우 쿼리와 키(Q와 K)가 동일하게 한다.
- 이는 동일한 선형 계층을 사용하여 A에서 Q 및 K는 같은 linear layer, V를 위한 별도의 linear layer을 사용함으로써 쉽게 달성할 수 있다.
- 우리는 이런 행동을 하는 모델을 shared-QK Transformer라고 부른다.
- QK 공유는 실험 제5절과 같이 key K의 길이를 추가로 normalize해도 Transformer의 성능에 영향을 미치지 않는다고 한다.
- (QK^T)V할 때, V의 길이를 짧게 가져간다는 의미일 듯
- Hashing attention
- LSH attention에서는 여기서는 두 개의 tensors, Q=K와 V의 shape으로 [batch size, length, dmodel]을 가진다.
- 우리는 multi-head 메커니즘을 유지하고 식 1의 atention 계산에 초점을 둔다.
- 즉 기존 multi-haed attention과 똑같이 한다?
- 기존에 말했듯이, QK^T가 중요 이슈이고 이것은 [batch size, length, length]의 사이즈를 가진다.
- 그러나 우리는 실제로 softmax(QK^T)에 관심이 있다.
- softmax는 가장 큰 elements에 지배되기 때문에, 각 query qi에 대해 우리가 qi에 가장 가까운 K의 keys에 대해서만 집중하면 된다.
- 예를 들어, K의 길이가 64K 인 경우 각 qi에 대해 32 또는 64 개의 가장 가까운 key의 작은 하위 집합만 고려해볼 수 있다.
- 그게 훨씬 효율적이긴 하지만 어떻게 keys 중에서 가장 가까운 neighbors을 찾을 수 있을까?
- 즉, (QK^T)V을 계산할 때, QK^T가 (length x length) 의 matrix을 가지므로 너무 계산 비용이 크다는 것이다.
- 그런데, 실제로 계산할 때, softmax(QK^T)V을 하는 것이고 그렇다보면 QK^T에서 작은 값들은 실제로 무시할만큼 작을 수 있다는 것이다.
- 즉 QK^T에서 큰 32개 혹은 64개만 써서 K와 곱하는게 효율적인데, 여기서 문제는 어떻게 큰 값을 골라낼 수 있을까? 라는 것!
- Locality sensitive hashing
- high-dimensional spaces에서 가장 가까운 neighbors을 찾는 문제는 locality-sensitive hashing (LSH)의 문제로 해결될 수 있다.
- 각 벡터 x를 hash h(x)에 할당하는 hash 방법은 근처의 벡터들이 높은 확률로 동일한 해시를 얻고 멀리있는 해시가 그렇지 않으면 지역성 민감도(locality-sensitive)라고 한다.
- 우리의 경우, 우리는 실제로 근처의 벡터들이 높은 확률을 가진 동일한 해시를 얻고 hash-buckets은 높은 확률을 가진 비슷한 크기의 해시만을 요구한다.
- We achieve this by employing random projections as follows (see Figure 1).
- To get b hashes, we first fix a random matrix R of size [dk, b/2].
- We then define h(x) = argmax([xR; −xR]) where [u; v] denotes the concatenation of two vectors.
- This method is a known LSH scheme (Andoni et al., 2015) and is easy to implement and apply to batches of vectors.
- https://lovit.github.io/machine%20learning/vector%20indexing/2018/03/28/lsh/
- 위 블로그에서 간단하게 잘 설명을 해두었다.
- 여기서도 hash 매트릭스로 R 랜덤 매트릭스로 정한다.
- xR와 -xR을 concat하여 argmax을 취하는 것은 뭐지?
- https://blog.pingpong.us/reformer-review/
- 실제 Reformer에서는 angular RSH을 사용한다고 한다.
- 즉 첫 번째 블로그처럼, 간단히 정수로 만들어서 사용하는 것은 아니고
- 반지름 1로 고정시킨 구면좌표계에서 몇 사분면인지에 따라 hash을 정하는 식이다.
- 아마 첫 번째 블로그의 random matrix 의 역할이 회전할 random angular가 대신하는 것이다.
- LSH attention
- 우리의 LSH 계획과 hashing attention의 일반적인 아이디어를 알고, 우리는 이제 본 논문에서 사용하는 LSH 주의를 수식적으로 보자.
- 먼저 기본적인 attention을 위한 방정식 (1) single query position i에 대해 다시 쓰면 다음과 같다.
- position i에서 는 i보다 작은 것에 대한 집합이다. (autoregressive 하게)
- 즉 i보다 작은 j에서 z(i, )을 계산하여 qi kj 값에 대해 뺴준다.
- 정확히 notation 는 position i에서의 query가 관심있는 집합을 표현하며,
- z는 partition function (즉, i.e. the normalizing term in the softmax)을 의미한다.
- 명확하게 하기 위해, 우리는 scaling 을 빼뜨린다.
- 배치 프로세스를 위해, 에 없는 elements을 마스킹하는동안 큰 세트 ⊇ 에 대해 attention을 수행한다.
- 는 을 포함하는 집합으로 l까지를 의미한다. (l은 아마 전체를 말하는 것일고 decoder에서 autoregressive라고 하면 i보다 작은 것까지가 가 되는 개념일 듯)
- 식(2)을 식(3)으로 바꾸면서 의 원소인 j에 대해서 m(j,)와 z(i,)을 빼주게 된다.
- 여기서 m은 j가 의 원소가 아니면 무한대로 보냄으로써 그 상황에선 무시한다는 것
- 즉 j가 의 원소일 때만 고려한다는 것이고, 이때는 식(2)와 똑같이 되는 것 으로 배치프로세싱을 위한 작업으로 보인다.
- 이제 우리는 LSH attention으로 돌아가자.
- LSH attention는 single hash bucket 내에서만 attention를 허용함으로써 내가 attend할 수 있는 쿼리 위치를 제한하는 관점에서 생각할 수 있다.
- 그림 2 (a-b)는 full-attention과 hashed variant의 개략적 인 비교를 보여줍니다.
- (a) 부분은 attention matrix for full attention가 일반적으로 희소하지만 계산할 때는 희소성을 활용하지 않는다는 것을 보여줍니다. (즉 비효율적이란 말)
- (b)에서 쿼리와 키는 해시 버킷에 따라 정렬되었습니다.
- 유사한 항목이 확률이 높은 동일한 버킷에 속하므로 각 버킷 내에서만주의를 기울임으로써 전체주의 패턴을 추정 할 수 있습니다.
- LSH을 적용한 후, attention하는 그림이다.
- 근데 chunk 작업은 왜 하는 거지?
- 이 공식의 해시 버킷은 크기가 고르지 못한 경향이 있어 버킷 간에 배치하기가 어렵다.
- 더욱이, 버킷 내의 쿼리 수와 키 수는 동일하지 않을 수 있다. 실제로 버킷에는 많은 쿼리가 포함되지만 키는 포함되지 않는 것이 가능하다.
- 이러한 문제를 줄이기 위해 으로 세팅해서 을 보장한다.
- 위 Hashing attention에서 K와 Q을 같게 가져간다고 하는데 이 때문인가?
- 그 다음, 우리는 queries을 bucket number에 의해 소팅하고 각 버킷안에서 시퀀스 위치를 기준으로 정렬한다. ( 소팅 이후에)
- sorted attention matrix에서 같은 버킷의 쌍은 대각선 근처에 모인다. (그림 2c 참조).
- 우리는 (소팅 후) m consecutive queries의 chunks가 서로 attend하고, 하나의 chunk back(그림 2d)이 되는 배치 접근법을 따를 수 있다.
- chunk로 같은 길이를 가지게 해줘야 배치식 계산이 가능하기 때문이라고 하는 거 같은데 배치식 계산을 해야하는건가?
- 이것은 이전의 우리의 표기법에 따라 다음과 같은 설정에 해당한다.
- Multi-round LSH attention
- 해싱의 경우 유사한 항목이 서로 다른 버킷에 포함될 가능성은 항상 작다.
- 이 확률은 nrounds의 구별되는 해시함수 {h(1), h(2) , .}을 사용하여 여러 라운드의 해시를 수행함으로써 줄일 수 있다:
- 다원형 사례에는 기본적으로 LSH 주의 nrounds time을 병렬적으로 수행하게 된다.
- 세부사항은 부록 A에 설명되어 있다.
- Causal masking for shared-QK attention
- Transformer 디코더에서는, 향후의 포지션의 참가를 방지하기 위해 마스킹(방정식 3에서 m(j,Pi)으로 표기함)을 사용한다.
- LSH 주의에서 마스킹을 구현하기 위해 모든 쿼리/키 벡터를 위치 지수와 연결하고 쿼리/키 벡터를 정렬하는 데 사용된 것과 동일한 순열법을 사용하여 위치 지수를 다시 정렬한 다음 비교 연산을 사용하여 마스크를 계산한다.
- 그림 2에서 처럼 버킷의 순서를 재정의 한다는 것 같은데..?
- future에 대한 attention은 허용되지 않고, 일반적인 Transformer의 수행은 그 자신을 attend하는 것을 허락한다.
- 이러한 방식은 shared-QK에서는 요구되지 않는다. 왜냐하면 query vector 자체의 dot-product은 항상 다른 position의 vector와의 dot-product 보다 크기 때문이다.
- 즉 QK가 같으니까 자신의 qk^T=qq^T니까 항상 젤 크다는 말
- 우리는 그래서, 자신을 attending하는 것을 금지한다.
- 단, 다른 targets을 attention하는 것이 가능하지 않을 때는 가능하도록 한다. (예를 들어, 첫 번째 토큰같은 경우)
2.1 ANALYSIS ON A SYNTHETIC TASK
3 REVERSIBLE TRANSFORMER
- 위의 섹션에서 보여줬듯이, attention 복잡성은 근사치가 허용될 경우 제곱(square)에서 선형(linear)로 줄일 수 있다.
- 그러나 이것은 table 1에서 보듯이, b · nh · l 텀으로 복잡성이 시작되기 때문에 이 비용은 피할 수 없다.
- b · n_h · l · d_k, or alternatively b · l · d_model
- nh · dk = dmodel 인가?
- b: batch
- n_h; head numbers
- l: length
- n_c: LSH chuncks numbers
- n_r: hash repetitions number
- d: dimension의 약자로 쓴 듯
- 실제로, 각 layer 이전에 활성화는 이미 사이즈가 b · l · d_model이여서 nl layers을 가지는 전체 모델의 메모리 사용은 최소한 b · l · dmodel · nl이다.
- 더 나쁜 것은 Transformer의 feed forward 계층 내에서 이것은 b · l · d_ff · n_l로 올라갑니다.
- big 트랜스포머에서 d_ff = 4K 및 nl = 16을 설정하는 것이 일반적이므로 l = 64K에서는 다시 비실용적 인 16GB 메모리를 사용합니다.
- 이 섹션에서는 reversible layer을 사용하여 용어의 n_l 부분을 처리 한 다음 청크가 d_ff 문제를 처리 할 수있는 방법을 보여줌으로써이 비용을 줄이는 방법을 보여줍니다.
- The effects of each of these approaches on memory and time complexity are summarized in Table 3.
- RevNets
- Reversible residual networks Gomez et al. (2017)에서 소개가 되었고 이는 이미지 분류에 사용되는 ResNet을 대체할 수 있음을 보여준다.
- 메인 아이디어는 모델 파라미터들만을 사용하여 주어진 특정 layer에서 활성화를 following(다음의) layer에서의 활성화로부터 recover하는 것이다.
- backward pass에 사용하기 위해 중간 값을 체크 포인트 할 필요없이, 네트워크의 출력에서 입력으로 역 전파가 진행됨에 따라 계층을 하나씩 역전시킬 수 있습니다.
- 반면에 일반적인 residual layer은 x → y로 가는 함수를 x + F(x)을 통하여 하나의 출력을 생성하지만,
- reversible layer은 inputs/ouputs의 쌍인 (x1, x2)→(y1, y2)을 다음의 식을 따른다.
- RevNets 보충 자료
- 이 부분에 대해 정확히 이해가 안가서 다음의 그림으로 간략히 보자면...
- 논문을 보기에는 너무 오래걸리고 간단히 개념만 잡고 가는 목적으로 !
- ResNet부터 보면 메모리에 y2, y1을 저장한다고 해보자.
- 그렇다면 x1을 구할 수 있을까? 구할 수 없다.
- 왜냐하면 x1 = y1-F(x1) 이므로, F(x1)또한 x1의 함수이기 때문에 그리 간단한 문제가 아니기 때문이다.
- 따라서 F(x1)을 메모리에 저장을해야 x1을 구할 수 있고 뭐 그래야 backprop 계산을 할 수 있다.
- 왜냐하면 당연히 특정 파라미터로 loss을 편미분해서 backprop을 따라 내려올 때, x1에 대해서도 편미분을 해줘야하는데 x1이 뭔지 모르면 안되기 때문이다.
- 즉 ResNet에서는 y2, y1, F(x1)까지 저장을 해야 x1의 backprop 부분을 통과할 수 있다.
- 그렇다면 RevNet에서는?
- y1, y2만 메모리에 저장을 한다고 하자
- 그러면 x2을 구할 수 있고 마찬가지로 x1을 구할 수 있다.
- 즉 이때는 G와 F 함수를 통과하는 계산을 다시 해줘야하지만, 어쨌든 저장할 메모리양은 줄일 수 있다는 것이다.
- 이 부분에 대한 정확한 메모리 사용량은 table 3에 나와있지만.. 개념만 알고 넘어가도 충분할 거 같다는 생각이..
- Reversible Transformer
- 그러다면 위에서 말하는 F, G는 Transformer에서 어떤 layer을 담당하게 될까?
- 우리는 revnet 블록 내에서주의 레이어와 피드 포워드 레이어를 결합하여 RevNet 아이디어를 Transformer에 적용합니다.
- In the notation above, F becomes an attention layer while G becomes the feed-forward layer.
- Note that Layer Normalization (Ba et al., 2016) is moved inside the residual blocks.
- The reversible Transformer does not need to store activations in each layer and so gets rid of the nl term.
- In Section 5 we show that it performs the same as the normal Transformer when using the same number of parameters; we achieve this by having both x1 and x2 have size dmodel.
- Chunking
- reversibility은 nl term을 이젠 커버가능하지만(줄일 수 있지만) 더 두꺼운 층은 여전히 많은 메모리를 사용할 수 있습니다.
- feed-forward 층은 특히 차원 d_ff = 4K 이상의 intermediate 벡터를 사용할 수있다.
- 그러나 feed-forward layer의 계산은 시퀀스의 여러 위치에서 완전히 독립적이므로 계산을 c chunk로 나눌 수 있습니다.
- 이 계층은 일반적으로 모든 위치에 대해 병렬로 작업을 수행하여 일괄 처리되지만 한 번에 한 청크에서 작동하면 메모리를 줄일 수 있습니다.
- (8)의 역 계산 및 역방향 패스도 청크됩니다.
- 피드 포워드 레이어 외에도 큰 어휘를 가진 모델 (dmodel 단어 유형 이상)의 경우 출력에서 로그 확률을 청크하고 한 번에 시퀀스 섹션의 손실을 계산합니다.
- 쉽게 말해서 attention QK^T 계산할 때, qi*K^T로 바꾼 것처럼, feed-forward도 독립적으로 수행해서 concat 한다는 것 같다.
- Chunking, large batches and parameter reuse (번역)
- 청킹 및 가역성 레이어에서는 전체 네트워크에서 활성화에 사용하는 메모리는 레이어 수와 무관하다.
- 매개변수의 수가 도면층의 수에 따라 증가함에 따라 매개변수의 수는 동일하지 않다.
- 그러나 이 문제는 이 계층이 컴퓨팅되지 않을 때 CPU 메모리와 계층 매개 변수를 교환할 수 있기 때문에 해결된다.
- 표준 Transformer에서는 CPU로의 메모리 전송 속도가 느리기 때문에 비효율적일 수 있다.
- Reformer에서 batch size에 길이를 곱한 값은 훨씬 더 크지만, 따라서 매개변수로 수행된 계산량은 전송 비용을 상각한다.
4 RELATED WORK
- 생략
5 EXPERIMENTS
- 실험 결과는 논문의 그림만을 가져와서 간단히만...
- 이 논문에서 말하는 Q,K의 파라미터를 공유해는 것인데, 공유해도 성능은 안떨어진다.
- 근데 의문점이 Transformer은 나온지 꽤 되었는데 이걸 지금 발견하진 않았을 것 같다는 생각이..
- 실제로 성능 차이가 없다면 attnetion is all you need의 저자도 알고 있어야 하지 않을까?
- Reversibility는 원래 있는 기술을 가져온 것으로 일반적인 구조랑 큰 차이가 없다
- Reversible Transformer의 성능을 검증한 것
- LSH에서 hashes의 개수에 따른 성능차이를 보여준다.
- 실험결과에서 볼 수 있듯이 8 hashes 까지는 성능이 증가하지만, 16 hashes와는 차이가 없다.
- 따라서 8 hashes가 가성비가 좋을 듯
- LSH의 layers 수와 hashes 수에 따라 성능을 비교한 것
- layers수가 일정 개수 넘어가면 수렴하고 hashes수는 증가할수록 속도가 느려지지만, 시퀀스 길이에 따라 증가하지는 않음
- 뒤에 읽을 논문 LinFormer에서 지적하는 사항인데, 실제 그림 5의 오른쪽에서 Reformer의 효과는 길이가 2048 이상일 때 나타난다.
6 CONCLUSION
- Reformer은 Transformer의 모델링 능력과 긴 시퀀스를 효율적으로 실행하는 구조를 결합하여 적은 메모리로 많은 수의 layers을 가지는 모델을 사용할 수 있다.
- 우리는 이것이 매우 크게 도움이 될 것이고, 많은 파라미터의 Transformer 모델들이 좀 더 널리 쓰이고 접근가능해 진다.
- 또한, 긴 시퀀스를 핸들링하는 능력은 많은 생성 태스크에서 Reformer의 사용할 것이다.
- 매우 긴 coherent text을 생성할 뿐 아니라, Reformer은 Transformer 모델의 파워를 가져와서 다른 도메인 (time-series forecasting, music, image and video generation)에도 적용가능하다.
Reference
- https://arxiv.org/pdf/2001.04451.pdf
- 1. LSH Self-Attention: https://colab.research.google.com/drive/15oP52_7W5dRcAnbgX3tYADsu4R3cjMIf?usp=sharing
- 2. Chunked Feed Forward: https://colab.research.google.com/drive/1xKK32Yhda-iYgtoA3eCrnCVuy_lraQR9?usp=sharing
- 3. Reversible Residual Connection: https://colab.research.google.com/drive/1BLffcRt9LXmM7nKU2UXhtm0PqAG0UE7J?usp=sharing
- 4. Axial Positional Encoding: https://colab.research.google.com/drive/1MYxvC4RbKeDzY2lFfesN-CvPLKLk00CQ?usp=sharing
댓글
댓글 쓰기