-
MoRA: High-Rank Updating for Parameter-Efficient Fine-Tuning 논문 리뷰AI/NLP 2024. 6. 4. 13:15728x90
MoRA: High-Rank Updating for Parameter-Efficient Fine-Tuning 논문 리뷰
Abstract & Introduction
https://asidefine.tistory.com/309
LoRA: Low-Rank Adaptation of Large Language Models 논문 리뷰 (+ Adapter, Prefix Tuning)
LoRA: Low-Rank Adaptation of Large Language Models 논문 리뷰 최근에 나온 MoRA를 읽어보기 전에 LoRA 논문을 올리지 않은 것 같아, 이번 기회에 정리! 사용 방법에 대한 코드도 함께 정리해볼 예정이
asidefine.tistory.com
LoRA - LoRA의 한계점 지적
- Full Fine Tuning에 비해 성능이 떨어진다
- 텍스트 분류, instruction tuning 등의 작업에서는 잘 작동하지만, 수학적 추론, continual learning 등의 복잡한 작업에서는 새로운 지식 학습하는 데에 제한 있음 (Kopiczko et al., 2023; Lialin et al., 2023; Dettmers et al., 2024; Zhu et al., 2024) (Liu et al., 2023).
- 위의 한계점에서 미루어, 본 논문의 가설 설정
- (We propose a hypothesis that low-rank updating is easy to leverage original knowledge and capabilities of LLM to solve task, but it is struggle to handle tasks that require enhancing knowledge and capabilities of LLM.)
- LoRA가 LLM의 원래 지식과 능력을 활용하여 작업을 해결하기는 쉽지만,
- LLM의 지식과 능력을 향상시켜야 하는 작업을 처리하기는 어렵다
- (We propose a hypothesis that low-rank updating is easy to leverage original knowledge and capabilities of LLM to solve task, but it is struggle to handle tasks that require enhancing knowledge and capabilities of LLM.)
Methods
- 위 그림에서 보이는 것과 같이 MoRA는 ΔW의 Rank를 높이는 방법을 사용한다
(왼) LoRA, (오) MoRA 왜 Rank를 높여야 돼?
행렬의 랭크
- 행렬의 랭크(rank)는 행렬에서 서로 독립적인(선형 결합으로 표현할 수 없는) 행이나 열의 최대 개수를 말합니다.
- 행렬의 랭크는 그 행렬이 얼마나 많은 독립적인 정보를 담고 있는지를 나타냅니다.
- 예를 들어, 3×3 행렬이 있다면,
- 이 행렬의 랭크는 최대 3이 될 수 있습니다.
- 랭크가 3이면 이 행렬은 3개의 선형적으로 독립적인 열이나 행을 가지고 있다는 뜻입니다.
- 만약 랭크가 2라면, 이 행렬의 열 또는 행 중 하나는 다른 두 열 또는 행의 선형 결합으로 표현될 수 있습니다.
랭크와 표현력의 관계
- 저랭크 행렬:
- 저랭크 행렬은 적은 수의 독립적인 벡터를 포함합니다.
- 이는 복잡한 데이터를 표현하는 데 한계가 있을 수 있습니다.
- 예를 들어, 저랭크 행렬은 단순한 패턴을 잘 포착할 수 있지만, 복잡한 패턴을 충분히 표현하지 못할 수 있습니다.
- 저랭크 행렬은 적은 수의 독립적인 벡터를 포함합니다.
- 고랭크 행렬:
- 고랭크 행렬은 더 많은 수의 독립적인 벡터를 포함하므로, 더 복잡한 데이터를 더 잘 표현할 수 있습니다.
- 이는 단순한 패턴뿐만 아니라 복잡한 패턴까지 포착할 수 있다는 뜻입니다.
- 고랭크 행렬은 더 많은 수의 독립적인 벡터를 포함하므로, 더 복잡한 데이터를 더 잘 표현할 수 있습니다.
LoRA와 저랭크 행렬
더 높은 랭크를 통한 표현력 향상
Rank 올리는 방법 =>
M의 입력 차원을 줄이고 출력 차원을 늘리기1. 입력 차원을 줄이는 함수 f_comp
2. 출력 차원을 늘리는 함수 f_decomp
3. 정방 행렬 M의 사용
- 선형 독립적인 행렬의 모습을 볼 수 있다
Experiments
- 실험으로는 위에서 언급했던 LoRA가 잘 못하는 Task인, 새로운 지식을 기억하고 학습하는 것들을 위주로 진행
- 추가적으로 high rank updating의 영향력을 확인하기 위해 pretraining도 진행했다
1. Memorizing UUID Pairs- 설정: 학습 속도를 {5e-5, 1e-4, 2e-4} 범위에서 검색하고, Eq. 8에 나오는 압축 및 압축 해제 함수를 사용합니다. M 대신 A와 B 두 행렬을 사용하는 대신, M을 0으로 초기화합니다. 사전 정의된 그룹 g와 g'를 사용하여 인접한 r^ 행 또는 열을 그룹화합니다.
- 결과:
- 훈련 손실: 우리의 방법이 동일한 수의 학습 가능한 매개변수를 사용하면서 LoRA보다 더 나은 성능을 보여줍니다.
- 문자 단위 정확도: 우리의 방법이 LoRA보다 적은 훈련 단계에서 더 많은 UUID 쌍을 기억합니다.
2. Fine-tuning Tasks
- 우리의 방법(MoRA)은 instruction Tuning과 수학적 추론에서 LoRA와 유사한 성능을 보였습니다.
- 지속적 사전 학습에서는 높은 랭크 업데이트로 인해 생물의학 및 금융 분야에서 더 나은 성능을 보였습니다.
- 다른 LoRA 변형들은 유사한 성능을 보였으나, AsyLoRA는 지시 튜닝에서 최고 성능을, 수학적 추론에서는 낮은 성능을 보였습니다.
- ReLoRA는 랭크가 256인 경우 성능이 저하되었습니다.
3. Pretraining
- 설정: 250M 및 1.3B 모델 크기에서 LLaMA 기반 모델을 훈련.
- 하이퍼파라미터: 10k 스텝, 배치 크기 1024, 시퀀스 길이 512.
- 비교: LoRA, ReLoRA와 비교.
- 방법: Eq. 6에 명시된 압축 및 압축 해제 함수 사용.
- 결과:
- 우리의 방법은 동일한 학습 가능한 매개변수를 사용하면서 LoRA와 ReLoRA보다 더 나은 성능을 보였습니다.
Code
https://github.com/kongds/MoRA/blob/main/peft-mora/src/peft/tuners/lora/layer.py
if use_mora: new_r = int(math.sqrt((self.in_features + self.out_features)*r)+0.5) if mora_type == 6: # type 6 require new_r to be even for RoPE new_r = new_r//2*2 self.lora_A[adapter_name] = nn.Linear(new_r, new_r, bias=False) self.r[adapter_name] = new_r nn.init.zeros_(self.lora_A[adapter_name].weight) self.lora_B[adapter_name] = self.lora_A[adapter_name] self.use_mora[adapter_name] = True self.scaling[adapter_name] = 1.0 else: # Actual trainable parameters self.lora_A[adapter_name] = nn.Linear(self.in_features, r, bias=False) self.lora_B[adapter_name] = nn.Linear(r, self.out_features, bias=False) if use_rslora: self.scaling[adapter_name] = lora_alpha / math.sqrt(r) else: self.scaling[adapter_name] = lora_alpha / r if init_lora_weights == "loftq": self.loftq_init(adapter_name) elif init_lora_weights: self.reset_lora_parameters(adapter_name, init_lora_weights) # check weight and qweight (for GPTQ) for weight_name in ("weight", "qweight"): weight = getattr(self.get_base_layer(), weight_name, None) if weight is not None: # the layer is already completely initialized, this is an update if weight.dtype.is_floating_point or weight.dtype.is_complex: self.to(weight.device, dtype=weight.dtype) else: self.to(weight.device) break
https://arxiv.org/abs/2405.12130
MoRA: High-Rank Updating for Parameter-Efficient Fine-Tuning
Low-rank adaptation is a popular parameter-efficient fine-tuning method for large language models. In this paper, we analyze the impact of low-rank updating, as implemented in LoRA. Our findings suggest that the low-rank updating mechanism may limit the ab
arxiv.org
https://github.com/kongds/MoRA
GitHub - kongds/MoRA: MoRA: High-Rank Updating for Parameter-Efficient Fine-Tuning
MoRA: High-Rank Updating for Parameter-Efficient Fine-Tuning - kongds/MoRA
github.com
728x90'AI > NLP' 카테고리의 다른 글
- LoRA의 한계점 지적