Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Array operations
- Python 유래
- Numpy data I/O
- 딥러닝
- subplot
- Numpy
- groupby
- dtype
- 최대가능도 추정법
- Comparisons
- Operation function
- 부스트캠프 AI테크
- namedtuple
- 정규분포 MLE
- ndarray
- Python
- 가능도
- scatter
- unstack
- 표집분포
- 카테고리분포 MLE
- boolean & fancy index
- VSCode
- python 문법
- linalg
- BOXPLOT
- seaborn
- pivot table
- Python 특징
- type hints
Archives
- Today
- Total
또르르's 개발 Story
[Stage 1 - 이론] Training & Inference 본문
1️⃣ Loss
1) Custom Loss
- Focal Loss
Class Imbalance 문제(확률 자체가 낮게 측정됨)가 있는 경우,
맞춘 확률이 높은 Class는 조금의 loss를, 맞춘 확률이 낮은 Class는 Loss를 훨씬 높게 부여합니다. - Label Smoothing Loss
Class target label을 Onehot 표현으로 사용하기보다는 ex)[0,1,0,0,0,…]
조금 Soft하게 표현해서 일반화 성능을 높이기 위함 ex)[0.025,0.9,0.025,0.025,…]
2️⃣ Optimizer
Optimizer는 Loss 값을 실제 Weight에 적용해 조정하는 역할을 합니다.
이때, 중요한 것은 Learning rate (학습률)로 얼마나 움직일지를 결정하는 역할을 합니다.

1) StepLR
Learning rate를 특정 step마다 고정적으로 감소시키는 역할을 합니다.

2) CosineAnnealingLR
Cosine 함수 형태처럼 LR(Learning Rate)를 급격히 변경하는 방법입니다.
변화를 다양하게 줌으로써 local minimum에서 벗어날 수 있게 만들어줍니다.

3) ReduceLROnPlateau
더 이상 성능 향상이 없을 때 LR이 감소합니다.
가장 많이 사용합니다.

3️⃣ Metric
Metric은 객관적인 지표를 만들어서 모델의 성능이 어느정도인지를 확인하는 절차입니다.
따라서 데이터 상태에 따라 적절한 Metric을 선택하는 것이 필요합니다.
- Accuracy
Class 별로 밸런스가 적절히 분포 - F1-Score
Class별 밸런스가 좋지 않아서 각 클래스 별로 성능을 잘 낼 수 있는지 확인 필요
4️⃣ Training Process
Training process는 다음 순서로 진행됩니다.
- model.train()
train 모드에서는 Dropout, BathNorm 등에서 조금 다르게 작용됩니다. - optimizer.zero_grad()
batch iteration이 돌아가면서 이전 batch의 grad들이 남아있게 됩니다.
parameter들이 각각의 grad를 가지고 있기 때문에 그 grad 값들을 초기화시켜줍니다.
만약, zero_grad를 하지 않으면 default가 loss를 더해주는 방향으로 가기 때문에 zero_grad를 해주어야 합니다.

- loss = criterion(outputs, labels)
output tensor와 ground truth tensor를 비교해서 차이 값 tensor를 발생시킵니다.
nn.module을 상속받기 때문에 forward 함수를 가질 수 있고, input에서 loss까지 하나의 연결된 chain 형태를 띄게 됩니다. - loss의 grad_fn chain -> loss.backward()
input을 넣고 forward 했을 때 각각 연결되어있는 module의 grad_fn function에 backward 함수가 적용되어있는 것을 볼 수 있습니다. iteration을 수행하면서 tree 구조의 chain이 만들어지는 것을 확인할 수 있습니다.
따라서 loss를 확인하게 되면 grad_fn에서 계속 backward 함수가 추가되면서, 이전 module의 parameter들이 연결되는 것을 알 수 있습니다.
backward()는 loss가 grad_fn을 찾은 후, chain으로 이어져 있는 backward 함수를 계속 찾아나가면서 grad를 업데이트하는 과정을 가지게 됩니다.

- optimizer.step()
이후, backward()로 업데이트된 gradient들을 parameter에 적용시키는 역할은 optimizer가 수행합니다.
optimizer의 step은 정의되어 있는 알고리즘 (adam, momentum, 확률적 gradient 등)에 따라서 값을 update 하게 됩니다.

5️⃣ Gradient Accumulation
각 batch마다 optimizer.step()을 수행하는 것이 아니라 일정한 batch 횟수 후에 optimizer.step()을 수행하는 방법입니다.
loss는 계속 update 하기 때문에 gradient가 accumulation (쌓이게) 됩니다.
여기서 optimizer.zero_grad()는 optimizer.step()을 했을 때만 수행합니다.

6️⃣ Inference Process
Inference process는 다음 순서로 진행됩니다.
- model.eval()
eval 모드에서는 Dropout, BathNorm 등을 사용할 수 있게 만들어줍니다. - with torch.no_grad()
__enter__라는 함수가 수행되면서 set_grad_enabled를 False로 주게 됩니다.
set_grad_enabled의 False로 인해 해당 영역 안에 있는 모든 grad의 사용이 불가합니다.

- Validation 확인
Inference 과정에 Validation dataset 검증을 통해 확인합니다. - Checkpoint
훈련을 진행하면서 loss나 validation accuracy가 좋은 결과물들을 저장합니다.

'[P Stage 1] Image Classification > 이론' 카테고리의 다른 글
[Stage 1 - 이론] Ensemble (0) | 2021.04.02 |
---|---|
[Stage 1 - 이론] Model (0) | 2021.03.31 |
[Stage 1 - 이론] Dataset & DataLoader (0) | 2021.03.30 |
Comments