확률 계단 하강법의 이론 입문(실험편)

기계 학습의 매개 변수 학습, 특히 신경 네트워크의 학습을 할 때 확률 계단 하강법(SGD)에 대한 이해는 없어서는 안 된다. 알고리즘 자체의 해설은 일본어에도 많은데, 많은 심층 학습 구조에서 SGD를 간단하게 설치할 수 있다.
이 글에서 우리는 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의 알고리즘은 다음과 같습니다.
  • $\eta$
  • 설정
  • $w_1=0달러로 초기화
  • 단계 $i=1,2,\dots,T$다음 단계 반복
  • $(x_i, y_i)$견본
  • $w_{i+1} = w_i -\eta l_i'{(w_i)}$로 업데이트
  • $\overline{w}=\frac{\sum_iw_i}{T}$출력
  • 교전 방향에서 매개 변수를 변경합니다. 이른바 일반 사다리법 (최급 하강법) 과 같지만 $(x_i, y_i) $가 무작위로 추출된 곳은 일반 사다리법과 다릅니다.
    $(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가 큰 범위 내에서 이론의 상황과 실험의 상황에서 경사가 같다.
    따라서 정해진 수배를 제외하고는 주문서도 비슷해 보인다.

    좋은 웹페이지 즐겨찾기