확률 계단 하강법의 이론 입문(실험편)
이 글에서 우리는 SGD의 이론에 초점을 맞출 것이다. SGD의 이론에서 우리는 공식적인 분석으로 얼마나 빠른 속도로 최적해에 접근할 것인가를 분석할 것이다. 이 글에서 우리는 SGD의 이론적 기초를 설명하고 프로그래밍 실험을 통해 이 이론의 정확성을 확인할 것이다.
이번에 생각한 문제.
하나의 변수의 선형 회귀를 고려합니다. 진정한 직선은 $y=3x$입니다. 거기에 약간의 소음을 타서 견본의 상황을 고려합니다.
견본에서 우리는 진정한 경사 3을 추정하는 문제를 고려한다.
import numpy as np
from scipy.stats import truncnorm
import matplotlib.pyplot as plt
true_w = 3.0
beta = 1.0
sigma = 1.0
def sample():
x = np.random.uniform(-beta,beta)
e = np.random.normal(0.0, sigma)
y = true_w*x+e
return x,y
samples = [sample() for _ in range(100)]
plt.scatter([sample[0] for sample in samples], [sample[1] for sample in samples])
plt.plot(np.linspace(-1,1), [x*true_w for x in np.linspace(-1,1)])
plt.show()
형식적으로 쓰면 아래의 설정을 고려하여 $w^*=3달러로 추정됩니다.x \sim U[-1, 1], \\
\epsilon \sim N(0, 1), \\
y = w^*x+\epsilon, w^* = 3 \\
손실 함수
$w^*=3$는 알 수 없습니다. $w$를 $w^*$에 최대한 가깝게 하는 것을 고려하십시오.
선형 회귀는 제곱 오차를 손실 함수로 합니다. $i$번째 견본을 $(x_i, y_i)$로 설정하고 손실 함수는 다음과 같습니다.l_i(w) = \frac 1 2 (wx_i - y_i)^2
쓸 수 있어요.
SGD를 사용하기 위해서는 그 경사가 필요합니다. 미분을 통해 경사는l_i^´(w) = (wx_i - y_i)x_i
나타내다def loss(w, x, y):
return (w*x-y)**2
def w_grad(w, x, y):
return 2*(w*x - y)*x
무작위 계단식 하강법(SGD)
SGD의 알고리즘은 다음과 같습니다.
import numpy as np
from scipy.stats import truncnorm
import matplotlib.pyplot as plt
true_w = 3.0
beta = 1.0
sigma = 1.0
def sample():
x = np.random.uniform(-beta,beta)
e = np.random.normal(0.0, sigma)
y = true_w*x+e
return x,y
samples = [sample() for _ in range(100)]
plt.scatter([sample[0] for sample in samples], [sample[1] for sample in samples])
plt.plot(np.linspace(-1,1), [x*true_w for x in np.linspace(-1,1)])
plt.show()
x \sim U[-1, 1], \\
\epsilon \sim N(0, 1), \\
y = w^*x+\epsilon, w^* = 3 \\
l_i(w) = \frac 1 2 (wx_i - y_i)^2
l_i^´(w) = (wx_i - y_i)x_i
def loss(w, x, y):
return (w*x-y)**2
def w_grad(w, x, y):
return 2*(w*x - y)*x
SGD의 알고리즘은 다음과 같습니다.
$(x_i, y_i)$에 노이즈가 포함되어 있으므로 $w_당i$는 진동하지만 평균값을 취하여 부드럽게 합니다.
다음 그림은 실험의 한 예입니다. 파란색 선은 각각 $w_i$에서 녹색 선은 이 단계의 평균값입니다. 평균값이 진정한 값으로 매끄럽게 수렴되는 것을 볼 수 있습니다.
SGD 이론
SGD의 이론을 배우기 위해서는 철함수의 성질을 이해해야 한다.
우선, 나는 철함수의 성질을 간단하게 소개하고 싶다.
볼록 함수
볼록 함수는 도표의 2점 선을 그릴 때 도표 아래에 나타나는 함수를 가리킨다.
볼록 함수 예
위의 예에서 도표의 2시에 녹색 선을 그리면 파란색 도표는 반드시 떨어진다.
형식적으로 쓰면 다음과 같다関数fが凸関数であるとは,
f上の2点(x,f(x)), (y, f(y))と,\\
それらの間の点(tx + (1-t)y), f(tx + (1-t)y)) について,\\
f(tx + (1-t)y) \leq tf(x) + (1-t)f(y) が成立することです.
이번 문제에서 고려한 바와 같이 제곱 손실도 2차 함수의 형식으로 철 함수라고 할 수 있다.
매끄러운 함수
이번에 고려한 제곱 손실은 철함수일 뿐만 아니라 미분평활한 특징도 가지고 있다.微分可能な関数f(w)がa-平滑関数であるとは, \\
|f'(w) - f'(u)|\leq a|w-u| \ が成立することです.
예를 들어 $f(w) =\frac{1}{2}w^2$는 1 - 매끄러운 함수입니다. 왜냐하면,|f'(w) - f'(u)| = |w - u|
성립되기 때문이다.
이번 손실 함수 $l_i(w) =\frac12(wx_i-y_i)^2$는 $l_를 나타냅니다.i^´(w) = (wx_i - y_i)x_i$이기 때문에,|l_i^´(w)-l_i^´(u)| = |(wx_i - y_i)x_i - (ux_i - y_i)x_i| \\
= |wx_i^2 -y_ix_i - ux_i^2 + y_ix_i| \\
= |wx_i^2 - ux_i^2| \\
= |x_i^2||w-u| \\
\leq |w-u|
문서 레지스트리에 항목 추가i$는 $[-1,1]$범위 내에서만 값을 가져옵니다. 따라서 $l_i$는 1 - 매끄러운 함수입니다.
SGD 오차 정리
손실 함수의 기대치를 $L$로 설정합니다.L(w)= \mathbb{E}_{x_i, y_i}l_i(w) = \mathbb{E}_{x_i, y_i}\frac{1}{2}(x_iw-y_i)^2 \\
= \mathbb{E}_{x_i, \epsilon}\frac{1}{2}(x_iw-(x_iw^*+\epsilon))^2 \\
= \mathbb{E}_{x_i, \epsilon}\frac{1}{2}(x_i(w-w^*)+\epsilon))^2 \\
= \mathbb{E}_{x_i, \epsilon}\frac{1}{2}(x_i^2(w-w^*)^2+ x_i(w-w^*)\epsilon + \epsilon^2))
이 $L$는 범용 오차라고 합니다. 비교적 진정한 매개 변수 $w^*$의 범용 오차와 SGD에서 얻은 매개 변수 $\overline {w}$의 범용 오차입니다.
이번 설정에서는x \sim U[-1, 1],
\epsilon \sim N(0, 1),
그래서\mathbb{E}(x_i)=0, \mathbb{E}(\epsilon)=0 \\
\mathbb{E}(x_i^2)=\mathbb{E}(x_i)^2 + \mathbb{V}(x_i) = \frac{1}{3} \\
\mathbb{E}(\epsilon^2)=\mathbb{E}(\epsilon)^2 + \mathbb{V}(\epsilon)=1
또한 $x\sim U[a, b]$의 방차는 $\frac {(b-a)^2} {12}$입니다. $L (w)$의 식에 대입합니다.L(w)= \frac{1}{2}(\frac{1}{3}(w-w^*)^2+1)
모범 사례를 찾습니다.
이 범용 오차에 대하여 $l_i$가 $a-$매끄러운 볼록 함수 중의 비음손실 함수일 때,\mathbb{E}[L(\overline{w})]\leq \frac{1}{1-\eta a}(L(w^*) + \frac{{w^*}^2}{2\eta T})
성립
증명은 이론편을 이어받는다.
정리의 실증
먼저 SGD를 설치합니다.np.random.seed(77)
times = 100
loss_list = [[] for _ in range(times)]
eta = 0.25
for time in range(times):
w = np.random.uniform(-1,1)
w = 0
w_list = []
T = 50
for t in range(1, T+1):
x, y = sample()
dw = w_grad(w, x, y)
w = w - eta*dw
w_list.append(w)
for t in range(1, T+1):
w = np.mean(w_list[:t])
loss = 0.5*(((w-true_w)**2)*((beta*2)**2/12)+sigma)
loss_list[time].append(loss)
$\mathbb{E}[L (\overline {w})]$은 100번의 평균값을 계산합니다. $\frac {1} {1-\eta} (L (w^*) +\frac (w^*}^2} {2\etaT}) $는 정확하게 계산됩니다.t_start = 5
Trange = range(t_start, T+1)
plt.plot(Trange, np.mean(loss_list, axis=0)[t_start-1:], label="experimental")
plt.plot(Trange, [(1.0/(1.0-eta*beta))*(0.5*sigma + (true_w**2)/(2*eta*t)) for t in Trange] , label="theoretically")
plt.legend()
plt.show()
아래의 그림은 실험 결과의 도표를 보여 준다.
녹색 선은 정리 중의 왼쪽이고, 파란 선은 정리 중의 오른쪽이다. 확실히 (왼쪽) $\leq$(오른쪽) 은 성립되었다. (이번 실험은 간단한 문제이기 때문에 이론적 경계보다 수렴이 빨라 보인다)
내일 위의 정리를 설명하고 싶다!
추적:
위의 도표에 대해 두 쌍의 도표를 뽑았다는 것을 나타낸다.
T가 큰 범위 내에서 이론의 상황과 실험의 상황에서 경사가 같다.
따라서 정해진 수배를 제외하고는 주문서도 비슷해 보인다.
Reference
이 문제에 관하여(확률 계단 하강법의 이론 입문(실험편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/snowhork/items/db4abb114d3343a49539
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
関数fが凸関数であるとは,
f上の2点(x,f(x)), (y, f(y))と,\\
それらの間の点(tx + (1-t)y), f(tx + (1-t)y)) について,\\
f(tx + (1-t)y) \leq tf(x) + (1-t)f(y) が成立することです.
微分可能な関数f(w)がa-平滑関数であるとは, \\
|f'(w) - f'(u)|\leq a|w-u| \ が成立することです.
|f'(w) - f'(u)| = |w - u|
|l_i^´(w)-l_i^´(u)| = |(wx_i - y_i)x_i - (ux_i - y_i)x_i| \\
= |wx_i^2 -y_ix_i - ux_i^2 + y_ix_i| \\
= |wx_i^2 - ux_i^2| \\
= |x_i^2||w-u| \\
\leq |w-u|
L(w)= \mathbb{E}_{x_i, y_i}l_i(w) = \mathbb{E}_{x_i, y_i}\frac{1}{2}(x_iw-y_i)^2 \\
= \mathbb{E}_{x_i, \epsilon}\frac{1}{2}(x_iw-(x_iw^*+\epsilon))^2 \\
= \mathbb{E}_{x_i, \epsilon}\frac{1}{2}(x_i(w-w^*)+\epsilon))^2 \\
= \mathbb{E}_{x_i, \epsilon}\frac{1}{2}(x_i^2(w-w^*)^2+ x_i(w-w^*)\epsilon + \epsilon^2))
x \sim U[-1, 1],
\epsilon \sim N(0, 1),
\mathbb{E}(x_i)=0, \mathbb{E}(\epsilon)=0 \\
\mathbb{E}(x_i^2)=\mathbb{E}(x_i)^2 + \mathbb{V}(x_i) = \frac{1}{3} \\
\mathbb{E}(\epsilon^2)=\mathbb{E}(\epsilon)^2 + \mathbb{V}(\epsilon)=1
L(w)= \frac{1}{2}(\frac{1}{3}(w-w^*)^2+1)
\mathbb{E}[L(\overline{w})]\leq \frac{1}{1-\eta a}(L(w^*) + \frac{{w^*}^2}{2\eta T})
먼저 SGD를 설치합니다.
np.random.seed(77)
times = 100
loss_list = [[] for _ in range(times)]
eta = 0.25
for time in range(times):
w = np.random.uniform(-1,1)
w = 0
w_list = []
T = 50
for t in range(1, T+1):
x, y = sample()
dw = w_grad(w, x, y)
w = w - eta*dw
w_list.append(w)
for t in range(1, T+1):
w = np.mean(w_list[:t])
loss = 0.5*(((w-true_w)**2)*((beta*2)**2/12)+sigma)
loss_list[time].append(loss)
$\mathbb{E}[L (\overline {w})]$은 100번의 평균값을 계산합니다. $\frac {1} {1-\eta} (L (w^*) +\frac (w^*}^2} {2\etaT}) $는 정확하게 계산됩니다.t_start = 5
Trange = range(t_start, T+1)
plt.plot(Trange, np.mean(loss_list, axis=0)[t_start-1:], label="experimental")
plt.plot(Trange, [(1.0/(1.0-eta*beta))*(0.5*sigma + (true_w**2)/(2*eta*t)) for t in Trange] , label="theoretically")
plt.legend()
plt.show()
아래의 그림은 실험 결과의 도표를 보여 준다.녹색 선은 정리 중의 왼쪽이고, 파란 선은 정리 중의 오른쪽이다. 확실히 (왼쪽) $\leq$(오른쪽) 은 성립되었다. (이번 실험은 간단한 문제이기 때문에 이론적 경계보다 수렴이 빨라 보인다)
내일 위의 정리를 설명하고 싶다!
추적:
위의 도표에 대해 두 쌍의 도표를 뽑았다는 것을 나타낸다.
T가 큰 범위 내에서 이론의 상황과 실험의 상황에서 경사가 같다.
따라서 정해진 수배를 제외하고는 주문서도 비슷해 보인다.
Reference
이 문제에 관하여(확률 계단 하강법의 이론 입문(실험편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/snowhork/items/db4abb114d3343a49539텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)