File size: 6,376 Bytes
ab2bbca
 
 
 
 
 
 
 
126c7fc
 
 
 
 
ab2bbca
 
 
 
 
126c7fc
 
ab2bbca
 
126c7fc
 
 
 
 
 
 
 
 
 
 
 
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
 
ab2bbca
126c7fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
ab2bbca
126c7fc
d61995c
126c7fc
 
ab2bbca
126c7fc
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
---
library_name: transformers
tags: []
---
## Model Details

### Model Description
<!-- Provide a longer summary of what this model is. -->
- **Developed by:** κ°•μŠΉκ³€, μœ ν˜μ§„, 이도건
- **Model type:** Casual Language Model
- **Language(s) (NLP):** Korean
- **License:** -
- **Finetuned from model [optional]:** rtzr/ko-gemma-2-9b-it

### Model Sources [optional]

<!-- Provide the basic links for the model. -->

- **Repository:** https://github.com/5KLetsGo/saju_naming
- **Demo [optional]:** -

## Training Details
### **LoRA μ„€μ •**
```python
lora_config = LoraConfig(
    lora_alpha = 8,
    lora_dropout = 0.1,
    r=16,
    target_modules=["k_proj", "o_proj", "v_proj", "q_proj", "gate_proj", "up_proj", "down_proj"],
    bias="none",
    task_type="CAUSAL_LM",
)
```
lora_alpha = 8: lora_alphaλŠ” LoRA의 ν•™μŠ΅ 속도λ₯Ό μ‘°μ ˆν•˜λŠ” ν•˜μ΄νΌνŒŒλΌλ―Έν„°μž…λ‹ˆλ‹€. 큰 κ°’μΌμˆ˜λ‘ ν•™μŠ΅ 속도가 λŠλ €μ§€λ©°, μž‘μ€ 값은 더 λΉ λ₯΄κ²Œ ν•™μŠ΅λ©λ‹ˆλ‹€. 보톡 이 값은 LoRA의 μ—…λ°μ΄νŠΈ 강도λ₯Ό μ‘°μ ˆν•˜λŠ” μŠ€μΌ€μΌλ§ νŒ©ν„°λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

lora_dropout = 0.1: λ“œλ‘­μ•„μ›ƒ ν™•λ₯ μ„ μ˜λ―Έν•©λ‹ˆλ‹€. λ“œλ‘­μ•„μ›ƒμ€ ν•™μŠ΅ 쀑 일뢀 λ‰΄λŸ°μ„ μž„μ‹œλ‘œ μ œκ±°ν•¨μœΌλ‘œμ¨ λͺ¨λΈμ˜ μΌλ°˜ν™” λŠ₯λ ₯을 ν–₯μƒμ‹œν‚€λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 0.1은 10%의 λ‰΄λŸ°μ„ λ“œλ‘­μ•„μ›ƒ ν•˜κ² λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

r = 16: r은 LoRAμ—μ„œ μ‚¬μš©λ˜λŠ” 저차원 ν–‰λ ¬μ˜ 랭크(rank)λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 이 값은 λͺ¨λΈμ— μΆ”κ°€λ˜λŠ” 저차원 ν–‰λ ¬μ˜ 크기λ₯Ό κ²°μ •ν•˜λ©°, μ„±λŠ₯κ³Ό λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ— 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€. 일반적으둜 μž‘μ€ κ°’μΌμˆ˜λ‘ λ©”λͺ¨λ¦¬ νš¨μœ¨μ μž…λ‹ˆλ‹€.

target_modules=["k_proj", "o_proj", "v_proj", "q_proj", "gate_proj", "up_proj", "down_proj"]: LoRAκ°€ 적용될 λͺ¨λ“ˆ λ¦¬μŠ€νŠΈμž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ "k_proj", "o_proj", "v_proj", "q_proj" 등은 트랜슀포머 λͺ¨λΈμ˜ λ‹€μ–‘ν•œ 투영(projection) λ ˆμ΄μ–΄λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 각각 ν‚€(key), κ°’(value), 쿼리(query) λ“± 주둜 μ–΄ν…μ…˜ λ©”μ»€λ‹ˆμ¦˜μ— μ‚¬μš©λ˜λŠ” λ ˆμ΄μ–΄λ“€μž…λ‹ˆλ‹€.

bias = "none": 편ν–₯(bias)을 μΆ”κ°€ν• μ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” "none"으둜 μ„€μ •λ˜μ–΄ μžˆμ–΄ 편ν–₯이 μ μš©λ˜μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

task_type = "CAUSAL_LM": LoRAκ°€ μ μš©λ˜λŠ” μž‘μ—… μœ ν˜•μ„ μ •μ˜ν•©λ‹ˆλ‹€. "CAUSAL_LM"은 인과적 μ–Έμ–΄ λͺ¨λΈ(Causal Language Modeling)을 μ˜λ―Έν•©λ‹ˆλ‹€. μ΄λŠ” GPT처럼 λ‹€μŒ 단어λ₯Ό μ˜ˆμΈ‘ν•˜λŠ” λ°©μ‹μ˜ μ–Έμ–΄ λͺ¨λΈμ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.
rtzr/ko-gemma-2-9b-it Β· Hugging Face

### **λͺ¨λΈ μ„€μ •**
```python
trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    formatting_func=generate_prompt,
    max_seq_length=512,
    args=TrainingArguments(
        output_dir="./output",
        num_train_epochs = 1,
        max_steps=3000,
        per_device_train_batch_size=1,
        gradient_accumulation_steps=4,
        optim="paged_adamw_8bit",
        warmup_steps=1,
        learning_rate=2e-4,
        fp16=True,
        logging_steps=100,
        push_to_hub=False,
        report_to='none',
    ),
    peft_config=lora_config
)
```
model=model: ν•™μŠ΅ν•  사전 ν›ˆλ ¨λœ λͺ¨λΈμ„ μ§€μ •ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ model은 이전에 μ •μ˜λœ λͺ¨λΈ 객체λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

train_dataset=dataset: ν•™μŠ΅μ— μ‚¬μš©ν•  데이터셋을 μ§€μ •ν•©λ‹ˆλ‹€. 이 데이터셋(dataset)μ—λŠ” 미리 μ€€λΉ„λœ ν•™μŠ΅μš© 데이터가 ν¬ν•¨λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

formatting_func=generate_prompt: ν•™μŠ΅ λ°μ΄ν„°μ…‹μ—μ„œ 각 μƒ˜ν”Œμ„ μ–΄λ–»κ²Œ ν¬λ§·νŒ…ν• μ§€λ₯Ό μ •μ˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ generate_promptλΌλŠ” ν•¨μˆ˜κ°€ 각 데이터 μƒ˜ν”Œμ„ μ μ ˆν•œ ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ λͺ¨λΈ μž…λ ₯으둜 μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

max_seq_length=512: 각 μž…λ ₯ μƒ˜ν”Œμ˜ μ΅œλŒ€ μ‹œν€€μŠ€ 길이λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” μ΅œλŒ€ 512개의 ν† ν°μœΌλ‘œ μ‹œν€€μŠ€ 길이λ₯Ό μ œν•œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 즉, ν•˜λ‚˜μ˜ μž…λ ₯이 512개 μ΄μƒμ˜ ν† ν°μœΌλ‘œ 이루어진 경우 잘리게 λ©λ‹ˆλ‹€.

num_train_epochs=1: 전체 데이터셋을 λͺ‡ 번 λ°˜λ³΅ν•˜μ—¬ ν•™μŠ΅ν• μ§€λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

max_steps=3000: 총 ν•™μŠ΅ μŠ€ν… 수λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

per_device_train_batch_size=1: ν•œ λ²ˆμ— 각 λ””λ°”μ΄μŠ€(GPU λ˜λŠ” CPU)μ—μ„œ ν•™μŠ΅ν•  배치 크기λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

gradient_accumulation_steps=4: κ·ΈλΌλ””μ–ΈνŠΈλ₯Ό μΆ•μ ν•˜λŠ” μŠ€ν… 수λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. 배치 크기가 μž‘μ„ λ•Œ μœ μš©ν•˜λ©°, 4번의 λ°°μΉ˜μ— λŒ€ν•΄ κ·ΈλΌλ””μ–ΈνŠΈλ₯Ό μΆ•μ ν•œ ν›„, μ—…λ°μ΄νŠΈκ°€ 이루어지도둝 μ„€μ •λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ€„μ΄λ©΄μ„œλ„ 효과적인 ν•™μŠ΅μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

optim="paged_adamw_8bit": μ΅œμ ν™” μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ paged_adamw_8bitλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ΄λŠ” 8λΉ„νŠΈ AdamW μ΅œμ ν™” μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ, λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ€„μ—¬μ£Όλ©΄μ„œλ„ 효율적인 ν•™μŠ΅μ„ κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.

warmup_steps=1: ν•™μŠ΅ μ΄ˆκΈ°μ— μ›Œλ°μ—… μŠ€ν…μ„ 1둜 μ„€μ •ν•˜μ—¬ ν•™μŠ΅ 초기 λ‹¨κ³„μ—μ„œ ν•™μŠ΅ 속도λ₯Ό 천천히 μ¦κ°€μ‹œν‚€λŠ” κΈ°λ²•μž…λ‹ˆλ‹€.

learning_rate=2e-4: ν•™μŠ΅λ₯ μ„ μ„€μ •ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 2e-4둜 맀우 μž‘μ€ 값을 μ‚¬μš©ν•˜μ—¬ μ•ˆμ •μ μΈ ν•™μŠ΅μ΄ μ§„ν–‰λ˜λ„λ‘ ν•©λ‹ˆλ‹€.

fp16=True: ν˜Όν•© 정밀도 ν•™μŠ΅μ„ μ‚¬μš©ν•˜κ² λ‹€λŠ” μ„€μ •μž…λ‹ˆλ‹€. FP16 (16-bit 뢀동 μ†Œμˆ˜μ )을 μ‚¬μš©ν•˜μ—¬ ν•™μŠ΅ 속도λ₯Ό 높이고, GPU λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

logging_steps=100: 100 μŠ€ν…λ§ˆλ‹€ ν•™μŠ΅ 둜그λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

push_to_hub=False: λͺ¨λΈμ„ Hugging Face ν—ˆλΈŒλ‘œ μ—…λ‘œλ“œν•˜μ§€ μ•Šκ² λ‹€λŠ” μ„€μ •μž…λ‹ˆλ‹€.

report_to='none': ν•™μŠ΅ 쀑에 보고할 νˆ΄μ„ μ„€μ •ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 아무 보고 νˆ΄λ„ μ‚¬μš©ν•˜μ§€ μ•Šκ² λ‹€λŠ” 의미둜 'none'으둜 μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

peft_config=lora_config: LoRA(저차원 ν•™μŠ΅) 섀정을 μ μš©ν•©λ‹ˆλ‹€. lora_configλŠ” 이전에 μ •μ˜λœ LoraConfig 객체둜, LoRAλ₯Ό μ΄μš©ν•˜μ—¬ λ©”λͺ¨λ¦¬ 효율적인 ν•™μŠ΅μ„ μˆ˜ν–‰ν•˜λ„λ‘ μ„€μ •ν•©λ‹ˆλ‹€.

## 데이터
- 2008 ~ 2024년도 λŒ€ν•œλ―Όκ΅­ 신생아 이름 톡계 [λŒ€ν•œλ―Όκ΅­ 법원 > μ „μžκ°€μ‘±κ΄€κ³„μ‹œμŠ€ν…œ](https://efamily.scourt.go.kr)
- λŒ€ν•œλ―Όκ΅­ 인λͺ…μš© ν•œμž 사전 [λŒ€ν•œλ―Όκ΅­ 법원](http://help.scourt.go.kr)
- 1950-01 ~ 2024-08 μŒμ–‘λ ₯ [곡곡데이터포털 ν•œκ΅­μ²œλ¬Έμ—°κ΅¬μ›](https://www.data.go.kr/data/15012679/openapi.do)

## Reference
[μ‚¬μ£ΌνŒ”μž](https://ko.wikipedia.org/wiki/%EC%82%AC%EC%A3%BC%ED%8C%94%EC%9E%90)