딥러닝이란? 개념 잡기

Deep Learning 은 인간의 뇌에서 영감을 받은 인공 신경망을 사용하여 컴퓨터가 학습하는 머신 러닝 의 방법 중 하나로, 음악을 만들거나, 우리가 오렌지와 사과를 보고 각각 다른 과일이라고 인식할 수 있는 것 처럼 컴퓨터가 사진이나 사물을 보고 이해할 수 있거나 언어를 이해하는 방법을 학습 하는 것이라고 정의할 수 있습니다. ‘Deep’ 이라는 단어는 신경망에 여러 층(레이어)을 쌓아 깊게 만든다는 의미입니다. 이러한 깊은 네트워크를 통해 컴퓨터는 복잡한 문제를 해결하는 데 필요한 패턴이나 관계를 스스로 찾아낼 수 있습니다. 딥러닝은 이미지 인식, 음성 인식, 자연어 처리 등 다양한 분야에서 활용되고 있습니다.

Deep Learning (딥 러닝) 의 개념

간략히 딥러닝의 역사를 살펴보면, 가장 초기의 인공 신경망인 퍼셉트론(Perceptron)이 1958년에 제안되었습니다. 이후 1986년에 다층 퍼셉트론(Multilayer Perceptron)이 제안되고, 이를 학습시키는 방법인 역전파(Backpropagation) 알고리즘이 등장하면서 딥러닝의 기초가 마련되었습니다.

퍼셉트론은 간단한 문제를 해결하는 컴퓨터의 작은 뇌(Brain)와 같습니다. 모아진 퍼셉트론은 복잡한 문제도 해결할 수 있게 되는데, 이것이 바로 딥러닝, 즉 ‘깊은 학습’입니다. 인간의 뇌에는 “뉴런(Neuron)” 이 수억 개 있고, 이들이 함께 작동하여 생각하고, 느끼고, 기억하는 데 도움을 줍니다. 퍼셉트론은 이런 뉴런을 모방한 것으로, 간단한 계산을 수행하고 문제를 해결합니다.

뉴런_퍼셉트론
뉴런과 퍼셉트론의 비교

뉴런은 덴드라이트(작은 섬유)를 통해 다른 뉴런으로부터 입력 신호를 받습니다. 마찬가지로, 퍼셉트론은 숫자를 받는 입력 뉴런을 통해 다른 퍼셉트론으로부터 데이터를 받습니다. 생물학적 뉴런에서, 출력 신호는 축삭에 의해 운반 됩니다. 마찬가지로, 퍼셉트론의 축삭은 다음 퍼셉트론의 입력이 될 출력 값 입니다. 덴드라이트와 생물학적 뉴런 사이의 연결 지점은 “시냅스” 라고 정의 합니다. 입력과 퍼셉트론 사이의 연결은 ”가중치“ 라고 정의 합니다. 그들은 각 입력의 중요성 수준을 측정 할 수 있는 지표가 됩니다. 뉴런에서, 핵은 덴드라이트가 제공하는 신호를 기반으로 출력 신호를 생성 합니다. 마찬가지로, 퍼셉트론의 핵(파란색)은 입력 값을 기반으로 몇 가지 계산을 수행하고 출력을 생성합니다.

딥러닝 개념이 시작한 초기에는 컴퓨터의 성능이 부족하여 복잡한 신경망을 학습시키기 어려웠습니다. 2000년대 초반에 들어서 GPU가 발전하고 빅 데이터가 확산되면서 딥러닝은 크게 주목받게 되었습니다. 이 중 2012년에 딥러닝 모델인 AlexNet이 이미지 인식 대회에서 우승하면서 딥러닝은 성능을 인정받게 되었습니다.

2016년에 세계 챔피언 이세돌 9단과 바둑 대국에서 승리하면서 전 세계적으로 주목 받았던 알파고는 Google의 딥마인드(DeepMind) 팀이 개발한 딥러닝과 강화학습 으로 탄생한 기술 입니다. 딥러닝은 바둑판의 상태를 해석하고 다음 수를 예측하는 데 사용되었고 강화학습은 알파고가 자기 자신과 게임을 하면서 수천만 개의 바둑 기보를 분석하고 스스로 학습하느여 어떤 수가 승리에 이르는 방법을 학습하여 바둑의 복잡성을 이해하고, 강화학습을 통해 전략을 최적화하여 인간과 바둑을 둘 수 있게 되었습니다.

딥러닝은 이미지 분석, 음성 인식, 자연어 처리 등 다양한 분야에서 뛰어난 성능을 보이며 머신러닝 분야의 주요한 연구 방향이 되고있습니다.

KNN, 서포트 벡터 머신, 의사결정 트리

사전지식 : Python, Iris Dataset, Iris Dataset 블로그 글 링크

머신러닝 알고리즘은 데이터에서 패턴을 찾아내어 예측을 하거나 분류하는 등의 문제를 해결합니다. 지도학습은 레이블이 있는 데이터 셋을 통해 알고리즘으로 데이터를 구별하는 판별식을 만든 후 새로운 데이터가 어떠한 결과를 출력하는지 알아내는 학습 모델 입니다. 즉, 지도학습은 과거의 데이터를 학습해서 결과를 예측하는 방법 입니다. 그럼 ‘지도학습’ 에 해당되는 세 가지 머신러닝 알고리즘 – KNN(K-Nearest Neighbors), 서포트 벡터 머신(Support Vector Machine), 의사결정 트리(Decision Tree) 에 대하여 알아볼까요?

1. KNN(K-Nearest Neighbors)

KNN은 ‘가장 가까운 이웃들이 나를 가장 잘 정의한다’는 간단한 아이디어에서 시작합니다. 새로운 데이터가 들어오면, KNN 알고리즘은 기존 데이터 중에서 가장 가까운 ‘K’개의 데이터를 찾아, 그들의 레이블을 참조하여 새 데이터의 레이블을 예측합니다. 이는 쇼핑몰에서 ‘이 상품을 선택한 다른 고객들이 선택한 상품’을 추천하는 시스템에 비유할 수 있습니다. KNN의 원리는 데이터 포인트의 클래스를 그 주변 K개의 가장 가까운 이웃의 클래스로 예측하는 것입니다.

출처: Towards Data Science

from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split

# 데이터 불러오기
iris = datasets.load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

# KNN 모델 학습
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

# 모델 평가
print("Test Accuracy: ", knn.score(X_test, y_test))

2. 서포트 벡터 머신(Support Vector Machine)

서포트 벡터 머신(SVM)은 머신러닝의 가장 강력한 알고리즘 중 하나로 데이터를 분류하거나 회귀 분석하기 위한 지도 학습 모델입니다. 이는 데이터를 고차원 공간에 매핑하고, 이 공간에서 결정 경계(decision boundary)를 정의합니다. 이 결정 경계는 클래스 간의 마진을 최대화하는 방향으로 설정됩니다. 이 ‘결정 경계’는 서로 다른 분류를 가장 잘 구분하도록 설계되어 있습니다. 쉬운 예로써 공항 검색에서 찾아낸 위험한 물건과 안전한 물건을 구분하는 과정에 비유할 수 있습니다.

출처: Towards Data Science
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn import svm
from sklearn.datasets import load_iris

iris = load_iris()

X = iris.data
y = iris.target

# 데이터를 학습 세트와 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234)

# 데이터 스케일링
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# SVM 모델 학습
svm_model = svm.SVC(kernel='linear')
svm_model.fit(X_train, y_train)

# 예측 및 정확도 확인
print('Train accuracy:', svm_model.score(X_train, y_train))
print('Test accuracy:', svm_model.score(X_test, y_test))

3. 의사결정 트리(Decision Tree)

의사결정 트리(Decision Tree)는 머신러닝에서 가장 직관적인 방법 중 하나로 분류와 회귀 문제를 해결하는데 사용되는 모델 입니다. 각각의 ‘노드’에서 데이터의 특성에 따라 분기를 만들고, 최종적으로 ‘리프 노드’에서 결정을 내리는 구조 즉, 데이터의 특징을 기반으로 결정을 내리는데, 이 결정 과정을 나무 구조로 표현합니다. 일상생활에서 의사결정을 내리는 과정을 나무 구조로 표현한 것에 비유할 수 있으며 뿌리에서 시작하여 조건에 따라 갈라져 나가며 최종적으로 잎 노드에서 예측값을 결정합니다.

출처: Towards Data Science
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

iris = load_iris()

X = iris.data
y = iris.target

# 데이터를 학습 세트와 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234)

# 의사결정트리 모델 학습
dt = DecisionTreeClassifier(random_state=1234)
dt.fit(X_train, y_train)

# 예측 및 정확도 확인
print('Train accuracy:', dt.score(X_train, y_train))
print('Test accuracy:', dt.score(X_test, y_test))

사실, 머신러닝은 더 깊게 들어가면 어려운 책 몇권 이상으로도 설명이 필요한 영역이지만 세 가지 모델 모두가 머신러닝을 이해하기 위한 기초적인 모델이기 때문에 간단하게 개념적으로 블로그에 올리게 되었습니다. 이론적인 배경 지식도 중요하지만, 각각의 알고리즘을 실제 데이터셋에 적용해보면서 실제로 코딩하면서 느끼는 경험을 하면 머신러닝에 좀더 쉽게 다가갈 수 있지 않을까요?

MNIST Dataset에 대하여

MNIST는 ‘Modified National Institute of Standards and Technology’의 약자로, 미국의 표준 기술 연구소에서 생성된 원래의 NIST 데이터셋을 수정하여 만들었습니다. 이 데이터셋은 손으로 쓴 숫자들의 이미지를 포함하고 있습니다. 이 데이터셋은 기계 학습 분야의 연구에 널리 사용되며, 특히 이미지 처리를 위한 벤치마크로 사용됩니다.

MNIST 데이터 셋

MNIST 데이터셋은 총 7만 개의 이미지로 구성되어 있습니다. 각 이미지는 28×28 픽셀로 이루어져 있고, 숫자 0부터 9까지를 손으로 쓴 글씨를 담고 있습니다. 이 중 6만 개는 훈련 데이터로, 1만 개는 테스트 데이터로 사용됩니다.

MNIST 데이터셋은 약 1990년대에 Yan LeCun, Corinna Cortes, 그리고 Christopher J.C. Burges에 의해 개발되었다고 합니다. 그들이 MNIST 데이터셋을 처음 만들었을 때, 그들의 주요 목표는 기계학습 알고리즘이 얼마나 잘 작동하는지 평가하고, 다양한 알고리즘 간에 성능을 비교하는 표준적인 벤치마크를 제공하는 것이 목적 이었으나 현재는 이 데이터셋을 생성함으로써, 머신러닝의 ‘비지도학습’ 에 해당하는 알고리즘(로지스틱 회귀, 서포트 벡터 머신, 신경망 등) 을 통해서 보다 큰 규모의 데이터셋의 성능 테스트와 훈련이 가능하게 되었습니다.

데이터셋의 크기와 다양성, 그리고 쉽게 접근할 수 있는 특징 덕분에, 우리가 보통 프로그램언어를 처음 배울때 개발하는 ‘Hello, World!’ 프로그램 처럼 MNIST는 머신러닝과 딥러닝 을 배우면서 처음 시도하는 프로그래밍 이라고 생각하면 될듯합니다.

MNIST 데이터셋은 비교적 간단한 구조를 가지고 있지만, 이미지 인식(캡챠, 사물 이미지 인식 등) 분야에서의 다양한 기법을 실험하고 평가하는 데 매우 유용합니다. Keras 라이브러리를 통해 아래 짧은 코드로 간단히 수행해 볼 수 있습니다.

수행 전 tensorflow 와 keras 가 설치가 되어있지 않으면 꼭 설치해야 합니다.

pip install tensorflow keras
from keras.datasets import mnist
# MNIST 데이터셋을 로드합니다.
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# train_images의 shape를 출력합니다.
print(train_images.shape)  # (60000, 28, 28)이 출력됩니다.
# train_labels의 첫 10개를 출력합니다.
print(train_labels[:10])  # [5 0 4 1 9 2 1 3 1 4]와 같이 출력됩

Iris Dataset 에 대하여

Iris 데이터셋은 통계학과 머신러닝에서 자주 사용되는 데이터셋 중 하나입니다. 이 데이터셋은 붓꽃(Iris)의 품종을 분류하기 위한 데이터셋으로, 총 세 가지 품종(Setosa, Versicolor, Virginica)의 정보가 각각 50개씩 총 150개의 샘플로 구성되어 있습니다.

Iris 데이터셋

출처 : Wikipedia

각 샘플은 아래와 같은 네 가지 특징을 가지고 있습니다.

  1. 꽃받침(sepal)의 길이
  2. 꽃받침의 너비
  3. 꽃잎(petal)의 길이
  4. 꽃잎의 너비

Iris 데이터셋의 각 샘플은 이 네 가지 특징에 대한 수치와 그에 해당하는 붓꽃의 품종으로 구성되어 있습니다. 이 데이터셋은 각 특징들 간의 관계를 분석하거나, 머신러닝 모델을 학습시키는데 주로 사용됩니다. Iris 데이터셋은 다양한 머신러닝 알고리즘과 유용한 도구가 포함된 Scikit-learn 라이브러리를 통해서 가져 올수 있습니다.

from sklearn import datasets
iris = datasets.load_iris()

위 코드를 실행하면, Iris 데이터셋이 ‘iris’라는 변수에 저장되게 됩니다. 이후 ‘iris.data’로 데이터를, ‘iris.target’으로 타겟값(붓꽃의 품종)을 확인할 수 있습니다. pip 나 conda 명령어중 한가지 명령어를 통해 Scikit-learn을 설치할 수 있습니다.

pip 명령어 사용시

pip install scikit-learn

Conda 명령어 사용시

conda install scikit–learn

만약 설치 오류가 발생하거나 이미 ScyPi, Numpy 가 설치 되어 있다면 다음 명령어로 수행 합니다.

conda install -c conda-forge scikit-learn

참고로, Scikit-learn이 이미 설치되어 있다면, 별도로 Iris 데이터셋을 다운로드 받을 필요는 없습니다. 정상으로 설치가 되었다면 다음 소스를 통해 예제가 출력되는지 확인 해 봅니다.

from sklearn import datasets
 
# Iris 데이터셋 로드
iris = datasets.load_iris()
 
# 데이터셋에서 처음 5개의 샘플을 출력
print(“First 5 samples:”)
print(iris.data[:5])
 
# 해당 샘플들의 타겟값(붓꽃의 품종) 출력
print(“\nTarget of the samples:”)
print(iris.target[:5])

LSTM(Long Short-Term Memory) 쉽게 이해하기

LSTM(Long Short-Term Memory)은 순환 신경망(Recurrent Neural Network, RNN)의 한 종류로서, 시퀀스 데이터 (시계열 데이터, 텍스트 등)를 처리하기 위해 신경망 입니다. 이전에 배운 것들을 기억할 수 있도록 컴퓨터 의 “일기장” 을 바로 LSTM 이라고 할 수 있습니다. 즉, “일기장”을 찾아보면서 이전에 무슨 일이 있었는지 확인을 할 수 있으며 미래에 무슨 일이 일어날지 예측을 할 수 있습니다.

예를 들어, 작곡을 할 때, LSTM은 이전에 어떤 음이 나왔었는지 기억하고, 그 다음에 어떤 음이 나와야 할지 도와줍니다. 현재도 실제로 아티스트들은 이미 Ai를 통해 작곡을 하고 수 있습니다.

RNN(순환 신경망)은 이전 시점의 출력을 현재 시점의 입력에 포함시켜 정보를 순환시키는 구조를 가지고 있습니다. 하지만, 시퀀스가 길어질수록 이전 시점의 정보가 잘 전달되지 않는 ‘장기 의존성 문제’ 를 해결하기 위해 ‘셀 상태’라는 개념을 도입했습니다. 셀 상태는 LSTM 셀을 통과하는 동안 정보를 전달하는 ‘Information Highway’와 같습니다. LSTM에서는 게이트라는 구조를 통해 셀 상태에 어떤 정보를 추가하거나 제거할지 결정합니다. 이로 인해 LSTM은 긴 시퀀스에서도 이전 정보를 잘 기억하고 전달할 수 있습니다.

이 이미지는 LSTM “셀”의 내부 구조를 보여줍니다. 각각의 작은 박스는 다른 역할을 하는 “게이트”를 나타내고, 화살표는 정보가 어떻게 이동하는지를 보여줍니다. 이 중 가장 중요한 부분은 가장 위에 있는 수평선인 ‘셀 상태’입니다. 바로 “일기장”과 같은 역할을 하며 이를 통해 LSTM은 장기적인 정보를 저장하고 전달할 수 있습니다.

LSTM 활용사례

1. 자연어 처리(Natural Language Processing, NLP): LSTM은 텍스트 데이터에서 잘 작동하므로, 감성 분석, 텍스트 생성, 기계 번역 등 다양한 NLP 작업에 활용될 수 있습니다.

2. 시계열 예측(Time Series Prediction): LSTM은 시간에 따른 패턴을 학습할 수 있으므로, 주식 가격 예측, 날씨 예측 등 시계열 데이터의 예측에 사용될 수 있습니다.

3. 음성 인식(Speech Recognition): LSTM은 시간에 따라 변화하는 음성 신호를 처리하는 데 유용하므로, 음성 인식 기술에도 사용됩니다.

4. 음악 생성(Music Generation): LSTM은 시퀀스 데이터를 생성하는 데에도 사용될 수 있습니다. 이러한 특성을 이용해 음표의 시퀀스를 학습하고 새로운 음악을 생성하는 데에 사용될 수 있습니다.