랭체인 101: 파트 2c. PEFT, LORA, RL로 LLM 미세 조정하기

Contents

위 콘텐츠는 2023년 10월 6일에 편집팀에 의해 마지막으로 업데이트되었습니다.

원래 이 사이트에 게시되었습니다.

이 글을 더 깊이 이해하려면 대규모 언어 모델의 영역을 다룬 앞부분을 참조하는 것이 도움이 될 수 있습니다:

pub.towardsai.net

랭체인과 고급 언어 모델의 개념을 탐구하는 데 관심이 있으시다면, 이러한 주제를 더 자세히 다루는 이 멀티 파트 시리즈의 파트 1을 정독해 보시는 것이 좋습니다.

pub.towardsai.net

저자의 글을 따라가면서 앞으로의 내용을 놓치지 마세요.

머신러닝 및 데이터 과학 영역에서는 예측을 담당하는 수수께끼 같은 존재를 흔히 모델이라고 부릅니다. 다양한 모델이 존재하며, 그 중 하나가 언어 모델입니다. 언어 모델은 꽤 오래 전부터 존재해 왔지만, ChatGPT가 등장하면서 그 중요성이 부각되기 시작했습니다. 이러한 현상의 원인 중 하나는 GPT-1 모델이 비교적 적은 정보 말뭉치를 기반으로 만들어졌다는 사실에 있습니다. GPT의 후속 명칭이 확장됨에 따라 데이터의 양 또한 증가했고, 그 결과 일반적으로 LLM으로 약칭되는 대규모 언어 모델이 등장하게 되었습니다.

전이 학습이라고도 하는 모델 미세 조정은 특정 작업에 대한 기존 모델의 성능을 개선하기 위해 사용되는 기계
학습 기법으로, 해당 작업과 관련된 새로운 데이터
에 대해 추가 학습을 수행하여 성능을 개선합니다.
미세 조정은 일반적으로 사전 학습된
모델이 일반 도메인
(이 경우 자연어)의 가치 있는 표현을 학습하고 더 좁고 구체적인 작업
에서 잘 수행하도록 조정하는 시나리오에서 사용됩니다.

/images/langchain-101-part-2c-fine-tuning-llms-with-peft-lora-and-rl.png /images/langchain-101-part-2c-fine-tuning-llms-with-peft-lora-and-rl.png https://github.com/IvanReznikov/DataVerse/tree/main/Courses/LangChain/Lecture2.%20Models

이러한 모델을 세분화하는 것이 정말 유리할까요?프롬프트 구현으로 충분하지 않을까요? 또한 이 도메인 내에서 대체 접근 방식과 관련된 쿼리가 지속됩니다.

이 가상 시나리오에서 치료를 위해 치과 전문의를 방문하려고 한다고 가정해 보겠습니다. 어떤 의사를 선택하시겠습니까?

저는 치과 분야의 전문가로서 광범위한 지식을 보유하고 있으며 다양한 치과 시술을 능숙하게 수행할 수 있도록 엄격한 교육을 받았습니다. 관련 문헌에 익숙하고 최첨단 기술을 활용하여 환자에게 탁월한 구강 건강 관리 서비스를 제공 할 수 있습니다.

제가 이야기한 청중은 확실히 마지막 옵션을 선택했습니다 ( 파이데이터와 데이터 과학 밋업 )

파라미터 효율적인 미세 조정 기법의 약자인 PEFT는 파라미터 최적화를 통해 기존 언어 모델의 성능을 향상시키는 동시에 모든 모델 파라미터를 완전히 재교육할 필요가 없어 계산 비용을 최소화하는 접근법을 나타냅니다. 따라서 이 방법은 수천억 개 또는 조 단위의 파라미터가 포함된 대규모 언어 모델(LLM)을 다룰 때 매우 실용적이고 경제적인 솔루션으로 자리 잡았습니다.

PEFT는 미세 조정 과정에서 기존 모델의 특정 레이어를 동결하여 지정된 작업에 맞게 특별히 맞춤화된 최종 레이어를 개선하는 데 주로 집중하는 전략을 사용합니다. 이 접근 방식은 대규모 언어 모델 내의 하위 계층은 광범위하고 일반화된 기능을 제공하는 반면, 상위 계층은 작업별 특수성이 증가한다는 통찰력에서 비롯됩니다. 이러한 고전적인 전이 학습 패러다임을 고수함으로써 제한된 데이터 리소스로 새로운 작업을 처리할 때 AI 시스템의 성능을 향상시킬 수 있습니다.

다음 그림과 같이 텍스트 분류 작업을 위해 대규모 언어 모델(LLM)을 개선하기 위해 확률론적 완전 특징 변환(PEFT)을 사용하는 시나리오를 생각해 보십시오:

필연적으로, 이전에 학습된 언어 모델의 초기 레이어를 냉동 보존 또는 기타 적절한 방법을 통해 보존해야 합니다. 그 후, 비교적 적은 레이블 정보 세트를 사용하여 표적 미세 조정 프로세스를 수행함으로써 동결되지 않은 LLM의 나머지 부분을 수정할 수 있습니다. 이러한 반복적인 절차를 통해 LLM의 조정된 구성 요소는 당면한 특정 애플리케이션에 맞게 성능을 최적화하기 위해 세분화될 수 있습니다.궁극적으로 미세 조정 단계가 완료되면 업데이트된 모델은 새로운 데이터 세트에 대해 아무런 어려움 없이 테스트를 수행할 수 있습니다.

로우랭크 적응(LoRa)은 모델의 모든 파라미터를 학습시키지 않고도 대규모 언어 모델(LLM)을 특정 작업이나 도메인에 적용할 수 있는 미세 조정 기법입니다. LoRa는 현재의 트랜스포머 아키텍처를 근본적으로 수정하지 않습니다. LoRa는 사전 학습된 모델 가중치를 동결하고 학습 가능한 순위 분해 행렬을 트랜스포머 아키텍처의 각 레이어에 주입합니다 .

로라는 특정 작업 또는 도메인에 대해 기존 트랜스포머 모델의 가중치를 조정하는 최적화 기법으로, 초기 사전 학습된 가중치와 원하는 미세 조정 가중치 간의 불일치를 낮은 순위의 두 행렬로 분해하여 조정합니다. 모델의 모든 파라미터를 세분화하는 대신 이 두 행렬을 조정합니다. 이렇게 하면 학습 가능한 파라미터의 총 수를 최대 99%까지 줄이면서도 완전한 파라미터 미세 조정을 통해 얻은 결과와 동등한 수준의 결과를 얻을 수 있습니다. 미세 조정 과정에서 LORA는 데이터 과학의 표준 관행에 따라 낮은 순위 임베딩 및 투영 레이어의 가중치 행렬을 변경하여 손실 함수를 줄이는 것을 목표로 합니다.

PEFT(확률적 오류 융합 기법)는 최소한의 계산 리소스로 대규모 언어 모델을 효과적으로 최적화하기 위해 LoRa와 같은 여러 접근 방식을 활용합니다. 이와 달리 LoRa는 다른 방법과 독립적으로 작동하며 모델 튜닝을 포함하지 않습니다.

/images/langchain-101-part-2c-fine-tuning-llms-with-peft-lora-and-rl-1.png /images/langchain-101-part-2c-fine-tuning-llms-with-peft-lora-and-rl-1.png https://github.com/IvanReznikov/DataVerse/tree/main/Courses/LangChain/Lecture2.%20Models

이 접근 방식에는 몇 가지 장점이 있습니다:

낮은 순위 행렬을 사용한 미세 조정은 특히 대형 변압기 모델에 적용할 때 기존의 전체 파라미터 미세 조정에 비해 더 효율적인 접근 방식으로 간주될 수 있습니다. 또한 이 방법은 메모리 사용량이 적고 리소스가 제한된 장치에서도 미세 조정이 가능합니다. 또한 이러한 형태의 미세 조정은 하위 행렬 자체에 특정 패턴이나 제한을 인코딩하여 학습 프로세스를 더욱 효과적으로 제어할 수 있습니다.

강화 학습(RL)은 기본 모델의 두 가지 인스턴스를 활용하여 모델을 세분화하는 대안적인 접근 방식을 제공합니다.이 방법론에서 한 인스턴스는 특정 목표를 수행하도록 설계된 운영 모델 역할을 하고, 두 번째 인스턴스는 참조 모델 역할을 하여 훈련을 통해 기능 모델 개발을 제한하는 로짓(모델의 처리되지 않은 출력)을 생성합니다.

pub.towardsai.net

모델의 중복 인스턴스를 제공하는 것은 특히 GPU 리소스 측면에서 상당한 아키텍처와 관련하여 복잡한 곤경에 처할 수 있습니다. 그럼에도 불구하고 강화 학습 방법론은 예상치 못한 또는 해로운 결과를 생성하는 구조를 생성할 가능성이 있기 때문에 에이전트 모델이 본래의 구성에서 과도하게 벗어나지 않도록 하기 위해서는 이러한 제약 조건이 필수적입니다.

/images/langchain-101-part-2c-fine-tuning-llms-with-peft-lora-and-rl-2.png /images/langchain-101-part-2c-fine-tuning-llms-with-peft-lora-and-rl-2.png https://github.com/IvanReznikov/DataVerse/tree/main/Courses/LangChain/Lecture2.%20Models

이제 미세 조정 과정을 살펴봅시다:

참조 모델은 기존 언어 모델에 내재된 특성을 사용하여 작동을 시작합니다. 그 후 활성 모델은 성능을 향상시키기 위해 강화 학습을 포함하는 반복 프로세스를 시작합니다. 모든 반복에서 활성 모델과 참조 모델 모두와 관련된 확률은 로그 변환(즉, 로그 확률 계산)을 통해 계산됩니다. 그런 다음 활성 모델과 기준 모델 모두에 대해 이러한 로그 확률을 기반으로 손실 함수를 공식화하여 두 모델 간의 차이를 측정하는 지표로 KL(Kullback-Leibler) 지표를 활용합니다. 궁극적으로 활성 모델의 매개변수는 손실 함수에서 파생된 기울기 정보 또는 근접 정책 최적화 기법을 고려하여 조정됩니다.

전체 코드는 GitHub 에서 확인할 수 있습니다.

PEFT 라이브러리를 소개하고 미세 조정을 위한 준비 작업부터 시작합니다.

from peft import prepare_model_for_kbit_trainingpretrained_model.gradient_checkpointing_enable()
model = prepare_model_for_kbit_training(pretrained_model)

LoraConfig 파라미터를 설정하고 get_peft_model 메서드를 사용하여 PeftModel :

하위 행렬의 순위는 원래 사전 학습된 가중치와 원하는 미세 조정된 가중치 간의 불일치를 반영합니다. r 값이 클수록 LORA는 매개변수 간의 더 복잡한 연관성을 발견할 수 있지만 계산 비용이 증가합니다.하이퍼파라미터 lora\_alpha는 다운스트림 작업의 손실 함수와 초기 사전 학습된 가중치 보호를 위한 손실 함수 간의 균형을 결정하며, 값이 클수록 후자에 더 큰 중요도를 부여합니다. target\_modules는 LORA를 사용하여 미세 조정할 모델 내의 모듈 이름 목록으로 구성됩니다. 훈련 중 낮은 순위의 행렬에 적용되는 드롭아웃 비율은 lora\_dropout으로 표시됩니다. 편향의 경우 “없음”,

from peft import LoraConfig, get_peft_modelconfig = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["query_key_value"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)model = get_peft_model(model, config)

이제 트레이너 클래스를 설정할 차례입니다:

제공된 정보는 여러 GPU를 사용한 분산 훈련을 사용하여 머신 러닝 모델을 훈련하기 위한 다양한 하이퍼파라미터에 대해 설명합니다. 여기에는 훈련 데이터 대조, 배치 크기 지정, 학습 속도 일정 제어, 훈련 프로세스의 정밀도 선택, 훈련된 모델을 저장할 간격 정의, 최적화 프로그램 선택 등의 기능이 포함됩니다.

trainer = transformers.Trainer(
model=model,
train_dataset=train_dataset,
# eval_dataset=val_dataset,
args=transformers.TrainingArguments(
num_train_epochs=10,
per_device_train_batch_size=8,
gradient_accumulation_steps=4,
warmup_ratio=0.05,
max_steps=40,
learning_rate=2.5e-4,
fp16=True,
logging_steps=1,
output_dir="outputs",
optim="paged_adamw_8bit",
lr_scheduler_type="cosine",
),
data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),
)

이제 마지막 과제로 남아 있는 교육 프로세스를 시작합니다. 9057185

trainer.train()

이 시점에서 사용할 수 있는 두 가지 옵션이 있습니다. 입력\_ids의 형태로 토큰화된 입력을 제공하여 학습된 모델을 즉시 활용하거나 향후 적용을 위해 모델을 저장하도록 선택할 수 있습니다.

trained_model = (
trainer.model.module if hasattr(trainer.model, "module") else trainer.model
) # Take care of distributed/parallel training# Use model
trained_model.generate(input_ids)# Save model
trained_model.save_pretrained("outputs")

‘(de)‘로 표시된 후속 세그먼트는 전문가 의견을 통합하여 모델의 성능을 개선하는 데 중점을 둡니다.

pub.towardsai.net

pub.towardsai.net

/images/langchain-101-part-2c-fine-tuning-llms-with-peft-lora-and-rl.gif /images/langchain-101-part-2c-fine-tuning-llms-with-peft-lora-and-rl.gif

새로운 콘텐츠를 만들 수 있도록 격려해주시고 업데이트 또는 향후 예정된 내용을 알려주시면 박수를 보내주시고 성원해주시기 바랍니다.

독점 인공 지능 뉴스레터 구독을 선택해 주신 데이터 애호가 커뮤니티에 오신 것을 환영합니다.현재 80,000명 이상의 구독자를 보유하고 있는 이 존경받는 간행물은 최첨단 연구부터 혁신적인 프로젝트 및 개념에 이르기까지 AI 분야의 최신 발전 사항을 독자들에게 제공하고 있으며, AI 기반 스타트업, 새로운 AI 기반 제품 또는 인공 지능과 관련된 서비스 개발에 참여하고 계신다면 귀사가 당사의 권위 있는 뉴스레터의 후원사가 될 수 있도록 진심으로 초대합니다.

이 사이트를 통해 게시