【问题标题】:Training Multi-Layer Perceptron correctly for powers of 2正确训练多层感知器以获得 2 的幂
【发布时间】:2017-12-17 14:34:33
【问题描述】:

我对神经网络世界很陌生,我学习了一些教程并且能够实现 MLP,但是激活函数是双曲正切,其范围是 [-1:1]。

我写了一个这样的训练文件:1 2 3 4 ... n

目标输出文件是 2 的幂:2 4 8 16 ... 2^n

我想让网络模拟这个函数,但不知道如何调整学习率动量激活函数 为了正确模拟。

我尝试了激活函数f(x) = x(带导数 1)来克服范围问题(输出在 -1 和 1 之间),但是我的输出和错误随之增长得非常快,即使我降低了学习率,所以我对如何修改这些参数以模拟f(x) = 2^x 或如何正确训练网络感到困惑。

我应该怎么做才能让这个 MLP 工作?

【问题讨论】:

    标签: neural-network perceptron


    【解决方案1】:

    我更喜欢得到每个2^Nbinary 表示,并以0.01 的学习率和Sigmoid 激活函数对其进行训练。

    很难精确生成小数中的 2、4、8,可能会发生溢出,您的输出将变为 nan。而是为所有ys 生成相同长度的二进制表示并为此训练您的网络。

    import numpy as np
    x = np.arange(5)
    y = np.power(2, x)
    x = x.reshape((-1, 1))
    lr = 0.01
    o = list(map(lambda x:int(np.binary_repr(x)), y))
    o = list(map(lambda x:"{:010d}".format(x), o))
    y = np.array(list(map(lambda x: [int(i) for i in x], o)))
    print(y, x)
    

    这就是你得到的。

    (array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
            [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
            [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
            [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
            [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]]), array([[0],
            [1],
            [2],
            [3],
            [4]]))
    

    不让溢出发生是我们的责任。所以激活函数是必要的。您可以在激活函数范围内使用自己的中间表示。

    【讨论】:

    • 是的,nan 正是我在 10 或 11 个训练步骤后得到的。我不明白您所说的二进制表示是什么意思...您的意思是作为输入例如 3 和作为输出 1 0 0 0 ?对我来说似乎有点奇怪,因为我只是为f(x) = 2^x创建抛物线@
    • 二进制表示f(x) = 2^x, f(3) = 2^3 = 8 = 1 0 0 0
    • 在这种情况下,您必须指定位长、32、64 等。我给出的最大长度为 10。您可以训练 f(x),它可以用您指定的位数表示跨度>
    • 我不知道我是否明白你所说的,简而言之,你是否建议最好找到一种方法将输出表示为从 0 到 1 的值?如果是这样的话看起来很有趣(一旦我的网络已经这样做了,它就可以解决 XOR 问题等)
    • 是的。它可以是 0 到 1(sigmoid)或 -1 到 1(tanh)或任何其他避免溢出的值。
    猜你喜欢
    • 2023-03-29
    • 2021-12-15
    • 2017-06-12
    • 2014-11-04
    • 1970-01-01
    • 2021-07-13
    • 2016-03-02
    • 2010-10-05
    • 2021-09-07
    相关资源
    最近更新 更多