> # the above no gradient
>
> gradient <- function(x, v){
+ residuals = x - v
+ # y = (sum(x-v)^2)/n 혹은 (mean(x-v)^2)
+ # 의 식이 ms값을 구하는 식인데
+ # 이를 v에 대해서 미분하면 chain rule을 써야 한다
+ # 자세한 것은 http://commres.net/wiki/estimated_standard_deviation
+ # 문서 중에 미분 부분 참조
+ # dy/dv = ( 2(x-v)*-1 ) / n chain rule
+ # dy/dv = -2 (x-v) / n = -2 (mean(residual))
+ dx = -2 * mean(residuals)
+ # return(list("ds" = dx))
+ return(dx)
+ } # function returns ds value
>
>
comment
이 R script의 목적은 v값이 최소값이 되는 지점을 자동적으로 찾아보려는 것이다. 이것을 위해서 우선 v값으로 사용할 첫 점수를 랜덤하게 구한 후 (아래 그래프에서 빨간색 지점), 자동적으로 그 다음 v 점수를 찾고 (녹색지점), 그 다음 v 점수를 찾고 (황금색 지점), . . . 이런 과정을 계속하면서 각 v 점수에서의 msr값을 구해서 이에 해당하는 v값을 찾아 보려고 한다. 빨간색, 녹색, 황금색, . . . 이를 자동적으로 구하기 위해서 두가지 방법을 사용하는데 그 것이
gradient 펑션은 dy/dv 의 연쇄 미분식인 (chain rules) -2(x-v) / n = -2 mean(res) 값을 구하는 것이다. 이렇게 구한 값에 learning_rate값을 곱한후, 이것을 먼저 사용한 v값에서 (빨간색 지점) 빼 주어 다음 v값으로 (녹색지점) 사용하려고 한다. 이 녹색지점에서의 v값을 사용했을 때의 gradient값을 구한 후 다시 이값에 learning_rate인 0.1을 곱하여 그다음 스텝의 값을 얻고, 이 값을 바로 전의 v값에서 빼 준 값을 그 다음 v값으로 사용한다. 이렇게 구하는 v값들은 0.1씩 곱해주는 효과때문에 오른 쪽으로 옮겨가는 지점이 “점진적으로 줄어들게 되고” 이 지점이 msr의 최소값이 되는 지점으로 가게 된다.
> zx <- (x-mean(x))/sd(x) > # pick one random v in (x-v) > v <- rnorm(1) > >
comment
v ← rnorm(1) v ← rnorm(1, mean(x), sd(x)) 와 같이 써야 하지만 (현재의 경우, rnorm(1, 50, 5) 가 된다) zx ← (x-mean(x))/sd(x) (이렇게 표준점수화 하면 x 변인의 평균이 0, 표준편차가 1 이 되는 집합으로 변한다) v ← rnorm(1, 0, 1) 로 구한다. 뒤의 인자인 0, 1 은 default이모로 생략. rnorm(1) 을 이용해서 찾으려고 하는 것이다. > # Train the model with scaled features > learning.rate = 1e-1 >
comment
> msrs <- c()
> vs <- c()
>
> nlen <- 75
> for (epoch in 1:nlen) {
+ residual <- residuals(zx, v)
+ msr.x <- msr(zx, v)
+ msrs <- append(msrs, msr.x)
+
+ grad <- gradient(zx, v)
+ step.v <- grad * learning.rate #
+ v <- v - step.v # 그 다음 v값
+ vs <- append(vs, v) # v값 저장
+ }
>
> tail(msrs)
[1] 0.999 0.999 0.999 0.999 0.999 0.999
> tail(vs)
[1] 6.415945e-08 5.132756e-08 4.106205e-08 3.284964e-08 2.627971e-08 2.102377e-08
>
> plot(vs, msrs)
>
>
comment
grad ← gradient(x, v)step.v ← grad * learaning_rate v ← v - step.v > # scaled > vs # 변화하는 v 값들의 집합 [1] 3.119260e-01 2.495408e-01 1.996326e-01 1.597061e-01 1.277649e-01 1.022119e-01 8.176952e-02 [8] 6.541561e-02 5.233249e-02 4.186599e-02 3.349279e-02 2.679424e-02 2.143539e-02 1.714831e-02 [15] 1.371865e-02 1.097492e-02 8.779935e-03 7.023948e-03 5.619158e-03 4.495327e-03 3.596261e-03 [22] 2.877009e-03 2.301607e-03 1.841286e-03 1.473029e-03 1.178423e-03 9.427383e-04 7.541907e-04 [29] 6.033525e-04 4.826820e-04 3.861456e-04 3.089165e-04 2.471332e-04 1.977066e-04 1.581652e-04 [36] 1.265322e-04 1.012258e-04 8.098061e-05 6.478449e-05 5.182759e-05 4.146207e-05 3.316966e-05 [43] 2.653573e-05 2.122858e-05 1.698286e-05 1.358629e-05 1.086903e-05 8.695226e-06 6.956181e-06 [50] 5.564945e-06 4.451956e-06 3.561565e-06 2.849252e-06 2.279401e-06 1.823521e-06 1.458817e-06 [57] 1.167054e-06 9.336428e-07 7.469143e-07 5.975314e-07 4.780251e-07 3.824201e-07 3.059361e-07 [64] 2.447489e-07 1.957991e-07 1.566393e-07 1.253114e-07 1.002491e-07 8.019931e-08 6.415945e-08 [71] 5.132756e-08 4.106205e-08 3.284964e-08 2.627971e-08 2.102377e-08 > vs.orig <- (vs*sd(x))+mean(x) > vs.orig [1] 51.55963 51.24770 50.99816 50.79853 50.63882 50.51106 50.40885 50.32708 50.26166 50.20933 [11] 50.16746 50.13397 50.10718 50.08574 50.06859 50.05487 50.04390 50.03512 50.02810 50.02248 [21] 50.01798 50.01439 50.01151 50.00921 50.00737 50.00589 50.00471 50.00377 50.00302 50.00241 [31] 50.00193 50.00154 50.00124 50.00099 50.00079 50.00063 50.00051 50.00040 50.00032 50.00026 [41] 50.00021 50.00017 50.00013 50.00011 50.00008 50.00007 50.00005 50.00004 50.00003 50.00003 [51] 50.00002 50.00002 50.00001 50.00001 50.00001 50.00001 50.00001 50.00000 50.00000 50.00000 [61] 50.00000 50.00000 50.00000 50.00000 50.00000 50.00000 50.00000 50.00000 50.00000 50.00000 [71] 50.00000 50.00000 50.00000 50.00000 50.00000 > > # 마지막 v값이 최소값에 근접한 값 > v [1] 2.102377e-08 > v.orig <- (v*sd(x))+mean(x) > v.orig [1] 50 > > plot(vs.orig, msrs, type='b') > > >