※ 김성훈 교수님의 [모두를 위한 딥러닝] 강의 정리
- 참고자료 : Andrew Ng's ML class
1) https://class.coursera.org/ml-003/lecture
2) http://holehouse.org/mlclass/ (note)
1. XOR 알고리즘을 딥러닝으로 풀기 (원리)
- 논리적으로 매우 간단하지만 초창기 Neural Network에 큰 난관이 됨
- 하나의 Neural Network unit으로는 XOR 문제를 풀 수 없음 (수학적 증명)
- 그러나, 여러개의 Neural Network unit으로 XOR 문제 해결이 가능함
- 위의 unit을 하나로 합쳐서 표시하면, 다음과 같음
- 여러개의 logistic regression을 하나의 multinomial classification으로 변환 (행렬 이용)
- 복잡한 네트워크의 weight, bias는 학습이 불가능한 문제가 있었으나, backpropagation으로 해결 가능함
- 여러 개의 노드들이 있어 복잡한 경우에도 동일함
2. Sigmoid (시그모이드)
- Logistic regression 또는 Neural network의 Binary classification 마지막 레이어의 활성함수로 사용
- 시그모이드 함수의 그래프
- 시그모이드 함수의 미분 (뒤에서부터 순서대로 미분해 나가면 됨)
- Back propagation 미분을 위한 'TensorFlow'에서의 구현 방식 확인 (TensorBoard에서 확인 가능)
3. XOR 알고리즘을 딥러닝으로 풀기 (TensorFlow 구현)
(1) XOR 문제를 logistic regression으로 풀기
- 전체 소스코드
import tensorflow as tf |
import numpy as np |
tf.set_random_seed(777) # for reproducibility |
x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32) |
y_data = np.array([[0], [1], [1], [0]], dtype=np.float32) |
X = tf.placeholder(tf.float32, [None, 2]) |
Y = tf.placeholder(tf.float32, [None, 1]) |
W = tf.Variable(tf.random_normal([2, 1]), name="weight") |
b = tf.Variable(tf.random_normal([1]), name="bias") |
# Hypothesis using sigmoid: tf.div(1., 1. + tf.exp(tf.matmul(X, W))) |
hypothesis = tf.sigmoid(tf.matmul(X, W) + b) |
# cost/loss function |
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis)) |
train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost) |
# Accuracy computation |
# True if hypothesis>0.5 else False |
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32) |
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32)) |
# Launch graph |
with tf.Session() as sess: |
# Initialize TensorFlow variables |
sess.run(tf.global_variables_initializer()) |
for step in range(10001): |
_, cost_val, w_val = sess.run( |
[train, cost, W], feed_dict={X: x_data, Y: y_data} |
) |
if step % 100 == 0: |
print(step, cost_val, w_val) |
# Accuracy report |
h, c, a = sess.run( |
[hypothesis, predicted, accuracy], feed_dict={X: x_data, Y: y_data} |
) |
print("\nHypothesis: ", h, "\nCorrect: ", c, "\nAccuracy: ", a) |
- 결과값
Hypothesis: [[ 0.5] |
[ 0.5] |
[ 0.5] |
[ 0.5]] |
Correct: [[ 0.] |
[ 0.] |
[ 0.] |
[ 0.]] |
Accuracy: 0.5 |
(2) XOR 문제를 Neural Net으로 풀기
- 기존의 소스코드와 동일하나 L1, W2, b2 부분 유의
- 상기 부분만 수정하였음에도 정확도가 100%로 향상됨
- 전체 소스코드
import tensorflow as tf |
import numpy as np |
tf.set_random_seed(777) # for reproducibility |
x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32) |
y_data = np.array([[0], [1], [1], [0]], dtype=np.float32) |
X = tf.placeholder(tf.float32, [None, 2]) |
Y = tf.placeholder(tf.float32, [None, 1]) |
W1 = tf.Variable(tf.random_normal([2, 2]), name='weight1') |
b1 = tf.Variable(tf.random_normal([2]), name='bias1') |
layer1 = tf.sigmoid(tf.matmul(X, W1) + b1) |
W2 = tf.Variable(tf.random_normal([2, 1]), name='weight2') |
b2 = tf.Variable(tf.random_normal([1]), name='bias2') |
hypothesis = tf.sigmoid(tf.matmul(layer1, W2) + b2) |
# cost/loss function |
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis)) |
train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost) |
# Accuracy computation |
# True if hypothesis>0.5 else False |
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32) |
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32)) |
# Launch graph |
with tf.Session() as sess: |
# Initialize TensorFlow variables |
sess.run(tf.global_variables_initializer()) |
for step in range(10001): |
_, cost_val = sess.run([train, cost], feed_dict={X: x_data, Y: y_data}) |
if step % 100 == 0: |
print(step, cost_val) |
# Accuracy report |
h, p, a = sess.run( |
[hypothesis, predicted, accuracy], feed_dict={X: x_data, Y: y_data} |
) |
print(f"\nHypothesis:\n{h} \nPredicted:\n{p} \nAccuracy:\n{a}") |
- 결과값
Hypothesis: |
[[0.01338216] |
[0.98166394] |
[0.98809403] |
[0.01135799]] |
Predicted: |
[[0.] |
[1.] |
[1.] |
[0.]] |
Accuracy: |
1.0 |
''' |
(3) XOR 문제를 Wide Neural Net으로 풀기
- Layer의 입력값이 많아지도록 하여, 이미지의 출력값을 증가시킴 -> Hypothesis가 향상됨 (Cost가 줄어듬)
- Wide하거나 Deep하게 학습을 시키는 경우 Cost 값이 대부분 작아짐
- 그러나 너무 잘 맞게 학습되는 경우, Overfitting 현상이 발생 가능함
(4) XOR 문제를 Deep Neural Net으로 풀기
- NN과 동일한 방법으로 단계를 여러번 반복함
'Deep Learning' 카테고리의 다른 글
[머신러닝/딥러닝] Sigmoid << ReLU (0) | 2019.12.30 |
---|---|
[머신러닝/딥러닝] Tensorboard (Neural Net for XOR) (0) | 2019.12.23 |
[머신러닝/딥러닝] Tensor Manipulation (0) | 2019.12.18 |
[머신러닝/딥러닝] MNIST Dataset (0) | 2019.12.18 |
[머신러닝/딥러닝] 딥러닝의 기본 개념 (0) | 2019.12.18 |