엄범


인공신경망 ( ANN, Artificial Neural Network )

인공신경망은 시냅스의 결합으로 네트워크를 형성한 인공 뉴런(노드)이 학습을 통해 시냅스의 결합 세기를 변화시켜, 문제 해결 능력을 가지는 모델 전반을 가리킨다. 좁은 의미에서는 오차역전파법을 이용한 다층 퍼셉트론을 가리키는 경우도 있지만, 이것은 잘못된 용법으로, 인공신경망은 이에 국한되지 않는다.


인공신경망은 가중치 매개변수 값의 설정을 입력으로부터 자동으로 학습하는 능력을 가진 모델을 말한다.

다층 퍼셉트론은 인공신경망을 구현하는 알고리즘의 한 종류라고 생각하면 된다.


단층 퍼셉트론의 활성화 함수 ( 계단 함수 )

\\(x_1, x_2\\) 두 신호를 받아 \\(y\\)를 출력하는 퍼셉트론을 수식으로 나타내면 다음과 같다.

\\(y = \begin{cases} 0 & (b + w_1x_1 + w_2x_2 \le 0) \\ 1 & (b + w_1x_1 + w_2x_2 \gt 0) \end{cases}\\)


이를 활성화 함수(activation function) h(x)를 사용한 형태로 표현하면 다음과 같다.

\\(y = h(b + w_1x_1 + w_2x_2)\\)

\\(h(x) = \begin{cases} 0 & (x \le 0) \\ 1 & (x \gt 0) \end{cases}\\)


위 활성화 함수는 임계값을 경계로 출력이 바뀌는데, 이런 함수를 계단 함수(step function)이라 한다.

단층 퍼셉트론에서는 활성화 함수로 계단 함수를 이용한다고 할 수 있다.

```python

def step_function(x):

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

```

계단 함수는 한줄로 컴팩트하게 표현할 수 있다. x가 넘파이 배열일 경우 x>0은 T, F 배열을 반환하고 이를 int형으로 변경해 리턴하게 된다.


신경망의 활성화 함수 ( 시그모이드 함수, ReLU 함수 )

신경망에서는 시그모이드 함수(sigmoid function)를 활성화 함수로 사용한다.

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


sigmoid는 S자 모양이라는 뜻이다. 이렇게 S모양을 가지는 함수들의 집합을 logistic function이라고 하는데, sigmoid function은 logistic function에서 L=1이고 midpoint가 0인 경우를 말한다.

https://en.wikipedia.org/wiki/Logistic_function

https://en.wikipedia.org/wiki/Sigmoid_function

2019/05/07 - [Math/Probability and Statistics] - 분류, Classification


matplotlib.pyplot으로 그려보면 다음과 같다. 


```python

def sigmoid(x):

    return 1/(1+np.exp(-x))


def graph():

    x = np.arange(-10, 10, 0.1)

    y = sigmoid(x)

    plt.plot(x, y)

    plt.show()


graph()

```

sigmoid 함수도 간단히 표현 가능하다. 넘파이 배열이 넘어오면 브로드캐스트 기능이 동작하여 각 배열 원소에 대해 연산한 결과를 배열로 반환하게 된다.


단층 퍼셉트론과 신경망의 가장 큰 차이는 곧 활성화 함수의 차이다.

계단 함수에서는 뉴런 사이에 0, 1만 흐르게 되지만 시그모이드 함수는 뉴런 사이에 연속적인 실수가 흐른다는 것이 가장 큰 차이점이다.

공통점은 다음과 같다.

  • 입력이 작을 때의 출력은 0에 수렴, 클 때의 출력은 1에 수렴한다.
  • 항상 0과 1사이의 값만 가진다.
  • 비선형 함수다.

* 선형 함수를 사용하면 층을 깊게 만드는 의미가 없어진다. 선형 함수를 여러번 적용해서 나온 출력이 y라 할 때, 한번만 적용해도 y를 출력할 수 있는 선형 함수를 정의할 수 있기 때문이다.



최근에는 시그모이드 함수 대신 ReLU(Rectified Linear Unit, 렐루) 함수를 주로 사용한다.

Rectified는 '정류된'이라는 뜻인데, 특정한 흐름을 차단하는 것을 의미한다. 여기서는 x <= 0 일 때의 흐름을 차단한다는 의미로 쓰였다.

```python

def relu(x):

    return np.maximum(0, x)

```

maximum 함수는 두개의 입력값 중 큰 값을 반환하는 함수다.


왜 sigmoid, ReLU인가?

활성화 함수는 비선형 함수이기만 하면 된다.

선형 함수를 사용하게 되면, 층을 깊게 쌓는 의미가 없어진다. \\(h(x) = ax, h(h(x)) = a^2x\\) 두번 적용해도 결과값 영역을 나누는 선은 그냥 직선이다.

단층 퍼셉트론에서는 출력값 영역을 나누는 선이 직선 형태로 표현되기 때문에 XOR을 표현할 수 없다.

그래서 층을 하나 더 쌓아서`` (input -> NAND,OR -> AND -> output)`` XOR을 표현하게 되는데, 이게 가능했던 이유는 활성화 함수로 비선형 함수인 계단 함수를 사용해 결과값의 영역을 나누는 선이 곡선으로 표현될 수 있었기 때문이다.

이렇게 기본적인 연산을 조합해 더욱 복잡한 연산을 표현하기 위해서는 비선형 함수가 필요하다.


많은 비선형 함수 중에 sigmoid를 선택한 이유는, 다음 두가지다.


1. sigmoid function은 확률값을 리턴한다.

통계에는 odds와 probability가 존재한다. 이는 수학에서 보는 likelihood와 비슷하다고 생각하면 된다.

odd ratio를 probability로 mapping해주는 함수가 logistic function이다.

연속 분포(logistic distribution)의 누적 분포 함수는 logistic function이 된다.


2. sigmoid function은 미분이 편리하다. 자기 자신으로 표현된다. {\displaystyle S'(t)=S(t)(1-S(t)).}

logistic function에서 자연 상수 e를 사용하는 것은 미분이 편리하기 때문이라고 한다.


그러니까 sigmoid여야만 하는 이유가 있었던게 아니라 적당한 함수를 선택한거라고 생각하면 된다.

요즘은 ReLU를 많이 사용한다.


참고

밑바닥부터 시작하는 딥러닝

활성화 함수에 따른 인공신경망 FCNN의 곡선 근사 성능 실험