深度学习基础--神经网络(3)神经网络的学习,损失函数初识

news2024/11/17 21:54:41

文章目录

  • 神经网络的学习
    • 从数据中学习
    • 数据区分
    • 损失函数
      • 均方误差
      • 交叉熵误差
      • mini-batch学习
      • 损失函数更新的思路

本文为学习笔记整理
参考书籍:《深度学习入门 : 基于Python的理论与实现 》/ (日) 斋藤康毅著 ; 陆宇杰译. – 北京 : 人民邮电出版社, 2018.7(2019.5重印)

文章中带编号的图片(如:图4-2)均来自书籍内容。

神经网络的学习

学习:神经网络可以从输入的训练数据中自动获取最优权重参数的过程。

损失函数:学习的指标,以损失函数为基准,找出能使它的值达到最小的权重参数。

从数据中学习

数据是机器学习的核心,机器学习的方法尝试从收集到的数据中发现答案(模式)。

从图像中提取特征量,再用机器学习技术学习这些特征量的模式。

图像的特征量通常表示为向量的形式。在计算机视觉领域,常用的特征量包括 SIFT、SURF和HOG(定向梯度直方图)等使用这些特征量将图像数据转换为向量,然后对 转换后的向量使用机器学习中的SVM、KNN等分类器进行学习

图像的特征量的设计需要根据不同的任务来设计专门的特征量,才能得到更好的结果。

请添加图片描述

在神经网络中,也就是**深度学习中包含的重要特征量也都是由网络自己学习出来的**

深度学习:端到端机器学习(end-to-end machine learning)。从原始数据中直接获得目标结果。

神经网络对所有的问题都可以用同样的流程来解决,比如识别问题,无论是识别狗还是人脸还是其他,神经网络都是通过提供的数据,从中发现求解问题的模式。

数据区分

数据一般分为:

  • 训练数据(监督数据)
    • 使用训练数据寻找最优的参数
  • 测试数据
    • 使用测试数据评价训练得到的模型的实际能力

设置训练数据和测试数据是为了正确评价模型的泛化能力,也就是指在处理新的数据时的能力,不能只适用于训练和测试的数据

过拟合:只是对某个数据集过度拟合,就是说训练出来的模型只适用于某个数据集,无法在其他的数据上解决问题。要避免过拟合。

损失函数

损失函数就是一个对学习程度和效果的评价标准

书中定义:

损失函数:神经网络的学习中所用的指标称为损失函数,以这个指标为基准,寻找最优权重参数。损失函数可以使用任意函数,但一般用均方误差交叉熵误差等。

均方误差

E = 1 2 ∑ k ( y k − t k ) 2 (4.1) E = \frac{1}{2}\sum_k(y_k-t_k)^2 \tag{4.1} E=21k(yktk)2(4.1)

y k y_k yk:神经网络的输出(实际的输出,如果使用softmax函数输出,就是实际的概率,而不是对应的结果)

t k t_k tk:监督数据(就是训练数据中的标签)

k k k:数据的维度(每个数据都需要参与运算)

举例:

手写数字识别中的一个输出y:

在这里插入图片描述

softmax的输出看作概率,那么推测这个输出对应的输入为“8”

对应的监督数据(实际标签):

假设推理正确,实际的结果就是“8”, t t t的形状就是:
t = [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 ] t=[0, 0, 0, 0, 0, 0, 0, 0, 1, 0] t=[0,0,0,0,0,0,0,0,1,0]
数组元素的索引从第一个开始依次对应数字0,1,2,…,9

one-hot表示:正确解标签表示为1,其他标签表示为0

那么对应的均方误差就是上面y和t对应元素相减再平方,然后求和,除以2,得出E。(也就是每一个元素的误差的平方和再除以2)

def mean_squared_error(y, t):
    return 0.5 * np.sum((y - t) ** 2)

交叉熵误差

E = − ∑ k t k l o g y k (4.2) E = -\sum_k t_k logy_k \tag{4.2} E=ktklogyk(4.2)

其中 l o g log log为以e为底,即 l n ln ln

y k y_k yk:神经网络的输出

t k t_k tk :正确解标签,同样是one-hot表示

在这里插入图片描述

因此,式(4.2)中,正确解标签对应的输出越大,E的值越接近0,误差越小。比如:

还是手写数字

正确标签:[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],代表正确解为数字“2”

神经网络输出:[0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0],代表输出的识别结果也是数字"2"

因为0乘任何数都是0,所以最后的交叉熵误差计算就是: E = − 1 ∗ l o g 0.6 = 0.5108 E=-1*log0.6=0.5108 E=1log0.6=0.5108

如果神经网络的输出错误,比如是:[0.1, 0.05, 0.1, 0.0, 0.05, 0.6, 0.0, 0.1, 0.0, 0.0]

那么 E = − 1 ∗ l o g 0.1 = 2.3026 E = -1*log0.1=2.3026 E=1log0.1=2.3026,所以交叉熵误差是基于正确解的一种损失函数的计算方式。

代码实现:

def cross_entropy_error(y, t):
    delta = 1e-7  # 加一个微小值是为了防止np.log(0)的情况,这样会无限大
    return -np.sum(t * np.log(y + delta))

mini-batch学习

机器学习使用训练数据进行学习,就是针对训练数据计算损失函数的值,找出使该值尽可能小的参数。

如果训练数据有100个,就要把这100个损失函数的总和作为学习的指标

那么,此时的交叉熵函数就是:
E = − 1 N ∑ n ∑ k t n k l o g y n k (4.3) E = -\frac{1}{N}\sum_n\sum_kt_{nk}logy_{nk} \tag{4.3} E=N1nktnklogynk(4.3)
N N N:数据个数

t n k t_{nk} tnk:第n个数据的第k个元素的值

式子(4.3)只是把求单个数据的损失函数的式子(4.2)扩大到N个数据然后除以N进行正规化(归一化)

通过除以N,可以求单个数据的“平均损失函数”。可以获得和训练数据的数量无关的统一指标。

但是,往往训练数据集的数据量很大,如果以全部数据为对象求损失函数的和,计算过程需要花费较长的时间。因此引出mini-batch学习

mini-batch学习:从全部数据中选出一批数据(称为mini-batch),然后对每个mini-batch进行学习。

mini-batch的损失函数也是利用一部分样本数据来近似地计算整体。也就是说,用随机选择的小批 量数据(mini-batch)作为全体训练数据的近似值。我理解有点类似抽样调查的意思。

代码实现;

def cross_entropy_error_one_shot(y, t):
    """
    交叉熵误差
    y: 神经网络的输出
    t: 训练数据的标签(监督数据), one-shot表示
    """
    if y.ndim == 1:  # y为一个NumPy矩阵,y.ndim为行数
        # y的维度为1时,即求单个数据的交叉熵误差
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)

    batch_size = y.shape[0]
    # 此时传入的y为一个batch, y.shape[0]为行数,即结果的数量N
    delta = 1e-7  # 加一个微小值是为了防止np.log(0)的情况,这样会无限大
    return -np.sum(t * np.log(y + delta)) / batch_size


def cross_entropy_error_not_one_shot(y, t):
    """
    交叉熵误差
    y: 神经网络的输出
    t: 训练数据的标签(监督数据), 非one-shot表示
    """
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)

    batch_size = y.shape[0]
    delta = 1e-7
    return -np.sum(np.log(y[np.arange(batch_size), t] + delta)) / batch_size

对最后的return结果做一个梳理:

np.arange(batch_size)  # 生成一个从0~(batch_size-1)的数组
y[np.arange(batch_size), t]  
"""
因为t非one-shot表示,所以t就是存储的真正的输出结果,比如[2, 4, 7,...]
y的一行是一个softmax输出的下标0~9的数组,比如[0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
因为交叉熵误差是直接按照正确解来计算
那么这句代码会生成一个NumPY数组:[y[0, 2], y[1, 4], y[2, 7],...,y[batch_size - 1, t对应的结果]]
y[0, 2]: 第一个结果中对应正确解"2"的概率值
y[1, 4]: 第二个结果中对应正确解"4"的概率值
"""

发现个问题:公式(4.3)中有 t n k t_{nk} tnk l o g y n k logy_{nk} logynk的乘积,为什么在 t t t使用非one-shot表示时,返回值没有乘积操作呢?

思考:

如果 t t t为one-shot表示,那么 t t t为0的元素的交叉熵误差也为0,也就是说如果可以获得神经网络在正确解标签处的输出,就可以计算交叉熵误差,此时是输出的正确解标签是乘1,就可以理解为是取 y y y在正确解的位置的输出值,所以在 t t t为非one-shot表示时,也是要取对应的正确位置的输出值,所以就没有乘积操作了。

损失函数更新的思路

在寻找最优参数(权重和偏置时),为了找到使损失函数的值尽可能小的地方,需要计算参数的导数(也称“梯度”),然后以这个梯度为指引,逐步更新参数的值。

如果导数的值为负数,函数沿梯度方向递减,使该权重参数向正方向(顺梯度方向)改变

如果导数的值为正数,函数沿反梯度方向递减,使该权重参数向反方向改变

当导数的值为0,此时该权重参数的更新会停在此处

在进行神经网络的学习时,不能将识别精度作为指标。因为如果以 识别精度为指标,则参数的导数在绝大多数地方都会变为0。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/22476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android插件式换肤以及资源加载流程分析

前言 APP更换皮肤的方式有很多,如系统自带的黑夜模式、插件换肤、通过下发配置文件加载不同主题等等,我们这里就浅谈下插件换肤方式。想实现插件换肤功能,我们就需要先弄清楚 :APP是如何完成资源加载的。 资源加载流程 这里我们以ImageVie…

植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(中)

植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(中)26、第一种方法实现变态加速功能27、第二种方法找出变态攻击加速的方法28、加快阳光、金币生产速度29、全屏僵尸29、全屏减速第一课30、全屏减速第二课31、全屏奶油的找…

(Transferrin)TF-PEG-DBCO/TCO/tetrazine 转铁蛋白-聚乙二醇-二苯基环辛炔/反式环辛烯/四嗪

产品名称:转铁蛋白-聚乙二醇-二苯基环辛炔 英文名称:(Transferrin)TF-PEG-DBCO 质量控制:95% 原料分散系数PDI:≤1.05 存储条件:-20C,避光,避湿 用 途:仅供科研实验使用&#xff0c…

Android App开发动画特效中插值器和估值器的讲解以及利用估值器实现弹幕动画实战(附源码和演示视频 可直接使用)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 一、插值器和估值器 插值器用来控制属性值的变化速率,也可以理解为动画播放的速度,默认是先加速再减速。若要给动画播放指定某种速率形式,调用setInterpolator方法设置对应的插值器实现类即可…

Spring Boot 分离配置文件的 N 种方式

今天聊一个小伙伴在星球上的提问: 问题不难,解决方案也有很多,因此我决定撸一篇文章和大家仔细说说这个问题。 1. 配置文件位置 首先小伙伴们要明白,Spring Boot 默认加载的配置文件是 application.properties 或者 application…

【云计算大数据_牛客_Hbase】选择/判断——Hbase

1.Hive 1.下面关于Hive metastore的三种模式的描述错误的是() Derby方式是内嵌的方式,也是默认的启动方式,一般用于单元测试local模式中,使用MySQL 本地部署实现metastoreremote模式为远程MySQLDerby方式在同一时间只能有多个进程连接使用数据库 2. 百度文库 2、代码sel…

Android App开发中集合动画和属性动画的讲解及实战演示(附源码 简单易懂 可直接使用)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 一、集合动画 有时一个动画效果会加入多种动画,比如一个旋转一边缩放,这时便会用到集合动画AnimationSet把几个补间动画组装起来,实现让某视图同时呈现多种动画的效果 因为集合动画和补间动…

Jetson Orin使用Yolo5开源数据集训练模型检测口罩

软硬件环境: 乌班图 20.04 64位蟒蛇与 3.8.10英伟AGX Orin库达11.4PyTorch1.12YOLOv5-6.1感谢开源数据集下载地址 正常都是自己收集完了训练,今天就省略这个步骤了。 如果想自己制作看下面的流程。 软硬件环境搭建教程链接 刷机的话使用官方教程或者…

DNS协议

DNS服务器 人类更喜欢记忆主机名,而路由器更喜欢定长的、有结构层次的IP地址,DNS应运而生:DNS能进行主机名到IP地址转换的目录服务。 DSN是: (1)一个由分层的DNS服务器(DNS server)实…

元数据管理-解决方案调研二:元数据管理解决方案——Saas/内部解决方案(2)

Saas/内部解决方案 2.5、Azure Purview 地址:Azure Purview - Unified Data Governance Solution | Microsoft Azure 特点: 1、创建跨整个数据资产的统一数据地图,为有效的数据治理和使用奠定基础 1.1、自动化和管理混合源的元数据&#xf…

重打包实现frida持久化 笔记

修改Dex Using Frida on Android without root 修改so [翻译]在未root的设备上使用frida 2个方法本质都是通过重打包让app自己加载frida-gadget.so (但感觉没有谁家app会让人轻易重打包吧。。。) apktool d org.telegram.messenger_4.8.4-12207.apk -r…

Tomcat配置SSL证书别名tomcat无法识别密钥项

Tomcat配置SSL证书一直启动失败,主要问题如下: java.io.IOException: Alias name tomcat does not identify a key entry at org.apache.tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.java:280) 别名tomcat无法识别密钥项,是因…

STM32单片机远程控制大棚种植系统

想要更多项目私wo!!! 一、电路设计 ​​​​​系统示意图硬件系统 系统由五个单片机系统组成的,其中51系列的单片机四个,STM32F407单片机一个,各个子系统之间通过NRF24L01无线模块进行通信。 系统硬件组成框图​​​​主控制板主要由STM32…

【VuePress2.0】快速开始(不用)

文章目录VuePress2.x1.1 安装安装VuePress2.x(手动安装)1.2 VuePress2.x 基本操作VuePress2.x主题2.1 安装VuePress2.x主题(yarn)2.2 报错解决(没效果,不用看)2.3 VuePress2.x主题 基本操作VueP…

Java基础深化和提高-------IO流

目录 IO流技术介绍 什么是IO 什么是数据源 流的概念 第一个简单的IO流程序 IO流的经典写法 IO流新语法经典写法 Java中流的概念细分 按流的方向分类: 按处理的数据单元分类: 按处理对象不同分类: Java中IO流类的体系 Java中IO的四大抽象…

CleanMyMac X真正好用的Mac电脑系统优化软件应用工具

最用户友好的Mac问题修复程序。删除系统垃圾、不需要的应用程序和恶意软件,并调整您的Mac以获得最高速度。对于速度较慢的计算机,CleanMyMac就能立即使用。 CleanMyMac2023之所以能够获得众多Mac的老用户们的喜爱,是因为其有着非常强大功能提…

数据可视化之大数据平台可视化

一 前言 在简化数据量和降低大数据应用的复杂性中,大数据分析发挥着关键的作用。可视化是其中一个重要的途径,它能够帮助大数据获得完整的数据视图并挖掘数据的价值。大数据分析和可视化应该无缝连接,这样才能在大数据应用中发挥最大的功效。…

nodejs+mysql航空飞机票销售酒店预订系统vue

(1)对机票预订管理系统进行需求分析、确定所需要的模块;建立数据字典、数据流等;书写可行性分析和需求分析说明书。 (2)对机票预订管理系统进行概要设计:建立软件体系结构,画出用例图、E-R图等;书写数据要求说明书和各…

【雷达通信】阵列信号处理(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

聊聊Go里面的闭包

以前写 Java 的时候,听到前端同学谈论闭包,觉得甚是新奇,后面自己写了一小段时间 JS,虽只学到皮毛,也大概了解到闭包的概念,现在工作常用语言是 Go,很多优雅的代码中总是有闭包的身影&#xff0…