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

深度学习的面试小记

  1. 随机梯度下降(SGD)

一种迭代方法,用于优化可微分目标函数。SGD有一个训练速度的问题,学习率过大,无法获得理想的结果,而学习率过小,训练可能会非常耗时。
在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。从几何意义上讲,就是函数变化增加最快的地方。
首先来看看梯度下降的一个直观的解释。比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。

  1. 学习率衰减

一般来说,我们希望在训练初期学习率大一些,使得网络收敛迅速,在训练后期学习率小一些,使得网络更好的收敛到最优解。
pytorch提供的学习率调整策略分为三大类,分别是:
(1)有序调整:等间隔调整(Step),多间隔调整(MultiStep),指数衰减(Exponential),余弦退火(CosineAnnealing);
(2)自适应调整:依训练状况伺机而变,通过监测某个指标的变化情况(loss、accuracy),当该指标不怎么变化时,就是调整学习率的时机(ReduceLROnPlateau);
(3)自定义调整:通过自定义关于epoch的lambda函数调整学习率(LambdaLR)。

  1. 反向传播

反向传播算法是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。其主要思想是:

(1)将训练集数据输入到ANN的输入层,经过隐藏层,最后达到输出层并输出结果,这是ANN的前向传播过程;

(2)由于ANN的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;

(3)在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。

  1. 学习率warmup

warmup采用以较低学习率逐渐增大至较高学习率的方式实现网络训练的“热身”阶段,随着训练的进行学习率慢慢变大,到一定程度后就可以设置的预设的学习率进行训练了,随着模型的拟合,需要的学习率也会越来越小,这时也会需要将学习率调小。
学习率的warmup和学习率衰减可如下图走势:
在这里插入图片描述

  1. dropout

为了缓解网络过拟合的问题,其中一种常见的办法是使用 dropout 函数。dropout
最直接的作用就是可以提升模型的泛化能力,提高模型的健壮性,提高通用性。dropout 是指在深度网络的训练中,以一定的概率随机地
“临时丢弃” 一部分神经元节点。具体来讲,dropout
作用于每份小批量训练数据,由于其随机丢弃部分神经元的机制,相当于每次迭代都在训练不同结构的神经网络。

  1. 批量标准化 Batch Normalization

批量标准化(BN)指的是对神经网络每一层的输入进行标准化,目的是为了解决训练过程中输入数据分布漂移——Internal Covariate
Shift。在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。BN将激活函数的输出从任意的正态分布拉到均值为0,方差为1的标准正态分布,使得输入落到激活函数的敏感区,即较小的变化也会导致loss较大的变化,梯度变大,防止梯度消失的同时也加速模型收敛。
BN优点总结:
1.防止梯度消失
2.加速模型收敛
3.降低初始化要求,可以设置较大的初始学习率,加快学习。
4.某些情况下,可以提升模型泛化性能,因为BN也可以视为一种正则化的方法。

BN的缺点:
第一个,batch_size较小的时候,效果差。
第二个,就是 BN 在RNN中效果比较差。

  1. 边缘检测canny算子

在这里插入图片描述

  1. 平滑处理

均值滤波,中值滤波,高斯滤波。

  1. 增强处理

图像亮度增强和降低,多角度旋转,水平翻转,垂直翻转,高斯噪声, 缩放,裁剪,对比度增强和降低,随机区域擦除。

  1. 膨胀腐蚀

膨胀是在二值图像中“加长”或“变粗”的操作。
腐蚀“收缩"或“细化”二值图像中的对象。
开运算是先腐蚀后膨胀。主要用于消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积,同时抑制比结构元小的亮细节。
闭运算是先膨胀后腐蚀。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积,同时抑制比结构元小的暗细节。
高帽计算:原始图像 - 开运算结果 黑帽计算:闭运算结果 - 原始图像 高帽操作显示毛刺,那么黑帽就是显示缺陷。

  1. detr
  2. solov2
  3. mask rcnn
  4. yolov3

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

  1. swim transformer
  2. sotr
  3. solov7
  4. transformer
  5. t5
  6. knn最近邻算法

官方说明:如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
通俗理解:简单来说就是设定k值,取样本点范围最近的k个点,其中哪类数量最多则预测的点就为那一类

  1. kmeans

首先, 随机确定 K 个初始点作为质心(不必是数据中的点)。 然后将数据集中的每个点分配到一个簇中, 具体来讲,
就是为每个点找到距其最近的质心, 并将其分配该质心所对应的簇. 这一步完成之后, 每个簇的质心更新为该簇所有点的平均值.
重复上述过程直到数据集中的所有点都距离它所对应的质心最近时结束。

  1. 最小二乘法

最小二乘法(Least Squares
Method)是一种常见的数学优化算法,其目的在于找到一组参数,使得这些参数所代表的模型与给定的数据之间的误差最小。具体来说,最小二乘法通常用于求解线性回归问题,即寻找一条直线,使得该直线能够最好地拟合给定的数据点。在最小二乘法中,我们通过最小化残差平方和来确定最佳拟合直线的斜率和截距。残差是指每个数据点的实际值与该直线对应点处的预测值之间的差异。最小二乘法在多项式回归以及其他许多机器学习算法中也有广泛应用。

  1. opencv
  2. pandas
  3. numpy
  4. matplotlib
  5. python
  6. pytorch
  7. tensorflow
  8. resnet的目的

解决了网络退化以及梯度消失/爆炸这两个主要问题
当使用更深层的网络时,会发生梯度消失/爆炸问题,这个问题很大程度通过标准的初始化和正则化层来基本解决,这样可以确保几十层的网络能够收敛,但是随着网络层数的增加,梯度消失或者爆炸的问题仍然存在。
还有一个问题就是网络的退化,这就是随着网络深度增加,模型会产生退化现象。它不是由过拟合产生的,而是由冗余的网络层学习了不是恒等映射的参数造成的。
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/5a8fc38e9a084d7f845038d116853e56.png
在这里插入图片描述

  1. mobilenet
  2. 梯度爆炸,梯度消失的原因

本质上是因为神经网络的更新方法,梯度消失是因为反向传播过程中对梯度的求解会产生sigmoid导数和参数的连乘,sigmoid导数的最大值为0.25,权重一般初始都在0,1之间,乘积小于1,多层的话就会有多个小于1的值连乘,导致靠近输入层的梯度几乎为0,得不到更新。梯度爆炸是也是同样的原因,只是如果初始权重大于1,或者更大一些,多个大于1的值连乘,将会很大或溢出,导致梯度更新过大,模型无法收敛。

梯度消失:(1)隐藏层的层数过多;(2)采用了不合适的激活函数(更容易产生梯度消失,但是也有可能产生梯度爆炸)
梯度爆炸:(1)隐藏层的层数过多;(2)权重的初始化值过大

梯度消失解决的方法 (1)pre-training+fine-tunning (2) 选择relu等梯度大部分落在常数上的激活函数
relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失的问题。 (3)batch
normalization
BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了权重参数放大缩小带来的影响,进而解决梯度消失的问题,或者可以理解为BN将输出从饱和区拉到了非饱和区。
(4) 残差网络的捷径(shortcut) 梯度爆炸 (1)pre-training + fine-tunning
(2)Relu、leaky Relu… (3)BN (4)残差网络 (5)LSTM的门结构 (6)重新设计网络模型 (7)梯度阶段
(8)权重正则化

  1. 模型剪枝量化

模型剪枝是一种减少神经网络参数数量和计算量的技术,一般分为以下几类方法:

轻量化模型:通过设计更加简单的模型结构,如MobileNet、ShuffleNet等,来实现模型压缩。

权值剪枝:通过删除权值接近0的部分参数来降低模型参数量。常见的剪枝方法包括全局剪枝、通道剪枝、卷积核剪枝等。

知识蒸馏:使用一个较大的模型(教师模型)对训练数据进行训练,并将学到的知识传递给一个较小的模型(学生模型),从而达到模型压缩的目的。

参数量化:将模型中的参数转变为低精度表示,如8位整数或4位浮点数,在保证模型准确率的前提下减少了存储空间和计算量。

以上是主流的模型剪枝方法,实际应用时也可以根据具体的场景选择不同的方法进行组合使用。

  1. 半精度计算

半精度计算是一种使用16位浮点数(FP16)来进行计算的方法,相比于传统的单精度计算(32位浮点数,FP32),半精度计算可以大幅减小存储空间和传输带宽的需求,同时也可以提高计算速度。

在深度学习中,半精度计算被广泛应用于模型训练和推理过程中。通过将神经网络中的参数、输入、输出等数据转换为16位浮点数,可以显著降低模型占用的存储空间和内存带宽,从而加快模型训练和推理的速度。

不过,半精度计算也存在一些问题。由于16位浮点数的表示范围较小,在某些情况下会导致数值精度损失过大,进而影响模型的精度。因此,在应用半精度计算时,需要对模型的网络结构、训练方式以及量化方法等进行综合考虑和优化,以保证模型的精度和性能。


http://www.kler.cn/a/4411.html

相关文章:

  • 《银行保险机构数据安全管理办法》正式实施,分类分级、安全评估共筑安全防线
  • 如何使用PHP构建IoC容器,实现依赖注入!
  • Redis哨兵(Sentinel)
  • 从0开始学习搭网站第二天
  • VM(虚拟机)和Linux的安装
  • C++|CRC校验总结
  • VUE3 学习笔记(五)UI框架Element Plus
  • C/C++开发,编译环境搭建
  • HDFS概述
  • 查看mysql InnoDB引擎 线程模型信息
  • Modelsim仿真使用教程
  • Leetcode.1191 K 次串联后最大子数组之和
  • 数据结构之小端和大端之谜
  • Vue 点击图片放大显示功能
  • 11_nginx_document_uri
  • 信息打点-主机架构蜜罐识别WAF识别端口扫描协议识别服务安全
  • 测试开发进阶系列课程
  • 问卷中多选题该怎么分析?
  • 《毫无意义的工作》笔记——一个人的工作越明显对他人有益,他得到的酬劳就越低?
  • STM32之TIM编码器接口
  • uni-app使用uview组件中的封装
  • 【笔记】C# 泛型约束
  • 【华为OD机试 2023最新 】 回文字符串(C++)
  • 基于springboot实现校园在线拍卖电商系统【源码】
  • 小波阈值去躁
  • 除了四大“门派”菌,一文了解肠道菌群的其它17个小众“门派”细菌