2021년 6월 17일 목요일

Naver LarVa 발표자료 정리

 예전부터 보려고 했던 네이버 LarVa Project 발표자료를 읽고 정리해본다.


1. 실시간 평가

비싸고 오래 걸리는 Language Model을 잘 학습하기 위해,

학습이 진행될 때마다 평가 데이터셋으로 평가하여 학습 상황 모니터링한다.


2. Dynamic input generation

기존 bert의 static file 방식과 달리 이 방식을 쓸 경우, 

  • 저장 공간을 줄일 수 있고,
  • Training 중간에 sequence length, masking 개수, 방식 등을 동적으로 변경할 수 있다.
이 때, file reader가 코퍼스를 분할 저장한 파일들을 읽어 Queue에 학습 인스턴스를 넣고, data reader가 큐에서 인스턴스를 읽어와 모델 input으로 사용하였다.


3. Half precision training

FP16으로 학습하였다. 이 때 성능의 저하는 없이 배치 사이즈를 키우고, 학습 시간이 빨라지며 모델 크기도 줄어들었다.


4. Hyper parameters

Batch size는 클 수록 좋다. 하지만 개인, 소규모 회사가 구현하기는 힘들다. TPU pod를 쓰던지

모델 사이즈도 클 수록 좋다...

Char vs subword 는 char 단위가 감정분석에서 조금 좋고 다른 분야에서는 비슷하다.

Cased vs Uncased(자모 분해됨). 대체로 성능은 비슷하나, 자모 분해로 Token 수가 늘어나 기계독해 성능 하락 Cased 우세, 감정분석 Task에서는 Uncased이 약간 우세 라고 하는데, 한글을 lower casing 하면 자모로 분해되나?

Vocab은 32k보다 64k가 좋다.

BERT vs RoBERTa:

그래도 최고점은 RoBERTa가 높은 듯.


5.Masking strategy



6. Fine-tuning

Multi-task learning(모든 task를 한 번에 학습)


그 외  service에 적용한(하려는) 아이디어들은 생략.

2021년 6월 16일 수요일

BPE(Bytepair encoding), Wordpiece, Sentencepiece 정리

 

최근의 NLP 논문과 여러 자료들을 읽다보면, Bytepair encoding, Wordpiece, Sentencepiece 등의 여러가지 용어가 나온다. 그리고, Bytepair encoding을 character 단위로 했는지, byte 단위로 했는지도 다르다. 대충 비슷한거 같은 용어들이 어떻게 다른지 정리해보려고 한다.



1. Bytepair encoding

기본적인 원리가 딥 러닝을 이용한 자연어처리 입문 위키독스 에 잘 설명되어 있다.

원래 압축 알고리즘으로 쓰이던 bytepair encoding을 자연어 처리 분야에 적용하여 vocabulary를 만드는 데 쓰였다. 이를 처음 적용한 논문은 sennrich의 번역 논문이다. BPE 알고리즘을 쓴 대표적인 논문이 GPT이다.


GPT 논문에서는 unicode 단위가 아닌 byte 단위 BPE를 사용했다고 한다. RoBERTa 논문에 따르면 그 이유는 유니코드 하나하나를 독립적인 단위로 취급하면 유니코드들이 vocabulary의 상당 부분을 차지하기 때문(unicode characters can account for a sizeable portion of this vocabulary when modeling large and diverse corpora, such as the ones considered in this work.)이라고 한다. 유니코드 캐릭터 중에는 복수의 byte로 이루어진 캐릭터들이 많기 때문에 byte단위로 subword를 구성할 경우 같은 byte sequence를 공유하는 unicode들끼리는 묶일 수가 있다. 

스택오버플로 문답 참고


2. Wordpiece model

구글에서 BERT 모델을 학습할 때 쓴 subword 모델이다. BERT에서는 구글이 번역 시스템에서 만들었던 embedding을 가져온 것으로 보인다. 이 시스템에 쓰인 알고리즘인 wordpiece model은 BPE와 거의 비슷하다고 언급되어 있으며, 구글의 음성 인식 연구에서 처음 제안되었다. 

Bytepair encoding이 count만을 이용하여 가장 많이 등장하는 character pair를 합쳤다면, wordpiece model은 likelihood를 기준으로 character pair를 합쳐나갔다. 학습 데이터에 대한 likelihood를 최대화하는 character pair를 합쳐나가는 것인데, huggingface tokenizer 에 간단한 예시와 설명이 있다. 옮겨 적어보면, "a"와 "b"를 합치려면 "ab"가 character pair 중 가장 많이 등장하는 것이 아닌, P("ab") / P("a")P("b") 값이 가장 커야 한다 - P("a")는 데이터에서 "a"가 등장하는 빈도이다.


3. Sentencepiece

구글이 만든 tokenizer 라이브러리이다. 가장 큰 특징은 모든 언어를 다 다루기 위해 띄어쓰기까지 하나의 문자로 취급하여 tokenize한다는 것이다. 깃헙을 보면 알 수 있듯이, tokenize하는 여러 방법이 있으며, subword 단위 tokenizer인 BPE, unigram lanugage model과 character 단위, word 단위 tokenizer를 지원한다. 추가적으로 subword regularization도 지원한다. 이름을 보면 햇갈릴 수 있는데, wordpiece 알고리즘을 지원하지는 않는다.


정리 끄읕!