by museonghwang

신경망(Neural Network)과 활성화 함수(Activation Function)의 등장

|

From Perceptron to Neural Network

신경망에대해 살펴보기전에 퍼셉트론의 장단점을 살펴본다면, 퍼셉트론으로 복잡한 함수도 표현할 수 있다는 장점을 가진 반면 원하는 결과를 출력하도록 가중치 값을 적절히 정하는 작업을 여전히 인간이 수동으로 한다는 것이 단점이었습니다. AND, NAND, OR 게이트의 진리표를 보면서 우리 인간이 적절한 가중치 값을 정했습니다

신경망(Neural Net) 은 이 단점을 해결해 주는데, 가중치 매개변수의 적절한 값을 데이터로부터 자동으로 학습하는 능력이 신경망의 중요한 성질입니다.

activation f

이미지 출처 : tibco.com

신경망을 그림으로 나타내면 위 그림처럼 됩니다. 여기에서 가장 왼쪽 줄을 입력층, 맨 오른쪽 줄을 출력층, 중간 줄을 은닉층(입력층이나 출력층과 달리 사람 눈에는 보이지 않아서)이라고 합니다. 위 그림은 앞 장에서 본 퍼셉트론과 특별히 달라 보이지 않고, 실제로 뉴런이 연결되는 방식은 퍼셉트론에서 달라진 것이 없습니다.

퍼셉트론 돌아보기

신경망에서의 신호 전달 방법을 살펴보기 전에 다음과 같은 구조의 네트워크를 생각해봅시다.

fig 3-2

이미지 출처 : 밑바닥부터 시작하는 딥러닝</a>

위 그림은 $x_1$과 $x_2$라는 두 신호를 입력받아 $y$를 출력하는 퍼셉트론입니다. 이 퍼셉트론을 수식으로 나타내면 다음과 같이 됩니다.

[y = \begin{cases} 0 \qquad (b + w_1x_1 + w_2x_2 \leq 0)
1 \qquad (b + w_1x_1 + w_2x_2 > 0) \end{cases}]

여기서 $b$는 편향을 나타내는 매개변수로, 뉴런이 얼마나 쉽게 활성화되느냐를 제어합니다. 한편, $w_1$과 $w_2$는 각 신호의 가중치를 나타내는 매개변수로, 각 신호의 영향력을 제어합니다. 그런데 위 그림의 네트워크에는 편향 $b$가 보이지 않는데, 여기에 편향을 명시한다면 다음과 같이 나타낼 수 있습니다.

fig 3-3

이미지 출처 : 밑바닥부터 시작하는 딥러닝</a>

위 그림에서는 가중치가 $b$이고 입력이 1인 뉴런이 추가되었습니다. 이 퍼셉트론의 동작은 $x_1, x_2, 1$이라는 3개의 신호가 뉴런에 입력되어 각 신호에 가중치를 곱한 후 다음 뉴런에 전달되며, 다음 뉴런에서는 이 신호들의 값을 더하여 그 합이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력합니다.

위 식을 더 간결한 형태로 다시 작성해보면, 조건 분기의 동작(0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력)을 하나의 함수로 나타낼 수 있으며, 이 함수를 $h(x)$라 하면 다음과 같이 표현할 수 있습니다.

[y = h(b + w_1x_1 + w_2x_2)
h(x) = \begin{cases} 0 \qquad (x \leq 0)
1 \qquad (x > 0) \end{cases}]

위 식은 입력 신호의 총합이 $h(x)$라는 함수를 거쳐 변환되어, 그 변환된 값이 $y$의 출력이 됨을 보여주는데, $h(x)$함수는 입력이 0을 넘으면 1을 돌려주고 그렇지 않으면 0을 돌려줍니다.

The emergence of Activation functions

조금 전 $h(x)$라는 함수가 등장했는데, 이처럼 입력 신호의 총합을 출력 신호로 변환하는 함수를 일반적으로 활성화 함수(activation function)라 합니다. 활성화라는 이름이 말해주듯 활성화 함수는 신호의 총합이 활성화를 일으키는지를 정하는 역할을 합니다.

위에서 본 수식에서는 가중치가 곱해진 입력 신호의 총합을 계산하고, 그 합을 활성화 함수에 입력해 결과를 내는 2단계로 처리됩니다. 그래서 위 식은 다음과 같은 2개의 식으로 나눌 수 있습니다.

[a = b + w_1x_1 + w_2x_2
y = h(a) \]

위 식은 가중치가 달린 입력 신호와 편향의 총합을 계산하고, 이를 $a$라 하며, 그리고 $a$를 함수 $h()$에 넣어 $y$를 출력하는 흐름입니다. 지금까지와 같이 뉴런을 큰 원 다음 그림처럼 나타낼 수 있습니다.

fig 3-4

이미지 출처 : 밑바닥부터 시작하는 딥러닝</a>

위 그림에서는 기존 뉴런의 원을 키우고, 그 안에 활성화 함수의 처리 과정을 명시적으로 그려 넣었습니다. 즉, 가중치 신호를 조합한 결과가 $a$라는 노드가 되고, 활성화 함수 $h()$를 통과하여 $y$라는 노드로 변환되는 과정이 분명하게 나타나 있습니다. 즉 활성화 함수가 퍼셉트론에서 신경망으로 가기 위한 길잡이 입니다.

일반적으로 단순 퍼셉트론은 단층 네트워크에서 계단 함수(임계값을 경계로 출력이 바뀌는 함수)를 활성화 함수로 사용한 모델을 가리키고, 다층 퍼셉트론은 신경망(여러 층으로 구성되고 시그모이드 함수 등의 매끈한 활성화 함수를 사용하는 네트워크)을 가리킵니다.


Activation function

Step function

[h(x) = \begin{cases} 0 \qquad (x \leq 0)
1 \qquad (x > 0) \end{cases}]

위 식과 같은 활성화 함수임계값을 경계로 출력이 바뀌는데, 이런 함수를 계단 함수(step function) 라 합니다. 그래서 “퍼셉트론에서는 활성화 함수로 계단 함수를 이용한다”라 할 수 있습니다. 즉, 활성화 함수로 쓸 수 있는 여러 후보 중에서 퍼셉트론은 계단 함수를 채용하고 있습니다. 그렇다면 계단 함수 이외의 함수를 사용하면 어떻게 될까요? 우선 계단 함수를 구현해보겠습니다.

계단 함수는 입력이 0을 넘으면 1을 출력하고, 그 외에는 0을 출력하는 함수입니다. 다음은 이러한 계단 함수를 단순하게 구현한 것 입니다.

# 첫번째 구현
# 이 구현은 단순하고 쉽지만, 인수 x는 실수(부동소수점)만 받아들입니다.
# 즉, 넘파이 배열을 인수로 넣을 수 없습니다.
def step_function(x):
    if x > 0:
        return 1
    else:
        return 0


# 두번째 구현
# 넘파이 배열도 지원하도록 다음과 같이 구현
def step_function(x):
    y = x > 0
    return y.astype(np.int)

앞에서 정의한 계단 함수를 그래프로 출력해보겠습니다.

%matplotlib inline 

import numpy as np
import matplotlib.pylab as plt

def step_function(x):
    return np.array(x > 0, dtype=np.int)

x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1) # y축의 범위 지정
plt.show()

위 그림에서 보듯 계단 함수는 0을 경계로 출력이 0에서 1(또는 1에서 0)로 바뀝니다. 바로 이 그림처럼 값이 바뀌는 형태가 계단처럼 생겼기 때문입니다.

Sigmoid function

다음은 신경망에서 자주 이용하는 활성화 함수인 시그모이드 함수(sigmoid function) 를 나타낸 식입니다.

[h(x) = \frac{1}{1+e^{-x}}]

위 식에서 $exp(-x)$는 $e^{-x}$를 뜻하며, $e$는 자연상수로 2.7182…의 값을 갖는 실수입니다. 위 식으로 나타나는 시그모이드 함수 역시 단순한 함수일 뿐이며, 함수는 입력을 주면 출력을 돌려주는 변환기입니다. 예를 들어 시그모이드 함수에 1.0과 2.0을 입력하면 h(1.0) = 0.731…. h(2.0) = 0.880…처럼 특정 값을 출력합니다.

신경망에서는 활성화 함수로 시그모이드 함수를 이용하여 신호를 변환하고, 그 변환된 신호를 다음 뉴런에 전달합니다. 사실 퍼셉트론과 신경망의 주된 차이는 이 활성화 함수 뿐입니다. 그 외에 뉴런이 여러 층으로 이어지는 구조와 신호를 전달하는 방법은 기본적으로 앞에서 살펴본 퍼셉트론과 같습니다. 그렇다면 시그모이드 함수를 구현해보겠습니다.

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

시그모이드 함수를 그래프로 그리면, 그래프를 그리는 코드는 앞 절의 계단 함수 그리기 코드와 거의 같습니다. 유일하게 다른 부분은 y를 출력하는 함수를 sigmoid 함수로 변경한 곳 입니다.**

import numpy as np
import matplotlib.pylab as plt

def sigmoid(x):
    return 1 / (1 + np.exp(-x))    

X = np.arange(-5.0, 5.0, 0.1)
Y = sigmoid(X)
plt.plot(X, Y)
plt.ylim(-0.1, 1.1) # y축의 범위 지정
plt.show()

ReLU function

활성화 함수로서 계단 함수와 시그모이드 함수를 소개했는데, 시그모이드 함수는 신경망 분야에서 오래전부터 이용해왔으나, 최근에는 ReLU(Rectifted Linear Unit)함수를 주로 이용합니다.

ReLU는 입력이 0을 넘으면 그 입력을 그대로 출력하고, 0 이하이면 0을 출력하는 함수로 수식으로는 다음과 같이 쓸 수 있습니다.

[h(x) = \begin{cases} x \qquad (x > 0)
0 \qquad (x \leq 0) \end{cases}]

ReLU 함수에 대하여 간단하게 구현해보고 시각화를 해보겠습니다.

def relu(x):
    return np.maximum(0, x)

x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)
plt.plot(x, y)
plt.ylim(-1.1, 5.1) # y축의 범위 지정
plt.show()

Step function VS Sigmoid function

시그모이드 함수와 계단 함수를 비교해보겠습니다.

import numpy as np
import matplotlib.pylab as plt

def sigmoid(x):
    return 1 / (1 + np.exp(-x))    

def step_function(x):
    return np.array(x > 0, dtype=np.int)

x = np.arange(-5.0, 5.0, 0.1)
y1 = sigmoid(x)
y2 = step_function(x)

plt.plot(x, y1, label="sigmoid")
plt.plot(x, y2, linestyle="--", label="step_function")
plt.xlabel("X") # x축 이름
plt.ylabel("y") # y축 이름
plt.ylim(-0.1, 1.1)
plt.legend()
plt.show()

계단 함수

  • 계단 함수는 0을 경계로 출력이 갑자기 바뀝니다.
  • 계단 함수가 0과 1 중 하나의 값만 돌려줍니다.

시그모이드 함수

  • 시그모이드 함수는 부드러운 곡선이며 입력에 따라 출력이 연속적으로 변화합니다. 시그모이드 함수의 이 매끈함이 신경망 학습에서 아주 중요한 역할을 하게 됩니다.
  • 시그모이드 함수는 실수(0.731…, 0.880… 등)를 돌려준다는 점도 다릅니다. 다시 말해 퍼셉트론에서는 뉴런 사이에 0 혹은 1이 흘렀다면, 신경망에서는 연속적인 실수가 흐릅니다.

공통점

  • 큰 관점에서 보면 둘은 같은 모양을 하고 있습니다. 둘 다 입력이 작을 때의 출력은 0에 가깝고 (혹은 0이고), 입력이 커지면 출력이 1에 가까워지는(혹은 1이 되는) 구조입니다.
  • 즉, 계단 함수와 시그모이드 함수는 입력이 중요하면 큰 값을 출력하고 입력이 중요하지 않으면 작은 값을 출력합니다.
  • 입력이 아무리 작거나 커도 출력은 0에서 1 사이라는 것도 둘의 공통점입니다.
  • 둘 다 비선형 함수입니다.


Non-linear function

계단 함수와 시그모이드 함수의 중요한 공통점으로, 둘 모두는 비선형 함수입니다. 시그모이드 함수는 곡선, 계단 함수는 계단처럼 구부러진 직선으로 나타나며, 동시에 비선형 함수로 분류됩니다.

신경망에서는 활성화 함수로 비선형 함수를 사용해야 합니다.

달리 말하면 선형 함수를 사용해서는 안 됩니다. 왜 선형 함수는 안 되는 걸까? 그 이유는 바로 선형 함수를 이용하면 신경망의 층을 깊게 하는 의미가 없어지기 때문입니다.

선형 함수의 문제는 층을 아무리 깊게 해도 ‘은닉층이 없는 네트워크’로도 똑같은 기능을 할 수 있다는 데 있습니다.

구체적으로 설명해주는 간단한 예를 생각해보면, 선형 함수인 $h(x) = cx$를 활성화 함수로 사용한 3층 네트워크를 떠올려보자. 이를 식으로 나타내면 $y(x) = h(h(h(x)))$가 됩니다. 이 계산은 $y(x) = c * c * c * x$처럼 곱셈을 세 번 수행하지만, 실은 $y(x) = ax$와 똑같은 식입니다. $a = c^3$이라고만 하면 끝이다. 즉, 은닉층이 없는 네트워크로 표현할 수 있습니다.

이 예처럼 선형 함수를 이용해서는 여러 층으로 구성하는 이점을 살릴 수 없습니다. 그래서 층을 쌓는 혜택을 얻고 싶다면 활성화 함수로는 반드시 비선형 함수를 사용해야 합니다.

Read more

퍼셉트론 (Perceptron)

|

Perceptron

이번 게시물에서는 모든 신경망(Neural net)의 기본이 되는 퍼셉트론(Perceptron) 에 대해서 알아보겠습니다. 신경망이 각광을 받게 된 지는 얼마되지 않았습니다만, 그보다 훨씬 전부터 신경망과 퍼셉트론에 대해서 많은 연구가 있어왔습니다. 퍼셉트론(perceptron) 알고리즘은 프랑크 로젠블라트(Frank Rosenblat)가 1957년에 고안한 알고리즘으로 신경망(딥러닝)의 기원이 되는 알고리즘이며, 신경망과 딥러닝으로 나아가는 데 중요한 아이디어를 배울 수 있습니다.

퍼셉트론(인공 뉴런, 단순 퍼셉트론)은 다수의 신호를 입력으로 받아 하나의 신호를 출력합니다. 여기서 말하는 신호란 전류나 강물처럼 흐름이 있는 것으로 전류가 전선을 타고 흐르는 전자를 내보내듯, 퍼셉트론 신호도 흐름을 만들고 정보를 앞으로 전달합니다. 퍼셉트론 신호는 ‘흐른다/안 흐른다(1이나 0)’의 두 가지 값을 가질 수 있습니다.

fig 2-1

이미지 출처 : 밑바닥부터 시작하는 딥러닝</a>

  • $x_1$과 $x_2$ : 입력 신호
  • $y$ : 출력 신호
  • $w_1$과 $w_2$ : 가중치
  • 그림의 원 : 뉴런 혹은 노드

위 그림은 입력으로 2개의 신호를 받은 퍼셉트론의 예입니다. 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해집니다($w_1x_1$, $w_2x_2$). 그리고 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력합니다(뉴런이 활성화한다). 여기서 그 한계를 임계값이라 하며, $\theta$ 기호로 나타냅니다.

이미지 출처 : javapoint

위 퍼셉트론은 총 4개의 신호 $(x_1, \cdots, x_4)$ 를 입력받습니다. 각 신호는 연산을 위한 가중치 $(w_1, \cdots, w_4)$ 를 가지고 있습니다. 가중치는 각 신호가 주는 영향력을 조절하는 요소로 추후 학습 과정에서 이 값을 업데이트하게 됩니다. 퍼셉트론은 모든 연산의 합이 임계값 $\theta$ 를 넘으면 $1$ 을, 넘지 못하면 $0$ 을 출력합니다. 입력 신호를 2개로 단순화하여 퍼셉트론이 작동하는 방식을 수식으로 나타내면 아래와 같습니다.

[y = \begin{cases} 0 \qquad (w_1x_1 + w_2x_2 + w_3x_3 + w_4x_4 \leq \theta)
1 \qquad (w_1x_1 + w_2x_2 + w_3x_3 + w_4x_4 > \theta) \end{cases}]

그리고 이를 신호가 $n$ 개인 경우로 일반화 하면 아래의 수식과 같이 나타낼 수 있습니다.

[y = \begin{cases} 0 \qquad (\sum^n_{i=1} w_ix_i \leq \theta)
1 \qquad (\sum^n_{i=1} w_ix_i > \theta) \end{cases}]

정리하지면, 퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여합니다. 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용합니다. 즉, 가중치가 클수록 해당 신호가 그만큼 더 중요함을 뜻합니다.


Logic gate

AND gate

이번에는 논리 게이트(Logic gate)에 대해 알아보겠습니다.

처음으로 알아볼 게이트는 AND 게이트입니다. AND 게이트는 입력이 둘이고 출력은 하나입니다. 다음 표는 AND 게이트의 진리표로, 두 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력합니다.

x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1

이 AND 게이트를 퍼셉트론으로 표현하고 싶다면 진리표대로 작동하도록 하는 $w_1, w_2, \theta$의 값을 정해야 합니다. AND 게이트를 만족하는 매개변수 조합은 무한히 많습니다. 가령 $(w_1, w_2, \theta)$가 $(0.5, 0.5, 0.7)$일 때, 또 $(0.5, 0.5, 0.8)$이나 $(1.0, 1.0, 1.0)$ 때 모두 AND 게이트의 조건을 만족합니다. 매개변수를 이렇게 설정하면 $x_1$과 $x_2$모두가 1일 때만 가중 신호의 총합이 주어진 임계값을 웃돌게됩니다.

위 매개변수를 고려하여 AND gate를 파이썬으로 구현해보겠습니다. x1과 x2를 인수로 받는 AND라는 함수입니다.

def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    tmp = x1*w1 + x2*w2
    if tmp <= theta:
        return 0
    elif tmp > theta:
        return 1

매개변수 w1, w2, theta는 함수 안에서 초기화하고, 가중치를 곱한 입력의 총합이 임계값을 넘으면 1을 반환하고 그 외에는 0을 반환합니다.

print(AND(0, 0)) # 0을 출력
print(AND(1, 0)) # 0을 출력
print(AND(0, 1)) # 0을 출력
print(AND(1, 1)) # 1을 출력

NAND 게이트

NAND gate는 Not AND를 의미하며, 그 동작은 AND 게이트의 출력을 뒤집은 것이 됩니다. 진리표로 나타내면 아래 표처럼 $x_1, x_2$과 가 모두 1일 때만 0을 출력하고, 그 외에는 1을 출력합니다.

x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0

NAND 게이트를 표현하려면 예를 들어 $(w_1, w_2, \theta) = (-0.5, -0.5, -0.7)$ 조합이 있습니다. 사실 AND 게이트를 구현하는 매개변수의 부호를 모두 반전하기만 하면 NAND 게이트가 됩니다.

OR 게이트

OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로입니다.

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1

여기서 중요한 점은 퍼셉트론의 구조는 AND, NAND, OR 게이트 모두에서 똑같다는 것입니다. 세 가지 게이트에서 다른 것은 매개변수(가중치와 임계값)의 값 뿐입니다. 즉, 똑같은 구조의 퍼셉트론이 매개변수의 값만 적절히 조정하여 AND, NAND, OR로 변신하는 것입니다.

여기서 퍼셉트론의 매개변수 값을 정하는 것은 컴퓨터가 아니라 인간이 직접 진리표하는 ‘학습 데이터’를 보면서 매개변수의 값을 생각했습니다. 기계학습 문제는 매개변수의 값을 정하는 작업을 컴퓨터가 자동으로 하도록 합니다. 즉 학습이란 적절한 매개변수 값을 정하는 작업이며, 사람은 퍼셉트론의 구조(모델)를 고민하고 컴퓨터에 학습할 데이터를 주는 일을 합니다.


가중치(Weight)와 편향(Bias) 도입

앞에서 구현한 AND 게이트는 직관적이고 알기 쉽지만, 앞으로를 생각해서 다른 방식으로 수정해야 합니다. 첫번째 식의 $\theta$를 $-b$로 치환하면 퍼셉트론의 동작이 다음처럼 됩니다.

[y = \begin{cases} 0 \qquad (b + w_1x_1 + w_2x_2 \leq 0)
1 \qquad (b + w_1x_1 + w_2x_2 > 0) \end{cases}]

  • $b$ : 편향($bias$)
  • $w_1$과 $w_2$ : 가중치

위 식의 관점에서 해석해보자면, 퍼셉트론은 입력신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력합니다. 넘파이를 이용하여 위 식을 구현해 보겠습니다.

import numpy as np

x = np.array([0, 1])     # 입력
w = np.array([0.5, 0.5]) # 가중치
b = -0.7                 # 편향
np.sum(w*x) + b # 대략 -0.2(부동소수점 수에 의한 연산 오차)

[OutPut]
-0.19999999999999996

여기에서 $-\theta$가 편향 $b$로 치환되었고, 편향은 가중치 $w_1, w_2$와 기능이 다르다는 사실에 주의 해야합니다.

  • 가중치 $w_1$과 $w_2$ : 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수
  • 편향$(b)$ : 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조절하는 매개변수

예를 들어 $b$가 -0.1이면 각 입력 신호에 가중치를 곱한 값들의 합이 0.1을 초과할 때만 뉴런이 활성화합니다. 반면 $b$가 -20.0이면 각 입력 신호에 가중치를 곱한 값들의 합이 20.0을 넘지 않으면 뉴런은 활성화하지 않습니다.

이처럼 편향의 값$(bias)$은 뉴런이 얼마나 쉽게 활성화되는지를 결정합니다.

AND gate 구현

def AND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = AND(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

[OutPut]
(0, 0) -> 0
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 1

NAND gate 구현

def NAND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([-0.5, -0.5]) # AND 와는 가중치(w와 b)만 다르다.
    b = 0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
    
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = NAND(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

[OutPut]
(0, 0) -> 1
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0

OR gate 구현

def OR(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5]) # AND 와는 가중치(w와 b)만 다르다.
    b = -0.2
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = OR(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

[OutPut]
(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 1


퍼셉트론의 한계

XOR gate

XOR 게이트는 배타적 논리합이라는 논리 회로입니다. 다음 표와 같이 $x_1$과 $x_2$중 한쪽이 1일 때만 1을 출력합니다.

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 0

지금까지 본 퍼셉트론으로는 이 XOR 게이트를 구현할 수 없습니다. 다음 그림으로 XOR 게이트를 좌표평면에 표시했는데, 0을 원(O), 1을 삼각형(△)으로 표시했습니다. AND, NAND, OR 게이트처럼 직선 하나로 O와 △을 나누는 영역을 만들어낼 수 있을까라는 질문에는 답을 할 수 없습니다.

fig 2-7

이미지 출처 : 밑바닥부터 시작하는 딥러닝</a>

위 그림의 O과 △을 직선 하나로 나누는 방법은 아무리 생각해도 떠오르지 않습니다. 사실 직선 하나로 나누기란 불가능 합니다.

선형과 비선형

직선 하나로는 위 그림의 O과 △을 나눌 수 없습니다. 하지만 다음 그림처럼 ‘직선’ 이라는 제약을 없앤다면 가능합니다.

fig 2-8

이미지 출처 : 밑바닥부터 시작하는 딥러닝</a>

퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있습니다. 위 그림 같이 곡선은 표현할 수 없다. 위 그림과 같은 곡선의 영역을 비선형 영역, 직선의 영역을 선형 영역이라고 합니다. 퍼셉트론의 한계는 정확히 말하면 단층 퍼셉트론(single Layer perceptron) 으로는 XOR 게이트를 표현할 수 없다 또는 단층 퍼셉트론으로는 비선형 영역을 분리할 수 없다 가 됩니다. 앞으로 퍼셉트론을 조합하여, 즉 층을 쌓아서 XOR 게이트를 구현하는 모습을 보게 됩니다.


Multi-layer perceptron

퍼셉트론으로는 XOR 게이트를 표현할 수 없었습니다. 하지만 퍼셉트론의 아름다움은 ‘층을 쌓아’ 다층 퍼셉트론(multi-layer perceptron)을 만들 수 있다는데 있습니다. XOR 게이트를 만드는 방법은 다양합니다. 그중 하나는 앞서 만든 AND, NAND, OR 게이트를 조합하는 방법입니다.**

fig 2-9

fig 2-11

이미지 출처 : 밑바닥부터 시작하는 딥러닝</a>

위 그림과 같은 조합이라면 XOR 게이트를 구현할 수 있는데, $x_1$과 $x_2$가 입력 신호, $y$가 출력 신호입니다. $x_1$과 $x_2$는 NAND와 OR 게이트의 입력이 되고, NAND와 OR의 출력이 AND 게이트의 입력으로 이어집니다.

위 그림의 조합이 정말 XOR를 구현하는지 살펴보면, NAND의 출력을 $s_1$, OR의 출력을 $s_2$로 해서 진리표를 만들면 다음 표처럼 됩니다. $x_1, x_2, y$에 주목하면 분명히 XOR의 출력과 같습니다.

fig 2-12

이미지 출처 : 밑바닥부터 시작하는 딥러닝</a>

XOR gate 구현

XOR 게이트를 파이썬으로 구현해보겠습니다. 지금까지 정의한 함수 AND, NAND, OR를 사용하면 구현할 수 있습니다.**

def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

print(XOR(0, 0)) # 0을 출력
print(XOR(1, 0)) # 1을 출력
print(XOR(0, 1)) # 1을 출력
print(XOR(1, 1)) # 0을 출력

이로써 XOR 게이트를 완성했습니다. 지금 구현한 XOR를 뉴런을 이용한 퍼셉트론으로 표현하면 다음 그림처럼 됩니다.

fig 2-13

이미지 출처 : 밑바닥부터 시작하는 딥러닝</a>

XOR는 위 그림과 같이 다층 구조의 네트워크입니다. 그런데 위의 퍼셉트론은 지금까지 본 AND, OR 퍼셉트론과 형태가 다릅니다. 실제로 AND, OR가 단층 퍼셉트론인데 반해, XOR는 2층 퍼셉트론입니다. 이처럼 층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라 합니다.

위 그림과 같이 2층 퍼셉트론에서는 0층에서 1층으로 신호가 전달되고, 이어서 1층에서 2층으로 신호가 전달됩니다. 이 동작을 더 자세히 서술하면 다음과 같습니다.

  1. 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보낸다.
  2. 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 $y$를 출력한다.

이상으로 2층 구조를 사용해 퍼셉트론으로 XOR 게이트를 구현할 수 있게 되었습니다. 다시 말해 단층 퍼셉트론으로는 표현하지 못한 것을 층을 하나 늘려 구현할 수 있었습니다. 이처럼 퍼셉트론은 층을 쌓아(깊게 하여) 더 다양한 것을 표현할 수 있습니다.

Read more

CS231n Lecture1 Review

|

Hits


해당 게시물은 Standford 2017 CS231n 강의와 2022년 슬라이드를 바탕으로 작성되었습니다.

Welcome to CS231n

image

전 세계에서 매일 무수한 센서로부터 엄청나게 많은 시각 데이터가 쏟아져 나오고 있습니다.

CISCO에서 수행한 2015 ~ 2017년도까지의 한 통계자료에 따르면 인터넷 트래픽 중 80%의 지분은 바로 비디오 데이터입니다. 심지어 이 결과는 사진 같은 다른 데이터들을 모두 제외하고 비디오만 추산한 결과인데, 이 통계는 인터넷의 데이터 대부분이 시각 데이터라는 사실을 보여줍니다.

그러므로 시각 데이터들을 잘 활용할 수 있는 알고리즘을 잘 개발하는 것이 무엇보다 중요해졌습니다.

하지만 문제가 있는데, 이런 시각데이터는 해석하기 상당히 까다롭다는 점으로 사실상 이들을 이해하고 해석하는 일은 상당히 어렵습니다. 따라서 시각데이터로 서비스를 하려면 자동으로 시각데이터를 이해하고 분석하는 알고리즘을 개발하는 것이 관건입니다.

image

  • 컴퓨터 비전은 학제적(interdisciplinary)인 분야로, 굉장히 다양한 분야와 맞닿아 있습니다.
    • 물리학 - 광학, 이미지 구성, 이미지의 물리적 형성
    • 생물학, 심리학 - 동물의 뇌가 어떤 방식으로 시각 정보를 보고 처리하는지를 이해
    • 컴퓨터 과학, 수학, 공학 - 컴퓨터 비전 알고리즘을 구현할 컴퓨터 시스템을 구축할 때 필요


A brief history of computer Vision

비전(시각)과 컴퓨터 비전이 언제 어디에서 비롯됐고 현재는 어디쯤 왔는지를 살펴보겠습니다.


Big Bang

image

  • Vision의 역사는 5억 4천만년전 시작되었는데, 그 시대의 지구 대부분은 물이었고 대부분 바다를 부유하는 일부 생물들만 존재했으며 눈(eyes)은 존재하지 않았습니다.
  • 하지만 5억 4천만 년 전에 천만 년이라는 짧은 시간동안 생물의 종이 폭발적으로 증가한 시기가 있었습니다.
    • 가장 설득력 있는 가설은 Biological Vision의 탄생(by. Andrew Parker)
  • 즉, 폭발적인 종 분화의 시기를 촉발시킨 것이며 생물들은 갑자기 볼 수 있게 되어서 능동적이게 되었으며, 일부 포식자들은 먹이를 찾아다니고 먹이들은 포식자로부터 달아나야만 했습니다.
    • 그래서 Vision의 도래로 생물들은 하나의 종으로 살아남으려면 빠르게 진화해야만 했습니다.
    • 이것이 바로 Vision의 태동입니다.

우리 인간은 대뇌 피질의 50%가량의 뉴런이 시각처리에 관여하는데, Vision은 가장 큰 감각체계이며 우리가 생존하고, 일하고, 움직이고, 어떤 것들을 다루고, 의사소통하고, 오락을 즐기는 등 많은 것들을 가능하게 해줍니다.


Hubel and Wiesel, 1959

image

생물학자들은 Vision의 매커니즘을 연구하기 시작했는데, 인간과 동물의 Vision의 연구에 가장 영향력 있었을 뿐만 아니라 Computer Vision에도 영감을 준 한 연구가 있었습니다. 1950/60년대 전기생리학을 이용한 Hubel과 Wiesel의 연구입니다.

  • 그들이 묻고 싶었던 질문은 바로 “포유류의 시각적 처리 메커니즘은 무엇일까?” 였습니다. 그래서 그들은 고양이의 뇌를 연구하기로 합니다.
  • 일차 시각 피질에는 다양한 종류의 세포가 있다는 것을 알았습니다. 그중 가장 중요한 세포가 있었는데 그 세포들은 아주 단순했습니다. 경계(edges)가 움직이면 이에 반응하는 세포들이었습니다.
  • 물론 더 복잡한 세포들도 있긴 하지만, 주된 발견은 시각 처리가 처음에는 단순한 구조로 시작되며, 그 정보가 통로를 거치면서 실제 세상을 제대로 인지할 수 있을 때까지 점점 복잡해진다는 것입니다.


Larry Roberts, 1963

image

Computer Vision의 역사는 60년대 초반에 태동합니다.

  • Larry Roberts의 Block World 연구에서는 우리 눈에 보이는 사물들을 기하학적 모양으로 단순화시켰습니다.
  • 이 연구의 목표는 우리 눈에 보이는 세상을 인식하고 그 모양을 재구성하는 일이었습니다.


Stages of Visual Representation, David Marr, 1970s

image

70년대 후기에 David Marr는 아주 유명한 책을 한 권 저술합니다.

이 책은 David Marr이 Vision을 무엇이라 생각하는지, 그리고 어떤 방향으로 Computer Vision이 나아가야 하는지, 그리고 컴퓨터가 Vision을 인식하게 하기 위해 어떤 방향으로 알고리즘을 개발해야 하는지를 다룬 책이었습니다.

  • 그의 저서에서, 우리가 눈으로 받아들인 “이미지”를 “최종적인 full 3D 표현”으로 만들려면 몇 단계의 과정을 거쳐야만 한다고 주장했습니다.
    • 첫 단계는, “Primal Sketch” 단계입니다. 이 과정은 주로 경계(edges), 막대(bars), 끝(ends), 가상의 선(virtual lines), 커브(curves), 경계(boundaries)가 표현되는 과정입니다.
    • 이후의 다음 단계는, “2.5-D sketch” 라는 단계이며 이 단계에서는 시각 장면을 구성하는 표면(surfaces) 정보, 깊이 정보, 레이어, 불연속 점과 같은 것들을 종합합니다.
    • 그리고 결국에 그 모든 것을 한데 모아서 surface and volumetric primives의 형태의 계층적으로 조직화된 최종적인 3D 모델을 만들어 냅니다.

이런 방식은 “Vision이 무엇인가”라는 것에 대한 아주 이상적인 사고과정이었으며, 이런 방식의 사고방식은 실제로 수십 년간 Computer Vision 분야를 지배했고, “어떻게 시각정보를 분석할 수 있을까”라는 질문에 직관적인 생각해 볼 수 있는 방법이었습니다.


Recognition via Parts (1970s)

image

70년대에 또 다른 연구로 “어떻게 해야 장난감 같은 단순한 블록 세계를 뛰어넘어서 실제 세계를 인식하고 표현할 수 있을까?”라는 질문을 하기 시작했습니다.

  • Stanford와 SRI에서 과학자들은 “generalized cylinder”와 “pictorial structure”를 제안했습니다.
  • 기본 개념은 “모든 객체는 단순한 기하학적 형태로 표현할 수 있다”라는 것입니다. 가령 사람은 원통 모양을 조합해서 만들 수 있습니다. 또는 “주요 부위”와 “관절”로 표현할 수도 있을 것입니다.

두 방법 모두 단순한 모양과 기하학적인 구성을 이용해서 복잡한 객체를 단순화시키는 방법이며, 이러한 연구들은 수년간 다른 연구에 상당히 많은 영향을 미쳤습니다.


Recognition via Edge Detection (1980s)

image

80년대 또 다른 사례로, John Canny와 David Lowe는 어떻게 하면 단순한 구조로 실제 세계를 재구성/인식할 수 있을지 고민했습니다.

  • 면도기을 인식하기 위해서 면도기를 선(lines)과 경계(edges) 그리고 직선(straight lines) 그리고 이들의 조합을 이용해서 구성했습니다.
  • 즉 John Canny는 1986년 이미지에서 edge를 찾고 edge matching을 통하여 object recognition을 수행하는 방식을 제시했습니다.


Recognition via Grouping (1990s)

image

1990년대에 들어 사람들은 더 복잡한 이미지를 이용하여 연구를 수행하기 시작했는데, 1997년에는 image segmentation을 이미지에 적용해보는 등의 일을 했습니다.


Recognition via Matching (2000s)

image

  • 90년대 후반부터 2010년도까지의 시대를 풍미했던 알고리즘은 “특징기반 객체인식 알고리즘” 이었습니다. 아주 유명한 알고리즘이 바로 David Lowe의 SIFT feature입니다.
    • 이 정지 표지판들을 서로 매칭하기는 상당히 어렵습니다. 하지만 객체의 특징 중 일부는 다양한 변화에 조금 더 강인하고 불변하다는 점을 발견했고, 그리하여 객체인식은 객체에서 이와 같은 중요한 특징들을 찾아내고 그 특징들을 다른 객체에 매칭시켰습니다.
    • object의 key point를 저장해서 object의 각도가 바뀐다던가 노이즈가 있는 등의 상태가 바뀌어도 올바르게 object를 detection 할 수 있는 연구가 진행되었습니다.
    • 이미지 전체를 매칭하는 일보다 훨씬 쉬운 일로, 정지표지판 이미지에서 일부 SIFT 특징들을 추출하고 또 다른 정지 표지판에서도 특징을 추출하여 이를 식별하고 매칭합니다.


Face Detection (2001)

image

그리고 컴퓨터 비전에서 유난히 발전 속도가 빨랐던 분야가 있었는데, 바로 “얼굴인식” 입니다. Paul Viola와 Michael Jones가 실시간 얼굴인식에 성공한 것으로 이 연구는 당시 아주 대단한 성과였습니다.

  • Boosted Decision Tree를 사용한 얼굴인식 알고리즘은 실시간과 가깝게(near-real-time) 인식할 수 있었고, 2006년에 Fujifilm은 실시간 얼굴인식을 지원하는 최초의 디지털카메라를 선보였습니다.
  • 이는 기초 과학 연구의 성과를 실제 응용 제품으로 가장 빠르게 전달한 사례라고 할 수 있습니다.


PASCAL VOC (2006)

image

60/70/80년대를 거치고 하나의 변곡점을 마주하게 됩니다.

사진의 품질이 점점 좋아졌으며, 인터넷과 디지털카메라의 발전은 더더욱 좋은 실험 데이터를 만들어 낼 수 있었습니다. 2000년대 초에 일궈낸 것 중 하나는 바로 컴퓨터 비전이 앞으로 풀어야 할 문제가 무엇인지의 정의를 어느 정도 내렸다는 것입니다.

물론 해결해야 할 다양한 문제가 있겠지만, 이 또한 아주 중요한 문제였습니다. 바로 “Object Recognition” 입니다.

  • 객체인식 기술의 어디쯤 왔는지 측정해 보기 위해 Benchmark Dataset를 모으기 시작했고, 그 중 하나는 PASCAL Visual Object Challenge(VOC)입니다.
    • 이 데이터셋에는 20개의 클래스가 있습니다.
    • 있고 보이는 것들과 같이 기차, 비행기, 사람이 있고 소, 병, 고양이등도 있습니다.
    • 2007년부터 2012년도까지의 표를 보면 객체인식 성능은 꾸준히 증가했습니다.


ImageNet (2009)

image

  • 그 무렵, 대부분의 기계학습 알고리즘, raphical Model, SVM, AdaBoost 같은 기계학습 알고리즘들이 트레이닝 과정에서 Overfitting 문제가 발생했습니다.
    • 이 문제의 원인 중 하나는 시각 데이터가 너무 복잡하다는 것입니다.
    • 또 학습 데이가 부족해서 Overfiting이 훨씬 더 빠르게 발생했고 일반화 능력이 떨어졌습니다.
  • 두 가지 motivation이 있었고, 하나는 이 세상의 모든 것들을 인식하고 싶다는 것이며, 또 하나는 기계학습의 Overfiting 문제를 극복해보자는 이 동기를 바탕으로 ImageNet 프로젝트가 시작되었습니다.
  • 그 결과 ImageNet은 대략 15만 장에 달하는 이미지와 22만 가지의 클래스 카테고리를 보유하게 되었습니다. 당시 AI 분야에서 만든 가장 큰 데이터셋 이었으며 ImageNet 덕분에 객체인식은 다른 국면으로 접어들었습니다.


image

  • ImageNet을 Benchmark에 어떻게 활용하는지가 큰 화두였고, 2009년부터 국제 규모의 대회를 주최했습니다. ILSVRC입니다.
  • 이 대회를 위해서 1000개의 객체에서 140만 개의 test set 이미지를 엄선했으며, 해당 대회의 목적은 이미지 분류 문제를 푸는 알고리즘들을 테스트하기 위함이었습니다.


image

Image Classification Challenge의 2010년도부터 2017년도까지의 결과입니다.

위 그래프가 그 대회의 우승자의 정확도를 나타낸 것인데 2012년 이전에는 미미하게 개선 되다가, 2012년에는 오류율이 16%로 거의 10%가량 떨어졌고 2012년도의 감소는 아주 중요합니다.

2012년도에 우승한 알고리즘은 convolutional neural network 모델로 CNN은 그 당시 다른 알고리즘들을 능가하고 ImageNet Challenge에서 우승하였습니다. CNN, Deep learning 모델은 컴퓨터 비전 분야의 진보를 이뤄냄으로써 CNN의 우수성을 입증하였습니다.

CS231n Overview

CS231n focuses on one of the most important problem of visual recognition - image classification

image

  • Image Classification는 이미지 한 장을 보고 몇 개의 고정된 카테고리 안에서 정답 하나를 고르는 것입니다.
    • 이 문제는 다양한 환경(industry, academia)에 적용될 수 있습니다. 가령 음식, 음식의 칼로리, 미술작품들 등을 인식해야 하는 다양한 제품에 적용할 수 있습니다.
  • 따라서 image classification이라는 간단한 도구가 자체로도 유용할뿐더러 다양한 응용이 될 수도 있습니다.


image

  • 위 문제들 모두 image classification 기반하에 일궈진 것들입니다.
  • 하지만 object detection 문제는 classification과 조금 다릅니다. 이 이미지가 고양이다, 개다, 말이다 이렇게 하는 실제로 어디에 있는지 네모박스를 그릴 수 있어야 하며 네모박스를 객체의 위치에 정확히 그려 넣어야 합니다.
  • image captioning 은 이미지가 입력으로 주어지면 이미지를 묘사하는 적절한 문장을 생성해야 합니다. 해당 문제가 어렵고 복잡해 보이고 Image classification 과도 별로 관련이 없어 보일 수 있지만 image classification 기술을 이런 문제들에서 충분히 재사용할 수 있습니다.


Convolutional Neural Networks(CNN) have become an important tool for object recognition

image

  • 2011년에서 Lin et al의 알고리즘은 보시면 여전히 계층적(hierarchical)이며 여러 단계가 있습니다. 핵심은 여전히 “계층적” 이라는 점입니다. edges를 뽑고 “불변 특징” 의 개념도 들어있습니다.
  • 하지만 2012년 AlexNet은 ILSVRC12 에서 아주 좋은 성과를 달성했습니다.
    • 이후 ImageNet의 우승 트로피는 매년 Neural Network의 몫 이었고, 이러한 추세로 CNN은 매년 더 깊어져 갔습니다.
    • 2014년에 네트워크가 훨씬 더 깊어졌습니다. Google의 GoogleNet 그리고 Oxford의 VGG가 바로 그 주인공이죠.
    • 2015년에는 MSRA의 Residual Network의 Layer 수는 152개에 육박합니다.


Convolutional Neural Networks(CNN) were not invented overnight

image

  • 하지만 CNN이 2012년 ImageNet Challenge에서 빛을 본 것은 사실이지만 CNN이 2012년에 발명된 것은 아닙니다. 사실 CNN은 아주 오래전부터 존재했습니다.
  • 1998년에 Jan LeCun과 Bell Labs와의 공동 과제로 숫자인식을 위해 CNN을 구축했습니다. 이들은 자필 수표 자동 판독과 우편주소 자동인식에 CNN을 적용하고 싶었습니다. 그들은 이미지를 입력으로 받아서 숫자와 문자를 인식할 수 있는 CNN을 만들었습니다.
    • CNN의 구조만 보자면 2012년의 AlexNet과 유사합니다.
    • 그림처럼, raw pixel을 입력으로 받아 여러 Convolution Layer Layer를 거치고 Sub-Sampling, Fully Connected Layer를 거치게 됩니다.


The quest for visual intelligence goes far beyond object recognition

Computer Vision 연구의 목적은 “사람처럼 볼 수 있는” 기계를 만드는 것입니다. 사람들은 시각 체계를 통해 아주 많은 것들을 할 수 있으며 인간의 시각체계는 Computer Vision보다 훨씬 더 강력합니다.

이미지의 내용을 아주 풍부하고 깊게 이해하는 것은 Computer Vision 분야가 진정으로 추구하는 방향입니다.

image

Computer Vision이 정말 재미있는 분야이며 매우 유용하고, 아주 다양한 방법으로 이 세상에 기여할 수 있습니다. 또한 Computer Vision은 의학 진단, 자율주행, 로보틱스 등 어디든 적용할 수 있습니다.

그리고 인간의 지능을 이해하기 위한 여러 핵심 아이디어들을 집대성하는 일종의 실마리가 될지도 모릅니다. Computer Vision은 정말 기상천외하고 재밌는 분야입니다.

Read more

머신러닝 개요 (Overview)

|

Machine Learning

머신러닝(Machine Learning, 기계 학습)이란 무엇일까요? ‘머신러닝’이란 용어를 대중화시킨 아서 사무엘(Arthur Samuel)은 다음과 같은 말을 남겼습니다.

“명시적인 프로그래밍 없이 컴퓨터가 학습하는 능력을 갖추게 하는 연구 분야다.” - Arthur Samuel, 1959

코딩 테스트 같은 알고리즘 문제를 풀 때는 주어진 문제의 규칙을 보고 직접 알고리즘을 구현합니다. 머신러닝은 이와 반대로 컴퓨터에게 수많은 케이스를 주어주고 학습시킨 뒤 이 케이스를 만하는 알고리즘을 구현하도록 합니다. 카네기 멜론 대학의 교수이자 머신러닝 학부장인 톰 미첼은 머신러닝에 대해 다음과 같은 말을 남겼습니다. 이 인용문은 머신러닝이 어떤 방식으로 이루어지는 지를 잘 알려줍니다.

“어떤 작업 T에 대한 컴퓨터 프로그램의 성능을 P로 측정했을 때 경험 E로 인해 성능이 향상됐다면, 이 컴퓨터 프로그램은 작업 T와 성능 측정 P에 대해 경험 E로 학습한 것이다.” - Tom Michell, 1997

왜 머신러닝을 사용할까요? 사람이 알고리즘을 구현하는 전통적인 방법론으로는 복잡한 문제를 풀기가 너무 어렵습니다. 예를 들어, 스팸 메일을 분류하는 알고리즘을 사람이 구현한다고 해봅시다. 이런 복잡한 문제는 고려해야 할 사항이 너무 많기 때문에 많은 사람이 긴 코드를 작성해야 합니다. 게다가 코드에서 논리적인 오류가 발견되었을 경우에는 많은 부분을 하하나 직접 수정해주어야 합니다.

같은 문제에 머신러닝 기법을 적용하면 일단 프로그램 코드가 매우 짧아집니다. 어떤 사항을 고려해야 할 지를 기계가 알아서 판단하기 때문입니다. 기존 프로그램과 맞지 않는 데이터가 새로 발견되더라도 특별한 유지보수 없이 다시 기계에게 학습시켜 프로그램을 개선할 수 있습니다. 게다가 이런 문제에 대해서는 머신러닝 방법론을 적용했을 때의 성능(정확도 등)이 더 좋습니다.

Supervised, Unsupervised, Reinforcement

학습의 기준을 어떤 것으로 하는 지에 대해서 지도 학습(Supervised learning)비지도 학습(Unsupervised learning), 강화 학습(Reinforcement learning) 으로 나눌 수 있습니다.

먼저 지도 학습부터 보겠습니다. 지도 학습은 레이블(Label)이 포함되어 있는 훈련 데이터로 학습하는 방법입니다. 답이 있는 데이터셋을 보고 그 답을 맞추는 알고리즘을 기계가 만들어내게 됩니다. 현재 연구가 되어 있는 많은 방법이 지도 학습 방법에 기초하고 있습니다. 크게는 분류(Classification)회귀(Regression) 등으로 나눌 수 있습니다. 다음은 지도 학습에 속하는 알고리즘의 예시입니다.

  • k-최근접 이웃(k-nearest neighbors, kNN)

knn

이미지 출처 : machinelearningknowledge.ai

linear_reg

이미지 출처 : primo.ai

logistic_reg

이미지 출처 : towardsdatascience.com

svm

이미지 출처 : jeremykun.com

decision_tree

이미지 출처 : algobeans.com

다음은 비지도 학습입니다. 비지도 학습은 레이블 없이 모든 것을 기계의 판단하에 처리하는 알고리즘입니다. 크게는 군집(Clustering), 시각화(Visualization)와 차원 축소(Dimensionality reduction), 연관 규칙 학습(Association rule learning) 등으로 나눌 수 있으며 사용되는 알고리즘으로는 다음과 같은 것들이 있습니다.

  • 군집
    • k-평균(k-Means)
    • 계층 군집 분석(Hierarchical cluster analysis, HCA)
    • 기댓값 최대화(Expectation maximization)

clustering

이미지 출처 : 위키피디아 - K-means

  • 시각화 및 차원축소
    • 주성분 분석(Principle component analysis, PCA), 커널 PCA(kernal PCA)
    • 지역적 선형 임베딩(Locally-Linear Embedding, LLE), t-SNE(t-distributed Stochastic Neighbor Embedding) 등이 있습니다.

visualization

이미지 출처 : ai.googleblog.com

  • 연관 규칙 학습
    • 아프리오리(Apriori), 이클렛(Eclat)

association

이미지 출처 : algobeans.com

지도 학습과 비지도 학습 방법을 혼용하는 준지도 학습(Semi-supervised learning)도 있습니다. 이 경우에는 데이터의 일부에만 레이블을 주어주고 나머지 레이블은 기계가 채운뒤 재학습 하도록 합니다. 준지도 학습 알고리즘의 예시로는 심층 신뢰 신경망(Deep belief network, DBN)이 있습니다. 이 방법은 여러 겹으로 쌓은 제한된 볼츠만 머신(Restricted Boltzmann machine, RBM)이라고 불리는 비지도 학습에 기초하고 있습니다.

마지막은 강화 학습입니다. 강화 학습은 지도 학습이나 비지도 학습과는 다른 방식으로 학습이 진행됩니다. 강화 학습에서 학습하는 시스템은 에이전트(Agent)라고 불립니다. 이 에이전트는 현재 상태(State)에서 주변 환경을 관찰하여 행동(Action)을 실행하고 그 결과로 보상(Reward) 혹은 벌점(Panelty)를 받습니다. 같은 작업을 계속 반복하면서 가장 큰 보상을 얻기 위한 최상의 전략을 스스로 학습하게 됩니다.

reinforcement

이미지 출처 : openai.com

Batch vs Online

데이터셋을 학습시키는 방법에 따라 분류하기도 합니다. 배치(Batch) 학습과 온라인(Online) 학습으로 나누기도 합니다. 배치 학습은 학습시킬 데이터를 미리 준비한 뒤에 준비한 데이터를 학습시키는 방법입니다. 방법이 간단하다는 장점이 있지만 시스템이 빠르게 변화해야 하는 상황인 경우에는 사용하기 힘들다는 단점이 있습니다. 그리고 너무 학습 데이터가 너무 방대한 경우에는 시간이 지연되는 문제가 있기 때문에 점진적으로 학습하는 알고리즘을 사용합니다.

온라인 학습은 데이터를 미니 배치(Mini batch)라고 부르는 작은 단위로 묶은 뒤 이 데이터 셋을 학습시킵니다. 커다란 데이터셋을 다룰 수 있다는 장점이 있습니다.

Problems

다음은 머신러닝에서 발생하는 주요한 문제입니다. 머신러닝의 문제점 중 가장 많은 부분을 차지하는 것은 훈련 데이터입니다. 많은 데이터셋에 대하여 훈련 데이터의 양이 충분하지 않거나 대표성이 없고, 낮은 품질의 데이터인 경우가 많습니다. 또한 데이터셋 내에 관련 없는 특성이 많아 희소(Sparsity) 문제가 발생하기도 합니다.

과적합(Overfitting, 과대적합)과소적합(Underfitting)의 발생도 주요한 문제입니다. 과적합은 생성한 모델이 훈련 데이터에 너무 잘 맞아버려 일반화(Generalization)되지 않는 현상입니다. 과적합 문제를 해결하기 위해서는 파라미터가 적은 모델을 선택하기, 훈련 데이터에 있는 특성 수를 축소하기, 모델에 규제 적용하기 등의 방법을 통해 단순한 모델을 생성합니다. 과소적합은 너무 단순한 모델이 생성되어 데이터에 잘 맞지 않는 현상입니다. 과소적합 문제를 해결하기 위해서 파라미터가 많은 모델을 선택하거나 학습 알고리즘에 더 좋은 특성을 제공하고 모델의 제약을 줄임으로써 복잡한 모델을 생성합니다. 아래는 이미지의 왼쪽은 과소적합, 오른쪽은 과적합이 발생한 경우를 그림으로 나타낸 것입니다.

over_under_fit

이미지 출처 : educative.io

과적합과 과소적합에 대한 추가적인 정보는 과적합과 과소적합 (Overfitting & Underfitting)에서 볼 수 있습니다.

Read more