EunGyeongKim

지도학습 : 회귀(Regression)_1차원 데이터 선형모델 매개변수의 해석해 (2) 본문

ML & DL/딥러닝

지도학습 : 회귀(Regression)_1차원 데이터 선형모델 매개변수의 해석해 (2)

EunGyeongKim 2023. 2. 22. 14:03

이전에 공부했던 내용과 이어집니다.(링크)

 

지도학습 : 회귀 (Regression)

지도학습은 회귀(Regression)와 분류(Classification)로 나눌수 있음. 회귀 : 입력에 대해 연속적인 값을 대응시키는 문제. 분류 : 입력에 대해 순서가 없는 클래스(라벨)을 대응시키는 문제 1차원 입력

eungyeong-kim.tistory.com

경사하강법은 반복계산에 의해 근사값을 구하는 수치 계산법 (수치해, Numerical Analysis)

직선모델의 경우에는 근사적인 해석이 아니라 방정식을 해결하여 정확한 해를 구할 수 있음( = 해석해, analysis : 해석적(analytic)으로 풀이가 가능한 해)

해석해를 도출하면 문제의 본질을 잘 이해할 수 있고, 다차원데이터에 대응하며, 곡선모델로 확장하기 좋고, 커널법 등의 이해를 도와줌


목표는 'J가 극소화 되는 지점 w를 찾기'. 그 지점의 기울기는 0이므로 기울기가 0이되는 지점 w를 찾으면 됨. w는 '∂J / ∂w0 = 0' 과, '∂J/∂w1 = 0' 을 충족하는 w0, w1을 찾으면 됨. 

w0, w1의 편미분 부분 식

$$\frac{\partial J}{\partial w_0} = \frac{2}{N}\sum_{n=0}^{N-1}(w_0x_n + w_1 - t_n)x_n = \frac{2}{N}\sum_{n=0}^{N-1}(y_n - t_n)x_n$$

$$\frac{\partial J}{\partial w_1} = \frac{2}{N}\sum_{n=0}^{N-1}(w_0x_n + w_1 - t_n) = \frac{2}{N}\sum_{n=0}^{N-1}(y_n - t_n)$$

위 식을 0으로 한 식에서 출발하겠음. 

$$\frac{\partial J}{\partial w_0} = \frac{2}{N}\sum_{n=0}^{N-1}(w_0x_n + w_1 - t_n)x_n = 0$$

$$\frac{\partial J}{\partial w_1} = \frac{2}{N}\sum_{n=0}^{N-1}(w_0x_n + w_1 - t_n) = 0$$

w0 편미분 부분 식을 2로 나눔

$$\frac{1}{N}\sum_{n=0}^{N-1}(w_0x_n + w_1 - t_n)x_n = 0$$

합의 기호를 각 항에 전개하면 다음과 같음

$$\frac{1}{N}\sum_{n=0}^{N-1}w_0x_n^2 + \frac{1}{N}\sum_{n=0}^{N-1}w_1x_n - \frac{1}{N}\sum_{n=0}^{N-1}t_nx_n = 0$$

1항의 w0는 n과 관계가 없기 떄문에 합의 기호 바깥으로 꺼낼 수 있음. 2항의 w1도 n과 관계가 없는 상수이므로 이것 또한 합의 기호 바깥은로 꺼낼 수 있음. 결과적으로 다음 식과 같음. 

$$w_0\frac{1}{N}\sum_{n=0}^{N-1}x_n^2 + w_1\frac{1}{N}\sum_{n=0}^{N-1}x_n - \frac{1}{N}\sum_{n=0}^{N-1}t_nx_n = 0$$

1항의 합의 기호는 입력데이터 x의 제곱의 평균, 2항은 입력 데이터 x의 평균, 3항은 목표 및 입력데이터의 곱의 평균을 나타냄. 이를 다음과 같이 나타낼 수 있음

$$<x^2> = \frac{1}{N}\sum_{n=0}^{N-1}x_n^2, <x> = \frac{1}{N}\sum_{n=0}^{N-1}x_n, <tx> = \frac{1}{N}\sum_{n=0}^{N-1}t_nx_n$$

일반적으로 <f(x)>로 f(x)의 평균을 나타냄. 그러면 다음식으로 나타낼 수 있음

$$w_0<x^2>+w_1<x>-<tx> = 0$$

같은 방법으로 w1의 편미분을 정리하면 다음과 같음

$$w_0<x>+w_1-<t> = 0$$

이후에 연립방정식으로 w0과 w1을 구함. w1을 정리한 식을 변경하여 w0에 대입하여 'w0 = 0' 모양으로 정리.

$$w_1 = <t>-w_0<x>$$

그럼 다음과 같은 식을 얻음 (식 1)

$$w_0 = \frac{<tx>-<t><x>}{<x^2>-<x>^2}$$

이 w0를 사용하여 w1도 구할 수 있음 (식2)

$$w_1 = <t>-w_0<x>$$

$$= <t> - \frac{<tx>-<t><x>}{<x^2>-<x>^2}<x>$$

식1, 식2는 w의 해석해임. <x^2>와 <x>^2는 서로 다른수치임으로 주의!  <x^2>는 x^2의 평균, <x>^2은 <x>의 제곱

입력데이터 x, 목표데이터 t 값을 식에 넣어 w를 찾아보면 다음과 같은 결과가 얻어짐

# 해석해
def fit_line(x, t):
    mx = np.mean(x)
    mt = np.mean(t)
    mtx = np.mean(t*x)
    mxx = np.mean(x*x)
    w0 = (mtx - mt * mx) / (mxx - mx**2)
    w1 = mt - w0 * mx
    return np.array([w0, w1])

# main
W = fit_line(x, t)
print("w0={0:.3f}, w1={1:.3f}".format(W[0], W[1]))
mse = mse_line(x, t, W)
print("SD={0:.3f}cm".format(np.sqrt(mse)))
plt.figure(figsize = (4,4))
show_line(W)
plt.plot(x, t, marker='o', linestyle='None', color='cornflowerblue', markeredgecolor = 'black')
plt.xlim(x_min, x_max)
plt.grid(True)
plt.show()

즉, 직선으로 피팅한다면 해석해를 도출해 낼 수 있으므로 경사하강법을 사용할 필요가 없음. 

경사하강법은 해석해가 구해지지 않는 모델에서 힘을 발휘함.

전체 코드(https://github.com/EunGyeongKim/Machine-learning/blob/main/LinearRegression_Gradient_descent.py)

 

GitHub - EunGyeongKim/Machine-learning

Contribute to EunGyeongKim/Machine-learning development by creating an account on GitHub.

github.com

 

Comments