python - 如何使用多层感知器并在给定倾斜分布特征的情况下进行预测
问题描述
我对深度学习和 Keras 还很陌生,这个问题困扰了我好几个星期。希望我能从这里得到一些提示。
特点:
我模拟了两个变量,每个变量都有 10k 个样本并遵循标准正态分布A ~ Norm(0, 1)
:B ~ Norm(0, 1)
.
标签
我从模拟变量中导出了两个标签y1 = A * B
:y2 = A / B
.
模型
输入维度:2
隐藏层:4个密集层,它们都是32个神经元宽
输出层:具有 1 个神经元的密集层
激活函数:ReLU
适用于所有激活函数
编译器:'MSE'
作为损失函数,'Adam'
作为优化器,学习率为 1e-05
任务
最后,我设置了三个任务供 MLP 学习:
(1)使用 A、B 预测 y1;
(2)用A,B预测y2;
(3) 使用 A, 1/B 预测 y2
验证
用于'validation_split = 0.2'
验证模型
结果和推理
在任务 1 中经过 10~15 个 epoch 后,训练集和验证集都可以轻松达到MSE
1 以下。但是,对于其他两个任务,我总是会得到非常高的损失,例如 30k+ 的训练损失。
[更新] 我还通过 Pearson 相关系数评估了结果,任务 1 的返回值约为 0.7,任务 2 和 3 的返回值 <0.01。
这对我来说很奇怪,因为乘法(y1
)和除法(y2
)的概念在数学上是相同的。于是我试着研究了 1/B 的分布,我发现它的每一边都有很长的尾巴。我想这可能是困难的根源,但想不出任何策略。我还尝试在训练前对 1/B 进行归一化,但没有成功。
欢迎任何建议或评论。在网上或书本上都找不到这方面的讨论,真的很想在这方面取得一些进展。谢谢你。
解决方案
y2 值的分布与 y1 值有很大不同,具体来说,它的绝对值要大得多。这意味着直接比较损失并不公平。
这有点像估计一个人的质量与估计一颗行星的质量,然后因为你少了数百万磅而感到沮丧。
举个例子,尝试计算所有三个问题的损失,但估计器只能猜测 0.0。我怀疑问题 1 的损失会比其他两个低得多。
推荐阅读
- r - 如何将变量名称和函数调用的 tibble 传递给 tibble
- c - 为什么代码在这个 char 比较中没有产生任何结果?
- matlab - 用约束条件在 MATLAB 中用向量的线性组合拟合数据
- python - Python cx_Oracle 模块:无法在代码中格式化查询
- c# - WinForms:没有挂起的 SuspendLayout() 调用
- asp.net-core - 使用 C# 中的 Gitlab API 更新 GitLab 中的 .gitlab-ci.yml 文件
- html - 一旦我滚动到具有较低 z-index 的粘性页脚,滚动就会停止反应
- c++ - 使用 clang-tidy 分析嵌入式 GCC 项目
- web - 如何在 Svelte spa 路由器中删除“#”?
- javascript - 在单个工具提示中插入包含图像和文本数据的两列表