文章 "深度神经网络 (第 IV 部)。创建, 训练和测试神经网络模型" - 页 2

 
SplitData() - 按 2000/1000/500/500/500 的比例将初始集 dt[] 分割为 pretrain、train、val、test 子集

教师在很小的集合上进行微妙的学习--只有 1000 个示例(占总数的 25)

你没有比较过这 1000 个例子和 3000 个例子(pretrain + train)的学习质量吗?差别真的很小吗?

 
我明白了,哪里涉及到钱(尤其是容易赚到的),哪里就会发生战争和剥削。
 
elibrarius:

与教师一起在一个很小的集合上进行微妙的学习--只有 1000 个示例(占总数的 25%)。

您没有比较过这 1000 个例子和 3000 个例子(预培训 + 培训)的教学质量吗?差别真的很小吗?

我猜是在服务器重启时发送的。

使用预训练的一个好处是,对于精细训练,你需要的示例、训练历元和训练级别都要少得多。另一方面,预训练需要更多的示例。根据我的经验,1500-2000 个示例就足够进行预训练了。预训练会将 DNN 权重置于最优解区域。只需对其进行微调即可。增加权重会导致质量下降。

但您可以通过实验来验证。

 

下午好,各位交易员 + 程序员 + 数学家...

致作者 - 感谢您的文章,它解释得很清楚,甚至可以理解....)

弗拉基米尔,我有一个来自个人偏见的问题,如果可能,请回答:


问题解决方案的边界:

培训:在 DB2* 中查找并选择 DB1* 中模板*的重复。重复次数和允许偏差将充分体现假设*的置信度。对于感兴趣的 FI*,所创建的带重复的 DB2 的大小将比 DB1 小得多,因此对计算机功耗的要求也较低。通过将不同 FI*的报价转换为单一类型大小,我们将能够把不同 FI*的重复数据保存到一个(统一的)DB1 中--这将使我们能够获得更多的重复模板*。

2. 分析:当数据*中出现一个新点,并相应地出现一个新的模式*时

2.1. 立即在 DB2 中执行新的搜索--这将允许进行快速搜索,在 DB3* 中保存找到的数据,并相应地更新 DB2*

2.2. 在停机期间在 DB1 中执行新的搜索 - 这将允许进行准确但缓慢的搜索,将找到的数据保存到 DB3* 中并相应地更新 DB2*

2.3. 根据 DB3* 中的变化进行检查(根据交易策略),必要时更改交易头寸


破译缩写:

DB1 - 数据库/所有 FIs 的历史报价* :

1) 以点链的形式*,受长期历史的限制,但将从中分析 20 个点的组,在分析完这一组后,我们将转移一个点并重复分析。

2) 作为模板*列表

DB2 - 带有重复模板*的数据库,这些模板或完全相同,或部分相同(一个模板*的任何变量数都会被舍弃)。

DB3 - 带有模板*的数据库,这些模板*与最后一个模板(即现在的实际情况)完全或部分相同 (模板*点*坐标的偏差达到指定水平)。

FI* - 金融工具(欧元兑美元、英镑兑美元、_SPX500......),每种金融工具存储在一个单独的文件中

Point* - 由价格、日期、成交量组成,反过来可以对应于:条形收盘价/分形等。

模板* - 一组 20 个点*。

假设* - FI* 分析系统的结果(作为一种变体 - 神经网络)。


关于任务的问题:

如果可以,那么最合适的神经网络训练方法 是什么?

让我来澄清一下这个问题:是否有可能通过输入大量模板*(模板的一部分将包含用于确定身份的地标,第二部分将包含假设*)来训练神经网络。如果答案是 "是",那么可以使用哪种类型的神经网络来完成这项工作?


据我所知,您提出的变体并不适用。


我写的任务有点概括性--我不想深究细枝末节,但我想得到问题的答案。

就我自己而言,我可以说的很明显--神经网络吸引了我,但我还没有深入研究过。


再见

弗拉基米尔

 
Владимир:

下午好,各位交易员 + 程序员 + 数学家...

致作者 - 感谢您的文章,它解释得很清楚,甚至可以理解....)

弗拉基米尔,我有一个来自个人偏见的问题,如果可能,请回答:


问题解决方案的边界:

培训:在 DB2* 中查找并选择 DB1* 中模板*的重复。重复次数和允许偏差将充分体现假设*的置信度。对于感兴趣的 FI*,所创建的带重复的 DB2 的大小将比 DB1 小得多,因此对计算机功耗的要求也较低。通过将不同 FI*的引号转换为单一类型大小,我们就能将不同 FI*中找到的重复数据保存到一个(统一的)DB1 中--这将使我们获得更多的重复模板*。

2. 分析:当数据*中出现一个新点,并相应地出现一个新的模式*时

2.1. 立即在 DB2 中执行新的搜索--这将允许进行快速搜索,在 DB3* 中保存找到的数据,并相应地更新 DB2*

2.2. 在停机期间在 DB1 中执行新的搜索 - 这将允许进行准确但缓慢的搜索,将找到的数据保存到 DB3* 中并相应地更新 DB2*

2.3. 根据 DB3* 中的变化进行检查(根据交易策略),必要时更改交易头寸


破译缩写:

DB1 - 数据库/所有 FIs 的历史报价* :

1) 以点链的形式*,受长期历史的限制,但将对其中的 20 个点进行分析,分析完这一组后,我们将转移一个点并重复分析。

2) 作为模板*列表

DB2 - 带有重复模板*的数据库,这些模板或完全相同,或部分相同(一个模板*的任何变量数都会被舍弃)。

DB3 - 带有模板*的数据库,这些模板*与最后一个模板(即现在的实际情况)完全或部分相同 (模板*点*坐标的偏差达到指定水平)。

FI* - 金融工具(欧元兑美元、英镑兑美元、_SPX500......),每种金融工具存储在一个单独的文件中

Point* - 由价格、日期、成交量组成,反过来可以对应于:条形收盘价/分形等。

模板* - 一组 20 个点*。

假设* - FI* 分析系统的结果(作为一种变体 - 神经网络)。


关于任务的问题:

如果可以,那么最合适的神经网络训练方法是什么?

让我来澄清一下这个问题:是否有可能通过输入大量模板*(模板的一部分将包含用于确定身份的地标,第二部分将包含假设*)来训练神经网络。如果答案是 "是",那么可以使用哪种类型的神经网络来完成这项工作?


据我所知,您提出的变体并不适用。


我写的任务有点概括性--我不想深究细枝末节,但我想得到问题的答案。

就我自己而言,我可以说的很明显--神经网络吸引了我,但我还没有深入研究过。


再见

弗拉基米尔

下午好。

对于不同长度序列的训练和分类任务,您肯定应该使用 LSTM。这种神经网络有很多种类。一切都取决于输入数据的类型和分类目标。

现在可以在 R/MT4 中应用 TensorFlow/Keras/CNTK 中的各种神经网络。

祝您好运

 
Vladimir Perervenko:

下午好。

对于不同长度序列的训练和分类任务,您肯定应该使用 LSTM。这种神经网络有很多种类。这完全取决于输入数据的类型和分类目标。

现在,在 R/MT4 中可以应用 TensorFlow/Keras/CNTK 中的各种神经网络。

祝好运


很好!

答案很明确,谢谢。

我会朝着这个方向前进。

弗拉基米尔,你觉得联合起来怎么样?我想我们可以一起克服...

恕我直言

弗拉基米尔

 
Владимир:

很好!

答案很明确,谢谢。

我会朝着这个方向前进。

弗拉基米尔,你觉得联合起来怎么样?我想我们可以并肩作战...

恕我直言

弗拉基米尔

好的

我们可以讨论联合工作。但我将能够在这一系列文章结束后开始,我希望我能够在本月底之前完成。

但我们现在就可以开始准备和解释工作。为了有效地开展工作,我必须了解您的基本想法。现在我不太理解你的想法。您能以某种方式将其形象化吗?

祝你好运

 

您好、

请解释一下为什么 NS 的不同层要选择不同的参数:

darch.unitFunction = c(" tanhUnit"," maxoutUnit", " softmaxUnit"),
darch.dropout = c(0.1,0.2,0.1),
darch.weightUpdateFunction = c("weightDecayWeightUpdate", "maxoutWeightUpdate","weightDecayWeightUpdate"),

1) 只是为了显示软件包的多样性?

2)还是指定的参数组合具有某种优势?(根据您的经验)。

3)还是原则上多样性是有用的?应该尝试对不同层使用不同的参数(不一定完全是代码中指定的参数)。

 
elibrarius:

您好、

请解释一下为什么 NS 的不同层要选择不同的参数:

1) 只是为了显示软件包的多样性?

2)还是指定的参数组合具有某种优势?(根据您的经验)。

3)还是原则上多样性是有用的?我们应该尝试对不同层使用不同的参数(不一定完全是代码中指定的参数)。

因为它们有不同的激活函数。

第一隐层的激活函数由输入数据类型决定,因为我们的输入数据在 +1/-1 范围内,所以最合适的是 tanh,但也可以是 sigm 或 maxout。第二隐藏层是 maxout。输出当然是 softmax。

从经验来看,Dropout。不同的层可以有不同的参数,原则上也应该有不同的参数。并非所有软件包都能提供如此广泛的参数变化可能性。

选择这些超参数的组合以获得最低的分类误差是一个优化问题(本文第五部分会有一个例子)。

因此,你可以尝试使用任何参数(当然,如果这些参数与我们的数据相关的话)。

实验。

祝您好运

 

您好,
另一个问题。
为什么要将训练分成两个阶段:
1 预训练,然后只训练 DNN 顶层

2 精细学习整个网络?

如果我们将第 1 阶段扩展为
预训练 + 同时对整个网络进行精细学习
(即设置 rbm.lastLayer = 0,bp.learnRate = 1,darch.trainLayers = T),不经过第 2 阶段不也能得到同样的结果吗?

更新。我做了一个实验:(红色 表示代码中的改动)

evalq({
  require(darch)
  require(dplyr)
  require(magrittr)
  Ln <- c(0, 16, 8, 0)
  nEp_0 <- 25
  #------------------
  par_0 <- list(
    layers = Ln,
    seed = 54321,
    logLevel = 5,
    # params RBM========================
    rbm.consecutive = F, # each RBM is trained one epoch at a time
    rbm.numEpochs = nEp_0,
    rbm.batchSize = 50,
    rbm.allData = TRUE,
    rbm.lastLayer = 0,
    rbm.learnRate = 0.3,
    rbm.unitFunction = "tanhUnitRbm",
    # params NN ========================
    darch.batchSize = 50,
    darch.numEpochs = nEp_0,
    darch.trainLayers = T,
    darch.unitFunction = c("tanhUnit","maxoutUnit", "softmaxUnit"),
    bp.learnRate = 1,
    bp.learnRateScale = 1,
    darch.weightDecay = 0.0002,
    darch.dither = F,
    darch.dropout = c(0.1,0.2,0.1),
    darch.fineTuneFunction = backpropagation, #rpropagation
    normalizeWeights = T,
    normalizeWeightsBound = 1,
    darch.weightUpdateFunction = c("weightDecayWeightUpdate",
                                   "maxoutWeightUpdate",
                                   "weightDecayWeightUpdate"),
    darch.dropout.oneMaskPerEpoch = T,
    darch.maxout.poolSize = 2,
    darch.maxout.unitFunction = "linearUnit")
  #---------------------------
 
  DNN_default <- darch(darch = NULL,
                       paramsList = par_0,
                       x = DTcut$pretrain$woe %>% as.data.frame(),
                       y = DTcut$pretrain$raw$Class %>% as.data.frame(),
                        xValid = DTcut$val$woe %>% as.data.frame(),
                        yValid = DTcut$val$raw$Class %>% as.data.frame()
  )
}, env)

有了:


INFO [2017-11-15 17:53:24] Classification error on Train set (best model): 29.1% (582/2000)
INFO [2017-11-15 17:53:24] Train set (best model) Cross Entropy error: 1.146
INFO [2017-11-15 17:53:25] Classification error on Validation set (best model): 30.54% (153/501)
INFO [2017-11-15 17:53:25] Validation set (best model) Cross Entropy error: 1.192
INFO [2017-11-15 17:53:25] Best model was found after epoch 8
INFO [2017-11-15 17:53:25] Final 0.632 validation Cross Entropy error: 1.175
INFO [2017-11-15 17:53:25] Final 0.632 validation classification error: 30.01%
INFO [2017-11-15 17:53:25] Fine-tuning finished after 4.4 secs

你在第二步之后

INFO [2017-11-15 17:49:45] Train 集(最佳模型)的分类错误:32.57% (326/1001)
INFO [2017-11-15 17:49:45] 训练集(最佳模型)交叉熵误差:1.244
INFO [2017-11-15 17:49:45] 验证集(最佳模型)的分类误差:30.74%(154/501)

也就是说,验证集上的误差是相同的,即 30%

在此之前,我尝试了

xValid = DTcut$train$woe %>% as.data.frame(),

yValid = DTcut$train$raw$Class %>% as.data.frame()

作为步骤 1 的代码,结果是

INFO [2017-11-15 17:48:58] Train 集上的分类错误(最佳模型):28.85% (577/2000)
INFO [2017-11-15 17:48:58] 训练集(最佳模型)交叉熵误差:1.153
INFO [2017-11-15 17:48:59] 验证集(最佳模型)的分类误差:35.66%(357/1001)


有可能只是DTcut$val 集比 DTcut$train 集好, 这就是为什么在我的一个步骤中,它的表现也 和你的 两个步骤 一样好。