损失函数、python实现均方误差、交叉熵误差函数、mini-batch的损失函数

损失函数

    • what is 损失函数
    • 均方误差
    • 交叉熵误差
    • 计算mini-batch学习的损失函数
    • why 损失函数

what is 损失函数

神经网络学习目标是找到各层合适的权重参数w和偏置b,使得最终的输出结果能够与实际结果更加接近。那神经网络的这些权重参数是如何得到的:靠损失函数这个指标来进行一步步训练优化得到。

通过使损失函数最小,来寻找最优权重参数。学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。

均方误差

在这里插入图片描述

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

用python实现均方误差函数:

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

下面是调用这个函数的例子:

以手写数字识别为例,数组下标对应的是0-9的数字,y1和y2是神经网络经过softmax函数的输出,y1、y2的元素值是该网络经过判断这张图片,得到的0-9数字的概率。t是监督数据,t[2]=1,表明这张图片是2 。看到均方误差输出结果,可以发现,y1的损失函数比y2小,这是因为y1[2]=0.6,而y2[2]=0.1,也就是说y1估计出来的更接近真实的判断。

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
from common.functions import mean_squared_errorif __name__ == '__main__':y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]r1 = mean_squared_error(np.array(y1), np.array(t))print(r1)r2 = mean_squared_error(np.array(y2), np.array(t))print(r2)

输出:

0.09750000000000003
0.5975

交叉熵误差

在这里插入图片描述

yk是神经网络的输出, tk是正确解标签, k表示数据的维数。

如果标签为one-hot表示,即tk中只有正确解标签索引为1,其他均为0 。

那么式子只计算对应正确解标签的输出的自然对数。

如上面的例子,t[2]=1,正确解标签索引为2,对应的神经网络输出为y1[2]=0.6,则交叉熵误差为-log0.6。

在这里插入图片描述

由上图y=logx曲线可看出,对于对数函数y=logx,x=1时,y=0;

交叉熵误差是一个-log函数,也就意味着,交叉熵误差值越小,神经网络在对应正确解标签的输出越接近1,即神经网络的判断和正确解标签越接近。

用python实现交叉熵误差函数:

函数里面的参数y、t是Numpy数组,函数计算log时,加上了一个微小值,这是防止出现np.log(0)导致后续计算无法进行。

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

调用这个函数的例子:和均方误差调用的例子类似。

import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
from common.functions import cross_entropy_errorif __name__ == '__main__':y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]r1 = cross_entropy_error(np.array(y1), np.array(t))print(r1)r2 = cross_entropy_error(np.array(y2), np.array(t))print(r2)

输出:

0.510825457099338
2.302584092994546

计算mini-batch学习的损失函数

上述仅对单个数据进行了损失函数的计算,实际工程中,要把所有训练数据的损失函数的总和作为学习的指标。以交叉熵误差为例:

在这里插入图片描述

数据有N个, tnk表示第n个数据的第k个元素的值( ynk是神经网络的输出, tnk是监督数据)。

这个式子,也就是把所有数据的损失函数值加起来再除以总的数据个数。通过除以N可以求单个数据的平均损失函数,与训练数据的数量无关。

由于数据集的数据量可能会很大,求全部数据的损失函数的和,将花费很长时间。可以从全部数据中抽出一小部分数据,作为全部数据的近似,称为mini-batch(小批量),然后对每个mini-batch学习。

下面介绍一下如何使用python进行mini-batch的损失函数计算。

首先,从训练数据中随机抽取数据得到mini-batch:
调用(x_train, t_train), (x_test, t_test) = load_mnist(one_hot_label=True, normalize=True)函数,读取出MINIST数据,输出x_train.shape、t_train.shape可以看到,训练数据有60000个。使用np.random.choice(train_size, batch_size)可以从0到train_size-1之间随机选择batch_size个数字。输出batch_mask可以得到一个索引数组。把索引对应的数据存到小批量数据集里,抽出来的数据就有了。也就是说在60000个数据里面随机选了十个数据,存到了x_batch、t_batch里面。

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(one_hot_label=True, normalize=True)if __name__ == '__main__':print(x_train.shape)print(t_train.shape)train_size = x_train.shape[0]batch_size = 10batch_mask = np.random.choice(train_size, batch_size)print(batch_mask)x_batch = x_train[batch_mask]t_batch = t_train[batch_mask]

输出:

(60000, 784)
(60000, 10)
[44839  5657 46048 51825 44057 50445  1374 19821 38720 14117]
(10, 784)
(10, 10)

之后,编写mini-batch版本的交叉熵误差函数:

函数参数y是神经网络输出,它是个二维的,第一维是该数据在mini-batch数据集里面的索引,第二维是数据,t是监督数据。y[np.arange(batch_size), t] 能抽出各个数据正确解标签对应的神经网络的输出。

重点的是,只用求神经网络在正确解标签处的输出。举个例子y[0,2],这就取出来了mini-batch里面第一个数据在2处的输出。

def cross_entropy_error(y, t):if y.ndim == 1:t = t.reshape(1, t.size)y = y.reshape(1, y.size)# 监督数据是one-hot-vector的情况下,转换为正确解标签的索引if t.size == y.size:t = t.argmax(axis=1)batch_size = y.shape[0]return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size

why 损失函数

寻找最优权重和偏置时,要使损失函数尽可能小。

为什么不能用识别精度来作为指标,使让精度尽可能高,来寻找最优参数?

我的理解是,精度是除法做出来的,对网络的权重和偏置调整后,可能除法的结果没什么变化,也有可能出现突然的变化。这样的话无法进行调优,因为结果是不连续的。

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

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

相关文章

梯度、梯度法、python实现神经网络的梯度计算

【机器学习】梯度、梯度法、python实现神经网络的梯度计算一、python实现求导的代码:二、what is 梯度三、使用梯度法寻找神经网络的最优参数四、神经网络的梯度计算一、python实现求导的代码: 导数含义也就是:变量x一个微小的变化将导致f(x…

使用反向传播算法计算参数的梯度并用python实现加法和乘法节点的反向传播

使用反向传播算法计算参数的梯度并用python实现加法和乘法节点的反向传播一、what is 反向传播二、乘法节点的反向传播三、加法节点的反向传播四、加法层和乘法层混合应用一、what is 反向传播 误差反向传播法是一种高效计算权重参数的梯度的方法。所谓的反向传播,…

结合反向传播算法使用python实现神经网络的ReLU、Sigmoid、Affine、Softmax-with-Loss层

结合反向传播算法使用python实现神经网络的ReLU、Sigmoid激活函数层 这里写目录标题一、ReLU层的实现二、Sigmoid层的实现三、实现神经网络的Affine层四、Softmax-with-Loss层实现一、ReLU层的实现 正向传播时的输入大于0,则反向传播会将上游的值原封不动地传给下游…

神经网络的SGD、Momentum、AdaGrad、Adam最优化方法及其python实现

神经网络的SGD、Momentum、AdaGrad、Adam最优化方法及其python实现一、SGD二、Momentum-动量三、AdaGrad四、Adam一、SGD 右边的值更新左边的值,每次更新朝着梯度方向前进一小步。 class SGD:"""随机梯度下降法(Stochastic Gradient Des…

关于神经网络权重初始值的设置的研究

关于神经网络权重初始值的设置的研究一、权重初始值二、权重初始值会影响隐藏层的激活值分布三、Xavier初始值四、He初始值五、基于MNIST数据集的权重初始值的比较一、权重初始值 权值衰减—抑制过拟合、提高泛化能力。 所谓权值衰减,即,以减小权重参数…

使用权值衰减算法解决神经网络过拟合问题、python实现

使用权值衰减算法解决神经网络过拟合问题、python实现一、what is 过拟合二、过拟合原因三、权值衰减四、实验验证4.1制造过拟合现象4.2使用权值衰减抑制过拟合一、what is 过拟合 过拟合指只能拟合训练数据,但不能很好拟合不包含在训练数据中的其他数据的状态。 …

解决神经网络过拟合问题—Dropout方法、python实现

解决神经网络过拟合问题—Dropout方法一、what is Dropout?如何实现?二、使用和不使用Dropout的训练结果对比一、what is Dropout?如何实现? 如果网络模型复杂,L2范数权值衰减方法就难以对付过拟合。这种情况下&#…

神经网络如何调参、超参数的最优化方法、python实现

神经网络如何调参、超参数的最优化方法、python实现一、what is 超参数二、超参数优化实验一、what is 超参数 超参数是什么,其实就是,各层神经元数量、batch大小、学习率等人为设定的一些数。 数据集分为训练数据、测试数据、验证数据。 用测试数据评…

卷积神经网络的整体结构、卷积层、池化、python实现

卷积神经网络的整体结构、卷积层、池化、python实现一、整体结构二、卷积层三、池化层四、python实现卷积层、池化层一、整体结构 神经网络相邻层所有神经元之间都有连接,称为全连接。前面用Affine层实现了全连接。 举个例子 全连接神经网络结构: 卷积…

基于随机梯度下降法的手写数字识别、epoch是什么、python实现

基于随机梯度下降法的手写数字识别、epoch是什么、python实现一、普通的随机梯度下降法的手写数字识别1.1 学习流程1.2 二层神经网络类1.3 使用MNIST数据集进行学习注:关于什么是epoch二、基于误差反向传播算法求梯度的手写数字识别2.1 学习流程2.2 实现与结果分析一…

基于卷积神经网络的手写数字识别、python实现

一、CNN网络结构与构建 参数: 输入数据的维数,通道,高,长 input_dim(1, 28, 28)卷积层的超参数,filter_num:滤波器数量,filter_size:滤波器大小,stride:步幅…

基于深度学习的手写数字识别、python实现

基于深度学习的手写数字识别、python实现一、what is 深度学习二、加深层可以减少网络的参数数量三、深度学习的手写数字识别一、what is 深度学习 深度学习是加深了层的深度神经网络。 二、加深层可以减少网络的参数数量 加深层的网络可以用更少参数获得与没有加深层同等水…

二极管的结构、特性、参数、稳压管的特性和参数

二极管的结构、特性、参数、稳压管的特性和参数本文介绍的定义一、半导体类型二、PN结的结构与单向导电性三、二极管的伏安特性四、二极管的参数五、稳压管本文介绍的定义 本文介绍的定义:半导体、本征半导体、空穴、载流子、杂质半导体、N型半导体、P型半导体、PN…

双极结型三极管的结构、特性曲线、参数、lceda仿真

双极结型三极管的结构、特性、参数本文介绍的定义一、三极管结构二、三极管特性曲线三、三极管参数本文介绍的定义 硅平面管、锗合金管、发射区、基区,集电区、发射极、基极、集电极、发射结、集电结、发射、发射极电流、复合和扩散、基极电流、收集、集电极电流、…

结型场效应管的结构、特性、参数

结型场效应管的结构、特性、参数本文介绍的定义一、N沟道结型场效应管结构二、N沟道结型场效应管特性曲线本文介绍的定义 场效应管、结型场效应管、N沟道结型场效应管的结构、耗尽层、栅极、源极、漏极、N沟道结型场效应管、夹断电压、预夹断、输出特性、可变电阻区、恒流区、…

绝缘栅型场效应管的结构、特性、参数

绝缘栅型场效应管的结构、特性、参数本文介绍的定义一、N沟道增强型MOS场效应管结构二、N沟道增强型MOS场效应管特性曲线三、N沟道耗尽型MOS场效应管结构和特性曲线本文介绍的定义 绝缘栅型场效应管、N沟道增强型MOS场效应管、耗尽型场效应管、增强型场效应管、反型层、开启电…

放大电路、单管共发射极放大电路结构、工作原理、lceda仿真

放大电路、单管共发射极放大电路结构、工作原理本文介绍的定义一、放大电路基本概念二、单管共发射极放大电路本文介绍的定义 放大、实现放大作用、放大电路技术指标测量、电压放大倍数、电流放大倍数、相量表示、最大输出幅度、峰峰值、非线性失真系数、输入电阻、输出电阻、…

放大电路分析方法、图解法分析放大电路、lceda仿真

放大电路分析方法、图解法分析放大电路一、本文介绍的定义二、放大电路分析方法三、图解法一、本文介绍的定义 放大电路分析、图解法、微变等效电路法、静态分析、动态分析、直流通路、交流通路、单管共射放大电路的直流和交流通路、静态工作点、图解法分析静态、直流负载线、…

通过共现矩阵和余弦相似度实现机器对单词的认知、python实现

通过共现矩阵和余弦相似度实现机器对单词的认知、python实现本文介绍的定义:一、语料库预处理二、单词的分布式表示三、单词的相似度四、相似单词排序本文介绍的定义: 语料库、计数方法的目的、语料库预处理、单词的分布式表示、分布式假设、上下文、窗…

使用PPMI改进共现矩阵

使用PPMI改进共现矩阵 共现矩阵的元素表示两个单词同时出现的次数,这里的次数并不具备好的性质,举个例子,有短语叫the car,因为the是个常用词,如果以两个单词同时出现的次数为衡量相关性的标准,与drive 相…