我有一个简单的多层感知器,在隐藏层和输出层中有一个隐藏层和tanh激活。作为作业的一部分,我创建了一个包含1000个示例的数据集。每个输入(x_i
)是一个由-1.0和+1.0之间的四个随机数组成的数组。每个标签(y_i
)都生成为sin(x_i[0] - x_i[1] + x_i[2] - x_i[3])
。我的MLP将x_i
的4个元素中的每一个作为输入,并产生单个输出。这个隐藏的分层MLP是否有可能学会产生四个输入的总和,然后应用sin函数?
我使用前80%的数据集训练了MLP,并在每1000个时期的最后20%测试它,最多50,000。使用MSE损失函数,列车和测试损失总是相对相似,但在50,000个训练时期内不会减少很多,并且上下跳跃相当多。训练和测试的最后一个时期的损失值分别为0.01505和0.01504。
在这50,000个训练时期之后,我制作了一个相同格式的数据集,新的随机数介于-1.0和+1.0之间。然后,我按y
值对这些数据进行排序,并根据训练好的MLP对每个数据进行预测。这导致了以下情节:
显然,MLP了解总体趋势,但确切的值非常不稳定。有没有解释为什么它不能更好地学习这个功能?从10,000个时期到50,000个似乎没有太大的改进。是因为只有一个隐藏层吗?
答案 0 :(得分:2)
如果尽管有大量数据样本,您的训练损失在训练期间达到峰值,您可以(几乎)确定您的模型缺乏必要的容量来解决问题。通过增加隐藏层的宽度,增加网络深度或者从密集层切换到具有相同数量参数的循环或卷积层,可以改善表示能力。为了确保容量不足确实是您的问题,请生成更多数据并查看峰值性能是否发生变化。如果没有,请尝试上述任一技术,并检查您的模型是否可以更好地遵循该模式。
编辑:发布一些我用几种不同架构获得的示例结果。所有关于1000个样本训练1500个时期后的测试数据的结果。