在R

时间:2016-12-28 16:26:20

标签: r machine-learning neural-network

我正在为我的机器学习课程做作业,作为其中的一部分,我正在尝试实现神经网络。因为它是为了学校,我必须手动实现算法,而不是使用任何可用的神经网络包。

我一直在使用“从数据中学习”中的材料以及在youtube上跟随它的CalTech讲座。

我尽可能地将算法放在R中,但是在这个过程中出现了一些问题。我无法将成本函数中的差异作为最后​​一次迭代时间的度量来实现,所以现在我只是将迭代次数固定为常量。

**编辑** 大家好。谢谢你的回复。我可以看到我错过了很多所需的信息。对不起,我真的不知道自己在想什么。

我使用的数据只是由sinc函数sinc(x)= sin(x)/ x生成的“玩具数据”。

我特别提到的问题是,我在算法结束时得到的估计与实际值完全不同,并且每次运行算法时它们都有很大差异。看起来我已经按照本书所述的方式将算法放在一起,但我看不出问题出在哪里。

编辑2 将数据添加到代码中,以便可以在不执行任何额外操作的情况下运行。我还分离了函数的各个部分。正如我在评论中提到的,我能够在数字上验证偏导数,所以我认为这部分是可以的。我遇到的问题是当我需要更新权重以训练网络时。 这不是代码的这一部分,但我认为为了更新权重,你只需要考虑旧权重并减去学习率所缩放的权重的偏导数? (wNew = wOld - eta * djdwOld)

theta <- function(a){
  a / (1+abs(a))      # Here we apply the sigmoid function as our
  # non-linearity.
}
theta.prime <- function(a){
  1 / (1+abs(a))^2
}

x <- c( 5.949110, -1.036600,  3.256780,  7.824520, -3.606010,  3.115640, -7.786960,
        -7.598090,  2.083880,  3.983000,  8.060120,  7.879760, -2.456670,
         -2.152720,  3.471950,  3.567960, -4.232630,  6.831610, -9.486860,  8.692330,
        -1.551860,  0.917305,  4.669480, -7.760430,  2.835410)
y <- c(-0.10804400,  0.78264000, -0.05313330,  0.13484700, -0.05522470, -0.05758530,
         0.19566100,  0.13846000,  0.43534100, -0.16861400,  0.10625000,
          0.08427310,  0.27012900,  0.44004800, -0.00880575, -0.10711400, -0.18671100,
         0.01158470,  0.02767190,  0.06319830,  0.61802000,  0.87124300,
         -0.25668100,  0.06160800, 0.10575700)

inputlayer <- 1
outputlayer <- 1
hiddenlayer <- 2

w1 <- t(matrix(rnorm(hiddenlayer,0,.01),hiddenlayer,inputlayer)) 
w2 <- matrix(rnorm(hiddenlayer,0,.01),hiddenlayer,outputlayer)


### Forwardprop ###
forward <- function(x,w1,w2,theta){
s2 <- x%*%w1
a2 <- apply(s2,c(1,2),theta)
s3 <- a2%*%w2
yhat <- apply(s3,c(1,2),theta)
return(yhat)
}

### Forwardpropagation maunally ###
s2 <- x%*%w1
a2 <- apply(s2,c(1,2),theta)
s3 <- a2%*%w2
yhat <- apply(s3,c(1,2),theta)
### Error function ###
#yhat <- forward(x,w1,w2,theta)
E <- sum((y-yhat)^2)/(length(x))

### Backward Propagation ###
delta3 <- (-2*(y-yhat)) * apply(s3,c(1,2),theta.prime)
djdw2 <- t(a2) %*% delta3
delta2 <- delta3 %*% t(w2) * apply(s2,c(1,2),theta.prime)
djdw1 <- t(x)%*%delta2


### Numerically estimated gradients ###
e <- 1e-8
numgrad1 <- matrix(0,1,2)
eps <- matrix(0,1,2)
w1e <- matrix(0,1,2)

for(j in 1:2) {
  eps[1,j] <- e
  w1e <- w1 + eps
  loss2 <- sum((y-forward(x,w1e,w2,theta))^2)

  w1e <- w1
  loss1 <- sum((y-forward(x,w1e,w2,theta))^2)

  numgrad1[1,j] <- (loss2 - loss1)/(e)
  eps[1,j] <- 0
}


numgrad2 <- matrix(0,2,1)
eps <- matrix(0,2,1)
w2e <- matrix(0,2,1)

for(j in 1:2) {
  eps[j,1] <- e
  w2e <- w2 + eps
  loss2 <- sum((y-forward(x,w1,w2e,theta))^2)

  w2e <- w2
  loss1 <- sum((y-forward(x,w1,w2e,theta))^2)

  numgrad2[j,1] <- (loss2 - loss1)/(e)
  eps[j,1] <- 0
}

# Comparison of our gradients from backpropagation
# and numerical estimation.
c(djdw1,djdw2)
c(numgrad1,numgrad2)

0 个答案:

没有答案