케이스윔의 개발 블로그

[Lec5-1&5-2] Logistic Classification의 가설 함수 정의와 cost 함수 설명 본문

모두를 위한 딥러닝

[Lec5-1&5-2] Logistic Classification의 가설 함수 정의와 cost 함수 설명

kswim 2018. 5. 6. 19:30

오늘 공부할 내용은 Logistic Classification이다. 한 일주일만에 다시 공부를 하는 거라서 너무 잠이 오지만 잘 정리해보도록 하겠다.


이 알고리즘은 Classification 알고리즘 중 정확도가 높은 알고리즘이라고 알려져 있다. Neural Network와 딥러닝의 중요한 component인 알고리즘이라고 할 수 있다. 

이 부분을 다루기 전에 이전의 Linear regression 을 다시 복습 해 보자!

기억해야 하는 중요한 세가지는 Hypothesis, cost function, Gradient descent 알고리즘이다. 가설을 세우고 가설과 실제값의 차이의 평균인 cost함수! 그리고 cost function에서 기울기를 변화시키며 최소화 하는 weight을 찾는 것이 Gradient descent 알고리즘이라는 것을 기억해야한다.

W := W -(알파)(cost(W)의 미분값) ->알파는 learning rate라고 부른당


그렇다면 오늘 공부 할 내용은 !!!!!!!!! Binary Classification 이다. 말 그대로 두개중에 하나를 고르는 것이다.(정해진 카테고리에 넣는 것)

예를 들어보면 스팸이메일인지 아닌지 구분할 수 있고, facebook feed에서 수 백개의 타임라인 중 사용자가 재미있어 할만한 것인지 아닌지 이전에 좋아요를 한 것을 토대로 학습해서 2개의 카데고리를 나눌 수 있다. 그리고 신용카드 사용내역에서 기존에 사용하던 패턴을 보고 실제로 주인이 썼는지를 판단하는 classification이 있을 수 있다. 


0,1 encoding-> 두개의 카테고리를 1이나 0으로 표현한다! 이렇게 하면 컴퓨터는 잘 알아들을 수 있겠지?


예를 들어서 더 자세하게 Binary classification에 대해서 공부를 해보겠다. 만약 '어떤 학생이 시험공부를 어느정도 이상했더니 시험을 통과하더라! 떨어지더라!' 와 같은 데이터가 주어진다면 아래와 같을 수 있다.

pass(1) fail(0) based on study hours

2시간, 3시간, 4시간 ->떨어짐

6시간, 7시간, 8시간 ->합격


이런형태의 데이터가 있을 때 classification 알고리즘을 적용시키고 싶을 것이다. 마치 이전에 배웠던 Linear regression으로도 할 수 있을 것 같다는 생각이 마구 든다! 이걸로 학습을 해서 이 데이터와 근접한 선을 그리면 될 거 같은데? 선을 그리고 나서 0.5 되는 점을 잘라서 더 큰 값을 예측하면 통과고 아니면 탈락으로 보자! 실제로 이러한 아이디어를 사용해서 접근을 할 것이다. 하지만 이 모델을 통해 적용시키면 문제점이 있다.

문제점은? 어떤 학생이 매우 열심히 공부를 해서 50시간 정도를 했다. 이 학생은 당연히 통과를 했을 것이다. 하지만 여기서는 0과 1로 나누어지기때문에 결과값은 1에 머물 것이다. 우리는 선과 데이터의 차이를 줄이고자 할 것이고 선이 기울어지면서 합격이랑 아닌 걸 구별하는 선이 이전의 세운 값(0.5)가 아닌 다른 값이 되어버리고 합격인데도 불구하고 불합격을 만들어버리는 선이 되어버린다. 그리고 두번째 문제점은 우리는 0과 1의 두가지 중 하나의 값을 갖고 싶은데 이 Linear regression을 사용하면 0보다 훨씬 작거나 1보다 훨씬 크거나 한 값이 나온다! 


"이 모델이 좋고 간단하지만 0과 1 사이의 값을 위한 함수가 있으면 좋겠다!!!!!!!" 하는 생각에 만들어진 것이 Logistic function 이다.

g(z) = z의 값과 상관없이 0~1 사이의 값이 나오는 함수, sigmoid function 또는 logistic function 라고 부른다. 


위와 같은 모양이므로 z값이 작아지면 0에 가까워지고 z값이 커지면 1에 가까워진다. z = WX -> H(x) = g(z) 로 바꾸면 다음과 같은 식이 된다.

위의 식에서 cost function을 생각해보자. linear regression에서는 어느점에서 시작해도 최소점에 도달할 수 있어서 최소값을 찾기 쉬었다. 하지만 위의 식을 통해 cost function을 만들어내게 되면 분모의 제곱으로 인해 구불구불한 형태의 그래프를 그리게 되고, Gradient descent 알고리즘을 적용하게 되면 시작점이 어디인가에 따라서 최소점을 찾을 때 멈추는 곳이 달라진다. 즉 항상 최소점이 달라진다. 내가 찾고자 하는 것은 Global minimum 이지만 local minimum값을 찾게 된다. 그래서 구불구불한 형태의 그래프를 사용못하니까 cost function을 Logistic classification을 위해 바꿔야 해!

cost(H(x), y)에서는 H(x), y의 값에 따라서 2가지로 정의를 할 수 있다. 처음에 봤을 때는 이해가 안갔는데 설명을 들어보니 잘 이해가 갔다. y=1일 때와 y=0일 때 왜 저렇게 함수가 정의되었는지 보겠다!

y=1 일 때는 H(x)=1 이면 cost = 0이다. 즉 잘 예측했다는 뜻이다. 하지만 H(x) = 0이면 cost=무한대, 따라서 실제 값을 잘못 예측했을 경우에 cost를 무한대로 보내버린다.

y=0 일 때는 H(x)=0이면 cost=0이다. 잘 예측했다는 뜻! 하지만 H(x)=1이라면 cost=무한대이므로 cost를 아주 높게 주어서 학습시키기 위한 것이다.

그리고 이렇게 cost function을 정의하면 그래프 모양이 이쁘니까 Gradient descent 알고리즘이 가능하다. 위의 사진에서 세번째 식은 위의 if condition을 없앤 수식이다!


#cost function

cost = tf.reduce_mean(-tf.reduce_sum(Y*tf.log(hypothesis) + (1-Y)*tf.log(1-hypothesis)))


#Minimize

a = tf.Variable(0.1)

optimizer = tf.train.GradientDescentOptimizer(a)

#이 아이가 미분을 해줍니당~~~~~~~~ 이걸 이용하면됩니다!

train = optimizer.minimize(cost)


Comments