NLP_자연언어처리, Colab

[자연언어처리] 다층 퍼셉트론

vhxpffltm 2019. 7. 9. 22:52
반응형

자연언어처리를 공부하면서 머신러닝/딥러닝 실습환경으로 Tensorflow, Anaconda, 파이썬을 사용하였다.

 

이곳에 공부한 내용을 간단하게 정리하고자 한다. 

 

자세한 내용과 공부는 이곳을 참고하자. https://hunkim.github.io/ml/

 

퍼셉트론

 

이와 같은 구조로 이루어지며, W는 입력 X에 대해 곱해지는 가중치이다. 이 입력 X와 가중치 W의 값을 곱한 값들을 모두 더하여 하나의 값으로 만든 후. 특정 임계값과 비교를 하여 임계값 보다 크면 1, 아니면 -1로 출력하는 함수를 정의할 것이다. 이 함수를 활성 함수(Activation function) 라고 한다.

 

그럼 다층 퍼셉트론이란, 이 중간층, 즉 뉴런이 다수로 구성되어 있는 구조를 다층 퍼셉트론이라 한다.

 

퍼셉트론에서 결과값을 만드는 것이 활성화 함수인데, 단층 퍼셉트론에서는 이 활성화 함수가 1개밖에 없다. 이로 인해, 인공신경망인 단층 퍼셉트론은 비선형적으로 분리되는 데이터에 대해 제대로 된 학습이 불가능하다. 그 예로 XOR연산에 대해 학습이 불가능하여 다층 퍼셉트론으로 해결할 수 있다.

 

 

입력층과 출력층 사이에 존재하는 층을 은닉층이라 하며 숨어있는 층이다. 이 은닉층이 있는 인공 신경망을 심층 신경망이라 부르며, 심층 신경망을 학습하기 위해 고안된 특별한 알고리즘들을 딥러닝이라한다.

 

원래 다층 퍼셉트론에서 입력층에 전달되는 값이 은닉층의 모든 노드로 전달되며 은닉층의 모든 노드의 출력값 역시 출력층의 모든 노드로 전달된다, 이를 순전파라 한다.

 

아래는 다층 퍼셉트론의 동작이다.

  각 층에서 가중치(W)를 임의의 값으로 설정하고,

  하나의 트레이닝 데이터에 대해 각 층에서 순입력 함수값을 계산하고 최종적으로 활성함수에 의한 출력값 계산

  출력층의 활성 함수에 의한 결과값과 실제값이 허용 오차 이내가 되도록 각층의 가중치를 갱신

  모든 트레이닝 데이터에 대해 출력층의 활성 함수에 의한 결과값과 실제값이 허용 오차 이내가 되면 종료

 

다층 퍼셉트론에서 은닉층의 출력값에 대한 기준값은 역전파(Backpropagation)으로 은닉층에서 발생하는 오차값에 따라 은닉층의 가중치를 업데이트 한다.

 

아래에 코드가 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import tensorflow as tf
import numpy as np
 
 
tf.set_random_seed(777)  # for reproducibility
 
#데이터의 정의
x_data = np.array([[00], [01], [10], [11]], dtype=np.float32)
y_data = np.array([[0], [1], [1], [0]], dtype=np.float32)
 
= tf.placeholder(tf.float32, [None, 2])
= tf.placeholder(tf.float32, [None, 1])
 
# Hidden layer로의 가중치와 편향, 그 크기는 4*2
= tf.Variable(tf.random_normal([24]))
= tf.Variable(tf.random_normal([4]))
 
# Hidden layer로의 가중치와 편향, 그 크기는 2*1
W2 = tf.Variable(tf.random_normal([42]))
b2 = tf.Variable(tf.random_normal([2]))
 
# 출력 layer로의 가중치와 편향
W3 = tf.Variable(tf.random_normal([21]))
b3 = tf.Variable(tf.random_normal([1]))
 
# 각 층들 정의, 이전 층에서 들어오는 입력과 현재 층의 가중치, 편향을 사용
# Sigmoid함수로 활성화
layer1 = tf.sigmoid(tf.matmul(X, W) + b)
layer2 = tf.sigmoid(tf.matmul(layer1, W2) + b2)
hypothesis = tf.sigmoid(tf.matmul(layer2, W3) + b)
 
# cost/loss function
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))
# 경사 하강법을 이용한 학습
 
# 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
 
    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#100번 반복마다 현재 손실함수 출력
            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)
ht
 

 

 

반응형

'NLP_자연언어처리, Colab' 카테고리의 다른 글

[Colab] Histogram 코드  (0) 2020.04.07
[NLP] Word2Vec : CBOW, Skip-gram  (0) 2019.08.30
[NLP]의사 결정 트리  (0) 2019.08.25
[NLP]합성곱 신경망_CNN : CIFAR-10  (0) 2019.08.05
[NLP]MNIST 문자 인식  (0) 2019.07.22