brunch

You can make anything
by writing

C.S.Lewis

by 서진호 Jan 17. 2020

Reformer:효율적인 트랜스포머

2020년 1월 16일 (목) 구글 AI 리서치 블로그

언어, 음악 또는 비디오와 같은 순차적 데이터를 이해하는 것은, 특히 광범위한 주변 환경에 의존하는 경우 어려운 작업입니다. 예를 들어, 비디오에서 사람이나 물체가 사라져서 나중에 다시 나타나기 만하면 많은 모델이 그 모습을 잊게 됩니다. 언어 영역에서 LSTM (long short-term memory) 신경망은 문장별로 문장을 번역하기에 충분한 콘텍스트를 포함합니다. 이러한 경우 콘텍스트 윈도우(즉, 번역에서 고려되는 데이터 범위)은 수십 단어에서 수백 단어까지 포함됩니다. 최근 트랜스포머 모델(Transformer model)은 문장별 문장 번역 성능을 향상할 뿐만 아니라 여러 문서 요약을 통해 전체 Wikipedia 기사들을 생성하는 데 사용할 수 있습니다. Transformer에서 사용하는 콘텍스트 창이 수천 단어로 확장되기 때문에 가능합니다. 이러한 큰 콘텍스트 창을 통해 Transformer는 픽셀이나 음표를 포함한 텍스트 이외의 응용 프로그램에 사용될 수 있으므로 음악 및 이미지를 생성하는 데 사용할 수 있습니다.


그러나 더 큰 콘텍스트 창으로 Transformer를 확장하는 것은 한계가 있습니다. Transformer의 힘은 컨텍스트 윈도우내에서 가능한 모든 단어 쌍을 고려하여 단어 간의 연결을 이해하는 프로세스인 어텐션(attention)으로 부터 옵니다. 따라서 100K 단어의 문자인 경우 100K(십만) x 100K(십만) 단어 쌍 또는 각 단계마다 100억 쌍의 평가(Evaluation)가 필요하며 이는 실용적이지 않습니다. 또 다른 문제는 각 모델 레이어의 출력을 저장하는 표준 실습에 있습니다. 큰 콘텍스트 윈도우를 사용하는 응용 프로그램의 경우, 여러 모델 레이어들의 출력을 저장하기 위한 메모리 요구 사항은(몇 개의 레이어와 함께 기가바이트에서 수천 개의 레이어들이 있는 모델의 테라바이트에 이르기까지) 엄두도 못 낼 정도로 크고 빠르게 늘어 날 것 입니다. 즉, 여러 레이어를 사용하는 현실적인 Transformer 모델은 텍스트의 몇몇 작은 단락에서만 사용할 수 있거나 짧은 음악 조각을 생성할 수 있습니다.


오늘은 단일 가속기에서 16GB의 메모리만 사용하여 최대 백만 단어의 콘텍스트 윈도우를 처리하도록 설계된 Transformer 모델인 리포머(Reformer)를 소개합니다. 그것은 긴 컨텍스트 윈도우에 Transformer의 응용 프로그램을 제한하는 메모리 할당 및 어텐션(attention)의 문제를 해결하기 위해 두 가지 중요한 기술을 결합합니다. Reformer는 LSH(locality-sensitive-hashing)를 사용하여 긴 시퀀스와 reversible residual layer에 대한 복잡성을 줄이고 사용 가능한 메모리를 보다 효율적으로 사용합니다.


어텐션 문제

매우 큰 텍스트 시퀀스에 Transformer 모델을 적용할 때의 첫 번째 과제는 어텐션 레이어를 처리하는 방법입니다. LSH는 가능한 모든 벡터 쌍을 검색하는 대신 유사한 벡터를 일치시키는 해시 함수를 계산하여 이를 수행합니다. 예를 들어, (subsequent layer들 안의 심지어 더 큰 컨텍스트들인) 하나의 워드를 나타내는 네트워크의 첫 번째 레이어로 부터 각 벡터들이 있는 곳인 번역 태스크(translation task)에서, 다른 언어들의 동일한 단어들과 상응하는 벡터들은 똑같은 해시 값을 얻을 수 있습니다. 해시가 할당되면 시퀀스가 재배열되어 동일한 해시를 가진 요소를 함께 가져와서 세그먼트(또는 청크(chunk))로 나누어 병렬 처리를 가능하게 합니다. 그런 다음, 어텐션 레이어는 훨씬 짧은 청크(및 인접 이웃이 오버플로를 처리하기 위해)내에 계산하는 부하를 크게 줄입니다.


[그림1]

[그림1] 상세 설명 - Locality-sensitive-hashing: Reformer는 키의 입력 시퀀스를 취합니다. 여기서 각 키는 첫 번째 레이어에서 개별 단어 (또는 이미지의 경우 픽셀)를 나타내며 후속 레이어에서는 더 큰 컨텍스트를 나타내는 벡터입니다. LSH가 시퀀스에 적용되고 그 후에 키가 해시별로 정렬되고 청크가 결정됩니다. 어텐션은 단일 청크와 그 인접 이웃에만 적용됩니다.


메모리 문제

LSH는 어텐션 문제를 해결하지만 여전히 메모리 문제가 있습니다. 네트워크의 단일 레이어는 종종 최대 몇 GB의 메모리를 필요로 하며 일반적으로 단일 GPU에 적합하므로 하나의 레이어만 있는 경우 시퀀스가 긴 모델도 실행될 수 있습니다. 그러나 경사 하강(gradient descent)하는 다층 모델을 학습할 때, 역방향 패스에서 사용하기 위한 각 레이어들로 부터 활성화(activation) 합니다. 

일반적인 Transformer 모델에는 12개 이상의 레이어들이 있으므로 각 레이어들의 값을 캐시하는 데 사용하면 메모리가 빨리 소모됩니다.


Reformer에서 구현된 두 번째 참신한 접근 방식은 메모리에 저장하지 않는 것보다 역전파(backpropagation)를 하는 동안 각 레이어의 입력(input)을 다시 계산하는 것입니다. 이는 네트워크의 마지막 레이어에서 활성화를 사용하여 네트워크를 반대로 실행하는 정도에 따라 중간 레이어에서 활성화를 복구하는 reversible layer들을 사용하여 수행됩니다. 일반적인 잔여 네트워크(residual network)에서 스택의 각 레이어는 네트워크를 통과하는 벡터에 계속 추가됩니다. 그 대신 reversible layer에는 각 레이어에 대해 두 개의 활성화(activation)셋들이 있습니다. 하나는 방금 설명한 표준 절차를 따르고 한 레이어에서 다음 레이어로 점진적으로 업데이트 되지만, 다른 레이어는 첫 번째 계층의 변경사항만 캡처합니다. 따라서 네트워크를 반대로 실행하려면 각 레이어에 적용된 활성화를 뺍니다.

[그림2] 상세 설명 - Reversible layer: (A) 표준 잔여 네트워크에서 각 레이어의 활성화는 입력을 다음 계층으로 업데이트하는 데 사용됩니다. (B) 가역적 네트워크에서 두 세트의 활성화가 유지되며 그중 하나만 각 레이어 후에 업데이트 됩니다. (C)이 접근 방식은 모든 중간 값을 복구하기 위해 네트워크를 반대로 실행하는 것을 가능하게 합니다.


Reformer의 응용 프로그램

Reformer에서 이 두 가지 접근 방식을 새로 적용하면 효율성이 높아 16GB의 메모리만 사용하여 단일 가속기에서 최대 백만 단어 길이의 텍스트 시퀀스를 처리할 수 있습니다. Reformer는 효율성이 높기 때문에 거의 모든 최신 텍스트 도메인 데이터셋 보다 훨씬 큰 콘텍스트 창이 있는 데이터에 직접 적용할 수 있습니다. 아마도 이러한 대규모 데이터 세트를 처리할 수 있는 Reformer의 기능은 커뮤니티가 데이터셋을 작성하도록 자극할 것입니다.


큰 콘텍스트 데이터가 부족하지 않은 한 영역은 이미지 생성이므로 이미지에서 Reformer를 실험해보십시오. 이 코드랩에서는 Reformer를 사용하여 부분 이미지를 "완료"하는 방법에 대한 예를 제시합니다. 아래 그림의 맨 위 행에 표시된 이미지 조각부터 Reformer는 픽셀 단위로 전체 프레임 이미지 (하단 행)를 생성할 수 있습니다.

[그림 3]

[그림3] 상세 설명 - 위 : Reformer에 입력으로 사용되는 이미지 조각. 하단 :“완료된”풀 프레임 이미지. 원본 이미지는 Imagenet64 Dataset에서 가져온 것입니다.


이미징 및 비디오 작업에 Reformer를 적용하는 것은 큰 잠재력을 보여 주지만 텍스트에 적용하는 것은 훨씬 더 흥미 롭습니다. Reformer는 한 번에 하나의 장치에서 전체 소설들을 처리할 수 있습니다. 단일 트레이닝 샘플에서 '죄와 벌' 소설의 전체를 처리하는 것이 이 코드랩에서 데모를 보여줍니다. 장래에 훈련할 긴 형식의 텍스트를 가진 더 많은 데이터셋이 있을 때, Reformer와 같은 기술은 긴 코히어런트 컴포지션을 생성하는 것을 가능하게 할 수 있습니다.


결론

우리는 Reformer가 자연어(natural language) 처리 이외의 장문과 응용 프로그램  둘다  Transformer 모델의 미래에 사용하기 위한 기초를 제공한다고 생각합니다. 오픈 리서치의 전통에 따라 이미 더 긴 시퀀스에 적용하는 방법과 positional encoding 처리를 개선하는 방법을 탐색하기 시작했습니다. Refomer 논문(ICLR 2020에서 발표용으로 선정)을 읽고 우리의 코드(trax)를 살펴보고 자신의 아이디어도 개발하십시오. 딥러닝에 널리 사용되는 긴 콘텍스트 데이터셋은 거의 없지만 실제 세계에서는 긴 콘텍스트가 어디에나 있습니다. 아마도 여러분은 Reformer를 위한 새로운 응용 프로그램을 찾을 수 있을 것입니다 –이 코드랩에서 시작하고 만일 문제나 질문이 있으면 우리와 채팅하십시오!


감사의 말

이 연구는 Nikita Kitaev, Łukasz Kaiser 및 Anselm Levskaya가 수행했습니다. Trax에 대한 작업에 대한 Afroz Mohiuddin, Jonni Kanerva 및 Piotr Kozakowski에게 감사의 말을 전하며 전체 JAX팀을 지원해 주셔서 감사합니다.


원본 소스: https://ai.googleblog.com/2020/01/reformer-efficient-transformer.html

이 블로그는 2020 년 1월 16일 (목), Google AI Research Blog 기사를 영어에서 우리나라 말로 번역한 것입니다. 또한 이 번역 글은 정보 공유 목적으로만 작성했으므로 어떠한 상업용으로 사용할 수 없으며, 원본 저작물 모두 구글에게 저작권이 있음을 알려 드립니다.  
게시자 : Nikita Kitaev, UC Berkeley 학생 연구원, Google Research의 연구원, 우카 쉬 카이저
Reformer: Image Generation 코드랩: https://colab.research.google.com/github/google/trax/blob/master/trax/models/reformer/image_generation.ipynb
Reformer: Text Gneration 코드랩: https://colab.research.google.com/github/google/trax/blob/master/trax/models/reformer/text_generation.ipynb
Trax Quick Intro 코드랩: https://colab.research.google.com/github/google/trax/blob/master/trax/intro.ipynb
Reformer code: https://github.com/google/trax/tree/master/trax/models/reformer





브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari