머신러닝에서의 좋은 데이터와 나쁜 데이터란?

우리가 목표하는 바는 알고리즘을 통해 어떤 데이터에 훈련시키는 것으므로 문제가 될 수 있는 것은 '데이터' 입니다.
데이터가 올바르지 못하면 원하는 결과를 얻을 수 없을 것입니다. 따라서, 머신러닝에서의 나쁜 데이터 예제 4가지를 살펴보도록 하겠습니다.


1. 충분하지 않은 양의 훈련 데이터

대부분의 머신러닝 알고리즘이 잘 작동하기 위해서는 데이터가 많아야 합니다. 
아주 간단한 문제에서조차도 수천 개의 데이터가 필요하고 이미지나 음성 인식 같은 복잡한 문제의 경우 수백만 개가 필요할 수 있습니다.


2. 대표성 없는 훈련 데이터

일반화가 잘되기 위해서는 우리가 일반화하기 원하는 새로운 사례를 훈련 데이터가 잘 대표하는 것이 중요합니다.
앞서 실습한 선형 모델을 훈련시키기 위해 사용한 나라의 집합에는 일부 나라가 빠져 있어 대표성을 가질 수 없습니다.
앞서 실습한 예제의 데이터(Fig. 1)에서는 38개의 나라만 사용되었음을 확인할 수 있습니다.
누락된 나라를 추가하면 모델이 크게 변경될 뿐만 아니라, 간단한 선형 모델은 적용되지 않습니다.

< Fig. 1. 대표성을 가지지 못하는 데이터 예시 >


대표성을 가지는 데이터를 사용하는 것이 가장 좋지만, 결코 쉬운일은 아닙니다.
샘플이 작으면 샘플링 잡음(Sampling Noise)[각주:1]이 생기고, 표본 추출 방법이 잘못되면 대표성을 띄지 못할 수 있습니다. 이를 샘플링 편향(Sampling Bias)이라고 합니다.


3. 낮은 품질의 데이터

훈련 데이터가 에러, 이상치, 잡음으로 가득하다면 머신러닝 시스템이 내재되어 있는 패턴을 찾기 어려울 수 있습니다.
따라서, 데이터 전처리에 신경을 곤두세울 필요가 있습니다.


4. 관련 없는 특성

훈련 데이터에 관련 없는 특성이 적고 관련 있는 특성이 충분해야 학습을 진행할 수 있습니다.
훈련에 사용할 좋은 특성들을 찾아야 하며, 이를 특성 공학(Feature Engineering)이라고 합니다.
특성 공학은 다음과 같은 작업을 포함합니다.

  • 특성 선택 (Feature Selection) : 가지고 있는 특성 중에서 훈련에 가장 유용한 특성을 선택합니다.
  • 특성 추출 (Feature Extraction) : 특성을 결합하여 더 유용한 특성을 만듭니다.
  • 새로운 데이터를 수집하여 새로운 특성을 만듭니다.



References

  • 오렐리앙 제롱, '핸즈온 머신러닝', 한빛미디어, 2018


  1. 우연에 의한 대표성 없는 데이터, Outlier [본문으로]

사례 기반 학습과 모델 기반 학습

머신러닝 시스템은 어떻게 일반화되는가에 따라 분류할 수 있습니다. 대부분의 머신러닝은 예측하는 것이 목표입니다.

다시 말하면, 주어진 훈련 데이터로 학습하지만 훈련 데이터에서는 본 적 없는 새로운 데이터로 일반화되어야 한다는 뜻입니다.

일반화를 위한 두 가지 접근법은 아래와 같습니다.


사례 기반 학습

가장 간단한 형태의 학습은 단순히 기억하는 것입니다. 아마도 가장 간단한 형태의 학습은 단순히 기억하는 것입니다. 
스팸 필터를 이러한 방식으로 만들면 사용자가 스팸이라고 지정한 메일과 동일한 모든 메일을 스팸으로 분류합니다. 최악의 방법은 아니지만 최선도 아닙니다.

스팸 메일과 동일한 메일을 스팸이라고 지정하는 대신 스팸 메일과 매우 유사한 메일을 구분하도록 스팸 필터를 프로그램할 수 있습니다. 

이렇게 하려면 두 메일 사이의 유사도(Similarity)를 측정해야 합니다. 두 메일 사이의 매우 간단한 유사도 측정 방법은 공통으로 포함한 단어의 수를 세는 것입니다. 스팸 메일과 공통으로 가지고 있는 단어가 많으면 스팸으로 분류합니다. 이를 사례 기반 학습(Instance-Based Learning)이라고 합니다. 시스템이 사례를 기억함으로써 학습합니다. 그리고 유사도 측정을 사용해 새로운 데이터에 일반화합니다.

< Fig. 1. 사례 기반 학습 예시 >


모델 기반 학습

샘플로부터 일반화시키는 다른 방법은 이 샘플들의 모델을 만들어 예측하는 것입니다.

이를 모델 기반 학습(Model-Based Learning)이라고 합니다.


< Fig. 2. 모델 기반 학습 예시 >


모델 기반 학습의 예시로 돈이 사람을 행복하게 만드는지 알아보도록 하겠습니다.

OECD 웹사이트에서 더 나은 삶의 지표(Better Life Index) 데이터와 IMF 웹사이트에서 1인당 GDP 통계를 내려받습니다.

두 데이터 테이블을 합치고 1인당 GDP로 정렬합니다.


< Fig. 3. 1인당 GDP 순으로 정렬한 데이터 >


위의 데이터를 보기 편하게 시각화 합니다.


< Fig. 4. 그래프로 표현한 1인당 GDP와 삶의 질 관계 >


Fig. 4를 살펴보면 어떠한 경향을 찾을 수 있습니다. 삶의 만족도는 국가의 1인당 GDP가 증가할수록 거의 선형으로 상승하는 것을 확인할 수 있었습니다.

그러므로, 1인당 GDP의 선형 함수로 삶의 만족도를 모델링 해보겠습니다. 이 단계를 모델 선택(Model Selection)이라고 합니다.

1인당 GDP라는 특성 하나를 가진 삶의 만족도에 대한 선형 모델(Linear Model)입니다.


삶의 만족도 = 𝜃₀ + 𝜃₁ × 1인당 GDP


이 모델은 두 개의 모델 파라미터 𝜃₀와 𝜃₁을 가집니다. 이 모델 파라미터를 조정하여 Fig. 5 처럼 어떤 선형 함수를 표현하는 모델을 얻을 수 있습니다.

모델을 사용하기 전에 𝜃₀와 𝜃₁을 정의해야 합니다. 모델이 최상의 성능을 내도록 하는 값을 어떻게 유추할 수 있을까요?

이 질문에 대답하기 위해서는 측정 지표를 정해두어야 합니다. 모델이 얼마나 좋은지, 나쁜지를 결정하는 효용 함수[각주:1](또는 적합도 함수[각주:2])를 정의하거나,

얼마나 이 모델이 나쁜지 측정하는 비용 함수[각주:3]를 정의할 수 있습니다. 선형 회귀에서는 보통 선형 모델의 예측과 훈련 데이터 사이의 거리를 재는 비용 함수를 주로 사용합니다.


여기에서 선형 회귀 알고리즘이 등장합니다. 알고리즘에 훈련 데이터를 공급하면 데이터에 가장 잘 맞는 선형 모델의 파라미터를 찾습니다.

이를 모델을 훈련[각주:4]시킨다고 말합니다. 실습을 통해 해당 모델을 훈련시켜보도록 하겠습니다.

아래의 파이썬 코드는 데이터를 로드하고 준비한 다음 산점도를 그려 시각화하고 선형 모델을 훈련하여 예측하는 과정을 보여줍니다.


사이킷런을 활용한 선형 모델의 훈련과 실행 코드

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn
import warnings
warnings.filterwarnings(action="ignore", module="scipy", message="^internal gelsd")


# Load the data
oecd_bli = pd.read_csv("BLI.csv", thousands=',')
gdp_per_capita = pd.read_csv("WEO.csv", thousands=',', delimiter='\t',
encoding='latin1', na_values="n/a")

# Pre-process the data
def prepare_country_stats(oecd_bli, gdp_per_capita):
oecd_bli = oecd_bli[oecd_bli["INEQUALITY"]=="TOT"]
oecd_bli = oecd_bli.pivot(index='Country', columns="Indicator", values="Value")
gdp_per_capita.rename(columns={"2015": "GDP per capita"}, inplace=True)
gdp_per_capita.set_index('Country', inplace=True)
full_country_stats = pd.merge(left=oecd_bli, right=gdp_per_capita,
left_index=True, right_index=True)
full_country_stats.sort_values(by="GDP per capita", inplace=True)
remove_indices = [0, 1, 6, 8, 33, 34, 35]
keep_indices = list(set(range(36)) - set(remove_indices))
return full_country_stats[["GDP per capita", 'Life satisfaction']].iloc[keep_indices]


# Prepare the data
country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)
X = np.c_[country_stats["GDP per capita"]]
y = np.c_[country_stats["Life satisfaction"]]

# Visualize the data
country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
plt.show()

# Select a linear model
model = sklearn.linear_model.LinearRegression()

# Train the model
model.fit(X, y)

# Make a prediction for Cyprus
X_new = [[22587]] # Cyprus' GDP per capita
print(model.predict(X_new)) # outputs [[ 5.96242338]]


결과

[[ 5.96242338]]

지금까지의 작업을 간단히 요약하자면 다음과 같습니다.


  1. 데이터를 분석합니다.
  2. 모델을 선택합니다.
  3. 훈련 데이터로 모델을 훈련시킵니다.
  4. 마지막으로 새로운 데이터에 모델을 적용해 예측을 하고, 이 모델이 일반화되길 기대합니다.


이와 같은 과정이 머신러닝 프로젝트의 전형적인 형태라고 할 수 있습니다.



Reference

    • 오렐리앙 제롱, '핸즈온 머신러닝', 한빛미디어, 2018
    • https://github.com/ageron/handson-ml/blob/master/01_the_machine_learning_landscape.ipynb

  1. Utility Function [본문으로]
  2. Fitness Function [본문으로]
  3. Loss Function [본문으로]
  4. Training [본문으로]

배치 학습과 온라인 학습


배치 학습(Batch Learning)

배치 학습에서는 시스템이 점진적으로 학습할 수 없습니다. 가용한 데이터를 모두 사용해 훈련시켜야 합니다.

이러한 방식은 시간과 자원을 많이 소모하여 일반적으로 오프라인에서 가동됩니다.

먼저 시스템을 훈련시키고 제품 시스템에 적용하면 더 이상의 학습 없이 실행됩니다.

즉, 학습한 것을 적용할 뿐입니다. 이를 오프라인 학습(Offline Learning)이라고 합니다.


배치 학습 시스템이 새로운 데이터에 대해 학습하려면 전체 데이터를 사용하여 시스템의 새로운 버전을 처음부터 다시 훈련해야 합니다.

이후 이전 시스템을 중지시키고 새로운 시스템으로 교체합니다.


이러한 방식은 간단하고 잘 작동하지만 전체 데이터 셋을 사용해 훈련하는데 몇 시간이 소요될 수 있습니다.

또한, 전체 데이터 셋을 사용해 훈련하기 때문에 시스템 자원을 많이 소모합니다. 자원이 제한된 시스템이 스스로 학습해야 할 때 많은 양의 훈련 데이터를 나르고 학습을 위해 자원을 사용하는 경우 문제를 발생시킬 수 있습니다.



온라인 학습(Online Learning)

온라인 학습에서는 데이터를 순차적으로 한 개씩 또는 미니배치(Mini-Batch)라 부르는 작은 묶음 단위로 주입하여 시스템을 훈련시킵니다.

매 학습 단계가 빠르고 비용이 적게 들어 시스템은 데이터가 도착하는 대로 즉시 학습할 수 있습니다.


온라인 학습은 연속적으로 데이터를 받고 빠른 변화에 스스로 적응해야 하는 시스템에 적합합니다.

컴퓨팅 자원이 제한된 경우에도 적합하다고 할 수 있습니다. 학습이 끝난 데이터는 더 이상 필요하지 않으므로 버리면 됩니다.


온라인 학습 시스템에서 중요한 파라미터 중 하나는 변화하는 데이터에 얼마나 빠르게 적응할 것인지 입니다.

이를 학습률(Learning Rate)이라고 합니다. 학습률을 높게 하면 시스템이 데이터에 빠르게 적응하지만 예전 데이터를 금방 잊어버리게 됩니다.

반대로 학습률이 낮으면 시스템의 관성이 더 커져서 더 느리게 학습됩니다. 하지만 새로운 데이터에 있는 잡음이나 대표성 없는 데이터 포인트에 덜 민감해집니다.


온라인 학습의 가장 큰 문제점은 시스템에 나쁜 데이터가 주입되었을 때 시스템 성능이 점진적으로 감소할 수 있다는 것입니다.

이러한 위험을 줄이기 위해서는 시스템을 면밀히 모니터링하고 성능 감소사 감지되면 즉각적으로 학습을 중지시키는 대처가 필요합니다.



Reference

  • 오렐리앙 제롱, '핸즈온 머신러닝', 한빛미디어, 2018



머신러닝 시스템의 종류는 굉장히 많고, 다음과 같이 크게 3가지로 분류됩니다.

1. 지도, 비지도, 준지도, 강화학습

2. 온라인 학습과 배치 학습

3. 사례 기반 학습과 모델 기반 학습

위의 3가지 머신러닝 기법들은 원하는대로 융합될 수 있습니다.


1. 지도학습과 비지도학습


지도학습(Supervised Learning)

지도학습에는 알고리즘에 주입하는 훈련 데이터에 레이블(Lable)이라는 원하는 답이 포함되어야 합니다.

분류(Classification)가 전형적인 지도 학습 작업이며, 숫자 인식을 좋은 예로 들 수 있습니다.


다른 작업으로는 예측 변수(Predictor Variable)라 불리는 특성(Feature)을 사용해 최종적인 결과를 예측합니다.

위와 같은 종류의 작업을 회귀(Regression)라고 부릅니다.


일부 회귀 알고리즘은 분류에 사용할 수도 있고 사용할 수 없는 경우도 있습니다.

분류에 널리 쓰이는 로지스틱 회귀(Logistic Regression)는 클래스에 속할 확률을 출력합니다.


아래는 가장 중요한 지도 학습 알고리즘들입니다.

    • K-최근접 이웃(k-Nearest Neighbors)
    • 선형 회귀(Linear Regression)
    • 로지스틱 회귀(Logistic Regression)
    • 서포트 벡터 머신(SVM, Support Vector Machine)
    • 결정 트리(Decision Tree)와 랜덤 포레스트(Random Forest)
    • 신경망(Neural Network)



비지도 학습(Unsupervised Learning)

비지도 학습(Unsupervised Learning)은 지도 학습에서 필요했던 레이블이 필요하지 않습니다. 

시스템이 아무런 도움 없이 학습해야 합니다.아래는 가장 중요한 비지도 학습 알고리즘입니다.


    • 군집(Clustering)
      - K-평균(k-Means)
      - 계층 군집 분석(HCA, Hierarchical Cluster Analysis)
      - 기댓값 최대화(Expectation Maximization)

    • 시각화(Visualization)와 차원 축소(Dimensionality Reduction)
      - 주성분 분석(PCA, Principal Component Analysis)
      - 커널 PCA(Kernel PCA)
      - 지역적 선형 임베딩(LLE, Locally-Linear Embedding)
      - t-SNE(t-distributed Stochastic Neighbor Embedding)

    • 연관 규칙 학습(Association Rule Learning)
      - 어프라이어리(Apriori)
      - 이클렛(Eclat)

계층 군집 알고리즘을 사용하면 각 그룹을 더 작은 그룹으로 세분화할 수 있습니다.

시각화 알고리즘은 레이블이 없는 대규모의 고차원 데이터를 넣으면 도식화가 가능한 2D나 3D 표현을 만들어줍니다.

차원 축소는 너무 많은 정보를 잃지 않으면서 데이터를 간소화하는데 사용됩니다. 예를 들어 차의 주행거리는 연식과 매우 연관되어 있으므로 차원 축소 알고리즘으로 두 특성을 차의 마모 정도를 나타내는 하나의 특성으로 합칠 수 있습니다. 이를 특성 추출(Feature Extraction)이라고 합니다.

이상치 탐지는 학습 알고리즘에 주입하기 전에 데이터셋에서 이상한 값을 자동으로 제거하는 작업입니다. 정상 샘플로 훈련되고, 새로운 샘플이 정상인지 아닌지 판단합니다.

연관 규칙 학습은 대량의 데이터에서 특성 간의 흥미로운 관계를 찾습니다. 어떠한 상품을 구매한 사람이 다른 상품을 구매하는 경향이 있다는 것을 찾을 때 활용합니다.



준지도 학습(Semisupervised Learning)

준지도 학습(Semisupervised Learning)에서는 레이블이 일부만 있어도 데이터를 다룰 수 있습니다. 

대부분의 준지도 학습 알고리즘은 지도 학습과 비지도 학습의 조합으로 이루어져 있습니다.


구글 포토 호스팅 서비스가 좋은 예로, 이 서비스에 가족사진을 모두 올리면 사람 A는 사진 1, 5, 11에 있고, 사람 B는 사진 2, 5, 7에 있다고 자동으로 인식합니다.

이는 비지도 학습입니다. 이제 시스템에 필요한 것으로 이 사람들이 누구인가 하는 정보입니다. 사람마다 레이블이 하나씩만 주어지면 사진에 있는 모든 사람의 이름을 알 수 있고,

편리하게 사진을 찾을 수 있습니다.


예를 들어 심층 신뢰 신경망(Deep Belief Network)은 여러 겹으로 쌓은 제한된 볼츠만 머신이라 불리는 비지도 학습에 기초합니다.

RBM이 비지도 학습 방식으로 순차적으로 훈련된 다음 전체 시스템이 지도 학습 방식으로 세밀하게 조정됩니다.



강화 학습(Reinforcement Learning)

강화 학습은 매우 다른 종류의 알고리즘입니다. 여기서는 학습하는 시스템을 에이전트(Agent)라고 부르며 환경(Environment)을 관찰해서 행동(Action)을 실행하고 보상(Reward)을 받습니다. 시간이 지나면서 가장 큰 보상을 얻기 위해 정책(Policy)이라고 부르는 최상의 전략을 스스로 학습합니다. 정책은 주어진 상황에서 에이전트가 어떻게 행동해야 하는지를 판단합니다.

딥마인드의 알파고 프로그램도 강화 학습의 좋은 예라고 할 수 있습니다.



Reference

    • 오렐리앙 제롱, '핸즈온 머신러닝', 한빛미디어, 2018


주어진 데이터 속에 있는 구조를 특정 수식으로 모델화하는 것이 머신러닝의 출발점, 즉 '머신러닝 모델의 3단계'에서 1단계라는 것을 확인하였습니다.

이후, 수식에 포함되는 파라미터를 조정하여 주어진 데이터에 적합하게 맞춰 가는 단계를 수행할 차례입니다.


1. 텐서플로를 이용한 파라미터 최적화

'머신러닝의 개념'에서 이용한 평균 기온 예측의 예를 사용하여 그 다음 단계에 대한 진행 방법을 설명하도록 하겠습니다.

텐서플로의 구조를 이해하는 포인트가 되기 때문에 수식을 사용하여 정확하게 설명하겠지만, 세세한 내용을 모두 이해할 필요는 없습니다.

실제로 여기서 수행하는 계산은 텐서플로가 자동적으로 수행하기 때문에, 각각의 수식이 어떠한 의미를 가지고 있는지를 파악하는 것이 좋습니다.


이 예에서는 파라미터의 좋고 나쁨을 평가하는 기준으로 오차 함수 E를 준비했습니다(식 1-1). '머신러닝 모델의 3단계'에서 2단계에 해당하는 부분입니다. 

식 1-1에 포함되는 파라미터 𝑤₀ ~ 𝑤₄의 값을 변경하면 오차 함수 E의 값도 변화하므로 이는 파라미터 𝑤₀ ~ 𝑤₄의 함수라고 볼 수 있습니다.

<수식 1-1. 파라미터 𝑤₀ ~ 𝑤₄에 대한 함수와 오차함수 E>


식 1-1에 포함된 𝑦𝑛은 𝑛월(𝑛 = 1 ~ 12)의 기온을 식1-1의 상단 식으로 예측한 결과를 나타냅니다.

즉, 식 1-1의 상단 수식에 𝑥 = 𝑛을 대입한 것이 𝑦𝑛 입니다.


<수식 1-2. 시그마를 이용하여 간단히 표현>


수열의 합을 나타내는 기호 시그마(∑)로 다시 쓴 부분에서는 임의의 𝑛에 대해 𝑛⁰ = 1이 되는 관계를 이용합니다.

수식 1-2를 식 1-1에 대입하면 아래의 식이 얻어집니다.


<수식 1-3. 수식1-2를 수식1-1에 대입한 것>


수식 1-3에는 다양한 기호가 포함되어 있는데, 미지의 파라미터는 𝑤₀ ~ 𝑤₄뿐이라는 점에 주의하시기 바랍니다.

수열의 합을 나타내는 기호 시그마(∑)에 포함되는 𝑚과 𝑛은 루프를 돌리기 위한 로컬 변수로 볼 수 있으며, 𝑡𝑛은 그림 1-3에 주어진 월별 평균 기온의 구체적인 관측값이 됩니다.


이렇게 해서 오차 함수 E의 구체적인 모양을 알게 되었으므로 다음은 3단계로서 수식 1-3의 값을 최소로 하는 𝑤₀ ~ 𝑤₄를 결정합니다.

기호가 많아 복잡하게 보이지만, 𝑤₀ ~ 𝑤₄의 함수로 보면 2차 함수에 불과합니다. 

구체적으로는 수식 1-3을 𝑤₀ ~ 𝑤₄각각으로 편미분한 값을 0으로 하는 다음과 같은 연립방정식을 푸는 것입니다.

*편미분이란, 복수의 변수를 갖는 함수에 대해 특정한 하나의 변수로 미분하는 것을 말합니다. 
변수가 하나인 함수 𝑦 = 𝑓(𝑥)의 최대값 / 최소값을 구할 때 미분계수를 0으로 하는 다음 방정식을 풀었는데, 본질에서는 이와 같은 것입니다.


<수식 1-4. 점 𝑥에서의 기울기>


1변수 함수 𝑓(𝑥)의 경우 그 미분계수는 점 𝑥에서 그래프의 기울기를 나타냅니다. 𝑓(𝑥)가 최대/최소가 되는 점에서는 그래프의 기울기가 0이 되므로 수식 1-4가 성립합니다.

다만, 엄밀하게는 그림 1-1과 같이 최대, 최소, 극대, 극소, 정류점(변곡점) 등 몇 군데서 수식 1-4가 성립합니다.

이를테면 𝑓(𝑥)가 최솟값만을 갖는 함수라고 알고 있다면 수식 1-4로 결정되는 𝑥가 𝑓(𝑥)를 최소로 하는 값이라고 단언할 수 있습니다.


<그림 1-1. 그래프의 기울기가 0이 되는 지점>


한편, E(𝑤₀, 𝑤₁, 𝑤₂, 𝑤₃, 𝑤₄)와 같은 다변수 함수의 경우는 어떻게 될까요? 여기서는 간단히 설명하기 위해 다음 2변수 함수의 경우를 생각해보도록 하겠습니다.


<수식 1-5. 2변수 함수 예시>


수식 1-5와 같은 경우 편미분은 다음과 같이 간단히 계산할 수 있습니다.


<수식 1-6. 수식 1-5를 편미분한 결과>


또한, 이를 나열한 벡터를 다음 기호로 나타내며 함수 ℎ(𝑥₁, 𝑥₂)의 '기울기 벡터(Gradient Vector)'라고 합니다.

1변수 함수의 미분계수는 그래프의 기울기라는 의미가 있는데, 이와 마찬가지로 기울기 벡터에도 도형에서의 의미가 있습니다.

먼저, (𝑥₁, 𝑥₂)를 좌표로 하는 평면을 생각하고, 𝑦 = ℎ(𝑥₁, 𝑥₂)의 그래프를 그리면 그림 1-2와 같이 절구 모양의 도형이 그려집니다.

기울기 벡터 ∇ℎ(𝑥₁, 𝑥₂)는 절구 벽면을 올라가는 방향과 일치하고, 그 크기 ||∇ℎ(𝑥₁, 𝑥₂)|| 는 벽을 오르는 기울기와 일치합니다.

절구 벽면의 기울기가 클수록 기울기 벡터도 길어지는 것입니다.


<그림 1-2. 2변수 함수의 기울기 벡터>


따라서 임의의 점 (𝑥₁, 𝑥₂)에서 출발해서 기울기 벡터와 반대 방향으로 나아가면 절구의 벽면을 내려감과 동시에 기울기 벡터의 크기는 점점 작아집니다.

이 예의 경우, 최종적으로 원점 (0, 0)에 도달했을 때 ℎ(𝑥₁, 𝑥₂)는 최소가 되고, 기울기 벡터의 크기도 0이 됩니다.

즉, ℎ(𝑥₁, 𝑥₂)를 최소로 하는 (𝑥₁, 𝑥₂)는 ∇ℎ(𝑥₁, 𝑥₂) = 0라는 조건으로 정해집니다.












딥러닝'심층학습'이라고도 하며, 용어만 보면 뭔가 심오한 이론인 것처럼 느껴진다. 그러나 기본적으로는 다층 신경망을 이용한 머신러닝에 지나지 않는다.

다만, 단순히 계층을 증가시켜 복잡화하는 것이 아니라 해결해야 할 문제에 맞게 각각의 노드에 특별한 역할을 부여하거나, 노드 간의 연결 방식을 다양하게 연구한 것이다.

무조건 노드를 증가시켜 복잡화하는 것이 아니라 각 노드의 역할을 생각하면서 특정 의도를 갖고 구성한 신경망이라고 할 수 있다.


1. 딥러닝의 특징

아래의 합성곱 신경망(CNN)에서 첫 번째 계층 노드에는 1차 함수가 아닌 '합성곱 필터(Convolution Filter)'라는 함수를 사용합니다.

합성곱 필터란, 딥러닝만을 위해 특별히 고안된 것이 아니라 포토샵과 같은 이미지 처리 소프트웨어에서도 많이 이용되는 이미지 필터의 일종입니다.

사진에서 물체의 윤곽을 추출해서 선으로만 그린 그림처럼 변환하는 필터를 개발하는데 사용됩니다. 이를 통해 이미지에 나타난 물체의 특징을 보다 정확하게 포착할 수 있습니다.

<그림 1-1. CNN 구성>


그 뒤에 존재하는 풀링 계층(Pooling Layer)이라는 부분에서는 이미지의 해상도를 낮추는 처리를 합니다.

이는 이미지의 세밀한 부분을 지우는 것으로, 그려져 있는 물체의 본질적인 특징만을 추출하고자 하는 발상에서 비롯되었습니다.


또한, 노드 간 연결 방식을 연구한 특수한 에로 순환 신경망(RNN, Recurrent Neural Network)이 있습니다.

일반적으로 시계열 데이터를 다루는데, 단어가 나열된 문장을 입력 데이터로 하는 자연어 처리에 응용하는 경우가 좋은 예라고 할 수 있습니다.


<그림 1-2. RNN으로 단어를 예측하는 예>


이는 특정 문장이 흔히 보는 자연스러운 문장인지 뭔가 어색한 부자연스러운 문장인지를 판정하는 데 이용됩니다.

예를 들면, 'This is a pen'이라는 네 개의 단어를 차례로 입력해서 'This' 뒤에 'is'가 올 확률, 'is' 뒤에 'a'가 올 확률을 차례로 구합니다.

전부 높은 확률이 나오면 이는 자연스러운 문장이라고 할 수 있는 것입니다.


RNN에서는 이전 중간 계층의 값을 다음 입력에 재이용하는 특징을 가지고 있습니다.

이전에 입력한 단어 정보는 중간 계층에서 서서히 사라지게 되므로 노드 간 연결 방식을 좀 더 연구해서 과거의 정보를 가능한 한 오래 축적하는 등의 테크닉이 이용됩니다.


위와 같은 예로부터 알 수 있듯이 딥러닝의 이면에는 주어진 데이터가 어떻게 처리될지를 생각하면서 최적의 네트워크를 구성해 가는 방대한 시행착오가 감춰져 있습니다.

또한, 이는 어디까지나 '머신러닝 모델의 3단계' 중 1단계라는 것도 상기할 필요가 있습니다. 아무리 잘 만들어진 모델이라도 실제로 계산을 할 수 없다면 활용할 수 없습니다.

그 이후 단계로 나아가기 위해서는 각 네트워크에 대해 효율적으로 파라미터를 최적화하는 알고리즘의 연구도 필요합니다.


딥러닝은 넓은 의미로 머신러닝 중 '신경망(Neural Network)'이라는 모델의 일종입니다. 

딥러닝을 정확하게 이해하기 위해 머신러닝에서의 '모델'의 역할과 일반적인 신경망의 구조 설명할 예정입니다.


1. 머신러닝(Machine Learning)의 개념

머신러닝은 데이터 속에 있는 '수학적인 구조'를 컴퓨터로 계산하여 발견해 내는 구조입니다.

예를 들어, 아래의 그림 1-1은 어느 특정 도시의 올해 1년간 월별 평균 기온을 나타낸 것입니다.

이 데이터를 기반으로 내년 이후의 월별 평균 기온을 예측한다면 어떻게 해야 할까요?


<그림 1-1. 월별 평균 기온 그래프>


가장 간단한 답은 올해 평균 기온과 동일한 수치로 예측하는 것이지만, 조금 더 연구해 볼 여지가 있습니다.

이 그래프에서는 월별 평균 기온이 직선으로 연결되어 있는데, 기후변화의 원리를 생각해보면 월별 평균 기온은 본질적으로 완만한 곡선으로 변화합니다.

이러한 변화에 대해 월별로 무작위적인 노이즈(Noise)가 더해져 그림 1과 같은 모습이 되었다고 생각할 수 있습니다.


<그림 1-2. 완만한 곡선으로 예측한 평균 기온>


따라서, 전체적인 데이터를 살펴보고 그림 1-2와 같은 부드러운 곡선으로 표현해 보았습니다.

내년 이후의 평균 기온을 이 곡선상의 값으로 예측한다면 정확도가 더 높을 것으로 기대할 수 있습니다.


이처럼 주어진 데이터의 수치를 있는 그대로 받아들이는 것이 아니라 그 속에 있는 '원리'를 생각하는 것을 '데이터의 모델화'라고 합니다.

이렇게 해서 생각해 낸 구조가 바로 데이터의 '모델'입니다. 데이터의 모델은 일반적으로 식으로 표현할 수 있습니다.

예를 들면, 그림 2의 곡선이 다음과 같은 4차 함수로 표현된다고 가정해보도록 하겠습니다.


<수식 1-1. 그림 1-2의 완만한 선 그래프>


x = 1, 2, 3, 4 ... 12가 각각의 월을 나타내며, 식 1-1로 계산된 y가 해당 월의 예상 평균 기온이라고 하겠습니다.

각 항의 계수 w값을 잘 조절하면 그림 1-2와 같은 그럴듯한 곡선을 얻을 수 있습니다.


다만, 계수의 값을 구체적으로 결정하기 위해서는 또 하나의 지표가 필요합니다. 이는 위의 식에서 예상되는 값과 실제 데이터의 오차로 판단합니다.

그림 1-1의 기초 데이터 값을 t1, t2, t3 ... t12라고 하겠습니다. 이때 수식 1-1에 x = 1, 2, 3 ... 12를 대입해서 얻은 예상 평균 기온을 y1, y2, y3 ... y12라 하고 다음 값을 계산합니다.

이는 일반적으로 제곱 오차라고 하는데, 월별 예측값과 실제 데이터 차이의 제곱을 더한 값입니다. 전체를 2로 나누는 것은 계산 상황에 따른 것이며 본질적인 것은 아닙니다.


<수식 1-2. 오차 함수(Error Function)>


지금까지의 과정을 간단히 요약하면 아래와 같습니다.[각주:1]

  1. 주어진 데이터를 기반으로 미지의 데이터를 예측하는 식(수식 1-1)을 생각합니다.

  2. 식에 포함된 파라미터의 좋고 나쁨을 판단하는 오차 함수(수식 1-2)를 준비합니다.

  3. 오차 함수를 최소화할 수 있도록 파라미터값을 결정합니다.


이러한 과정을 거쳐 파라미터값이 구체적으로 결정되면 얻어진 식을 이용해 내년 이후의 평균 기온을 예측할 수 있습니다.

만약, 예측의 정밀도가 좋지 않았다면 처음 생각한 식(수식 1-1), 즉 데이터의 '모델'이 적합하지 않았을 수 있습니다.

미지의 데이터에 대한 예측 정밀도를 향상하기 위해서는 최적의 모델, 즉 예측용 식을 발견하는 것이 주요하다고 할 수 있습니다.



2. 신경망(Neural Network)의 필요성

신경망을 설명할 때에는 다른 예제로 데이터의 분류 문제를 설명하려고 합니다.

특정 바이러스가 감염되었는지를 판정하는 간단한 예비 검사가 있고, 검사 결과는 두 종류의 수치(x1, x2)로 주어집니다.

이 두 가지 수치를 기반으로 바이러스의 감염되었을 확률을 구한 다음, 확률이 어느 정도 높은 환자는 정밀 검사로 전환한다고 가정하도록 하겠습니다.


아래의 그림 1-3은 지금까지 예비 검사를 받은 환자의 검사 결과와 실제로 바이러스에 감염되어 있는지를 나타내는 그래프입니다.

이 예비 검사의 정밀도를 조사하기 위해 모든 환자에 대해 예비 검사와 정밀 검사를 모두 수행해서 얻어진 데이터라고 가정합니다.

이 데이터를 기반으로 새로운 검사 결과(x1, x2)에 대해 감염 확률을 계산하는 식을 구하는 것이 본 예제의 과제입니다.


<그림 1-3. 예비 검사의 결과와 실제 감염 상황을 나타낸 그래프>


그림 1-3을 살펴보면 직관적으로 두 그룹으로 분류할 수 있음을 알 수 있습니다.

직선의 오른쪽 위 영역은 감염되어 있을 확률이 높고, 왼쪽 아래 영역은 감염되어 있을 확률이 낮다고 생각할 수 있습니다.

여기서, 이 경계를 나타내는 직선을 수식 1-3과  같이 수식으로 표현해 보도록 하겠습니다.


<수식 1-3. 그림 1-3을 두 그룹으로 분류하는 직선>


수식 1-3은 (x1, x2)라는 두 개의 값을 입력하면 ƒ(x1, x2)라는 하나의 값을 출력하는 함수이고, 그 값이 크고 작음에 따라 감염 확률이 높거나 낮음을 의미합니다.

평면 상의 직선은 y = ax+ b의 형식으로 많이 알려졌지만, 여기서는 x1과 x2로 이루어진 관계식으로 나타내기 위해 이와 같은 형식을 사용하였습니다.

이 형식의 장점은 ƒ(x1, x2)의 값이 ± ∞ 를 향해 증가(감소)해 가는 성질을 확인할 수 있다는 것입니다.


<그림 1-4. 직선을 이용한 분류와 감염 확률로의 변환>


따라서 0부터 1을 향해 값이 변화하는 함수 σ(x)를 준비하고 ƒ(x1, x2)의 값을 대입하면,  검사 결과 (x1, x2)로부터 감염 확률 P(x1, x2)를 구하는 함수를 만들 수 있습니다.[각주:2].

그림 1-4의 아랫부분은 수식을 그래프로 표현한 것입니다. 이는 '머신러닝 모델의 3단계'에서 1단계에 해당합니다.

이후에는 수식 1-4에 포함된 파라미터인 w0, w1, w2의 좋고 나쁨을 판단하는 오차 함수를 준비하고, 이를 최소화하도록 파라미터를 결정하는 흐름으로 진행됩니다.


<수식 1-4. 검사결과로부터 감염 확률을 구하는 함수>


위와 같은 과정을 거쳐 탄생한 모델의 문제점은 바로 주어진 데이터를 직선으로 분류할 수 있다는 전제 조건입니다. 

예를 들면, 주어진 데이터가 그림 1-5과 같은 경우를 생각해보면, 이는 아무리 생각해도 단순하게 직선으로 분류할 수 없고,

그림에 나타냈듯이 구부러진 직선 혹은 곡선을 이용해 분류해야 합니다.


<그림 1-5. 직선으로 분류할 수 없는 데이터의 해>


식 1-3에 나타낸 직선 방정식을 보다 복잡한 수식으로 치환하여 구부러진 직선이나 곡선으로 표현할 수 있으면 되지만, 이는 그리 간단하지 않습니다.

현실의 머신러닝에서 이용하는 데이터는 그림 1-5와 같이 평면에 그릴 수 있을 정도로 단순한 것이 아니기 때문입니다.

예를 들면, 검사 결과 수치가 두 종류가 아닌 20종류일 때, 이를 그림으로 표현하려면 20차원 공간 그래프가 필요합니다.

이를 그림으로 나타내기는 불가능하며 머릿속으로 상상하기도 곤란합니다.


현재의 머신러닝은 기본적으로 데이터 모델, 즉 1단계에서 준비해야만 하는 식 자체는 사람이 생각해내야 합니다.

다만 그런 와중에도 유연성이 높은, 다양한 데이터에 대응할 수 있는 '수식'을 생각하려는 노력이 이어져 왔습니다.

신경망은 이러한 식 중의 한 가지 형태라고 볼 수 있습니다.


그렇다면 수식 1-3과 같이 하나의 단순한 수식으로 결과를 출력하는 것이 아니라 복수의 수식을 조합한 함수를 만드는 것에 대해 생각해 볼 수 있는데, 이것이 신경망입니다.

신경망은 딥러닝의 핵심이 되는 구조이므로 앞으로 차근차근 설명하도록 하겠습니다.


<그림 1-6. 단일 노드로 구성된 신경망>


그림 1-6은 세상에서 가장 간단한 신경망이라고 할 수 있습니다. 이는 수식 1-4를 신경망 형태로 나타낸 것입니다.

왼쪽부터 (x1, x2)라는 두 값을 입력하면 내부에서 ƒ(x1, x2) 값이 계산되고, 이를 시그모이드 함수 σ(x)로 0~1의 값으로 변환한 것이 변수 z로 출력됩니다.

이는 신경망을 구성하는 최소의 유닛으로, 뉴런(Neuron) 혹은 노드(Node)라고 합니다.


위와 같은 노드를 다층으로 중첩함으로써 더욱 복잡한 신경망이 얻어집니다. 그림 1-7은 2계층 노드로 구성된 신경망의 예시입니다. 

첫 번째 계층의 두 노드에는 ƒ(x1, x2)와 ƒ(x1, x2)라는 1차 함수가 부여되어 있는데, 각각의 계수값은 서로 다릅니다.

이들을 시그모이드 함수 σ(x)로 변환한 값의 쌍인 (z1, z2)를 다시 두 번째 계층의 노드로 입력하여 최종적인 출력값 z가 얻어지는 과정을 나타내고 있습니다.


<그림 1-7. 2계층 노드로 구성된 신경망>


이 신경망에는 w10, w11, w12, w20, w21, w22, w0, w1, w2라는 9개의 파라미터가 존재합니다. 

이 값들을 조정함으로써 단순한 직선이 아닌 복잡한 경계선을 표현할 수 있습니다.

마지막의 z값이 감염 확률 P를 나타낸다고 가정하고 있으므로 z = 0.5가 되는 부분이 경계선에 해당합니다. 


이러한 파라미터 값을 잘 조정하여 z = 0.5가 되는 부분을 그리면 그림 1-10의 결과를 얻을 수 있습니다.

이는 각 (x1, x2)에 의한 z의 값을 색의 농담으로 나타낸 것으로, 오른쪽 위 영역이 z > 0.5에 해당합니다.

그림 1-7의 오른쪽 예를 보면 이것만으로는 아직 대응할 수 없다는 것을 확인할 수 있습니다.

이러한 경우에는 노드의 수를 증가시킨, 더 복잡한 신경망을 이용해야 할 것으로 판단됩니다.


노드를 증가시키는 방법에는 몇 가지 패턴이 있습니다. 하나는 계층의 수를 늘려 신경망을 다층화하는 것이고, 

다른 하나는 하나의 계층에 포함된 노드의 수를 늘리는 것입니다. 그림 1-8과 같은 신경망을 구성할 수 있습니다.


<그림 1-8. 보다 복잡한 다층 신경망>


다만, 여기서 신경망의 난해함이 드러납니다. 원칙적으로는 노드의 수를 늘려가면 아무리 복잡한 경계선이라도 그릴 수 있습니다. 

그러나 아무렇게나 노드를 늘려가면 파라미터의 수가 방대해져 파라미터를 최적화하는 3단계의 계산이 곤란해집니다.

이는 현실적인 시간 내에 계산이 끝나지 않는다는 컴퓨터의 성능 문제와 더불어, 최적인 값을 계산하는 알고리즘 그 자체를 만들 수 없는 경우도 생깁니다.


머신러닝을 통해 신경망에 도전한다는 것은 주어진 문제에 대해 실제로 계산할 수 있으며, 데이터의 특성에 맞는 신경망을 구성한다는 것입니다. 

그리하여 다양한 연구자들이 이런 어려움에 계속 도전해 오면서 등장한 것이 딥러닝(Deep Learning)이라는 특별한 형태의 신경망을 이용한 방법입니다.



Reference

  • 나카이 에츠지, '텐서플로로 시작하는 딥러닝', 제이펍, 2009

  1. 아래의 1~3 단계는 앞으로의 설명에서 자주 등장하게 됩니다. 이를 '머신러닝 모델의 3단계'로 표시하도록 하겠습니다. [본문으로]
  2. *머신 러닝의 세계에서는 일반적으로 σ(x)와 같이 0부터 1까지 완만하게 값이 변화하는 함수를 '시그모이드 함수(Sigmoid Function)'라고 합니다. [본문으로]

+ Recent posts