深度学习入门--损失函数
神经网络的学习是指从训练数据中自动获取最优权重参数的过程,损失函数就是用来衡量神经网络的学习的程度,学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。
从数据中学习
神经网络的特征就是可以从数据中学习。所谓“从数据中学习”,是指,可以由数据自动决定权重参数的值。
数据是机器学习的核心。对于一般的图像识别而言,先是从大量的图像中提取特征量,这里所说的“特征量”是指从输入数据中准确的提取本质数据的转换器。图像的特征量通常表现为向量的形式。在计算机视觉领域,常用的特征量包括SIFT、SURF和HOG等。使用这些特征量将图像数据转换为向量,然后对转换后的向量使用机器学习中的SVM、KNN等分类器进行学习。
在机器学习的方法中,将图像转换为向量时使用的特征量仍是由人设计的,而在神经网络中,连图像中包含的重要特征量也都是由机器来学习的。
在机器学习中,一般将数据分为训练数据和测试数据。首先使用训练数据进行学习,寻找最优的参数;然后使用测试数据评价训练得到的模型的实际能力。
泛化能力是指处理未被观察过的数据的能力,获得泛化能力是机器学习的最终目的。
过拟合是指可以顺利处理某个数据集,但无法处理其他数据集的情况。
损失函数
神经网络的学习中所用的指标称为损失函数,损失函数的值越小,则代表神经网络的学习的效果越好。
常用的损失函数有两种:
- 均方误差
- 交叉熵误差
均方误差
用Python实现均方误差:
import numpy as np
def mean_squared_error(y, t):
return 0.5 * np.sum((y-t)**2)
这里的参数y和t都是numpy数组,现在再用这个均方误差的公式来实际算一哈:
# 设"2"为正确解
t=[0,0,1,0,0,0,0,0,0,0]
# "2"的概率最高的情况(0.6)
y=[0.1,0.05,0.6,0.0,0.05,0.1,0.0,0.1,0.0,0.0]
print(mean_squared_error(np.array(y), np.array(t)))
# 设"2"为正确解
t=[0,0,1,0,0,0,0,0,0,0]
# "5"的概率最高的情况(0.6)
y=[0.1,0.05,0.05,0.0,0.6,0.1,0.0,0.1,0.0,0.0]
print(mean_squared_error(np.array(y), np.array(t)))
输出为:
0.09750000000000003
0.6475
这里的输出y是softmax函数的输出(概率输出);t是监督数据,采用one-hot表示
:即正确解标签表示为1,其余解标签表示为0。
可以看出,第一个例子的损失函数的值更小,也就是说第一个例子的输出结果和监督数据更加吻合。
交叉熵误差
用Python实现交叉熵误差:
import numpy as np
def cross_entropy_error(y, t):
delta=1e-7 # 添加一个微小值防止溢出
return -np.sum(t*np.log(y+delta))
同样,参数y和t都是numpy数组。再用上面的例子计算一次:
# 设"2"为正确解
t=[0,0,1,0,0,0,0,0,0,0]
# "2"的概率最高的情况(0.6)
y=[0.1,0.05,0.6,0.0,0.05,0.1,0.0,0.1,0.0,0.0]
print(cross_entropy_error(np.array(y), np.array(t)))
# 设"2"为正确解
t=[0,0,1,0,0,0,0,0,0,0]
# "5"的概率最高的情况(0.6)
y=[0.1,0.05,0.05,0.0,0.6,0.1,0.0,0.1,0.0,0.0]
print(cross_entropy_error(np.array(y), np.array(t)))
输出为:
0.510825457099338
2.9957302735559908
可以看出。第一例输出的损失函数的值更小,和前面的结论一致。
每天学习一点点,每天进步一点点。