z2soo's Blog

인공신경망과 딥러닝 (Neuron network & Deep learning) 본문

Big data & AI/AL&DL

인공신경망과 딥러닝 (Neuron network & Deep learning)

z2soo 2020. 1. 10. 14:41
반응형

목차

  1. Perceptron
  2. 논리회로: AND, OR, XOR
  3. Multi-layer perceptron

1. Perceptron

컴퓨터가 직접 생각하여 결정을 내리도록 만들기 위해 인간의 뇌를 연구하기 시작하였다. 여러 감각으로 통해 습득된 정보가 뇌를 통해 입력된다고 생각하면, 시각, 후각, 청각 등 모든 정보가 동일 비율로 입력되지는 않을 것이다. 시각에 가중치가 있을 수도 있고 후각에 가중치가 있을 수도 있다. 이렇듯 가중치가 추가된 입력 데이터가 뉴런에 전달되면 이 정보와 다른 요소(경험, 지식 등)를 합하여 이를 실행(activation)할지를 결정한다. activation을 결정 하면, 다음 뉴런으로 넘아가는 과정으로 본다. 이 과정이 마치 logistic 과정과 비슷하다고 생각된다. 처음에는 logistic이라고 칭하지 않고, perceptron이라고 칭했다. 

 

  • Biological neuron: (입력데이터 * 가중치) + 기타 요소 : activation을 결정 : 다음 뉴런으로 넘어감
  • Perceptron: ( X * W ) + b 

 

2. 논리회로: AND, OR, XOR

신경망이란?

AI를 만들기 위해 사람 뇌의 구조를 모델링한 것을 의미한다. 최근에서 주목받는 듯 하지만, 1960년대부터 이를 구현하고자 하였다. 프로그램으로 구현하기 이전에 1958년에 perception을 기계로 실제 구현했으며, 뉴욕타임즈에 기사가 실렸다. 이에 따라, 사람들은 조금만 있으면 스스로 말하고, 듣고, 쓰고, 창조가 가능한 프로그램을 만들 수 있을 것이다! 라고 공표하고 생각하게 되었다.

 

AND gate & OR gate

기계를 만들었으니, perceptron으로 기본적인 논리회로를 표현하면 충분히 인공지능을 프로그램으로 만들 수 있겠다고 생각한 것이다. 하지만, 프로그래밍 과정에서 XOR 연산에 대해 문제에 직면하게 된다.

 

  • AND gate: 둘 다 1인 경우에만 1
  • OR gate: 둘 중 하나라도 1인 경우 1
  • XOR gate: 둘 중 하나가 1인 경우에만 1 : 배타적인(exclusive) 논리 연산
# AND/OR에 대한 logistic regression => perceptron 구현
# 진리표를 이용해서 학습할 것 

# 다음은 AND gate: 둘 다 1이여야지 1, 아니면 0

# 모듈 삽입
import tensorflow as tf 

# data set
x_data = [[0,0], 
         [0,1], 
         [1,0], 
         [1,1]] 
y_data = [[0], 
         [0], 
         [0], 
         [1]] 

# X, Y 
X = tf.placeholder(shape=(None,2), dtype=tf.float32) 
Y = tf.placeholder(shape=(None,1), dtype=tf.float32) 

# W, b 
W = tf.Variable(tf.random_normal([2,1]), name='weight') 
b = tf.Variable(tf.random_normal([1]), name='bias') 

# H 
logit = tf.matmul(X,W) + b 
H = tf.sigmoid(logit) 

# cost 
cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logit, labels=Y)) 

# train 
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.1 ) 
train = optimizer.minimize(cost) 

# Session, 초기화 
sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

# 학습 
for step in range(30000): 
    _, cost_val = sess.run([train, cost], feed_dict={X: x_data, 
                                                     Y: y_data}) 
    if step % 3000 == 0: 
        print(f'cost값은:{cost_val}') 

# prediction 
predict = tf.cast(H>0.5, tf.float32) 
sess.run(predict, feed_dict={X:[[0,0]]}) 

# 출력값
# array([[0.]], dtype=float32)

 

OR gate는 위의 y_data의 값을 바꿔주면 된다. (둘 중 하나라도 1이면 1) 

AND gate, OR gate 연산을 해보면 모두 컴퓨터 기본 논리회로가 위와 같이 돌아가고, 가능하다는 것을 확인하였다.

logistic이 구분선을 긋는 것이라고 달리 말할 수 있는데, 진리표를 확인하면 가능함을 확인할 수 있다. 

 

XOR gate

그런데, XOR gate는 진리표를 보면, logistic처럼 구분선을 그어서 나눌 수 없고, 코드로 실행해 보아도 올바른 결과가 나오지 않는다. 아래 진리표를 그래프로 나타낸 것과 코드로 확인해보자. 

# 모듈 삽입
import tensorflow as tf 

# data set
# XOR 연산: 두 값이 다른 경우에만 1
x_data = [[0,0], 
         [0,1], 
         [1,0], 
         [1,1]] 
y_data = [[0], 
         [1], 
         [1], 
         [0]] 

# X, Y 
X = tf.placeholder(shape=(None,2), dtype=tf.float32) 
Y = tf.placeholder(shape=(None,1), dtype=tf.float32) 

# W, b 
W = tf.Variable(tf.random_normal([2,1]), name='weight') 
b = tf.Variable(tf.random_normal([1]), name='bias') 

# H 
logit = tf.matmul(X,W) + b 
H = tf.sigmoid(logit) 

# cost 
cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logit, labels=Y)) 

# train 
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.1 ) 
train = optimizer.minimize(cost) 

# Session, 초기화 
sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

# 학습 
for step in range(30000): 
    _, cost_val = sess.run([train, cost], feed_dict={X: x_data, 
                                                     Y: y_data}) 
    if step % 3000 == 0: 
        print(f'cost값은:{cost_val}') 

# prediction 
predict = tf.cast(H>0.5, tf.float32) 
sess.run(predict, feed_dict={X:[[0,0]]}) 


# 츨력
# array([[1.]], dtype=float32) 
# 00 녛으면 0 나와야 되는데  
# 1이 나옴: logistic으로 xor gate 구현 불가

 

perceptron으로 AND/OR는 구현이 가능하다. 즉, 학습이 가능하다. 하지만, XOR(exclusive)는 perceptron으로 구현이 불가능하다. 즉, 학습이 불가능하다. 모든 회로를 perceptron으로 만들 수 있으면 이를 모아서 칩을 만들면 되는데,  XOR 때문에 제동이 걸리게 되었다. 그 후, 많은 사람들이 XOR을 어떻게 perceptron으로 구현할 수있을지에 대해 매달리게 되었다. 그래야 각 논리회로를 학습이 가능한 perceptron으로 구현해야지 학습이 가능한 인공 신경망을 만들 수 있기 때문이다. 

 

3. Multi-layer perceptron

1969년, 마빈 민스키(Marvin Lee Minsky, MIT AI 연구실 창시자)라는 사람이 XOR는 한 개의 preceptron으로 학습이 불가능하다고 수학적으로 증명하여 논문을 발표한다. 단일이 아닌, 다중계층 MLP(Multi Layer Perceptron)으로는 (학습이) 가능하지만, MLP는 학습이 너무 어려워서 지구상에 있는 누구라도 이 학습을 시킬 수가 없고 불가능하다고 주장한 것이다. 이를 계기로 70년대에 AI가 침체기에 빠지게 된다.

1974년도 Paul 이라는박사과정 학생이 Backpropagation이라는 방법을 고안해지만, 이미 AI에 대한 사람들의 관심은 식은 상태였고, 1982년도 다시 논문 발표하면서 민스키 교수 찾아갔지만 교수 또한 AI에 대한 연구를 접은 상태였다. 그렇게 잊혀지는가 싶더니, 1986년도 Hinton 교수가 backpropagation에 살을 붙여서 논문 발표하면서 사람들의 관심이 돌아오고, AI 분야 또한 연구가 활발해지기 시작한다. 

1995년 쯤에는 Backpropagation방식이 전혀 안되는 것은 아니지만, 복잡한 문제는 역시 안된다는 것을 인식한다. 이 시기에 다른 여러 알고리즘들이 나오기 시작한다. (SVM, 나이브베이지언,Decison Tree 등 )  LeCUN 을 비롯하여 다른 알고리즘이 더 우수하다는 것이 증명되면서 AI 분야는 다시 침체기에 빠지게 된다. 

캐나다에 설립된 국책연구기관, Canadian Institute for advanced research (CIFAR) 이 돈이 안되는 분야라 하더라도 미래를 위한 연구에 지원을 해주기 시작한다. 이에, Hinton 교수가 1978년에 캐나다로 넘어가서 AI 연구를 지속한다.  
2006, 2007년도에 2개의 논문을 발표하는데, 망했던 이유( backpropagation이 안됬던 이유 )를 찾아서 수학적으로 증명한 것이다. 

 

  • 2006년도: w, b의 초기 값을 random으로 주면 안된다고 주장, 값을 잘 주면 학습할 수 있다고 주장
  • 2007년도: 초기값에 대한 증명에 대한 논문, layer를 더 많이 사용할 수록 복잡한 문제를 해결할 수 있다 주장

즉, 여러개의 logistic을 모아 네트워크를 구성하여 학습하는 것이 다중계층, multi-layer 학습방식이다. 코드만 적으면 아래와 같고, 과정에 대한 상세한 설명은 따로 정리하도록 하겠다. 

# 위에서 다룬 XOR: 1개자리 logistic
# 총 3개로 이루어지는 것을 표현할 것 

# data set
x_data = [[0,0], 
         [0,1], 
         [1,0], 
         [1,1]] 
y_data = [[0], 
         [1], 
         [1], 
         [0]] 

# X, Y 
X = tf.placeholder(shape=(None,2), dtype=tf.float32) 
Y = tf.placeholder(shape=(None,1), dtype=tf.float32) 

# W, b 
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') 

# H 
logit = tf.matmul(layer1,W2) + b2 
H = tf.sigmoid(logit) 

# cost 
cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logit, labels=Y)) 

# train 
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.1 ) 
train = optimizer.minimize(cost) 

# Session, 초기화 
sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

# 학습 
for step in range(30000): 
    _, cost_val = sess.run([train, cost], feed_dict={X: x_data, 
                                                     Y: y_data}) 
    if step % 3000 == 0: 
        print(f'cost값은:{cost_val}') 

# prediction 
predict = tf.cast(H>0.5, tf.float32) 
sess.run(predict, feed_dict={X:[[0,0]]})

# 출력
# array([[0.]], dtype=float32)

 

이처럼, 다중계층을 통해서 XOR에 대한 논리회로 또한 구성이 가능해졌다. 하지만 많은 사람들은 이미 AI에 대해 부정적인 이미지가 각인이 되어있었고, 일종의 신분세탁을 위해 re-branding을 통해 탄생한 것이 deep learning이다. deep learning에 대한 역사는 길지 않은 듯 하지만, 사실상 이전부터 존재해왔던 neuron network, 인공 신경망과 동일 선상에 위치한 개념이다. 

 

최근 들어서는 AI를 기반으로 한 서비스가 이제 많이 제공되고 있다. 가장 기본적인 것이 바로 개인 취향에 맞춤 서비스를 추천하는 넷플렉스와 같은 서비스가 있으며, 앞으로 이러한 deep learning, predict를 이용하여 어떠한 서비스가 가능한지에 대해 생각하는 것이 중요해질 것이다. 

 

보다 쉽게 정리한 다른 블로그 주소들

반응형

'Big data & AI > AL&DL' 카테고리의 다른 글

Web Crawling Keyword 용어  (0) 2022.04.07
Deep learning 예제: CNN 활용 과정 2  (0) 2020.01.15
Deep learning : XOR gate  (0) 2020.01.13
Comments