11. Logistic Regression의 cost 함수 설명 (lec 05-2)

동영상이 2개로 되어 있어서 글도 두 개로 정리한다. 이번 동영상에서는 cost 함수와 gradient descent 알고리듬에 대해서 공부한다.


Linear Regression에서 배운 hypothesis와 이번에 배운 hypothesis를 비교해서 보여주고 있다. hypothesis는 cost 함수를 구성하는 핵심이기 때문에, 여기서는 cost 함수 또한 이전과 달라져야 한다고 얘기하고 있다.

그림의 왼쪽 부분은 매끈한 밥그릇이고, 오른쪽 부분은 울퉁불퉁하다. 김성훈 교수님은 이 부분에 대해서 왼쪽은 직선을 살짝 구부려서 연결을 한 모양이고, 오른쪽은 sigmoid를 구부려서 연결을 했기 때문이라고 설명하셨다.

sigmoid 모양에 대해서 추가 설명을 한다면, e의 지수 형태의 그래프를 사용했기 때문에 구부러진 곡선이 연결된 느낌이다. 그러나, 실제로는 log 함수를 사용하기 때문에 매끄러운 밥그릇이 만들어진다.

오른쪽 그림에 교수님께서 Local이라고 쓰셨는데 이 부분을 매끄럽게 만들지 않으면 local minimum을 최저점으로 잘못 발견할 수 있는 문제가 발생한다. 그래서, 반드시 구불구불한 형태의 밥그릇을 매끈하게 펴야 한다. 그래야 global minimum에 도착할 수 있다.


새로운 cost 함수다. cost 함수의 목적은 비용(cost)을 판단해서 올바른 W와 b를 찾는 것이다. 다시 말해, 목표로 하는 W와 b를 찾을 수 있다면, 어떤 형태가 됐건 cost 함수라고 부를 수 있다는 뜻이다.

자연상수(e)의 지수를 사용하는 hypothesis의 비용을 판단하기 위해, 드디어 log가 등장했다. 나는 지수도 잘 모르고 로그도 잘 모르는데, 찾아보니 지수의 반대를 로그로 부르고 있었다. 로그를 사용하는 이유는 앞에서 잠깐 언급했던 것처럼, 구불구불한 cost 함수를 매끈하게 펴기 위함이다. 당연히 첫 번째 목표는 hypothesis가 반영된 비용을 올바르게 판단하기 위함이다.

조금 아쉬운 점은 새로운 cost 함수인 C(H(x), y)의 공식이 2가지라는 사실이다. y가 1일 때 사용하는 공식과 0일 때 사용하는 공식이 따로 있어서, 괜히 부담스럽게 느껴진다.


그림이 조금 희미한데, 아래쪽에 그래프가 2개 있다. 매끈한 밥그릇의 왼쪽을 담당하는 그래프와 오른쪽을 담당하는 그래프. 두 개를 합쳐서 하나의 밥그릇을 만든다. log 함수가 매끈하기 때문에 gradient descent 또한 잘 동작한다. 왼쪽은 -log(z)의 그래프이고, 오른쪽은 -log(1-z)의 그래프다. 이 부분은 수학적인 내용이 필요하므로 다시 정리하도록 하겠다.

교수님께서 y 값이 1일 때와 0일 때에 대해 손수 적어놓으셨다. 한번 따라가 보자.

  y가 1일 때
  H(X) = 1일 때는 왼쪽 그래프에서 y는 0이 된다. (cost=0)
  H(X) = 0일 때는 왼쪽 그래프에서 y는 무한대(∞)가 된다. (cost=무한대)

  y가 0일 때
  H(X) = 0일 때는 오른쪽 그래프에서 y는 0이 된다. (cost=0)
  H(X) = 1일 때는 오른쪽 그래프에서 y는 무한대가 된다. (cost=무한대)

이번 설명에서 조금 헷갈리는 것이 y와 H(X)의 정의였다. 이전 글들에서 당연히 설명하면서 이해했다고 생각했음에도, 얕은 지식이라 새로운 게 나타나면 헷갈려 버린다. y는 파일 등에서 가져온 실제 데이터(label)이고, H(X)는 y를 예측한 값(y hat)이다. 그래서, H(X)는 기존의 hypothesis처럼 틀릴 수 있는 가능성이 있다.

  y가 1일 때 1을 예측(H(X)=1)했다는 것은 맞았다는 뜻이고, 이때의 비용은 0이다.
  y가 1일 때 0을 예측
(H(X)=0)했다는 것은 틀렸다는 뜻이고, 이때의 비용은 무한대이다.
  y가 0일 때 0을 예측(H(X)=0)했다는 것은 맞았다는 뜻이고, 이때의 비용은 0이다.
  y가 0일 때 1을 예측(H(X)=1)했다는 것은 틀렸다는 뜻이고, 이때의 비용은 무한대이다.

log로 시작하는 cost 함수가 어렵긴 해도, 맞는 예측을 했을 때의 비용을 0으로 만들어 줌으로써 cost 함수의 역할을 제대로 함을 알 수 있다.

착각하면 안 되는 것이 있다. 예측의 결과는 0과 1이 나올 수도 있지만, 대부분은 0과 1 사이의 어떤 값이 된다. 가령, 0.7이 나왔으면 0.7에서 label에 해당하는 1 또는 0을 뺀 결과를 활용하는 것은 여전히 동일하다. 다만 Linear Regression에서 했던 것처럼 페널티를 주기 위한 제곱을 하진 않는다. log 자체에 페널티와 동일한 무한대로 수렴하는 값이 있기 때문에 제곱을 할 필요가 없기 때문이다. 결론적으로 분류(classification)에서도 지금까지와 동일하게 최소 cost가 되도록 W를 조절하는 것이 핵심이다.

앞에 나온 2개의 공식은 아래에 다시 나오니까 생략하고. 마지막 공식은 가운데 있는 공식을 하나로 합친 공식이다. 하나로 만들지 않으면, 매번 코딩할 때마다 if문이 들어가기 때문에 불편하다.

두 개의 값 A와 B가 존재한다. y의 값에 따라 A와 B 중에서 하나만 사용하고 싶다. y는 언제나 1 또는 0 중에서 하나의 값을 갖고, 1일 때 A 함수를 사용하려고 한다.

  공식 : y*A + (1-y)*B
  y=1  ==>  1*A + (1-1)*B = A
  y=0  ==>  0*A + (1-0)*B = B


아주 간단한 공식이다. y에 대해 1 또는 0을 넣어보면 원하는 값만 사용할 수 있음을 쉽게 알 수 있다. A는 -log(H(x))이고, B는 -log(1-H(x))이다. 이렇게 해서 마지막 세 번째에 있는 공식이 만들어졌다.

  y*A + (1-y)*B  ==>  y * -log(H(x))  +  (1-y) * -log(1-H(x))  ==>  -ylog(H(x)) - (1-y)log(1-H(x))

앞에서 만들었던 공식을 cost 함수와 합쳤다. 일단 아래처럼 음수 기호(-)를 앞으로 빼서 안쪽을 +로 만든다.

  -ylog(H(x)) - (1-y)log(1-H(x))   ==>   -(ylog(H(x)) + (1-y)log(1-H(x)))

cost 함수인 cost(W) = (1/m) ∑ c(H(x), y)를 재구성한다.

  (1/m) ∑  -(ylog(H(x)) + (1-y)log(1-H(x)))   ==>   -(1/m) ∑ylog(H(x)) + (1-y)log(1-H(x))

이렇게 해서 최종적인 cost 함수가 탄생했다. 이 함수는 나중에 파이썬으로 직접 구현해서 보여줄거라서, 지금 이해 못했어도 아직 기회가 있다. 나 또한 이 식을 보고는 이해하지 못했다.

두 번째 있는 공식은 cost(W)에 대해 미분을 적용해서 W의 다음 번 위치를 계산하는 공식이다. Linear Regression과 공식에서는 달라진 게 없지만, 김성훈 교수님께서 말씀하신 것처럼 cost(W)가 달라져서 매우 복잡한 미분이 되어 버렸다. 동영상에서도 이 부분을 생략하셨기 때문에, 우리 또한 "미분을 하는구나!" 정도로 넘어가야 하는 부분이다.

Linear Regression 알고리듬에서 cost 함수와 gradient descent를 구하는 공식이 각각 있었던 것처럼 Logistic Regression에서도 두 개의 공식이 있어야 하고, 위의 그림에서 확인할 수 있었다.

다만 미분에 대한 공식은 달라졌지만, W를 일정 크기만큼 이동시키는 부분은 여전히 동일하기 때문에 앞서 배운 gradient descent 알고리듬을 여기서도 사용할 수 있고, 다음 글에서 텐서플로우를 통해 보여줄 것이다.