21. 로그 함수 정리

이번 주 스터디에서 cost 함수에 들어가는 log 함수 때문에 고생을 많이 했다. 수학 사이트를 뒤져서 로그만 다시 봐야 하는건가, 하는 고민도 하고..


이 글은 함께 스터디하시는 수학 천재의 도움을 받아 작성할 수 있었음을 밝힌다. 지금 어느 정도 이해됐을 때 재빠르게 정리하지 않으면 다시 처음으로 돌아갈 것 같다.


import math

for i in range(1, 21):
print('{:6.3f} ({})'.format(math.log10(i/10), i/10), end=' ')

if i%5 == 0:
print()

# 출력 결과
# -1.000 (0.1) -0.699 (0.2) -0.523 (0.3) -0.398 (0.4) -0.301 (0.5)
# -0.222 (0.6) -0.155 (0.7) -0.097 (0.8) -0.046 (0.9) 0.000 (1.0)
# 0.041 (1.1) 0.079 (1.2) 0.114 (1.3) 0.146 (1.4) 0.176 (1.5)
# 0.204 (1.6) 0.230 (1.7) 0.255 (1.8) 0.279 (1.9) 0.301 (2.0)

도대체 로그 결과가 어떻게 나오는지 확인하고 싶었다. 이 별거 아닌 코드를 만들면서 에러도 많이 만들었다.

log는 0을 포함해서 음수를 전달하면 계산할 수 없다는 것도 이번에 알았다. 왜 안되는지는 알고 싶지 않다. 그건 수학 천재들의 영역이다. 그래서, 코드는 0.1부터 2.0까지 진행한 결과다. 여기서 중요한 것이 0.0이 나오는 부분인데, x가 1일 때 로그에서 결과가 0이 된다. 이건 수학 천재에게 들은 건데, 정말 그렇게 나왔다.

위의 결과를 그래프에 그려봤다. 유명한 사이트가 있어서 결과를 쉽게 비교할 수 있었다. 동영상을 다시 보니, 이 사이트가 교수님께서 사용하셨던 사이트였다.

https://www.desmos.com/calculator


첫 번째는 파이썬 코드로 확인했던 log(x)에 대한 그래프이다. x가 0일 때 음수 무한, 1일 때 0이 되는 것을 알 수 있다. 화면상에서는 x가 0에 가까울 때 그래프가 y축에 붙은 것처럼 보이지만, 붙은 게 아니라 0에 무한히 커지긴 하지만 y축에 달라붙을 수는 없다. 앞에서 말했듯이 x는 0이 될 수 없고, 음수도 될 수 없다.

log(x)의 결과에 - 기호를 붙여서 결과를 음수로 만들었다. 이게 생각보다 헷갈리긴 한데, 전체 결과에 -를 붙였으니까, 결론적으로 y가 뒤집힌다. log 함수에 전달되는 x는 그대로인데, 결과는 반대가 됐다.

cost 함수에 등장하는 -log(x) 그래프의 실제 모습이다. 교수님께서는 x가 1보다 큰 부분에 대해서는 필요없기 때문에 보여주지 않으셨다. cost 함수에 전달되는 결과는 sigmoid를 거치기 때문에 log 함수에 전달될 수 있는 값의 범위는 0~1 사이가 되므로 1보다 큰 부분은 없어도 된다.

이번 그래프는 x축에 대해서 대칭이다. log 함수에 전달되는 값이 음수인 경우에 이와 같이 그려진다.

cost 함수에 등장하는 두 번째 그래프다. 이 그래프가 밥그릇에서 오른쪽 부분을 담당한다.

처음 그렸던 log(x)에 대해서 x축과 y축 모두에 대해 대칭인 그래프이다. 다만 cost 함수에서 사용하는 그래프는 0부터 시작하기 때문에 이번 그래프와는 조금 차이가 있다.

바로 앞의 그래프를 오른쪽으로 1만큼 이동시켰다. 이동시키는 방법은 1에서 x를 빼면 된다. 아니 기존 값에 1을 더하는게 좋겠다. y = -log(-x+1)이라는 표현이 더 쉽다.

아무 기대하지 않고 그려봤다. -log(x)와 -log(1-x)를 더했다. cost 함수에서는 실제로 이와 비슷하게 사용한다.

비슷해 보여도 말도 안 되게 다르다. cost 함수는 2개의 그래프 중에서 하나를 선택해서 사용한다. 두 개를 동시에 사용하는 일은 없다.

cost 함수는 이번 그래프의 식에 y를 곱하는 부분이 추가되어 있기 때문에 이번 그래프의 식과는 완전 다르다.


cost 함수 그림을 가져왔다. 다음에 나오는 그래프와 비교해서 보기 바란다.



아주 큼지막하게 그려봤다. cost 함수에서 사용되는 2개의 log 함수이다. 우리는 이 그래프에서 0과 1 사이의 구간만 사용한다. 0보다 작거나 1보다 큰 영역의 그래프는 필요없다. 더욱이 진짜 밥그릇처럼 2개를 연결해서 그린다는 것은 말이 되지 않는다. 하나는 0에서 시작하고, 하나는 1에서 시작하는데 어떻게 연결할 수 있겠는가?


아래는 log 함수 4개를 하나로 모은 그래프이다. 앞에서 충분한 설명이 되었지만, 한 눈에 비교를 해 보면 더 좋을 수도 있을 것 같다.