(이 때 transfomer는 논문의 setting을 따른다. ex. use Adam optimizer, d_ffn = 4xd_model)
PEFT’s strategy (~15min)
Adapter를 삽입하는 방법
adapter
밑의 그림은 transfomer의 한 개의 layer이다. transfomer의 한 개의 layer는 self attention module으로 이루어진 multi head attention module + feed forward network로 이루어져 있다.
→ multi header attention의 output을 adapter에 쏴주고 있는 모습!? ++ feedfoward network를 통과한 output을 adapter에 쏴주고 있는 모습!? (== feedforward down projection, feedforward up projection 두 가지 matrix만을 새롭게 학습 시킨다)
→ 문제 점: multi header attention에서 output을 받아야지 adapter에서 연산을 수행할 수 있다. 즉 sequential하게 연산이 수행되기 때문에 inference latency가 발생하게 된다.
(이후에 AdapterFusion, AdapterDrop 등의 기법이 나와서 이를 해결하려는 노력을 하였다. 나중에 시간이 나면 이 AdapterFusion, AdapterDrop을 알아보자! → but 구조적인 문제를 해결하지는 못했다…)
→ adapter는 한 layer에 두 개씩 들어간다.
→ 그냥 adapter는 우선 추가 거치는 곳이 있다.. 정도만 알아두자..
→ 얜 유튜브 설명 잘 없네..
Prompting을 하는 방법 (~18min)
prefix tuning
P tuning, Prompting에서 영감을 받은 작업이다.
→ 문제점 인간의 지시어가(prompting)이 정확하지 않을 수 있다.
→ sequence length가 제한이 되어 있기 때문에 문제가 될 수 있다.
결론:
Adapter: inference가 너무 길다.
preifx: 최적화가 어렵고, trainable-param이 non monotonically하게 변한다. → 즉 파라미터가 잘 수렴하지 않는다.
LoRA (~25min)
모든 dense layer에 대해서 적용 가능하다. (CV 등등에서 모두 적용 가능하다)
Adapter도 R차원 보다 적은 차원으로 down projection 하는 matrix가 있었고, LoRA도 마찬가지 이다. 그럼 차이점은!?
⇒ 변화를 rank decomposition matrix로 최적화 한다. 따라서 가중치에 대한 업데이트도 intrinsic rank가 낮다. 밑 식이 이를 의미하는 것 같다. (A는 up projection 해주는 matrix, B는 down projection 해주는 matrix
BA로 나누어서 delta_W를 근사한다.
코드리뷰
LoRA 생성
A는 in feature에서 r로 down projection, B는 r에서 out feature로 up projection하게 설계한다.
각 matrix의 initializing은 A는 kaiming uniform, B는 0으로 하였다. (행렬 초기화)
→ 논문에서는 가우시안으로 초기화 했다고 하였다.
뭐.. 합쳐주는 것이기 때문에 inference latency가 발생하지 않는다.
LoRA evaluation
A, B를 거치는 것이 아니라 추가로 합치는 것이기 때문에 inference할 때 추가로 sequential하게 증가하지 않는다.