본 게시물은 개인적으로 공부하기 위해서 참조한 사이트에서 필요한 부분만 '쏘옥' ? 가져왔다기보다는 몽땅 가져왔다는 게 맞겠습니다.
자세한 정보는 아래 참조사이트에서 참고해주세요.
kcElectra를 활용해서, Text Classification Model을 fine-tuning해서 릴리즈 하였으나, 정확하게 Electra가 돌아가는 마당을 이해하지는 않은 것 같아서, 이참에 관련 자료를 수집하고 이해할 필요가 있어서 정리하게 되었다.
구글 리서치팀에서 새로운 pre-training 기법을 적용한 language model인 Efficiently Learning an Encoder that Classifier Token Replacements Accurately (이하 ELECTRA)
기존의 Language model 들은 input을 mask token으로 치환하고, 치환 전의 원본 token 으로 복원하는 MLM (Masked Language Modeling)을 통해 pre-training 했다. 그러나, 이러한 모델들은 학습 시에 상당히 많은 계산량을 필요로 하여 충분한 컴퓨팅 리소스가 없는 연구자들은 language model의 pre-training을 연구하기 어려워지고 있다.
하여, ELECTRA는 모델의 정확도와 함께 '효율성'에 주목하여, RTD(Replaced Token Detection) 이라는 새로운 pre-training 태스크를 제안하여 보다 빠르고 효과적으로 학습한다.
ELECTRA는 모델의 크기, 데이터, 컴퓨팅 리소스가 동일한 조건에서 기존의 'BERT'의 성능을 능가했고, Small 모델에서 두드러졌다. (하나의 GPU로 4일만 학습한 모델로 계산량이 30배인 GPT를 능가)
Large 모델에서도 RoBERTa나 XLNet 대비 1/4 계산량으로 비슷한 성능에 도달했다.
** Denosing Auto-Encoder(dA)
=> Data에 Noise가 추가되었을 때, 이러한 Noise를 제거하여 원래의 데이터를 Extraction 하는 모델
주로 input sequence token 중 약 15%를 마스킹하고, 복원하는 MLM 태스크를 통해서 학습을 하는데, MLM은 기존의 autoregressive language modeling 학습에 비해 양방향 정보를 고려해서 효과적인 학습을 할 수 있지만 전체 토큰 중 15%에서만 loss가 발생함. 즉, 하나의 example에서 고작 15%만 학습. 그래서 비용이 많이 듦. 학습 때 [mask] token을 모델이 참고하여 예측하지만 실제 inference로는 [mask] token이 존재하지 않음 의 단점이 있다.
이를 위해 RTD(Replaced Token Detection) 이라는 새로운 pre-training task를 제안했다.
RTD는 generator를 이용해 실제 input의 일부 token을 가짜 token으로 바꾸고 각 토큰이 실제 입력에 있는 진짜(origin) token 인지, generator가 생성한 가짜(replaced) token인지를 discriminator 가 맞히는 이진 분류 문제이다.
Electra는 RTD take로 입력의 15%가 아닌 모든 token에 학습하기 때문에 효율적이면서 효과적이다. ( downstream task 에서 성능도 더 좋음)
**downstream task :
=> 구체적으로 풀고 싶은 문제,
자연어처리 분야에서는 언어 모델을 pre-trained 방식을 이용해 학습을 진행하고 원하는 태스크를 fine-tuning 방식을 통해 모델을 업데이트 하는데, 이 때의 태스크를 downstream task 라고 한다.
예) BERT의 언어모델을 QA task로 학습함 (QA task가 downstream task)
Generator
G와 Discriminator
D 두개의 네트워크가 필요하다.Generator G
Generator G는 BERT의 MLM과 학습 매커니즘이 유사하다.
[1] input token seqenme x = [x1, x2, ... xn]에 대해 마스킹할 위치의 집합 m=[m1, m2, ..mk]를 결정한다.
모든 마스킹의 위치는 1과 n 사이의 정수이다.
[2] 결정한 위치에 있는 input token을 [MASK]로 치환한다.
[3] 마스킹된 입력 x(masked)에 대해서 generator는 원래 토큰이 무엇인지 예측함
<t번째 토큰에 대한 예측>
[4] 최종적으로 아래와 같은 MLM loss로 학습함
Discriminator D
Discriminator D는 input token sequence에 대해 각 token이 origin 인지 replaced 인지 이진 분류로 학습한다.
[1] Generator G를 이용해 마스킹 된 입력 토큰을 예측함 (Generator G에서의 [1]~[3] 단계)
[2] Generator G에서 마스킹할 위치의 집합 m에 해당하는 위치의 토큰을 [MASK]가 아닌 generator의 softmax 분포 pG(xt|X)에 대해 샘플링한 토큰으로 치환(corrupt) 한다.
Original input : [the, chef, cooked, the, meal]
input for generator : [[MASK], chek, [MASK], the, meal]
input for discrimiator : [the, chef, ate, the ,meal]
: 첫 번째 단어는 샘플링 했을 때, 원래 입력 토큰과 동일한 'the' 가 나온 것
: 두 번째 단어를 샘플링 했을 때, 원래 입력 토큰인 'cook' 이 아닌 'ate'가 나온것
: 이 치환과정의 수식은 아래와 같다.
[3] 치한된 입력 x^corrupt에 대해서 discriminator는 아래와 같이 token이 원래 입력과 동일한지, 치환된 것인지 예측한다.
[4] 최종적으로 아래와 같은 loss로 학습
Generator가 원래 token과 동일한 token을 생성했을 때, GAN은 negative sample(fask)로 간주하지만 ELECTRA는 positive sample로 간주한다.
Generator가 discriminator을 속이기 위해 adversarial 하게 학습하ㅣ는 것이 아니고, maximum likelihood로 학습한다.
- Generator에서 샘플하는 과정 때문에 역전파가 불가능하고, 따라서 adversarial 하게 generator를 학습하는 것이 어려움
Generator의 입력으로 노이즈 벡터를 넣어주지 않는다.
최종적으로 ELECTRA는 대용량 코퍼스 X에 대해서 generator loss와 discriminator loss의 합을 최소화하도록 학습함
이때 λ는 50을 사용하고, 파라미터는 이진 분류는 discriminator loss와 30000 클래스 분류인 generator loss의 스케일을 맞추는 역할을 함
샘플링 과정이 있어서 discriminator loss는 generator로 역전파 되지 않으며,
위의 구조로 pre-training을 마친 뒤 generator는 버리고 discriminator만 취해서 downstream task로 fine-tuning을 진행함
Weight sharing
Generator와 discriminator는 모두 Transformer 인코더 구조이기 때문에, 두 네트워크의 가중치를 공유하여 학습하는 weight sharing 기법을 쓸 수 있고, pre-training의 효율 향상을 기대할 수 있다.
동일한 구조의 두 네트워크가 주어졌을 때 [1] 임베딩의 가중치만 공유하고 그 외의 가중치는 따로 학습시키거나 [2] 모든 가중치를 서로 공유하는 방법을 생각해 볼 수 있다.
논문에서는 각 weight sharing 세팅에 대해 500k step 만큼 학습시키고 GLUE로 성능을 평가함.
논문에서 가중치를 공유하지 않을 때 83.5, embedding만 공유할 때 84.3, 모든 가중치를 공유할 때 84.4 로, 모든 가중치를 공유하는 것이 좋은 성능을 보였다.
이를 paper에서 Discriminator는 입력으로 들어온 token만 학습하는 반면, generator는 출력 레이어에서 softmax를 통해 사전에 있는 모든 token에 대해서 밀도 있게 학습할 수 있다. ELECTRA는 결국 discriminator 만을 취해서 사용하는데, 이 때 generator와 임베딩을 공유해서 학습하는 경우의 discriminator는 훨씬 효과적으로 학습했을 것이고 결과적으로 더 좋은 성능을 기록한 것으로 보고있다.
성능 자체는 모든 가중치를 공유하는 방법이 좋지만 generator와 discriminator의 크기를 반드시 동일하게 맞춰야 하는 제약이 생기기 때문에, 결국 discriminator만 사용하는데 이 때 generator를 이와 동일한 크기로 가져가는 것은 학습의 효율을 떨어트릴 수 있다. 또한 더 작은 generator를 사용하는 것이 상당히 효과적이어서, paper 에서는 embedding만 공유하는 세팅으로 진행되었다.
smaller generators
=> 동일하게 500k step으로 학습해서, 작은 모델은 같은 계산량/시간에 따라 더 많은 step을 돌기 때문에 계산량 대비 성능을 손해본 셈이됐지만 그럼에도 불구하고 discriminator의 크기 대비 1/4-1/2 크기의 generator를 사용했을 때 가장 좋은 성능을 보였다.
[1] Two-stage 학습 : generator만 LMLM 으로 n step 동안 학습시키고, discriminator를 generator의 학습된 가중치로 초기화하고 LDisc로 discriminator만 n step 동안 학습 시키는 방식 (generator 가중치는 고정)
[2] Adversarial : GAN 처럼 adversarial training을 모사해 학습 시킴
그러나, BERT-small 보다 좋은 성능을 보인다.
Electra가 성능이 왜 좋은지에 대해 일종의 ablation study의 성격으로 아래와 같이 실험을 세팅했는데,
- ELECTRA 15% : electra 구조를 유지하되, discriminator loss를 input token의 15%만으로 만듦
[참고 사이트]
[참고 논문]
1. http://www.iro.umontreal.ca/~vincentp/Publications/denoising_autoencoders_tr1316.pdf