CS_Developer
[A.I.] #1 머신러닝: 퍼셉트론 본문
이번 포스팅에서는 머신러닝에 대하여 이야기할 것이다.
참고 도서는 텐서플로 2와 케라스로 구현하는 딥러닝 2/e이다.
위의 그림에서 보는 것처럼 인공지능(AI)은 가장 큰 개념이다. 그 안에 머신러닝이 포함되고, 그 안에 딥러닝이 포함되는 구조이다. 우리는 이번 포스팅에서 머신러닝에 대해 공부할 것이다. 최근에 머신러닝에 대한 논문이 급증하고 있다. 무어의 법칙 관련 논문보다 머신러닝 관련 논문의 개수가 많아진 추세이다. 따라서 우리는 머신러닝에 대해 공부할 필요성이 조금은 생긴 것이다.
최근 딥러닝 프레임워크의 사용 순위가 keras와 tensorflow가 1, 2위를 다투고 있다. 그 뒤를 PyTorch가 따른다. 따라서 포스팅에서는 텐서플로와 케라스를 이용하여 진행할 예정이다. 최근에는 텐서플로 2.0 버전이 나오면서 더 간결한 코드 작성이 가능해졌다.
텐서플로의 특징에 대해 조금 알아보자면, 파이썬, C++, R, Go등과 같은 언어들로도 사용이 가능하다.
또한 텐서플로 2.0 버전에서는 케라스가 내장되어있는 형태로 업데이트되었다. 케라스는 high-level API이다.
모델의 배치와 사용법이 간단하다. 연산이나 그래프 연산도 제공해주는 형태이다. 또한 뛰어난 커뮤니티를 보유하고 있는 것도 텐서플로의 장점이라 할 수 있다. 모르는 것이 존재하면 물어볼 곳이 생기기 때문이다.
Perceptron (퍼셉트론)
퍼셉트론은 하나의 뉴런을 모사한 것이다. 여기서는 소프트웨어를 활용하여 실제 인간의 뉴런과 유사하게 생성한다.
위의 함수 식은 퍼셉트론 모델을 나타내는 함수 식이다.
W는 가중치, b는 편향이다. 하지만 b까지 함께 W라고 말하기도 한다.
우리는 먼저 감독 학습을 알아볼 것이다. 감독 학습은 마치 선생님이 학생을 알려주는 것처럼 정해진 정답이 있고, 프로그램이 그 정답을 맞히거나 틀리게 된다. 학습 데이터를 모델에게 주면 모델은 학습 데이터에 맞추어 W(가중치)를 갱신한다. 즉, 학습데이터에 맞게 자신의 가중치를 바꾸어 나가는 것이다. 이러한 과정은 정답과의 오차를 줄이는 과정이라 할 수 있다.
퍼셉트론은 단층 퍼셉트론과 다층 퍼셉트론이 존재한다. 단층은 말 그대로 층이 1개인 것이다. 다층은 반대로 층이 여러 개이다. 즉, 퍼셉트론계층을 여러개 쌓은 것이다.
다층 퍼셉트론은 입력층과 은닉층, 출력층으로 나뉜다. 입력층은 데이터를 입력시키는 층이고, 출력층은 정답을 출력하는 층이다. 은닉층은 입력과 출력 사이에 숨어있는 층으로, 밖에서는 보이지 않는 논리적인 구조를 지닌다.
퍼셉트론은 한계를 지닌다.
고정 임계치를 사용하기 때문에, 출력이 불연속이고, 미분이 불가능하다. 따라서 작은 오차의 변화에도 가중치가 크게 변경되게 되며, 최적의 가중치로의 안정적인 수렴이 어려워진다. 다시 말해서, 학습이 어렵다는 뜻이다. (표현의 한계가 존재) 이러한 이유 때문에 고정 임계치 대신 미분이 가능한 연속함수가 필요하다. 활성화 함수를 변경하는 것이 해법이다. 또한 여담으로 수렴이 잘 되지 않는 경우에는 계층을 더 쌓거나, 뉴런을 많이 사용하면 나아질 수 있다. 하지만 이렇다 한 정답은 존재하지 않으니, 직접 해보면서 깨달아야 한다.
활성화 함수 (Activation Function)
다양한 활성화 함수가 존재한다. 이 활성화 함수들은 미분이 가능한 연속함수들이다.
- sigmoid
- tanh
- ReLU
- ELU
- LeakyReLU
- Softmax
등이 존재한다. 이 활성화 함수가 너무 복잡하게 되면 연산이 증가하게 되고, 그만큼 시간이 오래 걸린다. sigmoid는 상대적으로 복잡하기 때문에 그 아래의 함수들을 사용하곤 한다. 이것 또한 성능을 위해서 이렇다 한 정답은 존재하지 않으니 참고하길 바란다.
여기서 Softmax는 값을 확률 값으로 변환시켜 내보내 준다. 즉, 0과 1 사이의 확률 값이 출력된다.
추후에 자세히 알아보도록 하겠다.
손실 함수 (Loss Function)
손실 함수는 모델이 예측한 예측치와 정답과의 차이를 계산하는 함수이다. 즉, 이 뉴럴 네트워크가 얼마나 좋은 성능을 내는지 평가하는 평가함수라고도 불린다. 더 적은 손실이 더 좋은 결과를 불러오게 된다. 우리가 하는 학습의 목적은 이 손실함수 (오차)를 줄이는 것에 초점을 맞춘다. 손실 함수에는 L1 loss와 L2 loss가 존재한다.
L1 Loss는 실제의 정답과 예측치의 차이를 절댓값으로 계산하여 합해준다.
L2 loss는 정답과 예측치의 차를 제곱하여 합해준다.
위의 손실 함수들은 회귀의 손실 함수이다. 학습에는 회귀와 분류가 존재한다.
회귀는 일련의 숫자 값이다. 분류는 True False처럼 딱 분류가 되는 것이다. 예를 들어 지역별로 집값을 예측하는 모델을 설계한다면, 이 예측치의 출력은 회귀이다. 왜냐하면 집값의 범위는 아주 다양하기 때문이다. 반대로 음식점에서 손님이 주문을 할 경우와 하지 않을 경우를 예측하는 것은 분류이다. 이것은 한다 안 한다를 분류해 주기 때문이다. 미약한 설명이지만 도움이 되었길 바란다. 자세한 내용은 추후에 살펴보도록 하자.
회귀의 손실 함수가 존재하면 분류의 손실 함수도 존재한다. 분류는 이진 분류와 다중 분류로 나뉜다. 이진 분류는 참 거짓 과 같이 두 가지로 나뉘는 경우이고, 다중 분류는 학점의 예측처럼 A, B, C, D, F로 나뉘는 경우이다. 이 외에도 다른 손실 함수들이 존재한다.
신경망을 학습할 때 오차를 모델에게 알려주어야 하기 때문에 오차를 역전파 하게 된다.
모델의 학습주기는
- 입력 데이터의 순전파
- 오차의 역전파
- 가중치 갱신
으로 구성된다. 먼저 데이터를 전파한 후, 오차를 역전파하고, 역전파된 오차를 이용하여 가중치를 갱신하게 되는 것이다.
정말 간단하게 머신러닝에 대해 알아보았다. 더욱 자세한 내용은 다음에 차차 작성하도록 하겠다.
이 글은 정말 머신러닝이 뭔지 모르는 사람들이 흘러가는 내용으로 보면 흥미로울 것이다.
다음 포스팅에서는 MNIST라는 필기체 숫자 인식 문제를 살펴보도록 하겠다.
여기까지 읽은 여러분은 머신러닝에 대해 조금이나마 알게 되었다.