机器学习日报04

目录

摘要

今天主要学习了神经网络中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中实现,这是它们的实现代码

python 复制代码
在这里插入代码片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算法具体的实现代码:

python 复制代码
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优化算法的引入则展示了如何通过智能调整学习率来提高训练效率。这些知识为我后续的深度学习学习奠定了坚实基础,让我对神经网络的灵活应用有了更清晰的认识。

相关推荐
Cathyqiii5 小时前
Diffusion-TS:一种基于季节性-趋势分解与重构引导的可解释时间序列扩散模型
人工智能·神经网络·1024程序员节
数字冰雹5 小时前
数字孪生技术 重构 智能仓储新生态
人工智能·重构
EasyCVR6 小时前
从汇聚到智能:解析视频融合平台EasyCVR视频智能分析技术背后的关键技术
大数据·人工智能
m0_650108246 小时前
【论文精读】GenTron:基于 Transformer 的扩散模型革新图像与视频生成
人工智能·论文精读·transformer扩散模型·文生图(t2i)·文生视频(t2v)
文火冰糖的硅基工坊6 小时前
[人工智能-大模型-66]:模型层技术 - 两种编程范式:数学函数式编程与逻辑推理式编程,构建起截然不同的智能系统。
人工智能·神经网络·算法·1024程序员节
创思通信6 小时前
树莓派的YOLO智能AI识别系统,识别ESP32还是STM32
人工智能·stm32·yolo
funfan05177 小时前
【开发AI】Windows安装和使用Milvus的保姆级教程
人工智能·windows·milvus
Fuly10247 小时前
使用docker安装向量数据库milvus
人工智能
darkfive7 小时前
构建大模型安全自动化测试框架:从手工POC到AI对抗AI的递归Fuzz实践
人工智能·安全·ai·自动化