我编写了一个用于符号识别的简单前馈人工神经网络。
我有一组6个可能的符号,排列在一个5×5的像素网格中。
这些符号是 {X, +, -, \, /, |}
例如,X
将是:
X = [1,0,0,0,1, 0,1,0,1,0, 0,0,1,0,0, 0,1,0,1,0, 1,0,0,0,1]
灰色噪声区域的值可以在0到1之间变化。
我的ANN由25个输入神经元(5×5网格)、6个带偏置的隐藏神经元和6个输出神经元组成。
每个输出神经元对应一个符号。输出值在0到1之间,决定了它识别哪个符号,即选择输出节点最大值对应的符号。
例如,如果输出是 {X : 0.9, + : 0.2, - : 0.1, \ : 0.15, / : 0.15, | : 0.2}
,那么识别的符号将是 X
。
它似乎运行得很好。接着我进行了以下实验:
我获取了测试输入(上述6个符号),并创建了一个噪声函数 addNoise(n)
,其中 n
是随机添加到该输入的噪声百分比。
对于从 0
到 1
的每个噪声值,我运行了 2000
次测试(每次噪声略有随机变化)。当对 X
进行此操作时,我得到了以下图表。
您可能需要在另一页面打开图片以查看全尺寸。
如您所见,在我向X测试输入注入大约 40%
(x轴上的400)的噪声后,它开始预测其他符号。
在向 X
增加 70%
的噪声后,网络预测 X
和 \
的几率相等。
无论如何,我的疑问是:
图表上 \
和 /
的线条不应该几乎完全对齐吗,因为它们相对于 X
符号是相同的?
为了澄清,在增加 70%
的噪声后,网络会同样混淆 X
和 \
。
然而,在大约 88%
的噪声后,网络会同样混淆 X
和 /
。
为什么我的网络会产生这样的结果?
回答:
您假设网络在训练期间学习了字符 X
的 完整
表示。也许它学到的内部表示对 /
有很大偏见,并混合了一些 \
。即如果输入有强烈的 /
成分和一些 \
成分——那么预测 X
。这种信息足以在干净时将 X
与其他字符区分开。训练神经网络是基于损失函数的,如果这种表示已经满足我们的类别,网络就没有必要学习更健壮的表示。
在这种假设情况下,注入少量噪声会比注入大量噪声更容易遮蔽 \
成分,而遮蔽 /
成分则需要注入大量噪声。