[선택 과제 1] Gradient Descent
210804, 210807
1. Gradient Descent (1)
# https://docs.sympy.org/latest/modules/polys/domainsintro.html
>>> from sympy import Symbol, Poly
>>> x = Symbol('x')
>>> Poly(x**2 + x)
Poly(x**2 + x, x, domain='ZZ')
>>> Poly(x**2 + x/2)
Poly(x**2 + 1/2*x, x, domain='QQ')Symbol은 변수를 수식의 문자로 사용할 수 있게 끔 하는 함수이다.Poly는Symbol변수를 가지고 수식을 구성하는 함수이다.이 때 domain은 다음과 같다
ZZ : 다항식의 계수가 정수
QQ : 다항식의 계수가 유리수
# https://www.geeksforgeeks.org/python-sympy-subs-method-2/
# import sympy
from sympy import *
x, y = symbols('x y')
exp = x**2 + 1
print("Before Substitution : {}".format(exp))
# Use sympy.subs() method
res_exp = exp.subs(x, y)
print("After Substitution : {}".format(res_exp))
# Output
Before Substitution : x**2 + 1
After Substitution : y**2 + 1두 개 이상의 심볼은 공백을 두고 설정할 수 있다.
sym.subs는 기존의 다항식의 변수를 다른변수로 치환하거나 값들 대입해준다.첫번째 인자는 기존 심볼, 두번째 인자는 치환할 심볼이다.
sym.diff는 도함수를 출력한다.첫번째 인자는 다항식을, 두번째 인자는 미분할 심볼이다.
func주어진 다항식에 인자로 받은 상수를 대입한 결과와, 다항식을 반환
func_gradient인자로 받은 다항식의 도함수를 구한다. 인자로 받은 상수를 도함수에 대입한 결과와 도함수를 반환
gradient_descent반복적으로 도함수를 구해서 경사하강법을 구현한다.
이 때 시작지점
val이 학습률과 변화율을 곱한lr_rate * diff만큼씩 변화해가도록 한다특정
val에서 도함수 값이epsilon보다 작으면 반복을 끝내도록 한다.
2. Gradient Descent (2)
func1. 과 동일
difference_quotient실제 미분 공식을 반환한다.
gradient_descent1. 과 동일
3. Linear Regression
3.1. Basic function

gradient_w예측값과 실제값의 차 그리고 x의 곱을 전체 개수로 나눠준 것이 w의 그레디언트 값이다.
이 때 곱을
np.dot으로 연산해준다.np.dot(a, b)에서 a또는 b가 행벡터 또는 열벡터라면 따로 전치를 하지 않아도 된다.
각 변수의 사이즈는 다음과 같다
x: (m, n)w: (n, 1)y-wx: (m, 1)x_T: (n, m)np.dot(x_T, y-wx): (n, 1)w와 크기가 같다. 갱신가능
gradient_b: 위와 동일errorL2 norm을 이용한 에러 표현
3.2. More complicated function
expand_xwx+b꼴 대신 b를 가중치의 한 원소로 생각해서wx꼴로 표현한다.
np.dot(beta_gd, expand_x.T)wx꼴beta_gd: (1, 4)expand_x: (6, 4)
4. Stochastic Gradient Descent
np.random.choice(a, b, c)a: 무작위로 뽑을 수의 범위b: 뽑을 수의 개수c: 복원 추출 여부np.array는 그 자체로 인덱스로 사용할 수 있어서train_x[idx]와 같이 사용이 가능하다
Last updated
Was this helpful?