如何构建神经网络以将两个数字相乘
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
【讨论】:
以上是关于如何构建神经网络以将两个数字相乘的主要内容,如果未能解决你的问题,请参考以下文章