例如,如果我有一个正在玩跳棋/跳棋的神经网络,并试图进行无效的移动,有没有一种方法可以专门优化那个特定的输出?
---------------------------------------
8 | | bM | | bM | | bM | | bM |
---------------------------------------
7 | bM | | bM | | bM | | bM | |
---------------------------------------
6 | | bM | | bM | | bM | | bM |
---------------------------------------
5 | | | | | | | | |
---------------------------------------
4 | | | | | | | | |
---------------------------------------
3 | wM | | wM | | wM | | wM | |
---------------------------------------
2 | | wM | | wM | | wM | | wM |
---------------------------------------
1 | wM | | wM | | wM | | wM | |
---------------------------------------
A B C D E F G H 如果棋盘看起来像这样,在吃水区域中的每一个可能的移动(在任何方向上最多移动2次)都有一个输出神经元,那么64 *8个输出神经元,如果最高概率的输出是神经元8(或任何其他无效输出),这将类似于B1C2 (B1是开始位置,C2是结束位置)。
如果神经网络的输出已经是概率分布,是否有一种方法可以更新网络,使此特定输出为0,并对所有其他输出进行更新和归一化?
我试着查看了在mnist数据集和adamoptimizer上训练的神经网络的例子,但找不到任何只改变一个特定输出而不是改变整个输出层的东西。
谢谢你的帮助!
发布于 2018-12-18 21:47:37
对于这个特定的例子,你最好重组你的网络,只包括可能有效的移动。B1C2永远不会是一个有效的举动,所以不要让它成为你网络的一部分。
对于可能有效但实际上无效的移动,例如B2C3 (在第一轮中无效,但在移动当前在C3上的棋子之后有效),您可以编写一个自定义激活函数,但只调整输出可能会更容易。
您可以编写一个函数,将每个无效移动设置为零,然后将所有其他答案除以(1 -无效移动预测的总和)。请注意,这假设您已经使用softmax作为最后的激活函数。
基于以下后续问题的编辑:
您可以编写一个函数,该函数将棋盘状态和预测作为输入,并返回无效移动设置为零的预测,并对其余预测进行标准化。
如果不是修改最终结果,而是让网络了解哪些移动是无效的,则可以由损失函数来处理。例如,如果你正在做深度Q学习,那么你会对无效移动的分数增加沉重的惩罚。
https://stackoverflow.com/questions/53834072
复制相似问题