Notice
Recent Posts
Recent Comments
05-21 07:17
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Byeol Lo

밑바닥부터 시작하는 딥러닝1 - 1. 퍼셉트론 본문

AI

밑바닥부터 시작하는 딥러닝1 - 1. 퍼셉트론

알 수 없는 사용자 2023. 6. 7. 13:59

밑바닥부터 시작하는 딥러닝1 을 읽으면서 하나하나 정리하면서 글을 써내려갈 생각이다.

 

 파이썬, 파이썬의 numpy, matplotlib 등의 라이브러리 등을 기본적으로 다운 받아 실습을 무조건 할 수 있도록 환경을 갖추도록 한다. 퍼셉트론(Perceptron)은 "다수의 신호를 입력으로 받아 하나의 신호를 출력하는 체계"이다. 따라서 최종적으로 신호가 흐른다, 안흐른다의 상태를 가지게 된다.

두개의 신호를 받는 퍼셉트론

 해당 퍼셉트론을 통해 X1에서 w1로의 가중치(저항)가 곱해져 y로 신호가 전달된다. 따라서 y에서 받은 두 신호의 어떤 연산을 통해 Y에 신호가 흐를지, 안흐를지 정할 수 있다. 여기선 간단하게 x1w1 + x2w2 + b 가 어떤 값보다 작으면 0, 크면 1의 신호를 갖도록 할 수도 있고 다른 연산을 써도 된다. 그림에서의 원을 뉴런(뇌의 신경전달물질), 노드라고 부른다. 위를 통해 흔히 논리적인 연산 and, or을 쉽게 구현할 수 있다.

import numpy as np

# AND 논리회로 구현

x = np.array([1, 0])
w = np.array([0.5. 0.5])
b = -0.7

if np.sum(x*w)+b > 0 :
	print(1)
else :
	print(0)
import numpy as np

# OR 논리회로 구현

x = np.array([1,0])
w = np.array([0.5, 0.5])
b = -0.2

if np.sum(x*w) + b > 0 :
	print(1)
else :
	print(0)
def nand_node(x) :
    w = np.array([0.5, 0.5])
    b = -0.7
    result = np.sum(x*w) + b
    if result < 0 : return 1
    return 0
    
nand_node(np.array([1,1]))

 위를 통해 AND, OR을 구현해보았다. 여기서 0, 1 연산에서 서로 다른 입력이 있다면 1의 신호를 흐르게 만드는 XOR 연산이 있다. AND, OR의 연산은 선형적인 구조를 가진다. (ax + b = y의 꼴을 생각하면 된다) 하지만, 다음과 같은 입력을 생각해보자.

 우리는 [0,1]×[0,1] 공간의 입력들을 생각할 수 있다. 1,0 이거나 0,1 일때는 1의 신호가 흐르도록 0,0 이거나 1,1 일때의 입력은 0이 흐르도록 하고 싶을 수 있다. 위에서 봤던식은 선형태의 식이므로 해당 선으로 두 점끼리의 영역으로 나누기는 불가능하다. 따라서 이럴 때는 비선형(non-linear)의 식이 필요하다.  따라서 -x + 1.5 > y > -x +0.5 를 생각해볼 수 있다. 하지만 이렇게 하려면 단층 퍼셉트론으로는 해결할 수 없게 되며 이를 해결하기 위해 단층 퍼셉트론을 쌓음으로써 문제를 해결할 수 있다.

import numpy as np

def and_node(x) :
    w = np.array([0.5, 0.5])
    b = -0.7
    result = np.sum(x*w) + b
    if result > 0 : return 1
    return 0


def nand_node(x) :
    w = np.array([0.5, 0.5])
    b = -0.7
    result = np.sum(x*w) + b
    if result < 0 : return 1
    return 0

def or_node(x) :
    w = np.array([0.5, 0.5])
    b = -0.2
    result = np.sum(x*w) + b
    if result > 0 : return 1
    return 0

def layer1(x) :
    w = np.array([0.5, 0.5])
    b = -0.7
    output = np.array([nand_node(x), or_node(x)])
    result = np.sum(output*w) + b
    if result > 0 : return 1;
    return 0;

layer1(np.array([0,1]))
layer1(np.array([1,1]))
layer1(np.array([1,0]))

XOR

 위의 사진에서 보다시피 각 노드들은 해당되는 연산과 역할을 수행하고 있다. OR은 이전 층의 입력을 받아 or 연산을 수행하며, NAND는 이전층을 통해 nand 연산을 수행한다. 노드들을 합쳐 층을 만들고 층들 간의 신호를 주고받게 되는 다층 퍼셉트론이다. 여기서 입력이 있는 층을 입력층(Input Layer), 중간의 연산을 하는 층"들"을 은닉층(Hidden Layer), 마지막으로 결과를 반환하게 되는 층을 출력층(Output Layer) 라고 한다. 이 세 기능을 가진 층들을 신경망(Neural Network)이라고 부른다.

 

활성화 함수(Activation Function)

 노드(뉴런) 안을 더 자세히 보자. 전의 Layer의 신호들을 받아와서 연산을 한 후 0보다 크면 1을, 0보다 작으면 0의 신호를 내보내게 된다. 이렇게 0보다 크면 1을, 작으면 0을 내보내게 하는 함수를 활성화 함수라고 한다. 즉, 입력 신호의 연산을 통해 출력 신호를 내뱉는 함수가 활성화 함수다. 이렇게 활성화 함수를 수정하여 다양한 출력 신호로 바꿀 수도 있다.

뉴런의 활성화 함수 h(x) 동작

시그모이드 함수

Sigmoid Function

 시그모이드 함수는 0부터 1 사이의 값을 가지게 되는 함수이다.

  • 기울기 폭주(Exploding Gradient) 현상 방지
  • 기울기 소실(Vanishing Gradient) 발생 가능
  • non-linear 하다
  • 보통 출력층에서만 사용

 

계단 함수(이진 활성화 함수, Binary Activation Function)

Step Function

0보다 크면 1을 아니면 0의 신호를 주게된다. (=이 들어가고 안들어가고는 마음대로인 듯하다.)

  • non-linear 하다
  • 딥러닝 모델에서는 사용되지 않은 함수 - 불연속점(Point of Discontinuity)을 가지기 때문
  • 역전파(Back Propagation)에서 모델의 파라미터(parameter)들이 극단적으로 변경되기에 적합하지 않음

 

 두 모델의 공통점으로 Non-Linear 함을 꼽을 수 있는데, 이것의 의미는 우선, 함수는 어떤 값을 입력하면 그에 따른 값을 돌려주는 것이다. 선형함수(Linear Function)들은 전부 선형 함수의 상수배 만큼으로 다른 선형 함수를 만들 수 있다. 이 말은 선형 함수의 parameter를 변경해도 그것은 어짜피 선형함수이기 때문에 크게 차이가 없다는 말이 된다. h(x) = cx 라는 활성화 선형함수를 보자. 4개의 층에 h(x)라는 것을 쌓아서 h(h(h(h(x))))로 출력이 된다고 해보자. 근데 이는 1개의 층에 p(x) = c^4 x를 학습을 하는 것과 동일하지 않을까라는 것이다. 따라서, 이렇게 비효율적인 함수를 겹겹이 쌓아서 하는 것보다는 다른 특징을 가지는 즉, 비선형이라는 성질을 가지는 함수가 필요하다는 것이다(그래야 다양한 데이터들을 학습할 수 있고, 층을 쌓는 "의미"가 있을 것이다).

 

ReLU(Rectified Linear Unit)

ReLU

간단한 미분 연산을 통해 가중치 업데이트를 수행할 수 있다.

 

Leaky ReLU(Rectified Linear Unit Function)

LeakyReLU

c라는 음수인 상수를 도입해 음의 기울기로 역전파를 수행하도록 할 수 있다.

 

PReLU(Parametric Rectified Linear Unit Function)

PReLU

위의 Leaky ReLU와 유사하지만, 음수 기울기가 고정된게 아닌 음수 내에서 변화하는 것으로 간주한다.

  • 기울기 자체가 갱신되기 때문에 필요 없는 데이터 신호에 대해 기울기 업데이트를 수행하게 된다.

 

ELU(Exponential Linear Unit Function)

ELU

 PReLU에서 더 나아가 부드러운 곡선 형태를 가진다.

  • 경사 하강법의 수렴 속도가 비교적 빠르다.
  • 복잡한 연산을 수행하므로 학습 속도는 느리다.

 

Hyperbolic Tangent Function

Hyperbolic Tangent Function

-1부터 1까지의 값을 가지는 함수이다.

  • 기울기 소실(Vanishing Gradient) 발생 가능

 

Softmax Function

Softmax Function

 

n차원의 벡터에서 특정 출력 값이 k번째에 속할 확률을 계산한다. 

  • 출력층에서 사용하게 된다.
  • 주로 분류 모델에 쓰인다.
  • Softmin, Log softmax 함수도 있다.

 

 이러한 모든 activation 함수들은 풀고자하는 문제의 특성에 맞게 사용한다. (ex. 회귀 : 항등함수, 2클래스 분류 : 시그모이드 함수, 다중 클래스 분류 : 소프트맥스 함수) 이 중에 다중 분류로 사용되는 소프트맥스 함수에 대해 살펴보자.

 

Softmax 구현 시 주의점

 구현된 softmax 함수의 수식은 컴퓨터로 가져올 때 문제가 발생한다. e^100 을 생각해도 그 값은 매우 크게 된다. 따라서 이런 큰 값을 다루는 데에는 오버플로가 발생할 수 있다. 이를 해결하도록 소프트맥스 함수 구현을 다음과 같이 개선한다.

개선된 Softmax 함수

 이를 통해 소프트 맥스 함수 안에 임의의 C라는 것을 넣어 대입할 수 있다. 오버플로를 막기위해 주로 입력 신호중에 최댓값을 기준으로 빼는 것으로 이용하는 것이 좋다.

Comments