이진분류(Binary Classification )
이진분류는 입력을 두 범주 중 하나로 분류하는 것을 의미한다.
이진분류의 데이터셋은 다음과 같이 수학적으로 표기될 수 있다.
( x , y ) (x, y) ( x , y ) 에 대해, X ∈ R n x , y ∈ { 0 , 1 } X \in \mathbb{R}^{n_x}, y \in \{0, 1\} X ∈ R n x , y ∈ { 0 , 1 } 일때, 데이터셋은 { ( X 1 , y 1 ) , ( X 2 , y 2 ) , ⋯ , ( X m , y m ) } \{ (X_1, y_1), (X_2, y_2), \cdots, (X_m, y_m) \} {( X 1 , y 1 ) , ( X 2 , y 2 ) , ⋯ , ( X m , y m )} 과 같다.
이를 행렬로 표현하면 다음과 같다.
X = [ ∣ ∣ ⋯ ∣ ∣ ∣ ⋯ ∣ X 1 X 2 ⋯ X m ∣ ∣ ⋯ ∣ ∣ ∣ ⋯ ∣ ] , Y = [ y 1 , y 2 , ⋯ , y m ] , ( Y ∈ R 1 × m ) X = \begin{bmatrix}
|&|&\cdots&|\\
|&|&\cdots&|\\
X_1&X_2&\cdots&X_m\\
|&|&\cdots&|\\
|&|&\cdots&|\\\end{bmatrix}\\
,\\
Y= [y_1,\ y_2,\ \cdots,\ y_m], (Y \in \mathbb{R}^{1 \times m}) X = ∣ ∣ X 1 ∣ ∣ ∣ ∣ X 2 ∣ ∣ ⋯ ⋯ ⋯ ⋯ ⋯ ∣ ∣ X m ∣ ∣ , Y = [ y 1 , y 2 , ⋯ , y m ] , ( Y ∈ R 1 × m )
로지스틱 회귀(Logistic Regression )
로지스틱 회귀는 이진분류 모델 중 하나이다.
주어진 피처 X X X 에 대해 y ^ \hat y y ^ 가 의미하는 바는 y y y 가 1일 확률인 y ^ = P ( y = 1 ∣ X ) , ( X ∈ R n x ) \hat y = P(y = 1|X), (X\ \in \mathbb{R}^{n_x}) y ^ = P ( y = 1∣ X ) , ( X ∈ R n x ) 이다.
파라미터 w w w , b b b 는 w ∈ R n x , b ∈ R w \in \mathbb{R}^{n_x}, b \in \mathbb{R} w ∈ R n x , b ∈ R 이다.
이를 이용해 y ^ \hat y y ^ 을 표현하기 위해 가장 먼저 시도해 볼 수 있는 것은, 선형방정식의 형태로 다음과 같이 표현하는 것이다.
y ^ = w T X + b \hat y = w^T X + b y ^ = w T X + b
하지만 '회귀'가 아닌 '분류', 그 중에서도 이진분류를 수행하기 위해 다음과 같이 표현하는 것은 그리 적절하지 못하다. 왜냐하면 y y y 는 항상 y ∈ { 0 , 1 } y \in \{0, 1\} y ∈ { 0 , 1 } 이어야 하는데, 회귀식으로 이런 결과가 나오도록 하기는 매우 어렵기 때문이다.
그래서 먼저 시그모이드 함수를 이용해 다음과 같이 표현을 시도해볼 수 있다.
y ^ = σ ( w T X + b ) \hat y = \sigma (w^T X + b) y ^ = σ ( w T X + b )
혹은 파라미터인 가중치 w w w 와 편향 b b b 를 Θ \Theta Θ 로 일반화하여 다음과 같이 표현할 수 있다.
x 0 = 1 , Θ = [ θ 0 θ 1 ⋮ θ n x ] , y ^ = σ ( Θ T X ) x_0 = 1,\\
\Theta = \begin{bmatrix}
\theta_0\\
\theta_1\\
\vdots\\
\theta_{n_x}
\end{bmatrix}, \\
\hat y = \sigma (\Theta^T X) x 0 = 1 , Θ = θ 0 θ 1 ⋮ θ n x , y ^ = σ ( Θ T X )
이때 Θ 0 = b \Theta_0 = b Θ 0 = b 이고, Θ \Theta Θ 의 다른 원소들은 가중치 w w w 이다.
시그모이드 함수의 식은 다음과 같다.
σ ( z ) = 1 1 + e − z \sigma (z) = \frac{1}{1 + e^{-z}} σ ( z ) = 1 + e − z 1
이와 같이 표현하면 z z z 가 충분히 클때, σ ( z ) \sigma (z) σ ( z ) 의 값은 1로 수렴하고, z z z 가 충분히 작으면 σ ( z ) \sigma (z) σ ( z ) 의 값은 0으로 수렴한다. 따라서 다음과 같다.
z i s l a r g e → σ ( z ) ≈ 1 1 + 0 = 1 z i s l a r g e n e g . → σ ( z ) ≈ 1 1 + ( B i g N u m ) ≈ 0 z\ is\ large \rightarrow \sigma (z) \approx \frac {1}{1 + 0} = 1 \\
z\ is\ large\ neg. \rightarrow \sigma (z) \approx \frac {1}{1 + (Big\ Num)} \approx 0 z i s l a r g e → σ ( z ) ≈ 1 + 0 1 = 1 z i s l a r g e n e g . → σ ( z ) ≈ 1 + ( B i g N u m ) 1 ≈ 0
비용함수 (Cost Function )
로지스틱 회귀를 학습시키기 위해선 먼저 비용함수를 정의해야 한다. 비용함수는 훈련 데이터셋에 대해 예측이 얼마나 잘 되었는지 측정해주는 함수이다.
y ^ = σ ( w T X + b ) , w h e r e σ ( z ) = 1 1 + e − z \hat y = \sigma (w^T X + b),\ where\ \sigma(z) = \frac{1}{1 + e^{-z}} y ^ = σ ( w T X + b ) , w h ere σ ( z ) = 1 + e − z 1
다음과 같은 로지스틱 회귀의 식에 대해 데이터셋을 대입하면 다음과 같을 것이다.
임의의 i i i 번째 데이터 ( X i , y i ) (X_i, y_i) ( X i , y i ) 에 대해,
y ^ i = σ ( w T X i + b ) , w h e r e σ ( z ) = 1 1 + e − z , z i = w T X i + b \hat y_i = \sigma (w^T X_i + b),\ where\ \sigma(z) = \frac{1}{1 + e^{-z}}, \\
z_i = w^T X_i + b y ^ i = σ ( w T X i + b ) , w h ere σ ( z ) = 1 + e − z 1 , z i = w T X i + b
이에 대해 예측 데이터와 실제 데이터의 차이를 표현한 손실함수는 다음과 같이 정의할 수 있다.
L ( y ^ , y ) = 1 2 ( y ^ − y ) 2 L(\hat y,\ y) = \frac {1}{2} (\hat y - y)^2 L ( y ^ , y ) = 2 1 ( y ^ − y ) 2
하지만 로지스틱 회귀에서는 사용하지 않는데, 다수의 지역해를 가지게 되어 경사하강법이 전역적 해를 찾지 못할 수 있기 때문이다. 그래서 로지스틱 회귀에선 다음과 같은 손실함수를 사용한다.
L ( y ^ , y ) = − ( y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ) L(\hat y,\ y) = - (y\ log\ \hat y + (1 - y)\ log(1 - \hat y)) L ( y ^ , y ) = − ( y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ))
이와 같이 정의하면 비용함수는 전역적으로 아래로 볼록한 형태가 된다.
이때, 만약 y = 1 y = 1 y = 1 이라면, L ( y ^ , y ) = − l o g y ^ L(\hat y, y) = - log \ \hat y L ( y ^ , y ) = − l o g y ^ 이다. 우리는 손실함수의 값이 최소인 것을 원한다. 손실함수값이 최소이려면, l o g y ^ log\ \hat y l o g y ^ 가 최대이어야 하고, 그러려면 다시 y ^ \hat y y ^ 의 값이 최대이어야 할 것이다. y ^ \hat y y ^ 은 시그모이드 함수의 치역이므로 1보다 클 수 없다. 따라서 손실함수의 값이 최소이려면 y ^ \hat y y ^ 은 1에 수렴해야 한다.
반대로 y = 0 y = 0 y = 0 이라면, L ( y ^ , y ) = − l o g ( 1 − y ^ ) L(\hat y, y) = - log(1 - \hat y) L ( y ^ , y ) = − l o g ( 1 − y ^ ) 이고, 그에 따라 y ^ \hat y y ^ 은 최대한 작아야 한다. 다시말해 y ^ \hat y y ^ 은 0에 수렴해야 한다.
이 손실함수들을 바탕으로 비용함수를 다음과 같이 정의할 수 있다.
J ( w , b ) = 1 m ∑ i = 1 m L ( y i ^ , y i ) = − 1 m ∑ i = 1 m ( y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ) J(w,\ b) = \frac {1}{m} \sum_{i = 1}^m L(\hat {y_i}, y_i) \\
= -\frac {1}{m} \sum_{i = 1}^m (y\ log\ \hat y + (1 - y)\ log(1 - \hat y)) J ( w , b ) = m 1 i = 1 ∑ m L ( y i ^ , y i ) = − m 1 i = 1 ∑ m ( y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ))
경사하강법(Gradient Descent )
좋은 모델을 얻기 위해선 J ( w , b ) J(w,\ b) J ( w , b ) 을 가장 작게 만드는 w , b w, b w , b 를 찾는 게 중요할 것이다. 우리는 비용함수를 전역적으로 아래로 볼록하게 정의했다. 따라서 어느 한 지점에서 시작했을 때, 반복적으로 경사를 따라 하강하면 비용함수를 가장 작게 하는 지점에 도달할 수 있을 것이다.
계산 그래프(Computational Graph )
신경망에는 전방향 전파와 역전파가 있다. 전방향 전파는 신경망의 출력값을 계산하고, 역방향 전파는 신경망의 경사와 도함수를 계산한다.
이를 설명하기 위해 먼저 다음과 같은 비용함수를 정의해보자.
J ( a , b , c ) = 3 ( a + b c ) u = b c v = a + u J = 3 v J(a,\ b,\ c) = 3(a + bc) \\
u = bc \\
v = a + u \\
J = 3v J ( a , b , c ) = 3 ( a + b c ) u = b c v = a + u J = 3 v
이는 다음과 같은 계산 그래프로 표현이 가능하다.
<div class="mermaid">
graph LR
A([a]) --> V[V = a + u]
B([b]) --> U[u = bc]
C([c]) --> U
U --> V
V --> J[J = 3v]
</div>
( a , b , c ) = ( 5 , 3 , 2 ) (a, b, c) = (5, 3, 2) ( a , b , c ) = ( 5 , 3 , 2 ) 라면,
<div class="mermaid">
graph LR
A([a = 3]) --> V[V = a + u = 11]
B([b = 3]) --> U[u = bc = 6]
C([c = 2]) --> U
U --> V
V --> J[J = 3v = 33]
</div>
이와 같은 계산 그래프 표현은 비용함수 J J J 와 같이 특정 출력값 변수를 최적화하는 데에 유용하게 사용할 수 있다.
계산 그래프를 이용한 미분
<div class="mermaid">
graph LR
A([a = 3]) --> V[V = a + u = 11]
B([b = 3]) --> U[u = bc = 6]
C([c = 2]) --> U
U --> V
V --> J[J = 3v = 33]
</div>
다음과 같은 계산 그래프가 있을 때, d J d v \frac {dJ}{dv} d v dJ 는 3임을 쉽게 확인할 수 있다. 이는 J J J 에서 v v v 로 역전파한 것이라고 볼 수 있을 것이다. 또, d J d a = 3 \frac {dJ}{da} = 3 d a dJ = 3 인 것도 쉽게 확일 할 수 있을 것이다. 이는 연쇄법칙으로 다음과 같이 표현 가능하다.
d J d a = 3 = d J d v d v d a \frac {dJ}{da} = 3 = \frac {dJ}{dv} \frac{dv}{da} d a dJ = 3 = d v dJ d a d v
이는 J → v J \rightarrow v J → v 의 역전파가 a a a 에 대한 역전파(미분계수 구하기)에 도움을 준다는 것이다.
실제 코드로 이를 표현할 때 매번 d J d a \frac {dJ}{da} d a dJ 으로 이름을 붙이는 것은 복잡해지므로, 이를 간략하게 d a da d a 라고 표현하기도 한다.
b , c b, c b , c 에 대해서도 연쇄법칙으로 역전파를 통해 미분계수를 구할 수 있다.
d J d b = d J d u d u d b = 3 c = 6 \frac {dJ}{db} = \frac {dJ}{du} \frac{du}{db} = 3c = 6 d b dJ = d u dJ d b d u = 3 c = 6
이와 같이 도함수를 구할 땐 전방향 전파와 반대방향으로 역전파하여 도함수를 구한다.
로지스틱 회귀의 경사하강법
로지스틱 회귀는 다음 계산 그래프로 표현 가능하다.
<div class="mermaid">
%%{ init: { 'flowchart': { 'curve': 'linear' } } }%%
flowchart LR
X1([X1]) --> Z[w_1x_1 + w_2x_2 + b]
W1([w1]) --> Z
X2([X2]) --> Z
W2([w2]) --> Z
B([b]) --> Z
Z --> Y[y = a = 6]
Y --> L[L]
</div>
역전파를 통해 d w 1 dw_1 d w 1 , d w 2 dw_2 d w 2 를 구할 수 있다.
d w 1 = ∂ L ∂ w 1 = ∂ L ∂ z ∂ z ∂ w 1 = x 1 dw_1 = \frac {\partial L}{\partial w_1} = \frac {\partial L}{\partial z} \frac {\partial z}{\partial w_1} = x_1 d w 1 = ∂ w 1 ∂ L = ∂ z ∂ L ∂ w 1 ∂ z = x 1
d w 2 = ∂ L ∂ w 2 = ∂ L ∂ z ∂ z ∂ w 2 = x 2 dw_2 = \frac {\partial L}{\partial w_2} = \frac {\partial L}{\partial z} \frac {\partial z}{\partial w_2} = x_2 d w 2 = ∂ w 2 ∂ L = ∂ z ∂ L ∂ w 2 ∂ z = x 2
m개 샘플에 대한 경사하강법
오차함수는 다음과 같이 정의된다.
J ( w , b ) = 1 m ∑ i = 1 m L ( y i ^ , y i ) J(w,\ b) = \frac {1}{m} \sum_{i = 1}^m L(\hat {y_i}, y_i) J ( w , b ) = m 1 i = 1 ∑ m L ( y i ^ , y i )
따라서 ∂ ∂ w 1 J ( w , b ) \frac {\partial}{\partial w_1} J(w,\ b) ∂ w 1 ∂ J ( w , b ) 는 다음과 같이 표현 가능하다.
∂ ∂ w 1 J ( w , b ) = 1 m ∑ i = 1 m ∂ ∂ w 1 L ( a i , y i ) \frac {\partial}{\partial w_1} J(w,\ b) = \frac {1}{m} \sum_{i = 1}^m \frac {\partial}{\partial w_1} L(a_i, y_i) ∂ w 1 ∂ J ( w , b ) = m 1 i = 1 ∑ m ∂ w 1 ∂ L ( a i , y i )
이는 다음과 같은 파이썬 코드로 표현 가능하다.
import numpy as np
def sigmoid (x ):
return 1 / (np.exp(-x) + 1 )
J = 0 , dw_1 = 0 , dw_2 = 0 , db = 0
for i in range (m):
z = np.dot(w.T, x[i]) + b
a = sigmoid(z)
J += -(y[i] * np.log(a) + (1 - y[i]) * np.log(1 - a))
dz = a - y[i]
dw_1 += x[i][0 ] * dz
dw_2 += x[i][1 ] * dz
db += dz
J /= m
dw_1 /= m
dw_2 /= m
db /= m
이 코드는 경사하강법의 한 단계를 수행한 것으로, 경사하강법을 수행할 때는 이를 반복한다.
이런 명시적인 for문은 다소 비효율적이므로 벡터화라는 방식을 이용해 벡터화를 통해 명시적인 for문 없이 학습을 구현한다.
본 노트는 Andrew Ng의 머신러닝 수업을 정리한 것임.
Andrew Ng, Machine learning lecture, Youtube Link
이전 포스트 | 다음 포스트