이진 분류(Binary Classification)
앞서 선형 회귀를 설명하며 공부 시간과 성적 간의 관계를 직선의 방정식으로 표현한다는 가설 하에, 주어진 데이터로부터 가중치 w와 편향 b를 찾아 데이터를 가장 잘 표현하는 직선을 찾았다. 하지만 둘 중 하나의 선택지 중에서 정답을 고르는 이진 분류 문제는 직선으로 표현하는 것이 적절하지 않다.
학생들이 시험 성적에 따라 합격, 불합격이 기재된 데이터가 있다고 가정해보자. 시험 성적이 x라면, 합불 결과는 y이다. 이 데이터로부터 특정 점수를 얻었을 때의 합격, 불합격 여부를 판정하는 모델을 만들고자 한다.
위 데이터에서 합격을 1, 불합격을 0이라고 하였을 때 그래프를 그려보면 아래와 같다.
이러한 점들을 표현하는 그래프는 알파벳의 S자 형태로 표현된다. 이러한 x와 y의 관계를 표현하기 위해서는 직선을 표현하는 함수가 아니라 S자 형태로 표현할 수 있는 함수가 필요하다. 직선을 사용할 경우 보통 분류 작업이 제대로 동작하지 않는다.
이 예제의 경우 레이블에 해당하는 y가 0 또는 1이라는 두 가지 값만 가지므로, 이 문제를 풀기 위해서 예측값은 0과 1 사이의 값을 가지도록 한다. 0과 1사이의 값을 확률로 해석하면 문제를 풀기가 훨씬 용이해진다. 최종 예측값이 0.5보다 적으면 0으로 예측했다 판단하고, 0.5보다 크면 1로 예측했다고 판단한다. 만약 y = wx + b의 직선을 사용할 경우, y값이 음의 무한대부터 양의 무한대와 같은 큰 수들도 가질 수 있는데 이는 직선이 분류 문제에 적합하지 않은 두 번째 이유다.
시그모이드 함수(Sigmoid Function)
로지스틱 회귀를 풀기 위한 가설을 세워보자.
여기서 e는 자연 상수라 불리는 숫자다. 여기서 구해야 할 것은 여전히 주어진 데이터에 가장 적합한 가중치 w와 편향 b이다. 인공지능 알고리즘이 하는 것은 결국 주어진 데이터에 적합한 가중치 w와 b를 구하는 것이다.
시그모이드 함수를 그래프로 시각화해보자.
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x) :
return 1 / (1 + np.exp(-x))
x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y, 'g')
plt.plot([0, 0], [0, 1], ':')
plt.title('Sigmoid Function')
plt.show()
위의 그래프에서 시그모이드 함수는 출력값을 0과 1 사이의 값으로 조정하여 반환한다. x가 0일 때 출력 값은 0.5의 값을 가진다. x가 증가하면 1에 수렴한다. 이제 가중치 w와 편향 b가 출력값에 어떤 영향을 미치는지 시각화를 통해 알아보자.
def sigmoid(x) :
return 1 / (1 + np.exp(-x))
x = np.arange(-5.0, 5.0, 0.1)
y1 = sigmoid(0.5 * x)
y2 = sigmoid(x)
y3 = sigmoid(2 * x)
plt.plot(x, y1, 'r', linestyle = '--')
plt.plot(x, y2, 'g')
plt.plot(x, y3, linestyle = '--')
plt.plot([0, 0], [0, 1], ':')
plt.title("Sigmoid Function")
plt.show()
위 그래프는 w값이 0.5일 때 빨간색 선, w값이 1일 때 초록색 선, w값이 2일 때 파란색 선이 나오도록 하였다. 위와 같이 w 값에 따라 그래프의 경사도가 변한다. 선형회귀에서 직선을 표현할 때, 가중치 w는 직선의 기울기를 의미했지만 여기서는 그래프의 경사도를 결정한다. w의 값이 커지면 경사가 커지고 w의 값이 작아지면 경사가 작아진다.
이번에는 b의 값에 따라서 그래프가 어떻게 변하는지 보자.
def sigmoid(x) :
return 1 / (1 + np.exp(-x))
x = np.arange(-5.0, 5.0, 0.1)
y1 = sigmoid(x + 0.5)
y2 = sigmoid(x + 1)
y3 = sigmoid(x + 1.5)
plt.plot(x, y1, 'r', linestyle = '--')
plt.plot(x, y2, 'g')
plt.plot(x, y3, linestyle = '--')
plt.plot([0, 0], [0, 1], ':')
plt.title("Sigmoid Function")
plt.show()
위 그래프는 b의 값에 따라서 그래프가 이동하는 것을 보여준다. 시그모이드 함수는 입력값이 커지면 1에 수렴하고, 입력값이 작아지면 0에 수렴한다. 0부터 1까지의 값을 가지는데 출력값이 0.5 이상이면 1(True), 0.5 이하면 0(False)로 만들면 이진 분류 문제를 풀기 위해서 사용할 수 있다.
비용 함수(Cost Function)
로지스틱 회귀 또한 경사 하강법을 사용하여 가중치 w를 찾아내지만, 비용 함수로는 평균 제곱 오차(MSE)를 사용하지 않는다. 평균 제곱 오차를 로지스틱 회귀의 비용 함수로 사용했을 때는 좋지 않은 로컬 미니멈에 빠질 가능성이 지나치게 높아 문제 해결이 어렵다.
로지스틱 회귀에서 평균 제곱 오차를 비용 함수로 사용하면, 경사 하강법을 사용했을 때 찾고자 하는 최소값이 아닌 잘못된 최소값에 빠질 가능성이 매우 높다. 이를 전체 함수에 걸쳐 최소값이 아닌 글로벌 미니멈(Global Minimum)이 아닌 특정 구역에서의 최소값인 로컬 미니멈(Local Minimum)에 도달했다고 한다. 로컬 미니멈에 지나치게 쉽게 빠지는 비용 함수는 cost가 가능한한 최소가 되는 가중치 w를 찾는다는 목적에 좋지 않은 선택이다. 그리고 로지스틱 회귀에서의 평균 제곱 오차는 바로 그 좋지 않은 선택에 해당된다.
로지스틱 회귀라는 문제에서 가중치 w를 최소로 만드는 적절한 새로운 비용 함수를 찾아야 한다. 가중치를 최소화하는 아래의 어떤 함수를 목적 함수라고 하자. J는 목적 함수(objective function)를 의미한다.
아직 완성된 식이 아니다. 위의 식에서 샘플 데이터의 개수가 n개이고, 어떤 함수 f가 실제값과 예측값의 오차를 나타내는 함수라고 할 때, 여기서 새로운 함수 f를 어떻게 정의하느냐에 따라서 가중치를 최소화하는 적절한 목적 함수가 완성된다. 목적 함수는 전체 데이터에 대홰서 어떤 함수 f의 값의 평균을 계산하고 있다. 적절한 가중치를 찾기 위해서 결과적으로 실제값과 예측값에 대한 오차를 줄여야 하므로 여기서 이 f는 비용 함수라고 하자. 식을 다시 쓰면 아래와 같다.
시그모이드 함수는 0과 1사이의 y값을 반환한다. 이는 실제값이 0일 때 y값이 1에 가까워지면 오차가 커지며 실제값이 1일 때 y값이 1에 가까워지면 오차가 커지며 실제값이 1일 때 y값이 0에 가까워지면 오차가 커짐을 의미한다. 그리고 이를 반영할 수 있는 함수는 로그 함수를 통해 표현이 가능하다.
y값의 실제값이 1일 때 -logH(x) 그래프를 사용하고 y의 실제값이 0일 때 -log(1-H(x)) 그래프를 사용해야 한다. 위의 두 식을 그래프 상으로 표현하면 아래와 같다.
실제값 y가 1일 때의 그래프를 파란색 선으로 표현하였으며, 실제값 y가 0일 때의 그래프를 빨간색 선으로 표현했다. 위의 그래프를 간략히 설명하면, 실제값이 1일 때, 예측값이 H(x)의 값이 1이면 오차가 0이므로 당연히 cost는 0이 된다. 반면, 실제값이 1일 때, H(x)가 0으로 수렴하면 cost는 무한대로 발산한다. 실제값이 0인 경우는 그 반대로 이해하면 된다. 이는 다음과 같이 하나의 식으로 표현할 수 있다.
자세히 보면 y와 (1-y)가 식 중간에 들어갔고, 두 개의 식을 -로 묶은 것 외에는 기존의 두 식이 들어가있는 것을 볼 수 있다. y가 0이면 ylogH(x)가 없어지고, y가 1이면 (1-y)log(1-H(x))가 없어지는데 이는 각각 y가 1일 때와 0일 때의 앞서 본 식과 동일하다.
결과적으로 로지스틱 회귀의 목적 함수는 아래와 같다.
이때 로지스틱 회귀에서 찾아낸 비용 함수를 크로스 엔트로피 함수라고 한다. 결과적으로 로지스틱 회귀는 비용 함수로 크로스 엔트로피 함수를 사용하며, 가중치를 찾기 위해서 크로스 엔트로피 함수의 평균을 취한 함수를 사용한다.
'NLP > 딥러닝을 이용한 자연어 처리 입문' 카테고리의 다른 글
[NLP] 5-6. 로지스틱 회귀 실습 (1) | 2024.01.05 |
---|---|
[NLP] 5-4. 자동 미분과 선형 회귀 실습 (0) | 2024.01.04 |
[NLP] 5-3. 선형 회귀 (1) | 2024.01.04 |
[NLP] 5-2. 머신 러닝 훑어보기 (1) | 2024.01.03 |
[NLP] 5-1. 머신 러닝이란 (0) | 2024.01.03 |