我已经在python中构建了我的第一个神经网络,并且一直在尝试一些数据集;到目前为止一切顺利!
我有一个关于用多个结果建模事件的快速问题:-
假设我希望训练一个网络来告诉我每个跑步者赢得100米短跑的概率。我会给网络提供关于每个跑步者的所有相关数据,并且输出的数量将等于比赛中跑步者的数量。
我的问题是,使用sigmoid函数,如何确保输出的总和等于1.0?网络会自然地学会这样做,还是我必须以某种方式明确地实现这一点?如果是这样,我该如何做?
非常感谢。
回答:
你的神经网络的输出将接近 1。我不认为它实际上会达到 1。
你实际上不需要看哪个输出等于 1。一旦你将你的网络训练到一个特定的误差水平,当你呈现输入时,只需查找输出层中的最大输出即可。例如,假设你的输出层呈现以下输出:[0.0001, 0.00023, 0.0041, 0.99999412, 0.0012, 0.0002]
,那么赢得比赛的跑步者是 4 号跑步者。
所以是的,你的网络会“学会”产生 1,但它不会完全是 1。这就是你训练到一定误差率的原因。我最近创建了一个神经网络来识别手写数字,这就是我使用的方法。在我的输出层中,我有一个包含 10 个分量的向量。第一个分量代表 0,最后一个分量代表 9。所以当我向网络呈现 4 时,我希望输出向量看起来像[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
。当然,这并不是我真正得到的,但这就是我训练网络提供的结果。所以要找到它是哪个数字,我只需检查哪个分量具有最高的输出或分数。
现在在你的第二个问题中,我相信你是在问如何网络会学会提供正确的答案?为此,你需要为你的网络提供一些训练数据并训练它,直到输出低于某个误差阈值。所以你需要的是一组包含输入和正确输出的数据。最初,你的神经网络将被设置为随机权重(有一些算法可以帮助你选择更好的权重以最大限度地减少训练时间,但这有点高级)。接下来,你需要一种方法来告诉神经网络从提供的数据中学习。所以基本上你将数据交给神经网络,它提供一个输出,这很可能是错误的。然后你将该数据与预期的(正确的)输出进行比较,你告诉神经网络更新其权重,使其更接近正确的答案。你一遍又一遍地执行此操作,直到误差低于某个阈值。
最简单的方法是实现随机反向传播算法。在此算法中,你计算神经网络的实际输出和预期输出之间的误差。然后,你将误差从输出层反向传播到隐藏层的权重,并在进行过程中调整权重。然后,你重复此过程,直到你计算出的误差低于某个阈值。因此,在每个步骤中,你都越来越接近你的解决方案。
你可以使用此处描述的算法。其中涉及大量的数学运算,所以请做好准备!如果你想查看此算法的实现示例,可以查看我在 github 上的这个 Java 代码。该代码也使用动量和一种简单的模拟退火形式,但标准的反向传播算法应该很容易辨别。关于反向传播的维基百科文章有一个链接,指向 Python 中反向传播算法的实现。
你可能无法立即理解该算法;预计会花费一些时间来理解它并完成一些数学运算。我在编码时坐在纸和笔旁,这就是我最终了解发生了什么的方式。
以下是一些资源,应该可以帮助你更好地理解反向传播:
如果你想要更多资源,你也可以看看我这里的回答。