Skip to content

Commit 1964953

Browse files
Youngdong2harheem
andauthored
Apply suggestions from code review
Co-authored-by: Harheem Kim <[email protected]>
1 parent 2a782fe commit 1964953

File tree

1 file changed

+12
-12
lines changed
  • chapters/ko/chapter3

1 file changed

+12
-12
lines changed

chapters/ko/chapter3/3.mdx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,15 @@ trainer = Trainer(
9595
trainer.train()
9696
```
9797

98-
이렇게 하면 미세 조정이 시작됩니다(GPU에서는 몇 분 정도 걸릴 거예요). 500단계마다 훈련 손실이 보고되지만, 모델의 성능이 얼마나 좋은지(또는 나쁜지)는 알려주지 않을 겁니다. 그 이유는 다음과 같습니다:
98+
이렇게 하면 미세 조정이 시작됩니다(GPU에서는 몇 분 정도 소요됩니다). 500단계마다 훈련 손실이 출력되지만, 모델의 성능이 얼마나 좋은지(또는 나쁜지)는 알려주지 않습니다. 그 이유는 다음과 같습니다.
9999

100-
1. `TrainingArguments`에서 `eval_strategy``"steps"` (매 `eval_steps`마다 평가) 또는 `"epoch"` (각 에포크 종료 시 평가)로 설정하여 훈련 중에 평가하도록 `Trainer`에 알리지 않았습니다.
101-
2. 해당 평가 중에 메트릭을 계산하기 위한 `compute_metrics()` 함수를 `Trainer`에 제공하지 않았습니다 (그렇지 않으면 평가에서 손실만 출력되는데, 이는 직관적이지 않은 숫자입니다).
100+
1. `TrainingArguments`에서 `eval_strategy``"steps"` (매 `eval_steps`마다 평가) 또는 `"epoch"` (각 에포크 종료 시 평가)로 설정하지 않았습니다.
101+
2. 평가 중에 메트릭을 계산하기 위한 `compute_metrics()` 함수를 `Trainer`에 제공하지 않았습니다. 이 함수가 없으면 평가에서 손실 값만 출력되는데, 이 값만으로는 성능을 파악하기 어렵습니다.
102102

103103

104104
### 평가[[evaluation]]
105105

106-
유용한 `compute_metrics()` 함수를 어떻게 만들고 다음 훈련 시 사용할 수 있는지 알아봅시다. 이 함수는 `EvalPrediction` 객체(`predictions` 필드와 `label_ids` 필드가 있는 명명된 튜플)를 인수로 받아야 하며 문자열을 부동 소수점 값에 매핑하는 딕셔너리(문자열은 반환되는 메트릭의 이름이고, 부동 소수점 값은 해당 값)를 반환합니다. 모델에서 예측값을 얻으려면 `Trainer.predict()`를 사용할 수 있습니다:
106+
이제 유용한 `compute_metrics()` 함수를 어떻게 만들고 다음 훈련 시 사용할 수 있는지 알아보겠습니다. 이 함수는 `EvalPrediction` 객체(`predictions` 필드와 `label_ids` 필드를 갖는 명명된 튜플)를 입력받습니다. 그리고 각 메트릭의 이름을 키(문자열)로, 성능을 값(부동소수점)으로 갖는 딕셔너리를 반환해야 합니다. 모델의 예측값을 얻기 위해 `Trainer.predict()`를 사용할 수 있습니다.
107107

108108
```py
109109
predictions = trainer.predict(tokenized_datasets["validation"])
@@ -114,17 +114,17 @@ print(predictions.predictions.shape, predictions.label_ids.shape)
114114
(408, 2) (408,)
115115
```
116116

117-
`predict()` 메서드의 출력은 `predictions`, `label_ids`, `metrics` 세 개의 필드가 있는 또 다른 명명된 튜플입니다. `metrics` 필드에는 전달된 데이터셋에 대한 손실 값과 몇 가지 시간 관련 메트릭(예측에 총 소요된 시간평균 시간)만 포함됩니다. 하지만 `compute_metrics()` 함수를 완성하여 `Trainer`에 전달하면, 이 필드에 `compute_metrics()`가 반환하는 지표들도 함께 포함될 거예요.
117+
`predict()` 메소드의 출력은 `predictions`, `label_ids`, `metrics` 세 개의 필드가 있는 또 다른 명명된 튜플입니다. `metrics` 필드에는 전달된 데이터셋에 대한 손실 값과 시간 관련 메트릭(총 예측 시간, 평균 예측 시간)만 포함됩니다. 하지만 `compute_metrics()` 함수를 완성하여 `Trainer`에 전달하면, 이 필드에 `compute_metrics()`가 반환하는 메트릭들도 함께 포함됩니다.
118118

119-
보시다시피, `predictions`는 408 x 2 모양의 2차원 배열입니다 (408은 predict()에 전달한 데이터셋의 요소 수입니다). 이 값들은 `predict()`에 전달한 데이터셋의 각 요소에 대한 로짓입니다 ([이전 챕터](/course/chapter2)에서 보았듯이 모든 Transformer 모델은 로짓을 반환합니다). 이 로짓을 우리가 가진 레이블과 비교할 수 있는 예측값으로 변환하려면, 두 번째 축에서 최댓값을 가진 인덱스를 취해야 합니다:
119+
보시다시피, `predictions`는 408 x 2 모양의 2차원 배열입니다 (408은 predict()에 전달한 데이터셋의 샘플 개수입니다). 이 값들은 `predict()`에 전달한 데이터셋의 각 샘플에 대한 로짓입니다 ([이전 챕터](/course/chapter2)에서 보았듯이 모든 Transformer 모델은 로짓을 반환합니다). 이 로짓을 우리가 가진 레이블과 비교할 수 있는 예측값으로 변환하려면, 두 번째 축에서 최댓값을 가진 인덱스를 구해야 합니다.
120120

121121
```py
122122
import numpy as np
123123

124124
preds = np.argmax(predictions.predictions, axis=-1)
125125
```
126126

127-
이제 이 `preds`를 라벨과 비교할 수 있습니다. `compute_metric()` 함수를 빌드하기 위해 🤗 [Evaluate](https://github.com/huggingface/evaluate/) 라이브러리의 메트릭을 활용하겠습니다. MRPC 데이터셋과 관련된 메트릭을 불러오는 건 데이터셋을 불러왔던 것만큼이나 쉽습니다. 이번에는 `evaluate.load()` 함수를 사용하면 됩니다. 이렇게 반환된 객체에는 메트릭 계산을 수행할 수 있는 `compute()` 메서드가 있습니다:
127+
이제 이 `preds`를 라벨과 비교할 수 있습니다. `compute_metric()` 함수를 빌드하기 위해 🤗 [Evaluate](https://github.com/huggingface/evaluate/) 라이브러리의 메트릭을 활용하겠습니다. 데이터셋을 로드했던 것처럼, MRPC 데이터셋과 관련된 메트릭도 `evaluate.load()` 함수로 쉽게 로드할 수 있습니다. 반환된 객체의 `compute()` 메서드를 사용해 메트릭을 계산할 수 있습니다.
128128

129129
```py
130130
import evaluate
@@ -143,9 +143,9 @@ metric.compute(predictions=preds, references=predictions.label_ids)
143143

144144
</Tip>
145145

146-
모델 헤드의 무작위 초기화 때문에 얻게 되는 정확한 결과는 달라질 수 있습니다. 여기서는 우리 모델이 검증 세트에서 85.78%의 정확도와 89.97%의 F1 점수를 달성했음을 볼 수 있습니다. 이 두 가지는 GLUE 벤치마크의 MRPC 데이터셋에서 결과를 평가하는 데 사용되는 메트릭입니다. [BERT 논문](https://arxiv.org/pdf/1810.04805.pdf)의 표에는 기본 모델에 대해 F1 점수가 88.9로 보고되었습니다. 당시에는 `uncased` 모델을 사용했지만, 우리는 현재 `cased` 모델을 사용하고 있기 때문에 더 나은 결과가 나온 것입니다.
146+
모델 헤드의 가중치가 무작위로 초기화되기 때문에 얻게 되는 결과는 조금씩 다를 수 있습니다. 결과를 보면 우리 모델이 검증 세트에서 85.78%의 정확도와 89.97%의 F1 점수를 달성했음을 볼 수 있습니다. 이 두 가지는 GLUE 벤치마크의 MRPC 데이터셋에서 결과를 평가하는 데 사용되는 메트릭입니다. [BERT 논문](https://arxiv.org/pdf/1810.04805.pdf)에서는 기본 모델의 F1 점수를 88.9로 보고하였습니다. 당시에는 `uncased` 모델을 사용했지만, 우리는 현재 `cased` 모델을 사용하고 있기 때문에 더 나은 결과가 나온 것입니다.
147147

148-
이 모든 것을 종합하면, 다음처럼 `compute_metrics()` 함수를 얻을 수 있습니다:
148+
이 모든 것을 종합하면, 다음처럼 `compute_metrics()` 함수를 다음과 같이 정의할 수 있습니다.
149149

150150
```py
151151
def compute_metrics(eval_preds):
@@ -155,7 +155,7 @@ def compute_metrics(eval_preds):
155155
return metric.compute(predictions=predictions, references=labels)
156156
```
157157

158-
각 에폭이 끝날 때마다 메트릭을 보고하기 위해 `compute_metrics()` 함수가 실제로 어떻게 사용되는지 보려면, 다음과 같이 새 `Trainer`정의하면 됩니다:
158+
각 에폭이 끝날 때마다 메트릭이 출력되도록, `compute_metrics()` 함수가 포함하여 `Trainer`새로 정의해 보겠습니다.
159159

160160
```py
161161
training_args = TrainingArguments("test-trainer", eval_strategy="epoch")
@@ -172,13 +172,13 @@ trainer = Trainer(
172172
)
173173
```
174174

175-
참고로, 우리는 `eval_strategy``"epoch"`으로 설정한 새로운 `TrainingArguments`와 새로운 모델을 생성합니다. 이렇게 하지 않으면 이미 훈련된 모델의 훈련을 계속하게 될 겁니다. 새로운 훈련을 시작하려면 다음을 실행하세요:
175+
참고로, 우리는 `eval_strategy``"epoch"`으로 설정한 새로운 `TrainingArguments`와 새로운 모델을 생성합니다. 이렇게 하지 않으면 이미 훈련된 모델의 훈련을 계속하게 될 겁니다. 새로운 훈련을 시작하려면 다음을 실행하세요.
176176

177177
```py
178178
trainer.train()
179179
```
180180

181-
이번에는 훈련 손실 외에도 각 에폭이 끝날 때마다 검증 손실과 메트릭을 보고할 겁니다. 모델 헤드의 무작위 초기화 때문에 여러분이 얻는 정확도/F1 점수는 우리가 얻은 결과와 약간 다를 수 있지만, 비슷한 범위에 있을 거예요.
181+
이번에는 훈련 손실 외에도 각 에폭이 끝날 때마다 검증 손실과 메트릭이 함께 출력될 겁니다. 앞서 말했듯이 모델 헤드의 무작위 초기화 때문에 여러분이 얻는 정확도/F1 점수는 우리가 얻은 결과와 약간 다를 수 있지만, 비슷한 범위에 있을 겁니다.
182182

183183
### 고급 훈련 기능[[advanced-training-features]]
184184

0 commit comments

Comments
 (0)