Model Confidence 만약 음식을 분류하는 이미지 모델이 있다면 softmax를 거쳐 레이블 각각의 확률을 반환하게 된다. 90% 치킨이라고 예측하는 이미지를 모아 두고 정확도를 구한다면, 이상적인 모델은 Accuracy가 0.9로 계산되어야 한다. 하지만 보는 것과 같이 90%로 예측한 8개 데이터 중 5개만 정답이므로 Accuray는 0.625이다. 모델이 예측한 것(0.90)보다 실제 정확도(0.625)는 더 낮기 때문에 over-confidence한 모델이라고 표현할 수 있다. 따라서 모델의 신뢰도와 실제 정확도 간의 차이를 줄여주는 보정(calibration)이 필요하다. Label Smoothing 일반적으로 다중 레이블 분류 문제에서 one-hot 인코딩을 사용한다면, 정답인 인덱스..
데이터 인덱스를 어떤 자료구조로 정렬하냐에 따라 탐색 시간이 달라진다. 일반적으로 많이 사용되는 구조가 B+Tree이다. B+Tree는 아래와 같은 특징을 갖는다. 작은 값은 왼쪽 자식, 크거나 같은 값은 오른쪽 자식에 속한다. Leaf 노드만 데이터 포인터이며, 내부의 노드는 인덱스를 찾기 위한 역할을 한다. 만약 트리 내부에 7이 있더라도 Leaf 노드에 7이 없다면 데이터를 찾을 수 없다. Leaf 노드는 연결 리스트로 연결된 선형 구조를 가진다. 0 → 5 → 6 → 8 → ... 하나의 노드에 저장할 수 있는 최대 인덱스 개수를 fanout이라고 한다. 위 그림은 fanout이 4이다. fanout이 f이고, 데이터가 N개일 때, $\left \lceil log_fN \right \rceil$ ..
EarlyStopping은 특정 평가 지표가 증가·감소하는 현상을 보였을 때, 모델이 over-fitting 되었다고 판단하여 학습을 중단하는 것을 뜻한다. tensorflow나 transformers에서는 자체적으로 EarlyStopping을 지원하지만 Pytorch의 경우 직접 구현한 객체를 사용해야 한다. EarlyStopping 적용 예시 HTML 삽입 미리보기할 수 없는 소스 Pytorch로 구현 import torch import numpy as np class EarlyStopping(object): def __init__(self, patience=2, save_path="model.pth"): self._min_loss = np.inf self._patience = patience sel..
RuntimeError: CUDA out of memory. 메모리 용량이 부족해 발생하는 문제이기 때문에 단순히 batch size를 줄이는 등 공간을 확보해 해결할 수 있다. 또 의도적으로 GC를 실행해 메모리를 확보하거나 cache를 비워줄 수 있다. import gc import torch gc.collect() torch.cuda.empty_cache() 하지만 batch 크기를 줄이게 되면 성능이 떨어지는 문제가 발생할 수 있다. 따라서 큰 batch 크기를 사용해 학습하는 것과 동일한 효과를 내는 방법이 존재한다. Gradient Accumulation 기존의 학습은 하나의 mini-batch를 거친 후 optimizer를 통해 학습을 진행한다. 하지만 gradient accumulation..