如何构建神经网络以将两个数字相乘

Posted

技术标签:

【中文标题】如何构建神经网络以将两个数字相乘【英文标题】:How to build a Neural Network to multiply two numbers 【发布时间】:2019-03-10 16:27:02 【问题描述】:

我正在尝试构建一个可以将 2 个数字相乘的神经网络。为了做同样的事情,我得到了 scikit-learn 的帮助。我将使用具有 2 个隐藏层 (5, 3) 和 ReLU 作为我的激活函数的神经网络。

我已将我的MLPRegressor 定义如下:

X = data.drop('Product', axis=1)
y = data['Product']
X_train, X_test, y_train, y_test = train_test_split(X, y)
scaler = StandardScaler()
scaler.fit(X_train)

X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
mlp = MLPRegressor(hidden_layer_sizes=(5, 3), activation="relu", learning_rate="adaptive", max_iter=500000, verbose=True, validation_fraction=0.25)

这里,data 是包含 3 列、2 个随机数和 1 个产品列的数据框。 问题是我得到的损失是 10 ^ 14。如何减少这种损失,提高我的模型性能以及在这种情况下所有可能的变化可以帮助我吗?

【问题讨论】:

【参考方案1】:

我不是神经网络专家。我会对输入进行日志转换,然后将它们输入网络,然后对输出进行指数化。只是一个想法。

【讨论】:

【参考方案2】:

我相信只有两个隐藏层的 NN 不足以执行任意数字的乘法运算。请注意,N * M 的乘法等于 N 的 M 倍加法。有神经网络可以执行加法,但您必须考虑一般条件。此外,您必须决定如何定义网络的输入和输出:您想要两个输入神经元和一个输出神经元,还是想要两个乘数在网络中是二进制的(作为向量)?如果你在两个输入神经元中给出十进制值,我认为你必须标准化你的输入值。

【讨论】:

我的数据由小数点组成,范围从 -10000 到 10000。我已经对我的输入训练集进行了标准化。我是否也需要标准化我的输出值?另外,我希望我的神经网络有两个输入节点和一个输出节点,这样当我预测说 [2, -3] 时,它会给我近似预期的输出。 当然,输出值也必须归一化。请注意,根据数据类型,可能会出现舍入错误,并且您的训练数据已经包含错误。只是出于兴趣:你为什么要使用神经网络来完成这项任务?如果只是为了了解它,可能会有更好的例子。 输出的归一化应该在scaler.fit(X_train)的基础上进行还是应该独立完成?另外我想看看神经网络的局限性,如果它可以逼近任何给定足够能力的函数,它是否可以通过从数据中学习来完成这个简单的任务。 虽然我不明白标准化输出将如何影响结果。 我还没有使用 scikit learn。然而,重要的是,神经元连接处的权重对结果具有决定性意义。同时,它们的有效范围(尤其是它们不“二进制”(开/关)工作的范围)受到所使用的激活函数的限制。如果您现在使用标准化的输入值,但仍想获得高输出值,则权重必须变得非常大。因此,对输入值和输出值进行归一化是有意义的。【参考方案3】:

有办法做到这一点。这是一个近似乘法函数以将 1000 - 10000 范围内的数字相乘的神经网络,如果数字范围有限,它可以很好地工作。这是gist link

【讨论】:

以上是关于如何构建神经网络以将两个数字相乘的主要内容,如果未能解决你的问题,请参考以下文章

如何实现两个数字相乘。在JS中

如何在 MIPS 中将两个数字相乘,得到大于 32 位的乘积?

Vuejs:如何循环开始时间以将结束时间与var x相乘

如何将两个数组与每个元素相乘作为数字c ++

如何在汇编中将两个十六进制 128 位数字相乘

卷积神经网络学习笔记与心得卷积