삽질/개발,엔지니어링

ChatGPT 파인튜닝 써보기 - 2

maengis 2023. 4. 12. 11:13

기존에 내가 학습 시키려고 사용한 프롬프트는 'A = B'와 같은 것들이었다.

뭔가 잘못 사용하는 게 맞다는 생각이 들어서 ChatGPT에게 직접 문의를 했다.

 

chatgpt 파인튜닝에 대해 알려줘

파인튜닝(Fine-tuning)은 이미 기본적인 지식과 구조를 가지고 있는 사전 훈련된(pre-trained) 모델을 특정 작업이나 도메인에 맞게 맞추기 위한 훈련 과정입니다. ChatGPT의 경우, GPT-4 아키텍처를 기반으로 하며 사전 훈련된 상태에서 시작됩니다.

파인튜닝을 통해 모델은 다음과 같은 이점을 얻을 수 있습니다:

    데이터 효율성: 파인튜닝을 통해 모델은 작은 양의 훈련 데이터로도 빠르게 원하는 작업에 최적화할 수 있습니다.
    작업 수행력 향상: 사전 훈련된 모델에 추가로 훈련 데이터를 제공함으로써, 특정 작업에 대한 성능을 향상시킬 수 있습니다.
    도메인 특화: 도메인 특정 데이터를 사용하여 모델을 파인튜닝하면 해당 도메인에서의 성능을 높일 수 있습니다.

파인튜닝 과정은 다음과 같습니다:

    훈련 데이터 준비: 특정 작업이나 도메인에 맞는 훈련 데이터를 수집하고 전처리합니다. 이 데이터는 대화, 질문-답변 쌍 등 다양한 형태가 될 수 있습니다.
    하이퍼파라미터 설정: 훈련 시 사용할 하이퍼파라미터를 설정합니다. 이는 학습률(learning rate), 배치 크기(batch size), 에폭 수(epochs) 등이 포함됩니다.
    모델 훈련: 사전 훈련된 모델을 특정 작업이나 도메인에 맞추기 위해 준비된 훈련 데이터로 훈련시킵니다.
    모델 평가: 훈련된 모델을 검증 데이터셋(validation dataset)을 사용하여 평가하고, 성능이 만족스러운지 확인합니다. 만족스럽지 않은 경우, 하이퍼파라미터를 조절하거나 훈련 데이터를 개선하여 다시 훈련을 진행할 수 있습니다.

파인튜닝을 통해 ChatGPT는 사용자의 질문에 더 정확하고 유용한 답변을 제공하며, 특정 도메인에서 더 높은 성능을 발휘할 수 있게 됩니다.

 

'2022년 뚜르드프랑스 종합 우승자'가 '요나스 빙가르(Jonas Vingegaard)'라는 걸 파인튜닝 하려면 어떤 프롬프트를 사용하는 게 좋을까?

ChatGPT를 파인튜닝할 때, 이러한 종류의 정보를 모델에 학습시키려면, 관련된 프롬프트와 함께 대화 형식의 훈련 데이터를 제공하는 것이 좋습니다. 이 경우, 질문-답변 쌍을 사용하여 모델에 정보를 전달할 수 있습니다. 여러 가지 프롬프트를 사용해 데이터의 다양성을 높이는 것이 중요합니다.

예시 프롬프트는 다음과 같습니다:

    질문: "2022년 뚜르드프랑스 종합 우승자는 누구인가요?"
    답변: "2022년 뚜르드프랑스 종합 우승자는 요나스 빙가르(Jonas Vingegaard)입니다."

    질문: "뚜르드프랑스 2022년 대회에서 가장 성공한 선수는 누구였나요?"
    답변: "뚜르드프랑스 2022년 대회에서 가장 성공한 선수는 종합 우승자인 요나스 빙가르(Jonas Vingegaard)였습니다."

    질문: "요나스 빙가르가 어떤 자전거 경주에서 우승을 차지했나요?"
    답변: "요나스 빙가르(Jonas Vingegaard)는 2022년 뚜르드프랑스에서 종합 우승을 차지했습니다."

이렇게 다양한 프롬프트를 통해 모델은 '2022년 뚜르드프랑스 종합 우승자'와 '요나스 빙가르(Jonas Vingegaard)' 사이의 연관성을 학습할 수 있습니다. 훈련 데이터의 양과 질을 높이면 더욱 좋은 결과를 얻을 수 있습니다.

오...

그렇구나!

 

# openai tools fine_tunes.prepare_data -f foobar.json
Analyzing...

- Your JSON file appears to be in a JSONL format. Your file will be converted to JSONL format
- Your file contains 3 prompt-completion pairs. In general, we recommend having at least a few hundred examples. We've found that performance tends to linearly increase for every doubling of the number of examples
- All prompts end with suffix `요?`
- All completions end with suffix `니다.`
- The completion should start with a whitespace character (` `). This tends to produce better results due to the tokenization we use. See https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset for more details

Based on the analysis we will perform the following actions:
- [Necessary] Your format `JSON` will be converted to `JSONL`
- [Recommended] Add a whitespace character to the beginning of the completion [Y/n]: Y


Your data will be written to a new JSONL file. Proceed [Y/n]: Y

Wrote modified file to `foobar_prepared.jsonl`
Feel free to take a look!

Now use that file when fine-tuning:
> openai api fine_tunes.create -t "foobar_prepared.jsonl"

After you’ve fine-tuned a model, remember that your prompt has to end with the indicator string `요?` for the model to start generating completions, rather than continuing with the prompt. Make sure to include `stop=["니다."]` so that the generated texts ends at the expected place.
Once your model starts training, it'll approximately take 2.48 minutes to train a `curie` model, and less for `ada` and `babbage`. Queue will approximately take half an hour per job ahead of you.

# openai --api-key {API_KEY} api fine_tunes.create -t foobar_prepared.jsonl -m davinci
Upload progress: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 659/659 [00:00<00:00, 253kit/s]
Uploaded file from foobar_prepared.jsonl: file-dYYkGQfK33hkg2HvPW0aZZ2v
Created fine-tune: ft-BES4sFIL0orHce2jtvVma7De
Streaming events until fine-tuning is complete...

(Ctrl-C will interrupt the stream, but not cancel the fine-tune)
[2023-04-12 10:48:53] Created fine-tune: ft-BES4sFIL0orHce2jtvVma7De
[2023-04-12 10:49:16] Fine-tune costs $0.06
[2023-04-12 10:49:17] Fine-tune enqueued. Queue number: 0
[2023-04-12 10:49:18] Fine-tune started

 

아... 예... ㅎㅎ........ 심지어 2019년도 우승자는 에간 베르날인데, 그리고 알렉산더 카스트란스는 누구...

 

알렉산더 카스트란스가 누구냐고 물어봄.

 

알렉산더 카스트란스가 누구니

알렉산더 카스트란스(Alexander Kristoff)는 노르웨이의 프로 자전거 선수로, 주로 스프린트 스테이지에서 강력한 경쟁력을 발휘합니다. 그는 여러 자전거 경주에서 승리를 거두었으며, 그 중 대표적인 것으로는 2014년 밀라노-산레모, 2015년 투르 오브 라면디, 그리고 2019년 젠토프(London to Yorkshire)가 있습니다. 또한, 그는 2012년 런던 올림픽과 2016년 리우 올림픽에서 각각 도로 경기에서 은메달과 동메달을 획득했습니다. 알렉산더 카스트란스는 투르 드 프랑스에서도 여러 스테이지 우승을 거둔 바 있습니다.

 

알렉산더 크리스토프를 말하는 거였다. 다시 질문

 

알렉산더 크리스토프를 아니

죄송합니다. 알렉산더 크리스토프(Alexander Kristoff)에 대해 설명드리겠습니다.

알렉산더 크리스토프는 노르웨이의 프로 자전거 선수로, 주로 스프린트 스테이지에서 두각을 나타냅니다. 그는 여러 자전거 경주에서 우승을 차지한 바 있으며, 그 중 몇 가지 대표적인 우승 경력은 다음과 같습니다:

    밀라노-산레모(Milan-San Remo) 2014년 우승
    투르 오브 플랜더스(Tour of Flanders) 2015년 우승

또한, 그는 2012년 런던 올림픽과 2016년 리우 올림픽에서 도로 경기에서 각각 은메달과 동메달을 획득했습니다. 알렉산더 크리스토프는 투르 드 프랑스와 브웰타 아 에스파냐(Vuelta a España)에서 여러 스테이지 우승을 거둔 바 있습니다.

 

일단 잘못 답한 건 죄송하다고 하는데, 알렉산더 크리스토프는 2019년에 뚜르드프랑스에서 스테이즈 우승도 못 했다. 2020년에 스테이지1 우승을 해서 마요존느 입긴 했는데... 음;

반응형