Cost를 이야기할 때 대략 가설의 값과 실제의 값의 차의 제곱을 평균을 내는 것인데 H(x)로 하면 대략 아래 사진처럼 나타나 최솟값을 찾을 수 있다.
하지만 sigmoid를 사용하면서 0에서 1 사이의 값이 나오게 하였다. 이것을 사용해서 Cost를 사용하면 울퉁불퉁한 그래프가 완성된다. H(x)는 어디서 시작해도 경사를 타고 최솟값을 찾는다. 하지만 H(X)는 linear가 아니라 S자 모양인 sigmoid에 경사 타기 알고리즘을 적용하면 끝나는 점이 달라질 수 있다는 것이다.
위 사진처럼 어느 지점에서 시작하냐에 따라 최솟값이 달라진다. 이 값을 바로 local minimum이라고 한다. 원래 global minimum을 찾는 게 목표인데 local minimum를 찾는 것이다. 문제는 여기서 학습을 멈춰버린다는 것이다. 그래서 여기서는 Gradient descent algorithm을 사용할 수가 없다. 그래서 Cost를 변경해야 된다.
Cost는 어떤 것의 합의 평균이다. 하나의 엘리먼트에 Cost를 구해 평균 내는 것이다. 이것을 c라고 하자. c에 (H(x), y)를 넣어 y=1일 때는 -log(H(x))를 사용하고 y = 0일 때는 -log(1-H(x))를 사용한다. 왜 이렇게 사용하는 걸까?
우리 H(X)의 식을 보면 지수(e)가 표함 되어있는 것을 볼 수가 있다. 이것이 구부러진 선을 만드는데 이것의 상극이 되는 것이 바로 log함수이다. log함수의 모양을 보면 상당히 우리와 잘 맞는다. log함수를 보면 x가 1일 때 이 함수는 0이 되고 x가 0에 가까워지면 이 함수의 값을 굉장히 커진다. y=1일 때 이 함수를 Cost로 사용한다고 했다. Cost는 실제의 값과 가설의 값이 비슷하면 Cost값은 작게 나오고 값이 다르면 Cost의 값은 크게 나오게 된다. 이 Cost를 최소화 하기 위해 w를 변경하는 것이다. 그럼 여기서 y가 실제로 y=1일때 H(x) 예측값이 1로 맞았을 때 Cost는 무엇일까? 위식에 적용해 보면 0에 가까워지는 것이다. 여기서 우리의 예측값이 H(x)가 0으로 예측했을 때는 Cost의 값을 보면 굉장히 커지는 것을 볼 수 있다. 거의 무한대로 가깝게 간다. 이 말은 예측을 틀리면 Cost는 굉장히 높아져서 시스템에 벌을 주게 되는 것이다.
y=0일 때 경우도 확인해보자. H(x)=0라고 예측했을 때는 이때 Cost는 0에 가까워진다 실제 값과 우리의 예측값이 갖기 때문이다. H(x) = 1일 때는 Cost가 굉장히 커지는 것을 확인할 수 있다. 그래서 원래 목적이었던 Cost에 잘 맞는 함수가 완성이 되었고 두 함수를 붙이면 흔히 봤던 밥그릇 모양 그래프가 완성이 된다. 그러면 우리가 좋아하는 경사 타고 내려가기 알고리즘 즉, Gradient descent algorithm을 사용할 수 있는 것이다. 아래 사진을 보면 이해가 될 것이다.
y =1과 y= 0에 두 가지 경우가 있는데 이것을 코드로 구현하면 if를 사용해야 된다. 그래서 if를 없애 보자 해서 나온식이 바로 아래 식이다.
y = 1일 때 경우를 살펴보면 뒤 log함수가 0이 되어 사라진다. 그래서 Cost = -log(H(x))가 된다. 이식은 익숙하다 바로 위에서 보았던 식이랑 똑같다.
y = 0일 때 경우를 살펴보면 앞 log함수가 0이 되어 사려져 Cost는 -log(1-H(x))가 된다. 이식도 위에 있는 식과 동일하다.
이제 Cost가 주어졌으면 minimize를 해야 한다. 그러면 Gradient descent algorithm를 사용할 것이다. 이때는 이 함수의 기울기를 구하기 위해 미분을 하게 된다. 이 미분하는 것은 복잡하기 때문에 알고리즘을 사용하면 컴퓨터가 알아서 해준다. 그런 다음에 미분한 값에 어느 정도 크기로 내려갈 것인가 알파로 주고 그 값을 가지고 현재의 w를 조금씩 업데이트시키면 된다.
위 사진은 Cost를 직접 tensorflow로 구현해본 것이다. tensorlfow를 사용하면 위처럼 간단하게 구현할 수 있다.
그리고 미분하는 것은 optimizer라고 tensorflow에서 지원하는 library가 있기 때문에 GradientDescentOptimizer을 사용하여 이용하면 된다.
공부한 사이트:https://www.youtube.com/watch?v=6vzchGYEJBc&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=12
'머신러닝 > 모두를 위한 딥러닝' 카테고리의 다른 글
Softmax Regression (0) | 2019.05.27 |
---|---|
TensorFlow로 Logistic Classification의 구현하기 (0) | 2019.05.23 |
Logistic Classification의 가설 함수 정의 (0) | 2019.05.19 |
TensorFlow로 파일에서 data읽어오기 (0) | 2019.05.18 |
multi-variable linear regression을 TensorFlow에서 구현하기 (0) | 2019.05.16 |