2

预先感谢您的任何帮助。我正在尝试实现一个深度学习神经网络来预测许多变量(一种多元非线性回归)。作为第一步,我正在查看 R 中的 Darch 包并处理中的代码片段

http://cran.r-project.org/web/packages/darch/darch.pdf

当我从 p 10 运行以下代码时,它似乎在“异或”上进行训练,然后生成的神经网络似乎无法学习该函数。它要么将 (1,0) 模式或 (0,1) 模式学习为真,但不能同时学习两者,有时还学习 (1,1) 模式,这应该是假的。我的理解是,这类网络应该能够学习几乎任何功能,包括对于初学者的“排他或”:这不是由原始反向传播工作解决的吗,该网络在微调中使用它。我想我可能会遗漏一些东西,所以非常感谢任何建议或帮助?(我什至将 epoch 增加到 10,000,但无济于事。)

# Generating the datasets
inputs <- matrix(c(0,0,0,1,1,0,1,1),ncol=2,byrow=TRUE)
outputs <- matrix(c(0,1,1,0),nrow=4)
# Generating the darch
darch <- newDArch(c(2,4,1),batchSize=2)
# Pre-Train the darch
darch <- preTrainDArch(darch,inputs,maxEpoch=100)
# Prepare the layers for backpropagation training for
# backpropagation training the layer functions must be
# set to the unit functions which calculates the also
# derivatives of the function result.
layers <- getLayers(darch)
for(i in length(layers):1){
    layers[[i]][[2]] <- sigmoidUnitDerivative

}
setLayers(darch) <- layers
rm(layers)
# Setting and running the Fine-Tune function
setFineTuneFunction(darch) <- backpropagation
darch <- fineTuneDArch(darch,inputs,outputs,maxEpoch=100)
# Running the darch
darch <- darch <- getExecuteFunction(darch)(darch,inputs)
outputs <- getExecOutputs(darch)
cat(outputs[[length(outputs)]])
## End(Not run)


#### Example results


> cat(outputs[[length(outputs)]])
0.02520016 0.8923063 0.1264799 0.9803244

## Different run

> cat(outputs[[length(outputs)]])
0.02702418 0.1061477 0.9833059 0.9813462
4

2 回答 2

2

对于它的价值,以下内容对我有用:

# Generating the datasets
inputs <- matrix(c(0,0,0,1,1,0,1,1),ncol=2,byrow=TRUE)
print(inputs)

outputs <- matrix(c(0,1,1,0),nrow=4)
print(outputs)


# Generating the darch
darch <- newDArch(c(2,4,1),batchSize=4,ff=F)

# Pre-Train the darch
darch <- preTrainDArch(darch,inputs,maxEpoch=200,numCD=4)

# Prepare the layers for backpropagation training for
# backpropagation training the layer functions must be
# set to the unit functions which calculates the also
# derivatives of the function result.
layers <- getLayers(darch)
for(i in length(layers):1){
  layers[[i]][[2]] <- sigmoidUnitDerivative
}

setLayers(darch) <- layers
rm(layers)

# Setting and running the Fine-Tune function
setFineTuneFunction(darch) <- rpropagation
darch <- fineTuneDArch(darch,trainData=inputs,targetData=outputs,
                       maxEpoch=200,
                       isBin=T)

# Running the darch
darch <- darch <- getExecuteFunction(darch)(darch,inputs)
outputs2 <- getExecOutputs(darch)
cat(outputs2[[length(outputs2)]])
## End(Not run)

给出了以下结果

> # Running the darch
> darch <- darch <- getExecuteFunction(darch)(darch,inputs)

> outputs2 <- getExecOutputs(darch)

> cat(outputs2[[length(outputs2)]])
1.213234e-21 1 1 1.213234e-21
> ## End(Not run)
1.213234e-21 1 1 1.213234e-21

因此进行了以下更改:

  • 学习从经典的反向传播变为弹性反向传播
  • 批量大小设置为 4
  • numCD 设置为 4

因为我本质上是在执行 Voodoo(直到我练习了一些),所以我似乎无法将错误率保持在 17% 以下。

编辑:

所以我一直在阅读并且倾向于认为系统的每个独特状态都与单个内部神经元有关。如果您有两位逻辑,则有四种独特的输入组合,因此有四种独特的输入状态。如果您想要一个可以处理的系统,那么您需要 4 个内部节点。这意味着对于 8 位操作,您可能需要 256 个内部节点。

atari游戏的人有模型自适应控制,所以他们用一个网络预测系统的下一个状态,用另一个网络,他们在给定当前状态和预期的下一个状态的情况下确定最佳控制策略。

当我重新运行几千次时,长时间训练后的输出在大约 18% 的时间里是错误的。我真的不喜欢那样。

想法:

  • 如果我添加了正确的噪声,我可以恢复模拟退火对稳定性的影响吗?
  • 如果我在输入中添加诸如汉明码之类的东西,我可以用空间大小来换取稳定性吗?
  • 输出错误稳定的时间是两个输出完全相等的时候。我可以在训练算法中建立检测并使用它来更新一个“权重”而不是另一个,从而解耦(据称解耦的)神经元吗?
  • 项目清单
于 2014-12-04T20:42:03.830 回答
1

我能够example.xor在 darch 中调整基线以可靠地正确学习简单的异或。这是基线版本:

> tmp<-mclapply(1:50, function(x) example.xor())
> table(sapply(tmp,function(x) tail(x@stats$dataErrors$class,1)))

 0 25 
30 20 

这是一个调整的变体:

trainingData <- matrix(
    c(0,0,
      0,1,
      1,0,
      1,1), ncol=2, byrow=T)
trainingTargets <- matrix(c(0,1,1,0),nrow=4)

tuned.xor <- function() {
    darch(trainingData, trainingTargets,
        # These settings are different
        layers=c(2,6,1),
        darch.batchSize=4,
        darch.fineTuneFunction=function(...) rpropagation(..., weightDecay=0.0001),
        # These settings are all as in example.xor
        darch.bootstrap=F,
        darch.learnRateWeights = 1.0,
        darch.learnRateBiases = 1.0,
        darch.isBin=T,
        darch.stopClassErr=0, 
        darch.numEpochs=1000
    )
}

> tmp<-mclapply(1:50, function(x) tuned.xor())
> table(sapply(tmp,function(x) tail(x@stats$dataErrors$class,1)))

 0 
50 
于 2016-06-05T23:49:06.573 回答