Company
교육 철학

머신러닝과 딥러닝

머신러닝이란?

머신러닝(Machine Learning)은 컴퓨터가 명시적으로 프로그래밍되지 않아도 데이터로부터 학습하고 예측할 수 있게 하는 인공지능의 한 분야입니다.
머신러닝의 핵심 개념
데이터 기반 학습: 규칙을 직접 코딩하는 대신, 데이터에서 패턴을 찾아냅니다
예측과 분류: 새로운 데이터에 대해 결과를 예측하거나 분류합니다
자동 개선: 더 많은 데이터를 학습할수록 성능이 향상됩니다
머신러닝의 종류
좌 → 지도학습, 우 → 비지도학습
1.
지도 학습(Supervised Learning): 정답이 있는 데이터로 학습합니다. 예: 스팸 메일 분류, 집값 예측, 데이터간 구별 가능
2.
비지도 학습(Unsupervised Learning): 정답 없이 데이터의 패턴을 찾습니다. 예: 고객 세분화, 이상 탐지, 개별 데이터간 구분은 어렵지만 그룹으로 나눌 수 있다.
3.
강화 학습(Reinforcement Learning): 시행착오를 통해 보상을 최대화하는 방법을 학습합니다. 예: 게임 AI, 로봇 제어
강화 학습

딥러닝이란?

딥러닝(Deep Learning)은 머신러닝의 한 분야로, 인간의 뇌 구조를 모방한 인공 신경망(Neural Network)을 여러 층으로 쌓아 복잡한 패턴을 학습하는 기술입니다.
딥러닝의 특징
다층 신경망: 여러 개의 은닉층(hidden layer)을 가진 깊은 구조
자동 특징 추출: 사람이 직접 특징을 설계하지 않아도 자동으로 중요한 특징을 찾아냅니다
대량의 데이터 필요: 복잡한 모델을 학습하기 위해 많은 양의 데이터가 필요합니다
높은 성능: 이미지, 음성, 자연어 처리 등에서 탁월한 성능을 보입니다
딥러닝의 주요 모델
CNN (Convolutional Neural Network, 합성곱 신경망): 이미지 인식, 컴퓨터 비전에 특화
RNN (Recurrent Neural Network, 순환 신경망): 시계열 데이터, 자연어 처리에 사용
Transformer: 최신 자연어 처리 모델로, GPT, BERT 등의 기반

딥러닝의 핵심은? 수능점수를 보면 기존에 있는 데이터를 이용해서 새로운 응시자의 점수를 예측 하는 프로그램을 만든다고 생각해보자.

기존 프로그래밍 방법으로는 이러한 방법을 만들려면 쉽지 않습니다.
기존에 우리가 했던 프로그래밍이 데이터를 입력해서 답을 구했어야 하는데, 머신러닝은 데이터안에서 규칙을 찾고 발견하고 새로운 규칙을 결과를 도출하는데 사용합니다.
기존에 일어나지 않은 미지의 결과나 일을 예측하는 것
수능 점수로 예를 들면 수능 점수를 계산하는 프로그램을 만든다고 하면 공부시간을 데이터로 활용해보자.
공부시간을 머신러닝 알고리즘에 넣는다. 그러면 머신 러닝은 데이터가 가진 패턴을 분석합니다. 그리고 패턴과 규칙을 저장합니다. 이후에 새로운 데이터(누군가의 공부시간)를 삽입하면 해당 시간에 따른 점수를 예측해서 출력해준다.
데이터가 입력되고 분석되는 과정을 학습(training)이라고 합니다. 그러면 해당 점수들을 기준으로 평균을 내서 선을 하나 그리면 대략적으로 새로운 데이터가 들어왔을때 우리는 점수를 예측할수 있다. 결국 결론은 얼마나??? 정확한??? 선을 그리느냐가? 딥러닝의 핵심이다. 그 결과 퍼셉트론(perceptron), 아달라인(adaline), 선형회귀(linear regression) 등을 지나서 오늘날의 딥러닝이 만들어졌습니다.

머신러닝 vs 딥러닝 비교

구분
머신러닝
딥러닝
데이터 양
적은 데이터로도 가능
대량의 데이터 필요
특징 추출
사람이 직접 설계
자동으로 추출
계산 능력
일반 컴퓨터로 가능
고성능 GPU 필요
해석 가능성
비교적 쉬움
블랙박스로 어려움
학습 시간
빠름
오래 걸림

실생활 응용 사례

머신러닝 활용:
이메일 스팸 필터
신용카드 사기 탐지
추천 시스템 (넷플릭스, 유튜브)
주가 예측
딥러닝 활용:
얼굴 인식 (Face ID)
자율 주행 자동차
음성 비서 (시리, 구글 어시스턴트)
언어 번역 (구글 번역)
의료 영상 진단
챗GPT 같은 대화형 AI

왜 딥러닝에 PyTorch인가?

PyTorch는 Facebook(Meta)에서 개발한 오픈소스 딥러닝 프레임워크로, 연구와 실무에서 가장 많이 사용되는 도구 중 하나입니다.
PyTorch의 주요 장점
직관적인 문법: Python과 유사한 구조로 배우기 쉽고 코드가 간결합니다
동적 계산 그래프(Dynamic Computational Graph): 실행 중에 그래프를 변경할 수 있어 디버깅과 실험이 용이합니다
강력한 GPU 지원: CUDA를 통한 효율적인 GPU 연산으로 학습 속도가 빠릅니다
풍부한 생태계: torchvision, torchaudio 등 다양한 라이브러리와 사전 학습된 모델 제공
활발한 커뮤니티: 연구자들 사이에서 널리 사용되어 최신 논문의 코드 구현이 빠릅니다
유연성: 연구용 프로토타입부터 프로덕션 배포까지 모두 가능합니다
PyTorch vs TensorFlow
구분
PyTorch
TensorFlow
학습 난이도
쉬움 (Pythonic)
상대적으로 어려움
계산 그래프
동적 (Dynamic)
정적/동적 모두 지원
디버깅
Python 디버거 사용 가능
상대적으로 어려움
주요 사용처
연구, 프로토타입
프로덕션, 모바일
커뮤니티
학계에서 선호
산업계에서 선호
PyTorch가 적합한 경우
딥러닝을 처음 배우는 초보자
연구 목적으로 새로운 모델을 실험하는 경우
빠른 프로토타이핑이 필요한 프로젝트
최신 논문의 코드를 구현하거나 학습하는 경우
PyTorch 기본 예제
import torch import torch.nn as nn # 간단한 신경망 정의 class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() self.fc1 = nn.Linear(10, 5) self.fc2 = nn.Linear(5, 1) def forward(self, x): x = torch.relu(self.fc1(x)) x = self.fc2(x) return x # 모델 생성 model = SimpleNet() # 입력 데이터 x = torch.randn(1, 10) # 예측 output = model(x) print(output)
Python
복사
PyTorch는 직관적인 구조와 강력한 기능으로 딥러닝을 학습하고 구현하는 데 최적의 도구입니다.

파이토치 권고 코딩 스타일 요약

두 텐서의 합

import torch # 1, 2, 3이 들어 있는 텐서를 만듭니다. a = torch.tensor([1, 2, 3]) # 4, 5, 6이 들어 있는 텐서를 만듭니다. b = torch.tensor([4, 5, 6]) # 두 텐서의 합을 구합니다. c = a + b # 텐서를 출력합니다. print(c) # tensor([5, 7, 9])
Python
복사
파이토치는 클래스를 사용하도록 권고합니다. 크게 신경망의 동작을 정의하는 모듈 클래스와 데이터를 다루는 데이터셋 클래스가 있습니다. 즉 파이토치를 이용해 딥러닝 신경망을 학습하려면 ① 모듈 클래스를 이용해 신경망을 만들고, ② 데이터셋 클래스를 이용해 데이터를 불러와 학습하면 됩니다.
파이토치의 딥러닝 신경망은 모두 모듈(nn.Module 클래스)로 구성되어 있습니다. 모듈 클래스의 기본적인 뼈대는 다음과 같습니다.

신경망 모듈 클래스의 기본 구성

import torch.nn as nn class Net(nn.Module): def __init__(self): super(Net, self).__init__() ''' # 신경망 구성요소 정의 예: self.fc1 = nn.Linear(10, 5) ''' def forward(self, input): ''' # 신경망의 동작 정의 예: output = self.fc1(input) ''' return output
Python
복사
__init__() : 신경망의 구조(층, 레이어 등)를 정의
forward() : 입력이 들어왔을 때의 계산 과정을 정의
모듈 클래스는 신경망의 구성요소를 정의하는 init( ) 함수와 신경망의 동작을 정의하는 forward( ) 함수로 구성되어 있습니다. 파이토치는 미리 정의해둔 신경망 모듈을 제공합니다. 파이토치가 제공하는 모듈을 불러와 init( ) 함수 안에 정의합니다. 다음으로 forward( ) 함수에 신경망의 동작을 정의합니다(init( ) 함수에서 정의한 모듈을 연결하거나 필요한 연산 등을 정의합니다).
데이터를 호출하는 데이터셋 클래스의 뼈대는 다음과 같습니다.

데이터셋 클래스의 기본 구성

from torch.utils.data import Dataset class CustomDataset(Dataset): def __init__(self, data, label): ''' 필요한 데이터 불러오기 ''' self.data = data self.label = label def __len__(self): ''' 데이터의 개수 반환 ''' return len(self.data) def __getitem__(self, i): ''' i번째 입력 데이터와 i번째 정답을 반환 ''' return self.data[i], self.label[i]
Python
복사
데이터셋 클래스의 구성요소는 세 가지입니다. 첫 번째로__init__() 함수는 학습에 사용할 데이터를 불러옵니다. 두 번째로 len() 함수는 데이터 개수를 반환합니다. 마지막으로 getitem() 함수는 우리가 지정한 i번째 입력 데이터와 정답을 반환합니다.
모듈 클래스와 데이터셋 클래스를 이용한 딥러닝 학습을 진행하는 뼈대는 다음과 같습니다

학습 루프의 기본 뼈대

# 데이터로더로부터 데이터와 정답을 받아옴 for data, label in DataLoader(dataset): # 1. 모델의 예측값 계산 prediction = model(data) # 2. 손실 함수를 이용해 오차 계산 loss = loss_fn(prediction, label) # 3. 오차 역전파 loss.backward() # 4. 신경망 가중치 수정 optimizer.step() # 5. 옵티마이저 초기화(다음 스텝을 위해) optimizer.zero_grad()
Python
복사
이 구조가 파이토치 권고 코딩 스타일의 핵심 뼈대입니다.
파이토치는 학습에 사용할 입력 데이터와 정답을 불러오는 데이터로더를 제공합니다. 데이터로 더는 데이터셋 클래스를 입력으로 받아 학습에 필요한 양 만큼의 데이터를 불러오는 역할을 수행합니다. 이 데이터로더로부터 데이터와 정답을 불러와 신경망의 예측값을 계산합니다(여기서 신경망은 앞서 말씀드린 파이토치 모듈입니다). ❶ 예측값을 계산했다면 ❷ 손실 함수를 이용해 신경망의 오차를 계산합니다. ❸ 파이토치의 backward( ) 메서드를 이용해 오차를 역전파한 다음, ❹ step( ) 메서드를 이용해 신경망의 가중치를 수정합니다.
nn.Module → 모델 정의
Dataset + DataLoader → 데이터 관리
for 학습 루프 → 학습 단계 진행