文章 "深度神经网络 (第五部分)。 DNN 超参数的贝叶斯优化" - 页 2

 

有趣的优化结果--验证样本的误差小于训练样本!

换句话说,在某些数据上训练过的模型,学会了在其他数据上工作,即从训练数据中提取了比实际数据更多的信息--这是科幻小说还是探险......?

我呼吁作者--停止shtukarstva和伪造,最后写一个智能交易系统,并展示一些结果,至少在演示版上。

 
revers45:

换句话说,在某些数据上训练过的模型学会了在其他 数据上工作,即从训练数据中提取了比实际数据更多的信息--这是科幻小说还是探险......?

所有模型都是在训练图上进行训练的,也就是说,它们试图将训练图上的误差降到最低,但最后的选择是在测试图上进行的,如果模型没有发现数据中的模式,那么在训练图上或测试图之后的图上,结果都会非常糟糕。但结果表明,无论是在训练图上还是在测试图上,它们都与进行了选择的测试图差别不大。
也就是说,NS 并没有从另一个 数据集上学习,而是在两个数据集上发现了共同的模式。
如果结果不太稳定,那么在测试图上进行选择(不考虑训练者的误差)可能会导致拟合。在本例中没有,但在其他数据中(如果没有发现模式)就有可能。因此,最好在 Err = (ErrLeran * 0.37 + ErrValid * 0.63) 这样的误差之间寻求平衡。

 
elibrarius:

你好,弗拉基米尔

我不太明白为什么你的 NS 是在训练数据上训练的,而其评估是在测试数据上完成的(如果我没弄错的话,你把测试数据用作验证数据)。

在这种情况下,您不会对测试图进行拟合吗,也就是说,您会选择在测试图上效果最好的模型吗?
您还应该考虑到测试图非常小,您可以拟合其中一个时间模式,这可能会很快停止工作。
也许在训练图上进行估计更好,或者在图的总和上进行估计更好,或者像 Darch 那样(提交验证数据时)在 Err = (ErrLeran * 0.37 + ErrValid * 0.63) 上进行估计更好--这些系数是默认的,但可以更改。

有很多选项,目前还不清楚哪一个是最好的。你赞成测试图的论点很有意思。

下午好。

让我们说得更具体些。数据集 X 由 4 个子集组成:preptrain = 4001、train = 1000、test = 500 和 test1= 100 条。对于预训练,我们使用训练集 - pretrain,验证集 - train。

#  SRBM + upper Layer (backpropagation)
 pretrainSRBM_topLayer <- function(Ln, fact1, fact2, dr1, dr2, Lr.rbm, Lr.top) #  SRBM + upper Layer (backpropagation)
  {
    darch( x = X$pretrain$x, y = X$pretrain$y,
          xValid = X$train$x, 
          yValid = X$train$y,
          #=====constant======================
......................................................

微调时,预训练集用作训练集,验证集用于测试集的前 250 条。

fineTuneRP <- function(Ln, fact1, fact2, dr1, dr2, Dnn) #  rpropagation
  {
    darch( x = X$train$x, y = X$train$y,
           #xValid = X$test$x, yValid = X$test$y,
           xValid = X$test$x %>% head(250), 
           yValid = X$test$y %>% head(250),
           #=====constant========
................................................

因此,在确定最终质量时,我们使用测试集的最后 250 条作为测试集。代码

#---SRBM + upperLayer + RP----
  fitnes4.DNN <- function(n1, n2, fact1, fact2, dr1, dr2, Lr.rbm, Lr.top)
  {
    Ln <- c(0, 2*n1, 2*n2, 0)
    #--
     pretrainSRBM_topLayer(Ln, fact1, fact2, dr1, dr2, Lr.rbm, Lr.top) -> Dnn
    fineTuneRP(Ln, fact1, fact2, dr1, dr2, Dnn) -> Dnn
    predict(Dnn, newdata = X$test$x %>% tail(250) , type = "class") -> Ypred
    yTest <- X$test$y[ ,1] %>% tail(250)
    #numIncorrect <- sum(Ypred != yTest)
    #Score <- 1 - round(numIncorrect/nrow(xTest), 2)
    Score <- Evaluate(actual = yTest, predicted = Ypred)$Metrics$F1 %>%
      mean() 
    return(list(Score = Score, Pred = Ypred)
  }

我看不出有任何矛盾。您同意吗?

祝好运

 
elibrarius:

所有模型都是在训练图上进行训练的,也就是说,它们试图将训练图上的误差降到最低,但最后的选择是在测试图上进行的,如果模型没有在数据中找到模式,那么在训练图上或测试图之后的图上的结果就会非常糟糕。但结果表明,无论是在训练图上还是在测试图上,它们都与进行了选择的测试图差别不大。
也就是说,NS 并没有从另一个 数据集上学习,而是在两个数据集中找到了共同的模式。
如果结果不太稳定,那么在测试图上进行选择(不考虑训练者的误差)可能会导致拟合。在本例中没有,但在其他数据中(如果没有发现模式)就有可能。最好是在 Err = (ErrLeran * 0.37 + ErrValid * 0.63) 这样的误差之间寻求平衡。

无论如何,训练图上的一般规律性不应该比测试图上的少,因为训练图上的规律性是与所有其他规律性一起被发现的,因此 NS 在训练图上的效果不应该比测试图差。

在我看来,这是显而易见的,而且教师的知识不应该少于学生,尽管文章作者显然试图反驳这一点,因为他在评论中写道,他不是科学家,也不是程序员,但却坚持教我们如何给神经网络编程。

当然,他已经发布了很多 R 代码,但我希望看到足够的结果,最重要的是,我想知道他还会写多少篇文章,直到至少出现一个正常的 Expert Advisor。

 
Vladimir Perervenko:

下午好。

让我们来澄清一下。数据集 X 由 4 个子集组成:preptrain = 4001、train = 1000、test = 500 和 test1= 100 条。对于预训练,我们使用训练集 - pretrain,验证集 - train。

在微调时,使用预训练集作为训练集,验证集是测试集的前 250 条。

因此,在确定最终质量时,我们使用测试集的最后 250 条作为测试集。代码

我看不出有任何矛盾。你同意吗?

祝你好运

技术上一切都做得很好,这不是问题所在。
我认为 250 条数据不足以评估模型,这就是为什么我想知道为什么只选择了这一部分。
是的,它在特定情况下是有效的(您在所有站点都取得了良好的结果),但我认为它并不具有普遍性。

毕竟,有些数据可能并不是那么好。例如,模型在训练图上的误差可以达到 40%,而在测试图上纯属偶然,误差只有 30%。而第二个模型,比方说,在两个图上都训练成了 35%。第二个模型显然更好。但如果只选择测试图,则会选择第一个模型。为了便于比较,模型评估有以下选项:
只在训练图上评估,
或在所有图的总和上评估,
或像 Darch 那样(提交验证数据)在 Err = (ErrLeran * 0.37 + ErrValid * 0.63) 上评估--这些系数是默认的,但可以更改。


原则上,您可以扩展公式,例如 Err = (ErrLeran * 0.25 + ErrValid * 0.35 + ErrTest * 0.4)。

例如,如果 ErrLeran 和 ErrTest 相差 5%以上--那么就拒绝这样的模型。然后从剩下的模型中做出选择。

我做了一个实验。

以下是 30 次训练的一些结果:(该模型与原始模型不一样,它的一切都很完美,所以我去掉了预训练,这样就不会有糟糕的结果了)

解码:V1 = 1-ErrLearn; V2= 1-ErrOOC; Value = 1 - (ErrLeran * 0.

Value V1 V2

0.5712 0.4988 0.6138 - OOS 很好,但随机,因为 Learn = 50%

0.5002 0.5047 0.4975 - 这比较常见

0.6719 0.6911 0.6606 - 这样的情况也有几次。按值排序 = 1 - (ErrLeran * 0.37 + ErrOOC * 0.63) 将此类模式向上拉动

 
revers45:
当然,他已经发布了很多 R 代码,但我希望看到足够的结果,最重要的是,我想知道他还会写多少篇文章,直到至少有一个正常的 EA。

在其中一篇文章中,有一个智能交易系统,我在几天内为新版 Darch 重写了它--从技术上讲,一切都运行得很好。智能交易系统很简单--读取 OHLC 并将其输入 R,然后在 R 中运行计算函数。最后,在收到来自 NS 的指令后,向服务器发送交易指令。仅此而已。其余的 - 追踪、止损、MM - 随您的喜好。
最困难的事情正是文章中所描述的 - 找到好的数据并对 NS 进行适当的训练。弗拉基米尔展示了各种模型变体、集合、优化、预测因子的选择和处理......,我跟不上他的节奏。)

 

您觉得呢,
,也许我们应该从超参数枚举中排除神经元层数 n2 > n1 的变体?

例如网络 10 - 20 - 100 - 2 或 10 - 8 - 100 - 2

如果 n2 > n1,则会压缩到 n1,然后解压缩到 n2,再压缩到输出层的 1 或 2 个神经元。如果最后仍有 2 个神经元,那么在 n1 层压缩数据后,中间的解压缩应该不会产生任何蠕变。但是,计算明显较差的变体将耗费大量时间。
,我认为可以在拟合函数中以如下方式实现:n1 是神经元数,n2 是 n1 的百分比,然后四舍五入,*2 为最大值。

更新:
我自己做的,希望能更有效地利用计算能力。
 
elibrarius:

您觉得呢,
,也许我们应该从超参数枚举中排除神经元层数 n2 > n1 的变体?

例如网络 10 - 20 - 100 - 2 或 10 - 8 - 100 - 2

如果 n2 > n1,则会压缩到 n1,然后解压缩到 n2,再压缩到输出层的 1 或 2 个神经元。如果最后仍有 2 个神经元,那么在 n1 层压缩数据后,中间的解压缩应该不会产生任何蠕变。不过,计算明显较差的变体会耗费大量时间。
,我认为可以在拟合函数中以如下方式实现:n1 应作为神经元数枚举,n2 作为 n1 的百分比,然后取整,*2 为最大值。

您好。

在我长时间的参数实验中,只发现了几个特殊情况:

- 当事实 = 2

- 或两个隐藏层的激活函数相同时,结果往往更好。

我没有限制隐藏层中神经元的比例。非最佳比例很快就会被排除在外。不过你可以测试一下这个想法。我可能会抽空用 rgenoud 检查一下优化情况。

祝你好运

 
Vladimir Perervenko:

我没有限制隐藏层中神经元的比例。非最佳比例很快就会被排除在外。但你可以测试这个想法。我可能会抽空用 rgenoud 检查一下优化情况。

我让下一层按上一层的百分比计算。但我并不想进行特别的比较。纯粹从理论上讲,我希望我的想法是对的,即在前一层压缩后,网络内部的解压缩不会给它带来新的信息。

我在 GA:ga 上尝试过遗传学。它运行了 NS 200-300 次计算。这是一个很大的数字。而且结果没有任何改善。

虽然对于贝叶斯优化,我认为我们需要更多的计算次数,不是 20-30 次,而是可能多达 100 次。因为经常出现的情况是,最佳结果是 10 个随机起始变体中的一个,而优化器接下来的 10-20 次运算都没有发现更好的结果。也许经过 100 次优化后,结果会有所改善....。

弗拉基米尔-佩列文科

- 事实 = 2 时的最佳结果

- 或两个隐藏层具有相同的激活函数时效果最好

这对我来说有所不同。Relu 通常效果很好。

 
elibrarius:

我让下一层按上一层的百分比计算。但我们并不想进行比较。纯粹从理论上讲,我希望我是对的,网络内部的解压缩不会在上一层压缩后给它带来新的信息。

我在 GA:ga 上尝试过遗传学。它运行了 NS 200-300 次计算。这是一个很大的数字。但结果没有任何改善。

虽然对于贝叶斯优化来说,我认为我们需要更多的计算次数,不是 20-30 次,而是可能多达 100 次。因为经常出现的情况是,最佳结果是 10 个随机起始变体中的一个,而优化器接下来的 10-20 次运算都没有发现更好的结果。也许经过 100 次优化后,....。

这就是我的不同之处。Relu 通常很好。

Genetics 也没有为我找到最佳方案。

对于贝叶斯法,你不仅需要考虑通过次数,还需要考虑点数。你必须寻找更快的方案。这一项非常乏味。

祝您好运

PS.你不是要改用 TensorFlow 吗?这只是一个更高的层次。