Reformer: 메모리 효율적인 트랜스포머로 언어 모델링의 한계를 넘어서
개요
Reformer 모델은 긴 시퀀스를 처리할 때 표준 트랜스포머의 메모리 병목 현상을 해결합니다. 셀프 어텐션, 피드 포워드 레이어, 잔차 연결, 위치 인코딩을 재설계함으로써 8 GB 미만의 RAM 미만의 RAM을 유지하면서 최대 500 000 토큰까지 훈련할 수 있으며, 이는 BERT와 같은 모델의 512 토큰 제한을 훨씬 넘어섭니다.
Reformer 셀프 어텐션 레이어
Reformer는 전역 셀프 어텐션을 두 가지 메모리 효율적인 대안으로 대체합니다: 로컬 셀프 어텐션과 LSH 셀프 어텐션.
로컬 셀프 어텐션
로컬 셀프 어텐션은 입력을 config.local_chunk_length 길이의 청크로 나누고 각 청크 내에서 전역 셀프 어텐션을 적용합니다. config.local_num_chunks_before와 config.local_num_chunks_after의 오버랩을 추가하면 각 토큰은 인접한 청크의 제한된 컨텍스트에 참석할 수 있어 quadratic 메모리 비용을 O(n × chunk_length)로 줄입니다. 이것만으로는 장거리 의존성이 필요한 작업에 충분하지 않습니다.
LSH 셀프 어텐션
LSH 셀프 어텐션은 locality‑sensitive hashing을 사용하여 쿼리(및 키) 벡터를 버킷에 해싱함으로써 전역 어텐션을 근사합니다. 동일한 버킷에 해시된 벡터는 유사하다고 간주되어, 각 버킷 내에서만 셀프 어텐션이 계산됩니다. 그런 다음 permuted 입력이 (오버랩과 함께) 청크화되어 어텐션이 수행되며,これにより 먼 토큰의 정보가 혼합되면서 메모리 사용량은 O(n × hashes × chunk_length)를 유지합니다. 여러 해시 라운드(config.num_hashes)를 결합하여 정확도를 높일 수 있습니다.
벤치마크
google/reformer-enwik8 모델을 벤치마크한 결과 메모리 절감 효과를 보여줍니다:
- 전역 셀프 어텐션을 사용할 때 (청크 길이가 8192로 설정) 모델은 약 16K 토큰에서 GPU 메모리를 초과합니다.
- 기본 로컬 + LSH 셀프 어텐션을 사용하면 동일한 모델은 11 GB GPU에서 out‑of‑memory가 발생하기 전까지 약 16K 토큰까지 실행되며, 이는 시퀀스 길이에 따른 메모리 소비 증가율이 감소함을 보여줍니다.
청크된 피드 포워드 레이어
넓은 트랜스포머에서는 큰 피드 포워드 중간 행렬이 메모리를 지배합니다. Reformer는 청크된 피드 포워드 레이어를 도입하는데, 여기서 선형 레이어는 config.chunk_size_feed_forward 크기의 작은 청크로 처리됩니다.これにより 전체 중간 텐서를 저장하지 않아 추가적인 연산을 trade-off로 하여 메모리 사용량을 줄입니다.
벤치마크
피드 포워드 크기가 증가(예: 16384)되고 어텐션 헤드가 감소했을 때, 청킹을 활성화(chunk_size_feed_forward=1)하면 시퀀스 길이 4096, 배치 크기 8에서 피크 메모리가 약 9 GB에서 약 6 GB로 감소하여 피드 포워드 레이어가 병목인 모델에 대한 이점을 확인합니다.
가역적 잔차 레이어
표준 트랜스포머를 훈련할 때는 모든 중간 활성화가 저장되어 깊이에 따라 메모리가 선형적으로 증가합니다. Reformer는 가역적 잔차 레이어를 사용해서 backward pass 동안 활성화를 재계산하고 저장하지 않도록 합니다. 최종 레이어의 출력만 유지하면 레이어당 메모리 오버헤드가 몇백 메가바이트에서 100 MB 미만으로 감소합니다.
벤치마크
시퀀스 길이 512, 배치 크기 8에서 레이어 수(4, 8, 12)를 증가시켜 BERT와 Reformer를 비교한 결과:
- BERT‑12‑Layers: 약 7.4 GB
- Reformer‑12‑Layers: 약 5.4 GB 따라서 Reformer는 레이어당 메모리 증가가 훨씬 적어 동일한 하드웨어 내에서 더 깊은 모델을 가능하게 합니다.
축 위치 인코딩
표준 위치 임베딩은 최대 시퀀스 길이에 따라 선형적으로 증가하여 매우 긴 입력(예: 0.5M 토큰은 약 2 GB 필요)에 부담이 됩니다. 축 위치 인코딩은 위치 공간을 두 개의 작은 차원(config.axial_pos_shape)으로 factorize하고 숨은 크기를 분할(config.axial_pos_embds_dim)합니다.その結果 임베딩 테이블 크기는 max_len×hidden_size 대신 shape[0]×dim[0] + shape[1]×dim[1]가 됩니다.
벤치마크
google/reformer-crime-and-punishment 모델(0.5M 토큰 처리 가능, 숨은 크기 256)에 대해:
- 기본 위치 임베딩: 524 288 × 256 파라미터 (~136 M).
- 축 위치 임베딩, shape (512, 1024) 및 dim (64, 192): 약 2.6 M 파라미터. 배치 크기 8, 시퀀스 길이 512에서의 추론 시 메모리가 약 959 MB에서 약 447 MB로 감소하여 상당한 감소를 보여줍니다.
시사점
이 네 가지 메커니즘을 결합함으로써 Reformer는 전문 하드웨어 없이도 전체 책이나 코드베이스와 같은 매우 긴 문서에서 언어 모델을 훈련할 수 있게 만듭니다.これにより 전체 컨텍스트 이해를 활용할 수 있는 NLP 작업의 범위가 확장되며, 여기에는 장거리 요약, 대규모 코퍼스에서의 질문 answering, 그리고 수백만 토큰에 걸쳐 의존성이 있는 순차 데이터 모델링이 포함됩니다.