본문 바로가기
Machine learning

Deep Learning numpy를 통한 기초이론_1. 신경망의 작동.

by ahsung 2020. 1. 5.

 

Deep Learning이란

 

사람의 신경망을 흉내내서 만들어낸 인공지능의 한 분야이다.

 

딥러닝이 주목받는 이유라하면,  최적의 알고리즘을 스스로 학습하여 찾아 갈 수 있다는 점에 있다. 

 

사람의 신경망은 각 신경세포가 자극을 받으면 역치가 넘어가는 자극들을 다음 세포들에 넘기며 생각과 결정을 이루게 된다.

그리고 사람은 여러 자극을 받고 결과를 느끼며 스스로 배우고 타협점을 찾아간다.

 

이 과정을 컴퓨터에 접목한다면 어떻게 될까, 그것이 Deep Learning이다.

 

간단한 이론의 출발점은

1) 입력을 받고 인공신경망을 걸쳐 나온 결과값과 정답의 차이를 비교한다.

 

2) 차이가 클수록 인공신경망 안의 매개변수들을 차이가 작아지는 방향으로 조금씩 조정한다.

 

1) 과 2) 과정의 반복으로 점점 인공신경망은 정답에 가까운 학습을 해나가는 것이다.

 

그렇다면 인공신경망이란 무엇인가?

 

간단한 인공신경망의 모델은

 

1) 입력 a를 받는다.

2) 결과 a*w를 내보낸다.

 

a는 자극이고 결과는 a*w 인것이다. 자극을 받아 결과를 내보내는 과정을 신경망안의 세포 하나가 하는 과정이다.

 

간단한 예로 AND게이트 작업을 하는 인공신경망을 디자인해보자.

AND 자극 2개(input1, intpu2)의 비트를 받아 결과를 내보낸다

 

0  0 -> 0

0  1 -> 0

1  0 -> 0

1  1 -> 1

 

입력 1의 자극 =  input1 * 0.5

입력 2의 자극 =  input2 *  0.5

 

결과 =

            if ( 1자극 + 2자극 )  <=  0.7  then 0;

            else 1;

 

쉽게 AND 게이트를 작동시키는 인공망을 만들었다. 다른 느낌의 식으로 변형하면

if( 1자극 + 2자극 ) - 0.7 <= 0   

 

즉 위 과정에서 세포가 하는일이 a자극을 받아 a*w를 내보내는 것 뿐만아니라

 

a*w + b 

 

덧셈을 추가하여 결과 값을 간단하게 맞춰낼 수 있다.

 

이때 w는 weight(가중치)  b는 bias(편향)이라고 한다.  

 

조금 더 일반화시킨다면

result = input1* w1 +  input2*w1 ....... + inputN* wN  + b

 

result(결과값)는 입력값에 대한 선형방정식의 결과를 갖는 다는 것을 알 수 있다.

이렇게 여러 입력을 받아 하나의 결과를 내는 과정을 퍼셉트론(perceptron)이라 한다.

 

선형식이란, 간단하게 일직선을 말하며 확장된 의미로 차원이 올라갈 수록 고차원의 곧게 나아가는 차원들,

1차원 공간에서는 점

2차원 공간에서는 직선

3차원 공간에서는 평면 ...

 

그리고 선형식의 특징은 1차식이라는 점에 있다.!

 

이런 식으로 OR과 AND는 선형의 식으로 정답과 오답 부분을 완벽하게 가를 수 있다.

 

하지만 XOR경우 선형 식으로는 정답과 오답을 도저히 가를 수 없다.

가르기 위해서는 곡선의 형태로 영역을 그려야 할텐데,  즉 비선형 식이 필요하다는 뜻이다.

 

하지만 우리는 XOR게이트를 AND와 OR로 만들 수 있다는 것을 알 수 있다.

 

ex)  XOR =      AND( not AND(x1, x2) ,  OR(x1, x2) )

 

이렇듯 선형식으로 구한 결과값  두개를 다시 선형식으로 취한 결과, 비선형을 나타 낼 수 있었다.!!

 

 

허나! 여기서 의문점이 들지 않는가

 

f(x) = 일차식

g(x) = 일차식

 

이라면 f(g(x)) = 무조건 일차식이다.

즉 선형방정식을 아무리 합성한들 선형방정식인 것이다.

하지만 어째서 선형식의 표현을 두번 결합하였더니 비선형이 되었나!

 

그 이유는 사실 AND게이트의 

temp_result = input1 * 0.5 + input2 * 0.5  - 0.7

는 선형식이지만  진짜 final_result는 temp_result가 0보다 큰지, 작은지에 따라 결정된다.

 

final_result = temp_result > 0 ? 1 : 0

 

이렇게 비선형의 구조를 갖게 해주는 과정을 담고 있는 함수를, 활성화 함수(activation function) 이라고 한다.

 

여기서 쓰인 활성화 함수는, 0 or 1 만 갖게하는 계단식형태(if문)의 함수이고 이 외에 다른 종류의 활성화 함수를 사용할 수 있다.

 

import numpy as np


def AND(x1,x2):
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.7
    tmp = np.sum(x*w) + b
    if tmp > 0: return 1
    else: return 0
    
def NAND(x1,x2):
    return int(not bool(AND(x1,x2)))
    
def OR(x1,x2):
    x = np.array([x1,x2])
    y = np.array([0.5,0.5])
    b = -0.2
    tmp = np.sum(x*y) +b
    if tmp > 0 : return 1
    else : return 0
    
def XOR(x1,x2):
    s1 = NAND(x1,x2)
    s2 = OR(x1,x2)
    return AND(s1,s2)



print("AND",AND(0,0),AND(0,1),AND(1,0),AND(1,1),sep='\n',end='\n\n');
print("NAND",NAND(0,0),NAND(0,1),NAND(1,0),NAND(1,1),sep='\n',end='\n\n');
print("OR",OR(0,0),OR(0,1),OR(1,0),OR(1,1),sep='\n',end='\n\n');
print("XOR",XOR(0,0),XOR(0,1),XOR(1,0),XOR(1,1),sep='\n',end='\n\n');

 

 

파이썬의 numpy를 사용한 코드로 4가지 게이트의 퍼셉트론을 통한 구현을 볼 수 있다.

 

XOR의 경우 2번의 과정을 거쳤으므로 2층구조라고도 할 수 있다.

 

실제로 컴퓨터는 기계적으로 모두 저 4개 형태의 게이트를 가장 기초로하여 만들어 졌고

이론상 2층 퍼셉트론이면 컴퓨터를 만들 수 있다는 것이 증명되었습니다.

-> 컴퓨터를 만들 수 있다는 것은, 컴퓨터로 프로그래밍해서 정답을 얻어 낼 수 있는 모든 로직이 구현 가능하다는 것!

 

물론 2층으로 만들게되면 정말 많은 weight와 입력값의 복잡도가 올라가므로

실제로는 훨씬더 깊은 인공망을 사용하고 있습니다.!

 

 

 

 

댓글