BERT 경량화

Updated:

Overview

CV 경량화와 NLP 경량화의 차이점?

  • Original task → Target task로의 fine tuning하는 방식이 주된 흐름
  • 기본적으로 transforemer 구조
  • 모델 구조가 거의 유사해서, 논문의 재현 가능성이 높고, 코드 재사용성도 높음

BERT Profiling

Profiling: Model size and computations

  • Embedding layer: look up table이므로, FLOPs는 없음
  • Linear before Attn: k, q, v mat 연산으로 linear after attn 대비 3배
  • MHA: matmul, softmax등의 연산, 별도 파라미터는 없음
  • FFN: 가장 많은 파라미터, 연산횟수
  • 효율적인 GPU 연산을 위해 단독으로 CPU에서 사용하는 메모리보다 소비량이 더 큼(연산속도를 위해 CPU, GPU에 동일 텐서를 들고 있거나 등등)
  • MHA 파트는 이론 연산 횟수 대비 속도가 매우 느린데, 이는 여러 연산의 조합(matmul, softmax) 때문인 것으로 보여짐
  • Linear Layer에서는 GPU가 빠른 속도를 보여주나, CPU는 이론 연산 횟수와 유사한 경향을 보임
  • FFN 파트가 모델의 주된 bottleneck

Paper

Are Sixteen Heads Really Better than One?(NeurIPS 2019)

  • MHA는 구조상 복합적인 정보를 담아두기 위해 제안됨.
  • 실험에서 많은 헤드가 지워지더라도 성능에 영향을 주지 않았음
  • Attn을 Pruning하여 17.5% 속도 향상을 이룸
  • Are All Attention Heads Important?
    • 헤드를 하나만 남겨두고 나머지를 지운 후 성능 드랍을 기록하는 실험
    • 눈에 띌 만큼 성능드랍이 없었음
  • Are Important Heads the Same Across Datasets?
    • 하지만 역할 수행에 꼭 필요한 헤드가 있다.
    • 다른 데이터셋에서도 같은 헤드가 중요한가? → 중요한 헤드는 다른 데이터셋에서도 중요한 경우가 많다.
  • 지금까진 특정한 layer에서 head를 제거하여 효과를 확인했다. 여러 layer에 대한 여러 head를 제거했을 때는 어떤 현상이 발생하는가?
  • Iterative Pruning of Attention Heads
    • Attn 헤드를 중요도를 간접적으로 계산한다.

      • $\xi_h$ : mask variables, 0: masked(removed), 1: unmaksed, $X$: data distribution
    • 데이터샘플에 대해서 특정 헤드를 살린 것에 대한 Loss와 해당 헤드를 지운 것에 대한 Loss의 차이를 뒤의 식으로 approximate하여 사용

  • Effect of Pruning on Efficiency
    • 배치사이즈가 작은 경우 효과가 좋지 않지만 큰 경우 효과가 좋았음

Movement Pruning: Adaptive Sparsity by Fine-Tuning(NeurIPS 2019)

  • Transfer learning에서는 Magnitude pruning의 효과가 좋지 않음
    • 왜냐? original task에서 target task로 transfer learning 과정에서 Weight 값의 변화가 그리 크지 않음
  • 값이 큰 Weight은 그대로 값이 큼 → Weight 값은 많이 변하지 않음
  • Original model에서의 큰 Weight은 Original task에서 중요한 의미를 갖는 Weight일 가능성이 큼
    • Fine-tuned model에서 큰 Weight은 Target task에서 중요하지 않은 Weight일 수도 있음
  • Magnitude Pruning에서는 Original task에서만 중요했던 Weight들이 살아남을 수 있음
    • → Movement Pruning : Transfer Learning 과정에서, Weight의 움직임을 누적해가며 Pruning할 Weight를 결정하자!
  • Background: Score-Based Pruning(Unstructured pruning formulation)

    • $S = (|W_{i,j}|)_{1<i,j<n}$
  • Method Interpretation
    • 0에서부터 멀어지는 weight를 고르는 방법
    • Movement Pruning의 score 유도
      • Masks are computed using the $M = Top_v(S)$
      • Learn both weights $W$, and importance score $S$ during training(fine-tuning)
      • Forward pass, we compute all $i, a_i = \sum_{k=1}^n W_{i,k}M_{i,k}x_k$
      • Forward 과정에서, Top에 속하지 못한 나머지는 masking이 0이 되어, gradient 값이 없어진다.
      • straight-through estimator(Quantization function의 back propagation에서 자주 사용되는 Technique)를 통하여 gradient를 계산
      • 단순히, gradient가 “straight-through”하게 $S$로 전달($M$ → $S$)
      • $S$의 변화에 따른 Loss의 변화는 아래와 같이 정리
      • $\frac{\partial L}{\partial S_{i,j}} = \frac{\partial L}{\partial a_i} \frac{\partial a_i}{\partial S_{i,j}} = W_{i,j} x_{j}$
    • Movement Pruning의 score 해석
      • Gradient descent를 생각해 볼 때($w = w - \alpha \frac{\partial L}{\partial w}$, $\alpha$ : lr rate)
      • $W_{i,j} > 0, \frac{\partial L}{\partial W_{i,j}} < 0$이면, $W_{i,j}$는 증가하는 방향(이미 양수에서 더 커짐)
      • $W_{i,j} < 0, \frac{\partial L}{\partial W_{i,j}} > 0$이면, $W_{i,j}$는 감소하는 방향(이미 음수에서 더 작아짐)
      • 즉, $\frac{\partial L}{\partial S_{i,j}} < 0$의 경우의 수 두 가지에 대해서 모두 $W_{i,j}$의 Magnitude가 커지는 방향
      • $W_{i,j}$가 0에서 멀어지는 것($\frac{\partial L}{\partial S_{i,j}} < 0$) → $S_{i,j}$가 커지는 것($S_{i,j} = S_{i,j} - \alpha \frac{\partial L}{\partial S_{i,j}}$)
    • Score는 Weight가 fine tuning 되면서 함께 학습
      • 기존 score를 계산하는 방법에서는 잘못된 에러에 대해서 수정할 기회가 없었다.
      • 여기에서는 학습되는 과정에서 score를 계산해서 학습이 진행되면서 일종의 self-correction하는 효과가 있다.

Pruning 추천 논문

  • Encoder의 각 위치별로 어떤 Knowledge를 가지고 있는가?
    • On the Effect of Dropping Layers of Pre-trained Transformer Models
    • Pretrained information(general linguistic knowledge)는 input에 가까운 encoder들에 저장되어 있고, head에 가까운 부분들은 task specific한 정보를 저장한다.
    • pretraining 모델에서 head 쪽 레이어를 없애도 fine-tuning 시의 성능이 크게 떨어지지 않는다.
  • Pretraining fine-tuning paradigm이 왜 성능, generalization capability가 더 좋은가?
    • Visualizing and Understanding the Effectiveness of BERT
    • 사전학습 모델을 fine-tuning하는 과정에서 loss surface가 평탄하기 때문에 학습이 더 잘되고 generalization capability가 더 좋다.

Weight Factorizatino & Weight Sharing

ALBERT: A Lite BERT for Self-supervised Learning of Language Representations(ICLR 2020)

  • 큰 모델들이 SOTA 퍼포먼스를 얻게 되는데 메모리 한계때문에 사이즈를 크게 키우는 것에 한계가 있다.
  • 또한, distributed training으로부터 Communication overhead가 존재한다.
  • 이 논문에서 제안하는 세 가지 방법
    • Cross-layer parameter sharing : 파라미터 수 감소
    • Next Sentence Prediction → Sentence Order Prediction : 성능 향상
    • Factored Embedding Parameterization : 파라미터 수 감소
  • ALBERT는 모델을 효율적으로 만들어서 더 큰 모델을 만들자는 목적

Cross-layer parameter sharing

  • Weight sharing은 input, output embeddings의 L2 dist, Cosine similarity를 계산해봤을 때 network parameters를 stabilizing하는 효과가 있다.

Sentence Ordering Objectives

  • Next Sentence Prediction(NSP)가 너무 쉽기 때문에 Sentence Ordering Object(SOP)를 수행하도록 함
  • NSP loss는 SOP 수행에 도움을 주지 않지만 SOP loss는 NSP 수행에 도움을 줄 수 있다.

Factorized Embedding Parameterization

  • WordPiece embeddings($E$)는 context-independent 표현을 학습한다.
  • Hidden layer embeddings($H$)는 context-dependent 표현을 학습한다.
  • BERT에서는 $E$와 $H$의 dimension이 같다. → BERT는 context-dependent 표현의 학습에 효과적인 구조.
  • 그렇다면, 왜 BERT 레이어가 context-independent representation인 WordPiece embedding에 묶여야 할까?
  • WordPiece embedding 사이즈 $E$를 hidden layer 사이즈 $H$로부터 풀어내자.
  • Untying dimensions by using decomposition
    • 원래 $O(V \times H)$를 $O(V \times E + E \times H)$로 파라미터 수를 줄임

Knowledge Distillation

DitilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter

  • 세 가지 loss를 제안
    • 기존 masked language loss, distillation(Hinton) loss, cosine-similarity loss
  • Triple loss = MLM($L_{mlm}$)+Hinton($L_{ce}$)+Cosine embedding($L_{cos}$)
    • Masked Language Modeling Loss : CE-loss
    • Distillation(Hinton) Loss : KL div of teacher, student softmax prob with temperature
    • Cosine embedding loss : between teacher, student hidden state vectors
  • Student architecture & initialization(paper)
    • token-type embedding, pooler 제거
    • 레이어 개수를 절반으로 줄이고 hidden size dimension은 그대로 두었음(dimension을 줄이는 것이 computation에서 큰 효과가 없었다.)
    • 초기화는 student의 첫 번째 레이어는 teacher의 두 번째, student의 두 번째 레이어는 teacher의 네 번째 레이어에서 가져오는 것으로 한다.

TinyBERT: Distilling BERT for Natural Language Understanding

  • Transformer distillation method: 3 types of loss
    • From the output embedding layer
    • From the hidden states and attention matrices
    • From the logits output by the prediction layer
    • Teacher $N$ layers, student $M$ layers → N개에서 M개를 고른다.
    • Teacher와 student의 레이어 맵핑을 하는 $n = g(m)$이라는 함수를 정의한다.(논문에서는 g(m) = 3 *m으로 정의했고 1번 레이어를 3번 레이어로 맵핑한 의미이다.)
    • $L_{model} = \sum_{x \in \chi} \sum_{m=0}^{M+1} \lambda_m L_{layer}(f_m^S(x), f_{g(x)}^T(x))$
      • 학습데이터 $x$에 대하여 Student layer $m$마다 각 레이어의 로스를 구하고 각 레이어의 중요도 가중치 $\lambda$를 곱한 것의 합
      • Layer loss는 $m$번째 student의 특정 output(Attn, hidden, logits), $g(m)$번째 teacher의 특정 output(Attn, hidden, logit)
      • $m = 0$ 일때, $L_{layer}$는 $L_{embd}$, $0<m≤M$ 일때, $L_{layer}$는 $L_{hidden}+L_{attn}$, $m = M+1$ 일때, $L_{pred}$
    • Transformer-layer Distillation(Attention based)
      • $L_{attn} = \frac{1}{h} \sum_{i=1}^{h} MSE(A_i^S, A_i^T)$
      • A는 teacher 또는 student의 attention matrix인데 이 논문에서는 unnormalized attention matrix로 설정함
        • unnormalized가 빠르고 성능이 더 좋았음
    • Transformer-layer Distillation(Hidden state)
      • $L_{hidn} = MSE(H^SW_h,H^T)$
      • $H^T$, $H^S$ : teacher hidden state, student hidden state
      • $W_h$ : Learnable linear transformation(Student의 hidden state를 teacher의 dimension만큼 키워서 MSE를 계산하기 위함)
    • Embedding-layer Distillation loss
      • $L_{embd} = MSE(E^SW_e,E^T)$
      • $W_e$는 $W_h$와 같은 역할을 한다.
    • Prediction-layer Distillation loss
      • $L_{pred} = CE(z^T/t, z^S/t)$
  • Two stage learning framework
    • General Distillation : Large-scale Text Corpus → General TinyBERT
    • Task-specific Distillation : General TinyBERT → Fine-tuned TinyBERT

기타 논문 추천

  • MobileBERT: a Compact Task-Agnostic BERT for Resource-Limited Devices
  • Exploring the Boundaries of Low-Resource BERT Distillation
  • AdaBERT: Task-Adaptive BERT Compression with Differentiable Neural Architecture Search

Quantization

  • 장점 : low memory footprint, inference speed(low precision operation 증가 추세)
  • 주로 Quantization 과정에서 발생하는 accuracy drop을 줄이는 방향에 대한 연구
  • QAT(Quantizatino Aware Training), Quantization range 계산 방법 제안 등

Q-BERT: Hessian Based Ultra Low Precision Quantization of BERT

  • 민감도가 높은 layer는 큰 precision, 낮은 layer는 작은 precision
  • group-wise quantization이라는 새로운 방법 제시
  • BERT의 bottleneck 조사
  • Hessian spectrum(eigenvalues)
    • Higher Hessian spectrum을 가지는 NN layer에서의 파라미터들은 더 민감함(Hessian의 top eigenvalues의 크기가 해당 레이어의 민감도와 연관이 있다)
    • Hessian spectrum 계산의 복잡성 → power iteration method로 해결(Large sparse matrix에서의 빠른 수렴)
    • 같은 데이터셋이더라도 Hessian spectrum의 var이 매우 큼 → mean, std를 함께 고려하여 민감도를 정렬
  • Group-wise Quantization method
    • key, query, value, output 모두 같은 Quantization range로 정했었는데 이 range가 커버해야 하는 matrices의 단위가 너무 크다.
    • query, key, value의 분포가 다를 수 있는데 이때 에러가 커진다.
    • 따라서, Multi-head 별로 따로따로 quantization을 진행함

정리

Pruning

  • Structured : 모델 사이즈 감소, 속도 향상, 성능 드랍
  • Unstructured : 모델 사이즈 감소, 적은 성능 드랍, 속도 향상 X(별도 처리가 없는 경우)

KD

  • 파라미터 수 감소, 다양한 range 모델, 큰 속도 향상 여지(LSTM 등 다른 구조로 distillation), 비교적 복잡한 학습 구성, code maintain

Weight

  • Matrix decompostion(factorization) : 모델 사이즈 감소, 적은 성능 감소, 속도 향상(주로 CPU), 속도 변화 미미(GPU)
  • Param(weight) sharing : 모델 사이즈 감소, 학습 관련 이점, 적은 속도 개선

Quantization

  • 모델 사이즈 감소 탁월, 적은 성능 하락, 속도 향상 불투명(지원 증가 추세)

Comments