【深度学习】神经网络的学习

文章目录

  • 常用损失函数
    • 均方误差函数(mean squared error)
    • 交叉熵误差函数(cross entropy error)/对数损失函数(log loss function)
  • 数值微分(numerical gradient)
    • 前向差分(forward difference)
    • 后向差分(backward difference)
    • 中心差分(central difference)
  • 基于梯度下降算法的神经网络学习过程
    • step 1. 初始化神经网络参数
    • step 2. 神经网络的学习
      • step 2-1. 进行推理(前向传播)
      • step 2-2. 使用数值微分方法进行梯度下降
      • step 2-3. 计算识别精度和损失值
    • step 3. 学习完毕,使用神经网络进行预测

源代码文件请点击此处!

常用损失函数

均方误差函数(mean squared error)

E ( y ⃗ , t ⃗ ) = 1 2 m ∑ i = 1 m ( y i − t i ) 2 E(\vec{y},\vec{t}) = \frac{1}{2m} \sum_{i=1}^{m} (y_i - t_i)^2 E(y ,t )=2m1i=1m(yiti)2

其中 y i y_i yi 为计算得出的概率, t i t_i ti 为以 one-hot 表示的监督数据(正确解标签)。

代码实现如下:

# 均方误差函数
# 监督数据 t 为 one-hot 表示
def mean_squared_error(y, t):m = y.shape[1]cost_sum = np.sum((y-t) ** 2)return cost_sum / (2 * m)

交叉熵误差函数(cross entropy error)/对数损失函数(log loss function)

E ( y ⃗ , t ⃗ ) = − ∑ i = 1 m t i ln ⁡ y i E(\vec{y},\vec{t}) = - \sum_{i=1}^{m} t_i \ln y_i E(y ,t )=i=1mtilnyi

其中 y i y_i yi 为计算得出的概率, t i t_i ti 为以 one-hot 表示的监督数据(正确解标签)。

代码实现如下:

# 对数损失函数
# 监督数据 t 为 one-hot 表示
def log_loss_function(y, t):delta = 1e-7  # 此处是防止出现 ln0 的情况return -np.sum(t * np.log(y + delta))

数值微分(numerical gradient)

神经网络的学习依赖于梯度下降算法,因此我们首先介绍一种计算梯度的方法——数值微分法。使用数值微分计算梯度值的速度比较慢,但实现起来简单。与之相对应的是通过公式运算的解析式求解梯度(解析性求导,analytic gradient),该方法运算起来快速,但实现起来较复杂。

计算数值微分的方法有三种:

前向差分(forward difference)

这是我们最熟悉的形式:

d f ( x ) d x = lim ⁡ h → 0 f ( x + h ) − f ( x ) h \frac{\mathrm{d} f(x)}{\mathrm{d} x} = \lim_{h \rightarrow 0} \frac{f(x+h) - f(x)}{h} dxdf(x)=h0limhf(x+h)f(x)

后向差分(backward difference)

这是另外一种形式,也很常见:

d f ( x ) d x = lim ⁡ h → 0 f ( x ) − f ( x − h ) h \frac{\mathrm{d} f(x)}{\mathrm{d} x} = \lim_{h \rightarrow 0} \frac{f(x) - f(x-h)}{h} dxdf(x)=h0limhf(x)f(xh)

中心差分(central difference)

实际情况下,我们不会使用前向差分和后向差分,这是因为这两种方法计算出来的误差值较大,因此采用改进后的中心差分,如下式:

d f ( x ) d x = lim ⁡ h → 0 f ( x + h ) − f ( x − h ) 2 h \frac{\mathrm{d} f(x)}{\mathrm{d} x} = \lim_{h \rightarrow 0} \frac{f(x+h) - f(x-h)}{2h} dxdf(x)=h0lim2hf(x+h)f(xh)

代码实现如下:

# 数值微分(中心差分方法)
# f 为以上损失函数二选一
def _numerical_gradient(f, x):h = 1e-4 # 0.0001grad = np.zeros_like(x)for i in range(x.size):tmp = x[i]# 计算 f(x+h)x[i] = float(tmp) + hfxh1 = f(x)# 计算 f(x-h)x[i] = float(tmp) - hfxh2 = f(x)# 计算中心差分grad[i] = (fxh1 - fxh2) / (2 * h)x[i] = tmp#print(grad)return grad

基于梯度下降算法的神经网络学习过程

神经网络的学习实现起来并不复杂,现在以一个 2 层神经网络为例,来看看具体的学习过程。

step 1. 初始化神经网络参数

初始化一个有 2 层(输入层+隐藏层+输出层)的神经网络的代码如下所示。注意,权重的初始值不可设置为 0(或者说不可设置为同样的数字),这是为了防止“权重均一化”问题。因此,必须随机生成初始值。我们可以使用较小的初始值,例如使用标准差为 0.01 的高斯分布作为权重初始值。关于初始值的设定问题以后再来讨论。

def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):self.params = {} self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size) self.params['B1'] = np.zeros(hidden_size)self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)self.params['B2'] = np.zeros(output_size)

step 2. 神经网络的学习

这里分三步走:推理、梯度下降、识别精度。

step 2-1. 进行推理(前向传播)

初始化参数后,先用这些参数进行推理(即神经网络的前向传播):

def predict(self, X):W1, W2 = self.params['W1'], self.params['W2']B1, B2 = self.params['B1'], self.params['B2']A1 = self.dense(X, W1, B1, sigmoid_function) # layer 1A2 = self.dense(A1, W2, B2, softmax_function_trick) # layer 2return A2

step 2-2. 使用数值微分方法进行梯度下降

推理完毕后得到结果 y,然后对损失函数 loss(y, t) 计算关于权重的梯度值。这里所做的操作是:假设损失函数为 L ( y , t ) L(y,t) L(y,t),权重矩阵为:

W = [ w 11 w 12 w 13 w 21 w 22 w 23 ] W = \bigg[ \begin{matrix} w_{11} \ w_{12} \ w_{13} \\ w_{21} \ w_{22} \ w_{23} \\ \end{matrix} \bigg] W=[w11 w12 w13w21 w22 w23]

则计算梯度值后得到的梯度矩阵为:

∂ L ∂ W = [ ∂ L ∂ w 11 ∂ L ∂ w 12 ∂ L ∂ w 13 ∂ L ∂ w 21 ∂ L ∂ w 22 ∂ L ∂ w 23 ] \frac{\partial L}{\partial W} = \bigg[ \begin{matrix} \frac{\partial L}{\partial w_{11}} \ \frac{\partial L}{\partial w_{12}} \ \frac{\partial L}{\partial w_{13}} \\ \frac{\partial L}{\partial w_{21}} \ \frac{\partial L}{\partial w_{22}} \ \frac{\partial L}{\partial w_{23}} \\ \end{matrix} \bigg] WL=[w11L w12L w13Lw21L w22L w23L]

实现代码如下:

# 计算损失/误差值(回调函数)
# loss_f 为损失函数
def loss(self, loss_f, X, t):y = self.predict(X)  # 先进行推理return loss_f(y, t)  # 后用推理结果与正确解标签计算损失值def numerical_gradient_descent(self, loss_f, X, t):# 定义匿名函数,参数为 W,返回值为 loss_f(y, t)loss_W = lambda W: self.loss(loss_f, X, t)grads = {}grads['W1'] = _numerical_gradient(loss_W, self.params['W1'])grads['B1'] = _numerical_gradient(loss_W, self.params['B1'])grads['W2'] = _numerical_gradient(loss_W, self.params['W2'])grads['B2'] = _numerical_gradient(loss_W, self.params['B2'])return grads

计算各个参数的梯度值后,更新各个参数:

for key in ('W1', 'B1', 'W2', 'B2'):self.params[key] -= learning_rate * self.grads[key]

step 2-3. 计算识别精度和损失值

首先,计算识别精度的代码实现如下:

# 神经网络参数的精度评价
def accuracy(self, X, t, num):y = self.predict(X) # 再次进行推理print(y)y = np.argmax(y, axis=1)t = np.argmax(t, axis=1)accuracy = np.sum(y == t) / float(num)return accuracy

每轮梯度下降完成后,计算识别精度和损失值:

# 识别精度
accuracy = self.accuracy(X, t, X.shape[0])
print(f"epoch {epoch}: train accuracy = {accuracy}")# 计算损失值
loss = self.loss(loss_f, X, t)
self.loss_history.append(loss)

随后,重复执行 step 2-1 至 2-3,继续迭代更新各个参数值,直到精度达到要求或达到迭代次数为止,然后进行 step 3。

step 3. 学习完毕,使用神经网络进行预测

使用已学习完毕的神经网络(即调用函数 predict(X))对测试集进行推理,此处就不再赘述了。

基于数值微分实现的梯度下降算法虽然容易实现,但运算速度非常慢。下一篇将介绍一种更为快速的方法——误差反向传播法。

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

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

相关文章

nacos只发现不发布服务fiddler请求转发到本地

https://blog.csdn.net/qq_38826019/article/details/109583854 nacos配置文件参数 spring.cloud.nacos.discovery.register-enabled : false fiddler转发 regex:http://xxx:8080/api/xxx/(?.)$ http://localhost:9209/${param}

2024.2.26

今天又复习了一下熟悉的C语言 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<windows.h>int main() {//数组初始化int n;scanf("%d", &n);int array[500];int i 0;for (i 0; i < n; i){scanf("%…

掌握ChatGPT润色绝技:什么是人工智能写作以及如何使用它来完成写作任务

如对AI写论文感兴趣&#xff0c;欢迎添加作者wx讨论 : ryan_2982 人工智能 (AI) 的出现开创了技术进步的新时代&#xff0c;彻底改变了包括写作和内容创作在内的各个行业。人工智能写作和人工智能提示已成为可以简化和增强写作任务的强大工具。在这篇博文中&#xff0c;我们将…

JAVA讲解算法-排序算法-冒泡排序算法-01

一、定义 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c; 一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已…

matplotlib 入门教程

一. matplotlib 简介 Matplotlib是一个Python 2D绘图库&#xff0c;它可以在各种平台上以各种硬拷贝格式和交互式环境生成出具有出版品质的图形。 Matplotlib试图让简单的事情变得更简单&#xff0c;让无法实现的事情变得可能实现。 只需几行代码即可生成绘图&#xff0c;直方…

求购EV代码签名证书,看看性价比最优选项要多少钱?

在当今的数字化时代&#xff0c;EV代码签名证书作为一种强化软件安全防线的顶级数字证书&#xff0c;承担着验证软件源码真伪和完整性的重要任务。对于软件开发者和公司来说&#xff0c;购置EV代码签名证书无疑是必不可少的&#xff0c;而其年度费用也成为各方密切关注的核心议…

【计算机网络】DNS/ICMP协议/NAT技术

文章目录 一、DNS(Domain Name System)1.DNS背景2.域名3.浏览器中输入url后,发生的事情 二、ICMP协议1.什么是ICMP协议2.ICM功能3.ICMP的报文格式4.ping命令5.traceroute命令 三、NAT技术1.NAT技术背景2.NAT IP转换过程3.NAPT4.NAT技术的缺陷5.NAT和代理服务器 四、TCP/IP五层模…

【数据结构和算法】链表的简单实现

目录 c版本c语言版 &#x1f431;‍&#x1f680;个人博客https://blog.csdn.net/qq_51000584/ &#x1f431;‍&#x1f464;收录专栏&#xff1a;数据结构和算法 &#x1f431;‍&#x1f453;专栏目标&#xff1a;分享一些学习的代码 &#x1f431;‍&#x1f4bb;作者&…

vue项目中vue.config.js文件的介绍

vue.config.js 是一个可选的配置文件&#xff0c;如果项目的根目录中没有这个文件&#xff0c;则 Vue CLI 会使用默认的配置。这个文件的主要目的是为了让开发者能够调整 Vue CLI 生成的项目的默认配置。 vue.config.js 应该导出一个包含了配置选项的对象。这些配置选项包括但…

React PureComponent 和 React.memo()区别

1 注意 ● PureComponent和memo仅作为性能优化的方式存在 ● 不要依赖它来阻止渲染&#xff0c;会产生BUG ● PureComponnet 和memo 都是通过对 props 值的浅比较来决定该组件是否需要更新的。 2 PureComponent 和React.memo() 区别 PureComponent 和React.memo()都是React优化…

Idea安装gideabrowser插件

Idea安装gideabrowser插件 一、安装二、设置教程 一、安装 gideabrowser链接地址 二、设置教程 在人生的舞台上&#xff0c;奋力拼搏&#xff0c;才能演绎出最精彩的人生之歌。面对挑战和困难&#xff0c;不妥协、不气馁&#xff0c;只争朝夕&#xff0c;方显坚韧与智慧。努…

如何使用Docker部署WBO容器并实现固定公网地址访问本地白板界面

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

高防服务器的原理

高防服务器的原理主要是通过各种技术手段来识别和阻止网络攻击&#xff0c;包括但不限于防火墙、入侵检测系统、入侵防御系统、流量过滤和清洗、黑白名单机制、行动分析和机器学习、散布式缓存和CDN、反向代理和负载均衡等。123456789 这些技术可以有效地检测和…

fpmarkets澳福归类总结不同十字星K线的含义

不同的十字星K线代表了不同的含义&#xff0c;各位投资者你们知道这些十字星K线的含义吗&#xff1f;今天fpmarkets澳福就归类总结一下。 首先墓碑十字星和蜻蜓十字星归为一类&#xff0c;重点以墓碑十字星作为参考&#xff1a; 墓碑十字星是一种熊市反转烛台模式&#xff0c;当…

如何将域名解析成IP地址?

相对于繁琐的IP地址&#xff0c;域名以其简便的记忆方式成为人们访问网站的首选。然而&#xff0c;计算机通讯的本质需要使用IP地址&#xff0c;而计算机并不直接理解域名。在这个过程中&#xff0c;域名解析成为了关键一环&#xff0c;而这项任务由DNS&#xff08;域名系统&am…

MySQL:错误ERROR 1045 (28000)详解

1.问题说明 有时候我们登录Mysql输入密码的时候&#xff0c;会出现这种情况&#xff1a; mysql -u root -p Enter Password > ‘密码’ 错误&#xff1a;ERROR 1045 (28000): Access denied for user ‘root’‘localhost’ (using password: YES) 或者&#xff1a;错误…

2月26日做题总结(C/C++真题)

今天是2024年2月16日&#xff0c;新学期开学第一天。在大三这个重要阶段&#xff0c;我决定参加24年秋招。在准备项目的同时&#xff0c;也先做一些入门的笔试题吧&#xff0c;慢慢积累。如果你也是处于这个阶段&#xff0c;欢迎来找我交流讨论&#xff01; 今天是做题第一天&a…

备战蓝桥杯Day17 - 链表

链表 基本概念 链表是由一系列节点组成的元素集合。 每个节点包含两部分&#xff1a;数据域 item 、指向下一个节点的指针 next 通过节点之间的相互链接&#xff0c;形成一个链表 1. 链表的初始化 # 手动建立链表 # 链表的初始化 class Node(object):def __init__(self, …

[图论] 树上不重复权值的路径数

解题思路 整体思路&#xff0c;枚举路径上每个点&#xff0c;记录这个点 u 可以向上延伸到多远&#xff0c;如果可延伸到 x 点&#xff0c;则这个点对答案的贡献为 dep[u] - dep[x](下文的maxx) 1 为什么枚举是向上延伸&#xff1f;因为可以记录已走过路径中已有的权值&…

【k8s配置与存储--配置管理】

1、ConfigMap的配置 1.1 ConfigMap介绍 ConfigMap 是一种 API 对象&#xff0c;用来将非机密性的数据保存到键值对中。使用时&#xff0c; Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。 ConfigMap 将你的环境配置信息和容器镜像解耦&#xff0c;便于应用配…