# Part 7: 딥러닝 기초와 PyTorch (7주차) **⬅️ 이전 시간: [Part 6: 머신러닝 모델링과 평가](./part_6_machine_learning.md)** | **➡️ 다음 시간: [Part 7.5: LangChain으로 LLM 애플리케이션 개발 맛보기](./part_7.5_llm_application_development_with_langchain.md)** --- ## 📜 실습 코드 바로가기 - **`part_7_deep_learning.py`**: [바로가기](./source_code/part_7_deep_learning.py) - 본 파트에서 다루는 PyTorch의 핵심 기능 예제 코드를 직접 실행하고 수정해볼 수 있습니다. --- ### 🎯 7주차 학습 목표 - **[PyTorch](./glossary.md#pytorch)**를 사용하여 간단한 딥러닝 모델을 직접 구현하고 학습시켜 봅니다. - 인공 신경망의 기본 구성 요소(Linear Layer, Activation Function)를 이해합니다. - 딥러닝 학습 과정(Forward/Backward Propagation, Optimizer)의 원리를 파악합니다. --- ## 1-3일차(월-수): PyTorch로 구현하는 딥러닝 첫걸음 드디어 딥러닝의 세계에 입문합니다. 우리는 **PyTorch**라는 강력한 딥러닝 프레임워크를 사용하여 인공 신경망을 직접 만들어보겠습니다. - **[PyTorch](./glossary.md#pytorch)**: 페이스북(메타)에서 개발한 딥러닝 프레임워크. 유연성과 직관적인 코드로 연구자와 개발자들에게 널리 사랑받고 있습니다. #### 💡 쉽게 이해하기: PyTorch는 '레고 블록', Scikit-learn은 '완성된 장난감' > - **Scikit-learn**: '트럭', '비행기'처럼 이미 완성된 모델을 가져와 사용하는 '완성품 장난감'과 같습니다. 사용하기 편리하고 대부분의 정형 데이터 문제에 효과적입니다. > - **PyTorch**: 다양한 모양의 '레고 블록'을 제공하여, 사용자가 원하는 어떤 복잡한 구조(신경망)라도 직접 조립할 수 있게 해줍니다. 이미지, 텍스트 등 비정형 데이터를 다루는 딥러닝에 필수적입니다. ### 1. 딥러닝의 핵심, 텐서(Tensor) - **텐서**: PyTorch에서 데이터를 다루는 기본 단위. NumPy의 `ndarray`와 매우 유사하지만, GPU를 사용한 가속 연산이 가능하고 자동 미분(Autograd) 기능을 지원한다는 결정적인 차이가 있습니다. ### 2. 인공 신경망(Artificial Neural Network) 모델 만들기 PyTorch에서는 `torch.nn.Module`을 상속받아 우리만의 신경망 클래스를 정의합니다. ```python import torch import torch.nn as nn # 모델 정의 class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() # nn.Linear(input_features, output_features) # 입력 특성 4개(붓꽃 데이터), 출력 클래스 3개(품종) self.fc1 = nn.Linear(4, 50) # 첫 번째 완전 연결 계층 self.relu = nn.ReLU() # 활성화 함수 self.fc2 = nn.Linear(50, 3) # 두 번째 완전 연결 계층 def forward(self, x): # 순전파: 데이터가 입력층부터 출력층까지 나아가는 과정 x = self.fc1(x) x = self.relu(x) x = self.fc2(x) return x model = SimpleNet() print(model) ``` --- ## 4-5일차(목-금): 딥러닝 모델 학습시키기 ### 1. 손실 함수(Loss Function)와 옵티마이저(Optimizer) - **[손실 함수](./glossary.md#손실-함수loss-function)**: 모델의 예측이 실제 정답과 얼마나 다른지를 측정하는 '오차 측정기'. (예: `CrossEntropyLoss` - 분류 문제) - **[옵티마이저](./glossary.md#옵티마이저optimizer)**: 손실 함수가 계산한 오차를 기반으로, 모델의 파라미터(가중치)를 어느 방향으로 얼마나 업데이트할지 결정하는 '조율사'. (예: `Adam`, `SGD`) ### 2. 학습 루프(Training Loop) 딥러닝 모델 학습은 '에포크(Epoch)'라는 단위로 반복됩니다. 1 에포크는 전체 훈련 데이터를 한 번 모두 사용하는 것을 의미합니다. ```python # (데이터 로드 및 전처리는 Scikit-learn 예제와 유사하게 진행되었다고 가정) # X_train, y_train을 PyTorch 텐서로 변환 # X_train_tensor = torch.FloatTensor(X_train.values) # y_train_tensor = torch.LongTensor(pd.Categorical(y_train).codes) # criterion = nn.CrossEntropyLoss() # optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # epochs = 100 # for epoch in range(epochs): # # 1. 순전파 (Forward pass) # outputs = model(X_train_tensor) # loss = criterion(outputs, y_train_tensor) # # 2. 역전파 및 가중치 업데이트 (Backward and optimize) # optimizer.zero_grad() # 이전 그래디언트 초기화 # loss.backward() # 그래디언트 계산 # optimizer.step() # 파라미터 업데이트 # if (epoch+1) % 10 == 0: # print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}') ``` 위 코드는 개념 설명을 위한 것으로, 실제 실행 가능한 전체 코드는 `source_code/part_7_deep_learning.py`에서 확인해주세요. ### 📚 7주차 마무리 및 다음 단계 이번 주 우리는 PyTorch를 사용하여 딥러닝의 기본 원리를 이해하고, 직접 신경망을 만들어 학습시키는 과정을 경험했습니다. 다음 시간에는 지금까지 배운 머신러닝/딥러닝 지식을 바탕으로, 최근 가장 뜨거운 분야인 **거대 언어 모델(LLM)**과 **LangChain**을 활용하여 간단한 챗봇 애플리케이션을 만들어보는 시간을 갖습니다. **➡️ 다음 시간: [Part 7.5: LangChain으로 LLM 애플리케이션 개발 맛보기](./part_7.5_llm_application_development_with_langchain.md)**