728x90

머신러닝을 반드시 파이썬으로 배울 필요는 없다.

여기서는 특정 라이브러리를 사용해서 머신러닝을 하는 방법을 가르키는게 아니다.

머신러닝의 가장 기초적인 사항에 대해서 배우는 것이므로 사실 프로그래밍 못지 않게 개념이 중요하다.

개념만 이해한다면 굳이 파이썬이 아니더라도 다른 언어로 사용해도 무방하다.

이 강의에서는 그때 그때 필요한 라이브러리가 다르므로 모르는 라이브러리가 등장한다면 쪽지를 남겨주거나 검색하기를 바란다.


머신러닝을 배우기 앞서서 가장 중요한것은 일단 각각에 사용되는 용어와 어떻게 기게 학습을 하게 되는지에 대해서 설명하도록 하겠다.

일단 머신러닝을 배울 때 도대체 기계 학습이라는데서 학습이 무엇을 뜻하는지에 대해서 알아보자.


기계의 학습이란?


도대체 무엇이 학습일까?

아래의 경우 학습이라고 할 수 있을까?


"내가 특정 검색엔진에서 검색했던 모든 단어를 DB에 기록해둔다."


이 경우 학습이라고 할 수 있을까? 당연히 아니다.

하지만 애매모호하다. 왠지 이런것도 학습일거 같기 때문이다.

사람의 경우 새로운 지식을 머릿속에 넣는 과정을 학습이라고 한다.

기계 역시 마찬가지일 것 같다. 새로운 데이터를 DB에 넣는 과정 역시 학습의 일부일것 같기 때문이다.

그러나 기계 학습은 이런걸 의미하지 않는다.


"내가 이 때까지 사용했던 값들을 바탕으로 미래에 내가 넣지 않았던 값을 넣더라도 결과를 도출 한다."


위의 경우가 명백한 기계 학습이다.

중요한건 내가 지금 까지 가지고 있던 값들을 바탕으로, 그와 다른 값들을 넣을 지라도 결과를 도출해 낼 수 있어야 한다는 것이다.

이러한 모든 방법을 기계 학습이라고 한다.

쉽게 예시를 들면 아래의 경우다.


"1을 넣었더니 1이 나왔네? 2를 넣었더니 2가 나왔고 3을 넣었더니 3이 나왔어.. 그럼 4를 넣으면 4가 나오겠구나!!"


머신러닝은 정확하게 이러한 매커니즘을 거친다. 어찌보면 허탈할정도로 단순한 개념일 것이다.

현실에서 우리는 이런것을 예측할 수 있다. 바로 함수를 만들기 때문이다.

위의 경우 y=x꼴 함수일 것이라고 예측을 한다.

머신러닝도 이와 완전하게 동일한 프로세스를 거친다고 생각을 하면 편하다.


즉 우리가 머신러닝 프로세스를 만드는것은 이러한 함수들을 끊임없이 만드는 과정이라고 생각하면된다.


퍼셉트론(Perceptron)


그래서 가장 중요한건 퍼셉트론이라는 개념이다. 

퍼셉트론은 특정한 한 노드(뉴런)을 만드는 방법이라고 하면되겠다.

물론 아직까지 노드니 뉴런이니 생각할 필요는 없다.

보통 아래와 같은 그림은 전형적인 퍼셉트론이다.



출처


퍼셉트론은 위와같은 구조로 되어있다.

사실 매우 쉽지만 난 수식만 보면 머리가 아파요 으어엉 하는 사람에게 이야기를 하자면

x는 내가 넣은 입력값을 의미한다. 또한 y는 출력값이다. 위 사진에서는 a라고 되어있다.

그리고 w는 가중치를 의미한다. 무슨 말이나면 x의 값을 온전히 다 받는게 아니라 배율을 둔다는 이야기이다.

가령 [대한민국,일본,미국] 이라는 입력값을 받을 경우 이들 각각의 [1,1,1]받을 수도 있지만

대한민국의 경우 0.5의 가중치를 미국의 경우 1.2의 가중치를, 일본의 값은 안받아! 이러면 [1*0.5,1*0,1*1.2]로 값을 받아

결국에는 [0.5,1,1.2]의 값을 사용하게 될것이다. 가중치를 얼마를 사용할지 역시 여러분의 마음에 달렸다.

그 다음 모든 값을 합친다. 그리고 그 합친것을 활성화 함수 h(사진에서는 시그마라고 되어있다.)에 넣는다.

활성화 함수도 어렵게 생각할거 없다. 그 값을 쓸지 말지 선택하는거라고 생각하면 아주 편하다.

가령 난 모든 숫자를 더했는데 그게 양수일때만 쓸꺼야!! 활성화 함수를 >0일때 1을 반환한다 라는 형식으로 쓰면된다.


수식으로 정리하자면 y = h(sum(x*w) + b)가 된다.

b는 아직 등장하지 않았는데 bias의 줄임말로 임계값을 의미한다.

쉽게말하면 조정값인데 활성화 함수가 > 0같은 꼴이면 b의 값은 0이된다.

반대로 활성화 함수가 > 7 같은 꼴이면 b의 값은 -7이 된다.


그럼 퍼셉트론을 이용한 예제를 한번 만들어 보도록 하자.


퍼셉트론을 이용한 and게이트, or게이트, nand게이트 만들기


당장 실습을 해보도록하자.

퍼셉트론을 이용한 and게이트를 만들도록 하자.

입력값은 0과 1만 존재한다고 가정한다.

참고로 비트연산과 관계연산을 사용하지 않고 만든다.

애당초 사용해서 만든다면 이것을 할 이유가 없다.

여기서는 numpy를 사용할 것이다.


import numpy as np


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

위의 경우 값을 두개를 받는 and게이트를 만들었다.

여기서 이 and게이트를 만든 원리는 특정 값을 받았을 때 가중치를 0.5로 둔다.

그러면 두값이 모두 들어오면 1이 되고 한개만 값이 들어오면 0.5가, 두개 모두 값이 안 들어오면 0이된다.

여기서 우리가 and게이트를 만들려면 계산된 값이 0.5보다 크면 된다.

즉 임계값은 0.5보다는 커야한다는 이야기가된다. 그리고 1보단 작아야된다.

왜냐하면 존재할 수 있는 값이 1이 최대이기 대문이다. 임계값이 1을 넘어서면 이는 존재할 수 없는 값이 된다.

따라서 b의 값은 0.5보단 크고 1보단 작아야한다.

그런데 역수로 넘어오므로 (왜나하면 x>b 꼴이기 때문에) b의 값은 음수가 된다.

예제에서는 0.7을 사용했으나 0.5초과 1미만이면 어떤수라도 상관은 없다.


비슷한 방식으로 nand와 or게이트 역시 만들 수 있다.

import numpy as np


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

위의 경우 nand게이트이다.


import numpy as np


def or_gate(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2
if np.sum(x * w) + b < 0:
return 0
else:
return 1

위의 경우 or게이트이다.


보면 알겠지만 w와 b를 손댄걸 제외하면 셋의 코드는 사실상 동일하다고 봐도 무방할정도로 비슷하다.

위를 구현한 예제는 함수평면상에 나타내면 아래와 같다.


출처


저기 실선이 보이는가? 이게 여러분이 만든 함수이다.

여러분은 저 실선을 왔다갔다하기만 하는 작업(w,b를 수정하는 작업)만으로 and,nand,or게이트를 제작한 것이다.

그럼 여러분에게 문제를 내보겠다.

xor게이트는 만들 수 있는가?

위의 모델에서 선만 움직이는 것으로 xor게이트를 만들 수 있냐고 물으면 당연히 만들 수 없다.

만들수 있는지 없는지는 여러분이 한번 해봐도 좋다. 당연하게 만들 수 없으니까.

이게 퍼셉트론 모델이 가졌던 문제점이며 한동안 인공지능 연구가 정체되었던 이유중 하나이다.


다층 퍼셉트론과 xor게이트


여기에 이를 해결하기위한 해결법이 존재한다.

기와 이렇게 된거 아예 퍼셉트론을 쌓아올리자는 것이다!

가령 xor게이트는 2개의 nand게이트, 1개의 nor게이트, 2개의 not게이트로 만들 수 있다.

거꾸로 말하면 1개의 nand게이트와 1개의 and게이트, 1개의 or게이트로 만들 수 있다는 이야기이다.

코드로 구현하면 아래와 같다.


def xor_gate(x1, x2):
s1 = nand_gate(x1, x2)
s2 = or_gate(x1, x2)
return and_gate(s1, s2)

이로 인하여 바야흐로 xor게이트의 구현이 가능해 지게 되었다.

xor게이트를 구현하기 위해서 우리는 퍼셉트론모델을 총 3개를 만들었다.

이제 이 퍼셉트론모델 하나하나를 노드(뉴런)이라고 부르자.

그러면 우리는 노드를 쌓아서 올린 셈이 된다.

이게 앞으로 시작될 머신러닝의 가장 기초적인 이론이라고 할 수 있다.

+ Recent posts