기본 개념들
1. 인공지능 (AI): AI는 인간의 지능을 모방하여 문제를 해결하는 기술을 의미합니다. 이 기술은 다양한 알고리즘을 활용해 스스로 학습하거나, 규칙 기반으로 데이터를 분석하여 특정 작업을 수행합니다.
2. 머신 러닝 (Machine Learning): 머신 러닝은 AI의 하위 분야로, 데이터에서 학습하여 예측 및 의사결정을 수행하는 알고리즘입니다. 머신 러닝은 데이터로부터 반복적인 학습을 통해 성능을 개선하며, 지도 학습(Supervised Learning), 비지도 학습(Unsupervised Learning), 강화 학습(Reinforcement Learning)으로 구분됩니다.
3. 딥 러닝 (Deep Learning): 딥 러닝은 머신 러닝의 한 종류로, 여러 개의 계층으로 이루어진 인공 신경망을 통해 데이터를 학습합니다. 특히 대규모 데이터를 처리하여, 이미지 인식, 음성 인식, 자연어 처리와 같은 고난이도 문제에 뛰어난 성능을 보여줍니다.
4. 인공 신경망 (Artificial Neural Network, ANN): ANN은 딥 러닝 모델의 기본 구조로, 사람의 뇌 신경세포(뉴런)가 신호를 주고받으며 학습하는 과정을 모방합니다. 여러 계층을 통해 데이터에서 중요한 특징을 학습하고 예측에 활용합니다.
5. 층 (Layer): 층은 딥 러닝 모델의 계층적 구조를 이루는 기본 단위로, 입력층(Input Layer), 은닉층(Hidden Layer), 출력층(Output Layer)으로 나뉩니다.
입력층은 데이터가 처음으로 들어오는 곳,
은닉층은 특징을 학습하는 중간 계층들,
출력층은 예측 값을 내놓는 마지막 계층입니다.
6. 뉴런 (Neuron): 뉴런은 신경망을 이루는 기본 요소로, 각 뉴런은 입력을 받아 가중치(weight)를 적용해 연산을 수행하고, 활성화 함수를 통해 출력합니다. 사람의 신경세포처럼 데이터를 받아 학습하고, 다음 단계로 전달합니다.
7. 가중치 (Weight)와 바이어스 (Bias): 가중치는 뉴런 간의 연결 강도를 의미하며, 학습 과정에서 중요한 변수입니다. 바이어스는 출력값을 조정하는 추가 항목으로, 가중치와 함께 모델의 정확성을 높이는 역할을 합니다.
8. 활성화 함수 (Activation Function): 활성화 함수는 뉴런의 출력을 결정하는 함수입니다. 이를 통해 모델이 비선형적인 데이터를 학습할 수 있습니다. 대표적인 활성화 함수로는 ReLU, Sigmoid, Tanh 등이 있습니다.
9. 학습 (Training): 학습은 모델이 데이터를 이용해 가중치와 바이어스를 조정하여 예측 능력을 높이는 과정입니다. 학습이 완료되면, 모델은 새로운 데이터에 대한 예측을 수행할 수 있습니다.
10. 손실 함수 (Loss Function): 손실 함수는 모델의 예측 값과 실제 값의 차이를 계산하여 모델의 성능을 평가하는 지표입니다. 손실 함수의 값을 최소화하기 위해 가중치가 조정됩니다. 대표적인 손실 함수로는 MSE(Mean Squared Error), Cross Entropy 등이 있습니다.
11. 경사하강법 (Gradient Descent): 경사하강법은 손실 함수의 값을 최소화하기 위해 가중치를 조정하는 최적화 알고리즘입니다. 가중치의 기울기를 계산하여 손실 함수의 최소값을 찾아가면서 모델의 성능을 개선합니다.
12. 에포크 (Epoch): 에포크는 전체 데이터셋을 모델이 한 번 학습하는 과정을 의미합니다. 데이터셋이 클 때는 에포크 수가 증가할수록 모델이 더 많이 학습하게 됩니다.
13. 배치 (Batch)와 미니배치 (Mini-batch): 배치는 모델이 한 번에 학습하는 데이터의 양을 의미합니다.
전체 데이터셋을 한 번에 학습하는 방법은 배치 학습이라고 하고, 데이터셋을 여러 개로 나누어 학습하는 방법은 미니배치 학습이라 합니다.
14. 과적합 (Overfitting)과 과소적합 (Underfitting): 과적합은 모델이 학습 데이터에 너무 치중하여, 새로운 데이터에 대한 성능이 낮아지는 현상입니다.
과소적합은 모델이 학습 데이터를 충분히 학습하지 못하여 성능이 낮은 상태입니다.
15. 드롭아웃 (Dropout): 드롭아웃은 학습 중에 일부 뉴런을 임시로 제거하여 과적합을 방지하는 정규화 기법입니다. 이를 통해 모델이 더 일반화된 성능을 갖도록 합니다.
ANN
인공 신경망(ANN)은 입력 데이터를 받아 가중치(weight)와 활성화 함수(activation function)를 통해 출력값을 생성하는 방식으로 작동합니다. ANN은 여러 개의 계층(layer)으로 구성되며, 각 계층은 뉴런(neuron)들로 이루어져 있습니다. 이 뉴런들은 입력을 받아 학습하고, 예측을 수행하는 기본 단위로 작용합니다.
인공 신경망 (ANN, Artificial Neural Network)은 딱히 정해진 형태가 있는 것이 아니라, 다양한 구성과 형태로 설계될 수 있습니다. ANN은 연결된 레이어와 뉴런의 구조를 통해 학습하는 시스템이며, 주요 목표는 주어진 데이터에서 패턴을 학습하고, 이를 통해 예측을 수행하는 것입니다. 이 과정에서 층 수, 뉴런 수, 활성화 함수 등을 조정하여 다양한 문제에 맞게 최적화합니다.
ANN의 기본 개념과 작용 방식:
입력층 (Input Layer): 데이터가 처음 입력되는 층입니다.
은닉층 (Hidden Layer): 데이터를 처리하는 중간 단계의 층입니다. 은닉층이 많을수록 ANN은 더 복잡한 패턴을 학습할 수 있습니다.
출력층 (Output Layer): 최종 예측 값을 생성하는 층입니다.
ANN은 기본적으로 가중치(weight)와 활성화 함수를 통해 학습을 진행합니다. 각 뉴런에는 가중치가 할당되어 있고, 이를 통해 입력 값의 중요도가 결정됩니다. 활성화 함수는 이 가중치가 적용된 값을 비선형 변환하여 출력합니다.
dense와 sequential
Sequential과 Dense는 Keras에서 딥 러닝 모델을 만들 때 주로 사용하는 두 가지 주요 구성 요소입니다. 이 두 요소는 각각 모델을 정의하고 구성하는 방식과 신경망 레이어를 정의하는 방식을 담당합니다.
Sequential
1. Sequential
Sequential은 레이어를 순차적으로 쌓는 모델을 만들기 위해 사용하는 Keras의 클래스입니다. 이 모델은 층을 단순히 하나씩 쌓아 나가며, 입력층 → 은닉층(들) → 출력층 순서로 구성됩니다.
Sequential을 사용하는 이유
간단한 신경망 구조에 적합: Sequential은 각 레이어가 순서대로 연결된 단순한 신경망을 만들기 때문에 직관적이고 코드가 간단합니다.
단순히 레이어를 추가: Sequential을 통해 쉽게 .add() 메서드로 레이어를 추가해 모델을 확장할 수 있습니다.
일관된 데이터 흐름: Sequential 모델에서는 입력이 첫 번째 층에서 마지막 층까지 순차적으로 흐르므로 이해하기 쉽고 구현이 편리합니다.
예시
from tensorflow.keras.models import Sequential
model = Sequential() # Sequential 모델 생성
Dense
Dense는 완전 연결층(fully connected layer)을 정의하는 Keras의 클래스입니다. 모든 뉴런이 이전 층의 모든 뉴런과 연결되어 있어, 신경망에서 데이터의 패턴을 학습하는 데 매우 유용합니다.
Dense를 사용하는 이유
모든 뉴런이 연결됨: Dense 층은 모든 입력 뉴런이 모든 출력 뉴런에 연결되어, 데이터의 중요한 패턴을 파악하고 복잡한 연산을 수행할 수 있습니다.
가중치와 바이어스를 학습: Dense 층에서는 각 연결마다 가중치와 바이어스가 적용되며, 이를 통해 데이터를 학습하고, 입력과 출력 간의 관계를 최적화합니다.
활성화 함수 사용 가능: Dense는 활성화 함수(예: ReLU, sigmoid)를 통해 데이터를 비선형적으로 변환하여 복잡한 패턴을 학습하는 데 도움을 줍니다.
구조
Dense 층은 다음과 같은 기본 구조로 되어 있습니다.
입력 뉴런: 이전 층의 출력을 받는 뉴런들입니다.
가중치(weight): 각 입력 뉴런과 출력 뉴런 사이에 적용되는 값입니다. 모델이 학습하면서 가중치가 업데이트됩니다.
바이어스(bias): 출력에 추가로 더해지는 값으로, 데이터를 이동시키는 역할을 합니다.
출력 뉴런: 가중치와 바이어스가 적용된 값을 활성화 함수로 변환해 출력합니다.
주요 파라미터
units: 층의 뉴런 수를 설정합니다. 이 값은 해당 층의 출력 차원을 결정합니다.
activation: 활성화 함수를 지정합니다. 이 함수는 데이터를 비선형적으로 변환해 학습에 도움을 줍니다.
input_shape: 첫 번째 층에서 입력 데이터의 형태를 지정합니다. 이후 층은 자동으로 크기를 추론합니다.
그러면 이제 강의에서 쓰이던 Pytorch를 써보겠습니다.
# 데이터셋 전처리
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
먼저,
transforms.Compose는 PyTorch에서 여러 개의 변환(transform)을 연속적으로 적용하기 위해 사용하는 도구입니다. 이미지 데이터를 학습하기 전에 필요한 전처리 작업들을 한 번에 묶어 적용할 수 있도록 해줍니다. Compose는 변환을 리스트 형태로 받아 순서대로 실행하기 때문에, 다양한 전처리 과정을 간편하게 한 번에 적용할 수 있습니다.
transform은 모델 학습 전에 데이터 전처리 작업을 지정하는 코드이기 때문에 코드의 맨 위에 위치합니다. 이 부분이 하는 일은 데이터셋이 로드될 때 이미지 데이터를 텐서로 변환하고 정규화하도록 미리 설정하는 것입니다.
여기서 텐서란?
텐서(Tensor)는 수학에서 벡터와 행렬을 확장한 개념으로, 다차원 배열을 의미합니다. 파이토치나 텐서플로우와 같은 딥러닝 라이브러리에서 텐서는 데이터를 표현하고 조작하는 기본 구조입니다. 파이썬에서는 torch.Tensor 형태로 만들어 사용하며, 텐서로 변환하면 이미지나 숫자 데이터를 다루기 훨씬 쉬워집니다.
여기 다른 예시도 들고왔습니다.
from torchvision import transforms
transform = transforms.Compose([
transforms.Resize((32, 32)), # 이미지를 32x32 크기로 조정
transforms.ToTensor(), # 이미지를 텐서 형태로 변환
transforms.Normalize((0.5,), (0.5,)) # 픽셀 값을 정규화
])
여기서 Compose는 리스트로 나열된 변환 함수들을 순서대로 적용합니다.
transforms.Resize((32, 32)) -> 이미지를 32x32 픽셀 크기로 변경합니다. 이미지가 너무 크거나 작은 경우, 일관된 크기로 맞춰주는 과정입니다.
transforms.ToTensor() -> 이미지를 PyTorch가 처리할 수 있는 텐서 형태로 변환합니다. 이 과정을 통해 이미지를 수치적으로 다룰 수 있게 합니다.
transforms.Normalize((0.5,), (0.5,)) -> 이미지의 각 픽셀 값을 평균 0.5, 표준편차 0.5로 정규화합니다. 이렇게 하면 학습이 더 잘 이루어질 수 있습니다.
여러 전처리를 하나씩 개별적으로 적용하는 대신 Compose를 사용하면 코드를 간결하게 작성할 수 있으며, 순서대로 적용해야 하는 전처리 작업을 쉽게 관리할 수 있습니다.
예를 들어, Compose로 묶지 않으면 각 데이터마다 Resize와 ToTensor, Normalize를 개별적으로 호출해야 하므로 코드가 길어지고 복잡해집니다. Compose로 묶으면 각 이미지 데이터에 대해 한 번의 호출로 모든 변환을 적용할 수 있게 되어 훨씬 효율적입니다.
# MNIST 데이터셋 로드
trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)
torchvision.datasets.MNIST는 PyTorch에서 MNIST 손글씨 숫자 데이터셋을 쉽게 불러올 수 있도록 하는 클래스입니다. 이 클래스에는 데이터셋 로드 시 필요한 몇 가지 매개변수들이 있으며, 각각의 매개변수는 데이터의 로드 및 전처리에 중요한 역할을 합니다.
root
설명: 데이터셋이 저장될 기본 경로를 지정합니다.
예시: './data'는 현재 작업 디렉터리의 data 폴더에 MNIST 데이터셋을 다운로드하겠다는 의미입니다.
train
설명: True 또는 False 값을 가지며, 데이터셋의 훈련(train) 또는 테스트(test) 데이터셋을 불러올지 선택합니다.
예시: train=True이면 훈련 데이터를 불러오고, train=False이면 테스트 데이터를 불러옵니다.
transform
설명: 데이터셋에 대해 적용할 전처리 작업을 정의합니다. 각 이미지가 로드될 때 자동으로 이 변환(transform)이 적용됩니다.
예시: transform=transform으로 설정해 ToTensor() 및 Normalize()가 이미지에 순차적으로 적용됩니다.
download
설명: 데이터셋이 지정된 경로(root)에 없는 경우 인터넷에서 자동으로 다운로드합니다.
예시: download=True로 설정하면 MNIST 데이터셋이 없는 경우 자동으로 다운로드하며, download=False일 때 경로에 데이터셋이 없다면 오류가 발생합니다.
DataLoader는 PyTorch에서 데이터셋을 모델 학습에 효율적으로 사용할 수 있도록 관리하는 클래스입니다. DataLoader는 데이터셋을 미니 배치로 나누고, 필요한 전처리를 자동으로 적용하면서 모델 학습의 속도와 효율을 높여주는 역할을 합니다.
dataset
설명: 데이터를 로드할 데이터셋 객체를 지정합니다. 이 데이터셋 객체는 주로 datasets.MNIST 같은 클래스에서 생성되며, DataLoader가 데이터를 미니 배치 단위로 나누어 제공합니다.
예시: dataset=train_dataset로 지정해 훈련 데이터셋을 로드합니다.
batch_size
설명: 각 미니 배치의 데이터 개수를 설정합니다. 모델은 이 미니 배치 단위로 학습을 진행하기 때문에, 데이터가 배치 단위로 입력됩니다.
예시: batch_size=32로 설정하면, 한 번에 32개의 데이터를 묶어서 모델에 전달합니다.
shuffle
설명: True로 설정하면 에포크(epoch)가 시작될 때 데이터셋의 순서를 무작위로 섞어줍니다. 이 옵션을 통해 데이터의 순서에 따른 학습 편향을 줄일 수 있습니다.
예시: shuffle=True로 설정하면 매 에포크마다 데이터를 랜덤하게 섞어 학습합니다.
num_workers
설명: 데이터를 로드할 때 병렬로 데이터를 읽어들일 워커(worker) 프로세스 수를 지정합니다. 이 숫자가 높으면 데이터 로드 속도가 빨라지지만, 너무 많은 워커를 설정하면 시스템 성능에 따라 오히려 느려질 수 있습니다.
예시: num_workers=2로 설정하면 두 개의 병렬 프로세스를 사용해 데이터를 불러옵니다.
즉, trainset와 trainloader가 한 세트가 아니라, dataset에서 torchvision.datasets.MNIST를 통해 MNIST를 다운받는데, ./data으로 파일을 넣고, 이것을 train데이터로 설정한 후, 그 데이터를 미리 만들어 놓은 transform으로 전처리를 한 후, 최종적으로 그것을 train_dataset에 넣는데, 그것을 다시, torch.utils.data.DataLoader를 통해 trainset을 들고오고 난 후, 데이터를 읽는데, 한번에 64게의 데이터를 읽을 것이며, 데이터셋의 순서를 무작위로 섞으면서, 데이터를 읽어들일 프로세스의 수를 2로 설정을 하는것이다
잠깐 여기서, shuffle과, num_workers에 대해 조금 더 자세히 알아보겠니다.
shuffle 매개변수는 데이터셋을 무작위로 섞을지 여부를 결정합니다.
True: 데이터셋의 순서를 무작위로 섞습니다. 매 에포크마다 데이터를 랜덤하게 섞어서 모델이 같은 순서로 데이터를 학습하는 것을 방지합니다.
False: 데이터셋을 원래 순서대로 유지합니다.
중요성:
학습 편향 감소: 데이터를 순차적으로 학습하게 되면 모델이 특정 패턴을 기억할 수 있습니다. 이를 방지하기 위해 데이터셋을 무작위로 섞어 다양한 샘플을 학습하게 합니다.
일반화 능력 향상: 무작위로 섞은 데이터를 학습함으로써 모델이 다양한 입력에 더 잘 대응하도록 만듭니다. 이렇게 하면 과적합(overfitting)을 줄이는 데 도움이 됩니다.
num_workers
정의: num_workers 매개변수는 데이터를 로드할 때 사용할 병렬 프로세스의 수를 지정합니다. 이를 통해 데이터 로딩 속도를 향상시킬 수 있습니다.
정수값: 병렬로 사용할 프로세스의 수를 지정합니다. 예를 들어, num_workers=2로 설정하면 두 개의 프로세스가 동시에 데이터를 로드합니다.
0: 데이터 로딩을 메인 프로세스에서 처리합니다. 즉, 별도의 프로세스를 사용하지 않습니다.
중요성:
데이터 로드 속도 향상: 데이터셋이 크고 복잡한 경우, 데이터를 로드하는 데 시간이 많이 소요될 수 있습니다. num_workers를 늘리면 여러 프로세스가 동시에 데이터를 읽어들여 속도를 높일 수 있습니다.
GPU 자원 활용: GPU에서 모델 학습을 할 때, CPU에서 데이터를 빠르게 불러오는 것이 중요합니다. num_workers를 적절히 설정하면 GPU의 대기 시간을 줄이고 더 효율적으로 학습할 수 있습니다.
여기서 에포크란?
에포크(epoch)는 머신러닝과 딥러닝에서 모델 학습 과정을 나타내는 중요한 개념입니다. 간단하게 설명하면, 에포크는 전체 훈련 데이터셋을 한 번 모두 사용하는 학습 단위를 의미합니다.
기본 개념
에포크 정의: 에포크는 모델이 훈련 데이터셋을 한 번 전체적으로 학습하는 과정을 의미합니다. 즉, 훈련 데이터의 모든 샘플이 모델에 입력되고, 그에 대한 출력을 통해 가중치가 업데이트됩니다.
훈련 과정: 모델이 훈련 데이터셋을 여러 번 에포크 단위로 학습하며, 각 에포크가 끝날 때마다 모델의 성능을 평가하고 가중치를 조정합니다.
에포크의 중요성
모델 성능 향상: 여러 번의 에포크를 통해 모델은 점진적으로 데이터의 패턴을 학습하게 됩니다. 보통 한 번의 에포크로는 충분한 학습이 이루어지지 않기 때문에 여러 번 반복합니다.
과적합 방지: 너무 많은 에포크를 설정하면 모델이 훈련 데이터에 과적합(overfitting)될 수 있습니다. 과적합은 모델이 훈련 데이터의 노이즈나 불필요한 세부 사항까지 학습하여 새로운 데이터에 대해 일반화 능력이 떨어지는 현상입니다.
에포크 수 설정
적절한 에포크 수: 적절한 에포크 수를 설정하는 것은 매우 중요합니다. 너무 적은 에포크 수는 모델이 충분히 학습하지 못하게 만들고, 너무 많은 에포크 수는 과적합을 초래할 수 있습니다.
조기 종료(Early Stopping): 에포크 수를 설정할 때, 검증 데이터에서 성능이 더 이상 개선되지 않을 때 학습을 중단하는 조기 종료 기법을 사용하여 최적의 성능을 찾을 수 있습니다.
예시
에포크의 개념을 이해하기 위해 간단한 예를 들어보겠습니다.
만약 훈련 데이터셋에 1,000개의 샘플이 있다고 가정합시다.
1 에포크: 모델이 이 1,000개의 샘플을 한 번 모두 사용하여 학습합니다.
10 에포크: 모델이 1,000개의 샘플을 10번 반복하여 학습합니다. 이 경우 모델은 각 에포크마다 가중치를 업데이트하며 데이터의 패턴을 점점 더 잘 이해하게 됩니다.
오늘은 여기까지.