一、损失函数
1.均方误差
均方误差是各数据偏离真实值的距离平方和的平均数,也即误差平方和的平均数,用σ表示。
这里表示的是神经网络的输出,表示的是真实值,i表示每个数据。
用Python代码实现,具体如下:
def mean_squared_error(p,y):
return np.sum((p-y)**2)/y.shape[0]
动物分类的例子,我们将猫份为类1,狗分为类2,小鸡分类为3,如果不属于任何一类就分为类0。假设我们在这里输入了一张猫的照片,其对应的真是标签是0 1 0 0(ont-hot编码形式):
,
通过代码来看:
import numpy as np
y = np.array([0,1,0,0]) # y的真实标签
p = np.array([0.3,0.2,0.1,0.4]) #通过Softmax得到的概率值
def mean_squared_error(p,y):
return np.sum((p-y)**2)/y.shape[0]
print(mean_squared_error(p,y))
运行结果:
如果分类的类别是正确的,则输出的是0.05500000000014
import numpy as np
y = np.array([0,1,0,0]) # y的真实标签
p = np.array([0.2,0.6,0.1,0.1]) #通过Softmax得到的概率值
def mean_squared_error(p,y):
return np.sum((p-y)**2)/y.shape[0]
print(mean_squared_error(p,y))
运行结果:
第一个例子中,我们输入的图片是猫,但是神经网络认为是鸡,损失函数的输出约为0.23;
第二个例子中,我们输入的图片是猫,神经网络也认为是猫,损失函数的输出约为0.055.
可以看出第二个例子的损失函数较小,意味着其与真实值之间的误差较小。
2.交叉熵误差
同样的例子,在使用Softmax层时,对应的目标值y以及训练结束前某次输出的概率值y_predict分别为:
,
Softmax使用的损失函数为交叉熵,其中C代表类别数量:
在训练过程中,我们的目标是最小化Loss的值,y已经是ont-hot类型了,我们输入的图片是猫,所以我们知道y1=y3=y4=0,y2=1,所以带入Loss函数中可以得到:
def cross_entropy_error(p,y):
return np.sum(-y*np.log(p))
p代表预测值;y表示真实值