GeDi: Generative Discriminator Guided Sequence Generation
🔎

GeDi: Generative Discriminator Guided Sequence Generation

Tags
NLP
논문리뷰
Published
Published May 1, 2021
notion image

TL;DR

  • 현재 LM의 문제: Generate하는 Model의 Distribution을 조절하기 어려움
    • 어떤 말을 하게 하는 것보다 어떤 말을 하지 않게 만드는 것이 더 어려움
  • GeDI: 자그마한 Generative Teacher model을 만들어서 → Token generation마다 '덜 Toxic'일 가능성이 높은 토큰을 생성하지 않게 만든다

기존 LM 생기는 이슈

컨트롤이 안된다! → Prompt를 다르게 넣어준다 = 예측 불가능한 결과
  • 이걸 막기 위해 나온게 CC-LM (Class-conditional LM)
    • CTRL
      • control code 라는 것을 추가하고 → 문장을 생성하는 방법을 사용
      • 하지만 Not to generate는 하지 못함
      • control code 사용시 LM의 Diversity 감소
  • 매번 Classifier 넣어서 Toxity classify (aka Steer Generation)
    • Weighted ecoding
      • 이후 나오는 많은 token 대해 classification
      • N개의 토큰 할 때 마다 N번 * vocab
      • Sequence 한 step나갈때마다 위에걸 반복
      • Computational Cost가 너무 비쌈 💸
  • 좋은 데이터만 LM에 먹이자
    • 사람이 좋은 데이터를 본다면 → 비용이 너무 비쌈
    • Classifier나 그런거로 데이터 쳐내면 → 안 그래도 데이터 없는데....
    • 학습 비용은 누가 대주나?😞 💸 GPU 비싸요...

GeDI: Generative Discriminator

GeDI = Large LM에서 생성할 때 보다 안전하고 Controllable한 문장을 생성하도록 Guide하는 모델
Paper에서 다루는 Gedi:
  • GeDI-guided contrastive generation
    • CC-LM을 Generative discriminator로 사용
    • 모든 Next candidate token에 대해 classification likelihood를 계산
    • Bayes Rule을 사용, 모든 토큰 각각에 하나하나 계산하는 것보다 엄청나게 계산량 줄임
      • 만약 모든 토큰에 계산하면 Discriminator의 Classifier 연산을 Vocab 수 만큼 해야함
  • GeDI Training
    • Hybrid generative-discriminative loss를 사용
-당연하게도- GeDI 쓰면 문장 생성의 Quality를 유지하면서도 generation control이 가능함

GeDI로 한 실험

  • Movie Review로 학습한 Sentiment로 → Positive/Negative tone 생성
  • GPT-2에 있는 Toxity 줄이기
  • 4 topics 분류로 학습 → 특정한 Topic을 Zero-shot으로 생성

GeDI 구조

  • Desired control code
  • Undesired control code
  • 각각 control code에 대해 Next Token(t 시점)이 해당 class에 속할지 Prob를 계산
notion image
  • 위와 같이 Bayes Rule 써서 현재(1~t)까지 생성된 Sequence가 Class에 속할 확률을 구할 수 있음
  • 여기서 만약 인 모든 j에 대해서는 이미 이전 과정에서 Compute를 마쳤기 때문에 cache로 사용
    • 따라서, 두 가지로 시작한 Generation의 Forward만 계산하면 됨
  • 일반적으로 Classifier의 Computation cost는
    • Unidirectional은 step별로 Vocab 수 만큼
    • Bi-directional은 step별로 (현재 생성된 토큰 수) * Vocab 수 만큼
    • GeDI는 거의 1/10000 수준으로 줄어든다 (vocab이 대략 2만개라 치면)
notion image

추가적인 휴리스틱

  • Weight decoding & Filtering
  • Weighted Posterior로 보다 맞는 class에 더 bias된 Generation을 유도
    • Weight decoding보다는 filtering이 더 효과가 좋음
  • Nucleus Sampling (aka Top-p samling)
    • 1위부터 N번까지 합친게 p% 넘으면 그까지만 sample
  • 앞서 만든 p 에서 → 특정 class C 에 해당하는 토큰 & 일정 confidence 이상인 경우 → 유지
    • 위 Top-p + 특정class확률 높은 토큰 합한것 대상으로 classification & generation

GeDI training

일반적으로 Generative classifier보다 Discriminative classifier가 성능이 더 좋음
따라서 Generation model을 바로 사용하는 대신 CC-LM을 Classifier로 사용!
  • 일반적인 LM Loss
  • Discriminative Loss (CE loss)
  • 두 loss 합쳐서 학습
GeDI는 GPT-2 Medium(345M) 모델을 Finetune해서 사용
  • Control code를 추가
    • 이건 긍/부정, 각 class 등 여러가지 종류
  • Huggingface transformers
위 설정으로 학습한 GeDI를 이용해 GPT-2 XL(1.5B) 모델의 Generation을 guide
*결국 GeDI가 쓰는건 classification은 아니고 LM next token prob이긴 함

성능!

Inference Speed

  • Token 생성 별 사용되는 시간
    • PPLM 대비 엄청나게 줄어듬
    • 약 50% overhead(GPT 단독 대비)
notion image

Sentiment control

  • Movie Reivew(IMDB)로 GeDI 모델 학습
  • MTurk에 사람들에게
    • "이게 Book리뷰? 아니면 Movie review? Amazon Review?" 라고 묻는 것
    • Positive? Negative? 묻는 것
notion image

de-Toxicity

  • GeDI Guide로 Toxicity → 원래 데이터셋인 Jigsaw toxic comments 기반 GeDI 학습
    • 이 데이터셋 너무 오래되지 않았나? 다른 데이터셋도 좋은거 많은데....
    • StereoSet같은 Bias관련 실험이 있었다면 좋았을텐데...
  • 역시 평가 자체는 mTurk로 Human eval
    • "이게 Toxic해? 말 잘해?" 라고 질문
    • [non-toxic/mildly toxic/toxic], [very-low quality, low quality, high quality, very high quality]
notion image

Topic control

  • CC-LM으로 타겟 topic에 true false condition으로 학습
  • "<토큰> 문장을 쓰고 있어요" ← 만약 토큰 == 문장종류 이면 true, 아니면 false
  • 이것 역시 Human annotation...
    • Topic 종류와 Linguistic quality 평가
notion image

Pros

  • Train도 1GPU(12G vram)에서 하루면 충분
    • Pretrained model finetune하기 때문
  • PLM을 건드리지 않음
  • 빠른 inference time!

Cons

  • Vocab을 동일한 것을 사용해야 함 (GeDI, 타겟 AR 모델)
  • pytorch 1.4, transformers 2.8 (꽤나 구버전)
  • Amazon MTurk로, GeDI가 생성한 것을 평가
    • Human test가 좋긴 한데......
    • 이 labeling 이 어떻게 가이드 되고 라벨링 되었는지 설명이...
  • 한국어에 적용하기엔... 이미 github에서 내려간 KoGPT2..?
  • GPT-2도 큰 모델 작은모델 있어야 하는데 작은 모델도 없으면...
    • 큰 모델을 Guide하기 위해 작은모델을 finetune
  • Toxicity Confidence를 단순히 prediction prob로 잡아도 괜찮은 걸까?
  • 휴리스틱한 Sampling이 끼치는 영향에 대해 실험이 부족함
  • Automated evaluation set이 적음
    • 사실 당연할수도? 그래서 Task를 여러가지 한 것이라고 봄
    • 근데 PPL 등 자동 평가도 IMDB하나에만 테스트 함. 다른 데이터셋에는 안해봄
  • GeDI를 쓰는 것과 아닌 것에 있어서 성능 차이가 일정하지 않음
  • Baseline은 어디에?
    • Toxicity 측정을 하는 것에 있어서 → Generated 텍스트에 대해 평가하는 것
    • 따라서 Baseline이라고 할만한게....?
    • 표는 있지만 저게 "Significant"한 차이인거 맞아?
  • 더 작은 Guide model도 가능?
    • 345M → 1.2B 대신에
    • 110M → 1.2B도 가능할까? (GPT로 GPT2-XL guide하기)
    • 만약 1.2B로 1.2B Guide하면?
    • 물론.. 345M으로 175B GPT-3을 Guide하는 것도 있기는 했지만 (이정도면 충분히 작긴 하지)
  • 실제 Performance 테스트가 이건 가능하긴 한걸까... 🤔

결론

"괜찮아 보이는데... 아이디어도 좋고... 근데 확실히 빈칸은 많아보이고, 채우기도 어려워 보인다."
특히 Evaluation 측면에서 어려운 부분이 있는 듯 하다.
억지로 Biased 혹은 toxicity dataset으로 학습된 모델을 → 강제로 그런 말 못하게 만드는 방향은 어떨까?
ex) 질 낮은 커뮤니티글로 학습 → GeDI로 Detoxify → 샘플 몇만개 생성 후, BERT등 classifier로 Toxic % 측정해본다거나..