神经网络激活函数用tanh,但是预测结果还是只有正数?

神经网络学习,因为输出变量中有负数,所以把激活函数从sigmoid变成了tanh,但是预测结果还是只有正数,请问有人知道是怎么回事吗?

以下为ChatGPT回答:

如果你在输出层使用了tanh激活函数,那么理论上输出值的范围应该是[-1, 1]之间。如果你的模型输出只有正数,那么这可能说明你的模型存在问题。

有以下一些可能导致这个问题的原因:

1. 数据预处理不正确:如果你对数据进行了归一化或标准化操作,而且没有正确地将其还原到原始尺度上,那么输出结果可能会受到影响。请检查你的数据预处理代码是否正确,确保数据被还原到正确的尺度上。

2. 模型结构问题:如果你的模型结构不正确,可能会导致输出结果异常。请检查你的模型结构,确保它符合你所需要解决的问题,并且没有出现过拟合或欠拟合等问题。

3. 训练参数设置不当:如果你的训练参数设置不当,可能会导致模型无法收敛或者出现其他问题。请检查你的训练参数,并调整学习率、批大小等参数,以便更好地优化模型。

4. 输出层的激活函数可能未正确定义:请检查你的代码,确认你已经正确地将tanh激活函数用于输出层,并且没有误将其用于其他层。

希望以上信息可以帮到你找出问题所在,祝你好运!

以下回答参考GPT并且由Bony-整理:
即使将激活函数从sigmoid改为tanh,神经网络的输出仍然可能是正数或负数。如果预测结果始终是正数,有可能是以下原因之一:

数据预处理的问题。如果在预处理数据时将所有标签值强制转换为正数,那么训练出的模型也只能预测正数。需要检查数据预处理的代码是否存在这种情况。

模型设计的问题。如果模型的最后一层没有正确配置,则输出结果可能会始终为正数。可以检查模型的最后一层的激活函数和输出维度是否正确。

模型训练的问题。如果模型训练不充分,模型可能无法学习到负数的预测结果。可以检查模型的训练数据是否足够多,并且训练次数是否充足。

总之,需要对模型、数据预处理和训练过程进行仔细的检查,以找到问题所在。

  • 这篇博客: 自然语言处理之神经网络基础中的 3.3 sigmoid / tanh 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. 在引入修正线性单元之前,大多数神经网络使用sigmoid函数g(z)=σ(z)g(z)=\sigma(z)g(z)=σ(z),或者双曲正切函数g(z)=tanh(z)g(z)=tanh(z)g(z)=tanh(z)作为激活函数。这两个激活函数密切相关,因为tanh(z)=2σ(2z)−1tanh(z)=2\sigma(2z)-1tanh(z)=2σ(2z)1

    2. 与修正线性单元不同,sigmoid单元和tanh单元在其大部分定义域内都饱和,仅仅当zzz在 0 附近才有一个较高的梯度,这会使得基于梯度的学习变得非常困难。因此,现在不鼓励将这两种单元用作前馈神经网络中的激活函数。

    • 如果选择了一个合适的代价函数(如对数似然函数)来抵消了sigmoid的饱和性,则这两种单元可以用作输出单元(而不是隐单元)。
    • 如果必须选用sigmoid激活函数时,tanh激活函数通常表现更佳。因为tanh函数在 0点附近近似于单位函数g(z)=zg(z)=zg(z)=z
    1. sigmoid激活函数在前馈神经网络之外的神经网络中更为常见。

      有一些网络不能使用修正线性单元,因此sigmoid激活函数是个更好的选择,尽管它存在饱和问题。

    • 循环神经网络:修正线性单元会产生信息爆炸的问题。
    • 一些概率模型:要求输出在 0~1 之间。
  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料中的描述,tanh函数的输出应该是在 -1 和 1 之间的。如果模型的输出仍然只有正数,那么有可能是其他部分代码的问题,例如数据处理、模型定义等。因此,可以尝试进行以下步骤来解决问题:

    1. 确认数据处理部分没有问题。如果使用了归一化或标准化等技术,在转换之前需要检查数据是否能够覆盖到正负数区间,或者是否需要进行缩放。
    2. 检查模型的输出结构和定义是否正确。可以使用print语句或调试器来观察模型在测试集上的输出。
    3. 如果模型输出仍然有问题,可以尝试使用其他的激活函数,例如ReLU或Leaky ReLU等。这些函数更容易解决梯度消失问题,同时可以帮助训练更深的网络。

    针对参考资料中的tanh函数的描述,可以通过以下代码尝试画出tanh函数的曲线:

    import matplotlib.pyplot as plt
    import numpy as np
    
    def tanh(x):
        return np.tanh(x)
    
    x = np.linspace(-8, 8, 100)
    y = tanh(x)
    
    plt.plot(x, y)
    plt.show()
    

    如果正确实现,应该可以看到图像在 -1 和 1 之间来回震荡。如果图像偏移了或不对称,说明可能存在其他的问题。