mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 14:40:37 +00:00
102 lines
7.9 KiB
Markdown
102 lines
7.9 KiB
Markdown
|
# 7.2. Fine-Tuning to follow instructions
|
||
|
|
||
|
{% hint style="success" %}
|
||
|
이 섹션의 목표는 **텍스트 생성뿐만 아니라 지침을 따르도록 이미 사전 훈련된 모델을 미세 조정하는 방법**을 보여주는 것입니다. 예를 들어, 챗봇으로서 작업에 응답하는 것입니다.
|
||
|
{% endhint %}
|
||
|
|
||
|
## Dataset
|
||
|
|
||
|
LLM을 지침에 따라 미세 조정하려면 지침과 응답이 포함된 데이터셋이 필요합니다. LLM을 지침에 따라 훈련하는 데는 다양한 형식이 있습니다. 예를 들어:
|
||
|
|
||
|
* Apply Alpaca 프롬프트 스타일 예제:
|
||
|
```csharp
|
||
|
Below is an instruction that describes a task. Write a response that appropriately completes the request.
|
||
|
|
||
|
### Instruction:
|
||
|
Calculate the area of a circle with a radius of 5 units.
|
||
|
|
||
|
### Response:
|
||
|
The area of a circle is calculated using the formula \( A = \pi r^2 \). Plugging in the radius of 5 units:
|
||
|
|
||
|
\( A = \pi (5)^2 = \pi \times 25 = 25\pi \) square units.
|
||
|
```
|
||
|
* Phi-3 프롬프트 스타일 예시:
|
||
|
```vbnet
|
||
|
<|User|>
|
||
|
Can you explain what gravity is in simple terms?
|
||
|
|
||
|
<|Assistant|>
|
||
|
Absolutely! Gravity is a force that pulls objects toward each other.
|
||
|
```
|
||
|
Training a LLM with these kind of data sets instead of just raw text help the LLM understand that he needs to give specific responses to the questions is receives.
|
||
|
|
||
|
따라서 요청과 답변이 포함된 데이터 세트를 사용할 때 가장 먼저 해야 할 일은 해당 데이터를 원하는 프롬프트 형식으로 모델링하는 것입니다. 예를 들어:
|
||
|
```python
|
||
|
# Code from https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/ch07.ipynb
|
||
|
def format_input(entry):
|
||
|
instruction_text = (
|
||
|
f"Below is an instruction that describes a task. "
|
||
|
f"Write a response that appropriately completes the request."
|
||
|
f"\n\n### Instruction:\n{entry['instruction']}"
|
||
|
)
|
||
|
|
||
|
input_text = f"\n\n### Input:\n{entry['input']}" if entry["input"] else ""
|
||
|
|
||
|
return instruction_text + input_text
|
||
|
|
||
|
model_input = format_input(data[50])
|
||
|
|
||
|
desired_response = f"\n\n### Response:\n{data[50]['output']}"
|
||
|
|
||
|
print(model_input + desired_response)
|
||
|
```
|
||
|
그런 다음, 항상처럼 데이터셋을 훈련, 검증 및 테스트 세트로 분리해야 합니다.
|
||
|
|
||
|
## 배치 및 데이터 로더
|
||
|
|
||
|
그런 다음, 훈련을 위해 모든 입력과 예상 출력을 배치해야 합니다. 이를 위해 필요한 것은:
|
||
|
|
||
|
* 텍스트를 토큰화합니다.
|
||
|
* 모든 샘플을 동일한 길이로 패딩합니다(일반적으로 길이는 LLM을 사전 훈련하는 데 사용된 컨텍스트 길이만큼 큽니다).
|
||
|
* 사용자 정의 콜레이트 함수에서 입력을 1만큼 이동시켜 예상 토큰을 생성합니다.
|
||
|
* 훈련 손실에서 제외하기 위해 일부 패딩 토큰을 -100으로 교체합니다: 첫 번째 `endoftext` 토큰 이후에 모든 다른 `endoftext` 토큰을 -100으로 대체합니다(왜냐하면 `cross_entropy(...,ignore_index=-100)`를 사용하면 -100인 타겟을 무시하기 때문입니다).
|
||
|
* \[선택 사항\] LLM이 답변을 생성하는 방법만 배우도록 질문에 속하는 모든 토큰을 -100으로 마스킹합니다. Apply Alpaca 스타일에서는 `### Response:`까지 모든 것을 마스킹하는 것을 의미합니다.
|
||
|
|
||
|
이렇게 생성한 후, 각 데이터셋(훈련, 검증 및 테스트)을 위한 데이터 로더를 생성할 시간입니다.
|
||
|
|
||
|
## 사전 훈련된 LLM 로드 및 미세 조정 및 손실 확인
|
||
|
|
||
|
미세 조정을 위해 사전 훈련된 LLM을 로드해야 합니다. 이는 다른 페이지에서 이미 논의되었습니다. 그런 다음, 이전에 사용된 훈련 함수를 사용하여 LLM을 미세 조정할 수 있습니다.
|
||
|
|
||
|
훈련 중에는 에포크 동안 훈련 손실과 검증 손실이 어떻게 변하는지 확인하여 손실이 줄어들고 있는지, 과적합이 발생하고 있는지를 확인할 수 있습니다.\
|
||
|
과적합은 훈련 손실이 줄어들고 있지만 검증 손실이 줄어들지 않거나 심지어 증가할 때 발생합니다. 이를 피하기 위해 가장 간단한 방법은 이러한 행동이 시작되는 에포크에서 훈련을 중단하는 것입니다.
|
||
|
|
||
|
## 응답 품질
|
||
|
|
||
|
이것은 손실 변화를 더 신뢰할 수 있는 분류 미세 조정이 아니므로, 테스트 세트에서 응답의 품질을 확인하는 것도 중요합니다. 따라서 모든 테스트 세트에서 생성된 응답을 수집하고 **그 품질을 수동으로 확인**하여 잘못된 답변이 있는지 확인하는 것이 좋습니다(LLM이 응답 문장의 형식과 구문을 올바르게 생성할 수 있지만 완전히 잘못된 응답을 제공할 수 있다는 점에 유의하십시오. 손실 변동은 이러한 행동을 반영하지 않습니다).\
|
||
|
생성된 응답과 예상 응답을 **다른 LLM에 전달하여 응답을 평가하도록 요청**하는 방식으로 이 검토를 수행할 수도 있습니다.
|
||
|
|
||
|
응답 품질을 검증하기 위해 실행할 다른 테스트:
|
||
|
|
||
|
1. **대규모 다중 작업 언어 이해 (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU는 인문학, 과학 등 57개 주제에 걸쳐 모델의 지식과 문제 해결 능력을 평가합니다. 다양한 난이도 수준에서 이해도를 평가하기 위해 객관식 질문을 사용합니다.
|
||
|
2. [**LMSYS 챗봇 아레나**](https://arena.lmsys.org): 이 플랫폼은 사용자가 다양한 챗봇의 응답을 나란히 비교할 수 있도록 합니다. 사용자가 프롬프트를 입력하면 여러 챗봇이 응답을 생성하여 직접 비교할 수 있습니다.
|
||
|
3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval은 고급 LLM인 GPT-4가 다양한 프롬프트에 대한 다른 모델의 응답을 평가하는 자동화된 평가 프레임워크입니다.
|
||
|
4. **일반 언어 이해 평가 (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE는 감정 분석, 텍스트 함의, 질문 응답 등을 포함한 아홉 가지 자연어 이해 작업의 모음입니다.
|
||
|
5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** GLUE를 기반으로 하여 SuperGLUE는 현재 모델에 대해 어려운 작업을 포함합니다.
|
||
|
6. **모방 게임 벤치마크 초월 (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench는 추론, 번역 및 질문 응답과 같은 영역에서 모델의 능력을 테스트하는 200개 이상의 작업을 포함하는 대규모 벤치마크입니다.
|
||
|
7. **언어 모델의 전체 평가 (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM은 정확성, 강건성 및 공정성과 같은 다양한 메트릭에 걸쳐 포괄적인 평가를 제공합니다.
|
||
|
8. [**OpenAI Evals**](https://github.com/openai/evals)**:** OpenAI에서 제공하는 오픈 소스 평가 프레임워크로, 사용자 정의 및 표준화된 작업에서 AI 모델을 테스트할 수 있습니다.
|
||
|
9. [**HumanEval**](https://github.com/openai/human-eval)**:** 언어 모델의 코드 생성 능력을 평가하는 데 사용되는 프로그래밍 문제 모음입니다.
|
||
|
10. **스탠포드 질문 응답 데이터셋 (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD는 모델이 정확하게 답변하기 위해 텍스트를 이해해야 하는 위키피디아 기사에 대한 질문으로 구성됩니다.
|
||
|
11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** 방대한 양의 퀴즈 질문과 답변, 증거 문서로 구성된 데이터셋입니다.
|
||
|
|
||
|
그리고 많은 많은 더 있습니다.
|
||
|
|
||
|
## 지침 따르기 미세 조정 코드
|
||
|
|
||
|
이 미세 조정을 수행하기 위한 코드 예제를 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01\_main-chapter-code/gpt\_instruction\_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01\_main-chapter-code/gpt\_instruction\_finetuning.py)에서 찾을 수 있습니다.
|
||
|
|
||
|
## 참고 문헌
|
||
|
|
||
|
* [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|