10강 인공신경망1 편

2018. 9. 27. 17:16Python-이론/python-인공지능2

10강 인공신경망 


사람들이 새로운 무언가에 대해 생각할때 자연에서 아이디어를 얻는 경우가 많이 있습니다. 예를 들어서 비행기(새)라던지 끈끈이 주걱(식물) 등에서 아이디어를 얻곤 하죠. 그래서 우리가 인공지능을 만들려고 했을 때 가장 먼저 아이디어를 얻은 부분이 입니다. 뇌에서 어떻게 영감을 받아서 인공 뉴런까지 만들게 됐는지 살펴보겠습니다. 


10.1 생물학적 뉴런에서 인공 뉴런까지 


역사적으로 1943년 생리학자 워런 맥컬록이 수학자 월터 피트가 인공신경망에대해 처음 소개했습니다. 이논문에서 명제 논리를 사용해 동물 뇌의 생물학적 뉴런이 복잡한 계산을 위해 어떻게 상호작용하는지에 대한 간단한 계산 모델을 제시했습니다. 이것이 최초의 인공 신경망이었습니다. 




1960년대 인공신경망의 초기 성공은 곧 지능을 가진 기계와 대화를 나눌 수 있을 것이란 믿음을 널리 퍼트렸습니다. 이 약속이 지켜질 수 없음이 명확해 지면서 투자가 다른 곳으로 분산되고 인공지능 분야가 freeze되는 현상이 일어났습니다. 

하지만 1980년대 새로운 네트워크들이 개발되고 1990년대 다양한 머신러닝 기법이 생기면서 인공지능 분야의 새로운 붐이 일어났습니다. 


추후에 그래픽카드의 발전, 훈련 알고리즘 향상, 많은 투자들에의해서 새로운 붐이 되는 언어입니다. 


10.1.1 생물학적 뉴런 



이 이상하게 생긴 세포는 우리의 신체구조를 구성하고 있습니다. 축삭돌기의 끝은 축삭 끝가지라 불리는 여러 개의 가지로 나뉘고 이가지의 끝은 시냅스라 불리는 미세한 구조이고 다른 뉴런의 가지돌기와 연결되어있습니다. 

뉴런은 시냅스를 통해 짧은 전기신호를 받고 있으며 충분한 횟수의 신호를 받으면 자체적인 신호를 발생시킵니다.  


따라서 개개인의 뉴런은 아주 단순하게 동작하지만, 수십억 개의 뉴런으로 구성된 거대한 네트워크를 구성하고 있습니다. 각 1개는 많이 허술할지 몰라도 엄청난 양의 세포들이 모여 인간의 엄청난 기능을 만드는 것 같다. 


10.1.2 뉴런을 사용한 논리 연산


워런 맥컬록과 월터 피츠는 매우 단순한 생물학적 뉴런 모덱을 제안했습니다. 나중에 이것이 인공 뉴런이 되었습니다. 

이모델은 이진 입력과 하나의 이진 출력을 가집니다. 인공 뉴런은 단순히 일정 개수의 입력이 활성화되었을 때 출력을 내보냅니다. 


예를 들어 

c = a^b라던지 c = avb라던지를 이용해서 뇌와 같이 몇십몇백 개를 만들어서 다양한 기능을 할 수 있게 만들 수 있습니다. 


10.1.3 퍼셉트론 

퍼셉트론은 가장 간단한 인공 신경망 구조입니다. 퍼셉트론은 TLU라는 다른 인공 뉴런을 기반으로 만들어집니다.

TLU는 입력의 가중치 합을 계산하고(y = w1x + w2x + w3x +b) 그런 다음 계산된 합에 계단 함수를 적용하여 그 결과를 출력합니다. 

퍼셉트론에서 사용하는 계단 함수는 헤비사이드 계단 함수입니다.  


*계단 함수란?

입력된 값이 기준의 조건에 따라서 결과가 정해져있는 것을 의미한다. 


TLU를 사용한다면 이진 분류 문제에 사용되곤 합니다. 

예를 들어(입력의 선형 조합을 계산해서) 그 결과가 임계값을 넘어서면 양성을 출력하고 못넘어서면 음성을 출력합니다. 

그래서 TLU를 훈련 시켜야 하는데 이때는 각 입력에대한 가중치를 적절한 값으로 조종하면 찾는 것입니다.  


퍼셉트론은 층이 하나뿐인 TLU로 구성되어 있습니다. 각 뉴런은 모든 입력에 연결되어 있으며 입력을 받은 후 가공 후 출력을 해줍니다. 그리고 편향 뉴런이라는 것이 있는데 이 편향 특성은 항상 1을 출력하는 특별한 종류입니다. 


퍼셉트론 훈련법 


뉴런이 다른 뉴런을 활성화 시킬 때 둘 사이에서 연결이 강해진다고 합니다. 즉 두 뉴런이 동일한 출력을 낼 때 마다 그들 사이의 연결 가중치가 증가합니다. 퍼셉트론은 네트워크가 만드는 에러를 반영하도록 조금 변형된 규칙을 사용하여 훈련합니다. 

잘못된 출력을 만드는 연결은 강화하지 않습니다. 


한번에 한개의 샘플이 입력되면 각각의 결과가 나옵니다. 잘못된 예측을 하는 모든 출력 뉴런에 대해 올바른 예측을 할 수 있게 연결된 가중치를 강화시킵니다. 


퍼셉트론의 결정경계는 선형이므로 퍼셉트론도 복잡한 패턴을 학습하지 못합니다. 하지만 훈련샘플이 선형적으로 구분될 수 있다면 적절한 정답을 구할 수 있습니다. 


아래 예제는 sckit learn의 퍼셉트론을 이용합니다.


import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import Perceptron

iris = load_iris()
X = iris.data[:, (2, 3)]
y = (iris.target == 0).astype(np.int)

per_clf = Perceptron(random_state=42)
per_clf.fit(X, y)

y_pred = per_clf.predict([[2, 0.5]])
print(y_pred) #1


퍼셉트론은 확률을 제공하지 않습니다. 


퍼셉트론도 약점이라고 하면 약점이 있었습니다. 그건 간단한 문제를 해결할 수 없었습니다. 예) XOR연산 

하지만 여러 퍼셉트론을 쌓아 올려 일부제약을 줄일 수 있다는 것을 알았고 XOR문제도 해결할 수 있었습니다. 

이러한 다층 퍼셉트론을 (MLP)라고 합니다. 


10.1.4 다층 퍼셉트론과 역전파


다층 퍼셉트론을 훈련시킬때 역전파라는 알고리즘을 사용합니다. 역전파는 다시말해서 후진모드 자동 미분을 이용하는 경사하강법으로 기술합니다. 


역전파


1. 알고리즘이 각 훈련 샘플을 네트워크에 주입하고 연속되는 각 층의 뉴런마다 출력을 계산합니다. 


2. 각 출력값에 대한 오차를 계산합니다. 


3. 각 층의 오차에 마지막 은닉충의 뉴런이 얼마나 기여했는지 계산합니다. (입력층에 도달할 때 까지)


4. 각 층의 오차를 경사하강법을 통해서 줄이는 방법입니다.(가중치 조정)


이 알고리즘을 잘 사용하기 위해서 퍼셉트론에 있는 계단함수를 로지스틱 함수를 변화 시켰습니다. 

이변화를 통해 평평하던 계단함수를 대신해서 역전파에 경사하강법을 이용할 수 있게 되었습니다.


다른 활성화 함수 RELU 등이 있습니다.


그리고 이진분류가 아닌 여러개를 분류해야할 때 출력층에 소프트 맥스 알고리즘을 활용해서 나타낼 수 있습니다. 


10.2 텐서플로의 고수준 API로 다층 퍼셉트론 훈련하기


다층 퍼셉트론을 훈련시키기 위해 tensorflow의 TF.Learn을 사용하는 것입니다.


import tensorflow as tf
import numpy as np

#데이터 생성

(X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data()
X_train = X_train.astype(np.float32).reshape(-1, 28*28) / 255.0
X_test = X_test.astype(np.float32).reshape(-1, 28*28) / 255.0
y_train = y_train.astype(np.int32)
y_test = y_test.astype(np.int32)
X_valid, X_train = X_train[:5000], X_train[5000:]
y_valid, y_train = y_train[:5000], y_train[5000:]

#훈련
feature_cols = [tf.feature_column.numeric_column("X", shape=[28 * 28])]
dnn_clf = tf.estimator.DNNClassifier(hidden_units=[300, 100], n_classes=10,
feature_columns=feature_cols)

input_fn = tf.estimator.inputs.numpy_input_fn(
x={"X": X_train}, y=y_train, num_epochs=40, batch_size=50, shuffle=True)
dnn_clf.train(input_fn=input_fn)
y_pred = dnn_clf.predict(X_test)



컨트롤 왼쪽 마우스키를 누르고 들어가보면 활성화 함수는 RELU이고 출력층은 소프트 맥스 비용함수는 크로스 엔트로피입니다.