제목
- Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
- 전이학습의 한계를 획일화된 Text-to-Text Transformer로 탐험하기
전이학습의 한계

- 엄청나게 많은 전이학습 방법론이 나오고 있었다.
- ex. pre-training objectives, unlabeled dataset, benchmarks, fine-tuning methods
- 너무 빠른 속도로 다양해지니까 각 방법론들을 비교하기 어렵다.
- 각 방법론에 대한 contribution을 개별적으로 이해하기가 어려워진다.
- 공감해보기
- STS
AutoModelForSequenceClassification을 호출한다.
- 0에서 5사이의 값으로 regression하도록 학습시킨다.
- question answering
AutoModelForQuestionAnswering을 호출한다.
- start 토큰 번호와 end 토큰 번호가 뭔지 지정해준다.
- logit 값이 가장 높은 start, end 토큰을 골라서 후처리한다.
- 으악~ 끔찍해~
- 우리 그러지말고, 획일화된 접근법(unified approach)을 한번 생각해보자! → T5
획일화된 방법

- 모든 문제를 text-to-text 문제라고 생각해버리기
- text-to-text: 입력도 텍스트, 출력도 텍스트
- 이 방법이 왜 좋나요?
- 모든 task를 똑같은 모델, objective, 훈련 방법, 디코딩 절차로 해결할 수 있다.
C4
- Colossal Clean Crawled Corpus 라는 여기서 직접 만든 데이터셋. (약 750GB)
- T5를 사전학습시키기 위해서 사용한다.
- 왜 직접 만드나요? 그냥 있는 거 쓰면 안되나요?
- 모델이 커지면, 데이터의 양도 커야 하는데 지금까지는 그런 데이터가 없었나보다.
- T5는 11B까지 고려하고 있어서 큰 데이터셋이 필요했나 보다.
- Common Crawl이라는 데이터를 기반으로, 퀄리티를 높이기 위해 이것저것 진행했다.
- 너무 rule-base라 자세한 내용은 논문의 2.2절 참고.
- 문장 앞에 붙이는 prefix는 일종의 하이퍼파라미터로, 영향은 그렇게 크지 않다고 한다. (… prefix had limited impact)
- relative positional embedding을 사용한다.
- key-value offset 차이가 128를 넘어가면 다 똑같아진다.
- 근데 attention layer를 여러 층 쌓아서, 128 넘어가도 sensitive.
- Layer Norm 블록에 bias를 제거했다. → 계산의 편의성
- Layer Norm 이후에 Residual Skip Connection 진행
- 원래는 Residual Skip Connection 이후에 Layer Norm
실험
구조와 목적함수에 따른 성능 변화

Denoising이 뭐지?

- BERT가 15%의 토큰을 마스킹처리하고 그걸 예측하는 Task를 진행하는 것과 비슷한데, 이를 encoder-decoder 버전으로 바꾼 버전
- spans of tokens을 마스킹 처리한다. (전체 15% 정도)
- 마스킹된 입력을 받아 위 도표의 Targets 처럼 출력해야 한다.
<eos>말고 <Z>는 왜 쓰는걸까?
- 내 생각)
<eos>는 실제 인퍼런스 단계에서 쓰여야 하므로 사전학습 단계에서 나타나게 되면 이상한 편향이 생기지 않을까…?
- 사전학습할 때랑 파인튜닝할 때의 간극을 줄여야 한다.
Prefix LM이 뭐지?

- 위 도표에서 가장 오른쪽에 있는 것처럼 마스킹을 주는 방법.
- 그냥 Causal LM 쓰면 안되나요?
- 솔직히 이해안됨.
- prefix가
translate English to German: That is good. target:이고, target이 Das ist gut.인 예제를 생각해보자.
- Causal LM은 prefix의 state를 만들 때 이전 prefix만 참고해야 하므로, target을 뽑아낼 때 prefix의 state vector가 좀 이상해질 수 있다?
- 그래서 prefix LM을 이용해서 prefix의 state vector를 잘 만든다?
결론
- Encoder-decoder에 denosing쓰는 게 짱이다.
- 근데 왜 LLM에는 안쓸까?
- 모델 크기를 키우면 굳이 encoder-decoder 모델로 만들면서 denosing쓰는 것보다 성능이 더 잘나와서 그런 게 아닐까?
- encoder-decoder로 할 바에 그냥 decoder 더 키우는 게 나아서?
- Prefix LM이 Causal LM보다 성능 잘 나온다.
Denoising 의사 결정 과정

- 글에서는 생략하지만, 각 단계 별로 어떤 선택지가 제일 좋을지 실험을 진행한 내용이 있다. (이는 논문을 참고하자.)
- Corrupted span length의 경우, 3으로 설정하는 것이 제일 좋았다.

C4 말고 다른 데이터셋 쓰면 안되나요?

- 일부 Task에 대해서는 다른 데이터셋을 사전학습에 사용하는 것이 더 성능이 높게 나오긴 한다.
- 근데 이 결과는 모두 동일한 training steps(=219)로 맞춰놓고 실험한 것 같다.
- 그래서 사실 C4의 극히 일부(=235B tokens)만 사용한 거라 더 학습을 진행하면 C4를 사용하는 편이 더 학습이 잘 될 것이다.
- why? 다른 데이터는 작아서 계속 봤던 데이터 또 봐야 하니까…
적은 데이터로 여러 번 학습하면 진짜 안좋나?

- C4의 일부를 잘라서 여러 번 반복하게 하여 실험을 진행했다.
- 역시 training steps은 모두 동일하다.
- 동일하게 반복이 많아지면 전반적으로 성능이 떨어지는 것을 확인할 수 있다.
파인튜닝에 관한 실험

- 아무래도 파라미터 전부 다 학습시키는 건 너무 오래걸릴테니 그의 대안으로 (이 당시엔) 2가지가 있다.
- adapter layer
- FFN layer에 다음에 붙이는 dense-ReLU-dense 블록
- gradual unfreezing
- 처음에는 output layer에 가까운 레이어만 학습이 일어나다가, 점점 input layer에 가까운 레이어까지 확장되며 학습이 일어난다.
- 참고: baseline의 모델 크기는 220M
Multi-task Learning

- 하나씩 파인튜닝 하지 말고, 그냥 다 한꺼번에 묶어서 파인튜닝해보자.
- (+) 하는 김에 그냥 사전학습도 같이 해버리자.
- 이게 어떻게 가능한가요?
- 다 text-to-text 문제로 치환했기 때문에 task-specific한 분류기 레이어 같은 게 없고, loss도 같은 식으로 계산할 수 있음!
- Examples-proportional
- 각 데이터셋의 크기에 비례하여 데이터를 뽑고 하나로 합친다.
- 돋보적으로 크기가 큰 데이터셋이 있으면 아무 의미 없는 짓이 되어버린다.
- 한 task에서 아무리 많아도 K개의 데이터만 넣을 수 있도록 제한한다.
- Temperature-scaled
- 데이터셋의 비율에 T1만큼 제곱하여 examples-proportional 진행
- K=221 제한을 적용. (temperature scaling 전에 적용한다.)
- 체크포인트를 여러 개 만들어 두고, 그 중 각 task에 대해서 max값을 표에 올렸다고 한다.
받고 fine-tuning

- 1행은 baseline, 2행은 Multi-task training 표에서 K=219인 경우
- Multi-task pre-training 한 다음 각 task에 대해 finetuning하면 더 잘할까? → 3행
- 하고 싶은 task가 아닌 다른 task들에 대해 훈련을 받는 것이, 하고 싶은 task에 실질적으로 도움이 될까? → 4행
- multi-task mixture에서 작업 A를 제거한 후 사전학습 → 작업 A에 대해 파인튜닝
- unsupervised dataset이 어떤 영향을 주고 있을까? → 5행
- multi-task mixture에서 unsupervised dataset을 빼버림.
- EnFr, EnRo는 오히려 잘함 → C4가 억제기였다.
- 그 외 다른 Task → C4가 더 잘하게 도와줬다.
모델 크기에 관한 실험

- 계산 자원이 4배 더 주어졌을 때 어떻게 활용해야 더 성능을 높일 수 있을까에 대한 실험
- 결론 1: training steps나 batch size나 고만고만하다.
- 결론 2: 일반적으로 model size를 키우는 게 낫다.
- 결론 3: 그렇다고 해서
2x size, 2x steps랑 4x size, 1x steps 고만고만하다.
- 결론 4: 앙상블도 잘 오르는데, SuperGLUE에 대해서는 안오른다.
- 참고: small(60M) → base(220M) → large(770M) → 3B → 11B, 총 5가지 크기의 T5가 있다.
최종 실험

- Multi-task pre-training을 사용했다.
- 아마 이후에 task마다 파인튜닝도 따로 한 것 같다?
- 성능도 나름 괜찮게 나온다.
- 사전 학습 하면서도 downstream의 task를 모니터링 가능
- 단, 모델 크기에 따라서 unlabeled dataset의 크기는 유동적으로 조절한다. (정확한 수치는 논문 참고)
- GLUE, SuperGLUE을 파인튜닝할 때는 배치 크기를 2048에서 8로 줄인다.
- 배치 크기가 커지면, 각 데이터를 한번씩만 보고 싶어도 low-resource tasks의 경우 여러 번 나타나게 될 수 있기 때문이다?
- greed search 대신 beam search를 사용한다.
- 총 24가지 task에서 18가지 task에서 SOTA 달성!
베이스라인과 T5-Base 성능 비교

- Baseline을 단순하게 T5-Base만큼 학습시킨다고 해서(Baseline-1T), T5-Base만큼 성능이 나오지 않는다.
- 즉, 최종 실험에서 건든 설정들이 유효했다는 것 같다.