10. 인공 신경망 (Artificial Neural Networks)
뇌에 있는 생물학적 뉴런의 네트워크에서 영감을 받은 머신러닝 모델이다.
2000년 대에 들어서면서 인공 신경망은 2012년 ILSVRC2012 대회에서 인공 신경망을 깊게 쌓은 딥러닝 모델인 AlexNet이 압도적인 성적으로 우승하면서 다시금 주목받게 되었다. 이렇게 인공 신경망(딥러닝)이 다시 주목받게 된 계기는 다음과 같은 것들이 있다.
- 빅 데이터 시대인 요즘 신경망을 학습시키기 위한 데이터가 엄청나게 많아 졌다.
- 신경망은 다른 머신러닝 알고리즘보다 규모가 크고 복잡한 문제에서 성능이 좋다.
- 1990년대 이후 크게 발전된 컴퓨터 하드웨어 성능과 Matrix연산에 고성능인 GPU로 인해 상대적으로 짧은 시간 안에 대규모의 신경망을 학습시킬 수 있게 되었다.
10.1 생물학적 뉴런에서 인공 뉴런까지
10.1.1생물학적 뉴런
아래의 그림은 사람의 뇌에서 볼 수 있는 세포로써 핵(nucleus)을 포함하는 세포체(cell body)와 구성 요소로 이루어져 있다.
- Dendrite : 수상돌기, 다른 뉴런으로부터 신호를 수용하는 부분
- Axon : 축삭돌기, 신호를 내보내는 부분
- Synaptic terminals : 시냅스(synapse) 뉴런의 접합부, 다른 뉴런으로 부터 짧은 전기 자극 신호(signal)를 받음
각각의 뉴런은 수상돌기를 통해 다른 뉴런에서 신호를 받아서 축삭돌기를 통해 다른 뉴런으로 신호를 보낸다.
시냅스는 뉴런과 뉴런을 연결하는 역할을 한다.
-> 전달된 신호는 시냅스가 신경전달 물질 이라는 화학적 신호를 발생하게 한다.
10.1.2 뉴런을 사용한 논리 연산
처음 인공 신경망을 제안한 Warren McCulloch과 Walter Pitts의 인공 뉴런 모델은 하나 이상의 이진 입력과 하나의 출력을 가진다.
첫번째 네트워크
①은 항등함수를 의미하며, 뉴런 A가 활성화 되면 뉴런 C 또한 활성화된다.
두번째 네트워크
②는 논리곱 연산을 의미하며, 뉴런 A와 B가 모두 활성화될 때만 뉴런 C가 활성화된다.
세 번째 네트워크
③은 논리합 연산을 의미하며, 뉴런 A와 B 둘 중 하나라도 활성화되면 C가 활성화된다.
네 번째 네트워크
④는 어떤 입력이 뉴런의 활성화를 억제할 수 있다고 가정하면, 위의 그림에서 처럼 뉴런 A가 활성화 되고 B가 비활성화될 때 뉴런 C가 활성화된다.
10.1.3 퍼셉트론
퍼셉트론(Perceptron)은 Frank Rosenblatt가 1975년에 제안한 인공 신경망 구조 중 하나이며, 신경망(딥러닝)의 기원이 되는 알고리즘이라고 할 수 있다.
TLU(Threshold Logic Unit) 또는 LTU(Linear Threshold Unit)이라 불리는 다른 형태의 뉴런을 기반으로 한다.
퍼셉트론에서 가장 널리 사용되는 계단 함수는 헤비사이드 계단 함수(Heaviside step function)이며, 단위 계단 함수(unit step function)라고도 한다. (간혹 계단 함수 대신 부호 함수(sign function)을 사용하기도 한다.)
퍼셉트론은 층이 하나뿐인 TLU로 구성된다.
- 퍼셉트론을 하나의 TLU를 가진 작은 네트워크를 의마하는 용도로 사용
- 각 TLU는 모든 입력층에 연결되어 있음
- 완전 연결층 : 한 층에 있는 모든 뉴런이 이전 층의 모든 뉴런과 연결되어 있는 경우
- 퍼셉트론의 입력은 입력 뉴런이라 불리는 특별한 통과 뉴런에 주입된다.
- 입력층은 모두 입력 뉴런으로 구성된다.
- 샘플을 3개의 다른 이진 클래스로 동시에 분류 할 수 있는 다중 레이블 분류기 이다.
- 아래의 식으로 한번에 여러 샘플에 대해 인공 뉴런 층의 출력을 효율적으로 계산할 수 있다.
퍼셉트론의 훈련
퍼셉트론의 학습 알고리즘은 헤브의 규칙(Hebb's rule)로 부터 영감을 받았다.
=>뉴런이 다른 뉴런을 활성화시킬 때 이 두 뉴런의 연결이 강해진다고 주장
즉, 두 뉴런이 동일한 출력을 낼 때마다 이 둘 사이의 연결 가중치가 증가하며 이러한 규칙을 헤브의 규칙 또는 헤브 학습(Hebbian Learning)이라고 한다.
퍼셉트론은 네트워크가 만드는 에러를 반영하도록 학습되며 잘못된 출력을 만드는 연결은 올바른 출력을 만들 수 있도록 가중치를 조정한다.
ex) 하나의 데이터 샘플이 퍼셉트론에 입력되면 각 샘플에 대해 출력(예측)이 만들어지고, 잘못된 예측을 하는 모든 출력 뉴런에 대해 올바른 예측을 만들 수 있도록 아래의 식과 같이 입력에 연결된 가중치를 강화한다.
- w_{i,j} : $i$-번째 입력 뉴런과 $j$-번째 출력 뉴런 사이를 연결하는 가중치
- x_i : 현재 학습 데이터 샘플의 $i$-번째 뉴런의 입력값
- \hat{y}_j : 현재 학습 데이터 샘플의 $j$-번째 출력 뉴런의 출력값
- y_j : 현재 학습 데이터 샘플의 $j$-번째 출력 뉴런의 실제값
- \eta : 학습률, learning rate
퍼셉트론은 정답에 수렴한다는 것을 보였는데 이를 퍼셉트론 수렴 이론이라 한다.
하지만, 출력 뉴런의 decision boundary는 선형이므로 퍼셉트론은 복잡한 패턴 (e.g. 비선형)은 학습하지 못한다.
Scikit-Learn의 Perceptron 클래스
from sklearn.datasets import load_iris
from sklearn.linear_model import Perceptron
iris = load_iris()
X = iris.data[:, (2, 3)] # petal length, width
y = (iris.target == 0).astype(np.int)
per_clf = Perceptron(max_iter=100, random_state=42)
per_clf.fit(X, y)
Perceptron(alpha=0.0001, class_weight=None, eta0=1.0, fit_intercept=True,
max_iter=100, n_iter=None, n_jobs=1, penalty=None, random_state=42,
shuffle=True, tol=None, verbose=0, warm_start=False)
y_pred = per_clf.predict([[2, 0.5]])
print(y_pred)
a = -per_clf.coef_[0][0] / per_clf.coef_[0][1]
b = -per_clf.intercept_ / per_clf.coef_[0][1]
axes = [0, 5, 0, 2]
x0, x1 = np.meshgrid(
np.linspace(axes[0], axes[1], 500).reshape(-1, 1),
np.linspace(axes[2], axes[3], 200).reshape(-1, 1),
)
X_new = np.c_[x0.ravel(), x1.ravel()]
y_predict = per_clf.predict(X_new)
zz = y_predict.reshape(x0.shape)
plt.figure(figsize=(10, 4))
plt.plot(X[y==0, 0], X[y==0, 1], "bs", label="Iris-Setosa 아님")
plt.plot(X[y==1, 0], X[y==1, 1], "yo", label="Iris-Setosa")
plt.plot([axes[0], axes[1]], [a * axes[0] + b, a * axes[1] + b], "k-", linewidth=3)
from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#9898ff', '#fafab0'])
plt.contourf(x0, x1, zz, cmap=custom_cmap)
plt.xlabel("꽃잎 길이", fontsize=14)
plt.ylabel("꽃잎 너비", fontsize=14)
plt.legend(loc="lower right", fontsize=14)
plt.axis(axes)
plt.show()
퍼셉트론의 약점: XOR 문제
선형결합인 퍼셉트론은 배타적 논리합인 XOR 분류 문제를 해결할 수 없다
하지만, 단일 퍼셉트론을 여러개 쌓아 다층 퍼셉트론(MLP, Multi-Layer Perceptron)을 통해 XOR 분류 문제를 해결할 수 있었다.
10.1.4 다층 퍼셉트론과 역전파
다층 퍼셉트론은 아래의 그림과 같이 입력층, 은닉층(hidden layer)이라 부르는 하나 이상의 TLU 층과 마지막으로 출력층(output layer)으로 구성된다.
인공 신경망의 은닉층이 2개 이상일 때, 심층 신경망(DNN, Deep Neural Network)라 하고 이를 학습하여 모델을 만드는 것을 딥러닝(Deep-Learning) 이라고 한다.
하지만,
층이 깊어질 수록 증가하는 가중치 매개변수의 수로 인해 다층 퍼셉트론을 학습시키기에는 오랜 시간이 걸리는 문제가 발생
=>역전파(backpropogation) 알고리즘이 등장하면서 계산량을 획기적으로 줄일 수 있게 되었다.
역전파법
- 각 학습 데이터 샘플을 네트워크에 입력으로 넣어주고 출력층까지 각 층의 뉴런 마다 출력을 계산 =>순전파(forward propagation)
- 네트워크의 마지막 출력층에 대한 결과(예측값)와 실제값과의 차이, 오차(error)를 계산하는데, 손실함수(loss function)를 이용하여 계산한다.
- 이 오차를 역방향으로 흘러 보내면서, 각 출력 뉴런의 오차에 마지막 입력 뉴런이 얼마나 기여했는지 측정한다. 즉, 각 뉴런의 입력값에 대한 손실함수의 편미분, 그래디언트(gradient)을 계산하는 것을 말한다.
- 3번과 같은 방법을 입력층에 도달할 때까지 계속 반복해서 역방향으로 흘러 보낸다.
- 마지막으로, 계산한 그래디언트를 네트워크의 모든 가중치 매개변수에 반영해주는 경사 하강법 단계를 수행한다.
활성화 함수 (activation function)
역전파 알고리즘이 잘 동작하기 위해서 다층 퍼셉트론(MLP)의 구조에 변화를 주었는 데, 그것이 바로 활성화 함수 부분에서 계단 함수를 시그모이드 함수(로지스틱 함수)로 바꿔준 것
- 계단 함수에는 수평선밖에 없기 때문에 계산한 그레디언트가 없다.
- 로지스틱 함수는 어디서든지 0이 아닌 그래디언트가 잘 정의 되어있다.
=> 비선형 활성화 함수가 있는 충분히 큰 심층 신경망은 이론적으로 어떤 연속 함수도 근사가 가능하다.
소프트맥스(softmax) 함수
소프트맥스 함수(softmax function)는 출력층에서 주로 사용하는 활성화 함수이다.
소프트맥스 함수의 특징은 출력값의 총합이 1이 된다는 것이다. 따라서, 각 출력 뉴런에 대한 소프트맥스의 출력값은 각 클래스에 대응하는 추정 확률값으로 볼 수 있다.
10.1.5 회귀를 위한 다층 퍼셉트론
회귀 작업에 사용
- 값 하나를 예측하는데 출력 뉴런이 하나만 필요
=> 뉴런의 출력이 예측된 값
- 다변량회귀에서는 출력 차원마다출력 뉴런이 하나씩 필요하다.
회귀용 다층 퍼셉트론을 만들 때 출력 뉴런에 활성화 함수를 사용하지 않고 어떤 범위의 값도 출력 되도록 한다.
(하지만 출력이 항상 양수여야 한다면 출력층에 ReLU활성화 함수 사용 등 활성화 함수를 사용해 출력값 조절)
손실함수란
- 훈련에서는 전형적으로 평균 제곱 오차
- 이상치가 많다면 평균 절대값 오차 사용
- 두 방법을 조합한 후버 손실 사용 가능
10.1.6 분류를 위한 다층 퍼셉트론
이진 분류
- 이진 분류 문제에서는 로지스틱 활성화 함수를 가진 하나의 출력 뉴런만 필요하다. (출력이 0~1 사이의 실수)
- 양성 클래스에 대한 예측 확률로 해석 가능
- 음성 클래스에 대한 예측 확률은 1에서 양성 클래스 예측 확률 뺀 값이다.
다중 레이블 이진 분류
예) 이메일의 스팸 여부와 긴급한 메일 인지 동시에 예측하는 분류 시스템
- 로지스틱 활성화 함수를 가진 두 출력 뉴런이 필요
첫 번째 뉴런은 스팸일 확률 출력
두 번째 뉴런은 긴급 메일일 확률 출력
- 모델은 어떤 레이블 조합도 출력할 수 있다.
다중분류
- 각 샘플이 3개 이상의 클래스 중 한 클래스에 속할 수 있다면 클래스마다 하나의 출력 뉴런이 필요
- 출력층 소프트맥스 활성화 함수 사용
(소프트 맥스 함수는 모든 예측 확률을 0과 1사이로 만들고 더했을 때 1이 되도록 만든다.)
손실 함수
: 확률 분포를 예측해야 하므로 크로스 엔트로피 손실을 선택하는것이 좋다.
'스터디 > 딥러닝' 카테고리의 다른 글
핸즈온 머신러닝(Hands-On Machine Learning) 18장 - 강화학습(3) (0) | 2021.10.31 |
---|---|
핸즈온 머신러닝(Hands-On Machine Learning) 18장 - 강화학습(2) (0) | 2021.10.30 |
핸즈온 머신러닝(Hands-On Machine Learning) 18장 - 강화학습(1) (0) | 2021.10.28 |
핸즈온 머신러닝(Hands-On Machine Learning) 10장 - 케라스를 사용한 인공 신경망 (2)-1 (0) | 2021.10.27 |
핸즈온 머신러닝 2판 스터디 (딥러닝 파트) (0) | 2021.10.25 |