머신러닝 Reboot - 개념 잡기 : 경사 하강법 2 - step 공식 이해하기


지난 시간에는 어설프게나마 경사 하강법이 왜 특성에 민감한지 그래프를 통해 알아보았다. 여전히 논리적으로 설명하기 
힘든 부분이 있어 아쉬움이 남지만 직관적으로 봤을 때도 경사 하강법을 수행하기 위해서는 일단 특성들의 스케일을 
맞추는 것이 좋다는 것은 알게 되었다.


오늘은 이어서 어떤식으로 다음 기울기를 찾아 움직이는지 그 과정을 공식을 통해 알아보자.
이번 정리는 오로지 “핸즈온 머신러닝”의 166쪽에 있는 ‘식 4-7 경사 하강법의 스텝’을 이해하기 위한 것이다.


선형 회귀 관련 공식 복습 - 가설 함수와 비용 함수


우선 복습 차원에서 선형 회귀의 가설함수와 비용 함수를 다시 한 번 보자. 여러 표현 방법이 있지만 여기서는 “핸즈온
머신러닝”에서 발췌한 내용으로 정리를 해보겠다.


먼저 가설함수를 보자. 간단한 식임에도 불구하고 다양한 표현이 존재하여 혼란을 주기 일쑤이다. 아래 표현들을 보면서
정리해보자.


선형 회귀 가설 함수그림 1


1번 같은 경우 단순 선형 회귀라고 생각하면 되겠다. 𝜭와 𝑥가 모두 스칼라인 경우인 것이다. 다시 말해 특성이 1개인
경우…


2번과 3번은 모두 다중 선형 회귀를 표현한 식이며 𝜭와 𝑿는 모두 벡터이다. 그런데 묘하게 표현이 다르다.
왜 다른지 차근차근 살펴보자.



기본적으로 벡터는 종벡터(𝑛 X 1) 형태를 취한다. 이 때 𝑛은 특성의 수이다. 우리가 이미 잘 알고 있듯이 이 식들은
가설 함수의 원래 형태인 아래의 형식을 벡터의 곱으로 표현한 것이다.


선형 회귀그림 2


이 식의 𝜭와 𝑥를 각각 벡터로 표시해보자. 벡터는 기본적으로 종벡터 형태를 취한다고 했으니 다음과 같이 표현할 수
있다(여기서 𝜭 의 0번째 요소는 편향을 의미하며 따라서 X의 0번째 요소는 항상 1이다).


그림 3


그림 3-1


그런데 𝜭와 𝑥 가 모두 𝑛 X 1벡터라고 한다면 (𝑛 X 1) ∙ (𝑛 X 1)이 되어 벡터(행렬)의 연산 법칙으로 인해 계산을 할 수 
없게 된다. 따라서 앞에 있는 𝜭를 전치행렬로 만들어 (1 X 𝑛) ∙ (𝑛 X 1)이 되게 함으로써 연산이 가능하게 만드는 것이다.
이 것이 바로 두 번째 식이다. 물론 전치행렬의 성질에 따라 다음과 같이 표현할 수도 있다.


선형 회귀 가설 함수그림 4


3번째 식은 2번째 식을 조금 더 확장한 것이라고 볼 수 있다. 2번이 식에서 𝑋는 𝑛개의 요소를 갖는 벡터였다.
이러한 식이 𝑚개, 즉 𝑛개의 특성을 갖는 샘플이 𝑚개가 있다고 보는 것이다. 따라서 이 때는 식의 결과 역시 
벡터가 되는 것이다. 즉, 3번의 식을 구성하는 각 요소는 다음의 의미가 있다(물론 이 때 편향을 생각하여
𝑋 행렬의 1열은 모두 1로 채워져야 한다).


그림 5


그림 6


그림 3


여기에서 식은 2가지로 표현이 가능하다 𝑋를 𝑛 X 𝑚 행렬로 만든다면 식은 2번의 식과 동일한 형태가 만들어질
것이다. 이렇게 본다면 2번의 식이 가장 일반적인 선형 회귀의 가설함수라고 볼 수 있을 것이다. 그리고 이 식을
선형 회귀의 비용 함수에 대입하게 되면 아래와 같은 비용 함수의 식이 만들어진다.


선형 회귀 비용 함수그림 7


하지만 𝑋를 𝑚 X 𝑛 행렬로 만든다면 3번의 식이 된다. 이 3번의 식은 곧이어 설명할 경사 하강법의 step을
계산하는 공식에 등장하게 된다.


배치 경사 하강법


경사 하강법은 가중치 𝜭의 변화에 따라 비용 함수의 결과가 얼마나 바뀌는지를 확인하는 연속되는 과정이고
이를 알기 위해서는 비용 함수를 𝜭에 대해 미분해야 한다. 위에 언급한 그림7의 비용 함수를 𝜭에 대해 미분하면
다음과 같은 식을 얻을 수 있다(이 과정에서도 변형이 있는데 식 맨 앞의 2/m에서 2를 없애기 위해 미리 비용 함수에
1/2를 곱하는 경우도 있다. 이런 경우 2/m이 아닌 1/m이 된다).


선형 회귀 비용 함수의 편도함수그림 8


우리는 수알못이니 이 과정을 잠깐 설명하면 우선 미분의 성질 중 다음 성질을 알아야 한다. 바로 미분의 연쇄법칙이다.


 (f(g(x)))'=f'(g(x))g'(x)


미분의 연쇄법칙을 적용해보자면 선형 회귀 비용 함수는 다음과 같이 구성되어있다.


미분의 연쇄법칙그림 9


따라서 차례차례 미분을 해보면 다음과 같이 풀이될 수 있다.


미분의 연쇄법칙그림 10


이와 같이 선형 회귀의 비용 함수에서 𝜭에 대해 미분한 도함수는 그림8의 식이 되는 것이다. 이 도함수는 곧 비용 함수의
기울기를 의미하므로 경사 하강법은 이 도함수의 변화를 이용여 최솟값을 찾는 과정이고, 이는 초깃값으로 주어진 𝜭0에서 
학습률과 비용 함수의 도함수를 곱한 값을 빼서 다음 𝜭1를 구하고 다시 이 𝜭1에서 학습률과 비용 함수의 도함수를 곱한 
값을 빼서 𝜭2를 구하는 식으로 이 과정을 반복해 나가는 것이다.


이 과정에서 비용 함수의 도함수를 그대로 사용하는 경우도 있지만 식의 단순화를 위해 이 비용 함수의 도함수의 변화량을
행렬식으로 만들어 한방에 처리하는 방법도 있다. 이 것은 얼마전 포스팅한 정규방정식 관련 글에서 언급했듯이 𝚺는 
행렬로 변환 가능하다는 것으로 설명할 수 있다.


비용 함수의 도함수를 풀어보면 다음과 같다.


선형 회귀 비용 함수의 도함수그림 11


여기서 괄호 안에 있는 각 요소의 점곱(∙)을 기준으로 앞뒤로 분리를 하면 각각 다음과 같은 종벡터를 만들 수 있다.


그림 12


그림 13



각각의 종벡터는 m X 1 형태의 종벡터로 그대로는 곱셈이 성립하지 않으므로 𝑋가 요소인 종벡터를 전치시켜서
1 X m 형태의 횡벡터를 만들어 곱하면 동일한 식이 된다.


그림 14


그림 15


이제 마지막으로 𝜭가 포함된 종벡터를 풀이해보자. 이 종벡터는 다시 아래와 같이 나눠볼 수 있다.


그림 16


여기서 다시 뺄셈 식의 앞부분을 생각해보면 𝑋(i)는 특성 수만큼의 요소를 갖는 벡터들이다. 즉 m행 n열의 행렬이
되는 것이다.


그림 17


하지만 이렇게 되면 𝜭T는 1 X n의 벡터이고 𝑋는 m X n의 행렬이 되어 곱셈식이 성립되지 않는다. 따라서 𝜭T를
다시 전치시켜 n X 1의 종벡터를 만든 후 𝑋 뒤에 곱하면 m X n 행렬과 n X 1 벡터의 곱이 성립된다. 이렇게하여
최종적으로 정리된 선형 회귀 비용 함수를 𝜭에 대해 미분한 도함수의 변화량은 다음과 같이 표현할 수 있다.


그림 18


그리고 경사 하강법의 STEP을 구하는 공식은 아래와 같다.


경사 하강법의 step 계산 공식그림 19


정리


여전히 수학은 어렵다. 나름 치환과 간략화에 주의하면서 각종 공식을 이리 저리 변형시켜가면서 이해하려고 하지만
깔끔하게 정리되지 않는 것은 어쩔 수가 없다. 일단 오늘의 소득이라면 행렬을 횡벡터를 요소로 갖는 종벡터로 생각
하면 조금 더 쉽게 이해되는 경우가 있다는 것 정도…


오늘의 주된 내용은 “핸즈온 머신러닝”의 166쪽에 있는 ‘식 4-7 경사 하강법의 스텝’에 대한 풀이였는데 사실 책을
보면 여전히 이해되지 않는 부분이 있다. 165쪽에 있는 식 4-5 비용 함수의 편도함수 식에서 j의 의미를 잘 모르겠다.
얼핏 봤을 때 특성의 수를 의미할 것 같은데…그리고 괄호 안의 x와 괄호 밖의 x가 다르게 표기된 부분도 잘 이해가
안간다. 이렇게 기호 하나가 추가되는 것만으로도 풀이가 안드로메다로 향하는 것을 보면 아직도 한참 멀었다…ㅠ.ㅠ


일단 내가 정리한 식도 얼추 앞뒤가 맞아 들어가는 것 같으니 우선 오늘의 정리는 마무리 하고 다음 포스팅에서는
여기서 정리한 식을 바탕으로 코드를 통해 배치 경사 하강법, 확률적 경사 하강법, 미니 배치 경사 하강법에 대해
알아보도록 하겠다.


피곤하다…ㅠ.ㅠ

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^



머신러닝 Reboot - 개념 잡기 : 경사 하강법 1 - 특성의 scale


새롭게 시작하는 머신러닝 학습은 기존에 진행하던 학습에서 장애가 되었던 용어와 공식에 대한 몰이해를 극복하고자
진행하려고 한다. 다시 말해 직관적으로는 이해가 가지만 논리적으로 설명할 수없는 개념을 논리적으로 설명 가능하도록
정리해보고자 하는 것이다.


따라서 전체적으로 연관성을 가지고 이어지는 내용이라기 보다는 단편적인 용어의 정의나 공식의 풀이를 중심으로 
하면서 관련 내용을 정리하는 방식으로 진행이 될 것이다. 


이렇게 정리할 대상은 주로 ’핸즈온 머신러닝’이라는 책을 읽으면서 이해가 안가는 부분들을 대상으로 풀이할 것이며
전체적인 순서 역시 ‘핸즈온 머신러닝’의 목차를 따를 것이다. 


들어가는 말


지난 시간에는 선형 회귀 분석의 비용함수로부터 가중치(𝜽 또는 W)의 최솟값을 한방에 알아낼 수 있는 정규방정식
대해 알아보았다. 미분 등 복잡한 계산이 필요 없고 학습률같은 하이퍼파라미터를 관리할 필요가 없으며 또 빠른 예측이
가능하다는 장점이 있지만 특성 수가 늘어남에 따라 속도가 많이 느려지는 단점이 있었다.


오늘은 정규방정식의 단점을 해결할 수 있는, 다시 말해 특성 수에 관계 없이 일정 수준의 성능을 보장해주는 
경사하강법애 대한 내용 중 특성의 스케일에 대해 알아보려고 한다. 


경사하강법은 대체로 특성의 스케일에 민감한 것으로 알려져 있으며 일반적으로 아래 그래프로 그 사실을 설명한다.


핸즈온 머신러닝 발췌핸즈온 머신러닝 발췌

오늘은 경사하강법이 특성에 민감하다는 것을 예제 코드를 통해 조금 더 직관적으로 설명을 하고자 한다. 
사실 논리적으로 증명을 하고싶었으나 역시 나의 실력으로는 역부족이었다. 이 내용과 위의 그래프를 이해하지
못하여 이 포스팅을 준비하는데 무려 3주가 걸겼다…ㅠ.ㅠ


게다가 내가 그간 얼마나 공부를 설렁설렁 했는 지 이번 기회에 알게 되었다. 그동안 나는 선형회귀의 비용함수와 
경사하강법을 동일시 하여 생각했던 것이다. 서로 다른 함수를 동일하다고 생각하고 분석하고 있었으니 답이
나올리가 있나…-.- 겨우 최근에야 경사하강법은 특정 함수(특히 convex 함수)의 최적값을 찾아낼 수 있는
일반적인 알고리즘이라는 말을 이해하게 되었다.


다시 말해 경사하강법은 선형회귀의 비용함수 뿐만 아니라 볼록(또는 오목)한 그래프가 그려지는 함수라면 어떤
함수이든 그 최저점을 찾아낼 수 있는 방법이라는 것이다.


지금부터 코드를 통해 이 내용을 간단히 살펴보자. 너무 간단해서 들어가는 말보다 본문이 짧을지도…-.-


Python 코드로 보는 경사 하강법


이 내용의 원본 소스 출처는 다음과 같다.


https://github.com/shuyangsun/Cost-Function-Graph


이 원본 소스 중 non-convex 함수들에 대한 내용은 제거 하고 convex 함수에 대한 내용만을 남겨 확인해보았다.


일반적으로 특성이 2개인 함수까지는 시각화(그래프로 표현)할 수 있다. 이 부분은 내가 처음 머신러닝을 공부한다고
정리를 하면서 다항로지스틱으로 넘어갈 때 꽤나 답답해 했던 부분이기도 하다. 특성이 2개인 경우까지는 시각화가
가능해서 직관적으로 이해를 할 수 있었는데 특성이 3개 이상 되니 복잡한 수식만으로는 도무지 이해가 가지 않는
것이었다…ㅠ.ㅠ


여전히 특성이 3개 이상인 경우는 이해가 힘들기 때문에 오늘은 특성이 2개인 케이스를 대상으로 설명을 해보겠다.


이 코드에서 사용할 함수는 비용함수는 아니고 f(a,b) = a^2 + b^2 이라는 함수이다. 이 함수가 표현하는 범위를
3차원 그래프로 그려보고 그 범위 안에서 경사하강법이 어떤 경로로 최저점을 찾아가는지 보여주는 것이 아래의
코드이다.


import numpy as np
import matplotlib.pyplot as plt
import math
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

def f(a,b):
	return a**2 + b**2

먼저 필요한 라이브러리들을 import하고 경사하강법을 통해 최저점을 찾아낼 대상 함수 f를 정의했다.


def gradient_descent(theta0, iters, alpha):
	history = [theta0] # to store all thetas
	theta = theta0     # initial values for thetas
	# main loop by iterations:
	for i in range(iters):
		# gradient is [2x, 2y]:
		gradient = [2.0*x for x in theta] #함수 f(x,y)의 미분
		# update parameters:
		theta = [a - alpha*b for a,b in zip(theta, gradient)]
		history.append(theta)
	return history

history = gradient_descent(theta0 = [-1.8, 1.6], iters =30, alpha = 0.03)


다음으로 경사하강법을 함수로 정의하고 호출하여 그 결과를 history에 저장을 한다. 경사하강법의 다음 스텝을 결정하는
일반식은 다음과 같으며 이를 python 코드로 구현한 것이다.




경사하강법을 구현한 함수는 파라미터로 특성의 초깃값과 반복 횟수 그리고 학습률을 전달받는다. 이 코드에서 초깃값은 각 특성의 max에 가까운 값으로 정했다.


# f(x,y) = x^2 + y^2 함수의 그래프 그리기 fig = plt.figure(figsize=(20, 15)) ax = fig.gca(projection='3d') #plt.hold(True) a = np.arange(-2, 2, 0.25) b = np.arange(-2, 2, 0.25) a, b = np.meshgrid(a, b) c = f(a,b) surf = ax.plot_surface(a, b, c, rstride=1, cstride=1, alpha=0.3, linewidth=0, antialiased=False, cmap='rainbow')



주석된 내용처럼 f 함수가 표현하는 함수의 범위를 3차원으로 그려주는 코드이다. 특성 a와 b 모두 -2부터 2 사이의 값을
가지며 0.25씩 증가 하도록 값을 주었다. 함수가 a^2 + b^2이기 때문에 최솟값 0부터 최댓값 8까지의 그릇 모양으로
그래프가 표시된다.


a = np.array([x[0] for x in history])
b = np.array([x[1] for x in history])
c = f(a,b)
ax.scatter(a, b, c, color="r"); 

print(c)

plt.xlabel('Feature A')
plt.ylabel('Feature B')

plt.axis('equal')

plt.show()


이제 마지막으로 이전에 그려진 그래프 내에서 경사하강법을 통해 산출한 위치를 표시해준다. 특성이 2개이기 때문에
각각의 특성에 경사하강법을 적용한 결과를 그래프에 그려보면 최종적으로 아래와 같은 그래프를 볼 수 있다.



이 때 a = np.arange(-2, 2, 0.25)의 범위를 a = np.arange(-10, 10, 0.25)로 늘리게 되면 그래프의 형태가
오목한 그릇 형태가 아닌 u자 모양으로 휘어진 판자의 형태가 된다.



이런 상황에서는 가중치의 초깃값이 커질 수 있고 초깃값이 커지면 최솟값을 찾는데 그만큼 더 시간이 오래 걸리게 되며 이는 곧 특성값의 스케일 차이가 크게 되면 경사하강법의 성능이 나빠지게 된다고 볼 수 있는 것이다. 또한 내가 제대로 
이해하고 있는지 모르겠으나 이 그래프 표현만 놓고 보면 단지 두 개의 특성간에 스케일의 차이가 있을 때 뿐만 아니라 
두 특성의 스케일이 동일하더라도 그 규모가 커지면(예를들어 a와 b의 범위가 모두 10인 경우와 모두 100인 경우)
이 때 역시 경사하강법의 성능이 나빠져 더 많은 횟수를 진행해야 최솟값에 가까워지게 된다.


정리


앞서도 말했지만 이 부분을 이해하기 위해 장장 3주 이상이 걸렸다. 그러다가 위의 python 코드를 발견했고 처음 코드를
실행해봤을 때는 ‘유레카’를 외쳤지만 지금 다시 찬찬히 살펴보는 과정에서는 또 수많은 의문들이 일어나면서 내가 
제대로 이해한 것이 맞는지 알 수 없게 되었다…ㅠ.ㅠ 일단 직관적으로 생각했을 때 작은 수를 계산할 때보다 큰 수를 
계산할 때 더 많은 자원이 필요한 것은 당연한 것이니 특성의 스케일이 크면 그만큼 연산이 오래 걸린다고 보면 될 것이나
역시 완전한 이해는 되지 못한다.


더 나은 해법을 찾다가 contour라는 등고선 형태의 그래프를 그리는 방법이 있다는 것을 알아냈고 이 그래프가 위에
언급한 핸즈온 머신러닝의 그래프와 유사해서 더 설명하기가 좋지 않을까 생각했으나 실제 코드에 적용하는 방법을
몰라 이번 포스팅에서는 다루지 못했다. 시간 날 때 다시 정리를 해봐야겠다.


다음 시간에는 경사하강법의 3가지 종류(배치 경사하강법, 확률적 경사하강법, 미니 배치 경사하강법)에 대해 간단하게
정리해보겠다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


2003년경 처음 나왔던 강철의 연금술사를 보았더랬다. 그리고 2009년에 나온 강철의 연금술사:브러더후드를 그저 2003년판의 리메이크일 것이라고

지레 짐작하고 보지 않다가 얼마전 넷플릭스 강제 결재 당하고난 이후 보게 되었다. 넷플릭스 덕분에 우선 죽지 않는 자 아인을 재밌게 봤었는데 그 뒤로 

마땅히 땡기는 것이 없던 차에 눈에 띄어 보게 된 것이다.


초반부가 2003년 판과 거의 비슷해 조금 지루해질 무렵부터 새로운 내용이 전개되니 몰입도가 장난이 아니었다. 새로운 인물들도 매력이 있었고 

툭툭 던지는 개그도 위화감 없이 잘 어우러진 것 같다. 2003년판 2009년판이 모두 명작의 반열이라는데 이의를 달 수가 없었다.


2003년에 볼 때에도 '등가교환'이라는 개념이 꽤나 매력적이었다.

사실 예전부터 생각해온 바지만 세상이 좋아지는 데는 공정한 것 만한 것이 없다고 생각한다. 한 일만큼 보상을 받고 저지른 잘못만큼 벌을 받는...

하지만 세상에서는 그 당연한 것들을 쉽게 볼 수 없다.


물론 자연 법칙으로서의 등가교환 - 질량 보존의 법칙 같은 것? -은 있지만 그 것이 인간 사회로 나오면 근본적으로 등가교환이긴 한데 방향이 달라진다. 

즉, 버는 놈 따로 갖는 놈 따로라는 것...-.-


암튼 잘 먹고 잘 살자!

연금술이 뭐 따로 있나. 잘 먹고 잘 싸는 것도 훌륭한 연금술 아닌가? 덤으로 배까지 나오고...-.-

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


인공지능 공부해보겠다고 설레발치기 시작한 것이 어언 2년여가 다되간다.

그간 나름 책도 좀 보고 동영상 강좌도 좀 보고...페이퍼나 논문은 하나도 안보고...ㅠ.ㅠ


그간 읽은 책들과 읽는 중인 책 그리고 읽기 위해 사놓은 책을 좀 정리해보면


읽은 책

텐서플로우 첫걸음
골빈해커의3분 딥러닝
머신러닝 워크북
밑바닥부터 시작하는 딥러닝

읽는 중인 책

핸즈 온 머신러닝
머신러닝 탐구생활


읽다가 보류한 책

강화학습 첫걸음
기초 수학으로 이해하는 머신러닝 알고리즘
처음 배우는 딥러닝 수학
프로그래머를 위한 선형대수


사놓기만 한 책

머신러닝 실무 프로젝트
딥러닝의 정석
러닝 텐서플로우
머신러닝 딥러닝 실전 개발 입문




하지만 공부를 해 가면 해 갈수록 궁금한 것은 더 많아지고 이제는 과연 내가 뭔가를 이해 하고는 있는 건가 하는 생각에

자괴감이 들기 시작했다. 똑같은 내용을 공부하고 있는데 볼수록 새로운 느낌?


결국 자괴감을 이기지 못하고 처음부터 다시 시작하는 길을 선택했다. 처음 시작부터 이해하지 못하고 넘어간 부분들을

차근차근 정리하고, 이해하고 넘어가야 할 것 같아서...(그런 의미에서 현재 읽고있는 2권의 책은 꽤 도움이 되는 것 같다)


특히나 전반적으로 내용을 이해하지 못하게 하는 주된 이유 중 하나가 어려운 용어들과 복잡한 공식들이기도 하고 

머신러닝의 기초가 되는 선형 회귀 등을 제대로 이해하지 않고 겁대가리 없이 덥썩 딥러닝으로 직행한 무모함도 충분히 

일조를 했기에 다시 처음부터 하나 하나를 정리하는 것으로부터 시작하기로 했다. 그리고 


패배적인 자기 만족일지는 모르겠으나 어차피 이 공부는 내가 이 분야의 전문가가 되기 위한 것이라기 보다는 나의 지적 만족을

위한 것이니 쉬엄쉬엄 간들 어떠랴 싶다. 태공망 여상은 나이 80에 주문왕을 만나 그 재능을 펼치기 시작했다는데 그렇다면

나에게는 아직 30년이란 시간이 남은 것 아닌가(뜻밖의 나이 공개가...ㅠ.ㅠ)


느려도 황소 걸음이랬으니 차분하게 한걸음 한걸음 가보자.

그 시작은 정규 방정식이다.


정규방정식

사실 그동안 비용함수를 최소화 하는 가중치를 찾기 위한 방법으로 경사하강법만을 알고 있었는데 이번에 핸즈 온 머신러닝을

읽으면서 처음 정규방정식이란 것이 있다는 것을 알게 되었다.


문제는 이 정규방적이라는 것이 행렬식으로 표현이 되어있어 문돌이의 사고방식으로는 이 것이 어떻게 경사하강법과 동일한

기능을 하게 되는지 이해가 가지 않는 것이었다. 그래서 새로운 시작의 첫 출발을 단순 선형회귀의 비용함수로부터 정규방정식을

도출하는 과정을 정리해보고자 한다.



선형 회귀 비용함수로부터 정규방정식 도출하기


복습

선형회귀의 가설함수 식에서 편향을 제거하자. 방법은 그냥 b = 0으로 초기화 하는 것이다.




    •비용함수도 다시 한 번 확인하자.



















사전 확인1 - ∑를 행렬로



∑ 로 표현되는 제곱의 합은 그 수들을 요소로 하는행렬과그 행렬의 전치행렬의 곱과 같다(복잡하니
1
행짜리 행렬로 확인해보자).




















사전 확인2전치행렬의 성질


     •전치행렬은 다음과 같은 성질이 있다.




























우선 cost함수는 W에 대한 함수이므로 함수 표기를 바꿔보자(함수명MSE는 최소제곱법의 영문 표기인 Mean Square Error의 약어이다).

이제 명확하게 이 함수는 x와 y에 대한 함수가 아니라 W에 대한 함수로 보일 것이다.









함수는W에 대한 함수인데 정작 함수 식에는 W가 안보이니 내부 함수도 원래대로 치환하자.






















사전 확인한 내용을 상기하면서 번 식으로 변환해보자
전치행렬의 성질에 따라 번 식으로 전개할 수 있다.
W를 포함한 식들을 다시 정리하면 번 식이 된다.
다시 한 번 전치행렬의 성질에 따라 식을 전개하면 번 식이 된다.
이 변형은 최초의 시그마 식을 전개해서 진행해도 동일한 결과가 나온다.






최종 정리된 식은 과 같고 이제 이 값을 미분하여비용함수가 최솟값을 갖는 W를 찾을 것이다.

비용함수가 최솟값을 갖기 위해서는 비용함수를 미분한 값이 0이 되어야 한다.
미분 과정을 명확하게 하기 위해 식을 한 번 정리해 주자(식 ).주의할 것은 W에 대해 미분한다는 점이다.
행렬 A에 대해 자신과 자신의 전치행렬과의 곱은제곱과 같다고 했다.그리고 전치행렬의 성질에 따라W와 X의 곱의 전치행렬은 X의 전치행렬과 W의 전치행렬의 곱과 같다(W와 X의 순서가 바뀜에 주의).




이제 거의 다 왔다.
미분한 함수는 식 와 같고 이제 
거추장스러운1/m도 없앨 수 
있다(사실 진작에 1/m을 없애고
보다 깔끔하게 식을 전개할 수도 
있었으나 나같은문돌이는 갑자기 
저런거 하나 없어져도 극도의
멘붕에 시달릴 수 있기에 끝까지 
가져왔다-.-).










최종 미분식을 W에 대해 정리해보자.
    •이렇게 해서 단순 선형 회귀의 비용함수로부터 정규방정식을 도출해보았다.













선형 회귀 비용함수로부터 정규방정식 도출하기2



정규방정식은 다른 형태로도 
도출할 수 있다우선 최초의 
식을 전개해보자.














이후 전개한 식을 W에 대해 미분한다.














최종 정리한 후 시그마를 
행렬로 변환해보자














하지만 아직 이해하지 못한 것이 하나 있다.
가설함수에서 편향을 제거하지않고 WX + b의 형태로 이 과정을 진행하게 되면 최종 정규방정식은 좌측과 같이 나온다.이 것이 앞서 도출해본 정규방정식과 동일한 식이란 것을 문돌이의 두뇌로는 이해하기 힘들다.ㅠ (분모와 분자 각각 - 뒤에 붙어있는 값들은 대체 어쩔...ㅠ.ㅠ)






일단 정규방정식은 좌측의 식으로 

알아두자

정규방정식은 행렬식으로 경사
하강법에 비해 많은 연산량이 필요
하지도 않고 학습률 설정 등
골치아픈 하이퍼파라미터의 
설정을 신경쓰지 않아도 된다.
하지만 행렬 연산이다보니 특성의 
수가 늘어나면 계산속도가 많이 
느려지게 된다.다만 샘플 수에 
대해서는 선형적으로 비례한다고 
한다.
또한 정규방정식으로 학습된 선형 
모델은 예측이 매우 빠르다고 한다
(핸즈 온 머신러닝)



정리


이렇게 해서 새롭게 시작하는 인공지능 학습의 첫 단추를 꿰었다. 하지만 이렇게 차근차근 분석을 하면서도 여전히

어떤 부분에 대해서는 완전하게 이해하지 못한 채 그저 직관적인 이해로 두루뭉술하게 넘어가고 있는 상황이다.

사실 이러한 상태가 가장 환장하는 상태이다. 전체적인 흐름은 대충 이해가 가는데 어떤 디테일한 부분에서

뭔가 막혀있는 듯한 느낌...



첫 대상인 정규방정식도 정리를 하고 보니 아직은 부족한 상태라는 것을 알게 되었다.

이러한 과정이 큰 도움이 되는 것 같다.


아무튼 이번에는 용어 하나, 공식 하나도 집중해서 보면서 차근차근 진행을 해나가 보자. 

머신러닝 reboot는 이제 시작이다!




블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


본방 사수는 못하고 최근에 케이블에서 미스터 선샤인을 몰아보게 되었다.

나는 이렇게 가끔씩 온 가족이 함께 모여 하루에 한두편 지나간 드라마를 함께 보곤 한다.

대장금, 허준, 응팔, 뿌리깊은 나무, 도깨비, 그리고 이번에 미스터 선샤인...(그동안 꽤 많이도 봤네...)


나는 가끔 이렇게 큰 이슈가 되는 드라마나 영화를 볼 때는 스포일러에 상관없이 평가를 먼저 본다.

뭔가 문제가 되는 부분이 있다면 적어도 그 것을 의식하고는 봐야 하지 않을까 하는 생각에서다.

특히나 미스터 선샤인은 우리 민족에게 있어 역사적으로 중요한 시대를 배경으로할 뿐만 아니라

그 시대의 영향이 현대에도 미치고 있기에 그냥 재밌게만 볼 수는 없었다.


아니나 다를까 찾아본 평가들 중 이 드라마의 역사 왜곡에 대해 비판적인 글들이 꽤 많았다.

중요한 대목을 들어보면 친일파의 나타난 시점의 오류와 드라마 전반에서 일본의 침략성보다는

조선인이 자발적으로 일본을 불러들인 듯한 전개 왜곡된 부분으로 지적되었고 특히나 이러한

내용들이 이미 역사를 잘 이해하고 있는 대한민국 성인인 경우에는 크게 문제되지 않겠지만

아직 역사를 잘 모르는 어린 아이나 Netflix라는 서비스를 통해 전세계 국가에 방영된다는 점을

놓고 보면 그냥 가볍게 넘길만한 일은 아닐 것이다.


결국 황당한 일이 일어났으니...

몇화에선가...구동매가 잡았다가 놓아준 의병으로부터 총에 맞았다.

그런데 우리 가족 모두는 구동매를 불쌍하다고 하면서 의병 나쁜 놈이라는 말까지 내뱉었다.

그 의병이 개인적인 이익을 위해 그러한 것이 아님에도 우리 가족에게 그 의병은 졸지에 나쁜놈이

되어버린 것이다 (백번을 용서해 구동매를 김동인의 붉은 산에 나오는 삵과도 비교해볼 수 

있겠으나 역시 그건 아닌 것 같다...-.-).


하물며 역사적 인식이 희박한 사람이거나 외국인이 이 드라마를 본다면 어떤 생각을 갖게 될지...


물론 조선이 잘못한 것도 많다. 하지만 분명 일본인 대한제국을 침탈한 원흉이고 대한제국의 

지위고하를 막론하고 모든 민족의 적이었던 것이다. 일본보다 자기 민족을 배반한 변절자를 더

미워하게 되는 상황은 일제시대에 이미 일본이 써먹었던 방법 아닌가...(물론 반민족행위자를

용서해주자는 말은 아니다).


암튼 재미는 있었지만 그저 재밌게만 볼 수 있는 드라마는 아니었다.


블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^