Метод градиентного спуска не работает в линейной регрессии? - PullRequest
1 голос
/ 02 мая 2020

В R я сгенерировал некоторые искусственные данные для выполнения линейной регрессии, используя метод градиентного спуска Y = c0 + c1 * x1 + c2 * x2 + noise

Я также использую аналитический метод для расчета параметров тета = [c0, c1, c2]. Ниже приведены коды R с примечаниями для переменных.

Я использую метод градиентного спуска для вычисления тета. Формулы взяты из ссылки ниже.

слайды от человека

слайды из Стэнфорда - Эндрю Нг

Однако метод не может сходиться. Мои коды R ниже. тета сильно отличается от аналитического решения k в кодах R.

rm(list = ls())

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


X=cbind(x1,x2)
A=as.matrix(cbind(rep(1,n),x1,x2))
Y=-3.9+3.8*x1-2.4*x2+rnorm(n,mean=0,sd=1.5);


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

iterations=3000 # total number of step
epsilon = 0.0001 # set precision
eta=0.0001 # step size

t1=integer(iterations)
e1=integer(iterations)

X=as.matrix(X)# convert data table X into a matrix
N=dim(X)[1] # total number of observations
X=as.matrix(cbind(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=1),1,np) # Initialize theta:1 x np matrix
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
  theta=theta-eta*grad # updating theta
  L=sqrt(sum((eta*grad)^2)) # calculating the L2 norm
  e1[i]=sum((error)^2)/(2*N) # record the cost function in each step (value=2*MSE)
  t1[i]=L # record the L2 norm in each step
  if(L<=epsilon){ # checking whether convergence is obtained or not
    break
  }
}

plot(e1*2,type="l",ylab="MSE",lwd=2,col=rgb(0,0,1))
abline(h=MSE)
text(x=1000,y=MSE+1,labels = "Actual MSE",adj=1)
text(x=500,y=15,labels = "Gradient Descent",adj=0.4)
theta
k

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

ваша проблема в том, что вы устанавливаете eta очень консервативно. Следовательно, для сближения требуется очень много времени. Эта имеет решающее значение в скорости сходимости. Однако, если он выбран большим, алгоритм может не сходиться. Вы, скорее всего, здесь позже узнаете об алгоритме, который автоматически настраивает eta, например, Адаград или Адам. Если вы выберете eta = 0.001 enter image description here

eta = 0.01

enter image description here

Эта = 0,1

enter image description here

0 голосов
/ 02 мая 2020

Я пробовал код, и проблема заключалась в том, что после 3000 итераций норма L2 L все еще превышала точность эпсилона. Я могу получить воспроизводимые данные образца, выполнив сначала set.seed(5556). После 7419 итераций L = 9,99938 e-5 <эпсилон. Однако тета все еще отличается от ожидаемого результата, который, конечно, для нормы L2 и нормальных данных можно рассчитать, запустив <code>lm(Y ~ X1+X2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...