이 내용을 학습하기 전에는 Hyperplane, 초평면에 대한 개념이 필요하다.
Maximal Margin Classifier는 각 관찰값들을 선형 경계로 구분하는 방법으로, 직관적으로 이해하고 설명하기 쉽다. 하지만 비선형 형태의 데이터에 대해서 적용할 수 없다는 단점이 있다.
Maximal Margin Classifier가 선형 경계로 사용하는 선을 초평면(Hyperplane)이라고 하는데, 데이터가 n차원이라면 초평면은 n-1차원을 가진다.
x1 (hours) | x2 (attendance) | y (grade) |
10 | 5 | A |
9 | 5 | A |
3 | 2 | B |
2 | 4 | B |
11 | 1 | C |
위와 같은 데이터가 있다고 하자. x1는 공부한 시간, x2는 참여도, y는 학점이다.
이를 그래프로 나타내면 다음과 같이 나타낼 수 있다.
이 데이터를 multinomial classification에 사용하고 싶다.
이는 hyperplane을 통해 가능하며, binary classification의 연장선상에서 이해할 수 있다.
위 그림과 같이 A or not, B or not, C or not만 구분해주는 3개의 각각 다른 binary classification으로 multinomial classification이 가능하다.
즉, X -> [W] -> z -> [Sigmoid] -> y^hat 과정을 각각 3번 거쳐야 한다.
이 과정을 세번 반복하는 것이 복잡하므로 아래와 같이 행렬의 특수성을 이용하여 한 번에 계산할 수 있다.
이 행렬 계산을 통해 나온 y^hat 값은 실수 값이다.
이 실수값에 sigmoid를 적용하면 0~1사이의 값으로 총합이 1인 확률값을 구할 수 있다.
sigmoid 함수가 적용된 확률값에 softmax 함수를 적용하면 가장 확률이 높은 값을 결과로 지정할 수 있다.
위 사진의 p가 sigmoid 함수가 적용된 확률 값이며,
softmax 함수를 사용하면 가장 확률이 높은 A가 y^hat으로 결정된다.
이는 'ONE-HOT Encoding'이라는 기법을 사용한 결과이다.
실제 값 L, Softmax를 통한 예측값 S(Y) = y^hat의 차이를 cross-entropy를 통해 구할 수 있다.
아래처럼 L= [0,1], S(Y) = [0,1]일 경우에 cost function의 값은 0,
L = [0,1], S(Y) = [1,0]일 경우에 cost function의 값은 무한대로 수렴함으로써
실제 값과 차이가 있을 때 cost 값이 커지는 것을 구현할 수 있다.
이 cost function은 logistic classification의 cost function과 비교했을 때 어떤 의미를 가질까?
위 식이 logistic classification의 cost function이다.
두 식은 같은 의미를 가진다고 볼 수 있다.
logistic classification은 y가 1일 경우 식의 앞부분만 유효하고, y가 0일 경우 식의 뒷부분만 유효하다.
multinomial classification의 경우에도 L 행렬 안의 원소 값이 1일 경우에만 -log(y^hat)과의 곱이 유효하기 때문에, 시
그마이지만 실질적으로 해당 원소에 대해서만 한 번 실행된다고 볼 수 있다.
즉, Loss를 구하는 함수는 위와 같다.
처음에 학습한 Wx+b의 값에 sigmoid를 적용하고, softmax 함수를 이용하여 one-hot encoding을 완성하여 y의 예측값을 구한다.
그 예측값과 실제값의 차이를 구하기 위해 cross-entropy 함수를 사용한다.
다음은 이를 실습한 코드이다.
import tensorflow as ts
x_data = [[1,2,1,1], [2,1,3,2], [3,1,3,4], [4,1,5,5],
[1,7,5,5], [1,2,5,6], [1,6,6,6], [1,7,7,7]]
y_data = [[0,0,1], [0,0,1], [0,0,1], [0,1,0],
[0,1,0], [0,1,0], [1,0,0], [1,0,0]]
X = tf.placeholder("float", [None,4])
Y = tf.placeholder("float", [None,3])
nb_classes = 3
W = tf.Variable(tf.random_normal([4, nb_classes]), name='weight')
b = tf.Variable(tf.random_normal([nb_classes]), name='bias')
hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
with tf.Session() as sess :
sess.run(tf.global_variable_initializer())
for step in range(2001):
sess.run(optimizer, feed_dict = {X: x_data, Y: y_data})
if step % 200 == 0 :
print(step, sess.run(cost, feed_dict = {X: x_data, Y: y_data}))
결과는 다음과 같다.
0 4.2407703
200 0.54217076
400 0.4525927
600 0.37871224
800 0.3076113
1000 0.24364208
1200 0.2200003
1400 0.20081681
1600 0.18458787
1800 0.17068842
2000 0.1586597
점점 cost function의 값이 줄어드는 것을 확인할 수 있다.
'Deep Learning' 카테고리의 다른 글
딥러닝의 기본 개념, 역사 (0) | 2019.04.22 |
---|---|
ML의 실용과 몇가지 팁 (0) | 2019.04.21 |
Logistic Classification의 HCG (0) | 2019.04.21 |
TensorFlow로 파일에서 데이터 읽어오기 (0) | 2019.04.21 |
여러 feature의 linear regression (0) | 2019.04.15 |