글 작성자: 만렙개발자

  이미 발표된지 조금 되었지만(arxiv를 통해 2019년 9월 26일에 공개, 현재 ICLR 2020 리뷰 중) 좋은 성능을 보이고있는 ALBERT(A Lite BERT For Self-Supervised Learning of Language Representations)에 대해 알아보도록 하자. NLU(Natural Language Understanding)에서 성능을 평가하는 GLUE와 같은 Benchmark에서도 좋은 성능을 보였지만, 제게 특히 관심이 있던 것은 SQuAD였습니다. Question Answering 분야에 많은 관심을 갖고, awesome-list도 작성해보았는데요, 한번 쯤 둘러보셔도 좋을 것 같아요 :)

 

https://github.com/seriousran/awesome-qa

 

seriousran/awesome-qa

😎 A curated list of the Question Answering (QA). Contribute to seriousran/awesome-qa development by creating an account on GitHub.

github.com

 

  SQuAD 2.0의 퍼포먼스를 살펴보면, ALBERT 싱글 모델이 나오고, 그에대한 앙상블로 순위가 채워져있는 것을 보실 수 있습니다. (중간에 XLNet도 있지만요) 더 놀라운 것은 ALBERT는 이름에도 포함되어있듯이 "lite"하다는 거예요. BERT의 파라미터를 줄여서 학습 속도를 향상시키고, 메모리 소비량을 감소시켰습니다. 그 두가지에 대해서 살펴보도록 합시다.

 

https://rajpurkar.github.io/SQuAD-explorer/

  BERT(Bidirectional Encoder Representations from Transformers)는 다들 아시겠지만, 트랜스포머 기반의 자연어처리(NLP)를 위한 네트워크 구조(Language Model; 언어 모델)입니다. 정말 많은 학습 파라미터를 갖고 있고, 엄청난 규모의 학습데이터와 컴퓨팅자원을 통해 사전학습된 모델이 구글을 통해 공개가 되었죠. 그리고 한국에서도 ETRI나 SKT같은 곳에서 BERT를 한국어 데이터셋으로 학습한 사전학습된 모델을 공개하기도 했습니다. (Google에서 multi-lingual 모델도 공개하였지만, 한국어 데이터로만 학습하고, 더 많은 양의 데이터로 학습하였기에 ETRI와 SKT의 BERT가 성능이 더 좋을 수 밖에 없습니다. 또한 한국어의 특성때문에 형태소 분석기를 사용한 것이 더 성능이 좋은 것으로 알려져있습니다.) 

 

http://aiopen.etri.re.kr/service_dataset.php

 

공공 인공지능 오픈 API·DATA 서비스 포털

과학기술정보통신부의 R&D 과제를 통해 개발한 다양한 인공지능 기술 및 데이터를 누구나 사용할 수 있도록 제공

aiopen.etri.re.kr

https://github.com/SKTBrain/KoBERT

 

SKTBrain/KoBERT

Korean BERT pre-trained cased (KoBERT). Contribute to SKTBrain/KoBERT development by creating an account on GitHub.

github.com

그럼 ALBERT에서는 어떤 방법으로 BERT의 학습 파라미터 수를 줄였는지 살펴봅시다.

 

1. 워드 임베딩을 hidden layer의 크기로 바로 맵핑하는 것이 아니라, 더 작은 값인 embedding_size로 새로 설정해주어 이후의 파라미터의 수를 전체적으로 줄입니다. 초반에 줄이는 것이기에 심지어 뒷부분에서 레이어 수를 늘리거나 복잡하게 만들더라도 엄청나게 파라미터의 수가 증가하지 않아서 이러한 이점을 잘 활용했다고 합니다. 코드로 살펴보면, 워드 임베딩하는 부분에서, BERT에서는 hidden_size이었던 것이 embedding_size로 바꾼 것을 볼 수 있습니다. 기본 configuration 기준으로, BERT에서 hidden_size는 768이었고, ALBERT에서 embedding_size는 128로 설정되어있습니다. 훨씬 적은 크기로 임베딩됩니다. (주의: 최종 임베딩 크기는 아닙니다!) 워드를 임베딩하는 것이 이렇게 작아도 됐었는지 결과가 신기하네요.

 

2. 어텐션과 FFN에서 레이어간에 파라미터를 공유하게하여 하나의 뎁스에서만 파라미터들이 학습되는 것을 막았습니다. 레이어간의 추상성이 다를텐데 어떻게 공유함으로 성능이 높아질 수 있는지는 제 개념에서는 잘 이해가 되지 않네요ㅠㅠ

 

  결과적으로 BERT-large에 비해 ALBERT 모델이 18배 적은 수의 파라미터를 갖게되었습니다!! 그런데 성능도 더 좋은... :) 요즘 모델이 발전하는 방식과 비슷하긴 한 것 같습니다. 범접할 수 없는 규모로 만들고, 조금씩 깎아내려가는 느낌... 벌크업하고 깎아내려가는...

 

  파라미터의 수만 줄인 것은 아니었습니다. 문제를 다르게 설정하여 다른 loss를 사용했습니다. 기존의 BERT에서 설정한 문제는 두 문장이 주어지고, 랜덤하게 하나를 선택해서 나머지 하나를 예측하는 것이었습니다. (BERT 이후 진행된 다른 연구들에 의해 어느정도 알려진대로) 다음 문장 예측을 하는 것 보다는, 문장의 일관성을 예측하는 문제가 학습하는데 더 좋았다고 합니다. 이러한 문제를 위해 설계된 loss가 SOP(Sentence-Order Prediction) loss입니다. 

 

  추가적으로 16GB의 BOOKCORPUS와 Wikipedia(영문)을 학습하는데 사용했다고 합니다.

 

google-research가 공개한 tensorflow 프레임워크 ALBERT

https://github.com/google-research/ALBERT

 

google-research/ALBERT

Contribute to google-research/ALBERT development by creating an account on GitHub.

github.com

hugging-face가 공개한 pytorch 프레임워크 ALBERT (transformers에 포함되어있습니다.)

https://github.com/huggingface/transformers

 

huggingface/transformers

🤗 Transformers: State-of-the-art Natural Language Processing for TensorFlow 2.0 and PyTorch. - huggingface/transformers

github.com