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

+ Recent posts