TigerCow.Door


안녕하세요. 문범우입니다.

지난 포스팅에서 CNN에 대해서 알아보았습니다.

이번 포스팅에서는 이어서, CNN에서의 pooling과 나머지 것들에 대해서 알아보도록 하겠습니다.


1. Pooling



Convolution Neural Network의 전체적인 구조를 위의 그림과 같이 확인해보면, Convolution과 RELU가 붙어져 있으며 중간에 한번씩 POOL을 하게 됩니다.


이때 진행되는 POOL이라는 것이 무엇인가 알아보도록 하겠습니다.


pooling이라는 것을 먼저 간단히 생각해본다면, sampling이라고 생각하면 됩니다.

우리가 입력 이미지에 대해서 위의 그림과 같이 convolution layer를 만드는데, 여기서 하나의 layer만 뽑아내고 이를 resize하는 과정을 pooling이라고 합니다.

복잡한 것이 아니고, 하나의 예를 들어서 pooling을 진행해보도록 하겠습니다.


pooling에서도 많이 사용되는 max pooling은 아래 사진과 같이 진행됩니다.


pooling에서는 우리가 지난 포스팅에서 알아보았던 filter라는 개념이 다시 사용되는데, 위의 사진과 같이, 2x2 형태의 필터를 이용하며, 이때 stride는 2로 설정하였습니다.

그럼 필터에서 어떠한 값을 어떻게 추출할 것인지가 문제가 됩니다.

이때 위에서 말했듯, max pooling을 사용하면 그림의 오른쪽과 같이 나오게 됩니다.


이런식으로 처리하는 것이 pooling입니다.



2. Others



정리를 해보자면, 지난 포스팅에서 배운 Convolution 을 통해 나온 벡터 값을 RELU 함수에 입력하고, 그 과정 중간에 위에서 배운 pooling과정을 진행하여 resize하는 방법을 진행합니다. 물론 layer를 어떻게 설정하느냐는 모델을 만드는 여러분의 몫입니다.

그리고 마지막 과정에서 보통 pooling을 진행하는데, 예를 들어 pooling을 통해 3x3x10의 형태로 결과가 나왔다면 이것을 x 값으로 하여 일반적인 Neural network를 구성하면 됩니다.

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc


안녕하세요. 문범우입니다.

이번 포스팅에서는 dropout과 model ensemble에 대해서 살펴보도록 하겠습니다.



1. Dropout


우리가 dropout을 하는 이유는 바로 아래와 같은 overfitting 때문입니다.



우리가 과거에 알아봤던 것처럼, 훈련 data에 있어서는 100%의 accuracy를 내지만, 실제로 test data에 있어서는 높은 예측율을 내지 못하게 되는 현상이죠.



위와 같이, 파란색 그래프, training 에서는 에러율이 점점 낮아지지만, 실제로 빨간색 그래프처럼 test data를 통해 확인해보니 어느 시점부터 에러율이 더 증가하게 됩니다.


이러한 overfitting은 우리가 더 깊게 만들수록 일어날 확률이 커집니다.

왜냐하면 더 깊어질수록 더 많은 변수가 생기기 때문입니다.


그럼 이를 해결하기 위해서는 무슨 방법이 있을까요?


첫번째로는, 더 많은 데이터를 훈련시키는 것입니다.

또는 feature를 줄여주는 방법도 있을 것입니다.

그리고 우리가 예전에 간단히 알아봤던, Regularization 이라는 방법이 있습니다.



우리가 예전에 알아봤던 것처럼, 위의 식과 같이 처리함으로써 Regularization을 하는 L2regularization도 있습니다.


그리고 Neural Network에서는 또다른, dropout이라는 방법이 있습니다.

dropout이란 쉽게 말해서, 위 그림에서 왼쪽 그림과 같은 모델에서 몇개의 연결을 끊어서, 즉 몇개의 노드를 죽이고 남은 노드들을 통해서만 훈련을 하는 것입니다.

이때 죽이는, 쉬게하는 노드들을 랜덤하게 선택합니다.




쉽게 말해 각 노드들을 어떤 전문가라고 생각해본다면 랜덤하게 몇명은 쉬게하고 나머지만 일하게 합니다. 

그리고 마지막에는 모든 전문가들을 총 동원해서 예측을 하게 합니다.


이러한 아이디어가 dropout 입니다.


실제로 텐서플로우에서 구현하기에도 어렵지 않게 가능합니다.

우리가 원래 만들었던 layer를 dropout함수에 넣어서, 몇 퍼센트의 노드가 일하게 할 것인지 함께 적어줍니다.

위의 코드를 보면 Train에서는 0.7, 즉 70%의 노드들이 랜덤하게 훈련되게 하였습니다.

그리고 실수하면 안되는 점이 Evaluation 과정에서는 dropout_rate를 1로 함으로써 100%의 노드들을 참가시키도록 해야 합니다.



2. Ensemble



우리가 추후, 학습시킬 수 있는 장비가 많을때 사용할 수 있는 또 하나의 방법도 있습니다.

Ensemble이라고 하는 것인데, 위와 같이 여러개의 독립적인 모델을 만듭니다. 이때 훈련 데이터셋은 별도로 해도 되고, 모두 같은 훈련 데이터셋을 이용해도 상관 없습니다.

이때 각 모델의 초기값이 서로 다르기때문에 결과도 약간씩 다를 것입니다.

그리고 이후에 독립적인 모델들을 모두 합쳐서 한번에 예측을 하게 합니다.

즉, 이것은 전문가 한명에게 어떤 질문을 하는 것이 아니고 서로 독립적인 전문가 다수를 모아두고 질문을 하는 것과 같습니다.


실제로 Ensembel을 이용하면 2%~5%까지도 예측율이 올라간다고 합니다.


블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc


안녕하세요. 문범우입니다.

이번에는 지난 포스팅에 이어서 딥러닝을 잘하는 방법 중 weight의 초기값을 설정하는 방법에 대해서 알아보도록 하겠습니다.



1. RBM(Restricted Belief Machine)


우리가 지난 포스팅에서 위의 그림과 같은 Vanishing gradient 문제에 대해서 알아보았습니다.

그리고 이 문제에 대해서는 Hilton 교수님께서는 4가지 이유를 꼬집었습니다.


위의 4가지 항목중 제일 아래에 있는 것은 우리가 지난 포스팅에서 sigmoid함수 대신, ReLU함수를 사용함으로써 해결할 수 있었습니다.

하지만 하이라이트 된 것과 같이 또 다른 문제도 있었습니다.


이전의 테스트에서도 아래와 같이, 같은 ReLU함수를 사용했음해도 불구하고 cost가 초반에 다르게 변화하는 것을 볼 수 있습니다.


이러한 현상이 발생하는 이유는 우리가 테스트를 할때, 초기값을 랜덤하게 지정해서 발생한 현상입니다.


그럼, 이런 초기값에 대해서 좀 더 자세히 살펴보도록 하겠습니다.

단적으로 초기값을 0으로 설정해보면 어떨까요?

그럼, 위와 같은 그림에서 W를 0으로 둔것이고, 이것이 chain rule에서 사용됩니다. 그럼 x = df/dg * W 이므로 x = 0이 되고, 그 앞에 있는 것들도 모두 0이되면서 gradient가 사라져 버립니다.


따라서, 절대로 초기값으로 0을 주면 안된다는 것을 알 수 있습니다.

그럼 초기값을 어떻게 주어져야 할까요?


이에 대해 2006년 Hilton교수님께서 논문을 쓰시면서 RBM(Restricted Boatman Machine)을 사용함으로써 해결하게 됩니다.

그리고 이러한 RBM을 사용한 네트워크를 DBN(Deep Belief Networks)라고 합니다.


어떻게 동작되는 것 일까요?


먼저, 입력을 재생산 해냅니다.


위의 그림과 같이, 입력값을 weight와 곱해서 b값을 얻어냅니다. 또한 b 유닛아래에 있는 것들에 대해서도 같은 방법을 통해서 값을 얻습니다. 이러한 과정을 Forward 라고 합니다.



그리고, Backward 방법으로, 우리가 얻은 값들과 weight를 통해 위의 그림에서의 b 값을 얻습니다.

그럼 우리가 처음에 입력한 값을 x라고 한다면, x와 b의 값의 차이가 존재할텐데 이 차이가 최소가 될 때까지 weight를 조절합니다.


이렇게 해서 weight를 구하는 것을 RBM이라고 합니다.

그리고 위와 같은 방법을 encoder/decoder라고도 합니다.


실제로 이것을 네트워크 상에서 적용시키기 위해서는 아래와 같은 과정을 가집니다.

여러개의 레이어가 있을때, 입력값 측의 레이어부터 시작하여 layer 1과 layer 2를 encoder/decoder를 수행하고, 이후에 layer2 와 layer3에 대해 수행하며 끝까지 나아가는 방법입니다.


이제 이러한 과정을 통해 각 weight를 구할 수 있고, 그것을 학습시킨다, training한다는 표현보다는 fine tunning 이라는 표현을 사용합니다.

학습하는 것보다 훨씬 더 빨리 진행되는 작업이기 때문이죠.

이러한 fine tunning이 끝나게 되면 이후 우리가 학습시키고자 하는 데이터들에 대해서 label을 붙여서 실제로 training을 진행합니다.



2. Xavier initalize




그런데 실제로 이것을 구현하는데 있어서는 복잡한 과정이 있을 수 있습니다.

하지만 좋은 소식은, 2010년에 발표된 논문에서 우리가 굳이 RBM을 쓰지 않아도, 좋은 초기값을 얻을 수 있다는 Xavier initialize라는 알고리즘이 나왔습니다.


이는 입력의 노드의 개수에 비례해서 초기값을 세팅하면 된다는 식의 알고리즘 입니다.


이를 식으로 간단히 살펴보면, 우리가 좋은 값, 좋은 weight를 얻기 위해서 입력값의 개수 fan_in 과 출력 값의 개수 fan_out을 이용하여 초기값을 주는 것입니다. 이러한 식을 통해 어쩌면 RBM보다 더 좋은 결과를 가질 수 있다고 합니다.


블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc


안녕하세요. 문범우입니다.

오늘은 ReLU(Rectified Linear Unit)에 대해서 알아보겠습니다.



1. NN for XOR


우리가 지난 시간에 XOR문제를 위와 같은 모델로 하여 풀이를 진행해보았습니다.

실제로 텐서플로우를 이용하여 구현해보기도 하였습니다.

그때 각 유닛의 결과에 우리가 Sigmoid 함수를 붙여서 결과값이 0~1이내로 출력되게 했었습니다.



이러한 Sigmoid함수를 activation function 이라고 합니다.

각 모델들에게 어떤 값을 보내게 될 때 일정값 이상이면 active되게 하고 그렇지 않으면 active하지 않게 하기 때문에 주로 그렇게 불린다고 합니다.


그리고 우리는 아래와 같이 각각의 W, b를 만들고 layer를 이용하여 2단의 네트워크를 만들었습니다.


그럼 3단을 가진 네트워크는 어떻게 할까요?

당연히 2단때와 같이, 쉽게 구현할 수 있습니다.

이때, 제일 처음이 layer를 input layer라고 부르며, 가장 바깥쪽(마지막)에 있는 layer를 output layer라고 부릅니다. 그리고 그 사이에 있는 layer들을 hidden layer라고 합니다.


그럼 더 깊게 한번 만들어볼까요?

hidden layer가 9단이 되게끔 구현해보도록 하겠습니다.


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
W0 = tf.Variable(tf.random_uniform([2,5], -1.01.0), name = 'weight0')
 
W1 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight1')
W2 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight2')
W3 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight3')
W4 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight4')
W5 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight5')
W6 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight6')
W7 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight7')
W8 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight8')
W9 = tf.Variable(tf.random_uniform([5,5], -1.01.0), name = 'weight9')
 
W10 = tf.Variable(tf.random_uniform([5,1], -1.01.0), name = 'weight10')
 
b0 = tf.Variable(tf.zeros([5]), name = 'bias0')
 
b1 = tf.Variable(tf.zeros([5]), name = 'bias1')
b2 = tf.Variable(tf.zeros([5]), name = 'bias2')
b3 = tf.Variable(tf.zeros([5]), name = 'bias3')
b4 = tf.Variable(tf.zeros([5]), name = 'bias4')
b5 = tf.Variable(tf.zeros([5]), name = 'bias5')
b6 = tf.Variable(tf.zeros([5]), name = 'bias6')
b7 = tf.Variable(tf.zeros([5]), name = 'bias7')
b8 = tf.Variable(tf.zeros([5]), name = 'bias8')
b9 = tf.Variable(tf.zeros([5]), name = 'bias9')
 
b10 = tf.Variable(tf.zeros([5]), name = 'bias10')
 
L1 = tf.sigmoid(tf.matmul(X, W0) + b0)
L2 = tf.sigmoid(tf.matmul(L1, W1) + b1)
L3 = tf.sigmoid(tf.matmul(L2, W2) + b2)
L4 = tf.sigmoid(tf.matmul(L3, W3) + b3)
L5 = tf.sigmoid(tf.matmul(L4, W4) + b4)
L6 = tf.sigmoid(tf.matmul(L5, W5) + b5)
L7 = tf.sigmoid(tf.matmul(L6, W6) + b6)
L8 = tf.sigmoid(tf.matmul(L7, W7) + b7)
L9 = tf.sigmoid(tf.matmul(L8, W8) + b8)
L10 = tf.sigmoid(tf.matmul(L9, W9) + b9)
 
hypothesis = tf.sigmoid(tf.matmul(L10, W10) + b10)
cs


위와 같이 hidden layer가 총 9단이 되도록 구현해보았습니다.

그리고 텐서보드를 이용하기 위해서는 추가적으로 name_scope를 사용하면 됩니다.


그리고 이러한 모델을 실제로 훈련시키고 결과를 확인해보면 다음과 같습니다.

Accuracy 가 0.5가 나왔습니다.

왜그럴까요?

우리가 지난번에 했을때보다 더 깊고, 더 넓게 훈련을 시켰는데 오히려 더 좋지 않은 결과가 나와버렸습니다.



2. Vanishing Gradient


우리가 지난 시간에 알아본, backpropagation에 대해서 다시한번 살펴보도록 하겠습니다.


우리가 위와 같은 구조를 공부했었는데, 이때 backpropagation에서 chain rule을 사용한다고 했었습니다.

지난 포스트에서 알아본것에 따르면, 빨간 동그라미, dg/dx = y의 값을 갖게되고 이에 따라 df/dx = df/dg * dg/dx = df/dg * y 가 됩니다.

근데 이때 y가 어떤 값을 가질지 한번 살펴볼까요?

y가 input layer가 아니었다면, 다른 유닛에 통과하고 sigmoid 함수를 통과했을 것입니다. 그럼 우리가 정확한 y의 값을 알지는 못해도 sigmoid 함수의 특성때문에 0~1사이의 값을 갖는다고 생각할 수 있습니다.

그럼 이때 y의 값이 예를 들어 0.01정도라고 생각해보겠습니다.

이렇게 된다면, 다시 올라가서 df/dx = df/dg * 0.01 이 됩니다.


이렇게 되는 것의 단점이 무엇이냐면, 결국에 값들이 sigmoid 함수를 지나게 되면서 그 값이 1보다 작게 되며 경우에 따라서는 굉장히 0에 가까운 값들이 계속 곱해지게 됩니다.

그러면 결국적으로 굉장히 작은 값을 갖게 됩니다.


즉, 그렇게 되면 결과 단에서 점점 깊어질 수록 그 영향을 찾기 힘들다, 예측하기 힘들다라는 결론을 가져오게 됩니다.

이런 현상을 Vanishing gradient 라고 합니다.



3. Rectified Linear Unit, ReLU


그리고 Hilton 교수님은, 이러한 현상에 있어서 sigmoid가 잘못되었다라는 것을 찾게되었습니다.

sigmoid함수 때문에 1보다 큰 값을 가지지 못하게 되었고, 이로 인해 layer가 깊어지면서 오히려 그 값이 작아져 영향을 찾기 힘들어지기 때문입니다.

그리고 새롭게 생각한 함수가 ReLu, Rectified Linear Unit 입니다


ReLU 함수는 단순합니다. 입력값이 0보다 작을 때는 아예 non-activate로 꺼버리고, 0보다 클때에는 그 값을 그대로 반환합니다.


이러한 ReLU를 사용하는 방법도 매우 간단합니다.

단순히 우리가 sigmoid를 사용하던 곳에 대신 ReLU를 사용하면 됩니다.

물론 텐서플로우에서도 위와 같이 매우 간단하게 사용할 수 있습니다.


실제로 우리가 위에서 제대로 값을 얻지못한 9단 hidden layer를 가진 모델에서 sigmoid 대신 ReLU를 사용하면 다음과 같은 cost를 가지게 됩니다.


ReLU를 여러번 돌리면서 약간의 차이는 존재하지만, sigmoid에 비해서는 훨씬 더 올바른 학습을 가지는 것을 볼 수 있습니다.

물론, layer에서 제일 마지막에선 sigmoid함수를 사용하여 결과 값이 0~1 사이로 나오게끔 해야합니다.


오늘 우리가 알아본 ReLU 이외에도 아래와 같이 다양한 activation function이 있습니다.



블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc


안녕하세요. 

이번 포스팅에서는 지난 포스팅에 이어 Softmax classifier의 cost 함수에 대해서 알아보도록 하겠습니다.


1. Softmax classifier



우리가 지난 포스팅에서 학습한바와 같이, 위의 사진에서 오른쪽에 x 표가 되어있는 것보다는 제일좌측에 있는 하나의 행렬을 곱함으로써 하나의 벡터로써 결과가 나오게 됩니다.



즉 위와 같이 간단하게 생각해볼 수 있고, 빨간색 글씨 처럼 위에서 부터 a, b, c가 될 확률로 볼 수 있습니다.

그런데 빨간색으로 나와있는 숫자보다, 우측 알파벳 옆에 쓰인 검정색 글씨 처럼 각각이 0과 1사이의 값을 갖고 세개의 합이 1이되게 한다면, 우리는 각각의 값을 확률처럼 이용할 수 있게 됩니다.

확률처럼 이용할 수 있다는 것은 추후 우리가 분류를 할때 더 편하게 사용할 수 있기 때문에 우리는 각각의 값이 0~1사이의 값을 가지고 그들의 합이 1이 되도록 하려고 합니다.

그리고 그러한 것을 해주는 것이 바로 Softmax 입니다.



위와 같은 구조를 같는 Softmax 함수를 통해 각각의 값을 확률로써 볼 수 있습니다.



그리고 위의 사진처럼, 각각의 확률 값을 보면서 제일 큰 값을 1로 만들고 나머지를 0으로 만드는 One-Hot Encoding을 이용합니다. 이는 텐서플로우에서 max 등의 함수를 이용하면 쉽게 구현할 수 있습니다.


이렇게 해서 Hypothesis를 완성했으면 이제 Cost 함수를 만들어야 합니다.

그리고 그 후에 cost 값을 최소화 하면 됩니다.

먼저, Cost 함수를 살펴보겠습니다.



그림에서와 같이, 좌측에 있는 값이 Y hat으로써 우리가 Hypothesis를 통해 얻은 값이며 오른쪽의 값이 실제 Y의 값입니다.

그럼 왜 위와 같은 Cost함수가 나오는지 살펴보겠습니다.



위와 같이, 실제 값 L 이 [ 0 1 ]로 존재할때, 우리가 Y hat 값으로 [ 0 1 ]과 [ 1 0 ]일 때 위에서 세운 Cost 함수로 cost를 계산해보면 올바르게 예측한 [ 0 1 ] 에서는 cost 값이 0이 나오고 틀리게 예측한 [ 1 0 ] 에서는 cost 값이 무한대가 되게 됩니다.

따라서 우리가 세운 Cost 함수가 올바른 것을 알 수 있습니다.



그런데 이러한 Cost 함수는 우리가 지난 포스팅에서 알아보았던 Logistic cost 함수와 동일합니다.

식을 보았을 때는 매우 다르게 보이는데 어떻게 같은건지, 다음 포스팅에서 확인해보도록 하겠습니다.



그럼 마지막으로 cost를 최소화 하기위한 작업을 해야합니다.



지난 포스팅들에서 했던 것처럼 Gradient descent 를 이용하면 됩니다.

직접적으로 우리가 미분을 다루지는 않지만 미분을 통해 기울기를 구해서 그것을 통해 그래프상에서 내려가며 cost를 최소화 한다고 생각하시면 됩니다.

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc


안녕하세요.

이번 포스팅에서는 Multinomial classification의 개념대해 알아보도록 하겠습니다.


1. Multinomial classification 이란?


앞으로 몇개의 포스팅에서 우리는 여러개의 클래스가 있을때 그것을 예측하는 Multinomial clssification, 그리고 그 중에서도 가장 많이 사용되는 softmax classification에 대해서 알아봅니다.

먼저 Multinomial classification 이란 무엇일까요?


우리는 지난 포스팅을 통해 Logistic regression에 대해서 알아보았습니다.

이때, 단순히 Hypothesis를 H(x) = WX 라는 식으로 세운다면 결과 값이 0 또는 1이 아닌 값이 나올 수 있기 때문에 우리는 z = H(x), g(z) 라는 식으로 두고 g(z)를 sigmoid 함수로 둠으로써 0과 1내의 값으로 결과가 나오도록 하였습니다.


이러한 과정을 간단하게 도식으로 표현해보면 다음과 같습니다.



그리고 우리는 이러한 것을 바탕으로 아래 그래프에서 ㅁ와 x를 구분하는 선을 그려냅니다.



그럼, Multinomial classification이란 무엇일까요?

Multinomial classification이란 단순히 0 또는 1로써 구별하는 것을 넘어, 다양한 것으로 분류하는 것입니다.



위의 그래프는 A, B, C 세개의 종류로 구별하는 것인데, 이를 하기 위해 3개의 선을 그었습니다.

위의 그래프와 같이 우리가 학습했던 Logisitc Regression 여러개를 이용한다면 이러한 Multinomial classification 구현이 가능합니다.


그리고 이러한 것들을 도식화해서 나타내 본다면 아래 그림과 같을 것 입니다.



여기서 아래 행렬을 통해 y hat 값을 얻을 수 있습니다.



이런 y hat 값들은 도식화된 그림에서의 z에 대응되는 데이터이기 때문에 다시 각각의 y hat에 sigmoid함수를 적용해야 합니다. 하지만 각각의 y hat에 sigmoid 함수를 적용하는 것보다 보다 효율적인 방법이 존재합니다.

이러한 방법에 대해서는 다음 포스팅에서 알아보도록 하겠습니다.

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc


안녕하세요.

이번 포스팅에서는 지난 포스팅에 이어, Logistic Regression의 cost함수에 대해 알아보도록 하겠습니다.


1. Logistic Regression의 Cost Function


우리가 지난 Linear Regression에서 Cost 함수에 대해서 이야기 해볼때는 아래와 같은 형태로 나왔습니다.



그래프를 보면 2차함수꼴로 최저점을 보다 쉽게 찾을 수 있었습니다.


그런데 지난 포스팅에서 알아보았듯이 Logistic Regression 에서는 Hypothesis가 다르게 세워졌습니다.

그럼 Cost 함수는 어떻게 될까요?

결론부터 말씀드리면 Cost 함수 또한 다르게 세워야합니다.


Linear Regression에서는 단순한 2차함수로써 우리가 Gradient decent 함수를 통해 최저점을 찾음으로써 cost를 최소화 하는 것이 가능했으나, Logistic Regression에서는 다릅니다.



Logistic Regression에서 우리가 세운 Hypothesis의 그래프는 위의 그래프의 형태를 띄게 됩니다.

그리고 그래프에서 나왔듯이 저러한 형태의 그래프는 Local Minimum(지역 최저점), Global Minimum(전역 최저점)을 가지고 있습니다. 우리가 지난 Linear Regression에서 사용한 Gradient decent를 사용한다면 지역 최저점에 걸려 진짜 최저점인 전역최저점을 찾을 수 없게 됩니다.


따라서 우리는 아래와 같이 새로운 Cost 함수를 정의해야 합니다.



새로운 Cost 함수는, 어떤 것의 평균을 내는데, 하나의 요소에 대한 cost를 산출하는 것에 대해 더 살펴보면, 총 2가지 case로 나눠서 산출합니다. y가 1일때와 0일때로 나누는데 왜 이렇게 할까요?



우리가 정의한 Cost 함수를 살펴보기 위해 아래 그래프를 함께 보도록 하겠습니다.



위의 그래프는 대략적으로 -log(x) 함수의 형태를 가지고 있습니다.


이제 2가지 case로 Cost함수에 대해서 살펴봅니다.

먼저, y = 1일때 입니다. 이때 Cost 함수는 -log(H(x)) 입니다.

이때 우리가 제대로 예측하여, H(x) = 1 값을 갖는다고 생각해봅시다.

그럼 Cost 함수에 대한 결과가 매우 작은 값(거의 0)에 가깝게 나와서 cost가 작게됩니다.

반대로, 우리가 제대로 예측하지 못하여 H(x) = 0 값을 갖는다면

Cost 함수에 대한 결과는 매우 큰값(거의 무한대)에 가깝게 나와서 cost가 매우 크게됩니다.


그리고 같은 방식으로 y = 0 일때를 생각해봅니다. 이때 Cost 함수는 -log(1-H(x)) 입니다.

이때 우리가 제대로 예측하여 H(x) = 0 이라면 

Cost 함수에 대한 결과가 -log(1-0) 으로써 매우 작은 값을 갖게 되어 cost가 작게 되고

우리가 제대로 예측하지 못하여 H(x) = 1이라면

Cost 함수에 대한 결과가 -log(1-1) 으로써 매우 큰 값을 갖게되어 cost가 매우 크게됩니다.


다시 한번 Cost 함수를 확인하면 아래와 같이 식으로써 정의할 수 있습니다.



위의 식들 중 맨 아래 식에서와 같이 y = 1일때와 y = 0일때의 식을 코드에서 if문을 사용하지 않도록 하나의 식으로 나타낼 수 있습니다.

( ylog(H(x))가 아닌 -ylog(H(x))입니다. )


그럼 이제 그 다음 단계인, cost를 최소화 하는 단계입니다.



이는 위에서 우리가 새로운 Cost 함수를 세웠기 때문에 이전과 같이 Gradient decent 알고리즘을 통해 Cost 함수의 최저점을 찾도록 합니다.



이렇게 해서 Logistic Regression에 대해서 알아보았습니다.

다음 포스팅에서는 Multinomial에 대한 개념을 알아보도록 하겠습니다.

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc


안녕하세요.

지난 포스팅에서는 single-variable linear regression에 대해서 알아보았습니다.

이번 포스팅에서는 multi-variable linear regression에 대해서 알아보도록 하겠습니다.


1. Linear Regression(선형 회귀)


먼저 지난 포스팅에서 학습했던 내용을 잠깐 살펴보도록 하겠습니다.

지난 포스팅에서는 선형 회귀, Linear Regression을 위해서 Hypothesis와 Cost function, Gradient descent algorithm등에 대해서 알아보았습니다.



먼저 어떤 문제를 다루기 위해 가설, Hypothesis를 세웠고

해당 hypothesis를 검증하는 단계로써 cost function을 통해 cost를 계산하였습니다.

그리고 이때, cost를 최소화 하기 위해 Gradient descent algorithm에 대해서도 알아보았습니다.


이를 통해서 우리는 아래 사진과 같은 하나의 input, 즉 하나의 변수에 대한 문제를 다루었습니다.다.



하지만 실질적으로는 아래와 같이 변수가 다수인, multi-variable에 대한 문제가 존재합니다.



그럼 이러한 것은 어떻게 다루고 처리할까요?

먼저 single-variable에서 다루었던 것처럼 hypothesis와 cost function을 확인합니다.




2. Matrix(행렬)


하지만 위와 같은 식으로 variable을 나열하는데에도 한계가 있을 것입니다.



위의 사진보다도 더 많은 데이터가 있을때는 어떻게 할까요?



바로 Matrix, 행렬을 이용합니다.

행렬이 나와 당황하시는 분들도 있겠지만 여기서 사용되는건 Matrix product, 행렬 곱에 대한 개념입니다.

따라서 행렬 곱에 대한 개념만 아신다면 문제가 없을 것입니다.


그럼 이러한 행렬을 우리에게 필요한 hypothesis에 적용시켜 봅니다.




위의 식과 같이, 단순히 우리가 그전에 배웠던 hypothesis를 행렬로써 나타냅니다.

그럼 이제 실제 데이터와 함께 생각해보도록 합니다.



위의 사진을 보시면 3개의 x 변수가 있고 이에 따른 하나의 y변수가 있습니다.

사진 좌측의 테이블을 보시면 총 5쌍의 데이터를 보실 수 있는데, 이때 하나하나를 인스턴스라고 합니다.

즉, 첫번째 인스턴스는 (73, 80, 75, 152) 인 것입니다.


우리는 이러한 다수의 인스턴스를 행렬에서 매우 심플하게 정리할 수 있습니다.

각각의 인스턴스를 오른쪽의 식에 대입하는 것이 아니라, 아래의 사진과 같이 식을 변형합니다.




위의 사진에서는 모든 인스턴스를 추가하며, w는 그대로 고정하였습니다.

단순히 식으로써 나열하는 것보다 매우 깔끔하고 심플합니다.





즉, 우리는 행렬을 이용한 hypothesis를 위의 사진과 같이 진행하게 됩니다.




다시한번 정리하자면 우리는 이전 포스팅에서 하나의 변수에 대한 hypothesis를 식으로 정리하였습니다.

하지만 행렬을 이용함으로써 multi-variable에서도 매우 간단하게 hypothesis를 나타낼 수 있습니다.



이렇게 해서 multi-variable linear regression에 대해서 알아보았습니다.

실질적인 multi-linear regression의 구현은, 텐서플로우 탭에서 확인하실 수 있습니다.

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc


안녕하세요. 문범우입니다.

작년 초~중반기 부터 인공지능, 머신러닝에 대해 많은 관심을 가지고 이것저것 알아보며 최근에는 딥러닝과 관련된 서적하나를 구매하여 공부중에 있습니다.

그리고 보다 깊은 학습을 위해 추가적으로 온라인에서 배포되고 있는 무료 강의를 찾게 되었는데요, 인공지능, 머신러닝을 공부하시는 분들은 꽤나 잘 아시더군요.


바로, 홍콩대학교에서 연구중이신 김성훈교수님의 강의입니다.

머신러닝과 관련되서는 앤드류 응 교수님의 강의가 제일 유명하지만 아무래도 영어강의이다 보니 깊은 이해가 부족할 수도 있겠다 싶어서 먼저 한글강의를 찾게 되었습니다.

앞으로 머신러닝에 대한 포스팅은 김성훈 교수님의 강의를 바탕으로 진행되니 관심 있으신 분들은 직접 강의를 들으셔도 좋을 것 같습니다.

김성훈 교수님의 '모두를 위한 딥러닝' 강의는 인프런에서 딥러닝 또는 머신러닝 키워드로 검색하시면 찾아보실 수 있습니다.



1. 머신러닝(Machine Learning)은 무엇일까?


먼저 머신러닝에서 사용되는 몇가지 용어들에 대해서 알아보겠습니다.

머신러닝(Machine Learning)은 일종의 소프트웨어입니다.


사용자가 사용하는 앱을 보면 사용자의 입력에 대한 응답을 나타내는데 이러한 것을 explicit programming이라고 합니다. 그런데 이런 explicit한 프로그램을 정확하게 만들어 내는 것은 어려운 경우가 있습니다. 예를 들어 스팸 메일 처리나 자율주행자동차는 단순한 logic을 가지고 프로그램을 개발하기엔 너무나 수많은 logic이 존재하여 불가능하다고 볼 수 있습니다.


그리고 Arthur Samuel에게서 Machine learning에 대한 개념이 나오기 시작했습니다.

이때 Machine learning이란, 개발자가 어떤 logic자체를 모두 만들어 내는 것이 아니라 프로그램이 데이터를 기반으로 '학습'하여 스스로 logic을 구현하게끔 한다는 것입니다.



2. 학습(Learning)?


학습(Learning)이란 말 그대로 배우는 것을 의미합니다. 프로그램이 스스로 배울 수 있도록 해서 스스로 더 발전되도록 하는 것이죠. 여기서 나오는 '학습'에 대해서는 크게 Supervised learning과 Unsupervised Learning이 존재합니다.


먼저, Supervised Learning이란 어떤 데이터 집합, 즉 training set이 존재하는데 이것을 바탕으로 프로그램이 학습을 하는 것입니다. training set에 있는 각각의 데이터는 레이블이 존재함으로써 프로그램이 학습을 할 수 있게 됩니다. 즉 우리가 최근에 볼 수 있는, 고양이나 강아지 등을 구별하는 프로그램이 일반적으로 Supervised learning이라는 학습이 진행됩니다. 다시말해 A 이미지에는 고양이라는 레이블이 붙어있고 이러한 이미지가 여러개 존재합니다. 또한 B라는 이미지에는 강아지라는 레이블이 붙어있고 또한 여러개 존재합니다. 프로그램은 레이블이 달려있는 다수의 이미지를 바탕으로 학습됨으로써 고양이와 강아지를 구별할 수 있게 됩니다.


그런데 어떤 학습에 대해서는 우리가 하나하나 레이블을 줄 수 없는 경우가 있습니다.

즉, 데이터를 보고 레이블 없이 프로그램이 스스로 학습해야 하는 것입니다. 그리고 이러한 것을 우리는 Unsupervised Learing이라고 말합니다.


우리는 이중에서 Supervised learning에 대해서 주로 다루게 될 것입니다.



3. 학습 데이터(Training data set) 란?


그럼 여기서 Training data set은 정확이 어떤 것일까요?

어떤 개체 a, b, c가 존재할 때 각 개체에 대한 레이블 Y가 존재하고 a, b, c에 대해서 각각의 레이블은 3, 2, 1 입니다.

그리고 개체의 특징 X가 존재할 때 a, b, c가 각각 [ㄱ,ㄴ,ㄷ], [1, 2, 3], [1, ㅂ, ㅁ]와 같은 특징 X를 가집니다.

그리고 이러한 a, b, c를 데이터로 가지고 있는 머신러닝 기반 프로그램 ML에게 특징 X = [ㄱ,ㄴ,ㄷ] 에 대해서 요청을 보내면 해당 프로그램 ML은 레이블 Y = 3 을 응답할 것 입니다.

이때 개체 a, b, c 들을 우리는 training data set 이라고 합니다..



4. 그래서, 머신러닝을 통해 무엇을 하는데?


Machine learning에서 다루게 되는 많은 문제로는, 이미지 인식(Image labeling), Email spam filter, Predicting exam score 등이 있습니다.


위에서 언급하였듯이 머신러닝에서 기초가 되는 학습, learning은 supervised learning과 unsupervised learning으로 구별이 된다고 하였습니다.

그리고 Supervised learning 또한 그 결과에 따라서 종류가 구별됩니다.

먼저, 어떤 시험의 성적에 대한 예측, 즉 0점~100점의 점수 예측을 진행하는 등의 문제는 regression 이라고 하며

단순히 어떤 시험에 대해 점수가 아니고 패스/논패스를 선택하는 등의 문제는 binary classification 이라고 합니다.

그리고 A, B, C, D 등의 학점을 부여하게 되는 등의 문제는 multi-label classification 이라고 합니다.


각각의 문제들의 구조적 특징 등을 통해 머신러닝 프로그램의 모델링이 regression model 또는 classification model 등으로 구별되는 것입니다.




오늘은 간단히 머신러닝에 대한 개론을 진행하였고

다음 포스팅에서는 Linear Regression 의 개념에 대해서 보다 자세히 알아보도록 하겠습니다.

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc