[모두를 위한 딥러닝 시즌2][Lab 9] Neural Nets for XOR
Neural Nets으로 어떻게 XOR문제를 해결할 수 있는지 알아보자.
+와 -를 정확하게 구분할 수 있는 직선을 찾을 수 없었다.
이 XOR 문제를 3개의 network으로 풀어보자.
이렇게 하면 우리가 원하는 XOR 답이 나온다.
Forward propagation
두 개의 유닛에 x1, x2가 각각 들어가고 나온 결과의 sigmoid 값이 마지막 유닛에 들어가서 최종 결과가 나오는 하나의 Neural nets
programing 상에서 network을 구현
K = tf.sigmoid(tf.matmul(X, W1) + b1)
hypothesis = tf.sigmoid(tf.matmul(K, W2) + b2)
이제 training data로 부터 weight와 bios 값을 어떻게 학습하는지 알아보자.
Neural Nets에서는 입력값에 따라 출력값이 어떻게 변화하는지 알아내는 것이 수학적으로 굉장히 어렵다.
그래서 탄생한 것이 Backpropagation 알고리즘이다.
Backpropagation
예측한 값과 실제 값을 비교했을 때 나오는 오류를 뒤에서부터 앞으로 돌려서 어떤 값을 어떻게 조정할지 알아낸다.
w, x가 g에 미치는 영향, b가 f에 미치는 영향이 각각 미분 값으로 나온다.
아래와 같이 chain rule을 이용해 최종 입력값에서 최종 줄력값까지의 미분 값을 구할 수 있다.
#cost function
cost = -tf.reduce_mean(Y*tf.log(hypothesis) + (1-Y)*tf.log(1-hypothesis))
이런 Neural Net을 다음과 같은 Tensorflow Code로 나타낼 수 있다.
def neural_net(features):
layer1 = tf.sigmoid(tf.matmul(features, W1) + b1)
layer2 = tf.sigmoid(tf.matmul(features, W2) + b2)
hypothesis = tf.sigmoid(tf.matmul(tf.concat([layer1, layer2], -1), W3) + b3)
return hypothesis
Tensorboard
데이터를 갖고 모델을 만드는 과정에서 weight, bios 또는 loss 값 등을 시각화해주는 도구
먼저 Tensorboard를 사용하기 위해서 Tensorboard를 설치해주어야 한다.
[Eager Execution]
writer = tf.contrib.summary.FileWriter("./logs/xor_logs")
with tf.contrib.summary.record_summaries_every_n_global_steps(1):
tf.contrib.summary.scalar('loss', cost)
[Keras]
tb_hisr = tf.keras.callbacks.TensorBoard(log_dir="./logs/xor_logs", histogram_freq=0, write_graph=True, write_images=True)
model.fit(x_data, y_data, epochs=5000, callbacks=[tb_hist])
Tensorflow에서 제공하는 Tensorboard를 통해서 매 학습마다 loss 값과 각종 모델 값들을 확인할 수 있다.