本博客参考书籍:深度学习入门(斋藤康毅著)
神经网络输出层的误差由来
-
我们在上一节讲到过one-hot编码,对于一个mnist手写数字图片,如果它的标签为1,那么它的one-hot编码为
[0,1,0,0,0,0,0,0,0,0]
, -
上一节我们也提到过softmax函数,对于一个神经网络的输出层来说,softmax函数将该输出层的拟输出转化为最终输出z=[z1,z2,…](元素之和为零)
- 这时我们发现,将上面两点信息结合起来,如果将一个标签为1的mnist手写数字图片作为神经网络的输入层,那么它的输出层的最终输出,理想情况下应该是它的one-hot编码
[0,1,0,0,0,0,0,0,0,0]
,我们将其称为神经网络的理想输出t=[0,1,0,0,0,0,0,0,0,0];但是事实往往不是这样,假设最终输出为[0.1,0.6,0.0.5,0.05,0.1,0.0,0.1,0.0,0.0]
,我们称之为神经网络的实际输出z=[0.1,0.6,0.0.5,0.05,0.1,0.0,0.1,0.0,0.0]
我们取实际输出y中相对值最大的值(0.6)对应的标签就是最终标签,另外的0.4被分散到了其它标签,那么这个0.4就是误差
从概率论的角度来看,理性输出t和实际输出y都是一种概率分布(离散型随机变量的概率质量函数,如下表)
X | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
z | 0.1 | 0.6 | 0.0 | 0.5 | 0.05 | 0.1 | 0.0 | 0.1 | 0.0 | 0.0 |
t | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
损失函数
权重参数对神经网络的输出值有影响
我们知道,输入值是不变的,影响神经网络的最终输出值的因素只有权重参数和偏置,两者的改变会直接导致神经网络输出的变化
量化神经网络的表现
当权重参数和偏置取不同的值时,神经网络会有不同的表现,如何将这种表现量化呢(就是怎么样才能说神经网络的表现是好的,我们当然知道当神经网络实际输出等于理想输出时它的表现最好,但我们仍然需要将其量化)?
如何取得量化值
我们想到,可以使用一个值来评价它(就像评价一个学生常常通过考试分数一样),这个值怎么取?
我们要使用一个函数,将神经网络的实际输出(y)与理想输出(t)作为自变量,函数值作为因变量,那么这个函数值就是我们要求的能够反映神经网络性能的指标,而这个函数就是损失函数,神经网络训练的过程,就是找到合适的权重参数使得损失函数的值最小化
上面的图示过程中有一个注意的标记。实际上,尽管损失函数只输出一个函数值用于反映神经网络性能,但是实际输出与理想输出之间的误差还是需要反映到每个神经元上的,只有这样才有了后面的误差反向传播的过程,所以便有了图中的误差矩阵
误差矩阵e=[e1,e2,e3,…],其中的每个元素都对应了神经网络输出层的一个神经元,表示该神经元的输出误差
均方损失函数
数学表达式
损失函数有很多种,其中最有名的就是均方误差函数,它的数学表达式为
数学原理
计算预测值和真实值之间的欧式距离。预测值和真实值越接近,两者的均方差就越小
代码实现
def mean_squared_error(y,t):
return 0.5*np.sum((y-t)**2)
交叉熵损失函数
数学表达式
数学原理
交叉熵的定义与熵的定义类似,区别在于前者定义在两个概率分布之上,用于衡量两个概率分布的差异;而后者定义在一个概率分布之上,用于衡量离散型随机事件出现的概率(当离散型随机事件服从均匀分布时,信息熵具有极大值,也可以说此时系统是最混乱的)
交叉熵越大表明两个概率分布的差异越大,即神经网络的实际输出与理想输出之间的差异就越大
代码实现
def cross_entropy_error(y,t):
delta=1e-4 # 对数函数log()在自变量取零时值趋于无穷大,在此为y加上一个偏移量
return -np.sum(t*np.log(y+delta))