训练具有未知输入长度的神经网络

数据挖掘 神经网络
2022-02-13 17:49:17

我目前正在进入机器学习和神经网络的世界,这要归功于我非常感兴趣的突触 (js) 。

所以我读了很多,维基百科链接和突触的 NN 101,但是在机器学习 (NN) 的使用和这些技术的意义方面,有很多我不理解(但我想)的基本问题。

比方说,我不想让我的网络(有点)学习(类似的)重力,所以为了训练它,我输入了 10 个质量和位置 x、y(和 z)的对象,然后我设置了输出每个对象的新 x、y(和 z)。我想我应该给它几个配置和一切,但这是问题所在;那么,它可以计算 10000、100000 个对象之间的交互吗?

在我学习的这个阶段,我不清楚的是教/训练神经元计算 XOR 的意义是什么,就像突触的文档中显示的那样:

var trainingSet = [
    {
        input: [0,0],
        output: [0]
    },
    {
        input: [0,1],
        output: [1]
    },
    {
        input: [1,0],
        output: [1]
    },
    {
        input: [1,1],
        output: [0]
    },
];

var trainer = new Trainer(myNetwork);
trainer.train(trainingSet);

我们是否只是将所有可能的输入和输出提供给 XOR。

好吧,由于我对技术完全陌生,我认为我的问题充满了无意义的东西,但感谢您的阅读和您可能带来的帮助:)

2个回答

重力

基本上,您希望找到一个将输入(具有质量和位置的对象)映射到输出(新位置)的函数。没有必要为每个不同的对象设置一组输入神经元。对所有对象的输入变量进行通用编码就足够了。

像一个函数:

f(x,y,z,mass)(xn,yn,zn)

异或

训练异或函数是特殊的,因为早期的神经网络感知器无法学习异或函数(因为它不是线性可分的)。然而,多层感知器能够学习 XOR 函数。这只是为了证明 Synaptic 的 NN 实现能够学习非线性可分的问题

这是所有数据建模的根本挑战。我们不只是想记住给定输入和给定输出之间的链接(否则您将不会对数据进行建模,您将记住与 dict / hash / 关系数据库表 / 等的 1:1 连接) . 我们希望仅通过查看训练数据来捕获数据中的潜在模式。

让我们稍微扩展一下您的重力示例。您有 10 个训练样本,显示了物体掉落的开始和结束位置。为了保持一致性,假设对象在最初记录对象位置的那一刻被丢弃,而结束位置是在稍后的某个精确时间间隔(但在对象撞到地面之前)记录的。我们还假设模型(在这种情况下为神经网络)设法精确地学习了预期的位置变化,因为它只是归结为一个轴上的减法。您可以向它展示另外 10、100、1000 个示例,这些示例都利用找到的连接,并且您的模型将保持良好的性能。

为什么不继续使用 10k、100k 甚至更多样本?从理论上讲,如果您设法隔离连接并每次都以相同的方式运行实验,您的模型将始终有效。但实际上,系统最终会发生一些变化。您聘请了一位新的实验室助理,他倾向于在放下物体后很好地按下“记录位置”按钮(给物体更多的初始速度,您不会注意到只有记录的位置)。也许你失去了最初的球,不得不使用其他更轻、更能抓住风的东西(所以它跑得更慢)。.... 运行实验的时间越长,系统中的小变化就会越多。最终,这些更改将改变连接,足以使您的初始模型出错。

在对数据进行建模时,我们希望捕获底层模式并承认模型只有在这些底层模式保持相关时才重要。这实际上与样本数量无关。这是关于连接/模型本身的。样本数量恰好是我们拥有的更好的代理之一 - 您使用的样本越多,您就越有信心拥有一些潜在的模式。“统计有效性”是解决这个问题的一个尝试,尽管它的有效性在大数据时代仍有待商榷。很多工作试图解决如何获得对神经网络良好泛化的信心,但这仍然是一个非常悬而未决的问题。

再举一个不同的例子,如果您正在查看用户行为,您会发现白天和黑夜之间的差异;工作日和周末;夏季和冬季;一个人的一生;一个人成长的文化……即使你证明你在最初的样本中找到了一个模式,系统最终也会改变,你发现的连接是系统的一部分还是改变了,这取决于运气。系统的一部分没有。