Почему оптимизация Адама не может сходиться в линейной регрессии? - PullRequest
0 голосов
/ 03 мая 2020

Я изучаю Адам оптимизатор. Это проблема с игрушкой. В R я генерирую некоторые искусственные данные:

Y = c0 + c1 * x1 + c2 * x2 + noise

В вышеприведенном уравнении x1, x2 и noise - нормальные случайные числа, которые я сгенерировал в R theta = [c0, c1, c2] - это параметр, который я пытаюсь оценить с помощью оптимизатора Адама. Для этой простой задачи регрессии я могу использовать аналитический метод для определения тэта-параметра, который является k в моих кодах R. Ниже.

Что касается алгоритма Адама, я использую формулы с этого сайта

Обзор: Адам

Я изменяю размер шага в этом исследовании параметров c. Окончательная тэта из алгоритма Адама не совпадает с аналитическим решением k в моих кодах R. Norm Я проверял свои коды много раз. Я запускаю коды построчно и не могу понять, почему алгоритм Адама не может сходиться.

Добавлено: Я изменил алгоритм на AMSGrad. В этом случае это лучше, чем у Адама. Однако AMSGrad не сходится. AMSGrad

rm(list = ls())  

n=500
x1=rnorm(n,mean=6,sd=1.6)
x2=rnorm(n,mean=4,sd=2.5)

X=cbind(x1,x2)
A=as.matrix(cbind(intercept=rep(1,n),x1,x2))
Y=-20+51*x1-15*x2+rnorm(n,mean=0,sd=2);


k=solve(t(A)%*%A,t(A)%*%Y) # k is the parameters determined by analytical method
MSE=sum((A%*%k-Y)^2)/(n);

iterations=4000 # total number of steps
epsilon = 0.0001 # set precision
eta=0.04 # step size
beta1=0.9
beta2=0.999

t1=integer(iterations)
t2=matrix(0,iterations,3)
t3=integer(iterations)

epsilon1=1E-8 # small number defined for numerical computation
X=as.matrix(X)# convert data table X into a matrix
N=dim(X)[1] # total number of observations
X=as.matrix(cbind(intercept=rep(1,length(N)),X))# add a column of ones to represent intercept
np=dim(X)[2] # number of parameters to be determined
theta=matrix(rnorm(n=np,mean=0,sd=2),1,np) # Initialize theta:1 x np matrix
m_i=matrix(0,1,np) # initialization, zero vector
v_i=matrix(0,1,np) # initialization, zero vector

for(i in 1:iterations){
  error=theta%*%t(X)-t(Y) # error = (theta * x' -Y'). Error is a 1xN row vector;
  grad=1/N*error%*%X # Gradient grad is 1 x np vector
  m_i=beta1*m_i+(1-beta1)*grad # moving average of gradient, 1 x np vector
  v_i=beta2*v_i+(1-beta2)*grad^2 # moving average of squared gradients, 1 x np vector
  # corrected moving averages
  m_corrected=m_i/(1-beta1^i)
  v_corrected=v_i/(1-beta2^i)
  d_theta=eta/(sqrt(v_corrected)+epsilon1)*m_corrected
  theta=theta-d_theta
  L=sqrt(sum((d_theta)^2)) # calculating the L2 norm
  t1[i]=L # record the L2 norm in each step
  if ((is.infinite(L))||(is.nan(L))) {
    print("Learning rate is too large. Lowering the rate may help.")
    break
  }
  else if (L<=epsilon) {
    print("Algorithm convergence is reached.")
    break # checking whether convergence is obtained or not
  }
  # if (i==1){
  #   browser()
  # }
}

plot(t1,type="l",ylab="norm",lwd=3,col=rgb(0,0,1))
k
theta
...