일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 손실함수
- streamlit
- 파이싼
- 15649
- 재귀
- 가상환경
- 백트래킹
- Mac
- end to end
- 개발환경
- 그리디 알고리즘
- BOJ
- 파이썬
- 신경망 학습
- n과 m
- 백준
- pyenv
- Python
- 설정
- 경사하강법
- 9020
- N-Queen
- 4948
- 실버
- 기계학습
- 1002
- 1101
- 밑바닥부터 시작하는 딥러닝
- Today
- Total
파이톨치
[부스트캠프] 인공지능 기초 다지기 - 딥러닝 - 오답 노트 본문
WandB
Weights & Biases (WandB)는 머신러닝 실험을 추적하고 관리하는데 도움을 주는 도구입니다. 모델의 학습 과정을 시각화하고, 하이퍼파라미터를 조정하며, 팀원들과 결과를 공유할 수 있게 해줍니다. 이 도구는 주로 연구자들과 데이터 과학자들이 사용하는데, 머신러닝 모델의 성능을 향상시키고 실험을 체계적으로 관리할 수 있게 해줍니다.
다음은 WandB를 사용하는 예시입니다:
# Define a callback to log metrics to WandB
class WandbCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs=None):
wandb.log(logs)
# Define a custom callback to log batch size to WandB
class WandbBatchCallback(tf.keras.callbacks.Callback):
def __init__(self, batch_size):
super().__init__()
self.batch_size = batch_size
def on_epoch_end(self, epoch, logs=None):
logs = logs or {}
logs['batch_size'] = self.batch_size
wandb.log(logs)
병렬화
다중 GPU 학습은 큰 데이터셋이나 복잡한 모델을 더 효율적으로 학습시키기 위해 여러 GPU를 사용하는 방법입니다. 이를 위해 두 가지 주요 접근 방식이 있습니다: 모델 병렬화(Model Parallel)와 데이터 병렬화(Data Parallel, Distributed Data Parallel).
모델 병렬화 (Model Parallel)
설명:
- 모델 병렬화는 하나의 큰 모델을 여러 GPU에 나눠서 학습시키는 방법입니다.
- 모델의 서로 다른 부분이 각각의 GPU에서 학습됩니다.
- 예를 들어, 모델의 A 부분은 GPU 1에서, B 부분은 GPU 2에서 학습됩니다.
유용성:
- 모델이 너무 커서 하나의 GPU 메모리에 모두 담기 어려운 경우에 유용합니다.
- 각 GPU가 모델의 일부분만 처리하므로, GPU 메모리의 한계를 극복할 수 있습니다.
데이터 병렬화 (Data Parallel)
설명:
- 데이터 병렬화는 모델의 사본을 여러 GPU에 복사하고, 각 GPU에서 다른 데이터를 사용하여 동시에 학습시키는 방법입니다.
- 각 GPU는 동일한 모델을 가지고 있으며, 서로 다른 배치의 데이터를 처리합니다.
- 모든 GPU에서 계산된 그래디언트는 중앙에서 모여서 결합된 후 모델을 업데이트합니다.
유용성:
- 데이터셋이 매우 크고 하나의 GPU로 처리하기에는 시간이 많이 걸리는 경우에 유용합니다.
- 병렬 처리로 인해 학습 시간이 크게 단축될 수 있습니다.
데이터 분산 불균형 (Data Imbalance)
설명:
- 데이터 분산 불균형은 각 GPU에 할당된 데이터의 크기나 복잡도가 균등하지 않은 경우 발생합니다.
- 일부 GPU가 더 많은 데이터나 더 복잡한 계산을 수행해야 하므로, 다른 GPU보다 느리게 작업을 완료하게 됩니다.
- 이로 인해 전체 시스템의 동기화 지점에서 느린 GPU가 병목 현상을 초래하고, 다른 GPU들도 그 GPU가 작업을 완료할 때까지 기다려야 합니다.
Distributed Data Parallel (DDP): 파이토치의 DDP는 각 프로세스가 독립적으로 데이터를 로드하고 모델을 업데이트하므로, DataParallel보다 효율적입니다.
Ray는 분산 컴퓨팅을 위한 고성능 라이브러리로, 대규모의 병렬 및 분산 애플리케이션을 쉽게 작성하고 실행할 수 있게 해줍니다.
학습 중 캐시 비우기
total_loss 변수에 loss.item() 사용하여 누적하기
loss tensor를 사용한 후 del loss 명령어로 삭제하기
total_loss += loss.cpu().numpy() 사용하여 누적하기
loss 값을 저장하는 리스트 사용하고, loop가 끝나면 해당 리스트를 삭제하기
파이토치를 사용한 학습 과정에서 GPU 메모리 관리는 중요한 고려사항입니다. 특히 학습 루프(training loop) 내에서 tensor로 값을 축적하면 GPU 메모리 사용이 누적될 수 있어, 메모리 부족 문제를 야기할 수 있습니다. 이 문제를 효과적으로 관리하기 위한 몇 가지 방법들이 있습니다.
torch.cuda.empty_cache() 사용 주의
import torch
# 일부 코드 생략
for epoch in range(num_epochs):
total_loss = 0.0
for data, target in train_loader:
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
total_loss += loss.item()
# 매 epoch 또는 필요 시에 GPU 메모리 캐시 정리
if epoch % 10 == 0:
torch.cuda.empty_cache() # 사용하지 않는 GPU 메모리 캐시 정리
손실 함수
힌지 손실 (Hinge Loss)
- 정의: SVM(Support Vector Machine)에서 사용되는 손실 함수로, 마진을 최대화하는 목적을 가집니다.Hinge Loss=max(0,1−y⋅y^)\text{Hinge Loss} = \max(0, 1 - y \cdot \hat{y})여기서 yy는 실제 클래스(1 또는 -1), y^\hat{y}는 모델이 예측한 클래스의 점수입니다.
- 특징:
- SVM과 같이 이진 분류 문제에 주로 사용됩니다.
- 손실을 최소화하여 클래스 간의 마진을 확대시키는 방향으로 모델을 학습합니다.
이진 교차 엔트로피 손실 (Binary Cross Entropy Loss)
- 정의: 이진 분류 문제에서 사용되며, 두 가지 클래스 중 하나를 예측하는 경우의 교차 엔트로피 손실입니다.Binary Cross Entropy Loss=−[ylog(y^)+(1−y)log(1−y^)]\text{Binary Cross Entropy Loss} = -[y \log(\hat{y}) + (1-y) \log(1-\hat{y})]여기서 yy는 실제 클래스(0 또는 1), y^\hat{y}는 모델이 예측한 클래스의 확률입니다.
- 특징:
- 이진 분류 모델에서 주로 사용됩니다.
- 각 클래스에 대한 확률을 고려하여 손실을 계산합니다.
교차 엔트로피 손실 (Cross Entropy Loss)
- 정의: 교차 엔트로피 손실은 주로 분류 문제에서 사용되며, 실제 타겟과 예측한 확률 분포 간의 차이를 측정합니다.Cross Entropy Loss=−∑iyilog(y^i)\text{Cross Entropy Loss} = -\sum_{i} y_i \log(\hat{y}_i)여기서 yiy_i는 실제 클래스에 대한 one-hot 벡터, y^i\hat{y}_i는 모델이 예측한 클래스 확률입니다.
- 특징:
- 다중 클래스 분류 문제에서 주로 사용됩니다.
- 모델이 예측한 확률 분포와 실제 분포 사이의 차이를 최소화하도록 학습합니다.
평균 제곱 오차 (Mean Squared Error, MSE)
- 정의: 평균 제곱 오차는 예측값과 실제값 간의 제곱 오차의 평균입니다.MSE=1n∑i=1n(yi−y^i)2\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2여기서 yiy_i는 실제 값, y^i\hat{y}_i는 예측 값입니다.
- 특징:
- 연속형 변수를 예측하는 회귀 문제에서 주로 사용됩니다.
- 제곱 오차를 사용하여 오차의 크기를 크게 penalize합니다.
로컬 미니멈 탈출
로컬 미니멈에서 벗어나기 위한 가장 적절한 방법은 "모멘텀 사용"입니다.
모멘텀은 경사 하강법의 한 변형으로, 기본 경사 하강법보다 더욱 효과적으로 로컬 미니멈을 벗어날 수 있도록 도와줍니다. 모멘텀은 현재의 기울기 값뿐만 아니라 이전 시점의 이동 방향도 고려하여 갱신 방향을 결정하는 방법입니다. 이전의 이동 방향을 일종의 관성으로 활용하여, 지역적인 최솟값에 갇히지 않고 전역적인 최솟값을 향해 더 빠르게 수렴할 수 있습니다.
- 학습률 증가: 일정 범위 내에서 학습률을 조정하는 것은 경사 하강법의 수렴 속도를 조절할 수 있지만, 지역 최솟값에 갇히는 문제를 해결하는 데 직접적으로 도움을 주지는 않습니다.
Bottleneck architecture
Bottleneck architecture"는 주로 딥 러닝 모델에서 메모리 및 연산 비용을 줄이기 위한 효율적인 설계 패턴을 말합니다. 주로 컨볼루션 신경망(Convolutional Neural Network, CNN)에서 사용되며, 주로 ResNet(Residual Network) 등에서 사용되는 개념입니다.
일반적으로 Bottleneck architecture는 다음과 같은 구성을 가집니다:
- 1x1 Convolution Layer: 매우 작은 필터 크기(예: 1x1)를 사용하여 입력의 채널 수를 줄이거나 확장합니다. 이는 차원 축소 및 확장을 통해 연산 비용을 줄이고 모델의 표현력을 높이는 데 도움을 줍니다.
- 3x3 Convolution Layer: 일반적으로 1x1 컨볼루션 다음에 사용되며, 3x3 필터를 사용하여 특징 맵을 처리합니다. 이 단계에서는 공간적인 정보를 처리하고 채널 간 상호작용을 강화합니다.
- 1x1 Convolution Layer (다시): 다시 한 번 1x1 필터를 사용하여 채널 수를 줄이거나 확장합니다. 이는 최종 출력의 채널 수를 조정하거나 다음 레이어로 전달하기 전에 필요한 채널 수를 맞추는 데 사용됩니다.
이 구조는 큰 모델에서 많은 파라미터와 계산 비용을 줄이는 데 도움이 되며, ResNet 등에서는 특히 깊은 네트워크를 구성할 때 사용됩니다. Bottleneck architecture의 핵심 아이디어는 1x1 컨볼루션을 사용하여 차원 축소를 수행하고, 3x3 컨볼루션을 통해 공간적 정보를 처리하는 것입니다.
Fully Convolutional Network
Fully Convolutional Network (FCN)은 컴퓨터 비전에서 주로 사용되는 신경망 구조로, 입력 이미지의 크기에 상관없이 작동할 수 있는 네트워크입니다. FCN은 주로 시맨틱 세그멘테이션(semantic segmentation)과 같은 픽셀 수준의 작업에 적합합니다.
- 전체적으로 합성곱 계층 사용: FCN은 일반적으로 일반적인 완전 연결 레이어(fully connected layers) 대신에 전체적으로 합성곱(Convolutional) 레이어를 사용합니다. 이러한 합성곱 레이어는 입력 이미지의 공간 구조를 유지하면서 특징을 추출할 수 있습니다.
- 업샘플링: 일반적으로 FCN은 업샘플링(upsampling) 레이어를 사용하여 최종 출력을 원하는 해상도로 확장합니다. 업샘플링은 저해상도 입력을 고해상도 출력으로 변환하는 데 사용됩니다. 대표적인 업샘플링 기법으로는 역합성곱(Transposed Convolution)이나 언풀링(Unpooling) 등이 있습니다.
- 스킵 연결(skip connections): FCN에서는 종종 스킵 연결을 사용하여, 얕은 레이어에서 추출된 고해상도 정보를 더 깊은 레이어에서의 저해상도 정보와 결합합니다. 이를 통해 네트워크는 지역적인 정보와 전역적인 정보를 동시에 고려할 수 있습니다.
Deconvolution
"Deconvolution"은 업샘플링(up-sampling)을 수행하는 합성곱 연산의 역과정 (그렇다고 역 연산은 아님)을 말합니다. 특히 이미지 처리에서는 업샘플링 과정에서 사용되며, 주로 이미지 분할(segmentation) 및 객체 검출(object detection)과 같은 작업에서 유용하게 쓰입니다.
- 업샘플링 방법: Deconvolution은 업샘플링을 위해 일반적으로 사용됩니다. 업샘플링은 입력의 공간 구조를 유지하면서 해상도를 높이는 과정을 의미합니다. 이를 통해 모델은 더 높은 해상도에서도 객체 경계를 더 정확하게 분리하거나 물체를 더 세밀하게 인식할 수 있습니다.
- Deconvolution의 구체적인 동작: Deconvolution은 합성곱 연산의 역과정으로 설명될 수 있습니다. 보통 이 과정은 패딩(padding)과 스트라이드(stride)를 조정하여 입력의 크기를 확장합니다. 업샘플링을 위해 일반적으로 사용되는 대표적인 Deconvolution 방법은 역합성곱(Transposed Convolution)입니다.
- 역합성곱(Transposed Convolution): 역합성곱은 일반 합성곱 연산의 역과정을 수행합니다. 일반 합성곱 연산에서는 입력과 커널 사이의 내적을 계산하여 출력을 생성합니다. 반면 역합성곱은 출력과 커널을 이용하여 입력을 추정합니다. 이 과정에서 패딩과 스트라이드를 조정하여 원하는 업샘플링 효과를 얻을 수 있습니다.
- Deconvolution의 응용: Deconvolution은 주로 FCN(Fully Convolutional Network)에서 시맨틱 세그멘테이션과 같은 작업에 사용됩니다. FCN은 특정 픽셀의 클래스를 예측하는 데 사용되며, Deconvolution은 출력을 원래 입력 이미지의 크기로 확장하여 객체 경계를 더 정확하게 예측하는 데 도움을 줍니다.
1. Sequential Model (순차 모델)
- 개념: Sequential 모델은 각 레이어가 순차적으로 연결된 신경망 구조입니다. 입력은 첫 번째 레이어로 들어가고, 순서대로 각 레이어에서 연산을 거친 후 최종 출력을 얻습니다.
- 활용: 주로 간단한 순차 데이터, 예를 들어 텍스트 분류나 이미지 분류와 같은 작업에 사용됩니다. 주로 CNN(Convolutional Neural Network)과 결합하여 이미지 분류 문제에 많이 쓰입니다.
2. RNN (Recurrent Neural Network, 순환 신경망)
- 개념: RNN은 순차적인 데이터 처리에 특화된 신경망 구조입니다. 각 시간 단계(time step)마다 이전 단계의 출력이 다음 단계의 입력으로 들어갑니다. 이는 반복적인 구조를 가지며, 내부에 순환하는(recurrent) 구조를 가지고 있습니다.
- 특징: 장기 의존성(Long-term dependencies)을 학습할 수 있지만, 긴 시퀀스에서는 그래디언트 소실(vanishing gradient) 문제가 발생할 수 있습니다.
- 활용: 자연어 처리(NLP)에서 문장 생성, 번역, 감정 분석 등의 다양한 시퀀스 예측 작업에 널리 사용됩니다.
3. LSTM (Long Short-Term Memory, 장단기 메모리)
- 개념: LSTM은 RNN의 한 종류로, 장기 의존성 문제를 해결하기 위해 고안되었습니다. 기본 RNN의 단점을 보완하여 정보를 긴 시퀀스 동안 효과적으로 유지할 수 있도록 설계되었습니다.
- 특징: LSTM 셀은 입력 게이트, 삭제 게이트, 출력 게이트 등의 메커니즘을 사용하여 정보의 흐름을 제어합니다. 이로 인해 긴 시퀀스에서도 그래디언트 소실 문제를 줄이고 장기 의존성을 학습할 수 있습니다.
- 활용: 주로 RNN 대신 LSTM을 사용하여 복잡한 시퀀스 모델링 문제를 해결하며, 자연어 처리와 시계열 데이터 분석에서 많이 쓰입니다.
4. Transformer
- 개념: Transformer는 2017년에 소개된 딥 러닝 모델로, RNN과 LSTM을 대체할 수 있는 구조입니다. 기존의 순차적인 처리 대신, 자가 주의 메커니즘(self-attention mechanism)을 사용하여 입력의 모든 요소를 동시에 처리합니다.
- 특징: 자가 주의 메커니즘은 입력 시퀀스의 각 요소 간의 관계를 학습하고, 각 단어나 위치에 대한 중요성을 동적으로 결정할 수 있습니다. 이로 인해 병렬 처리가 가능하고, 장거리 의존성 문제를 효과적으로 해결할 수 있습니다.
- 활용: 주로 자연어 처리(NLP)에서 번역, 요약, 질문 답변 등의 작업에서 사용되며, 최근에는 컴퓨터 비전에서도 좋은 성능을 보이고 있습니다.
각 모델은 그 자체로 특정한 종류의 데이터와 문제 해결을 위해 설계되었으며, 특정 상황에 맞게 적절한 모델을 선택하는 것이 중요합니다.
5. NADE
NADE (Neural Autoregressive Density Estimator)는 확률 분포를 추정하기 위한 신경망 기반 모델입니다. 주로 생성 모델 중 하나로, 각 입력 변수가 다른 변수들에 의존하는 자기회귀적 구조를 가지고 있습니다.
- 자기회귀적 구조: 각 변수들이 서로에게 의존적인 구조를 가지므로, 복잡한 다변수 확률 분포를 유연하게 모델링할 수 있습니다.
- 학습과 추론의 효율성: 데이터가 순차적으로 처리되므로 학습과 추론 과정에서도 효율적인 처리가 가능합니다.
- 단점: 큰 데이터셋이나 고차원 데이터에 대해서는 계산 복잡도가 증가할 수 있으며, 최신 딥러닝 모델보다 복잡한 구조를 지원하지 않을 수 있습니다.
- NADE는 데이터의 결합 확률 분포를 모델링하기 위한 신경망 기반의 접근법을 사용한다.
6. VAE
Variational Autoencoder (VAE, 변이형 오토인코더)는 생성 모델의 한 종류로, 데이터의 잠재 변수 표현을 학습하는 동시에 데이터를 생성할 수 있는 모델입니다. VAE는 딥러닝과 확률론적 그래픽 모델을 결합하여 확률적 데이터 생성과 인코딩을 가능하게 합니다.
디코더 (Decoder):
- 잠재 변수(z)를 입력으로 받아, 원본 입력 데이터를 재구성하는 확률 분포를 학습합니다.
- 일반적으로는 신경망을 사용하여 잠재 변수를 원본 입력 공간으로 복원합니다.
- VAE는 재구성 손실(reconstruction loss)을 최소화하도록 학습됩니다. 이 손실은 입력 데이터와 디코더의 출력 간의 차이를 측정합니다.
최적화
최적화 기법은 머신 러닝과 딥 러닝에서 모델을 학습시키고 파라미터를 조정하는 데 사용되는 방법론입니다. 여러 최적화 기법이 있지만, 주로 사용되는 몇 가지 기본적인 최적화 기법들을 설명해 보겠습니다.
1. 경사 하강법 (Gradient Descent)
- 개념: 경사 하강법은 최적화 문제에서 목적 함수(손실 함수)의 기울기(경사)를 사용하여 함수의 최솟값을 찾는 방법입니다.
- 동작 원리: 매 단계마다 현재 위치에서의 기울기를 계산하고, 이를 사용하여 다음 단계의 위치를 결정합니다. 최솟값을 향해 점진적으로 이동하면서 최적화를 수행합니다.
- 종류:
- 배치 경사 하강법 (Batch Gradient Descent): 전체 데이터셋을 한 번에 사용하여 기울기를 계산하고 업데이트합니다.
- 미니 배치 경사 하강법 (Mini-batch Gradient Descent): 전체 데이터를 작은 배치로 나누어 각 배치에 대해 기울기를 계산하고 업데이트합니다. 일반적으로 가장 많이 사용됩니다.
- 확률적 경사 하강법 (Stochastic Gradient Descent, SGD): 각 데이터 포인트마다 기울기를 계산하고 업데이트합니다. 배치 크기가 1인 미니 배치 경사 하강법의 특수한 경우입니다.
2. 모멘텀 (Momentum)
- 개념: 모멘텀은 경사 하강법의 변형으로, 이전 업데이트 방향을 고려하여 최적화 과정을 가속화시키는 방법입니다.
- 동작 원리: 기울기 업데이트 시 이전 기울기 업데이트의 일정 비율을 현재 업데이트에 반영합니다. 이전 기울기의 영향을 통해 지역 최솟값에서 빠져나오는 데 도움을 줍니다.
3. 아다그라드 (Adagrad)
- 개념: 아다그라드는 각 매개변수에 맞춤형 학습률을 제공하는 최적화 알고리즘입니다.
- 동작 원리: 각 매개변수의 학습률을 데이터셋에서의 기울기 업데이트의 제곱에 비례하여 조정합니다. 자주 나타나는 매개변수는 학습률을 줄이고, 드물게 나타나는 매개변수는 더 큰 학습률을 사용할 수 있습니다.
4. 알엠에스프롭 (RMSprop)
- 개념: RMSprop은 아다그라드의 단점을 보완하기 위해 개발된 최적화 알고리즘입니다.
- 동작 원리: 기울기 업데이트의 제곱에 대한 이동 평균을 사용하여 학습률을 조정합니다. 이동 평균은 기울기 업데이트의 변동성을 줄이고, 전역 최적점에 더 빠르게 수렴할 수 있습니다.
5. 아담 (Adam)
- 개념: 아담은 Adaptive Moment Estimation의 약자로, RMSprop과 모멘텀을 결합한 최적화 알고리즘입니다.
- 동작 원리: 이동 평균 기반의 적응적 학습률과 모멘텀을 모두 사용하여 매개변수를 업데이트합니다. RMSprop의 이점과 모멘텀의 이점을 동시에 취하면서, 각 매개변수마다 적응적인 학습률을 조절합니다.
선택 기준과 주의 사항:
- 학습률 조정: 최적화 기법을 선택할 때 학습률의 조정이 중요합니다. 학습률이 너무 크면 발산할 수 있고, 너무 작으면 수렴 속도가 느릴 수 있습니다.
- 모델 및 데이터 특성: 최적화 기법의 성능은 모델의 구조와 데이터의 특성에 따라 달라질 수 있습니다. 실험을 통해 최적의 기법을 찾는 것이 중요합니다.
이러한 최적화 기법들은 머신 러닝 모델 학습에서 중요한 역할을 하며, 각각의 특성과 장단점을 고려하여 적절히 선택하는 것이 중요합니다.