오토인코더
오토인코더(Autoencoder)는 비지도 학습(unsupervised learning)에서 많이 사용되는 신경망 구조로, 주로 데이터 압축, 특성 추출, 노이즈 제거 등에서 활용됩니다. 오토인코더는 입력 데이터를 줄인 잠재 공간(latent space)으로 변환했다가 다시 원래의 데이터로 복원하는 과정에서 중요한 특징을 학습합니다.
오토인코더는 입력 데이터를 압축하고 그 압축된 정보를 기반으로 다시 복원하는 방식으로 작동합니다. 이는 데이터의 중요한 특징을 학습해 데이터를 압축하거나 노이즈 제거와 같은 응용에 사용할 수 있습니다.
구조
오토인코더는 크게 두 가지 주요 부분으로 구성됩니다:
인코더(Encoder) -> 인코더는 입력 데이터를 더 작은 차원으로 축소하는 역할을 합니다. 인코더는 일반적으로 여러 개의 뉴런을 가진 여러 층(layer)의 신경망으로 구성되어 있습니다. 각 층에서는 활성화 함수(예: ReLU, Sigmoid)를 통해 비선형 변환을 적용하여 데이터의 중요한 패턴을 추출합니다. 마지막 레이어에서는 입력 데이터를 저차원 공간으로 압축한 잠재 표현 Z가 생성됩니다.
디코더(Decoder) -> 디코더는 인코더에서 얻은 잠재 표현을 다시 원래의 차원으로 복원하는 역할을 합니다. 인코더의 역방향 과정으로 작동하며, 입력 데이터를 복원하기 위한 정보를 학습합니다.
잠재 표현 Z는 디코더의 첫 번째 레이어로 전달됩니다. 각 레이어에서 인코더의 역과정으로 데이터를 변환합니다. 디코더 역시 가중치와 편향을 사용해 데이터를 변환하며, 활성화 함수로 데이터를 비선형적으로 변환합니다. 마지막 레이어에서는 원래 입력 데이터와 유사한 복원된 데이터 𝑋'가 출력됩니다.
기본 개념
오토인코더는 입력 데이터를 압축하고 그 압축된 정보를 기반으로 다시 복원하는 방식으로 작동합니다. 이는 데이터의 중요한 특징을 학습해 데이터를 압축하거나 노이즈 제거와 같은 응용에 사용할 수 있습니다.
1. 입력(X): 오토인코더에 제공되는 원본 데이터.
2. 인코더(Encoder): 입력 데이터를 낮은 차원의 잠재 공간으로 압축하는 과정.
3. 잠재 표현(latent space, Z): 압축된 데이터 표현으로, 입력 데이터의 중요한 정보를 담고 있는 공간.
4. 디코더(Decoder): 잠재 표현을 원래의 입력 데이터로 복원하는 과정.
5. 출력(X'): 디코더에서 복원된 데이터로, 원래의 입력 데이터와 유사해야 함.
목표:
오토인코더의 최종 목표는 입력과 출력 사이의 차이를 최소화하는 것, 즉 입력 데이터와 출력 데이터가 최대한 동일해지도록 학습하는 것입니다. 이는 손실 함수를 통해 평가되며, 주로 평균 제곱 오차(MSE, Mean Squared Error)가 사용됩니다.
학습 과정
1. 손실 함수 (Loss Function) -> 오토인코더는 원본 입력 데이터 X와 복원된 데이터 𝑋′ 사이의 차이를 최소화하기 위해 손실 함수를 사용합니다. 일반적으로 평균 제곱 오차(MSE)를 사용하며, 이는 두 데이터 간의 차이를 제곱하여 평균을 취한 값입니다. 목표는 이 MSE를 최소화하는 방향으로 학습하는 것입니다.
2. 역전파 (Backpropagation) -> 오토인코더의 학습 과정은 일반적인 신경망과 마찬가지로 역전파(backpropagation)를 사용해 각 레이어의 가중치와 편향을 업데이트합니다. 입력과 출력 사이의 손실을 최소화하는 방향으로 가중치가 조정됩니다.
다양한 유형
딥 오토인코더(Deep Autoencoder): 간단히 말해, 딥러닝에서 쓰는 오토인코더를 딥 오토인코더라 부릅니다.
변분 오토인코더(Variational Autoencoder, VAE): 변분 오토인코더는 잠재 공간에서 데이터의 분포를 학습하여 새로운 데이터를 생성할 수 있는 오토인코더입니다. 이는 생성 모델로 사용될 수 있으며, 잠재 공간을 확률 분포로 모델링하는 것이 특징입니다.
잠재 공간 Z는 평균과 분산으로 표현되며, 학습 과정에서 샘플링하여 새로운 데이터 생성이 가능합니다.
희소 오토인코더(Sparse Autoencoder): 스파스 오토인코더는 잠재 공간의 뉴런 중 일부만 활성화되도록 하는 제약을 추가한 모델입니다. 이는 데이터의 중요한 특징을 더 잘 학습할 수 있도록 돕습니다. 즉, 잠재 공간의 표현을 희소하게 유지하여 중요한 특징만을 학습합니다.
잡음 제거 오토인코더(Denoising Autoencoder): 노이즈 제거 오토인코더는 입력 데이터에 노이즈를 추가한 후, 디코더에서 노이즈를 제거하고 원래의 깨끗한 데이터를 복원하도록 학습하는 모델입니다. 이를 통해 모델은 데이터의 본질적인 특징을 더 강력하게 학습할 수 있습니다.
생성형 모델(GAN(Generative Adversarial Network), VAE(Variational Autoencoder))
생성형 모델 중 GAN(Generative Adversarial Network)은 생성자(Generator)와 판별자(Discriminator)간의 경쟁을 통해 데이터를 생성하는 방식입니다.
생성자(Generator): 랜덤한 노이즈를 입력받아, 이를 통해 진짜와 유사한 데이터를 생성하려고 합니다.
판별자(Discriminator): 실제 데이터와 생성자가 만든 가짜 데이터를 구별하는 역할을 합니다. 판별자는 생성자가 만든 데이터를 가짜로 분류하고, 실제 데이터를 진짜로 분류하는 능력을 학습합니다.
GAN의 목표는 생성자가 판별자를 속여 가짜 데이터를 진짜처럼 보이게 만드는 것입니다.
이를 위해 두 신경망은 서로 경쟁하면서 성능을 개선합니다.
생성자는 점점 더 실제 데이터와 유사한 가짜 데이터를 만들기 위해 학습합니다.
판별자는 실제 데이터와 생성자가 만든 가짜 데이터를 더 잘 구별하도록 학습합니다.
이러한 과정이 반복되면, 생성자는 판별자가 구별할 수 없을 정도로 진짜 같은 데이터를 생성할 수 있게 됩니다.
구조
GAN은 다음과 같은 두 주요 신경망으로 구성됩니다.
생성자(Generator): 가짜 데이터를 생성하는 모델
판별자(Discriminator): 생성된 데이터가 진짜인지 가짜인지 구별하는 모델
1. 생성자(Generator): 생성자는 주로 완전 연결 신경망(Fully Connected Neural Network) 또는 컨볼루션 신경망(Convolutional Neural Network, CNN)으로 구성되며, 입력으로 노이즈 벡터를 받아들입니다. 이 노이즈 벡터는 고차원 공간에서 샘플링된 랜덤한 값으로, 이를 통해 새로운 가짜 데이터를 생성합니다.
입력: 노이즈 벡터 z (랜덤 값)
출력: 가짜 데이터 G(z)
생성자의 역할은 노이즈 벡터를 실제 데이터와 구별할 수 없을 정도로 유사하게 만드는 것입니다. 예를 들어, 이미지 생성 GAN에서는 노이즈를 입력받아 실제 이미지와 비슷한 가짜 이미지를 생성합니다.
생성자는 판별자가 더 이상 가짜를 잘 구별하지 못하도록 계속해서 업데이트됩니다.
2. 판별자(Discriminator): 판별자는 일반적으로 신경망 분류기로 구성되며, 입력으로 데이터(실제 또는 생성된 데이터)를 받아들여 그 데이터가 진짜인지 가짜인지를 구별하는 역할을 합니다.
입력: 실제 데이터 x 또는 생성된 데이터 G(z)
출력: 진짜 데이터일 확률 D(x) (0에서 1 사이의 값)
판별자는 생성자가 만든 가짜 데이터를 최대한 잘 구별하도록 학습됩니다. GAN 학습 초기에는 판별자가 생성자의 가짜 데이터를 쉽게 구별할 수 있지만, 시간이 지나면 생성자가 점점 더 진짜 같은 데이터를 만들기 때문에 판별자의 구별 능력이 어려워집니다.
과정
GAN의 학습 과정은 생성자와 판별자가 교대로 학습하는 방식으로 이루어집니다. 먼저 판별자가 진짜와 가짜 데이터를 구별할 수 있도록 학습한 뒤, 생성자가 판별자를 속이도록 학습하는 과정을 반복합니다.
1. 손실 함수 (Loss Function) -> GAN에서 사용되는 손실 함수는 미니맥스 게임(minimax game) 형태로 정의됩니다.
D(x)는 판별자가 입력 데이터 x를 진짜로 분류할 확률입니다.
D(G(z))는 판별자가 생성자가 만든 데이터 G(z)를 진짜로 분류할 확률입니다.
pdata(x)는 실제 데이터의 분포입니다.
Pz(z)는 노이즈 벡터 z의 분포입니다.
이 수식에서 판별자 D는 진짜 데이터를 진짜로, 가짜 데이터를 가짜로 분류하도록 학습됩니다. 판별자는 위 수식을 최대화하려고 합니다.
GAN의 학습은 다음 두 단계로 진행됩니다.
판별자 학습: 먼저 판별자가 진짜 데이터를 진짜로, 가짜 데이터를 가짜로 분류할 수 있도록 학습합니다. 이 과정에서 생성자가 만든 가짜 데이터 G(z)와 실제 데이터를 모두 사용합니다.
생성자 학습: 생성자는 판별자를 속이기 위해 가짜 데이터를 만들도록 학습됩니다. 생성자가 학습되는 동안 판별자는 고정되어 있으며, 생성자는 판별자의 오차를 기반으로 학습합니다.
이 두 과정이 교대로 반복되면서, 생성자는 점점 더 진짜 같은 데이터를 만들고, 판별자는 그런 데이터를 구별하기 어려워지도록 발전합니다.
모델
1. CGAN (Conditional GAN)
Conditional GAN은 생성자가 데이터를 생성할 때 조건부 입력을 추가로 제공받는 방식입니다. 예를 들어, 이미지 생성 시 특정 클래스(예: 고양이, 강아지 등)를 조건으로 지정하여 해당 클래스의 이미지를 생성할 수 있습니다.
2. UGAN (Unconditional GAN)
은 조건 없이 데이터를 생성하는 기본 GAN구조를 말합니다. 이는 특정 조건이나 정보를 기반으로 데이터를 생성하는 Conditional GAN(CGAN)과 달리, 입력에 대해 어떠한 제약도 없는 방식으로 데이터를 생성합니다.
3. DCGAN (Deep Convolutional GAN)
DCGAN은 컨볼루션 신경망(CNN)을 기반으로 한 GAN으로, 주로 이미지 생성에서 뛰어난 성능을 보입니다. CNN을 사용해 더 깊고 복잡한 모델을 구성할 수 있으며, 고해상도의 이미지를 생성할 수 있습니다.
4. WGAN (Wasserstein GAN)
WGAN은 Wasserstein 거리라는 개념을 도입하여, GAN의 학습 안정성을 개선한 모델입니다. 기본 GAN의 불안정한 학습 과정을 개선하며, 생성자와 판별자가 균형 있게 발전하도록 돕습니다.
5. StyleGAN
StyleGAN은 이미지의 스타일을 조절할 수 있는 GAN 모델로, 고해상도의 얼굴 이미지 생성에서 뛰어난 성능을 보입니다. 다양한 스타일 요소를 제어할 수 있어 이미지 생성의 품질이 매우 높습니다.
VAE
변분 오토인코더(VAE, Variational Autoencoder)는 확률적이고 생성적인 딥러닝 모델로, 주로 이미지 생성, 데이터 압축, 이상 탐지 등 다양한 문제에 사용됩니다. VAE는 오토인코더(Autoencoder)의 한 종류이지만, 확률 분포를 학습하는 특성을 가지고 있어 새로운 데이터를 생성하는 데 탁월합니다.
기본 오토인코더 vs 변분 오토인코더 (VAE)
기본 오토인코더
기본 오토인코더는 입력 데이터를 압축하고 다시 복원하는 비확률적 모델입니다. 이는 인코더와 디코더로 이루어져 있으며, 데이터에서 중요한 특징만을 추출하는 잠재 공간(latent space)을 학습합니다.
인코더: 입력 데이터를 압축하여 잠재 벡터로 변환.
디코더: 잠재 벡터를 다시 원래 데이터로 복원.
오토인코더(VAE)
오토인코더는 특정한 입력 데이터를 압축하는 데 최적화되기 때문에, 새로운 데이터 생성이 어려운 단점이 있습니다. 이런 문제를 해결하기 위해 확률 분포를 활용한 VAE가 등장했습니다.
구조
VAE는 기본 오토인코더와 비슷하지만, 잠재 공간을 확률적 분포로 표현하는 것이 가장 큰 차이점입니다. 이를 통해 새로운 데이터를 생성할 수 있습니다. VAE의 구조는 크게 세 가지로 나뉩니다:
인코더(Encoder): 입력 데이터를 잠재 변수 z의 확률 분포로 변환합니다. 이때 잠재 변수가 단일 값이 아니라 평균(μ)과 분산(σ^2)을 포함한 정규 분포로 표현됩니다.
잠재 공간(Sampling & Latent Space): 인코더에서 학습한 정규 분포에서 잠재 벡터 z를 샘플링합니다. 이는 데이터가 확률적 분포를 따르게 만들어, 새로운 데이터를 샘플링할 수 있도록 돕습니다.
디코더(Decoder): 샘플링한 잠재 벡터 z를 입력으로 받아 원래 데이터와 유사한 데이터를 복원합니다.
과정
인코딩(Encoding): 입력 데이터 x를 인코더에 넣고, 잠재 분포의 평균 μ와 분산 σ^2를 구합니다.
샘플링(Sampling): 잠재 분포에서 샘플링을 통해 잠재 벡터 z를 생성합니다. 리파라미터화 트릭을 사용하여 샘플링 과정을 미분 가능하게 합니다.
디코딩(Decoding): 샘플링한 z를 디코더에 넣어 원래 데이터 x와 유사한 데이터를 복원합니다.
손실 계산: 재구성 손실과 KL 발산을 합한 총 손실을 계산합니다.
최적화: 역전파를 통해 손실을 최소화하면서 모델을 학습시킵니다.
전이학습
전이 학습(Transfer Learning)은 기존에 학습된 모델이나 지식을 새로운 문제에 재사용하는 기법입니다. 특히 딥러닝에서, 모델을 처음부터 학습시키는 데는 많은 데이터와 시간이 필요하기 때문에, 이미 훈련된 모델을 기반으로 새롭게 학습하는 방식이 매우 유용합니다.
전이 학습의 기본 아이디어
전이 학습은 다음과 같은 아이디어를 기반으로 합니다:
1. 기존 학습된 모델이 학습한 지식을 새로운 문제에 적용할 수 있다.
2. 일반적으로, 첫 번째 모델이 대규모 데이터셋에서 학습되었고, 그 학습된 지식(특징들)이 새로운 작은 데이터셋에도 잘 맞을 가능성이 높다.
예를 들어, 대규모 이미지 데이터셋(예: ImageNet)에서 학습된 CNN(Convolutional Neural Network) 모델은 다양한 일반적인 패턴과 특징(선, 모양, 색상 등)을 이미 학습하고 있기 때문에, 이 모델을 미세 조정(Fine-tuning)하여 다른 이미지 분류 작업에 쉽게 사용할 수 있습니다.
주요 단계
1. 사전 훈련된 모델 사용: 일반적으로 대규모 데이터셋에서 이미 훈련된 모델을 가져옵니다. 예를 들어, VGG, ResNet, Inception 등의 이미지 처리 모델들은 ImageNet에서 학습된 사전 훈련된 모델을 제공합니다.
기존 모델의 일부 또는 전체를 재사용: 모델의 하위층(주로 저수준의 특징을 학습한 층)을 재사용하고, 상위층(특정 문제에 맞는 부분)을 새롭게 학습할 수 있습니다. 아래 두 가지 방식이 있습니다.
2.1 특징 추출(Feature Extraction): 사전 학습된 모델의 가중치를 고정한 상태에서, 모델의 상위층만 새로운 데이터에 맞게 학습시킵니다.
2.2 미세 조정(Fine-tuning): 사전 학습된 모델의 일부 또는 전체 가중치를 다시 학습시킵니다. 하위층의 일부는 그대로 두고 상위층만 학습할 수도 있고, 전체 가중치를 조정할 수도 있습니다.
3. 새로운 데이터셋으로 학습: 새로운 작업에 맞는 데이터셋으로 모델을 학습시키되, 대규모 학습 없이도 빠르게 수렴할 수 있습니다.
과적합 방지 기법
일반적으로 과적합이란, 모델이 훈련 데이터에 지나치게 맞춰져서 새로운 데이터에 대한 일반화 성능이 떨어지는 것을 의미합니다.
그중에, 정규화(Normalization)가 있습니다. 하지만 문제는 정규화(Regularization)라는 또 다른 개념이 있습니다. 이 둘은 완전히 다른 개체임과 동시에, 서로 같이 쓰입니다. 예를 들아, 정규화(Normalization)한 후, 과적합을 방지하기 위해 정규화(Regularization)를 시행하는 것입니다. 사실 정규화(Regularization)가 모델의 과적합을 방지는것이 맞습니다. 하지만 정규화 (Normalization)도, 데이터의 스케일을 조정하여 학습 안정성 향상시킴으로 써 과적합을 방지하는 개념도 존재합니다. 조금 더 깊게 들어가자면,
정규화(Regularization)는 과적합을 방지하기 위한 기법으로, 과적합으로부터 성능이 떨어지는 것을 방지하기 위해 사용이 됩니다. 과적합은 모델이 훈련 데이터의 노이즈나 세부적인 패턴까지 학습하는 현상인데, 정규화는 이러한 현상을 방지하여 일반화 능력을 향상시키는 중요한 역할을 합니다.
정규화(Regularization)는 주로 모델의 복잡도를 제한하거나, 모델의 가중치(weight)에 대한 제약을 추가하여, 학습된 모델이 지나치게 복잡해지지 않도록 하는 방식으로 작동합니다. 대표적인 정규화 기법으로는 L1 정규화(Lasso)와 L2 정규화(Ridge)가 있습니다.
그리고 정규화(Normalization)는 데이터의 범위나 분포를 조정하는 기법입니다. 이는 데이터가 모델에 입력되기 전에 스케일을 조정하여 각 특성의 값들이 일정한 범위 내에 들어가도록 하는 방법입니다. 특성의 값들이 너무 크거나 작으면 모델의 학습에 불균형을 초래할 수 있기 때문에, 이를 조정하여 학습을 안정적으로 진행하도록 돕습니다.
대표적인 목적으로는,
데이터 스케일 조정: 각 특성의 값을 같은 범위로 조정하여 모델이 각 특성에 균형 있게 학습하도록 합니다.
빠른 수렴: 모델의 학습이 더 빠르게 진행될 수 있으며, 경사하강법 등의 알고리즘 성능을 향상시킵니다.
대표적인 정규화 방법으로는,
Min-Max 정규화: 데이터의 값을 0과 1 사이의 범위로 변환.
Z-Score 정규화 (표준화, Standardization): 데이터의 평균을 0, 표준편차를 1로 맞춰서 분포를 조정.
정규화(Normalization)
하지만 이번에 알아야 할 것은 정규화(Normalization)입니다.
정규화의 기법들로는 배치 정규화(Batch Normalization) 와 레이어 정규화(Layer Normalization)가 있습니다. 이 둘은 딥러닝 모델의 학습 속도와 안정성을 높이기 위해 개발된 기법입니다. 이들은 특히 신경망이 깊어질수록 발생할 수 있는 기울기 소실 문제를 완화하고, 훈련 속도를 개선하는 데 효과적입니다.
1. 배치 정규화(Batch Normalization): 배치 정규화(Batch Normalization)는 딥러닝 모델의 각 레이어를 통과할 때, 해당 레이어의 입력 값들을 미니배치 단위로 평균과 분산을 이용해 정규화하는 기법입니다. 이는 신경망의 중간층에 정규화를 적용하여 각 층에서 데이터 분포가 일정하게 유지되도록 합니다.
배치 정규화의 목적:
기울기 소실 방지: 각 레이어의 입력 분포를 일정하게 유지하여, 역전파 시 기울기 값이 너무 작아지는 문제를 완화.
훈련 속도 향상: 데이터 분포가 일정해지면 학습 속도가 빨라져 학습 초반에 높은 학습률을 사용할 수 있습니다.
일반화 성능 개선: 데이터 분포의 변동이 줄어들어 과적합을 방지하는 효과가 있습니다.
배치 정규화 과정
1. 평균과 분산 계산: 미니배치에서 각 입력값의 평균과 분산을 계산.
2. 정규화: 각 데이터에서 평균을 빼고, 분산으로 나누어 표준 정규분포에 가깝게 만듭니다.
3. 스케일 및 이동: 정규화된 값에 가중치와 편향을 추가하여 모델이 학습할 수 있도록 조정합니다.
2. 레이어 정규화 (Layer Normalization): 레이어 정규화(Layer Normalization)는 레이어 단위로 정규화하는 방식으로, 입력 데이터의 각 특성들이 레이어를 거쳐 나올 때마다 그 분포를 정규화하는 기법입니다. 배치 정규화와 달리 미니배치가 아닌 각 샘플을 기준으로 하여 평균과 분산을 계산합니다.
레이어 정규화의 목적:
입력 배치 크기 독립성: 각 샘플별로 계산하기 때문에, 미니배치 크기에 영향을 받지 않습니다.
순환 신경망(RNN)에서 유용: 순환 신경망처럼 시간 단계마다 데이터 배치 크기가 달라질 수 있는 경우 배치 정규화보다 적합합니다.
레이어 정규화 과정
특성별 평균과 분산 계산: 각 샘플에서 모든 특성의 평균과 분산을 계산.
정규화: 샘플의 평균과 분산을 사용하여 정규화합니다.
스케일 및 이동: 배치 정규화와 유사하게 스케일(γ)과 이동(β) 매개변수를 적용하여 모델이 학습할 수 있는 분포로 조정합니다.
드롭 아웃
드롭아웃(Dropout)은 딥러닝에서 과적합(overfitting)을 방지하는 정규화 기법 중 하나입니다.
드롭아웃은 훈련 중 신경망의 일부 뉴런을 랜덤하게 비활성화하여 네트워크가 특정 뉴런이나 패턴에 의존하지 않도록 합니다. 각 학습 단계에서 뉴런을 제거하여 여러 서로 다른 부분 집합의 뉴런들로 학습을 진행하는 효과가 생기며, 이는 마치 여러 작은 네트워크가 학습되는 것과 비슷한 역할을 합니다.
테스트나 예측 과정에서는 드롭아웃을 사용하지 않고, 모든 뉴런이 활성화된 상태로 예측을 수행합니다. 훈련 중 드롭아웃에 의해 비활성화된 뉴런들이 다시 활성화되므로 테스트 중에 안정적인 성능을 유지할 수 있습니다.
방식
1. 훈련(학습) 중 무작위로 뉴런 제거:
매 학습 스텝마다 드롭아웃이 적용된 레이어의 뉴런 중 일부를 비활성화합니다.
비활성화된 뉴런은 해당 스텝 동안 입력을 받아도 출력하지 않으므로, 가중치 업데이트에 영향을 주지 않습니다.
2. 테스트(평가) 시에는 모든 뉴런 활성화:
드롭아웃은 훈련에만 적용되며, 테스트나 실제 예측 시에는 모든 뉴런을 사용합니다.
테스트 시 드롭아웃 비율만큼 출력을 조정하여, 훈련 때의 비활성화 비율을 반영해줍니다.
조기 종료와 데이터 증강
조기 종료는 훈련 과정에서 모델이 더 이상 성능이 개선되지 않으면, 훈련을 중단하는 방법입니다. 딥러닝 모델이 과도하게 학습되면 학습 데이터에만 적합하고 새로운 데이터에는 제대로 일반화하지 못하는 과적합 문제가 발생합니다. 조기 종료는 이러한 과적합을 방지합니다.
원리
1. 훈련과 검증 손실(Validation Loss) 추적:
모델 훈련 시 각 에포크(epoch)에서 훈련 데이터와 검증 데이터의 손실을 계산합니다.
2. 손실의 변화 감지:
특정 에포크 이후 검증 손실이 더 이상 감소하지 않으면 모델이 과적합될 가능성이 있다고 판단합니다. 예를 들어, 검증 손실이 연속적으로 증가하거나 줄어들지 않으면 학습을 멈춥니다.
3. 조기 종료 조건:
일반적으로 기다리는 에포크 수(patience)를 설정하여, 성능이 개선되지 않더라도 잠시 대기할 시간을 둡니다. 성능이 다시 개선되지 않으면 훈련을 종료합니다.
데이터 증강
데이터 증강은 기존 학습 데이터를 다양하게 변형하여 학습 데이터셋의 크기를 늘리는 방법입니다. 실제로 수집된 데이터가 부족할 때, 새로운 이미지를 직접 찍거나 수집하지 않고 데이터의 다양한 변형을 통해 데이터셋을 인위적으로 확장합니다. 이는 모델이 다양한 상황을 학습하게 하여 일반화 성능을 높입니다.
기법
데이터 증강 기법으로는 이미지 회전, 이동, 뒤집기, 확대, 밝기 조절 등이 있습니다. 각 이미지에 랜덤하게 이러한 변형을 가해 데이터의 양과 다양성을 높입니다.
회전(Rotation): 이미지를 특정 각도로 회전하여 다양한 각도에서 학습하게 합니다.
이동(Translation): 이미지를 좌우나 상하로 이동시켜 위치 변화에 따른 학습을 돕습니다.
뒤집기(Flipping): 이미지를 좌우나 상하로 뒤집어 서로 다른 시각적 변형을 학습하게 합니다.
확대(Zooming): 이미지를 확대하거나 축소하여 모델이 여러 크기에서 물체를 인식하도록 합니다.
밝기 조절(Brightness Adjustment): 이미지의 밝기를 조절하여 다양한 조명 상황을 학습할 수 있게 합니다.
요약하면, 조기 종료는 훈련을 최적 시점에 중단하여 과적합을 방지하는 방식으로, 모델의 일반화 성능을 높입니다. 데이터 증강은 데이터의 다양성을 증가시켜 모델이 더 많은 상황을 학습할 수 있게 합니다.
하이퍼파라미터 튜닝
하이퍼파라미터 튜닝(Hyperparameter Tuning)은 머신 러닝 모델의 성능을 최적화하기 위해 여러 하이퍼파라미터의 값을 조정하는 과정입니다. 하이퍼파라미터는 모델 훈련 전 설정되는 매개변수로, 모델이 학습을 통해 직접 조정하는 가중치와는 달리, 학습에 영향을 미치는 고정된 값들입니다. 하이퍼파라미터는 최적화되지 않으면 모델의 성능이 저하될 수 있으므로 모델이 가진 잠재적 성능을 최대한 발휘하기 위해서 튜닝이 중요합니다.
하이퍼파라미터는 모델의 유형, 목적에 따라 다양합니다. 예를 들어:
신경망에서:
학습률 (learning rate)
배치 크기 (batch size)
에포크 수 (epochs)
은닉층 개수 및 노드 수
드롭아웃 비율 (dropout rate)
의사결정 나무에서:
최대 깊이 (max depth)
분할 기준 (split criterion)
최소 샘플 분할 수 (min samples split)
랜덤 포레스트에서:
트리 개수 (number of trees)
각 트리의 최대 깊이
여기서는 주요 하이퍼파라미터란,
학습률:
모델의 가중치를 업데이트하는 속도를 결정합니다
너무 크면 학습이 불안, 너무 작으면 학습이 느려짐(일반적으로 0.1, 0.01, 0.001 등의 값으로 시도 가능).
배치크기:
배치 크기는 한 번에 업데이트에 사용되는 데이터 샘플의 수를 결정합니다
큰 배치 크기는 학습 속도를 높이지만, 그에 상응하는 메모리 사용량입니다(일반적으로 32, 64, 128 등의 값으로 시도 가능).
에포크 수:
에포크 수는 전체 데이터셋을 몇 번 반복하여 학습할지 결정합니다.
적으면 과소적합, 많으면 과적합이 발생할 수 있습니다(조기 종료를 사용해 적절한 에포크 수 결정할 수 있습니다).
모멘텀:
모멘텀은 이전 기울기를 현재 기울기에 반영하여, 학습속도를 높이고, 진동을 줄입니다(일반적으로 0.9, 0.99등의 값으로 시도 가능).
가중치 초기화:
가중치 초기화는 모델의 가중치를 초기화하는 방법을 결정합니다.
일반적으로 Xavier 초기화, He 초기화를 상용합니다.
방법
하이퍼파라미터 튜닝을 위한 대표적인 방법으로는 그리드 서치(Grid Search)와 랜덤 서치(Random Search)가 있습니다. 최근에는 베이지안 최적화(Bayesian Optimization), 진화 알고리즘 등의 고도화된 방법도 사용됩니다.
1. 그리드 서치 (Grid Search)
그리드 서치는 모든 하이퍼파라미터의 가능한 조합을 탐색하여 최적의 조합을 찾는 방법입니다. 각 하이퍼파라미터의 범위를 정의하고, 가능한 조합을 일일이 비교해 가장 성능이 좋은 조합을 선택합니다.
장점: 모든 조합을 시도하기 때문에 최적 해를 찾을 가능성이 큽니다.
단점: 가능한 모든 조합을 시도하므로 계산 비용이 높아, 파라미터 수가 많아질수록 비효율적입니다.
2. 랜덤 서치 (Random Search)
랜덤 서치는 하이퍼파라미터의 조합 중 일부를 무작위로 선택하여 탐색하는 방법입니다. 그리드 서치와 달리, 전체 조합을 탐색하지 않고 무작위로 샘플링된 일부 조합만 사용하므로 빠르게 최적 조합을 찾을 수 있습니다.
장점: 큰 탐색 공간에서 적은 시간에 최적 또는 근접한 값을 찾을 가능성이 큽니다.
단점: 무작위성이 있으므로 최적 해를 놓칠 수도 있습니다.
3. Bayesian Optimization
Bayesian Optimization은 쉽게 말해서 이전 평가 결과를 바탕으로 다음 평가할 하이퍼파라미터를 선택한다 입니다.
고급 튜닝 기법
1. 베이지안 최적화 (Bayesian Optimization)
베이지안 최적화는 이전 시도들의 결과를 토대로 최적의 하이퍼파라미터를 탐색하는 기법입니다. 예측 모델을 사용해 다음 시도할 후보군을 정하고, 효율적으로 최적 해를 탐색합니다. 계산 비용이 높지 않으면서도 좋은 결과를 기대할 수 있는 방법입니다.
2. 유전 알고리즘 (Genetic Algorithm)
유전 알고리즘은 진화 원리를 기반으로 최적의 하이퍼파라미터 조합을 찾는 방법입니다. 여러 조합 중 성능이 좋은 조합을 교차 및 변이 연산으로 조합해가며 최적화를 수행합니다.
모델 평과와 검증
교차 검증(Cross Validation)은 모델의 성능을 안정적으로 평가하기 위해 데이터를 여러 번 나누어 학습과 검증을 반복하는 기법입니다. 데이터셋을 여러 번 다른 방식으로 나누어 모델의 성능을 여러 번 평가함으로써, 데이터 분할의 차이로 인한 성능 변화나 편향을 줄이고 안정적인 결과를 얻는 것이 목적입니다. 이 방법은 모델의 일반화 성능을 높이는 데도 유용합니다.
필요성
데이터를 학습용과 검증용으로 나누어 모델을 평가할 때, 데이터 분할 방식에 따라 평가 결과가 달라질 수 있습니다. 교차 검증을 통해 데이터셋 전반에 걸쳐 모델 성능을 평가하면, 특정 데이터 분할에서만 발생하는 편향 문제를 줄이고, 더 정확한 성능 평가를 할 수 있습니다.
예를 들어, 단순히 데이터셋의 80%를 학습에, 나머지 20%를 검증에 사용하는 방식(홀드아웃 방식)은 평가 결과가 특정 데이터 분할에 크게 좌우될 수 있습니다. 교차 검증은 이런 문제를 완화하는 데 도움이 됩니다.
K-겹 교차 검증 (K-Fold Cross Validation)
K-겹 교차 검증은 데이터를 K개의 부분집합(폴드)으로 나누어 교차 검증을 수행하는 방법입니다. 전체 데이터셋을 K개의 폴드로 나눈 후, 다음과 같이 검증을 반복합니다:
1. 각 반복에서 하나의 폴드를 검증 데이터로 사용하고, 나머지 K-1개의 폴드를 학습 데이터로 사용합니다.
2. 이 과정을 K번 반복하여, K개의 서로 다른 평가 결과를 얻습니다.
3. K번의 평가 결과를 평균내어 최종 평가 결과로 사용합니다.
예시
만약 K=5라면, 데이터셋을 5개의 폴드로 나누고 다음의 과정을 반복합니다:
1번째 반복: 1번 폴드는 검증 데이터, 2~5번 폴드는 학습 데이터
2번째 반복: 2번 폴드는 검증 데이터, 1, 3~5번 폴드는 학습 데이터
…
5번째 반복: 5번 폴드는 검증 데이터, 1~4번 폴드는 학습 데이터
이렇게 얻은 5개의 평가 결과의 평균이 최종 성능이 됩니다.
계층화 K-겹 교차 검증 (Stratified K-Fold Cross Validation)
계층화 K-겹 교차 검증은 클래스 비율을 일정하게 유지하면서 K개의 폴드로 나누는 방법입니다. 클래스 불균형 문제를 다룰 때 유용합니다.
Leave-One-Out 교차 검증 (LOO)
Leave-One-Out 교차 검증은 데이터셋의 각 데이터 포인트를 검증 데이터로 사용하는 방법입니다. 즉, 학습 데이터에서 하나의 샘플만 검증에 사용하고, 나머지를 학습 데이터로 사용하는 것을 데이터 포인트 수만큼 반복합니다.
장점: 데이터셋의 모든 샘플을 한 번씩 검증 데이터로 사용하기 때문에, 정확한 성능 평가를 기대할 수 있습니다.
단점: 데이터가 많을 경우 계산량이 매우 커집니다.
모델 구축 및 학습 - 기본 모델 구축
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.layer1 = nn.Linear(10, 20)
def forward(self, x):
x = self.layer1(x)
return x
torch.nn.Module: 모든 신경망 모델의 기본 클래스입니다.
먼저 __init__함수에 들어가는 모든 것들을 구조를 만듭니다.
그리고 foward를 통해서 데이터가 어떻게 흘러갈 지 정리하게 됩니다.
손실 함수
torch.nn.CrossEntropyLoss: 분류 문제에 주로 사용됩니다.
loss_fn = nn.CrossEntropyLoss()
torch.nn.MSELoss: 회귀 문제에 주로 사용됩니다.
loss_fn = nn.MSELoss()
최적화 알고리즘
torch.optim.SGD: 확률적 경사 하강법 최적화 알고리즘입니다.
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
model.parameters()를 learning rate을 0.01로 SGD를 사용해 최적화한다 라는 뜻
torch.optim.Adam: Adam 최적화 알고리즘입니다.
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
데이터 로드 및 전처리 - 기본 모델 구축
torch.utils.data.Dataset: 사용자 정의 데이터셋을 만들기 위한 기본 클래스입니다.
from torch.utils.data import Dataset
class MyDataset(Dataset):
def __init__(self, data, targets):
self.data = data
self.targets = targets
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
return self.data[idx], self.targets[idx]
torch.utils.data.DataLoader: 미니 배치 학습을 위한 데이터 로더입니다.
from torch.utils.data import DataLoader
dataset = MyDataset(data, targets)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
데이터 변환
torchvision.transforms: 이미지 데이터 변환을 위한 유틸리티입니다.
from torchvision import transforms
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
GPU 사용 - GPU 설정 및 텐서 이동
모델을 GPU로 이동
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
텐서를 GPU로 이동
inputs, targets = inputs.to(device), targets.to(device)
모델 기법별 API - 합성곱 신경망 CNN
torch.nn.Conv2d: 2D 합성곱 레이어입니다.
conv_layer = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, stride=1, padding=1)
순환 신경망 (RNN)
torch.nn.RNN: 기본 순환 신경망 레이어입니다.
rnn_layer = nn.RNN(input_size=10, hidden_size=20, num_layers=2, batch_first=True)
torch.nn.LSTM: LSTM 레이어입니다.
lstm_layer = nn.LSTM(input_size=10, hidden_size=20, num_layers=2, batch_first=True)
torch.nn.GRU: GRU 레이어입니다.
gru_layer = nn.GRU(input_size=10, hidden_size=20, num_layers=2, batch_first=True)
트랜스포머 (Transformer)
torch.nn.Transformer: 트랜스포머 모델입니다.
transformer_model = nn.Transformer(nhead=8, num_encoder_layers=6)
torch.nn.TransformerEncoderLayer: 트랜스포머 인코더 레이어입니다.
encoder_layer = nn.TransformerEncoderLayer(d_model=512, nhead=8)
유틸리티 함수 - 저장 및 로드
모델 저장
torch.save(model.state_dict(), 'model.pth')
모델 로드
model.load_state_dict(torch.load('model.pth'))
model.eval()
학습 및 평가 모드 설정
모델을 학습 모드로 설정
model.train()
모델을 평가 모드로 설정
model.eval()