我在使用神经网络进行强化学习。我的神经网络有4个输出节点,每个输出节点对应一个不同的动作。隐藏层和输出层使用了Sigmoid激活函数。
我遇到的问题是,在某些输入下,几个输出节点的值相同(例如,它们的输出值为1)。我不知道在这种情况下该怎么做。有没有办法可以解决这个问题,让没有两个输出节点具有相同的值?或者只是在最高值的输出节点对应的动作之间随机选择一个?
回答:
考虑到您的设置(即每个动作对应一个输出),某些平局是不可避免的。尽管如此,您可以采取一些措施来缓解这个问题。
-
您可以通过选择一个不会像Sigmoid那样饱和的激活函数来减少平局的几率。例如,您可以尝试使用整流线性激活函数(https://en.wikipedia.org/wiki/Rectifier_(neural_networks))。
-
您可以通过将Sigmoid的输入乘以一个小于1的常数来使其斜率变得更缓。
-
您可以尝试在输出层应用Softmax函数(https://en.wikipedia.org/wiki/Softmax_function)。请注意,如果您选择这样做,您不应在输出层应用Sigmoid激活函数,因为Softmax函数只会放大现有的差异。
-
当确实出现平局时,您可以随机选择一个动作(如您自己建议的),或者您可以简单地选择列表中的第一个动作。最后这个选项会使您的学习算法偏向于尝试第一个动作,但如果您的学习算法足够有效,它最终应该能够学会在哪些情况下这是错误的动作,从而减少对这些动作的重视程度。
或者,您可以尝试完全不同的方式来处理您的输出(这取决于您的问题领域)。例如,如果您的四个动作是“向北移动”、“向东移动”、“向南移动”和“向西移动”,您可以给网络两个输出,一个决定是水平移动还是垂直移动(从而将动作分为“向北或向南移动”和“向东或向西移动”),第二个输出提供剩余选项之间的决胜因素。