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를 계산
- 위와 같이 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만개라 치면)
추가적인 휴리스틱
- 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 단독 대비)
Sentiment control
- Movie Reivew(IMDB)로 GeDI 모델 학습
- MTurk에 사람들에게
- "이게 Book리뷰? 아니면 Movie review? Amazon Review?" 라고 묻는 것
- Positive? Negative? 묻는 것
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]
Topic control
- CC-LM으로 타겟 topic에
true
false
condition으로 학습
- "<토큰> 문장을 쓰고 있어요" ← 만약 토큰 == 문장종류 이면
true
, 아니면false
- 이것 역시 Human annotation...
- Topic 종류와 Linguistic quality 평가
Pros
- Github이 있음!
- 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 % 측정해본다거나..