4.2 比较:误差与比例尺
在前一章中,我们的神经网络给出了预测的结果。但这个结果并不是真实的结果。但是我们知道真实的结果是什么。我们只需要比较我们预测的结果与真实的结果,就知道我们的神经网络预测的误差是多少,从而调整权重使得下一次的误差变小。
为了说明这一点,我们首先来尝试一下一个最简单的单节点神经网络模型。在Jupyter Notebook中,输入以下的代码:
knob_weight = 0.5
input = 0.5
goal_pred = 0.8
pred = input * knob_weight
error = (pred - goal_pred)**2 # 误差
print(error)
输出的误差应该是0.3025,请你仔细体会一下这个最简单的神经网络模型的比较和误差。
这里我们对比较的结果进行了平方,否则误差将会有正负,负的误差是不允许出现的。而且平方的误差值会使得大的误差更大,小的误差更小,这其实会使得神经网络学习的效率变快。数学上,称这种平方误差为误差的第二范数。
我们刚刚使用了一个权重的最简单的单节点神经网络。假如换到两个节点呢?
也许你会想,我们只需要将上面的代码简单地推广成下面这样:
knob_weight = [0.5, 0.2]
input = [0.5, 0.5]
goal_pred = [0.75,0.3]
pred = [input[0]*knob_weight[0] ,input[1]*knob_weight[1]]
error = (pred[0]-goal_pred[0])**2 + (pred[1]-goal_pred[1])**2
print(error)
这毫无疑问是对的。在单节点的神经网络中,我们说误差变大和变小都是和自己做比较,影响因素是单一的权重。因此理解起来并没有什么问题。但是在多节点的神经网络中,误差变大和变小的因素就有多个可能的影响。这时候,如果我们错误地估计了误差,会使得神经网络学习的效率变得极低甚至无法学习到准确的结果。
或许你很难理解这一点,我举个例子。比如有一组数据,它记录一组交易数据,第一个数据是开盘价,第二个数据是收盘价,第三个价格是成交额,第四个数据是成交量。如果我们要用这组数据来预测第二天的一组交易数据。假如我们简单地用上面的推广来预测,并且计算相应的误差。那么我们会得到一个非常荒谬的结论:误差最大的因素是成交额,其次是成交量。这是因为我们把价格和成交额放在一起比较大小了。这就是对于误差的一种最常见的,最容易犯的错误。
正确的做法是将价格和某个基准价格(标尺)比较,将其比例值看作是输入数据。同样地,也要将成交额和某个基准成交额做比例关系。请记住,大小是相对的概念,1米相对于1公里是很小的值,但是相对于1毫米则是很大的值。我们一定要把数据无量纲化,才能说这些数据彼此之间的大小关系。否则100可能实际上比1小,比如100米小于1公里。
在使用神经网络做学习时,请记住一点,数据一定要做无量纲处理。数学上叫做正规化处理。一定要有比例尺的概念,引入基准比例尺是非常重要的正规化步骤。