Transformer 직접 구현해보기 - 1편
1. Introduction
Transformer는 2017년 NIPS에서 Attention is all you need 논문을 통해 소개된 아키텍쳐입니다. 이번 아티클부터 우리는 직접 Transformer 를 구현해보면서 간단한 번역 테스크를 풀어보겠습니다.
단, 이 아티클은 기본적인 Transformer 구조에 대한 개념은 알고있다는 것을 기반으로 하며, 만약 처음 보시는 분이라면 Jay의 블로그를 통해 한번 개념을 잡으신 뒤 Hands-on을 해나가시는 걸 추천드립니다.
2. 데이터셋 구성
본격적인 모델 구현에 앞서 torchtext와 우리가 활용할 데이터셋인 Multi30k 데이터셋을 가공하도록 하겠습니다.
먼저 현재 활용하시는 환경에 세팅되어 있는 Pytorch 버전을 다음과 같이 확인하신 뒤, 해당 링크에 있는 compatibility 대로 그에 맞는 torchtext를 설치해줍니다.
1 | |
설치가 완료되고 나면 spaCy와 torchtext를 활용해서 손쉽게 데이터 전처리를 진행하게 됩니다. (다른 다양한 방법이 있습니다. 튜토리얼 느낌이라 보다 손이 덜 타는 방법을 택했으며, 다른 방식을 통해서 데이터를 가져오시고 가공하셔도 아무런 상관 없습니다.)
1 | |
위와 같은 방식으로 우리가 원하는 영어와 독일어를 위한 모델을 다운받을 수 있습니다. 해당 작업이 끝나고 나면 해당 모델을 로드해준 뒤, 아래와 같이 모델에 포함된 tokenizer를 활용해서 어떻게 나눠지는지 테스트 해볼 수 있습니다.
1 | |
이제 텍스트를 입력받아서 토큰화 진행 후 다시 리턴해주는 함수를 각 언어별로 선언해준 뒤, 텐서로 표현 될 수 있는 텍스트 데이터 타입을 처리할 수 있는 torchtext의 Field를 활용해서 파이프라인을 구성해줍니다.
1 | |
이제 torchvision처럼 torchtext에 포함되어 있는 우리가 오늘 활용할 데이터셋인 Multi30k 데이터를 불러오고, 앞서 선언한 Field를 통해 가공해주게 됩니다.
1 | |
데이터가 제대로 불러와졌는지는 다음과 같은 방식으로 확인할 수 있으며 Field를 통해 가공된 데이터는 OOV(Out of Vocab) = 0, Padding=1, <sos> = 2. <eos> = 3의 스페셜 토큰을 가집니다.
1 | |
이제 데이터 구성의 마지막 작업으로 앞서 선언해둔 torchtext의 BucketIterator를 활용해서 train, valid, test 데이터셋을 구성합니다.
1 | |
데이터가 잘 구성되었는지 샘플로 꺼내보려면 다음과 같이 진행하시면 됩니다.
1 | |
이번 1편에서는 기본적인 데이터 구성에 대해 다루었고, 다음 2편 부터는 Transformer 블록 및 Encoder-Decoder 구조를 구성해보도록 하겠습니다.