第4章 神经网络【1】——损失函数

4.1.从数据中学习

        实际的神经网络中,参数的数量成千上万,因此,需要由数据自动决定权重参数的值。

        4.1.1.数据驱动

                数据是机器学习的核心。

                我们的目标是要提取出特征量,特征量指的是从输入数据/图像中提取出的本质的数                       据,特征量通常表示为向量的形式。                

                有两种方法:a. 使用人想到的特征量将图像数据转换为向量,然后对转换后的向量使用机器学习中的SVM、KNN等分类器进行学习【关于这一点,我的想法是,如果使用传统算法来提取特征,就根据经验针对不同的问题选取合适的特征量】;b.直接使用神经网络来实现端到端【从原始数据直接获得输出结果】的学习。 这两个方法目的一样,都是为了从原始数据中提取出本质的数据或信息。

        4.1.2.训练数据和测试数据

        获得泛化能力是机器学习的最终目标。       

        仅仅用一个数据集去学习和评价参数,是不客观的,可能会导致可以顺利地处理某个数据集,但无法处理其他数据集的情况,即过拟合。

        为了避免过拟合,追求模型的泛化能力【指处理未被观察过的数据】【举例来说,识别手写数字的问题,泛化能力可能会被用在自动读取明信片的邮政编码的系统上,此时,手写识别的就是“任何一个人写的任意文字”,而不是“特定某个人写的特定的文字”】,需要划分训练集和测试集。使用训练数据进行学习,寻找最优的参数,然后,利用测试数据评价训练得到的模型的实际能力。

4.2.损失函数

        神经网络的学习中使用损失函数来寻找最优权重参数,这里的损失函数可以用任意函数,一般用均方误差和交叉熵误差。                

        4.2.1.均方误差

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

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

        4.2.2.交叉熵误差

        

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

def cross_entropy_error(y, t): delta = 1e-7return -np.sum(t * np.log(y + delta))

        这里在log里加了一个很小的delta的值,为了防止y为0时,log值为-inf,这样会导致后续计算无法进行,即相当于一个保护性对策。

        4.2.3.mini-batch学习

        MNIST 数据集的训练数据有 60000 个,一些大的数据,数据量页会有几百万、几千万之多,这种情况下以全部数据为对象计算平均损失函数是不现实的。因此,从全部数据中选出一部分,作为全部数据的“近似”。神经网络的学习也是从训练数据中选出一批数据,然后对每个mini-batch进行学习。这种学习方式称为mini-batch学习。

        以交叉熵误差为例,求所有训练数据的损失函数的总和,把单个数据的“平均损失函数”的式扩大到了N份数据,最后除以N进行正规化,即得出单个数据的“平均损失函数”:【通过这样的平均化,可以获得和训练数据的数量无关的统一指标】

       举例介绍一下mini-batch学习的编码过程:

        a.读入 MNIST 数据集

import sys, os sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)
print(x_train.shape) # (60000, 784) print(t_train.shape) # (60000, 10)

        one_hot_label设置为True,表示正确解标签为1,其余为0。

        b.从训练数据中随机选取10笔数据

        使用NumPy的np.random.choice(),可以从指定的数字中随机选取想要的数字,即

train_size = x_train.shape[0]
batch_size = 10
batch_mask = np.random.choice(train_size, batch_size) 
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]

         之后,指定这些随机选取的索引,取出mini-batch,然后使用mini-batch计算损失函数即可。

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

        当监督数据t是one-hot形式时,可实现一个同时处理单个数据和批量数据batch两种情况的函数:

def cross_entropy_error(y, t):if y.ndim == 1:t = t.reshape(1, t.size)y = y.reshape(1, y.size)batch_size = y.shape[0]return -np.sum(t * np.log(y + 1e-7)) / batch_size

        当监督数据t是标签形式时(非 one-hot 表示,而是像“2”“7”这样的 标签),可通过如下代码实现:

def cross_entropy_error(y, t): if y.ndim == 1:t = t.reshape(1, t.size) y = y.reshape(1, y.size)batch_size = y.shape[0]return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size

        介绍一下代码实现中的np.log(y[np.arange(batch_size), t] + 1e-7):np.arange(batch_size)会生成一个从0到batch_size-1的数组。例如当batch_size为5时,np.arange(batch_size)会生成一个NumPy数组[0,1,2,3,4]。由于t中标签是以[2,7,0,9,4]的形式存储的,所以y[np.arange(batch_size), t]能抽出各个数据的正确解标签对应的神经网络的输出(在这个例子中,y[np.arange(batch_size), t]会生成NumPy数组[y[0,2], y[1,7], y[2,0], y[3,9], y[4,4]]。

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

        以数字识别任务为例,目的既然是能提高识别精度的参数,那特意导入一个损失函数不是有些重复劳动吗?为什么不直接把识别精度作为指标?

        对于这个疑问,我们来关注一下神经网络的某一个权重参数,对该权重参数的损失函数求导,如果导数值为正,则该权重参数向负方向改变可减小损失函数的值,反之,权重参数向正方向改变可减小损失函数的值。若导数为0,则无论权重参数向哪个方向变化,损失函数的值都不会变,即权重参数的更新会停留在此处。【而之所以不用识别精度作为指标,是因为绝大多数地方的导数都会变为0,导致参数无法更新,而且识别精度的值也不像损失函数作为指标时那样连续变化,即识别精度对微小的参数变化基本上没有什么反应】

       

                

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[c语言日寄]assert函数功能详解

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…

Canny 边缘检测

步骤 1.降噪 应用高斯滤波器,以平滑图像,滤除噪声。 边缘检测易受噪声影响,所以使用高斯滤波器平滑图像,降低噪声。 2.梯度 计算图像中每个像素点的梯度大小和方向。 计算大小 Sobel算子是一种常用的边缘检测滤波器&#xff…

【数据结构】_链表经典算法OJ:合并两个有序数组

目录 1. 题目描述及链接 2. 解题思路 3. 程序 3.1 第一版 3.2 第二版 1. 题目描述及链接 题目链接:21. 合并两个有序链表 - 力扣(LeetCode) 题目描述: 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给…

LiteFlow Spring boot使用方式

文章目录 概述LiteFlow框架的优势规则调用逻辑规则组件定义组件内数据获取通过 DefaultContext自定义上下文 通过 组件规则定义数据通过预先传入数据 liteflow 使用 概述 在每个公司的系统中,总有一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻…

六、深入了解DI

依赖注入是⼀个过程,是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源,⽽资源指的就是对象. 在上⾯程序案例中,我们使⽤了 Autowired 这个注解,完成了依赖注⼊的操作. 简单来说,就是把对象取出来放到某个类的属性中。 关于依赖注…

c++贪心

本篇文章,我将同大家一起学习c的贪心!!! 目录 第一题 题目链接 题目解析 代码原理 代码编写 第二题 题目链接 题目解析 代码原理 代码编写 第三题 题目链接 题目解析 代码原理 代码编写 第四题 题目链接 题目解…

高低频混合组网系统中基于地理位置信息的信道测量算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频&#xff09…

【Python实现机器遗忘算法】复现2020年顶会CVPR算法Selective Forgetting

【Python实现机器遗忘算法】复现2020年顶会CVPR算法Selective Forgetting 1 算法原理 Golatkar, A., Achille, A., & Soatto, S. (2020). Eternal sunshine of the spotless net: Selective forgetting in deep networks. In Proceedings of the IEEE/CVF Conference on Co…

Linux(NTP配置)

后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! NTP环境搭建 服务端客户端192.168.111.10192.168.111.11Linux MySQL5.7 3.10.0-1160.el7.x86_…

神经网络|(四)概率论基础知识-古典概型

【1】引言 前序学习了线性回归的基础知识,了解到最小二乘法可以做线性回归分析,但为何最小二乘法如此准确,这需要从概率论的角度给出依据。 因此从本文起,需要花一段时间来回顾概率论的基础知识。 【2】古典概型 古典概型是我…

21款炫酷烟花合集

系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码:Python动漫烟花(完整代码) ​ Python烟花② 完整…

新项目上传gitlab

Git global setup git config --global user.name “FUFANGYU” git config --global user.email “fyfucnic.cn” Create a new repository git clone gitgit.dev.arp.cn:casDs/sawrd.git cd sawrd touch README.md git add README.md git commit -m “add README” git push…

Brightness Controller-源码记录

Brightness Controller 亮度控制 一、概述二、ddcutil 与 xrandr1. ddcutil2. xrandr 三、部分代码解析1. icons2. ui3. utilinit.py 一、概述 项目:https://github.com/SunStorm2018/Brightness.git 原理:Brightness Controlle 是我在 Ubuntu 发现上调…

机器学习-K近邻算法

文章目录 一. 数据集介绍Iris plants dataset 二. 代码三. k值的选择 一. 数据集介绍 鸢尾花数据集 鸢尾花Iris Dataset数据集是机器学习领域经典数据集,鸢尾花数据集包含了150条鸢尾花信息,每50条取自三个鸢尾花中之一:Versicolour、Setosa…

Day27-【13003】短文,线性表两种基本实现方式空间效率、时间效率比较?兼顾优点的静态链表是什么?如何融入空闲单元链表来解决问题?

文章目录 本次内容总览第四节,两种基本实现方式概览两种基本实现方式的比较元素个数n大于多少时,使用顺序表存储的空间效率才会更高?时间效率比较?*、访问操作,也就是读运算,读操作1、插入,2、删…

JavaSE第十一天——集合框架Collection

一、List接口 List接口是一个有序的集合,允许元素有重复,它继承了Collection接口,提供了许多额外的功能,比如基于索引的插入、删除和访问元素等。 常见的List接口的实现类有ArrayList、LinkedList和Vector。 List接口的实现类 …

数据结构与算法学习笔记----求组合数

数据结构与算法学习笔记----求组合数 author: 明月清了个风 first publish time: 2025.1.27 ps⭐️一组求组合数的模版题,因为数据范围的不同要用不同的方法进行求解,涉及了很多之前的东西快速幂,逆元,质数,高精度等…

kaggle社区LLM Classification Finetuning

之前有个一样的比赛,没去参加,现在弄了一个无限期的比赛出来 训练代码链接:fine_tune | Kaggle 推理代码链接:https://www.kaggle.com/code/linheshen/inference-llama-3-8b?scriptVersionId219332972 包链接:pack…

【Python实现机器遗忘算法】复现2021年顶会 AAAI算法Amnesiac Unlearning

【Python实现机器遗忘算法】复现2021年顶会 AAAI算法Amnesiac Unlearning 1 算法原理 论文:Graves, L., Nagisetty, V., & Ganesh, V. (2021). Amnesiac machine learning. In Proceedings of the AAAI Conference on Artificial Intelligence, volume 35, 115…

51单片机开发:点阵屏显示数字

实验目标:在8x8的点阵屏上显示数字0。 点阵屏的原理图如下图所示,点阵屏的列接在P0端口,行接在74HC595扩展的DP端口上。 扩展口的使用详见:51单片机开发:IO扩展(串转并)实验-CSDN博客 要让点阵屏显示数字&#xff0…