본문 바로가기
Data Science/문과생도 이해하는 딥러닝

문과생도 이해하는 딥러닝 (2) - 신경망 Neural Network

by 싸코 2017. 10. 18.


2017/09/27 - [Data Science/Deep Learning] - 문과생도 이해하는 딥러닝 (1) - 퍼셉트론 Perceptron



한동안 인스타나 기타 SNS 크로러를 개발하느라고 딥러닝 정리가 조금 소홀했었다. 딥러닝과 집적 관련된 내용은 퍼셉트론 하나였는데 많은 분들이 관심을 가지고 계신 것 같다. 서둘러서 마무리하고 다음 단계로 넘어가야 할 것 같아서 서둘러 포스팅 작성을 시작했다.


신경망 Neural Network

문과생도 이해하는 딥러닝 (2)


지난 시간에 다루었던 퍼셉트론의 기본 개념과 한계점, 그 극복방안 등에 대해서 다루었다. 퍼셉트론이 가중치를 직접 수동으로 설정하는 작업을 했다는 한계가 있었는데 이를 해결할 방법이 바로 신경망이다. 우리가 딥러닝을 이야기할 때 '자동으로 알아서 학습하는' 이라는 말을 많이 한다. 알아서 가중치 값을 설정하고 조정하는 것이 자동으로 학습한다는 말과 동일하며 이것이 신경망의 가장 큰 특징 중 하나이다.



1. 퍼셉트론과의 비교

퍼셉트론이 하나의 뉴런 단위로 다루어진다면 각 뉴런이 모여 하나의 뇌가 되는 것과 같은 신경망은 퍼셉트론의 하위요소일 것이다. 단층 퍼셉트론이 하나의 나무와 같이 신경망은 나무가 모여 숲을 이룬 것과 같은 느낌으로 이해하면 된다. 퍼셉트론이라는 말을 어떻게 정의하느냐에 따라 가리키는 것이 달라진다. 일반적으로는 단층 퍼셉트론은 step function(임계값을 넘어섰을 때 출력을 1로 하는 함수)을 활성화 함수로 사용한 모델을 가리킨다. 다층 퍼셉트론은 층이 여러개이며 sigmoid function을 활성화함수로 사용하는 네트워크를 가리킨다.


신경망은 아래와 같이 왼쪽부터 Input(입력층), Hidden(은닉층), Output(출력층)으로 표현할 수 있다. 은닉층은 양쪽의 입력층과 출력층과는 달리 우리 눈에는 보이지 않기 때문에 (내부적으로 돌아가고 있는 Black Box와도 같다. 모르기 때문에) 'Hidden(은닉)'이라고 한다. 지난 포스팅에서 봤던 퍼셉트론과는 크게 달라 보이지 않는다.


Image result for 신경망


2. 활성화 함수 Activation Function


지난 포스팅에서 다루었던 퍼셉트론의 개념을 떠올려보자. Input의 값이 weight와 계산하여 다 더하고 사전에 설정한 임계값(threshold)과 비교해서 임계값을 넘으면 Output으로 1을 출력하고, 0을 출력했다.


여기서... 함수가 무엇인지 생각해보자. 무언가를 집어넣었을 때 아래에서 보듯이 박스 안에서 어떤 일들이 일어나 결과를 뱉어내준다. 그 어떤 일을 하는 것이 함수이다. 편의점에서 삼각김밥을 사먹을 때 삼각김밥을 전자레인지에 돌리고 꺼내면 뜨겁다. 차가운 나의 삼각김밥(Input)이 전자레인지(Function에 들어갔다가 밖으로 나오니 뜨거워졌다(Output). 활성화 함수도 무언가를 해주는 기능을 가진 것으로 활성화 activation 말 그대로 입력신호의 총합이 활성화를 일으킬지 정하는 역할을 한다. 그 정하는 것을 하는 내용들이 함수 안에 담겨 있는 것이다.


Image result for 함수


계단함수 step function

퍼셉트론은 활성화 함수로 step function(계단 함수)를 이용한다. 특정 임계값을 넘기면 활성화되는 함수이다. 아래 왼쪽(a)가 계단 함수이다. 0에서 멈추어있다. 어느 기점에서 1로 바뀐다. 학습과 관련해서 많이 들었을 것이다. 지금 열심히 공부할 때는 실력이 오르는지 모르겠지만 어느 순간 점수가 확 오를 것이라고... 우리는 우리도 모르는 사이에 계단 함수를 배우고 있었다.



Image result for step function sigmoid function


시그모이드 함수 sigmoid fuction

앞서 말했듯이 신경망에서 주로 이용하는 활성화 함수는 시그모이드 함수이다. 아래는 시그모이드 함수를 나타낸 식이다. e는 자연상수로 2.7192...의 값을 갖는 실수 이다. 아직은 자연상수가 뭔지 왜 이걸 사용하는지는 모르겠다. 수학적인 개념에 대해서는 아무래도 잘 모는데 이 부분은 나중에 다시 추가할 예정이다. 어쨌든 복잡해 보이는 이 시그모이드 함수도 역시 활성화를 위한 '함수'일 뿐이다. 입력을 받아서 출력을 돌려주는 변환기일 뿐이다.

신경망에서는 입력 신호를 받아서 변환하여 전달할 뿐이다. 계단함수에 비해 완만한 곡선 형태로 비선형이다. 특정 경계를 기준으로 출력이 확 바뀌어버리는 계단함수와는 달리 시그모이드 함수는 완만하게 매끄럽게 변화하는데 이 매끄러움이 신경망 학습에서 중요하며 활성화 함수로 시그모이드 함수를 사용하는 이유이기도 하다.

Related image



우리 문과생들은 일단 활성화 함수를 출력값을 반환하기 위해서 무언가를 처리해주는 변환기정도로만 생각해 놓자. 신경망에서는 활성화함수를 통해서 각 노드(뉴런)로부터 받은 신호를 변환하고 변환된 신호를 다음 뉴런으로 전달한다. 실제로는 계단 함수와 시그모이드 함수는 사용되지 않는 것으로 보인다.



그래프로 보면 더 이해가 잘 될 것이다.


계단 함수 Step Function (좌)       vs      시그모이드 함수 Sigmoid Function (우)


          



시그모이드 함수는 값을 실수형으로 가지는 것을 볼 수 있다. 시그모이드 함수의 매끄러움은 가중치 값을 전달할 때 좀 더 부드럽게 양을 조절해서 전달할 수 있다는 점이 계단 함수와 다른 점이다.


둘다 비선형인 점은 동일하다.



그렇다면 왜 비선형 함수를 사용해야 하는가?

선형함수를 사용했을 때는 은닉층을 사용하는 이점이 없기 때문이다. 다시 말해 선형함수를 여러층으로 구성한다 하더라도 이는 선형함수를 세번 연속 반복한 것에 지나지 않는다는 의미와 같기 때문이다. y = ax라는 선형함수가 있다고 한다면 이 것을 3층으로 구성하면 y = a(a(a(x))) 와 동일한 것으로 이는 y = a3(x)와 같다. 굳이 은닉층 없이 선형함수로 네트워크를 구성하는 것은 의미가 없다는 뜻입니다.


 ReLU 함수

입력이 0을 넘으면 그 입력을 그대로 출력하고, 0 이하이면 0을 출력하는 함수




3. 다차원 배열 계산

다차원 배열의 계산은


2017/10/09 - [Data Science/Python] - Python 기초 - NumPy로 선형대수 표현하기 (1)

2017/10/09 - [Data Science/Python] - Python 기초 - NumPy Broadcasting 이해하기 (2)


위의 두 포스팅을 먼저 보는 것이 도움이 될 것이다. 다차원 배열의 계산은 앞서 설명한 가중치의 값을 보다 편하게 하기 위해서 행렬 연산을 이용하는 것이다. 한 두개의 신경망 층은 인간이 계산할 수 있을지 모르겠지만 그 이상의 수 많은 차원의 수많은 뉴런층으로 구성된 신경망의 weight를 일일이 계산하는 것은 불가능한 일이다. 이를 컴퓨팅적으로도 쉽게 할 수 있도록 돕는 것이 행렬 연산이다. 이래서 선형대수의 개념을 알아야 했던 것이다. (문과생을 위한 선형대수도 공부하고 조만간 정리할 예정. 우선 위의 포스팅을 참조하자) 


여기서 중요한 개념은 다차원 배열(행렬) 간의 곱 연산이다. 위에 소개한 포스팅 NumPy Broadcasting에서도 나오지만 행렬의 곱이 성립하기 위해서는 기본적으로 아래의 조건을 따라야 한다. *(곱 연산)의 안쪽에 있는 b와 c의 값이 일치해야 하며, 곱 연산을 했을 때 결과값은 a x d의 형태로 나온다는 점이다. 이는 한쪽이 1차원 배열일 때도 동일하게 적용된다.


a x b  *  c x d  =  a x d  (when b = c )



>> A = np.array([[1,2], [3,4], [5,6]])

>> print(A.shape)    #(3, 2)


>> B = np.array([7,8])

>> print(B.shape)    #(2,)


>> np.dot(A, B)  #array([23, 53, 83])


위의 예제는  3 x 2  *  2 x 1 의 행렬곱이다. 결과는 3 x 1 이다. 안쪽이 2 = 2로 동일하고 결과 값은 3 x 1 로 바깥쪽의 값으로 이루어진 행렬 차원을 보인다.


아래와 같은 식으로 된다. Y의 값들은 활성화 함수를 통해 변환된다.







이런식으로 어떤 층의 노드(뉴런)의 개수가 몇 개가 되든 (위에서는 3개) 한 번의 연산으로 이 작업을 빠르게 수행할 수 있다. 행렬의 내적은 신경망에서 아주 중요한 개념인 것이다.


층이 몇 개이든 이와 같은 방법으로 가중치를 계속해서 계산해 나가는 것이라고 보면 된다.





4. 신경망 구현해보기

딥러닝을 돌려보기 위해서 구현 방법론이 머리 속에 정리되어야 한다.

  1. 신경망 환경설정 (네트워크 세팅)
  2. 초기 가중치(weight), 편향(bias) 설정
  3. 활성화 함수 설정

우선은 foward 방식만 고려했을 때 이렇게 간단하게 구성할 수 있으며, 패키지를 사용하게 되면 각 번호가 하나의 parameter를 설정하는 값들이 된다. 순차적으로 계산하는 방식은 신경망 모형의 가장 기본적인 내용이며 앞으로 갔다가 다시 뒤로 돌아오는 역전파(backpropagation)에 대해서도 곧 포스팅할 예정이다.





5. 출력층 설계

앞서 잠깐 설명했지만 신경망은 분류(classification)와 회귀(regression) 문제에 모두 활용할 수 있다. 어떤 문제냐에 따라 활성화 함수가 달라질 뿐이다. 분류는 어떤 사람이 사기를 쳤는지(1), 안 쳤는지(0) 예측하는 것이고, 회귀는 사기당한 금액이 얼마($10,000)였는지 에측하는 문제이다. 둘다 크게 보면 예측(prediction)이다.

어떤 상황에 어떤 활성화 함수를 사용해야 하는가

출력 부분에서의 활성화 함수는 문제 상황에 따라 다를 것이다. 일반적으로

회귀 --> 항등 함수 (출력 값을 그대로 반환하는 함수) identity function
분류(0/1) --> 시그모이드 함수 sigmoid function
분류(multiple) --> 소프트맥스 함수 softmax function


소프트맥수 함수(Softmax Function)는 아주아주 중요한 개념이므로 다른 포스팅에서 조금 더 설명해보겠다. 0~1의 실수 값을 출력하는 소프트맥스는 그 성질 때문에 분류하는 결과에 대한 확률값으로 해석되기도 하여 분류 문제를 확률적으로 풀어볼 수 있도록 한다.








신경망에 대한 기본적인 개념들을 알아보았다.  너무 이론적인 것만 했으니 다음 포스트에서는 간단하게라도 한번 딥러닝이 어떻게 돌아가는지 실습을 해볼 수 있도록 하겠다. + 소프트맥스 함수

댓글