(2023版)斯坦福CS231n学习笔记:DL与CV教程 (3) | 正则化与最优化

news2024/11/15 9:24:46

在这里插入图片描述

前言

  • 📚 笔记专栏:斯坦福CS231N:面向视觉识别的卷积神经网络(23)
  • 🔗 课程链接:https://www.bilibili.com/video/BV1xV411R7i5
  • 💻 CS231n: 深度学习计算机视觉(2017)中文笔记:https://zhuxiaoxia.blog.csdn.net/article/details/80155166
  • 🔥 2023最新课程PPT:https://download.csdn.net/download/Julialove102123/88734395

⚠️ 本节重点内容

  1. 正则化Regularization
  2. 最优化Optimization
  3. 梯度下降 Grendient descent
  4. 学习率Learning rate

1. 正则化(Regularization)

1.1 为什么引入正则化

上节讲到了如何选择最合适的超参数W,那有没有可能会出现多个这样的参数W1、W2…都能似的损失函数最小呢,答案是非常有可能!!!本节引入正则化就是确定怎么选最合适的W。在这里插入图片描述
在这里插入图片描述

1.2 正则化损失(regularization loss)

为什么要正则化?

  • 表达对权重的偏好
  • 使模型简单,以便它适用于测试数据
  • 通过添加曲率来改进优化
    在这里插入图片描述
    在这里插入图片描述

1.3 常见正则化损失

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

二、优化(Optimization)

🔥🔥🔥重要推荐:可视化工具 :http://vision.stanford.edu/teaching/cs231n-demos/linear-classify/

在这里插入图片描述
现在我们有了数据集、评分函数、损失函数,那我们怎么找到最好的超参数W呢?答案是优化!

2.1 优化策略(Optimization Strategy)

优化策略的目标是:找到能够最小化损失函数值的权重W。

1) 策略一:随机搜索(Random search)

随机尝试很多不同的权重,然后看其中哪个最好。这是一个差劲的初始方案。验证集上表现最好的权重W跑测试集的准确率是15.5%,而完全随机猜的准确率是10%,效果不好!

思路调整:新的策略是从随机权重W开始,然后迭代取优,每次都让它的损失值变得更小一点,从而获得更低的损失值。想象自己是一个蒙着眼睛的徒步者,正走在山地地形上,目标是要慢慢走到山底。在 CIFAR-10 的例子中,这山是30730维的(因为W是3073X10)。我们在山上踩的每一点都对应一个的损失值,该损失值可以看做该点的海拔高度。

2) 策略二:随机本地搜索

第一个策略可以看做是每走一步都尝试几个随机方向,如果是上山方向就停在原地,如果是下山方向,就向该方向走一步。这次我们从一个随机W开始,然后生成一个随机的扰动aW,只有当 W+aW 的损失值变低,我们才会更新。用上述方式迭代1000次,这个方法可以得到 公式 的分类准确率。

3) 策略三:跟随梯度

前两个策略关键点都是在权重空间中找到合适的方向,使得沿其调整能降低损失函数的损失值。其实不需要随机寻找方向,我们可以直接计算出最好的方向,这个方向就是损失函数的梯度(gradient)。这个方法就好比是感受我们脚下山体的倾斜程度,然后向着最陡峭的下降方向下山。

在一维函数中,斜率是函数在某一点的瞬时变化率。梯度是函数斜率的一般化表达,它是一个向量。

在输入空间中,梯度是各个维度的斜率组成的向量(或者称为导数 derivatives)。对一维函数的求导公式如下:在这里插入图片描述

三、梯度计算

计算梯度有两种方法

1.数值梯度法,缓慢的近似方法,实现相对简单。
2. 分析梯度法,计算迅速,结果精确,但是实现时容易出错,且需要使用微分。

3.1 数值梯度法

数值梯度法是借助于梯度的定义对其进行逼近计算。输入函数 f f f和矩阵 x x x,计算 f f f的梯度的通用函数,它返回函数 f f f在点 x x x处的梯度,利用公式
在这里插入图片描述
代码对 x x x矩阵所有元素进行迭代,在每个元素上产生一个很小的变化 h h h,通过观察函数值变化,计算函数在该元素上的偏导数。最后,所有的梯度存储在变量 grad 。实际中用中心差值公式(centered difference formula) [ f ( x + h ) − f ( x − h ) ] / 2 h [f(x+h)-f(x-h)]/2h [f(x+h)f(xh)]/2h 效果会更好。

① 在梯度负方向上更新

  • 在上面的代码中,为了计算 W_new,要注意我们是向着梯度df的负方向去更新,这是因为我们希望损失函数值是降低而不是升高。(偏导大于0,损失递增,W需要减小;偏导小于0,损失递减,W需要增大。)

② 步长的影响

  • 从某个具体的点W开始计算梯度,梯度指明了函数在哪个方向是变化率最大的,即损失函数下降最陡峭的方向,但是没有指明在这个方向上应该迈多大的步子。
  • 小步长下降稳定但进度慢,大步长进展快但是风险更大,可能导致错过最优点,让损失值上升。在某些点如果步长过大,反而可能越过最低点导致更高的损失值。选择步长(也叫作学习率)将会是神经网络训练中最重要(也是最麻烦)的超参数设定之一。

③ 效率问题

  • 计算数值梯度的复杂性和参数的量线性相关。在本例中有30730个参数,所以损失函数每走一步就需要计算30731次损失函数(计算梯度时计算30730次,最终计算一次更新后的。)
  • 现代神经网络很容易就有上千万的参数,因此这个问题只会越发严峻。显然这个策略不适合大规模数据。

3.2 解析梯度法

数值梯度的计算比较简单,但缺点在于只是近似不够精确,且耗费计算资源太多。

得益于牛顿-莱布尼茨的微积分,我们可以利用微分来分析,得到计算梯度的公式(不是近似),用公式计算梯度速度很快,但在实现的时候容易出错。

为了解决这个问题,在实际操作时常常将分析梯度法的结果和数值梯度法的结果作比较,以此来检查其实现的正确性,这个步骤叫做梯度检查
在这里插入图片描述

四、梯度下降(Gradient Descent)

现在可以利用微分公式计算损失函数梯度了,程序重复地计算梯度然后对参数进行更新,这一过程称为梯度下降。

4.1 Batch梯度下降法

Batch梯度下降法 (批梯度下降法) 是最常用的梯度下降形式,它是基于整个训练集的梯度下降算法,在更新参数时使用所有的样本来进行更新。

对整个训练集进行梯度下降法的时候,我们必须处理整个训练数据集,然后才能进行一步梯度下降,即每一步梯度下降法需要对整个训练集进行一次处理,如果训练数据集很大的时候,处理速度就会比较慢。

但是如果每次处理训练数据的一部分,基于这个子集进行梯度下降法,算法迭代速度会更快。而处理的这些一小部分训练子集即称为 Mini-Batch,这个算法也就是我们说的 Mini-Batch 梯度下降法。

4.2 Mini-Batch梯度下降法

Mini-Batch梯度下降法 (小批量梯度下降法) 每次同时处理单个的 Mini-Batch,其他与 Batch 梯度下降法一致。使用 Batch 梯度下降法,对整个训练集的一次遍历只能做一个梯度下降;而使用 Mini-Batch 梯度下降法,对整个训练集的一次遍历 (称为一个 epoch) 能做 Mini-Batch 个数个梯度下降。之后,可以一直遍历训练集,直到最后收敛到一个合适的精度。

例如,在目前最高水平的卷积神经网络中,一个典型的小批量包含 256 个样本,而整个训练集是一百二十万个样本。(CIFAR-10,就有 50000 个训练样本。)比如这个小批量数据就用来实现一个参数更新:

这个方法之所以效果不错,是因为训练集中的数据都是相关的。要理解这一点,可以想象一个极端情况:在ILSVRC中的120万个图像是1000张不同图片的复制(每个类别1张图片,每张图片复制1200次)。那么显然计算这1200张复制图像的梯度就应该是一样的。对比120万张图片的数据损失的均值与只计算1000张的子集的数据损失均值时,结果应该是一样的。实际情况中,数据集肯定不会包含重复图像,那么小批量数据的梯度就是对整个数据集梯度的一个近似。因此,在实践中通过计算小批量数据的梯度可以实现更快速地收敛,并以此来进行更频繁的参数更新。

⚠️小批量数据策略有个极端情况:每批数据的样本量为1,这种策略被称为随机梯度下降(Stochastic Gradient Descent 简称SGD),有时候也被称为在线梯度下降。SGD在技术上是指每次使用1个样本来计算梯度,你还是会听到人们使用SGD来指代小批量数据梯度下降(或者用MGD来指代小批量数据梯度下降)。

小批量数据的大小是一个超参数,但是一般并不需要通过交叉验证来调参。它一般设置为同样大小,比如32、64、128等。之所以使用2的指数,是因为在实际中许多向量化操作实现的时候,如果输入数据量是2的指数,那么运算更快。

可以看一下吴恩达老师的讲解,非常之详尽!!!https://www.showmeai.tech/article-detail/217

4.3 SGD+Momentum

  • Momentum

  • Nesterov Momentum

4.4 AdaGrad

4.5 RMSProp: “Leaky AdaGrad”

4.6 Adam

五、学习率(learning rate)

SGD, SGD+Momentum, Adagrad, RMSProp, Adam 都有超参数学习率。

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

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

相关文章

Android 12+ MQTT适配

最终的解决方案是下载源码去改。我用的是已经修改好了的库,如果包名要自己的, 要注意: 1. compileSdk 34 和 targetSdk 34 改成33(Android12)或者34(Android13)。 2. 下载的 module 导入。 …

【设计模式之美】重构(三)之解耦方法论:如何通过封装、抽象、模块化、中间层等解耦代码?

文章目录 一. “解耦”概述二. 如何给代码“解耦”?1. 封装与抽象2. 中间层2.1. 引入中间层能**简化模块或类之间的依赖关系**。2.2. 引入中间层可以起到过渡的作用,能够让开发和重构同步进行,不互相干扰。 3. 模块化4. 其他设计思想和原则4.…

QT属性动画

时间记录:2024/1/15 一、介绍 属性动画类为QPropertyAnimation,类似于CSS的keyframes关键帧 二、分类及使用步骤 1.几何动画 (1)创建QPropertyAnimation对象 (2)setPropertyName方法设置属性名称&#…

谷歌验证码|某爬虫问答社区登录参数分析

关注它,不迷路。 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除! 1.目标地址 aHR0cHM6Ly9iYnMubmlnaHR0ZWFtLmNuL21lbWJlci5waHA/bW9kPW…

高通平台开发系列讲解(PCIE篇)MHI (Modem Host Interface)驱动详解

文章目录 一、MHI驱动代码二、MHI读数据流程三、MHI写数据流程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢MHI (Modem Host Interface)我们通过名字顾名思义知道,它是Modem与Host的桥梁。 MHI 可以很容易地适应任何外围总线,但它主要用于基于 PCIe 的设备。 MHI(…

ElasticSearch降本增效常见的方法 | 京东云技术团队

Elasticsearch在db_ranking 的排名不断上升,其在存储领域已经蔚然成风且占有非常重要的地位。 随着Elasticsearch越来越受欢迎,企业花费在ES建设上的成本自然也不少。那如何减少ES的成本呢?今天我们就特地来聊聊ES降本增效的常见方法&#x…

Odrive 学习系列三:在odrive工程中添加SEGGER RTT 日志输出功能

一、背景: 对于嵌入式来讲,有个日志输出真真真真的太重要啦! SEGGER JLink自带的RTT日志输出对于老嵌入式而言更是开发利器。 Odrive本身的工程是不带这个功能的,尽管使用stlink可以查阅寄存器等,但感觉还是差了点意思。因此在本系列第二节的基础上,希望能给Odrive工程添…

Notepad++编译运行C/C++程序

首先需要先下载一个C语言编译器-MinGW(免费的) 官网:http://www.mingw.org/(加载太慢) 我选择MinGW - Minimalist GNU for Windows download | SourceForge.net这个网址下载的 注意安装地址,后续配置环境…

unique()函数

这篇博客是本人在学习算法中遇到的一个常用的函数&#xff0c;记录分享给大家 注意 &#xff1a;unique&#xff08;&#xff09;函数是删除相邻的重复元素&#xff0c;并且返回的是去重范围后的第一个元素的地址&#xff0c;左闭右开 #include <bits/stdc.h> using na…

CAN-位填充

位填充定义&#xff08;Bit Stuffing&#xff09; 当CAN节点发送 逻辑电平&#xff08;显性dominant或隐性recessive&#xff09;为持续相同的5位时&#xff0c;它必须添加一位反向电平。 CAN接收 节点会自动删除这个新增的额外电平位。 位填充作用 1---位填充是为了防止突发…

Codeforces Round 114 (Div. 1) C. Wizards and Numbers(思维题 辗转相除+博弈 巴什博弈)

题目 t(t<1e4)组询问&#xff0c;每次询问(a,b)&#xff08;0<a,b<1e18&#xff09;&#xff0c; 不妨a<b&#xff08;a>b时需要交换两个数考虑&#xff09; ①令b减去a的k次方&#xff08;k>1&#xff09;&#xff0c;要求减完之后b非负 ②令bb%a 当a和…

华媒舍:溯源媒体发稿,助推品牌快速突破

在当今残酷竞争的市场环境中&#xff0c;品牌的快速突破变成了公司发展的关键之一。溯源新闻媒体发稿作为一项强有力营销推广方式&#xff0c;为品牌快速建立名气、提升口碑品牌形象提供了重要适用。下面我们就详细介绍如何给品牌订制溯源新闻媒体发稿对策&#xff0c;并探讨其…

目标检测-One Stage-YOLOv8

文章目录 前言一、YOLOv8的网络结构和流程二、YOLOv8的创新点三、创新点详解CSP、C3和C2fTaskAlignedAssigner 正样本分配策略Distribution Focal Loss关闭 Mosiac 总结 前言 终于到了YOLO系列最新最火爆的网络–YOLOv8&#xff0c;前面YOLOv5中已经提到ultralytics团队集成了…

开源iMES工厂管家 - 安装部署指南

环境&#xff1a; 总览&#xff1a; 下载 node-v16.17.1-win-x64&#xff1a;Index of /download/release/v16.17.1/ 官网&#xff1a;https://nodejs.org/en/download 历史版本下载&#xff1a;Index of /download/release/ 绿色解压安装 node-v16.17.1-win-x64&#xff1a;…

LeetCode 每日一题 Day 44 || 哑节点去重

82. 删除排序链表中的重复元素 II 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5] 示例 2&#x…

CSS 水浪按钮

<template><view class="content"><button class="button"><view class="liquid"></view><view class="btn-txt">水浪按钮</view></button></view></template><scrip…

20240115在ubuntu20.04.6下给GTX1080M显卡安装驱动程序和CUDA

20240115在ubuntu20.04.6下给GTX1080M显卡安装驱动程序和CUDA 2024/1/15 18:05 百度搜索&#xff1a;ubuntu gtx1080m cuda https://blog.csdn.net/wb4916/article/details/129462103 20230311给Ubuntu18.04下的GTX1080M安装驱动 https://www.cnblogs.com/djiankuo/p/5886605.h…

ubuntu20.04一键通过docker-compose部署mysql 8.0.20

os&#xff1a;ubuntu20.04 docker&#xff1a;v24 docker-compose&#xff1a;v2.2.2 主要步骤 1.拉取镜像 docker pull mysql:8.0.20 2.创建目录 mkdir -p /data/docker_mysql/log mkdir -p /data/docker_mysql/data mkdir -p /data/docker_mysql/conf.d 3.创建配置文…

Hadoop分布式文件系统(三)

目录 一、Hadoop 1、MapReduce 1.1、理解MapReduce思想 1.2、分布式计算概念 1.3、MapReduce介绍 1.4、MapReduce特点 1.5、MapReduce局限性 1.6、MapReduce实例进程 1.7、MapReduce阶段组成 1.8、MapReduce数据类型 1.9、MapReduce官方示例 1.9.1、示例说明--圆周…

软件测试|如何使用selenium操作窗口滚动条

简介 我们在进行自动化测试工作的时候&#xff0c;如果页面内容过多&#xff0c;一次性加载耗时太长的话&#xff0c;会使用分段加载来加载页面内容&#xff0c;比如开始只加载页面顶端的内容&#xff0c;而如果要加载更多的数据&#xff0c;就需要我们向下滑动&#xff0c;让…