0. 들어가기

신경망(1)에서 우리는 퍼셉트론에서 신경망으로 넘어가는 단계에서 중요한 역할을 하는 활성화 함수라는 것을 배웠다.

앞 포스팅에서는 활성화 함수에 대하여 자세히 알아보지 못하였으므로 활성화 함수들을 자세히 살펴보는 시간을 갖고자 한다.

 

1. 계단함수

출처 : 위키백과

처음으로 살펴봤던 계단함수이다.

값이 0보다 크면 1을 출력하는 아주 간단한 함수이다.

신경망으로 넘어가기 위해서는 계단함수 뿐만 아니라 다른 활성화 함수를 다룰 수 있는 것이 중요하다.

 

2. 시그모이드 함수

출처 : 위키백과

두번째로 시그모이드 함수이다.

0과 1 사이의 출력값을 가지는 함수이다.

시그모이드 함수의 경우, 이상값을 대처하기 쉽다는 장점이 있다.

 

이상값이란, 출력이 다음과 같다고 가정해보자.

[ 1, 9, 0.7, 3, 999 ]

여기서, 999라는 값은 다른 숫자에 비해 심각하게 크다.

이렇듯 값들 중 심각하게 작거나 큰 값을 이상값이라고 부른다.

 

하지만, 시그모이드 함수의 경우 출력값이 0과 1 사이에 있기 때문에, 아무리 이상값이 존재한다고 해도 0과 1 사이로 정규화 되기 때문에 이상값에 잘 대처할 수 있다는 것이다.

 

다만 단점이 있다면, 역전파 과정에서 GRADIENT VANISHING(기울기 소실) 현상이 일어나기 쉽다.

역전파란것은, 앞선 장에서 신경망은 왼쪽에서 오른쪽으로 진행하며 학습을 이루었다.

학습이 끝난 뒤 그 값의 정확성을 파악하기 위하여 오른쪽에서 왼쪽으로 진행하는 과정을 역전파라고 한다.

 

그렇다면 기울기 소실이라고 부르는 것은 무엇인가?

 

역전파를 하기 위해서는 미분을 사용하게 되는데 미분이란 그 함수의 특정한 위치에서의 순간 증가량을 의미한다.

즉 기울기를 의미한다.

다만, 시그모이드 함수를 미분하게 된다면 다음과 같아진다.

시그모이드함수의 미분

 

값의 범위가 0~0.25로 확 줄어든 것을 확인할 수 있다.

기울기 소실이란, 기울기가 0에 가까워 져서 역전파에 있어 충분한 값을 전달하지 못하여 학습이 안되는 현상을 의미한다.

또한, 시그모이드 함수 자체의 복잡성 때문에 미분 연산에 있어 소요되는 시간이 크다는 단점 또한 존재한다.

 

* 정리

  • 장점 : 0~1 사이의 정규화된 출력으로 인하여 이상값에 대처하기 쉽다
  • 단점 : 역전파시 기울기 소실(GRADIENT VANISHING)현상이 일어나기 쉽고 미분 계산이 복잡하다.

 

3. ReLU

 

시그모이드 함수의 단점을 극복하기 위하여 등장한 함수이다.

출처 : 위키피디아

f(x) = max(0, x)의 간단한 함수이다.

이는 계산이 매우 복잡한 시그모이드 함수에 비하여 함수가 매우 간단하여 좀더 빠른 연산이 가능하다.

(6배정도 빠르다고 한다.)

하지만 입력값이 음수일 경우 0을 출력한다. 이는 음수값을 전달할 경우 역전파가 이루어지지 않음을 의미한다.

 

4. 정리

  • 각 함수의 장단점을 파악
  • 역전파시 미분을 활용한다.
  • 기울기 소실 문제에 대한 파악

 

5. 마무리

세개의 함수를 소개했으나, 각 함수들의 변형된 형태나 업그레이드 된 형태가 많이 존재한다.

이또한 찾아보면 도움이 될 것이다.

'old > (old)밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

3. 신경망(1)  (0) 2021.01.07
2. 퍼셉트론(2)  (0) 2021.01.07
2. 퍼셉트론(1)  (0) 2021.01.01
1. 헬로 파이썬  (0) 2021.01.01

0. 들어가기

우리는 앞선 장에서 퍼셉트론에 대하여 공부했다. 퍼셉트론은 다음과 같은 장단점을 가지고 있다.

  • 매우 복잡한 표현도 구현이 가능하다
  • 가중치와 편향은 프로그래머가 직접 선택하여 구현해야한다.

우리는 AND, OR, NAND 등 다양한 선형 표현부터 비선형 XOR까지 퍼셉트론으로 구현했다.

다만 여기서 마음에 안드는 점이라면, 가중치와 편향 W, B를 우리가 직접 설정해준 것이다.

만약에 입력값이 100개라면, 그 많은 값을 일일이 타이핑 해주려면 힘들것이다.

 

따라서 우리는 신경망에 대하여 공부하려고 하는 것이다.

 

신경망은 이러한 단점을 극복시켜주는 기술이다.

즉, 가중치의 매개변수 값을 선택하도록 학습하는 것이 핵심이라고 할 수 있다.

 

1. 신경망의 구조

신경망의 구조

신경망의 구조는 위와 같다.

입력층과 출력층이 존재하며, 그 사이에 은닉층이 존재한다.

이 은닉층은 눈으로 확인할 수 없기 때문에 은닉층이라고 부르는데, 예시를 들어보면 다음과 같다.

 

  • 동물 사진 한장을 보여준다. (입력)
  • 사진에 대한 분석을 한다. (프로램의 연산, 연산과정은 보이지 않으므로 은닉)
  • 이 사진속의 동물은 개이다.(출력)

신경망은 이러한 구조로 이루어 져 있다.

 

먼저, 신경망으로 들어가기 전에 퍼셉트론의 구조에 몇가지 요소를 추가해보겠다.

편향과 활성화 함수가 더해진 그림

먼저, 일반적인 퍼셉트론에서 편향 b를 추가적으로 그려주었다.

우리는 각 입력과 가중치를 곱하고, 편향을 추가적으로 더해준 합이 다음 노드로 전달된다고 앞선 장에서 공부했다.

여기서 추가되는 것이 이 더해진 값을 한번 더 함수에 대입한다.

이는 다음 노드의 h() 함수를 뜻하며 이를 활성화 함수라고 부른다.

 

활성화 함수의 차이가 신경망과 퍼셉트론을 판가르는 요소에 해당한다.

 

2. 다양한 활성화 함수

그렇다면 활성화 함수에는 어떤것이 있는지 먼저 살펴보자.

  • 시그모이드 함수
  • 계단함수
  • ReLU 함수

2-1. 계단함수

먼저, 처음에 살펴볼 함수는 계단함수이다.

계단함수는 다음과 같다.

계단함수


몹시 간단한 모양이다.

입력값 b가 0보다 작다면 0을 출력하고 0보다 크다면 1을 출력하는 것이다.

계단함수를 그린다면 다음과 같은 그래프를 확인할 수 있다.

계단함수의 그래프

여러 퍼셉트론에서 계단함수를 활용하고 있으나, 다른 활성화 함수를 사용하는 것이 신경망으로 발전하는 과정이다.

그러므로 우리는 다른 함수들을 공부해야 할 필요가 있다.

 

2-2. Sigmoid 함수

 

sigmoid 함수

시그모이드 함수는 위와 같은 형태이다.

지수함수의 형태를 띄는 값이다.

그래프의 모양을 살펴보자.

 

시그모이드 함수의 그래프

위의 계단함수에 비해 상당히 완만해졌다고 볼 수 있다.

 

* 시그모이드 함수와 계단 함수의 비교

계단함수와 시그모이드 함수를 비교해본다면 다음과 같은 내용을 알 수 있다.

Sigmoid function Step function 비고
실수 값을 return 0 또는 1을 리턴 시그모이드가 훨씬 매끄러운 값을 가진다.
작은 입력에서는 0에 가까운 값 작은 입력에서는 0 1. 입력에 대한 출력에 대하여 두 함수가
   비슷한 특징을 가짐.
2. 출력값이 0과 1 사이의 값을 가짐
큰 입력에서는 1에 가까운 값 큰 입력에서는 1

2-3. 비선형 함수

선형함수와 비선형 함수는 앞에서도 살펴보았듯이, 그래프의 생김새를 확인한다면 쉽게 확인 가능하다.

이는 수학적으로 표현한다면 다음과 같다.

  • 선형함수 : 입력에 대한 출력이 입력의 상수배만큼 변하는 함수, 증가폭이 일정하므로 선으로 표현 가능
  • 비선형 함수 : 직선 하나로 표현이 불가능한 함수.

선형함수의 예시를 들면, f(x) = ax+b 와 같은 함수이다.

함수의 출력값이 x의 계수인 a에 의한 동일한 증가폭을 가진다.

 

그런데 활성화 함수로 왜 선형함수가 아닌 비선형 함수를 사용하는 것일까?

우리가 위에서 살펴본 계단함수나, 시그모이드 함수도 모두 비선형 함수이다.

 

그 이유는 선형함수는 은닉층이 없는 네트워크의 형식을 띄기 때문이다.

 

이게 무슨말인가? 싶을 수 있다.

 

먼저, 은닉층에 대하여 생각해보자.

입출력은 우리가 시각적으로 확인이 가능하나, 은닉층은 불가능하다.

즉 은닉층은 직관적으로 확인이 불가능하다는 성질을 가지고 있다.

 

그렇다면 이러한 은닉층을 선형함수로 구현한다면 어떨까?

 

h(x) = Cx

y(x) = h(h(h(h(x)))) 

 

h(x)를 4개의 층을 쌓아 y(x)를 만든다면 위와같은 모양이 될 것이다.

하지만 y(x)라는 함수는 다음과 같이 표현 가능하다.

 

y(x) = C^4x

 

이는 직관적으로 계산 과정을 알아볼 수 있고,

극단적으로 생각하면 층을 4번 쌓는 대신 그냥 y=C^4x 를 사용하면 바로 값이 나온다.

 

즉, 층을 여러개 쌓아서 얻는 이점이 없는 것이다.

 

따라서 비선형 함수를 사용하여 매 층마다 계산되는 방식이 달라지는 것이 중요하다.

 

그렇기 때문에 비선형 함수를 사용한다.

 

2-4. ReLU 함수

그럼 비선형 함수를 사용하는 이유도 알았으니 마지막 활성화 함수인 ReLU함수를 살펴보겠다.

ReLU함수

 

ReLU함수는 계단함수와 매우 비슷하게 생겼다. 다만 다른점은 계단함수는 극치를 넘으면 1을 출력했으나, 

ReLU함수는 그 x값 자체를 출력한다. 그래프를 그려보면 다음과 같은 모양이 나온다.

ReLU함수의 그래프

 

2-5. 여러가지 활성화 함수 

여러가지 활성화 함수를 살펴보았다.

하지만 이것들이 어떤 이유로 존재하는지 왜 구분짓는지 잘 이해가 안될것이다.

따라서 다음 포스팅때 추가적으로 각 활성화 함수에 대해서 자세히 알아보겠다.

 

3. 다차원 배열의 계산

파이썬에는 numpy 라이브러리를 제공하는데, 이를 이용한다면 배열의 계산을 매우 손쉽게 할 수 있다.

 

  • numpy.array() 를 활용하여 넘파이 배열을 선언할 수 있다.
  • shape, shape[index]를 활용하면 배열 모양의 튜플을 반환한다.
  • numpy.dot() 를 활용하여 배열의 행렬 곱 계산이 가능하다. (단, 차원이 맞아야함)

numpy 라이브러리의 유용성은 위의 것 들 말고도 상당히 많으나 자세한 것들은 코드를 작성할 때 주석으로 사용법을 다는 방식으로 진행하겠다.

 

numpy를 활용한 계산

위의 사진이 numpy를 활용하여 쉽게 신경망을 구현하는 예시이다.

입력으로 1차원 배열 X를 넣고, W를 2차원 배열,

이후 numpy.dot()을 활용한다면 1차원배열 Y의 결과를 바로 볼 수 있다.

 

 

다음 포스팅에는 3층 신경망의 구현을 알아보도록 하겠다.

'old > (old)밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

3-1. 활성화 함수  (0) 2021.01.08
2. 퍼셉트론(2)  (0) 2021.01.07
2. 퍼셉트론(1)  (0) 2021.01.01
1. 헬로 파이썬  (0) 2021.01.01

4. XOR게이트

우리는 이전 시간에 XOR 게이트의 비선형성을 느꼈고 기존의 방식대로 구현할 수 없다는 점을 알았다.

 

하지만 이것은 쉽게 해결할 수 있는데, 퍼셉트론의 층수를 늘리는 것이다.

 

만약, 앞에서 배운 AND, OR, NAND를 적절히 섞는다면 어떨까?

 

2층으로 구성된 퍼셉트론

위 그림처럼 나타낸다면 XOR를 충분히 구현할 수 있을 것이다.

즉, 우리는 게이트를 조합하여 단일 층이 아닌 다중 층을 쌓으면서 문제에 대한 해결을 할 수 있다.

 

따라서 우리는 다음과 같이 손쉽게 XOR에 대한 코드를 짤 수 있다.

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

 

5. 마무리

우리는 인공지능의 시작이 되는 퍼셉트론을 살펴보았다.

우리가 공부한 내용들의 핵심은 다음과 같다.

  • 퍼셉트론은 입력과 출력을 가진 알고리즘이며, 출력에 대한 규칙을 가지고 있다. (이와 관련하여서 다양한 게이트를 구현 해 보았다.)
  • 퍼셉트론에는 가중치(w)와 편향(b)을 가지고 있다.
  • 선형적인 표현과 비선형적인 표현이 존재한다. 비선형적인 표현은 쉽게 구현하기 힘들다.
  • 다만, 다층 퍼셉트론을 이용한다면 비선형적인 표현도 충분히 가능하다.

인공지능에 대한 기초가 되는 내용인 만큼 크게 어려운 점은 없었다.

다만, 기초지식인 만큼 확실하게 숙지를 해야 앞으로도 수월하게 진행할 수 있을것이다.

'old > (old)밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

3-1. 활성화 함수  (0) 2021.01.08
3. 신경망(1)  (0) 2021.01.07
2. 퍼셉트론(1)  (0) 2021.01.01
1. 헬로 파이썬  (0) 2021.01.01

0. 개요

2장에서는 퍼셉트론 알고리즘을 설명한다.

프랑크 로젠블라트가 1957년에 고안한 알고리즘이다.

 

상당히 오래된 알고리즘은 딥러닝의 기원이 되는 알고리즘이기 때문에 짚고 넘어가야 할 필요성이 있다.

 

1. 퍼셉트론이란?

퍼셉트론

위의 사진은 입력이 2개인 퍼셉트론의 구조를 보여주는 사진이다.

  • x : 입력
  • w : 가중치
  • y : 출력

퍼셉트론의 동작을 살펴보면 다음과 같다.

 

 1. 입력 x1, x2가 가중치 w1, w2와 곱해져서 더해진다.

 2. 1번에서 구한 값이 임계값 세타보다 크면 1, 같거나 작으면 0을 출력한다.

 

뇌구조에서 뉴런이 전기신호를 전달하는 방식을 아는가?

그 방법과 동일한 원리로 구현된다고 보면 된다.

 

이를 식으로 표현하면 다음과 같다.

 

y =  0 ( w1x1 + w2x2 <= 임계값 )

      1 (w1x1 + w2x2 > 임계값 )

 

 

용어를 정리하자면,

  • 뉴런(노드) : x1, x2, y1 즉, 각 동그라미를 의미
  • 가중치 : 값의 전달과 관련된 매개변수
  • 임계값(세타) : 뉴런의 활성화를 판가름하는 수치
  • 퍼셉트론 : 다수의 입력을 받아 하나의 출력을 만들어 내는 것

 

2. 단순한 논리 회로

퍼셉트론 알고리즘을 배웠으니 이를 활용해서 단순한 논리회로를 설계할 것이다.

 

논리회로는 여러개의 입력에 대한 하나의 출력을 나타내는 회로로써 입력값과 출력값은 0과 1로 이루어진다.

 

우리가 설계할 회로는 다음과 같다.

 

* AND                 

A B Y
0 0 0
0 1 0
1 0 0
1 1 1

프로그래밍 논리 조건에서 자주 볼 수 있는 && 연산자와 동일한 기능을 한다.

입력 AB에 대하여 둘다 1값을 가져야 출력이 1이 된다.



* NAND

A B Y
0 0 1
0 1 1
1 0 1
1 1 0

위에서 설명한 AND 회로의 결과값을 뒤집어 놓은 것과 동일하다.

따라서 11을 제외한 모든 조합은 1을 출력한다.

 

* OR

A B Y
0 0 0
0 1 1
1 0 1
1 1 1

프로그래밍에서 사용하는 || 조건과 동일하다.

입력중 하나만 1이 있어도 1을 출력한다.

 

3. 논리회로의 구현

이제 AND, NAND, OR에 대한 기본적인 동작을 살펴봤으니 어떻게 구현을 할 것인가에 대해서 생각해 보자.

 

퍼셉트론의 구조

먼저 퍼셉트론의 구조를 살펴보자.

퍼셉트론에서 구성요소는 다음과 같다.

  • 입력값 X
  • 가중치 W
  • 출력값 Y
  • 임계값 세타

각 요소들을 분석해본다면, 

  • 입력값 X : 함수의 입력에 해당한다.
  • 출력값 Y : 함수의 출력에 해당한다.
  • 가중치, 임계값 : 프로그래밍으로 마음대로 설정할 수 있다.

따라서, 우리는 가중치와 임계값을 활용하여 AND, NAND, OR을 구현해야한다.

그렇다면 어떻게 구현할까?

 

먼저, AND는 다음과 같은 조건을 가져야 할 것이다.

 

->두개의 입력이 모두 1이 되어야 1을 출력한다.

 

즉, 위에서 표현한 수식을 참고한다면,

-> w1+w2 > theta

-> w1, w2 <= theta

와 같은 방식으로 프로그래밍 하면 될것이다.

 

그렇다면 OR는 입력이 하나만 1이어도 활성화 상태가 되는 것이므로,

-> w1, w2 > theta

와 같은 방식이 되겠다.

 

# AND
def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    result = x1 * w1 + w2 * x2
    if result < theta:
        print(0)
    else:
        print(1)


print('result AND')
AND(0, 0)
AND(0, 1)
AND(1, 0)
AND(1, 1)


# OR
def OR(x1, x2):
    w1, w2, theta = 0.7, 0.7, 0.4
    result = x1 * w1 + w2 * x2
    if result < theta:
        print(0)
    else:
        print(1)


print('result OR')
OR(0, 0)
OR(0, 1)
OR(1, 0)
OR(1, 1)

위의 내용을 그대로 적용하여 AND와 OR 을 구현해보았다.

 

 

 

그렇다면 NAND는 어떨까?

 

NAND는 AND의 출력에 ! 연산자를 붙이는 것과 같다. 즉 출력값을 뒤집는 것이다.

 

그렇다면 우리는 식의 부호를 전부 뒤집어서 구현하면 해결할 수 있을것이라 생각할 수있다.

 

따라서 다음과 같은 코드가 완성된다.

 

# NAND
def NAND(x1, x2):
    w1, w2, theta = -0.5, -0.5, -0.7
    result = x1 * w1 + w2 * x2
    if result < theta:
        print(0)
    else:
        print(1)


print('result NAND')
NAND(0, 0)
NAND(0, 1)
NAND(1, 0)
NAND(1, 1)

 

가중치와 임계값의 부호를 뒤집어 버리니 반대의 결과가 나왔다. NAND까지 구현에 성공한 것이다.

 

4. XOR 게이트

XOR 게이트는 배타적 논리합이라고 불리는 함수이다.

* XOR

A B Y
0 0 0
0 1 1
1 0 1
1 1 0

입력값이 서로 다를때 1을 출력한다.

1의 갯수가 홀수일 때 1을 출력한다고 해서 홀수함수라고 부르기도 한다.

 

이러한 XOR 함수를 퍼셉트론으로 구하려면 가중치와 임계값을 어떻게 설정해야할까를 고민해보자.

 

OR, XOR의 차이

위의 사진을 살펴보자.

OR과 XOR를 좌표평면에 올려 그려보았다.

 

빨간점은 0을 출력하는 X값의 좌표이고 파란점은 1을 출력하는 X값의 좌표이다.

 

OR의 경우 직선으로 표현이 가능하나, XOR의 경우 곡선을 사용해야만 경계를 나눌 수 있다.

 

이를 선형, 비선형으로 구분한다.

 

 

아쉽게도 퍼셉트론으로만 XOR을 구현하기 힘들다.

따라서 우리는 다른 방법을 찾아볼 것이다.

'old > (old)밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

3-1. 활성화 함수  (0) 2021.01.08
3. 신경망(1)  (0) 2021.01.07
2. 퍼셉트론(2)  (0) 2021.01.07
1. 헬로 파이썬  (0) 2021.01.01

1. 들어가는 글

파이썬이라는 언어는 인공지능의 구현에 있어서 상당히 매력적인 언어다.

파이썬에서 제공하는 여러 라이브러리들이 딥러닝의 구현방식에 있어 매우 효율적이기 때문이다.

가장 대표적인 예가 넘파이 이다.

이런 세부적인건 앞으로 차차 배워나가는걸로 하고 먼저 앞서 이것을 공부하는데 필요한 것들을 살펴보자.

 

2. 파이썬 설치하기

기본적으로 버전은 3 이상을 사용하며, 다양한 라이브러리를 사용하기 위하여 아나콘다를 설치한다.

아나콘다는 다양한 라이브러리가 포함된 파이썬의 확장 버전이라고 생각하면 편하다.

 

이번 공부에서 사용하게 될 언어와 라이브러리는 다음과 같다.

  • 파이썬 3 : 개발 언어
  • 넘파이 : 다양한 계산을 편리하게 할 수 있게 해주는 도구
  • matplotlib : 그래프를 이용한 데이터의 시각화

 

3. 파이썬 알아보기

파이썬은 다양한 기능과 특징을 가지고 있다.

그 중 몇가지를 나열해보자면 다음과 같다.

  • 프로그래밍의 기본이 되는 산술연산과 자료형
  • 동적 언어의 특징 : 변수 선언시 자료형이 필요 없음
  • 리스트, 딕셔너리, bool 등 다양한 기본 자료형 제공

다른 언어를 접해보았다면 파이썬은 크게 어렵지 않게 느껴진다.

또한 기본적인 사용방법 또한 크게 어렵지 않기때문에 파이썬을 아직 모른다면, 잠깐 찾아봐도 금방 배울것이라 생각한다.

 

4. 마무리

이러한 배경지식을 가지고 딥러닝의 구현으로 다가가보자.

 

 

'old > (old)밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

3-1. 활성화 함수  (0) 2021.01.08
3. 신경망(1)  (0) 2021.01.07
2. 퍼셉트론(2)  (0) 2021.01.07
2. 퍼셉트론(1)  (0) 2021.01.01

+ Recent posts