神经网络的学习中的“学习”是指从训练数据中自动获取最优权重参数的过程。

为了使神经网络能进行学习,将导入损失函数这一指标。而学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。为了找出尽可能小的损失函数的值,我们将介绍利用函数斜率的梯度法。

神经网络的学习通过某个指标表示现在的状态。然后,以这个指标为基准,寻找最优权重参数。

神经网络的学习中所用的指标称为损失函数(loss function)。这个损失函数可以使用任意函数,但一般用均方误差和交叉熵误差等。

损失函数是表示神经网络性能的“恶劣程度”的指标,即当前的神经网络对监督数据在多大程度上不拟合,在多大程度上不一致。

1. 为什么要设定损失函数

在神经网络的学习中,寻找最优参数(权重和偏置)时,要寻找使损失函数的值尽可能小的参数。为了找到使损失函数的值尽可能小的地方,需要计算参数的导数(确切地讲是梯度),然后以这个导数为指引,逐步更新参数的值。

假设有一个神经网络,现在我们来关注这个神经网络中的某一个权重参数。此时,对该权重参数的损失函数求导,表示的是“如果稍微改变这个权重参数的值,损失函数的值会如何变化”。

  • 如果导数的值为负,通过使该权重参数向正方向改变,可以减小损失函数的值;
  • 如果导数的值为正,则通过使该权重参数向负方向改变,可以减小损失函数的值;
  • 当导数的值为 0 时,无论权重参数向哪个方向变化,损失函数的值都不会改变,此时该权重参数的更新会停在此处。

2. 损失函数分类

2.1 均方误差

可以用作损失函数的函数有很多,其中最有名的是均方误差(mean squared error )。均方误差如下式所示。

这里,yk 是表示神经网络的输出,tk 表示监督数据,k 表示数据的维数。

举例如下:手写数字识别的例子中,yk、tk 是由如下10 个元素构成的数据。

In [1]: y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]In [2]: t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]In [3]:

数组元素的索引从第一个开始依次对应数字 0, 1, 2 …… 这里,神经网络的输出 ysoftmax 函数的输出。

由于 softmax 函数的输出可以理解为概率,因此上例表示 0 的概率是0.1,1 的概率是 0.05,2 的概率是 0.6 等。

t 是监督数据,将正确解标签设为 1,其他均设为 0。这里,标签 2 为 1,表示正确解是 2 。

将正确解标签表示为 1,其他标签表示为 0 的表示方法称为 one-hot 表示。

代码实现如下:

In [3]: import numpy as npIn [4]: def mean_square(y, t):...:     return 0.5 * np.sum((y - t)**2)In [5]:

实际使用示例:

# 假设 2 为正确的预测值
In [5]: t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] # 2 的概率最高为 0.6
In [6]: y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]In [7]: mean_square(np.array(y), np.array(t))
Out[7]: 0.09750000000000003# 7 的概率最高为 0.6
In [8]: y = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]In [9]: mean_square(np.array(y), np.array(t))
Out[9]: 0.5975In [10]:

第一个例子中,正确解是 2 ,神经网络的输出的最大值是概率值为 2;
第二个例子中,正确解是 2, 神经网络的输出的最大值是概率值为 7;

如实验结果所示,我们发现第一个例子的损失函数的值更小,和监督数据之间的误差较小。也就是说,均方误差显示第一个例子的输出结果与监督数据更加吻合。

2.2 交叉熵误差

交叉熵误差(cross entropy error)也经常被用作损失函数。交叉熵误差如下式所示。

这里,log 表示以 e 为底数的自然对数(log e)。yk 是神经网络的输出,tk是正确解标签。并且,tk 中只有正确解标签的索引为1,其他均为 0(one-hot 表示)。因此,式(4.2)实际上只计算对应正确解标签的输出的自然对数。

In [10]: np.log(np.e)
Out[10]: 1.0In [11]: np.log(np.e **2)
Out[11]: 2.0In [12]:

比如,假设正确解标签的索引是 2 ,

  • 与之对应的神经网络的输出是0.6,则交叉熵误差是−log 0.6 = 0.51;
  • 若 2 对应的输出是 0.1,则交叉熵误差为−log 0.1 = 2.30;

也就是说,交叉熵误差的值是由正确解标签所对应的输出结果决定的。

自然对数的代码和图像如下所示:

import numpy as np
import matplotlib.pylab as pltdef log_e(x):return np.log(x)x = np.arange(-5.0, np.e, 0.1)
y = log_e(x)
plt.plot(x, y)
plt.xlabel("x") # x轴标签
plt.ylabel("y") # y轴标签
plt.ylim(-2, 1.2)     # 指定y轴的范围
plt.title('log_e') # 标题
plt.legend()
plt.show()


如上图所示,x 等于1 时,y 为0;随着 x 向 0 靠近,y 逐渐变小。因此,正确解标签对应的输出越大,式(4.2)的值越接近 0;当输出为 1 时,交叉熵误差为 0。此外,如果正确解标签对应的输出较小,则式(4.2)的值较大。

用代码实现如下:

In [1]: import numpy as npIn [2]: def cross_entropy(y, t):...:     delta = 1e-7...:     return -np.sum(t*np.log(y+delta))...:     In [3]: 1e-7
Out[3]: 1e-07In [4]:

参数 ytNumPy 数组。函数内部在计算 np.log 时,加上了一个微小值 delta 。这是因为,当出现np.log(0) 时,np.log(0) 会变为负无限大的 -inf ,这样一来就会导致后续计算无法进行。作为保护性对策,添加一个微小值可以防止负无限大的发生。

In [4]: t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]In [5]: y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]In [6]: cross_entropy(np.array(y), np.array(t))
Out[6]: 0.510825457099338In [7]: y = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]In [8]: cross_entropy(np.array(y), np.array(t))
Out[8]: 2.302584092994546In [9]:

第一个例子中,正确解标签对应的输出为 0.6,此时的交叉熵误差大约为 0.51。
第二个例子中,正确解标签对应的输出为0.1 的低值,此时的交叉熵误差大约为 2.3。

由此可以看出,与前面的理论描述是一致的。

2.3 mini-batch学习

2.4 mini-batch版交叉熵误差的实现

参考:《深度学习入门:基于Python的理论与实现》

机器学习入门(08)— 损失函数作用和分类(均方误差、交叉熵误差)相关推荐

  1. 神经网络的学习(训练):损失函数(均方误差、交叉熵误差)

    1 神经网络学习(训练)步骤: 初始化权值和偏置参数--1 从总训练集抽取一批数据--2 前向传播计算损失.反向传播由损失计算各参数的梯度--3 利用梯度更新参数--4 重复1.2.3 2 神经网络: ...

  2. 经典损失函数——均方误差(MSE)和交叉熵误差(CEE)的python实现

    损失函数(loss function)用来表示当前的神经网络对训练数据不拟合的程度.这个损失函数有很多,但是一般使用均方误差和交叉熵误差等. 1.均方误差(mean squared error) 先来 ...

  3. 解决pytorch二分类任务交叉熵损失函数CrossEntropyLoss报错:IndexError: Target 1 is out of bounds.

    解决方法 修改nn.CrossEntropyLoss()为nn.BCELoss() 问题解析 pytorch 中二分类任务交叉熵要用二分类交叉熵(Binary Cross Entropy),BCELo ...

  4. 神经网络中的激活函数与损失函数深入理解推导softmax交叉熵

    神经网络中的激活函数与损失函数&深入理解softmax交叉熵 前面在深度学习入门笔记1和深度学习入门笔记2中已经介绍了激活函数和损失函数,这里做一些补充,主要是介绍softmax交叉熵损失函数 ...

  5. 损失函数-负对数似然和交叉熵(Pytorch中的应用)

    文章目录 1.负对数似然损失函数 1.1.似然 1.2.似然函数 1.3.极大似然估计 1.4.对数似然 1.5.负对数似然 1.6.pytorch中的应用 2.交叉熵损失函数 2.1.信息量 2.2 ...

  6. 损失函数(交叉熵误差)

    损失函数 神经网络以某个指标为线索寻找最优权重参数.神经网络的学习中所用的指标称为损失函数 (loss function).这个损失函数可以使用任意函数,但一般用均方误差和交叉熵误差等. 交叉熵误差 ...

  7. sklearn基于make_scorer函数为Logistic模型构建自定义损失函数+代码实战(二元交叉熵损失 binary cross-entropy loss)

    sklearn基于make_scorer函数为Logistic模型构建自定义损失函数+代码实战(二元交叉熵损失 binary cross-entropy loss) # 广义线性模型中的各种连接函数: ...

  8. 机器学习中的各种损失函数(Hinge loss,交叉熵,softmax)

    机器学习中的各种损失函数 SVM multiclass loss(Hinge loss) 这是一个合页函数,也叫Hinge function,loss 函数反映的是我们对于当前分类结果的不满意程度.在 ...

  9. 交叉熵损失函数分类_交叉熵损失函数

    我们先从逻辑回归的角度推导一下交叉熵(cross entropy)损失函数. 从逻辑回归到交叉熵损失函数 这部分参考自 cs229-note1 part2. 为了根据给定的 预测 (0或1),令假设函 ...

最新文章

  1. with as python_python - with as的用法
  2. 使用redis时遇到的问题
  3. Exchange 2007 配置POP3
  4. knn闽南语是什么意思_小丑竟是我自己是什么意思梗 小丑竟是我自己bgm是什么...
  5. ToString() 会发生装箱吗?
  6. 解决GitHub报错:schannel:failed to receive handshake, SSL/TLS connection failed
  7. Springboot Gitlab Jenkins Maven Docker 持续集成/持续交付
  8. Swift5.x的UITableView纯代码演练
  9. 数字图像处理之图像基础
  10. 工业交换机的几大“择机”标准,你学会了吗?
  11. 十五、详述 IntelliJ IDEA 插件的安装及使用方法
  12. 经验38--新闻内容处理
  13. Magento: 添加first name 和 last name到newsletter Add additional fields to your newsl
  14. NTIRE 2021 @CVPR 2021 Workshop 及挑战赛来了!
  15. SQL索引及表的页的逻辑顺序与物理顺序
  16. 马斯克神经网络转换器_通过转换数据来减少人工神经网络的复杂性
  17. php让iframe 重定向,利用可以在iframe中嵌入网页进行重定向
  18. 必须安装三星系列android系统智能手机usb驱动程序,三星安卓4.0怎么刷机 三星安卓4.0刷机教程...
  19. ArcGIS 各版本产品补丁荟萃
  20. 爱的能力(徐博客写的-收藏下)

热门文章

  1. RPC 笔记(07)— socket 通信(多进程服务器)
  2. Python 标准库之 fcntl
  3. 【JavaScript总结】JavaScript语法基础:JS编码
  4. 机器学习常用术语词汇表
  5. SpringMVC——通俗易懂讲讲Ajax~
  6. LLVM一些编程语法语义特性
  7. Android自定义View基本步骤
  8. 服务器显示内存已超标,服务器显示内存已超标
  9. Android 如何防止用户同时点击多个控件问题
  10. error: Error: No resource found for attribute ‘layout_scrollFlags’ in package‘包名’