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)
教师在很小的集合上进行微妙的学习--只有 1000 个示例(占总数的 25)
你没有比较过这 1000 个例子和 3000 个例子(pretrain + train)的学习质量吗?差别真的很小吗?
与教师一起在一个很小的集合上进行微妙的学习--只有 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 中的各种神经网络。
祝您好运
下午好。
对于不同长度序列的训练和分类任务,您肯定应该使用 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)还是原则上多样性是有用的?应该尝试对不同层使用不同的参数(不一定完全是代码中指定的参数)。
您好、
请解释一下为什么 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%
在此之前,我尝试了
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 集好, 这就是为什么在我的一个步骤中,它的表现也 和你的 两个步骤 一样好。