D2l学习
学习深度学习的笔记 课程主页
- 深度学习中的三种角色
-
炼丹步骤
-
1.建立网络 2. 损失函数 3. 优化器(根据反向传播求得梯度 用优化器更具体的来更新参数) 4. 从训练集取出数据,进行训练,先梯度清0,算损失,反向传播,然后优化
- 找paper
- 注意广播机制可能会改变张量的形状
- 使用切片机制实现对张量的原地操作
- 机器学习的核心就是处理缺失数据
- 矩阵乘法其实是在做一个空间变换
- 机器学习求解核心思想:求解梯度变换最快的方向
- 机器学习主要关注np问题
正向传播和反向传播
- 正向就是求复合函数的值
- 反向就是求偏导数和梯度
- 数学中的求导就是反向传播的方向
- 代码中正向积累的中间值只有在明确声明需要且调用了反向积累时才会计算,因为计算它 too expensive
- 课程中默认向量是列向量
- A.sum(axis=0)对矩阵某一维度进行求和,第0维是竖着的,对应默认向量是列向量
- 范数(英语:Norm),是具有“长度”概念的函数。在线性代数、泛函分析及相关的数学领域,是一个函数,其为向量空间内的所有向量赋予非零的正长度或大小。另一方面,半范数(英语:seminorm)可以为非零的向量赋予零长度。
- 神经网络层数->看带权重的层有几层
线性回归
-
超参数
-
学习率就是每次下降的步长,一次下降多少
- 偏大导致震荡偏小导致学习速度慢
-
b就是批量大小,控制每次随机采样个数。
batchSize
(批量大小)指的是在一次前向传播与反向传播过程中所使用的样本数量。在训练深度学习模型时,通常不会将整个数据集一次性输入到模型中进行训练,而是把数据集划分成若干个小的批次(batch),每个批次包含batchSize
个样本。 -
batchSize宜小不宜大。小的话有噪音,噪音可以增强泛化能力。过大的话求解就针对这个训练集了
- shuffle 随机取是可以保证所有样本都取一遍的,不放回
- 统计模型 损失函数长什么样 - 优化模型 用什么样的算法来求解 - 我们并不关心收敛的速度,而是收敛到哪一个位置,次优解可以有很多个 - 生成器生成数据是懒惰类型,不是一下全都生成,节省内存 - 线性模型的训练就是在找最适合的w和b。w是各参数的权重,b是偏移量
SoftMax回归
- 对分类问题,如果类别间有自然顺序,可以转化为回归问题
- softmax函数能够将未规范化的预测变换为非负数并且总和为1,同时让模型保持
可导的性质。
损失函数
- 使用对数似然即使用负对数对softmax后的概率进行处理的目的是给错误的类添加更大的惩罚从而使得正确的类更加显著
对于交叉熵损失,我们只会得到独热编码为1时的那个类的概率,只关心对正确类的预测值的置信度- 交叉熵损失可以很好的反映预测的概率和实际概率之间的差异
图片分类数据集
- 训练的瓶颈可能在数据读取,在训练之前要batchMark测试一下,数据读取最好比训练要快
softMax回归手动实现
- 训练softmax回归循环模型与训练线性回归模型非常相似:先读取数据,再定义模型和损失函数,然后使用优化算法训练模型。大多数常见的深度学习模型都有类似的训练过程。
多层感知机
感知机
- 感知机就是在线性模型的基础上套一层激活函数,使得输出由线性变为非线性
多层感知机
- 隐藏层大小是超参数 代表隐藏层个数
- 这里b2=R是因为这里是单隐藏层,只需要一个偏置即可
激活函数
- 主要用于避免层数塌陷,给模型增加非线性性。如果隐藏层只有一层,不加激活函数,一个感知机就退化成线性模型了
- 解决了x=0处不好求导的问题,是0-1分布的soft版本
- 解决了x=0处不好求导的问题,是-1-1分布的soft版本
- 好处是不用求指数,算得快。最常用
多类分类
- 和之前的softMax没有本质区别
- 模型设计最好是金字塔型
代码实现
- 交叉熵函数自带softMax
QA
模型选择 + 过拟合和欠拟合
模型选择
- 训练数据集 用于调整权重、偏置等模型参数
- 验证数据集 用于调整超参数(模型训练之前需要手动设置的参数,它们不能通过模型的训练过程自动学习得到,而是需要通过在验证集上进行实验和调优来确定。超参数的选择会影响模型的学习速度、复杂度和泛化能力等。)
要独立于训练数据集,不能参与训练(会导致验证结果虚高) - 测试数据集用于测试模型最终训练结果,不可以在这个数据集上训练
- 数据集大小不够的解决方法
- 用于确定超参数,然后在此基础上重新训练模型
- 直接找选定超参数后K折里精度最好(或随便)的一折,选择该模型,不再重新训练。
- 每折得出的模型都用上,对测试集使用后求均值
过拟合、欠拟合
- 首先模型容量得高,然后再去控制误差。一定的过拟合是可以承受的
- 模型复杂度可以通过VC维来量化,就是这个模型所完美分类一个数据集的最大的大小
QA
- 神经网络是不那么直观,但是编程性比较好的一种框架
-
调参数其实就是在调超参数,欠拟合、过拟合就是在暗示什么样的参数是好的
-
超参数的设计靠
- 经验
- 一个一个试,根据上一个的效果优化下一个
- 随机选取
-
如果数据集比较小且不均衡,验证数据集最好均衡一下
-
其实不然,应该考虑现实世界是什么样子的,如果现实世界ushijie也是不均衡的,那就保留这种不均衡,保证在主流部分的精确性
- 如果只是采样偏差,可以对小的那个进行加权
- CNN(空间信息)本质上是一个mlp,RNN同理(时序信息。都是通过神经网络来描述对问题的理解
- 艺术、工程、科学
- 如果在验证数据集上loss发生了先下降在上升,就是发生了过拟合
权重衰退
- 最常见用于处理过拟合的方法
- 缩小模型的容量
- 限制参数的个数
- 限制参数的域
先把当前的权重做一次缩小,再做梯度下降- 权重衰退就是在正常梯度更新的基础上对更新幅度做一个缩放
丢弃法
- 在层之间加入噪音
- 作用在全连接隐藏层的输出上
- 正则项b只在训练中使用,会对权重产生影响
- 在推理中dropout直接返回输入
- 缩小隐藏层个数(不是隐藏层层数)效果不如隐藏层个数偏大+大dropout率
QA
- 由于使用了随机丢弃导致dropout有随机性。通过固定randonSeed可以使结果可重复
数值稳定性
模型初始化、激活函数(听不懂)
- 归一化的定义是将数据按照一定的规则进行变换,使其落入一个特定的区间或满足特定的统计特性。其主要目的是消除数据特征之间的量纲差异和尺度差异,让不同特征在数值上具有可比性。例如,在一个数据集中,特征 A 的取值范围是 1 到 1000,而特征 B 的取值范围是 0 到 1,若直接对数据进行分析或建模,特征 A 可能会因其较大的数值范围而对结果产生过大的影响,归一化可以解决这个问题。
- 权重初始化
- 权重初始化时的方差是根据输入和输出维度来确定
- 保证均值为0,方差是固定范围内的一个数
QA
- 数学底蕴很重要
- 限制的特征的范围,是在不损失模型的表达性的基础上的。主要目的是方便硬件处理,不会出现梯度爆炸和消失
- 所有的深度学习都是在解决数值稳定性的问题
kaggle预测房价实战
- 用log来缩放一下数值较大的特征
- adam优化函数相对sgd来说对学习率没那么敏感
- 不可以在浅层网络上调参数然后运用到深层网络上,因为层数也是一个超参数。但是可以先用小容量数据来调
PyTorch 神经网络基础
- Sequential对象其实就是一个拿来装Linear (),ReLu()等方法(网络的层)的顺序容器
- 可以通过net[x]来访问x层
- 将复杂的网络模块化、多个模块嵌套构建最终的网络
- apply函数的功能是将传入的函数应用到指定的module上,不只是初始化,做什么都行
- 复用同一层可以达到共享权重的目的
- 80%的时间 做数据,20%的时间调模型。好的数据的重要性远大于模型
- 要有阶段性目标 要做什么、要获得什么成长
卷积层
卷积
- 图片匹配原则
- 平移不变形
- 局部性
- 卷积是一种特殊的全链接层
- 卷积核就是那个W(权重)
- 全连接层:像 “全班大讨论”—— 每个人的发言都被所有人听到,信息全面但嘈杂。
- 卷积层:像 “小组讨论”—— 每个人只和前后左右的同学交流,聚焦局部信息,效率更高。
- 池化层:像 “小组代表发言”—— 每组选一个代表总结观点,压缩信息但保留关键特征。
卷积层
- 动画里使用的是3*3的核
- 相当于利用卷积核将高维的输入映射为低维的输出
- 图中的星型计算就是上节定义的二维交叉计算
- 那个输出()*()指的是 高 * 宽 是输出矩阵的大小
- 选用不同的核函数可以对图像进行不同的处理
- 卷积核:有正有负和为0是边缘检测、全为正和为1是均值滤波、高斯权重的均值滤波是高斯平滑/模糊
- 卷积和交叉相关是中心对称的关系。
- 实际实现的是交叉相关
- 气象地图多一个时间轴
- 核矩阵大小控制着局部性。大一点看到的部分多一点
- 卷积解决了之前随着输入变大权重矩阵变得特别大的问题。因为核函数是固定大小的
QA
- 窄而深的模型效果很多时候比宽而浅的好。对卷积和全链接层都是
- 全链接层最大的问题是权重W矩阵的高度(高指的是参数矩阵的行数)取决于输入矩阵的宽。当输入维度太大就炸了
- 全连接层输入层要为每个输入分配权值,而卷积是共享权值。不管输入维度多大,核的大小是固定的
20 卷积层里的填充和步幅
- 填充和步幅是卷积中的两个超参数
- 有一个问题是输入不能小于卷积核大小
- 卷积核通常不会选用很大的
- 解决方法
填充
- 要注意在pytorch中的padding指的是一边的,等于这里的p/2
步幅
QA
- 核大小通常是最关键的参数
- 步幅是为了减小输出 可以加速卷积的速度
- 填充的主要目的,是为了让卷积核更多地识别到边缘信息,而不是为了控制输入输出大小
- kernel边长通常为奇数。padding=kernel-1,而padding是分在图片上下的,kernel为奇数,padding就可以对半分。
- 第一层如果是3x3的filter的话,第二层中一块3x3的区域就包含了输入中一块5x5的区域的信息(stride=1)。卷积核小就把层数弄深一点
- 机器学习本质上是信息筛选过滤压缩
- 较大的卷积核配上较浅的网络可以等效小而深的,但是时间复杂度和核的高*宽相关。因此较大的卷积核训练会比较贵
21 卷积层里的多输入多输出通道
- 对每个输出通道都有一个自己的三维卷积核
- 输入和输出通道间没有太多相关性
- 输入是前一层的超参数
- 这里针对的是多输入多输出通道卷积层的介绍
- 多输出层依赖三维卷积核,该层做完卷积每个通道对应位置也相加,第三维维度大小对应对输出通道通道数
QA
-
“不同通道的卷积核是一样的”,其实是不同通道的同一个输出通道的卷积核是一样的
-
”每个通道的卷积核是不一样的“,是因为有多少个输出通道就有多少种卷积核
- 这里针对二维卷积,对加上深度的图像不适用
- 卷积层参数共享指的是整个图像用同一个卷积核来扫描,和全连接网络相比共享了参数
22 池化层
- 和核差不多,不过一个是计算一个是选最大值输出
- 允许边缘有抖动,增强特征的平移不变形
- 步幅和窗口大小相同意味着投影不会有重叠
- 池化是在每个通道上做的,不会把通道合并
23 经典卷积神经网络 LeNet
- 每个通道的信息可以认为是一个空间的pattern
- 一般的训练策略是高宽减半通道数翻倍
-
像素密度增大了,就是说输出通道数增加,每个同位置像元包含,多个通道信息,一个通道可理解为提取出一个特征信息。
- 多输出通道
-
16组,每组有6个卷积核 分别与6个通道的输入 进行互相关运算然后相加,最后把16个叠在一起
-
输出通道可以认为是匹配了某一种特定的模式
24 深度卷积神经网络 AlexNet
- dense:稠密层也称做全连接层,就是把特征提取成一维帮助最后分类
25 使用块的网络 VGG
-
VGG(Visual Geometry Group)的核心思想是通过堆叠多个小卷积核(如 3×3)的卷积层来替代大卷积核(如 7×7、5×5)的卷积层,从而在保持相同感受野的同时减少参数量,并通过增加网络深度提升特征提取能力。
-
vgg使用块替换掉了alexnet的卷积层
- 不要过度设计,尽量用简单的模型
26 网络中的网络 NiN
- 全连接层的问题
- 特别占用参数空间
- 过拟合
- nin的思想就是完全不要全连接层
- 1*1的卷积层等价于全连接层
- 最大池化层的作用是将高宽减半
- 最后应该是1000个通道, 每个通道一张图。 对每张图求平均, 就是1000个数。代表1000个类别的评分。
- 1×1 卷积层除了可实现通道维度变换等,还能引入非线性。因为 1×1 卷积层后一般会跟着激活函数(比如 ReLU ),每个像素经过 1×1 卷积计算以及激活函数处理,就给单个像素的特征变换增添了非线性,
- softmax 写在了traning中,所以网络定义中不需要再加softmax层 CrossEntropyLoss里面有Softmax
27 含并行连结的网络 GoogLeNet / Inception V3
28 批量归一化
- 在做很深的网络的时候这个是必须的层
- 在反向传播过程中,梯度通过链式法则从输出层传递到输入层,由于链式法则的乘积形式,如果每一层的梯度范数小于1,那么经过多层的乘积后,梯度会指数级减小,从而导致梯度消失。
- 为什么会变化?
- 每一层的方差和均值的分布都不一样
- 固定住,使每一层都符合某一个分布
- 但是计算总体损失的时候是逐个sample再求mean的,如果这些samples都符合某个分布会更方便
- gama 和 beita 是通过学习得到的新的均值和方差
QA
- 模型稳定的情况下收敛不会变慢
29 残差网络 ResNet
29.2 ResNet为什么能训练出1000层的模型
36 数据增广
- 增强一般在训练时使用、一般为在线生成且是随机进行增强
- 增强要合理
- 训练集的选取主要由实际会碰到的情况来决定。当部署的环境没有那么奇怪的结果可以不用考虑这种增强
- 图片增广不改变数据分布,改变方差
- mixup增广比较有效
### 37 微调
- 迁移学习是指将从一个任务(源任务)中学习到的知识或经验,迁移应用到另一个不同但相关的任务(目标任务)中,以提升目标任务的学习效率或性能,避免从零开始训练的机器学习方法论。其核心在于利用任务间的相关性实现知识复用,尤其适用于目标任务数据量少或标注成本高的场景。
- 给不是迁移过来的层使用更大的学习率
- 预训练模型的权重拿来用而不固定,你在你这个数据集上训练会有变化的,只是训练的epoch可以更少,模型更快收敛
- 尽量从微调开始进行训练
QA
- 越是接近输入 特征越通用
41 物体检测和数据集
QA
- 标注的时候先自己标一些然后通过迁移学习等方法训练一个模型,再把那些置信度低的类拿出来多标几张再训练模型
42 锚框
- 算法对边框位置的一个猜测
- 生成高质量的锚框很关键
- 总结:1.如何生成锚框 2.如何判断锚框有效 3.每个类保留一个锚框进行预测
- 处理训练样本三个重点:1.产生大量锚框,像素点*(s+r-1) 2.基于iou和label数据给锚框分类和偏移 3.nms精简非背景锚框,确保一个锚框对应一个目标