Python数据科学程序员

深度学习入门--损失函数

2019-03-26  本文已影响5人  爱吃西瓜的番茄酱

神经网络的学习是指从训练数据中自动获取最优权重参数的过程,损失函数就是用来衡量神经网络的学习的程度,学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。

从数据中学习

神经网络的特征就是可以从数据中学习。所谓“从数据中学习”,是指,可以由数据自动决定权重参数的值。

数据是机器学习的核心。对于一般的图像识别而言,先是从大量的图像中提取特征量,这里所说的“特征量”是指从输入数据中准确的提取本质数据的转换器。图像的特征量通常表现为向量的形式。在计算机视觉领域,常用的特征量包括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

可以看出。第一例输出的损失函数的值更小,和前面的结论一致。

每天学习一点点,每天进步一点点。

上一篇下一篇

猜你喜欢

热点阅读