当前位置: 首页 > news >正文

深入解析:机器学习日报04

深入解析:机器学习日报04

目录

  • 摘要
  • Abstract
  • 一、神经网络的softmax输出
  • 二、softmax的改进
  • 三、多个输出的分类
    • 3.1、如何构建一个用于多标签分类的神经网络
  • 四、高级优化方法
    • 4.1、adam算法
  • 总结

摘要

今天主要学习了神经网络中softmax输出层的原理与应用、数值计算精度的改进方法、多标签分类问题的处理以及Adam高级优化算法。通过理论分析和代码实践,深入理解了如何构建和优化多分类神经网络模型,掌握了提高计算精度和训练效率的具体技术手段。

Abstract

Today’s study covered the principles and applications of softmax output layers in neural networks, methods for improving numerical computation accuracy, approaches to multi-label classification problems, and the Adam advanced optimization algorithm. Through theoretical analysis and code practice, I gained a deeper understanding of how to build and optimize multi-class neural network models, and mastered specific techniques to enhance computation accuracy and training efficiency.

一、神经网络的softmax输出

这是我们之前学习的神经网络的架构

在这里插入图片描述

如上图所示,这是我们之前学习的手写数字识别的神经网络架构,带有两个隐藏层和一个输出层,如果我们现在想用10个条款进行手写数字分类,那么我们会将这个神经网络改为具有10个输出单元,像这样

在这里插入图片描述
这个输出层就是带有10个神经单元的softmax输出层,在这个神经网络中,前向传播的工作公式是,给定一个输入x,a1的计算方式与之前完全相同,然后第二个隐藏层的a2的激活也完全相同,现在我们要计算这个输出层的激活,如果我们有10个输出单元,我们将使用公式从z1到z10,与我们迄今所见的其他激活函数如sigmoid相比,它在某一方面有些不同,这是因为当我们观察sigmoid、ReLu或线性函数时,a1仅仅是z1的,a2仅仅是z2的,这些激活值只依赖对应的z值,但在softmax中,从上面推导的公式我们也能看见,每个a值都由全体z值,这是softmax函数的一个特性

如果我们想在TensorFlow中实现,这是它们的实现代码

在这里插入代码片import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
model = Sequential([
Dense(units=25, activation='relu'),
Dense(units=15, activation='relu'),
Dense(units=10, activation='softmax')
])
from tensorflow.keras.losses import SparseCategoricalCrossentropy
model.compile(loss=SparseCategoricalCrossentropy())
model.fit(X, Y, epochs=100)

和之前一样,第一步是告诉TensorFlow顺序地串联三层,第一层有25个单元的ReLu函数,第二层是一个有15个单元的ReLu函数,第三层是10个单元的softmax的输出函数,相比与之前我们在逻辑回归中使用的二元交叉熵函数,在这里我们使用的是稀疏类别交叉熵函数,稀疏类别是指我们将y分类成各个类别,它取值1到10,稀疏是指y只能取这个10个值之一,所以每张图片不是0就是1就是2等等直到9,我们不会看到一张图片同时是数字2和数字7

二、softmax的改进

我们可能感觉上几节介绍的softmax层的神经网络的实现效果还不错,但有一个更好的实现方法

我们来看看同一种量的两种不同的方法

在这里插入图片描述

我们来看看两个选择在jupyter 中的细微差异

在这里插入图片描述
从这里我们能看见,我们在计算同一个式子却采用不同的方式的时候,会产生舍入误差,因为计算机只能用有限的内存来存储每个数字,在这种情况下被称为浮点数,取决我们如何计算2除以10000的值,结果可能会或多或少的数字舍入误差

事实证明,虽然我们一直在计算softmax的代价函数的方式是正确的,但有一种方法可以减少这些数字舍入误差,从而在TensorFlow中进行更准确的计算,让我们首先用逻辑回归更详细地解释这一点,然后我们将展示这些方法如何应用于改进我们的softmax实现

在这里插入图片描述
这是我们逻辑回归的函数以及其实现代码,其实这个计算方式的误差并不是很多,如果我们允许TensorFlow不必将a计算为中间项,而是告诉TensorFlow损失是下面这个表达式,我们所做的只是将a展开成下面这个表达式

在这里插入图片描述

这样TensorFlow可以重新排列这个表达式中的项,并找到一种更准确的方式来计算这个,所以而不是原来的计算中间值程序,那么代码需要改进一下:

在这里插入图片描述
其中,from_logits等于true参数让TensorFlow做的事,实际上from_logits = z,也就是说,TensorFlow会将z计算为中间值,这个代码的一个缺点是它变得不太易读,但这使TensorFlow减少了数值舍入误差,实际上任何一种实现都可以正常工作

现在让我们把这个想法应用到softmax回归

在这里插入图片描述

这是softmax的回归函数以及其实现代码,按照我们上面所说的理论,就是直接替换a,不让TensorFlow计算这个中间值,这样的话会减少一些误差,即:

在这里插入图片描述

同理,我们需要改进代码:

在这里插入图片描述

但需要注意的是,除了要更改compile函数,我们还要将输出层改变为线性函数,也就是说,输出层现在只输出z1到z10,然后整个损失计算就在损失函数中进行

三、多个输出的分类

现在,我们已经了解了多类分类,即输出标签Y可以是两个中的任何一个,也可以是很多个中的任何一个,但有一种不同类型的分类问题被称为是多标签分类问题,这是一种与图像相关联的问题,让我们来实际看一个例子来感受一下

在这里插入图片描述
这是一个驾驶辅助系统的识别画面,在画面中,我们能够看到,行人我们采用绿色的方框,巴士我们采用橙色的方框,小车我们采用的是紫色的方框,在这基础上,驾驶辅助系统会判别是否存在巴士、行人、和小车:

在这里插入图片描述

这与我们之前学到的又不谋而和,给定一个驶入特征x,我们判断y标签,只不过y标签变成一个图中的标志信息,在这个例子中,y是一个包含三个数字的向量

但这与多类分类不同,比如手写数字分类,手写数字分类中的y可以有不同的可能值,而这里的y是固定的三个值,而且每种情况下都是同时有0或1这2个数字

3.1、如何构建一个用于多标签分类的神经网络

其中一个方法就是将其视为完全独立的三个机器学习问题,我们可以构建一个神经网络来判断是否有车,一个是否有巴士,一个是否行人,即:

在这里插入图片描述
另外一种方法就是训练一个神经网络来同时检测三种情况,如下图所示
在这里插入图片描述

这样输出层就有三个神经元来分别对这三个情况同时进行二元判断,即a31为判断是否有行人,a32判断是否有小车,a33判断是否有巴士

四、高级优化方法

梯度下降是一种优化算法,广泛应用于机器学习,并且是许多算法的基础,如线性回归和逻辑回归以及早期的神经网络的实现,但事实证明,现在有一些其他优化算法用于最小化成本函数,它们甚至更好

回顾一下梯度算法的表达
在这里插入图片描述
在这里插入图片描述
上面这张图绘制了成本函数,我们看到从梯度下降从下方开始,一步步向中间那个最小值毕竟,但是我们感觉这样一步步有点太慢了,有没有一种方法自动增加α使其采取更大的步伐逼近最小值,这样就引出adam算法

4.1、adam算法

Adam算法如果发现学习率太小,只是在相似的方向上迈出很小的步伐,并且不断重复,那么它就会适当增大学习率;相反,相同的代价函数,如果我们的学习率太大,他会在左右来回振荡,那么adam算法会适当减少学习率

我们来看看adam算法具体的实现代码:

model = Sequential([
tf.keras.layers.Dense(units=25, activation='sigmoid'),
tf.keras.layers.Dense(units=15, activation='sigmoid'),
tf.keras.layers.Dense(units=10, activation='linear')
])
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True))
model.fit(X, Y, epochs=100)

在这里,我们只是在编译函数中添加了一个额外的参数,我们指定优化器是tf.keras.optimizers,所以Adam是需要一些默认的初始学习率,在这个例子中我们设置的是10的负三次方

总结

今天的学习使我对神经网络的构建和优化有了更深入的理解。通过实践softmax输出层的实现,我掌握了多分类问题的解决方法,并认识到数值精度在深度学习中的重要性。学习多标签分类让我明白了如何设计神经网络来处理复杂的现实问题,而Adam优化算法的引入则展示了如何通过智能调整学习率来提高训练效率。这些知识为我后续的深度学习学习奠定了坚实基础,让我对神经网络的灵活应用有了更清晰的认识。

http://www.jsqmd.com/news/359330/

相关文章:

  • VS编写QT程序,如何向linux中移植?
  • 计算机小程序毕设实战-基于springboot+小程序的睡眠健康管理系统小程序基于Java的微信小程序睡眠健康管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 例说FPGA:可直接用于工程项目的第一手经验【3.6】
  • 详细介绍:无人机遥控器CPU技术要点解析
  • 2/8
  • 计算机Java毕设实战-基于springboot的周至猕猴桃产品售卖网站的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • P12653 [KOI 2024 Round 2] 分数竞赛
  • 计算机小程序毕设实战-基于springboot+小程序的驾校考试模拟系统小程序基于微信小程序的驾校模拟考试系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • P5712 【深基3.例4】Apples
  • 例说FPGA:可直接用于工程项目的第一手经验【3.2】
  • 小程序毕设项目推荐-基于微信小程序的驾校考试预约系统基于springboot+小程序的驾校考试模拟系统小程序【附源码+文档,调试定制服务】
  • 从平台工程视角“封装 Kubernetes”
  • 计算机小程序毕设实战-基于springboot+小程序的家教兼职系统小程序基于微信小程序的家教信息管理平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 11.Python文件操作
  • 【课程设计/毕业设计】基于SpringBoot的助眠小程序系统设计与实现基于springboot+小程序的睡眠健康管理系统小程序【附源码、数据库、万字文档】
  • 【课程设计/毕业设计】基于springboot的特色农产品,周至猕猴桃产品售卖网站的设计与实现【附源码、数据库、万字文档】
  • Kubernetes 上构建 AI 基础设施全景实践
  • 【课程设计/毕业设计】基于微信小程序的驾校预约管理系统的小程序基于springboot+小程序的驾校考试模拟系统小程序【附源码、数据库、万字文档】
  • 【计算机毕业设计案例】基于springboot+小程序的睡眠健康管理系统小程序(程序+文档+讲解+定制)
  • 【课程设计/毕业设计】基于微信小程序的家教兼职系统家教预约基于springboot+小程序的家教兼职系统小程序【附源码、数据库、万字文档】
  • Windows也能跑OpenClaw:完整安装教程+飞书接入,一步步带你避坑
  • 星球助手v1.8.3发布
  • ntp服务端和客户端
  • 小程序毕设项目:基于springboot+小程序的家教兼职系统小程序(源码+文档,讲解、调试运行,定制等)
  • 小程序毕设项目:基于springboot+小程序的睡眠健康管理系统小程序(源码+文档,讲解、调试运行,定制等)
  • 《Software Defined Radio软件无线电》学习笔记
  • 小程序计算机毕设之基于微信小程序的家教兼职平台基于springboot+小程序的家教兼职系统小程序(完整前后端代码+说明文档+LW,调试定制等)
  • 封神组合!finalCodecs+完美解码+PotPlayer,再也没有打不开的视频
  • 基于GRU门控循环单元的轴承剩余寿命预测MATLAB实现
  • 小程序计算机毕设之基于springboot+小程序的睡眠健康管理系统小程序t基于微信小程序的睡眠健康管理系统(完整前后端代码+说明文档+LW,调试定制等)