Week 7-8 ํ์ต ์ ๋ฆฌ
์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ์ดํด์ ์ ์ฒ๋ฆฌ, ๋ถ๋ฅ ๊ธฐ๋ฒ
AI์ ์ปดํจํฐ ๋น์ ๋ถ์ผ์์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ ํต์ฌ ์์์
๋๋ค.
์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ ๋จ์ํ ํฝ์
๋ค์ ์งํฉ์ผ ๋ฟ๋ง ์๋๋ผ, ํด์๋, ์ฑ๋, ์๊ณต๊ฐ ๋ฑ ๋ค์ํ ํน์ฑ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ชจ๋ธ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋ํ, ์ด๋ฏธ์ง ๋ถ๋ฅ๋ ๋ฐ์ดํฐ์ ๋ค์ํ ํน์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ์ํ๋ ์ ์์ต๋๋ค. ์ด๋ฒ ํฌ์คํ
์์๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ๊ธฐ๋ณธ ์ฑ๋ถ, ์ ์ฒ๋ฆฌ ๊ธฐ๋ฒ, ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ๋ถ๋ฅ ๊ธฐ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
1. ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ๊ธฐ๋ณธ ์ฑ๋ถ
ํด์๋ (Resolution)
- ์ ์:
์ด๋ฏธ์ง์ ๊ฐ๋กร์ธ๋ก ํฝ์ ์ (์: 1920ร1080).
ํด์๋๊ฐ ๋์์๋ก ์ด๋ฏธ์ง์ ์ธ๋ถ ์ ๋ณด๊ฐ ๋ง์ง๋ง, ๊ทธ๋งํผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๋ ์ฆ๊ฐํฉ๋๋ค.
ํฝ์ (Pixel)
- ์ ์:
์ด๋ฏธ์ง์ ๊ฐ์ฅ ์์ ๋จ์์ด๋ฉฐ, ๊ฐ ํฝ์ ์ ์์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
์ฑ๋ (Channel)
- ์ ์:
๊ฐ ํฝ์ ์ด ๊ฐ์ง๋ ์์ ์ฑ๋ถ์ ์๋ก, ์ผ๋ฐ์ ์ผ๋ก RGB ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ 3์ฑ๋ (Red, Green, Blue)์ ์ฌ์ฉํฉ๋๋ค.
๊ฒฝ์ฐ์ ๋ฐ๋ผ ๊ทธ๋ ์ด์ค์ผ์ผ, RGBA ๋ฑ ๋ค๋ฅธ ์ฑ๋ ๊ตฌ์ฑ์ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค.
์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
- ์ด์:
์ผ๋ฐ์ ์ผ๋ก ์ด๋ฏธ์ง๋ uint8 (1 byte) ํ์์ผ๋ก ์ ์ฅ๋์ง๋ง, ์ ์ฒ๋ฆฌ ๊ณผ์ ์์ tensorํํ๊ณ normalizeํ ๋ float32 (4 byte)๋ก ๋ณํ๋๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด 4๋ฐฐ๋ก ์ฆ๊ฐํฉ๋๋ค.
2. ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ์ EDA (Exploratory Data Analysis)
EDA (ํ์์ ๋ฐ์ดํฐ ๋ถ์)
์ด๋ฏธ์ง๋ฅผ ๋ถ์ํ ๋ ๋ค์ ์ฌํญ๋ค์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
- ๊ธฐ๋ณธ ์ ๋ณด:
์ฐจ์, ์ฑ๋, ์ด๋ฏธ์ง ํฌ๊ธฐ, ํ์ผ ํฌ๋งท ๋ฑ - ํด๋์ค ๋ถํฌ:
์ง๋ ํ์ต์ ๊ฒฝ์ฐ, ๋ผ๋ฒจ ๋ถํฌ ๋ฐ ๋ถ๊ท ํ ์ฌ๋ถ - ์ํ ํ์ธ:
์ด๋ฏธ์ง ํ๋ํ๋๋ฅผ ํ์ธํ์ฌ ์ธ์ฌ์ดํธ ๋์ถ - ์ค๋ณต ์ด๋ฏธ์ง ์ ๊ฑฐ:
ํด์ ํจ์๋ฅผ ํ์ฉํ์ฌ ์ค๋ณต๋ ์ด๋ฏธ์ง๋ฅผ ์ฝ๊ฒ ์ ๊ฑฐ
์ ์ฒ๋ฆฌ๋ฅผ ํตํด ์ด๋ฏธ์ง์ ์๋ฏธ ์๋ feature์ representation์ ์ถ์ถํ๋ฉด, ๋ชจ๋ธ์ ์ฑ๋ฅ๊ณผ ์ผ๋ฐํ ๋ฅ๋ ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
3. Color Space ๋ณํ
์๊ณต๊ฐ(color space)์ ์์ ๋์งํธ์ ์ผ๋ก ํํํ๋ ์ํ์ ๋ชจ๋ธ์
๋๋ค.
์ผ๋ฐ์ ์ธ ์๋ก๋ RGB, HSV, Lab, YCbCr, Grayscale ๋ฑ์ด ์์ต๋๋ค.
OpenCV๋ฅผ ์ด์ฉํ ๋ณํ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
import cv2
# ์๋ณธ BGR ์ด๋ฏธ์ง ๋ก๋
img = cv2.imread('image.jpg')
# BGR -> HSV
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# BGR -> LAB
img_lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
# BGR -> YCrCb
img_ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
# BGR -> Grayscale
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
๋ํ, ํ์คํ ๊ทธ๋จ ํํํ(histogram equalization) ๋ฅผ ํตํด ์ด๋ฏธ์ง์ contrast๋ฅผ ๊ฐ์ ํ๊ณ ๋ํ ์ผ์ ๋ถ๊ฐ์ํฌ ์ ์์ต๋๋ค.
4. Geometric Transform & Data Augmentation
Geometric Transform
์ด๋ฏธ์ง์ ํํ๋ ํฌ๊ธฐ, ์์น ๋ฑ์ ๋ณํํ๋ ๊ธฐ๋ฒ์ ๋๋ค.
- Translation (์ด๋):
์ด๋ฏธ์ง ๋ด ๊ฐ์ฒด์ ์์น๋ฅผ ์ด๋์ํต๋๋ค. - Rotation (ํ์ ):
์ด๋ฏธ์ง๋ฅผ ์ผ์ ๊ฐ๋๋ก ํ์ ์ํต๋๋ค. - Scaling (ํฌ๊ธฐ ์กฐ์ ):
์ด๋ฏธ์ง๋ฅผ ํ๋ ๋๋ ์ถ์ํฉ๋๋ค. - Perspective Transformation (์๊ทผ ๋ณํ):
ํน์ ์์ญ์ ํ๋ํ ์ด๋ฏธ์ง๋ก ๋ณํํ๋ ๋ฑ, ์์ ๋ณํ๋ฅผ ๋ฐ์ํฉ๋๋ค.
์์ (ํ์ ):
import cv2
import numpy as np
row, col = img.shape[:2]
# ์ค์ฌ์ ๊ธฐ์ค์ผ๋ก 90๋ ํ์
matrix = cv2.getRotationMatrix2D((col/2, row/2), 90, 1)
new_img = cv2.warpAffine(img, matrix, (col, row))
Data Augmentation
๋ฐ์ดํฐ์ ๋ค์์ฑ์ ๋์ฌ ๋ชจ๋ธ์ ๊ฒฌ๊ณ ์ฑ๊ณผ ์ผ๋ฐํ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํ ๊ธฐ๋ฒ์ ๋๋ค.
- ์ผ๋ฐ ๊ธฐ๋ฒ:
Flip, rotation, crop, color jittering ๋ฑ - Advanced ๊ธฐ๋ฒ:
AutoAugment, RandAugment ๋ฑ ๋ฐ์ดํฐ์ ์ ๋ง์ถฐ ์ต์ ์ ์ ์ฑ ์ ์๋ ํ์ํ๋ ๋ฐฉ๋ฒ - ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ:
Albumentations์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฝ๊ฒ ๋ค์ํ augmentation์ ์ ์ฉํ ์ ์์ต๋๋ค.
์์ (Albumentations):
import albumentations as A
transform = A.Compose([
A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.2),
A.RandomCrop(height=224, width=224)
])
5. Normalization & Batch Normalization
Normalization
์ด๋ฏธ์ง์ ํฝ์ ๊ฐ์ ์ผ์ ๋ฒ์๋ก ์ค์ผ์ผ๋งํ๋ ๊ธฐ๋ฒ์ผ๋ก, ๋ชจ๋ธ ํ์ต์ ์๋ ด ์๋์ ์์ ์ฑ์ ๊ฐ์ ํฉ๋๋ค.
- Min-Max Normalization:
ํฝ์ ๊ฐ์ [0, 1] ๋ฒ์๋ก ์ค์ผ์ผ๋ง - Z-score Normalization (Standardization):
ํ๊ท ์ ๋นผ๊ณ ํ์คํธ์ฐจ๋ก ๋๋๋๋ค.
์์ (PyTorch):
from torchvision import transforms
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
Batch Normalization
๋ฏธ๋ ๋ฐฐ์น ๋จ์๋ก ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทํํ์ฌ internal covariate shift๋ฅผ ์ค์ด๊ณ , ๋์ ํ์ต๋ฅ ๊ณผ ์์ ์ฑ์ ์ ๊ณตํฉ๋๋ค.
6. ์ด๋ฏธ์ง ๋ถ๋ฅ
์ด๋ฏธ์ง ๋ถ๋ฅ๋ ์ฃผ์ด์ง ์ด๋ฏธ์ง๋ฅผ ์ฌ์ ์ ์ ์๋ ํด๋์ค์ ํ ๋นํ๋ ์์
์
๋๋ค.
๋ถ๋ฅ ๋ฌธ์ ๋ ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ๋๋ฉ๋๋ค.
6-1. Binary Classification
- ์ค๋ช
:
๋ฐ์ดํฐ๋ฅผ ๋ ๊ฐ์ ํด๋์ค ์ค ํ๋๋ก ๋ถ๋ฅํฉ๋๋ค. - ์:
Yes/No, True/False ๋ฑ - ์ถ๋ ฅ:
Sigmoid function์ ํตํด ์ด์ง ๊ฒฐ๊ณผ ๋ฐํ
6-2. Multi-Class Classification
- ์ค๋ช
:
๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ํด๋์ค ์ค ํ๋๋ก ๋ถ๋ฅํฉ๋๋ค. - ์ถ๋ ฅ:
Softmax function์ ํตํด ๊ฐ ํด๋์ค๋ณ ํ๋ฅ ๋ถํฌ ๋ฐํ
6-3. Multi-Label Classification
- ์ค๋ช
:
ํ๋์ ์ด๋ฏธ์ง๊ฐ ๋์์ ์ฌ๋ฌ ํด๋์ค์ ์ํ ์ ์๋ ๋ฌธ์ ์ ๋๋ค. - ์ถ๋ ฅ:
๊ฐ ํด๋์ค๋ง๋ค sigmoid function์ ์ ์ฉํ์ฌ ๋ ๋ฆฝ์ ์ธ ์ด์ง ๋ถ๋ฅ ์ํ
6-4. Coarse-Grained vs. Fine-Grained Classification
- Coarse-Grained Classification:
์์ดํ ๋ฒ์ฃผ ๊ฐ์ ๋ถ๋ฅ (์: ์ธ๋ผ์ธ ์ค์ผ์ดํธ vs ์ ์ด vs ๊ด๋์ฐจ vs ์ฌ๊ณผ) - Fine-Grained Classification:
๋์ผ ์์ ๋ฒ์ฃผ ๋ด์์ ์ธ๋ถ์ ์ธ ํ์ ๋ฒ์ฃผ ๋ถ๋ฅ (์: ์ ๋น, ์ฐธ์, ๊น๋ง๊ท ๋ฑ)
6-5. N-Shot Classification
- Few-Shot Classification:
๊ฐ ํด๋์ค๋น ๋ช ๊ฐ์ ๋ฐ์ดํฐ๋ง์ผ๋ก ํ์ตํ๋ ๊ฒฝ์ฐ - One-Shot Classification:
๊ฐ ํด๋์ค๋น ๋จ ํ๋์ ์์๋ง ํ์ต - Zero-Shot Classification:
ํ์ต ์์ด, ์ฌ์ ์ง์์ ๋ฐํ์ผ๋ก ์์ธก
๊ฒฐ๋ก
์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ ํด์๋, ํฝ์ , ์ฑ๋, ์๊ณต๊ฐ ๋ฑ ๋ค์ํ ์ฑ๋ถ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ ์ฒ๋ฆฌ ๊ณผ์ ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๊ณผ ๊ณ์ฐ ํจ์จ์ฑ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
- ์ ์ฒ๋ฆฌ:
์๊ณต๊ฐ ๋ณํ, geometric transform, augmentation, normalization ๋ฑ ๋ค์ํ ๊ธฐ๋ฒ์ ํตํด ์ด๋ฏธ์ง์์ ์๋ฏธ ์๋ ์ ๋ณด๋ฅผ ์ถ์ถํ๊ณ , ๋ชจ๋ธ ํ์ต์ ์ ํฉํ ํํ๋ก ๊ฐ๊ณตํด์ผ ํฉ๋๋ค. - ๋ถ๋ฅ ๊ธฐ๋ฒ:
์ด๋ฏธ์ง ๋ถ๋ฅ๋ ์ด์ง, ๋ค์ค, ๋ฉํฐ๋ผ๋ฒจ, ์ธ๋ฐํ ๋ถ๋ฅ ๋ฑ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ, ํ์ต ๋ฐ์ดํฐ์ ์๊ณผ ํ์ง์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ์ข์ฐ๋ฉ๋๋ค. - EDA:
์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ๊ธฐ๋ณธ ์ ๋ณด์ ๋ถํฌ, ํด๋์ค ๋ถ๊ท ํ ๋ฑ์ ๋ถ์ํ์ฌ, ์ค๋ณต ์ ๊ฑฐ ๋ฐ ์ถ๊ฐ ์ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
Inductive Bias์ Representation: ๋ชจ๋ธ์ ์ ์ ๊ฒฌ์ด ๋ง๋๋ ๋ฐ์ดํฐ ํํ
๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋จ์ํ ์๊ธฐํ์ง ์๊ณ , ์ผ๋ฐํ๋ ํจํด์ ํ์ตํ๊ธฐ ์ํด ํน์ ๊ฐ์ ์ ๋ดํฌํฉ๋๋ค. ์ด๋ฅผ inductive bias(๊ท๋ฉ์ ํธํฅ) ๋ผ๊ณ ํ๋ฉฐ, ์ด bias๊ฐ ๋ชจ๋ธ์ด ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ํด์ํ๊ณ ํํํ๋์ง ๊ฒฐ์ ํ๋ ํต์ฌ ์์์ ๋๋ค.
1. Inductive Bias๋?
Inductive bias๋ ๋ชจ๋ธ์ด ํ์ตํ ๋ ๋ฐ์ดํฐ์์ ํน์ ํจํด์ด๋ ๊ด๊ณ๋ฅผ ์ฐพ์ผ๋ ค๋ ๊ฒฝํฅ, ํน์ ๋ฐ์ดํฐ๋ฅผ ํน์ ๋ฐฉ์์ผ๋ก ํด์ํ๋ ค๋ ๊ฐ์ ์ ์๋ฏธํฉ๋๋ค.
์๋ฅผ ๋ค์ด:
- ์ ํ ํ๊ท ๋ชจ๋ธ์ ๋ฐ์ดํฐ ๊ฐ์ ์ง์ ํํ์ ๊ด๊ณ๊ฐ ์กด์ฌํ๋ค๋ ๊ฐ์ ์ ๋ดํฌํฉ๋๋ค.
- Decision Tree๋ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ธต์ ์ธ ์์ฌ๊ฒฐ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๋ถ๋ฅํ๋ ค๊ณ ํฉ๋๋ค.
๋ง์ฝ ๋ชจ๋ธ์ inductive bias๊ฐ ์๋ค๋ฉด, ๋ชจ๋ธ์ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์๊ธฐ(overfitting)ํ๊ฒ ๋์ด ์๋ก์ด ๋ฐ์ดํฐ์ ๋ํด ์ผ๋ฐํ ๋ฅ๋ ฅ์ด ํฌ๊ฒ ๋จ์ด์ง๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ bias๋ฅผ ์ดํดํ๋ฉด, ๋ฌธ์ ์ ํน์ฑ์ ๋ง๋ ๋ชจ๋ธ์ ์ ํํ๊ณ ์ค๊ณํ ์ ์์ต๋๋ค.
2. Representation (ํํ)์ด๋?
Representation์ ๋ชจ๋ธ ๋ด๋ถ์์ ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๋ณํ๋๊ณ ๋ค๋ค์ง๋์ง๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์ด๋ฏธ์ง:
์๋ ํฝ์ ๊ฐ(0~255)์ ๋ชจ๋ธ์ด ๋ฐ๋ก ์ดํดํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์, Convolutional Neural Network(CNN)๋ ์ด๋ฅผ feature map์ผ๋ก ๋ณํํด ์ค์ํ ํจํด๊ณผ ๊ตฌ์กฐ๋ฅผ ํ์ตํฉ๋๋ค. - ํ
์คํธ:
์ธ๊ฐ์ ํ ์คํธ๋ฅผ ๋ฐ๋ก ์ดํดํ์ง๋ง, ๋ชจ๋ธ์ ๋จ์ด ์์ฒด๊ฐ ์๋ ๋ฒกํฐ๋ก ๋ณํํด ๋จ์ด๋ค ์ฌ์ด์ ๊ด๊ณ๋ฅผ ํ์ตํฉ๋๋ค. - ์๊ณ์ด ๋ฐ์ดํฐ:
RNN์ด๋ LSTM๊ณผ ๊ฐ์ ๋ชจ๋ธ์ ์๊ฐ์ ํ๋ฆ์ ๋ฐ์ํ representation์ ์์ฑํ์ฌ ์ฃผ์ ์ฐจํธ ๋ฑ์์ ํจํด์ ํฌ์ฐฉํฉ๋๋ค.
๋ฅ๋ฌ๋์์๋ feature engineering ์์ด๋ ๋ชจ๋ธ์ด ์๋์ผ๋ก representation์ ํ์ตํ์ง๋ง, ์ด representation์ ๋ชจ๋ธ์ inductive bias์ ํฌ๊ฒ ์ํฅ์ ๋ฐ์ต๋๋ค.
3. Representation์ Inductive Bias์ ์ฐ๋ฌผ์ด๋ค
๊ฒฐ๊ตญ, ๋ชจ๋ธ์ด ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ํํํ๋์ง๋ ๊ทธ ๋ชจ๋ธ์ด ๊ฐ์ง๋ inductive bias์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
- ๋ชจ๋ธ์ ๊ตฌ์กฐ์ ๊ฐ์ :
๊ฐ ๋ชจ๋ธ์ ํน์ ํ ๊ตฌ์กฐ์ ๊ฐ์ (์: CNN์ ์ง์ญ์ ํจํด, RNN์ ์์ฐจ์ ๊ด๊ณ)์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ์ ์ด ๋ฐ์ดํฐ๋ก๋ถํฐ ์ด๋ค feature๋ฅผ ์ถ์ถํ ์ง, ๊ทธ๋ฆฌ๊ณ ์ด feature๋ค์ด ์ด๋ป๊ฒ ํํ๋ ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. - ์๋ ํ์ต vs. ์๋ feature engineering:
์ ํต์ ์ธ ๋จธ์ ๋ฌ๋์์๋ ์ฌ๋์ด ์ง์ feature engineering์ ์ํํ์ง๋ง, ๋ฅ๋ฌ๋์์๋ ๋ชจ๋ธ์ด ์ค์ค๋ก representation์ ํ์ตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ํ ๋ชจ๋ธ์ ๊ตฌ์กฐ์ ์ค๊ณ, ์ฆ inductive bias์ ๋ฐ๋ผ ์ข์ฐ๋ฉ๋๋ค.
๋ฐ๋ผ์, representation์ ๊ฒฐ๊ตญ ๋ชจ๋ธ์ inductive bias์ ์ฐ๋ฌผ์ ๋๋ค. ์ด ๋ง์, ๋ชจ๋ธ์ด ๋ฐ์ดํฐ์์ ์ด๋ค ํจํด์ ํ์ตํ ์ง, ๊ทธ๋ฆฌ๊ณ ํ์ตํ ํจํด์ ์ด๋ค ๋ฐฉ์์ผ๋ก ํํํ ์ง๋ ๋ชจ๋ธ์ด ๋ดํฌํ๊ณ ์๋ ์ ์ ๊ฒฌ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค๋ ์๋ฏธ์ ๋๋ค.
CNN, ViT, ๊ทธ๋ฆฌ๊ณ Hybrid ๋ชจ๋ธ: Computer Vision์ ์๋ก์ด ํจ๋ฌ๋ค์
์ปดํจํฐ ๋น์ ๋ถ์ผ์์๋ ์ค๋ ๊ธฐ๊ฐ ๋์ Convolutional Neural Network (CNN)์ด ํ์ค ๋ชจ๋ธ๋ก ์๋ฆฌ ์ก์์์ต๋๋ค. ์ต๊ทผ์๋ Transformer ๊ธฐ๋ฐ์ Vision Transformer (ViT)๊ฐ ์ฃผ๋ชฉ๋ฐ์ผ๋ฉฐ, CNN์ ํ๊ณ๋ฅผ ๋ณด์ํ๋ Hybrid ๋ชจ๋ธ๋ค๋ ํ๋ฐํ๊ฒ ์ฐ๊ตฌ๋๊ณ ์์ต๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ ๊ฐ ๋ชจ๋ธ์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ํน์ง, ๊ทธ๋ฆฌ๊ณ ์๋ก์ ์ฅ์ ์ ๊ฒฐํฉํ Hybrid ๋ชจ๋ธ์ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. Convolutional Neural Network (CNN)
- ์ฃผ์ ํน์ง:
- Grid ํํ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ์ด๋ฏธ์ง์ฒ๋ผ 2์ฐจ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ ํฉ
- ๊ตฌ์ฑ ์์:
- Convolutional layer: ๊ตญ์์ ์ธ ํจํด ์ถ์ถ
- Pooling layer: ๊ณต๊ฐ์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ํน์ง์ ์์ฝ
- Fully Connected layer: ์ต์ข ๋ถ๋ฅ๋ฅผ ์ํ ํตํฉ
- ๊ณ์ธต์ ํํ ํ์ต:
- ์ ์์ค๋ถํฐ ๊ณ ์์ค๊น์ง ์ ์ง์ ์ผ๋ก ์๋ฏธ ์๋ feature๋ฅผ ํ์ต
CNN์ ์ค๋ ์ฐ๊ตฌ ๊ธฐ๊ฐ ๋์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ์์ ๊ฐ๋ ฅํ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ์์ผ๋ฉฐ, ์ง์ญ์ ํจํด์ ํจ๊ณผ์ ์ผ๋ก ํ์ตํ๋ ๋ฅ๋ ฅ์ด ๋ฐ์ด๋ฉ๋๋ค.
2. ConvNeXt
ConvNeXt๋ ๊ธฐ์กด CNN์ ๊ฐ์ ์ ์ ์งํ๋ฉด์ ์ต์ ๋ฅ๋ฌ๋ ๊ธฐ๋ฒ์ ๋์
ํ ๋ชจ๋ธ์
๋๋ค.
- ํต์ฌ ๊ธฐ์ :
- Depthwise Convolution: ํจ์จ์ ์ธ convolution ์ฐ์ฐ์ ์ํด depthwise์ pointwise convolution์ผ๋ก ๋ถ๋ฆฌ
- Layer Normalization: ์์ ์ ์ธ ํ์ต ๋ฐ Transformer ์คํ์ผ ํ์ต ๊ธฐ๋ฒ ๋์
- 7ร7 Kernel: ๋ ๋์ ๋ฒ์์์ ํน์ง์ ์ถ์ถํ์ฌ ViT์ patch์ ์ ์ฌํ ์ญํ
- GELU Activation, Inverted Bottleneck: ํ๋ผ๋ฏธํฐ ํจ์จ์ฑ์ ๊ทน๋ํํ๊ณ ์ฐ์ฐ๋์ ์ค์ฌ ์ฑ๋ฅ ์ต์ ํ
- ์ฑ๋ฅ:
- ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์์๋ ViT๊ฐ ์ฐ์ํ ์ฑ๋ฅ์ ๋ณด์ด์ง๋ง, ์์ ๋ฐ์ดํฐ์ ์์๋ ConvNeXt๊ฐ ๋ ์ ๋ฆฌํ ์ ์์
- ๊ตฌ์กฐ๊ฐ ๋จ์ํ๊ณ ์ฐ์ฐ ํจ์จ์ฑ์ด ๋์ ์ค์๊ฐ ์ดํ๋ฆฌ์ผ์ด์ ์๋ ์ ํฉ
3. Vision Transformer (ViT)
ViT๋ Transformer ๋ชจ๋ธ์ Computer Vision์ ์ ์ฉํ ๋ํ์ ์ธ ๋ชจ๋ธ์
๋๋ค.
- ์ฃผ์ ๊ตฌ์ฑ ์์:
- Patch Embedding: ์ด๋ฏธ์ง๋ฅผ ์์ ํจ์น๋ก ๋ถํ ํ ํ, ์ ํ ํฌ์์ ํตํด embedding ๋ฒกํฐ๋ก ๋ณํ
- Position Embedding: ํจ์น์ ์์ ์ ๋ณด๋ฅผ ํ์ต ๊ฐ๋ฅํ ์์น ์๋ฒ ๋ฉ์ผ๋ก ์ถ๊ฐ
- Encoder: Self-Attention๊ณผ Feed-Forward layer๊ฐ ์์ฌ, ํจ์น ๊ฐ์ ์ฅ๊ฑฐ๋ฆฌ ์์กด์ฑ์ ํ์ต
- Classification Head: Global Average Pooling ๋ฐ ์ ํ layer๋ฅผ ํตํด ์ต์ข ํด๋์ค ํ๋ฅ ์์ธก
- ํน์ง:
- ์ ์ญ์ ๊ด๊ณ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ชจ๋ธ๋งํ ์ ์์ด ์ฅ๊ฑฐ๋ฆฌ ์์กด์ฑ์ ๊ฐํจ
- ์ ๋ ฅ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๊ฐ ๊ฐ๋ณ์ ์ด๋ผ๋ ์ฅ์ ์ด ์์ผ๋, ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ ๋ฐ์ดํฐ ํจ์จ์ฑ์ด ๋ฎ์ ๋จ์ ์ด ์์
4. CNN vs. ViT ๋น๊ต
ํญ๋ชฉ | CNN | ViT |
---|---|---|
Local Pattern ํ์ต | ๊ฐ์ (convolution ๊ธฐ๋ฐ) | ์๋์ ์ผ๋ก ์ฝํจ |
๊ณ์ฐ ํจ์จ์ฑ | ๋์ ํจ์จ์ฑ | ์ฐ์ฐ ๋น์ฉ์ด ๋์ |
๊ฐ๋ณ ํฌ๊ธฐ ์ ๋ ฅ | ๊ณ ์ ํฌ๊ธฐ ํ์ | ๊ฐ๋ณ ์ ๋ ฅ ์ง์ |
์ฅ๊ฑฐ๋ฆฌ ์์กด์ฑ | ํ๊ณ ์กด์ฌ | ํจ๊ณผ์ (Self-Attention) |
๋ฐ์ดํฐ ํจ์จ์ฑ | ์๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ๋ฆฌ | ๋๊ท๋ชจ ๋ฐ์ดํฐ ํ์ |
5. Hybrid ๋ชจ๋ธ: CNN๊ณผ ViT์ ์ฅ์ ์ ๊ฒฐํฉ
Hybrid ๋ชจ๋ธ์ CNN๊ณผ ViT์ ์ฅ์ ์ ๋ชจ๋ ํ์ฉํ์ฌ, ์๋ก์ ๋จ์ ์ ๋ณด์ํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฐ๋ฉ๋๋ค. ๋ํ์ ์ธ ์๊ฐ CoAtNet์ ๋๋ค.
CoAtNet
- ์ค๊ณ:
- s-stage ๊ตฌ์กฐ: C-C-T-T (Convolutional - Convolutional - Transformer - Transformer)๋ก ๊ตฌ์ฑํ์ฌ, ์ด๊ธฐ ๋จ๊ณ์์๋ CNN์, ํ๋ฐ ๋จ๊ณ์์๋ Transformer๋ฅผ ์ฌ์ฉ
- ์ ์ง์ ํด์๋ ๊ฐ์์ ์ฑ๋ ์ฆ๊ฐ: ์ด๋ฏธ์ง์ ๋ค์ํ scale ์ ๋ณด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌ
- ์ฅ์ :
- ์๋์ ๋ฐ์ดํฐ๋ก๋ ์ข์ generalization
- ๋น ๋ฅธ ์๋ ด ๋ฐ ํจ์จ์ ์ธ ํ์ต
- ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์์ ์ฐ์ํ scalability
- ViT๋ณด๋ค ์ ์ ์ฌ์ ํ์ต ๋ฐ์ดํฐ์ ๊ณ์ฐ๋ ํ์
๊ทธ ์ธ์๋ ConViT, CvT, LocalViT ๋ฑ ๋ค์ํ hybrid ๋ชจ๋ธ๋ค์ด ๊ฐ๋ฐ๋๊ณ ์์ต๋๋ค.
๊ฒฐ๋ก
- CNN: ์ง์ญ์ ํจํด ํ์ต๊ณผ ๋์ ๊ณ์ฐ ํจ์จ์ฑ์์ ๊ฐ์ ์ ๋ณด์ด๋ฉฐ, ์ ํต์ ์ธ ์ปดํจํฐ ๋น์ ๋ฌธ์ ์์ ์ค๋ ๊ธฐ๊ฐ ํ์ค ๋ชจ๋ธ๋ก ์๋ฆฌ์ก์์ต๋๋ค.
- ViT: Transformer ๊ธฐ๋ฐ์ ์ ์ญ์ ๊ด๊ณ ํ์ต์ ํตํด ์ฅ๊ฑฐ๋ฆฌ ์์กด์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง, ๊ณ์ฐ ๋น์ฉ๊ณผ ๋ฐ์ดํฐ ์๊ตฌ๋์ด ๋์ต๋๋ค.
- Hybrid ๋ชจ๋ธ (์: CoAtNet): CNN๊ณผ ViT์ ์ฅ์ ์ ๊ฒฐํฉํ์ฌ, ์ ์ ๋ฐ์ดํฐ์ ๊ณ์ฐ๋์ผ๋ก๋ ๋์ ์ฑ๋ฅ์ ๋ฐํํ๋ฉฐ, ๋ ๋ชจ๋ธ์ ๋จ์ ์ ํจ๊ณผ์ ์ผ๋ก ๋ณด์ํฉ๋๋ค.
Transfer Learning, Self-Supervised Learning, Multimodal Learning, ๊ทธ๋ฆฌ๊ณ Foundation Models
์ต๊ทผ AI ๋ถ์ผ์์๋ ๋ชจ๋ธ์ ์ฑ๋ฅ ํฅ์์ ์ํด ๋จ์ํ ๋ชจ๋ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ, ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ๊ณ , ๋ค์ํ ์ ๋ณด๋ฅผ ๊ฒฐํฉํ๋๋๊ฐ ์ค์ํ ํ๋๋ก ๋ ์ฌ๋์ต๋๋ค. ํนํ, Transfer Learning, Self-Supervised Learning, Multimodal Learning, ๊ทธ๋ฆฌ๊ณ Foundation Model์ AI ๊ฐ๋ฐ์ ์๋ก์ด ํจ๋ฌ๋ค์์ผ๋ก ์ฃผ๋ชฉ๋ฐ๊ณ ์์ต๋๋ค. ์ด ํฌ์คํธ์์๋ ๊ฐ๊ฐ์ ๊ฐ๋ ๊ณผ ์ฅ์ ์ ์ดํด๋ณด๊ณ , ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ป๊ฒ ํ์ฉ๋๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
1. Transfer Learning (์ ์ด ํ์ต)
Transfer Learning์ ํ ๋๋ฉ์ธ ๋๋ ํ์คํฌ์์ ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ๋ค๋ฅธ ๋๋ฉ์ธ์ ์ ์ฉํ๋ ํ์ต ๋ฐฉ๋ฒ์
๋๋ค.
์๋ฅผ ๋ค์ด, ImageNet์์ ํ๋ จ๋ ๋ชจ๋ธ์ ์๋ฃ ์์์ด๋ ์์ฑ ์ฌ์ง๊ณผ ๊ฐ์ด ์ ํ ๋ค๋ฅธ ๋๋ฉ์ธ์ ์ ์ฉํ ์ ์์ต๋๋ค.
์ฃผ์ ํน์ง
- ์ ์ ๋ฐ์ดํฐ๋ก๋ ๋น ๋ฅธ ํ์ต ๋ฐ ์ฑ๋ฅ ํฅ์:
์ด๋ฏธ ํ์ต๋ ์ผ๋ฐ์ ์ธ feature๋ค์ ํ์ฉํ๊ธฐ ๋๋ฌธ์, target task์์ ํ์ํ ๋ฐ์ดํฐ ์์ด ์ ์ด๋ ๋น ๋ฅธ ์๋ ด๊ณผ ์ข์ ์ฑ๋ฅ์ ์ป์ ์ ์์ต๋๋ค. - ํ์ต ๋ฐฉ์:
- ๊ฐ์ค์น ๊ณ ์ ํ ํ์ต: Source task์์ ํ์ตํ ๋ชจ๋ธ์ ๊ฐ์ค์น๋ฅผ ๊ณ ์ ํ๊ณ , classifier ๋ฑ ์ผ๋ถ ๊ณ์ธต๋ง ํ์ต
- ์ ์ฒด ๋ชจ๋ธ fine-tuning: ๋ชจ๋ ๊ฐ์ค์น๋ฅผ ์ ๋ฐ์ดํธํ์ฌ target task์ ๋ง๊ฒ ์กฐ์
- ์ผ๋ถ Layer๋ง ๊ณ ์ : ํ์ ๋ ์ด์ด(์ผ๋ฐ feature ์ถ์ถ)๋ ๊ณ ์ ํ๊ณ , ์์ ๋ ์ด์ด(ํ์คํฌ ํนํ)๋ ํ์ต
์ฃผ์์ฌํญ
- Fine-Grained Task:
๋งค์ฐ ์ธ๋ฐํ ํ์คํฌ์ ๊ฒฝ์ฐ, Transfer Learning๋ณด๋ค ์ถฉ๋ถํ target ๋ฐ์ดํฐ ํ๋ณด๊ฐ ๋์ฑ ํฐ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
2. Self-Supervised Learning
Self-Supervised Learning์ ๋ชจ๋ธ์ด ๋ฐ์ดํฐ ์์ฒด๋ก๋ถํฐ ๋ผ๋ฒจ์ ์์ฑํ๊ณ , ๊ทธ ๋ผ๋ฒจ์ ๋ฐํ์ผ๋ก ํ์ตํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
์๋์ผ๋ก ๋ผ๋ฒจ๋งํ๋ ๊ณผ์ ์ด ์๊ฐ๊ณผ ๋น์ฉ์ ๋ง์ด ๋ค๊ฒ ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ผ๋ฉฐ, ๋ ์ผ๋ฐํ๋ representation์ ํ์ตํ ์ ์์ต๋๋ค.
Pretext ์์ ์์
- Colorization:
ํ๋ฐฑ ์ด๋ฏธ์ง๋ฅผ ์ปฌ๋ฌ ์ด๋ฏธ์ง๋ก ๋ณต์ํ๋ ์์ - Inpainting:
์ด๋ฏธ์ง์ ๋น ์์ญ์ ์ฑ์ ๋ฃ๋ ์์ - Jigsaw Puzzle Solving:
์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋ ํ, ์ฌ๋ฐ๋ฅธ ์์๋ก ์ฌ๊ตฌ์ฑํ๋ ์์ - Rotation Prediction:
ํ์ ์ํจ ์ด๋ฏธ์ง์ ํ์ ๊ฐ๋๋ฅผ ์์ธกํ๋ ์์ - Contrastive Learning:
๊ฐ์ ์ด๋ฏธ์ง์ ๋ค์ํ augmentation ๋ฒ์ ์ positive pair๋ก, ๋ค๋ฅธ ์ด๋ฏธ์ง๋ค์ negative pair๋ก ๊ฐ์ฃผํ์ฌ ํ์ต
์ด๋ฌํ pretext ์์ ์ ํตํด ํ์ต๋ representation์ ์ดํ Transfer Learning์ ์ฌ์ ํ์ต ๋จ๊ณ๋ก ํ์ฉ๋์ด, ๋ค์ํ downstream ํ์คํฌ์์ ์ฑ๋ฅ์ ๋์ผ ์ ์์ต๋๋ค.
3. Multimodal Learning
Multimodal Learning์ ํ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ํ modality (์: vision, audio, text ๋ฑ)๋ก ํํํ์ฌ ์ป์ ์ ๋ณด๋ฅผ ๊ฒฐํฉํด ํ์ตํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ฃผ์ ํ์ฉ ์์
- Vision-Language Models:
์๋ฅผ ๋ค์ด, CLIP, ALIGN, FLAVA ๋ฑ์ ์ด๋ฏธ์ง์ ํ ์คํธ๋ฅผ ๋์์ ์ดํดํ์ฌ zero-shot classification, image-text retrieval, visual question answering, image captioning ๋ฑ์ ํ์คํฌ์์ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋๋ค.
์ฅ์
- ๊ฐ modality๊ฐ ๊ฐ์ง ์ํธ ๋ณด์์ ํน์ฑ์ ํ์ฉํ์ฌ, ๋จ์ผ modality๋ณด๋ค ๋ ํ๋ถํ๊ณ ์ผ๋ฐํ๋ representation์ ํ์ตํ ์ ์์ต๋๋ค.
- ๋ค์ํ ๋ฐ์ดํฐ ์์ค๋ก๋ถํฐ ์ป์ ์ ๋ณด๋ฅผ ๊ฒฐํฉํจ์ผ๋ก์จ, ๋ณต์กํ ์ค์ ์ํฉ์ ๋ ์ ๋์ํ ์ ์์ต๋๋ค.
4. Foundation Models
Foundation Model์ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ๋ํด ์ฌ์ ํ์ต๋ ๋ชจ๋ธ๋ก, ๋ค์ํ downstream ํ์คํฌ์ ์ฑํ๋ ์ ์๋ ๋ฒ์ฉ ๋ชจ๋ธ์ ๋๋ค.
ํน์ง
- ๋๊ท๋ชจ Pre-training:
๋ฐฉ๋ํ ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํด ์ผ๋ฐ์ ์ธ representation์ ํ์ตํฉ๋๋ค. - Transferability:
ํ์ต๋ ๋ชจ๋ธ์ ๋ค์ํ ์์ (์: ํ ์คํธ ์์ฑ, ์ด๋ฏธ์ง ๋ถ๋ฅ, multimodal tasks ๋ฑ)์ ์ฝ๊ฒ ์ ์ํ ์ ์์ต๋๋ค.
๋ํ ์์
- Language Models:
GPT, BERT ๋ฑ - Vision Models:
CLIP, DALLยทE ๋ฑ - Multimodal Models:
SAM, Whisper, Flamingo ๋ฑ
Foundation Models๋ AI์ ์ฌ๋ฌ ๋ถ์ผ์์ ๊ฐ๋ ฅํ ์ฑ๋ฅ์ ๊ธฐ๋ฐ์ด ๋๋ฉฐ, ์ ์ ์ถ๊ฐ ๋ฐ์ดํฐ๋ก๋ ๋ค์ํ ์์ ์ ์ฝ๊ฒ fine-tuning ํ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค.
๊ฒฐ๋ก
ํ๋ AI๋ ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ์ฌํ์ฉ๊ณผ ๋ฐ์ดํฐ๋ก๋ถํฐ ์๋์ผ๋ก ์ป์ ํํ(representation)์ ๋ฐํ์ผ๋ก ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ํ์ต์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- Transfer Learning์ ํตํด ์ ์ ๋ฐ์ดํฐ๋ก๋ ๋น ๋ฅธ ํ์ต๊ณผ ๋์ ์ฑ๋ฅ์ ๋ฌ์ฑํ ์ ์์ผ๋ฉฐ,
- Self-Supervised Learning์ ๋ผ๋ฒจ ์์ด๋ ๊ฐ๋ ฅํ representation์ ํ์ตํ ์ ์๋ ๊ฒฝ์ ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
- Multimodal Learning์ ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํด ๋ณด๋ค ํ๋ถํ ์ ๋ณด๋ฅผ ํ์ฉํ๊ณ ,
- Foundation Models๋ ์ฌ๋ฌ ๋ถ์ผ์ ๊ฑธ์ณ ๋ฒ์ฉ์ ์ผ๋ก ํ์ฉ ๊ฐ๋ฅํ ๊ฐ๋ ฅํ ๊ธฐ๋ฐ ๋ชจ๋ธ๋ก ์๋ฆฌ์ก๊ณ ์์ต๋๋ค.
์ด๋ฌํ ํจ๋ฌ๋ค์๋ค์ ์ดํดํ๊ณ ์ ์ ํ ํ์ฉํ๋ฉด, ๋์ฑ ํจ์จ์ ์ด๊ณ ๋ฒ์ฉ์ ์ธ AI ์์คํ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
Computer Vision: ์ด๋ฏธ์ง ๋ถ๋ฅ ๋ชจ๋ธ ํ์ต ํ๋ก์ธ์ค
์ด๋ฏธ์ง ๋ถ๋ฅ๋ ์ฃผ์ด์ง ์ด๋ฏธ์ง๋ฅผ ์ฌ์ ์ ์ ์๋ ํด๋์ค์ ํ ๋นํ๋ ์์ ์ ๋๋ค. ์ด ํฌ์คํ ์์๋ ๋ฐ์ดํฐ์ ๊ตฌ์ถ๋ถํฐ ๋ชจ๋ธ ์ ์, ํ์ต, ๊ทธ๋ฆฌ๊ณ ํ๊ฐ๊น์ง ์ด๋ฏธ์ง ๋ถ๋ฅ ๋ชจ๋ธ์ ํ์ต์ํค๋ ์ ๋ฐ์ ์ธ ํ๋ก์ธ์ค๋ฅผ ์ดํด๋ด ๋๋ค.
1. ๋ฐ์ดํฐ์ ๊ตฌ์ถ๊ณผ DataLoader
Dataset ํด๋์ค
๋ฐ์ดํฐ์ ํด๋์ค๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ๊ทธ์ ํด๋นํ๋ ๋ผ๋ฒจ์ ๋ก๋ํ๊ณ , ์ ์ฒ๋ฆฌ ๋ฐ ๋ฐฐ์น ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ํ ์ ์๋๋ก ๋์์ค๋๋ค. Dataset ํด๋์ค๋ ๋ ๊ฐ์ง ํ์ ๋ฉ์๋๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค.
__len__
: ์ ์ฒด ์์ดํ ์ ๋ฐํ__getitem__
: ์ฃผ์ด์ง ์ธ๋ฑ์ค์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฒ๋ฆฌํ์ฌ ๋ฐํ
import os
import pandas as pd
from torch.utils.data import Dataset
from torchvision.io import read_image
class CustomImageDataset(Dataset):
def __init__(self, annotations_file, img_dir, transform=None, target_transform=None):
self.img_labels = pd.read_csv(annotations_file)
self.img_dir = img_dir
self.transform = transform
self.target_transform = target_transform
def __len__(self):
return len(self.img_labels)
def __getitem__(self, idx):
img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0])
image = read_image(img_path)
label = self.img_labels.iloc[idx, 1]
if self.transform:
image = self.transform(image)
if self.target_transform:
label = self.target_transform(label)
return image, label
DataLoader
DataLoader๋ Dataset์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์น(batch) ๋จ์๋ก ๋ก๋ํด ์ค๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ธ ํ์ต ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ต์ ํ์ ํ์ต ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
from torch.utils.data import DataLoader
train_dataset = CustomImageDataset("train_annotations.csv", "./train_images")
test_dataset = CustomImageDataset("test_annotations.csv", "./test_images")
train_dataloader = DataLoader(
train_dataset,
batch_size=64,
shuffle=True,
num_workers=0,
drop_last=True)
test_dataloader = DataLoader(
test_dataset,
batch_size=64,
shuffle=False,
num_workers=0,
drop_last=False)
2. ๋ชจ๋ธ ์ ์
๋ชจ๋ธ์ ์ง์ ๊ตฌ์ฑํ ์๋ ์๊ณ , torchvision์ด๋ timm๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ ์๋ ์์ต๋๋ค. ์๋๋ ๊ฐ๋จํ CNN ๋ชจ๋ธ์ ์์์ ๋๋ค.
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5) # ์
๋ ฅ ์ฑ๋ 3, ์ถ๋ ฅ ์ฑ๋ 6, kernel size 5
self.pool = nn.MaxPool2d(2, 2) # 2x2 max pooling
self.conv2 = nn.Conv2d(6, 16, 5) # ๋ ๋ฒ์งธ convolution layer
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10) # 10๊ฐ ํด๋์ค ๋ถ๋ฅ
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = torch.flatten(x, 1) # ๋ฐฐ์น ์ฐจ์ ์ ์ธ ๋ชจ๋ ์ฐจ์ flatten
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
3. ์์ค ํจ์ (Loss Function)
๋ชจ๋ธ์ ์์ธก ๊ฐ๊ณผ ์ค์ ๋ผ๋ฒจ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ์ธก์ ํ๋ ์์ค ํจ์๋ ํ์ต์ ํต์ฌ ์์์ ๋๋ค. ๋ค์ค ํด๋์ค ๋ถ๋ฅ ๋ฌธ์ ์๋ ๋ณดํต CrossEntropyLoss๋ฅผ ์ฌ์ฉํฉ๋๋ค.
import torch.nn as nn
loss_fn = nn.CrossEntropyLoss(
weight=None, # ํด๋์ค ๋ถ๊ท ํ ์กฐ์ ์ ์ฌ์ฉ
ignore_index=-100, # ํน์ label์ ๋ฌด์
reduction='mean', # ํ๊ท ์์ค ๊ฐ ๋ฐํ
label_smoothing=0.0 # ๋ผ๋ฒจ ์ค๋ฌด๋ฉ ์ ์ฉ (๊ณผ์ ํฉ ๋ฐฉ์ง)
)
# ์์: loss = loss_fn(predictions, labels)
๊ธฐํ ์์ค ํจ์๋ก๋ NLLLoss, BCELoss, BCEWithLogitsLoss, F1 Loss, Focal Loss ๋ฑ์ด ์์ผ๋ฉฐ, ๋ฌธ์ ์ ๋ง๊ฒ ์ ํํฉ๋๋ค.
4. Optimizer
Optimizer๋ ์์ค ํจ์๊ฐ ์ต์ํ๋๋ ๋ฐฉํฅ์ผ๋ก ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก SGD์ Adam์ด ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
import torch.optim as optim
optimizer = optim.Adam(
net.parameters(),
lr=0.001,
betas=(0.9, 0.999),
weight_decay=0.01)
5. Learning Rate Scheduler
ํ์ต๋ฅ (Learning Rate)์ ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ ์ ๋ฐ์ดํธ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ํ์ต ์ด๊ธฐ์ ๋์ ํ์ต๋ฅ ์ ์ฌ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ํ์ตํ๊ณ , ์ดํ์๋ ์ ์ง์ ์ผ๋ก ํ์ต๋ฅ ์ ๋ฎ์ถฐ ์๋ ด ๊ณผ์ ์ ์์ ํํฉ๋๋ค. ๋ํ์ ์ธ ์ค์ผ์ค๋ฌ๋ก๋ StepLR, ExponentialLR, CosineAnnealingLR, ReduceLROnPlateau ๋ฑ์ด ์์ต๋๋ค.
6. Training & Validation Process
Training Loop
๋ชจ๋ธ ํ์ต์ ์๋์ ๊ฐ์ ๋จ๊ณ๋ก ์งํ๋ฉ๋๋ค:
- ๋ฐ์ดํฐ์ ๋ชจ๋ธ์ GPU ๋๋ CPU๋ก ์ด๋
- ๋ชจ๋ธ์ training ๋ชจ๋๋ก ์ ํ
- ๋ฐฐ์น๋ณ๋ก ์์ธก ์ํ, ์์ค ๊ณ์ฐ, backpropagation, optimizer ์ ๋ฐ์ดํธ, learning rate scheduler ์ ๋ฐ์ดํธ
- ๋ฐฐ์น๋ณ ์์ค์ ๋์ ํ์ฌ epoch๋น ํ๊ท ์์ค ๊ณ์ฐ
from tqdm import tqdm
def train_epoch(model, train_loader, optimizer, loss_fn, scheduler, device):
model.train()
total_loss = 0.0
progress_bar = tqdm(train_loader, desc="Training", leave=False)
for images, targets in progress_bar:
images, targets = images.to(device), targets.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = loss_fn(outputs, targets)
loss.backward()
optimizer.step()
scheduler.step()
total_loss += loss.item()
progress_bar.set_postfix(loss=loss.item())
return total_loss / len(train_loader)
Validation Loop
ํ๊ฐ ์์๋ ๋ชจ๋ธ์ ํ๊ฐ ๋ชจ๋๋ก ์ ํํ ํ, gradient ๊ณ์ฐ ์์ด ์งํํฉ๋๋ค.
def validate(model, val_loader, loss_fn, device):
model.eval()
total_loss = 0.0
progress_bar = tqdm(val_loader, desc='Validating', leave=False)
with torch.no_grad():
for images, targets in progress_bar:
images, targets = images.to(device), targets.to(device)
outputs = model(images)
loss = loss_fn(outputs, targets)
total_loss += loss.item()
progress_bar.set_postfix(loss=loss.item())
return total_loss / len(val_loader)
์ ์ฒด Training Process
def train(model, train_loader, val_loader, optimizer, loss_fn, scheduler, epochs, device):
for epoch in range(epochs):
train_loss = train_epoch(model, train_loader, optimizer, loss_fn, scheduler, device)
val_loss = validate(model, val_loader, loss_fn, device)
print(f"Epoch {epoch+1}: Train Loss = {train_loss:.4f}, Val Loss = {val_loss:.4f}")
# ๋ชจ๋ธ ์ ์ฅ, scheduler ์
๋ฐ์ดํธ ๋ฑ ์ถ๊ฐ ์์
์ํ
- Step vs. Epoch:
- Step: ํ๋์ minibatch๊ฐ ๋ชจ๋ธ์ ํต๊ณผํ์ฌ ํ๋ผ๋ฏธํฐ๊ฐ ์ ๋ฐ์ดํธ๋๋ ๊ณผ์
- Epoch: ์ ์ฒด ํ์ต ๋ฐ์ดํฐ์ ์ด ํ ๋ฒ ๋ชจ๋ธ์ ํต๊ณผํ ์ฃผ๊ธฐ
๊ฒฐ๋ก
์ด๋ฏธ์ง ๋ถ๋ฅ ๋ชจ๋ธ ํ์ต ํ๋ก์ธ์ค๋ ๋ฐ์ดํฐ์
๊ตฌ์ถ๊ณผ ์ ์ฒ๋ฆฌ, DataLoader๋ฅผ ํตํ ๋ฐฐ์น ์ฒ๋ฆฌ, ๋ชจ๋ธ ์ ์, ์์ค ํจ์์ optimizer, ๊ทธ๋ฆฌ๊ณ learning rate scheduler ์ค์ ๋ฐ training/validation loop๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
์ด๋ฌํ ์ ์ฒด ํ์ดํ๋ผ์ธ์ ์ฒด๊ณ์ ์ผ๋ก ๊ตฌ์ฑํ๋ฉด, ํจ๊ณผ์ ์ผ๋ก ๋ชจ๋ธ์ ํ์ต์ํค๊ณ ํ๊ฐํ ์ ์์ผ๋ฉฐ, ๋์๊ฐ ์ฑ๋ฅ ๊ฐ์ ์ ํฐ ๋์์ด ๋ฉ๋๋ค.
๋ชจ๋ธ ํ์ต ์๋ ํฅ์์ ์ํ ํจ์จ์ ์ธ ๊ธฐ๋ฒ๋ค
๋ชจ๋ธ ํ์ต ์๋๊ฐ ์ง๋์น๊ฒ ๋๋ฆด ๋๋ ์ฌ๋ฌ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ๋ค์ ์ ์ฉํ์ฌ ํ์ต ์๊ฐ์ ๋จ์ถํ ์ ์์ต๋๋ค. ์ด ํฌ์คํ ์์๋ ๋ฐ์ดํฐ ์บ์ฑ, ๊ทธ๋ผ๋์ธํธ ๋์ , ํผํฉ ์ ๋ฐ๋ ํ์ต, pseudo labeling, ๊ทธ๋ฆฌ๊ณ ์์ฑ ๋ชจ๋ธ์ ํ์ฉํ ๋ฐ์ดํฐ ์ฆ๊ฐ ๊ธฐ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
1. Data Caching
๋ฐ์ดํฐ I/O๊ฐ ํ์ต ์๋์ ๋ณ๋ชฉ์ด ๋ ์ ์์ต๋๋ค. ํนํ ์ด๋ฏธ์ง์ ๊ฐ์ด ์ฉ๋์ด ํฐ ๋ฐ์ดํฐ๋ฅผ ๋งค epoch๋ง๋ค ๋์คํฌ์์ ๋ถ๋ฌ์ค๋ฉด ํฐ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํฉ๋๋ค.
ํด๊ฒฐ๋ฒ:
- ์ ์ฒด ์ด๋ฏธ์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ถ๋ฌ์ vectorํํ ํ npy ํ์ผ๋ก ์ ์ฅํ๊ณ , ์ดํ์๋ ์ด npy ํ์ผ์ ๋ถ๋ฌ์ ์ฌ์ฉํฉ๋๋ค.
def data_caching(root_dir: str, info_df: pd.DataFrame):
for idx, row in info_df.iterrows():
image_path = os.path.join(root_dir, row['image_path'])
image = cv2.imread(image_path, cv2.IMREAD_COLOR)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
npy_path = image_path.replace('.jpg', '.npy')
np.save(npy_path, image)
data_caching('base_directory', info_df)
- Dataset ํด๋์ค์์๋ ์ด๋ฏธ์ง๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋์ด ์์ง ์์ผ๋ฉด ์๋กญ๊ฒ ๋ถ๋ฌ์ค๊ณ , ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ ์ฌ์ฌ์ฉํ๋๋ก ๊ตฌํํฉ๋๋ค.
class CustomImageDataset(Dataset):
def __init__(self, info_df, root_dir, transform=None):
self.info_df = info_df
self.root_dir = root_dir
self.transform = transform
self.images = [None] * len(info_df) # ์บ์์ฉ ๋ฆฌ์คํธ
def __len__(self):
return len(self.info_df)
def __getitem__(self, index):
if self.images[index] is None:
img_path = os.path.join(self.root_dir, self.info_df.iloc[index]['image_path'])
image = cv2.imread(img_path, cv2.IMREAD_COLOR)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
self.images[index] = image
else:
image = self.images[index]
label = self.info_df.iloc[index]['label']
if self.transform:
image = self.transform(image)
return image, label
์ฃผ์: ์ ์ฒด ๋ฐ์ดํฐ์ ์ด ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ์ด๊ณผํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
2. Gradient Accumulation
๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ผ๋ก ์ธํด ์์ batch size๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, gradient ์ถ์ ์ด ๋ถ์์ ํด์ง ์ ์์ต๋๋ค.
ํด๊ฒฐ๋ฒ:
- ์ฌ๋ฌ ๋ฏธ๋ ๋ฐฐ์น์ gradient๋ฅผ ๋์ ํ ํ, ์ผ์ step๋ง๋ค optimizer๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด ์์ batch size๋ก๋ ํฐ batch ํจ๊ณผ๋ฅผ ๋ผ ์ ์์ต๋๋ค.
accumulation_steps = 10
optimizer.zero_grad() # loop ๋ฐ๊นฅ์์ ์ด๊ธฐํ
for i, (images, targets) in enumerate(progress_bar):
images, targets = images.to(device), targets.to(device)
outputs = model(images)
loss = loss_fn(outputs, targets)
loss = loss / accumulation_steps # ํ๊ท ํ
loss.backward()
total_loss += loss.item()
if (i + 1) % accumulation_steps == 0 or (i + 1) == len(train_loader):
optimizer.step()
optimizer.zero_grad()
scheduler.step() # ์
๋ฐ์ดํธ ์์๋ง step
3. Mixed Precision Training
ํ์ต ์ float32๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ฐ๋๋ ๋์ง๋ง ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ์ฐ์ฐ ๋น์ฉ์ด ์ปค์ง๋๋ค.
ํด๊ฒฐ๋ฒ:
- Mixed Precision Training์ float16 ๋๋ bfloat16๊ณผ float32๋ฅผ ์ ์ ํ ํผํฉํ์ฌ ์ฌ์ฉํจ์ผ๋ก์จ ์ฐ์ฐ ์๋์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ํฅ์์ํต๋๋ค.
- PyTorch์
torch.cuda.amp
๋ชจ๋์ ์ฌ์ฉํฉ๋๋ค.
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
for images, targets in train_loader:
optimizer.zero_grad()
images, targets = images.to(device), targets.to(device)
with autocast():
outputs = model(images)
loss = loss_fn(outputs, targets)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
4. Pseudo Labeling
๋๊ท๋ชจ unlabeled ๋ฐ์ดํฐ์
์ ๊ฒฝ์ฐ, ์ง์ ๋ผ๋ฒจ๋งํ๋ ๋น์ฉ๊ณผ ์๊ฐ์ด ๋ง์ด ๋ญ๋๋ค.
Pseudo Labeling ๋ฐฉ๋ฒ:
- ๋ชจ๋ธ ํ์ต: labeled ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ์ด๊ธฐ ๋ชจ๋ธ ํ์ต
- ์์ธก: ํ์ต๋ ๋ชจ๋ธ์ ์ด์ฉํด unlabeled ๋ฐ์ดํฐ์ ๋ํ ์์ธก ์ํ
- ์ ๋ขฐ๋ ๊ธฐ์ค ์ ํ: ๋์ ์ ๋ขฐ๋์ ์์ธก ๊ฒฐ๊ณผ๋ฅผ pseudo label๋ก ์ ํ
- ์ฌํ์ต: labeled ๋ฐ์ดํฐ์ pseudo labeled ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ์ฌ์ฉํด ๋ชจ๋ธ์ ์ฌํ์ต
์ฃผ์: validation set์ pseudo labeling์ ํฌํจ์ํค์ง ์์์ผ ํฉ๋๋ค.
5. Generative Models๋ฅผ ํ์ฉํ ๋ฐ์ดํฐ ์ฆ๊ฐ
์์ฑ ๋ชจ๋ธ(text-to-image, image-to-image)์ ํ์ฉํ๋ฉด ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ํ์ฉ ์ฌ๋ก:
- CLIP ๋ฑ์ ํ์ฉํด ์์ฑ๋ ์ด๋ฏธ์ง๊ฐ ์๋ํ ํํ์ ํฌํจํ๋์ง ํ๊ฐ
- ๋ถ์กฑํ ๋ฐ์ดํฐ ์์ญ์ ๋ณด์ํ์ฌ ํ์ต ๋ฐ์ดํฐ์ ๋ค์์ฑ๊ณผ ์์ ์ฆ๊ฐ์ํด
๋จ, ์์ฑ๋ ๋ฐ์ดํฐ๊ฐ ์ค์ ์ ์ ์ฌํ์ง ๊ฒ์ฆํ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
๊ฒฐ๋ก
๋ชจ๋ธ ํ์ต ์๋๊ฐ ๋๋ฆด ๋๋ ๋ค์ํ ํจ์จ์ ์ธ ๊ธฐ๋ฒ๋ค์ ์ ์ฉํด ์ ์ฒด ํ์ดํ๋ผ์ธ์ ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- Data Caching์ ํตํด ๋ฐ๋ณต์ ์ธ ๋์คํฌ I/O๋ฅผ ์ค์ด๊ณ ,
- Gradient Accumulation์ ํ์ฉํด ์์ ๋ฐฐ์น์์๋ ์์ ์ ์ธ ํ์ต์,
- Mixed Precision Training์ผ๋ก ์ฐ์ฐ ํจ์จ์ฑ์ ๋์ด๋ฉฐ,
- Pseudo Labeling๊ณผ Generative Models๋ฅผ ํตํด ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ํ๋ณดํจ์ผ๋ก์จ, ์ ๋ฐ์ ์ธ ํ์ต ํจ์จ์ ๊ทน๋ํํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฒ๋ค์ ์ ์ ํ ์กฐํฉํ๋ฉด, ํ์ต ์๋๋ ๋ฌผ๋ก ์ต์ข ๋ชจ๋ธ ์ฑ๋ฅ๊น์ง ๊ฐ์ ํ ์ ์์ผ๋ฏ๋ก, ์ค๋ฌด์์ ๋งค์ฐ ์ ์ฉํ๊ฒ ํ์ฉ๋ ์ ์์ต๋๋ค.
---์๋๋ ๋ชจ๋ธ ํ์ต ์๋ ํฅ์์ ์ํ ํจ์จ์ ์ธ ๊ธฐ๋ฒ๋ค์ ์ ๋ฆฌํ ์ต์ข ๋ธ๋ก๊ทธ ํฌ์คํธ ์ด์์ ๋๋ค.
๋ชจ๋ธ ํ์ต ์๋ ํฅ์์ ์ํ ํจ์จ์ ์ธ ๊ธฐ๋ฒ๋ค
๋ชจ๋ธ ํ์ต ์๋๊ฐ ์ง๋์น๊ฒ ๋๋ฆด ๋๋ ์ฌ๋ฌ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ๋ค์ ์ ์ฉํ์ฌ ํ์ต ์๊ฐ์ ๋จ์ถํ ์ ์์ต๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ ๋ฐ์ดํฐ ์บ์ฑ, ๊ทธ๋ผ๋์ธํธ ๋์ (Gradient Accumulation), ํผํฉ ์ ๋ฐ๋ ํ์ต(Mixed Precision Training), Pseudo Labeling, ๊ทธ๋ฆฌ๊ณ ์์ฑ ๋ชจ๋ธ์ ํ์ฉํ ๋ฐ์ดํฐ ์ฆ๊ฐ ๊ธฐ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
1. Data Caching
๋ฐ์ดํฐ I/O๊ฐ ํ์ต ์๋์ ๋ณ๋ชฉ์ด ๋ ์ ์์ต๋๋ค. ํนํ ์ด๋ฏธ์ง์ ๊ฐ์ด ์ฉ๋์ด ํฐ ๋ฐ์ดํฐ๋ฅผ ๋งค epoch๋ง๋ค ๋์คํฌ์์ ๋ถ๋ฌ์ค๋ฉด ํฐ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํฉ๋๋ค.
ํด๊ฒฐ๋ฒ:
- ์ ์ฒด ์ด๋ฏธ์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ถ๋ฌ์ vectorํํ ํ, npy ํ์ผ๋ก ์ ์ฅํ๊ณ ์ดํ์๋ ์ด npy ํ์ผ์ ๋ถ๋ฌ์ ์ฌ์ฉํฉ๋๋ค.
def data_caching(root_dir: str, info_df: pd.DataFrame):
for idx, row in info_df.iterrows():
image_path = os.path.join(root_dir, row['image_path'])
image = cv2.imread(image_path, cv2.IMREAD_COLOR)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
npy_path = image_path.replace('.jpg', '.npy')
np.save(npy_path, image)
data_caching('base_directory', info_df)
- Dataset ํด๋์ค์์๋ ์ด๋ฏธ์ง๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋์ด ์์ง ์์ผ๋ฉด ์๋กญ๊ฒ ๋ถ๋ฌ์ค๊ณ , ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ ์ฌ์ฌ์ฉํ๋๋ก ๊ตฌํํฉ๋๋ค.
class CustomImageDataset(Dataset):
def __init__(self, info_df, root_dir, transform=None):
self.info_df = info_df
self.root_dir = root_dir
self.transform = transform
self.images = [None] * len(info_df) # ์บ์์ฉ ๋ฆฌ์คํธ
def __len__(self):
return len(self.info_df)
def __getitem__(self, index):
if self.images[index] is None:
img_path = os.path.join(self.root_dir, self.info_df.iloc[index]['image_path'])
image = cv2.imread(img_path, cv2.IMREAD_COLOR)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
self.images[index] = image
else:
image = self.images[index]
label = self.info_df.iloc[index]['label']
if self.transform:
image = self.transform(image)
return image, label
์ฃผ์: ์ ์ฒด ๋ฐ์ดํฐ์ ์ด ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ์ด๊ณผํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
2. Gradient Accumulation
๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ผ๋ก ์ธํด ์์ batch size๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, gradient ์ถ์ ์ด ๋ถ์์ ํด์ง ์ ์์ต๋๋ค.
ํด๊ฒฐ๋ฒ:
- ์ฌ๋ฌ ๋ฏธ๋ ๋ฐฐ์น์ gradient๋ฅผ ๋์ ํ ํ, ์ผ์ step๋ง๋ค optimizer๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์์ batch size๋ก๋ ํฐ batch ํจ๊ณผ๋ฅผ ๋ผ ์ ์์ต๋๋ค.
accumulation_steps = 10
optimizer.zero_grad() # loop ๋ฐ๊นฅ์์ ์ด๊ธฐํ
for i, (images, targets) in enumerate(progress_bar):
images, targets = images.to(device), targets.to(device)
outputs = model(images)
loss = loss_fn(outputs, targets)
loss = loss / accumulation_steps # ํ๊ท ํ
loss.backward()
total_loss += loss.item()
if (i + 1) % accumulation_steps == 0 or (i + 1) == len(train_loader):
optimizer.step()
optimizer.zero_grad()
scheduler.step() # ์
๋ฐ์ดํธ ์์๋ง step
3. Mixed Precision Training
ํ์ต ์ float32๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ฐ๋๋ ๋์ง๋ง ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ์ฐ์ฐ ๋น์ฉ์ด ์ปค์ง๋๋ค.
ํด๊ฒฐ๋ฒ:
- Mixed Precision Training์ float16 ๋๋ bfloat16๊ณผ float32๋ฅผ ์ ์ ํ ํผํฉํ์ฌ ์ฌ์ฉํจ์ผ๋ก์จ ์ฐ์ฐ ์๋์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ํฅ์์ํต๋๋ค.
- PyTorch์
torch.cuda.amp
๋ชจ๋์ ์ฌ์ฉํฉ๋๋ค.
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
for images, targets in train_loader:
optimizer.zero_grad()
images, targets = images.to(device), targets.to(device)
with autocast():
outputs = model(images)
loss = loss_fn(outputs, targets)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
4. Pseudo Labeling
๋๊ท๋ชจ unlabeled ๋ฐ์ดํฐ์
์ ๊ฒฝ์ฐ, ์ง์ ๋ผ๋ฒจ๋งํ๋ ๋น์ฉ๊ณผ ์๊ฐ์ด ๋ง์ด ๋ญ๋๋ค.
Pseudo Labeling ๋ฐฉ๋ฒ:
- ๋ชจ๋ธ ํ์ต: labeled ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ์ด๊ธฐ ๋ชจ๋ธ์ ํ์ตํฉ๋๋ค.
- ์์ธก: ํ์ต๋ ๋ชจ๋ธ์ ์ด์ฉํด unlabeled ๋ฐ์ดํฐ์ ๋ํ ์์ธก์ ์ํํฉ๋๋ค.
- ์ ๋ขฐ๋ ๊ธฐ์ค ์ ํ: ๋์ ์ ๋ขฐ๋์ ์์ธก ๊ฒฐ๊ณผ๋ฅผ pseudo label๋ก ์ ํํฉ๋๋ค.
- ์ฌํ์ต: labeled ๋ฐ์ดํฐ์ pseudo labeled ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ์ฌ์ฉํด ๋ชจ๋ธ์ ์ฌํ์ตํฉ๋๋ค.
์ฃผ์: Validation set์ pseudo labeling ๊ณผ์ ์ ํฌํจ์ํค์ง ์์์ผ ํฉ๋๋ค.
5. Generative Models๋ฅผ ํ์ฉํ ๋ฐ์ดํฐ ์ฆ๊ฐ
์์ฑ ๋ชจ๋ธ(text-to-image, image-to-image)์ ํ์ฉํ๋ฉด ํ์ต์ ์ฌ์ฉํ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ํ์ฉ ์ฌ๋ก:
- ์๋ฅผ ๋ค์ด, CLIP ๋ฑ์ ๋ชจ๋ธ๋ก ์์ฑ๋ ์ด๋ฏธ์ง๊ฐ ์๋ํ ํํ(text)์ ํฌํจํ๋์ง ํ๊ฐํ์ฌ, ๋ถ์กฑํ ๋ฐ์ดํฐ ์์ญ์ ๋ณด์ํ ์ ์์ต๋๋ค.
- ์ด๋ฅผ ํตํด ํ์ต ๋ฐ์ดํฐ์ ๋ค์์ฑ๊ณผ ์์ ์ฆ๊ฐ์์ผ, ๋ชจ๋ธ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๋จ, ์์ฑ๋ ๋ฐ์ดํฐ์ ์ ๋ขฐ์ฑ์ ๊ฒ์ฆํ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
๊ฒฐ๋ก
๋ชจ๋ธ ํ์ต ์๋๊ฐ ๋๋ฆด ๋๋ ๋ค์๊ณผ ๊ฐ์ ํจ์จ์ ์ธ ๊ธฐ๋ฒ๋ค์ ์ ์ ํ ์กฐํฉํ์ฌ ์ ์ฒด ํ์ต ํ์ดํ๋ผ์ธ์ ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- Data Caching: ๋ฐ๋ณต์ ์ธ ๋์คํฌ I/O๋ฅผ ์ค์ฌ ๋ฐ์ดํฐ ๋ก๋ฉ ์๊ฐ์ ๋จ์ถํฉ๋๋ค.
- Gradient Accumulation: ์์ ๋ฐฐ์น๋ก๋ ํฐ ๋ฐฐ์น ํจ๊ณผ๋ฅผ ๋ด์ด ํ์ต์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- Mixed Precision Training: ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ์ฐ์ฐ ๋น์ฉ์ ์ค์ด๋ฉด์ ํ์ต ์๋๋ฅผ ๋์ ๋๋ค.
- Pseudo Labeling: ์ถ๊ฐ unlabeled ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ฌ ํ์ต ๋ฐ์ดํฐ๋ฅผ ์ฆ๊ฐํฉ๋๋ค.
- Generative Models: ์์ฑ ๋ชจ๋ธ์ ํ์ฉํด ๋ฐ์ดํฐ ๋ค์์ฑ์ ๋์ด๊ณ , ๋ถ์กฑํ ๋ฐ์ดํฐ ์์ญ์ ๋ณด์ํฉ๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฒ๋ค์ ํตํด ํ์ต ์๋์ ์ต์ข ๋ชจ๋ธ ์ฑ๋ฅ์ ๋์์ ๊ฐ์ ํ ์ ์์ผ๋ฉฐ, ์ค๋ฌด์์ ํจ์จ์ ์ธ ํ์ต ํ์ดํ๋ผ์ธ ๊ตฌ์ถ์ ํฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
Confusion Matrix์ Ensemble ๊ธฐ๋ฒ์ ํ์ฉํ ๋ถ๋ฅ ์ฑ๋ฅ ํ๊ฐ
๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํ๊ฐํ ๋, confusion matrix๋ ์์ธก ๊ฒฐ๊ณผ์ ์ค์ ๋ผ๋ฒจ์ ํ๋์ ๋น๊ตํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ด๋ฅผ ํตํด accuracy, precision, recall, ๊ทธ๋ฆฌ๊ณ F1-score์ ๊ฐ์ ์ฌ๋ฌ ์ฑ๋ฅ ์งํ๋ฅผ ์ฐ์ถํ ์ ์์ต๋๋ค. ๋ํ, ์ฌ๋ฌ ๋ชจ๋ธ์ ์์ธก์ ๊ฒฐํฉํ๋ ensemble ๊ธฐ๋ฒ์ ํ์ฉํ๋ฉด ์ฑ๋ฅ์ ๋์ฑ ๋์ผ ์ ์์ต๋๋ค. ์ด ํฌ์คํ ์์๋ confusion matrix์ ๊ตฌ์ฑ๊ณผ ๊ฐ ์งํ์ ์๋ฏธ, ๊ทธ๋ฆฌ๊ณ ensemble ๊ธฐ๋ฒ๋ค์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. Confusion Matrix๋?
Confusion Matrix๋ ๋ชจ๋ธ์ ์์ธก ๊ฒฐ๊ณผ์ ์ค์ ๋ผ๋ฒจ์ ๋น๊ตํ์ฌ ๋ค์ ๋ค ๊ฐ์ง ํญ๋ชฉ์ผ๋ก ๋ถ๋ฅํ ํ๋ ฌ์
๋๋ค.
- True Positive (TP): ์ฌ๋ฐ๋ฅด๊ฒ ๊ธ์ ์ผ๋ก ์์ธกํ ๊ฒฝ์ฐ
- True Negative (TN): ์ฌ๋ฐ๋ฅด๊ฒ ๋ถ์ ์ผ๋ก ์์ธกํ ๊ฒฝ์ฐ
- False Positive (FP): ๋ถ์ ์์๋ ๊ธ์ ์ผ๋ก ์๋ชป ์์ธกํ ๊ฒฝ์ฐ
- False Negative (FN): ๊ธ์ ์์๋ ๋ถ์ ์ผ๋ก ์๋ชป ์์ธกํ ๊ฒฝ์ฐ
์ด๋ฌํ ๊ตฌ์ฑ ์์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ํ ์ฑ๋ฅ ์งํ๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค.
์ฃผ์ ์ฑ๋ฅ ์งํ
-
Accuracy (์ ํ๋): ์ ์ฒด ์์ธก ์ค ์ฌ๋ฐ๋ฅธ ์์ธก์ ๋น์จ
-
Precision (์ ๋ฐ๋): ๊ธ์ ์ผ๋ก ์์ธกํ ํญ๋ชฉ ์ค ์ค์ ๊ธ์ ์ ๋น์จ
-
Recall (์ฌํ์จ): ์ค์ ๊ธ์ ํญ๋ชฉ ์ค ๋ชจ๋ธ์ด ๊ธ์ ์ผ๋ก ์์ธกํ ๋น์จ
-
F1-Score: Precision๊ณผ Recall์ ์กฐํ ํ๊ท
์ฑ๋ฅ ์งํ ์ ํ์ ์ค์์ฑ
๋ฌธ์ ์ ์ ์์ ๋ฐ๋ผ ์ด๋ค ์ฑ๋ฅ ์งํ๋ฅผ ์ฐ์ ์ํด์ผ ํ๋์ง๊ฐ ๋ฌ๋ผ์ง๋๋ค. ์๋ฅผ ๋ค์ด:
- ์ฐ๋ ๊ธฐ ์ฒ๋ฆฌ์ฅ ์์คํ
:
์ฌ์ฐ ํผํด๊ฐ ํฌ์ง ์์ผ๋ฏ๋ก, ์๋ชป๋ ๊ฒฝ๋ณด(False Positive)๊ฐ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ precision์ ์ค์ํด์ผ ํฉ๋๋ค. - ๊ธ์๋ฐฉ ์์คํ
:
ํ ๋ฒ์ ์ ๋๋ ํฐ ํผํด๋ก ์ด์ด์ง๋ฏ๋ก, ์ค์ ๋๋์ ์ก๋ ๋ฅ๋ ฅ(Recall)์ด ๋ ์ค์ํฉ๋๋ค.
์ด๋ค ์งํ๋ฅผ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ ๋, ์ํฉ์ ๋ง๋ threshold๋ฅผ ์ ํํ์ฌ ๋น์ฉ์ ์ต์ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
2. Ensemble ๊ธฐ๋ฒ
Ensemble ๊ธฐ๋ฒ์ ๋์ผํ ํ์คํฌ์ ๋ํด ์ฌ๋ฌ ๋ชจ๋ธ์ ์์ธก์ ๊ฒฐํฉํ์ฌ, ๊ฐ๋ณ ๋ชจ๋ธ์ ์ฝ์ ์ ๋ณด์ํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ฃผ์ Ensemble ๊ธฐ๋ฒ
-
Voting:
์ฌ๋ฌ ๋ชจ๋ธ์ด ์์ธกํ ๊ฒฐ๊ณผ๋ฅผ ํฌํํ์ฌ ์ต์ข ์์ธก์ ๊ฒฐ์ ํฉ๋๋ค.
Weighted Ensemble์ ๊ฒฝ์ฐ, ์ฑ๋ฅ์ด ์ข์ ๋ชจ๋ธ์ ๋ ๋ง์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ์ฌ ์ ์ฒด ๊ฒฐ๊ณผ์ ๋ฏธ์น๋ ์ํฅ์ ์ฆ๋์ํต๋๋ค. -
Cross-Validation:
์ฌ๋ฌ ๋ชจ๋ธ์ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ๋ถํ ๋ก ํ์ตํ๊ณ , ์ด๋ค์ ์์ธก์ ๊ฒฐํฉํ์ฌ ๋ชจ๋ธ์ ์ผ๋ฐํ ์ฑ๋ฅ์ ๋์ ๋๋ค. -
Test-Time Augmentation (TTA):
ํ ์คํธ ๋ฐ์ดํฐ์ ๋ค์ํ augmentation(์: flip, rotation ๋ฑ)์ ์ ์ฉํ์ฌ ์ฌ๋ฌ ๋ฒ ์์ธกํ ํ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ๊ท ๋ด๊ฑฐ๋ ๊ฒฐํฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ธ์ ์์ธก์ด ๋ณด๋ค ๊ฒฌ๊ณ ํด์ง๋๋ค.
๊ฒฐ๋ก
- Confusion Matrix๋ ๋ชจ๋ธ์ TP, TN, FP, FN์ ํตํด accuracy, precision, recall, F1-score ๋ฑ ๋ค์ํ ์ฑ๋ฅ ์งํ๋ฅผ ์ฐ์ถํ ์ ์์ผ๋ฉฐ, ๋ฌธ์ ์ ์ ์์ ๋ฐ๋ผ ์ ์ ํ ํ๊ฐ ์งํ์ threshold๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- Ensemble ๊ธฐ๋ฒ์ ์ฌ๋ฌ ๋ชจ๋ธ์ ์์ธก์ ๊ฒฐํฉํ์ฌ ๋จ์ผ ๋ชจ๋ธ๋ณด๋ค ๋ ๋ฐ์ด๋ ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ์ ๊ณตํฉ๋๋ค. Weighted Voting, Cross-Validation, ๊ทธ๋ฆฌ๊ณ Test-Time Augmentation ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ ํ์ฉํ ์ ์์ต๋๋ค.