wiki.hash.kr/index.php/%EC%A0%9C%ED%94%84%EB%A6%AC_%ED%9E%8C%ED%8A%BC
제프리 힌튼 - 해시넷
제프리 힌튼(Geoffrey Hinton) 제프리 힌튼(Geoffrey Hinton)은 인공지능(AI) 분야를 개척한 영국 출신의 인지심리학자이자 컴퓨터 과학자이다. 오류 역전파 법과 딥러닝 연구에 기여하고, 힌튼 다이어그
wiki.hash.kr
힌튼은 하나의 목표변수에 대해 여러 개의 퍼셉트론을 동시에 사용하는 것이 기존의 신경망을 대체할 유일한 방법임을 확신하고 연구했다. 결국 다수의 퍼셉트론을 함께 사용한다면 비선형 문제 또한 해결할 수 있다는 것을 보였다. 병렬로 배치된 두 퍼셉트론에 같은 자료를 입력할 때, 두 퍼셉트론의 출력을 무엇으로 하든 그오차를 다시 원래의 가중치들로 밀어 넣는다. 그리고 이 인풋 값이 들어가는 다음 퍼셉트론이 동일하다. 이럴 경우 신경망은 별로 배우는 것이 없다.
그러나 두 포셉트론을 직렬로 연결해서 한 퍼셉트론의 출력이 다른 퍼셉트론에 입력하게 하면 우리가 원하는 결과가 나온다. 역전파는 단일 퍼셉트론의 한계를 극복하는데 도움을 준다. 역전파를 잘 활용하려면 퍼셉트론의 구조를 조율해야 한다. 이 때 이 퍼셉트론의 오차가 이전과 다르기 때문에 정의하기 어렵다.
이 문제를 해결하려면 한층의 한 가중치가 오차에 기여하는 정도를 그다음 층에 있는 다른 가중치들에 근거해서 계산하는 방법이 필요하다. 역전파가 바로 그렇다.
신경망을 구성하는 단위를 뉴런(node, unit, cell)이라 한다. 인공 신경망의 종류는 다양하지만, 어떤 것이든 다수의 뉴런이 특정한 방식으로 연결되어 있다는 점은 모두 같다. 한 뉴런이 다른 뉴런의 입력되는 구조에서는 입력층과 출력층 사이에 숨겨진 뉴런들이 존재한다. 이런 뉴런들로 이루어진 층을 은닉층(hidden layer)라 한다.
한 층의 뉴런들이 그 다음 층의 모든 뉴런과 연결된 신경망을 완전연결(fully conected) 신경망이라 한다. 신경망의 둘째 층의 뉴런들에 부여된 가중치는 원래의 입력 벡터가 아니라 그 이전 층의 출력에 적용되는 것이다.
오차의 역전파를 줄인 역전파 알고리즘은 신경망의 입력과 출력, 그리고 목표값이 주어졌을 때 특정 가중치의 적절한 변화량을 구하는 알고리즘이다. 순전파 단계에서는 입력이 신경망을 따라 -> 순방향으로 나아가 신경망의 출력이 계산된다. 역전파는 반대의 방향으로 활성화 함수를 약간 더 복잡한 형태로 변경해야한다.
이전에는 treshold를 계단 형식으로 잡았다면 활성화 함수를 비선형 연속 미분가능한 함수를 사용해야한다. 이런 활성화 함수를 사용하는 뉴런은 0~1 사이의 연속값을 출력한다. 시그모이드 함수가 대표적이다. 그 외에 Relu, tanh 등 여러가지가 있다.
S(x) = $\frac{1}{1+\exp^{-x}}$
활성화 함수가 미분 가능해야하는 이유는 한 가중치의 해당 뉴런이 받은 입력에 대한 변화량을 계산할 수 있는 것은 미분가능한 함수를 편미분으로 구한다.
앞서 구현한 XOR 문제를 Keras 모델로 구현
첫층은 뉴런이 10개이고 뉴런당 가중치는 세개(input_dim+1)이다.(10x3) 그 다음 층인 출력층은 뉴런이 하나뿐이고 이 뉴런에 첫 층의 뉴런 10개가 연결된다. 거기에 Dense 층 +1이 있으므로 가중치는 총 11개가 된다.
# XOR 케라스 신경망
import numpy as np
from tensorflow.keras.models import Sequential # 기본 케라스 모형 클래스
from tensorflow.keras.layers import Dense,Activation # Dense - 완전 연결 신경망
from tensorflow.keras.optimizers import SGD # SGD 확률적 경사 하강법 알고리즘 구현
x_train = np.array([[0,0],
[0,1],
[1,0],
[1,1]])
y_train = np.array([[0],
[1],
[1],
[1]])
model = Sequential()
num_neurons = 10
model.add(Dense(num_neurons,input_dim=2))
model.add(Activation('tanh'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.summary()
# Model: "sequential_1"
# _________________________________________________________________
# Layer (type) Output Shape Param #
# =================================================================
# dense_2 (Dense) (None, 10) 30
# _________________________________________________________________
# activation_3 (Activation) (None, 10) 0
# _________________________________________________________________
# dense_3 (Dense) (None, 1) 11
# _________________________________________________________________
# activation_4 (Activation) (None, 1) 0
# =================================================================
# Total params: 41
# Trainable params: 41
# Non-trainable params: 0
# _________________________________________________________________
SGD 경사 하강법
lr은 각 가중치에 대한 오차의 미분을 가중치 갱신에 적용하는 비율로, 학습 속도(learning rate) $\alpha$에 해당한다.
$\alpha$ 값이 커지면 학습이 빨라지지만, 대신 모형이 목표점을 지나쳐서 전역 최소점에서 멀어 질수 있다. 반대로 학습 속도가 작으면 훈련 시간이 길어지고 모형이 극소점에 머무르는 위험도 커진다.
loss의 변수는 손실함수인데 이진 교차 엔트로피 함수 binary_crossentropy를 사용했다. metrics는 도중에 출력할 옵션이다. 이 메서드는 가중치를 무작위로 초기화하며 이 상태의 모형으로 예측을 수행하면 무작위 값을 얻게 된다.
sgd = SGD(lr=0.1)
model.compile(loss='binary_crossentropy',optimizer=sgd,metrics=['accuracy'])
predict
predict는 마지막 층의 출력을 그대로 돌려준다. 훈련 하지 않은 상태이므로 무작위 값이다.
model.predict(x_train)
# array([[0.5 ],
# [0.6596914 ],
# [0.56276333],
# [0.7013184 ]], dtype=float32)
fit 모델 훈련
model.fit(x_train,y_train,epochs=100)
# Epoch 82/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1919 - accuracy: 1.0000
# Epoch 83/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1896 - accuracy: 1.0000
# Epoch 84/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1875 - accuracy: 1.0000
# Epoch 85/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1853 - accuracy: 1.0000
# Epoch 86/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1832 - accuracy: 1.0000
# Epoch 87/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1810 - accuracy: 1.0000
# Epoch 88/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1790 - accuracy: 1.0000
# Epoch 89/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1769 - accuracy: 1.0000
# Epoch 90/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1748 - accuracy: 1.0000
# Epoch 91/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1728 - accuracy: 1.0000
# Epoch 92/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1708 - accuracy: 1.0000
# Epoch 93/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1689 - accuracy: 1.0000
# Epoch 94/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1669 - accuracy: 1.0000
# Epoch 95/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1650 - accuracy: 1.0000
# Epoch 96/100
# 1/1 [==============================] - 0s 4ms/step - loss: 0.1631 - accuracy: 1.0000
# Epoch 97/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1613 - accuracy: 1.0000
# Epoch 98/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1594 - accuracy: 1.0000
# Epoch 99/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1576 - accuracy: 1.0000
# Epoch 100/100
# 1/1 [==============================] - 0s 3ms/step - loss: 0.1558 - accuracy: 1.0000
# Out[32]: <tensorflow.python.keras.callbacks.History at 0x1e51f00e908>
model predict
예측이 정확한 것을 볼 수 있다.
model.predict(x_train)
# Out[33]:
# array([[0.29926434],
# [0.90582585],
# [0.8655339 ],
# [0.9829213 ]], dtype=float32)
model.predict_classes(x_train)
# Out[34]:
# array([[0],
# [1],
# [1],
# [1]])
model save
모델을 keras에서 다시 불러올 수 있게 json 파일로 저장. (신경망 구조만 저장)
저장 후 json 파일을 h5 신경망 구조로 신경망 인스턴스를 저장
import h5py
model_structure = model.to_json() # 케라스에서 다시 불러올 수 있게 json으로 저장
with open("basic_model.json",'w') as json_file:
json_file.write(model_structure)
model.save_weights("basic_weights.h5")
'Deep Learning' 카테고리의 다른 글
Batch Normalization (0) | 2021.03.02 |
---|---|
GAN (Generative Adversarial Networks) (0) | 2021.02.26 |
파이썬의 뉴런 (0) | 2021.02.24 |
[Transformer] Model 정리 (0) | 2021.02.23 |
VAE(Variational autoencoder) 종류 (0) | 2021.02.21 |