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

Machine Learning:Optimization

文章目录

    • 局部最小值与鞍点 (Local Minimum & Saddle Point)
      • 临界点及其种类
      • 判断临界值种类
    • 批量与动量(Batch & Momentum)
      • 批量大小对梯度下降的影响
      • 动量法
    • 自适应学习率
      • AdaGrad
      • RMSProp
      • Adam
    • 学习率调度
    • 优化总结

局部最小值与鞍点 (Local Minimum & Saddle Point)

我们在做优化的时候经常会发现,随着参数不断更新,训练的损失不会再下降, 但是我们对这个损失仍然不满意.把深层网络(deep network)、线性模型和浅层网络(shallow network) 做比较,可以发现深层网络没有做得更好——深层网络没有发挥出它完整的力量,所以优化是有问题的.但有时候,模型一开始就训练不起来,不管我们怎么更新参数,损失都降不下去.

临界点及其种类

在优化过程中,优化到某个地方的损失关于参数的微分为零的时候,梯度下降就不能再更新参数了,训练就停下来了,损失不再下降.

image-20250214101236496

当梯度为0时,我们最先想到的是到达了局部最小值,然而损失不是只在局部极小值的梯度是零,还有其他可能会让梯度是零的点,比如鞍点(saddle point).鞍点其实就是梯度是零且区别于局部极小值和局部极大值(local maximum)的点.

image-20250214101820617

我们把梯度为零的点统称为临界点(critical point),损失没有办法再下降,也许是因为收敛在了 临界点,但不一定收敛在局部极小值,因为鞍点也是梯度为零的点.

判断临界值种类

判断一个临界点到底是局部极小值还是鞍点需要知道损失函数的形状.可是怎么知道损失函数的形状?网络本身很复杂,用复杂网络算出来的损失函数显然也很复杂.虽然无法完整 知道整个损失函数的样子,但是如果给定某一组参数,比如 θ θ θ,在 θ ′ θ^′ θ附近的损失函数是有办法写出来的–利用泰勒级数近似:
L ( θ ) ≈ L ( θ ′ ) + ( θ − θ ′ ) T g + 1 2 ( θ − θ ′ ) T H ( θ − θ ′ ) L(θ)\approx L(θ^{′})+(θ-θ^{′})^{T}g+\frac{1}{2}(θ-θ^{′})^{T}H(θ-θ^{′}) L(θ)L(θ)+(θθ)Tg+21(θθ)TH(θθ)
其中g代表梯度,是一个向量,gi 是向 量 g 的第 i 个元素,就是L关于θ的第i个元素的偏导数, g i = δ L ( θ ′ ) δ θ i g_i=\frac{\delta L(θ^′)}{\delta θ_i} gi=δθiδL(θ),弥补 L ( θ ′ ) L(θ^′) L(θ) L ( θ ) L(θ) L(θ)之间的差距,有时会写成 ∇ L ( θ ′ ) \nabla L(θ^{′}) L(θ)

展开两项还不足以描述L(θ),H里面放的是L的二次微分,它第i行, 第j列的值Hij就是把θ的第 i 个元素对 L ( θ ′ ) L(θ^{′}) L(θ)

作微分,再把θ的第j个元素二次微分,即 H i j = δ 2 δ θ i δ θ j L ( θ ′ ) H_{ij}=\frac{{\delta}^2}{\delta θ_i \delta θ_j} L(θ^{′}) Hij=δθiδθjδ2L(θ).

在临界点,梯度g为0,因此第二项为0,我们可以根据第三项判断 θ ′ θ^′ θ附近的误差表面,从而得知它是哪种类型,假设用向量v表示 ( θ − θ ′ ) , 令 (θ-θ^{′}),令 (θθ), α = v T H v \alpha=v^{T}Hv α=vTHv,有如下三种情况:

  1. 对所有v α > 0 \alpha>0 α>0 局部最小值
  2. 对所有v α < 0 \alpha<0 α<0 局部最大值
  3. 有时大于零,有时小于零,代表是鞍点

当处于临界点,我们通过海森矩阵H收集了L的二次微分,对于某点,我们可以代入具体参数值,得到海森矩阵,通过特征值判断类型,例如特征值有正有负,就是鞍点,如果特征值都是正的(正定矩阵),就是局部最小值,负定矩阵同理.实际上H不仅可以判断类型,还指出了参数的更新方向image-20250214124648781

沿着 u 的方向更新 θ,损失就会变小.因为根据式 (3.10) 和式 (3.11),只要 θ = θ′ + u,沿着特征向量 u 的方向去更新参数,损失就会变小,所以虽然临界点的梯度为零,如果我们是 在一个鞍点,只要找出负的特征值,再找出这个特征值对应的特征向量.将其与 θ′ 相加,就 可以找到一个损失更低的点.

所以,鞍点并非什么大问题,但实际上,我们几乎不会真的把海森矩阵算出来,因为海森矩阵需要算二次微分,计算这个矩阵的运算量非常大,还要把它的特征值 跟特征向量找出来,所以几乎没有人用这个方法来逃离鞍点.还有一些其他逃离鞍点的方法的运算量都比要算海森矩阵小很多.

认识到鞍点其实没那么可怕,我们再回到老问题-局部最小值,我们在训练一个网络的时候,参数数量动辄达百万千万级,所以误差 表面其实有非常高的维度—— 参数的数量代表了误差表面的维度:

image-20250214125422493

在一维中,我们认为自己遇到了局部最小值,实际上在二维中只不过是个鞍点,仍然有路可走(继续优化),那么如果维度足够高,实际上遇到局部最小值的情况很有限,因为一旦能找到临界点,如果其特征值有负,就可以继续梯度下降,只有全为正特征值,才意味着是局部最小值:
最小值比例 = 正特征值数量 总特征值数量 最小值比例=\frac{正特征值数量}{总特征值数量} 最小值比例=总特征值数量正特征值数量
实际上,我们几乎找不到所有特征值都为正的临界点,所以从经验上看起来,局部极小值并没有那么常见.多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点.

批量与动量(Batch & Momentum)

在计算梯度时,往往不会直接将所有数据集投入训练,而是将其分为多个批量,每个批量大小为B,训练时,取出B笔数据计算损失,并更新参数,当遍历完全部数据后,称为一个回合(epoch).事实上,每次进行分批量时,还会进行随机打乱(shuffle)

image-20250217165300486

批量大小对梯度下降的影响

在实际训练时,具体的批量大小也作为一个超参数,为了理解这个超参数如何更好确定,取两个极端情况

  • 不使用批量(批量大小即训练数据大小),这种使用全批量(full batch)的方法即批量梯度下降法(Batch Gradient Descent),这种方法需要把所有训练数据都查看完,才能够计算损失和梯度,进行一次参数更新
  • 批量大小为1,这种方法即随机梯度下降法(Stochastic Gradient Descent),这意味着每取出一次,进行一次更新

image-20250217165227237

理论上,BGD更新需要查看完所有数据,相比SGD可能需要更大的时间开销,每次更新相比SGD更慢,但更稳定.但实际上考虑并行计算,BGD花费的时间不一定比SGD更长(当然,GPU的并行计算能力存在极限).

image-20250217165710085

以上讨论告诉我们在每次计算和更新时,并行计算的支持让批量大小可以尽可能增大,还需要考虑更新次数对时间的开销,当批量过小,单个回合所需要的参数更新次数更多,因此,考虑并行计算时,大批量的计算和更新反而更有效率.

image-20250217170318788


大批量的更新更稳定,回合时间更短,计算时间虽然长但并行计算解决了这个问题,那么小批量的优势在哪?

由于小批量每次随机取一小部分进行计算更新,每次的更新方向是带有随机性的,即梯度方向有噪声(noisy),实际上有噪声的梯度反而可以帮助训练,这个优势体现在优化中.

image-20250217171120438

批量梯度下降在更新参数的时候,沿着一个损失函数来更新参数,走到一个局部最小值点或鞍点显然就停下来了。梯度是零,如果不看海森矩阵,梯度下降就无法再更新参数 。但小批量梯度下降每次挑 一个批量计算损失,所以每一次更新参数的时候所使用的损失函数是有差异的.选到第一个 批量的时候,用 L1计算梯度;选到第二个批量的时候,用 L2计算梯度,在优化时,在某位置对于L1的梯度为0,优化停止,但对于L2,仍能继续优化,继续降低损失.

image-20250217171844189

另外,由于对于局部最小值来说,平坦的最小值相较尖锐的最小值具有更高的稳定性,能够更好的适应损失函数的变化(损失函数变化时具体损失的变动不大),而小批量的随机性正好能让参数有机会脱离尖锐的最小值,找到更好的局部最小值,更具稳定性.

image-20250217172446985

动量法

动量法是另外一个对抗鞍点和局部最小值点的方法

image-20250217172641941

由于惯性,球会滚过鞍点,到达局部最小值,甚至翻过坡找到更好的局部最小值

一般的梯度下降(vanilla gradient descent)如图所示。初始参数为 θ0,计算完梯度后,往梯度的反方向去更新参数 θ1= θ0− ηg0。有了新的参数 θ1后,再计算与更新,直到临界点.

image-20250217173512612

而引入动量后,每次在移动参数的时,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向,每一步的移动都用 m 来表示。m 其实可以写成之前所有计算的梯度的加权和。其中 η 是学习率,λ 是前一个方向的权重参数.可以从两个角度来理解动量法。一个角度是动量是梯度的反方向加上前一次移动的方向。另外一个角度是当加上动量的时候,更新的方向不是只考虑现在的梯度,而是考虑过去所有梯度的总和.

image-20250217173609014

image-20250217173851774

自适应学习率

综上,临界点其实不一定是训练网路时的最大困难,例如由于学习率设置较大,在优化的最后阶段,损失不再下降,但梯度仍不为0,无法到达局部最小值,像在山谷间不断震荡.

image-20250218104726235

那么直接尽可能降低学习率是否可以解决问题?

image-20250218105547076

事实上,学习率过大会出现震荡的情况,学习率过小会在梯度较平缓的非临界点的路上近乎停滞.所以,我们希望学习率在梯度大的地方小一些,在梯度小的地方大步前进,于是产生多种自适应学习率方法.

AdaGrad

AdaGrad(Adaptive Gradient)是典型的自适应学习率方法,其能够根据梯度大小自动调整学习率。AdaGrad可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就放大.

image-20250218105941699

梯度下降更新某个参数 θ t i θ_t^i θti 的过程为
θ t + 1 i ← θ t i − η g t i θ_{t+1}^i \leftarrow θ_t^i-η g_t^i θt+1iθtiηgti
现在要有一个随着参数定制化的学习率,即把原来学习率 η 变成 η σ t i \frac {η}{σ_t^i} σtiη
θ t + 1 i ← θ t i − η σ t i g t i θ_{t+1}^i \leftarrow θ_t^i-\frac {η}{σ_t^i} g_t^i θt+1iθtiσtiηgti
σ t i σ_t^i σti的上标i代表参数,下标t代表迭代次数,其定义为:
σ t i = 1 t + 1 ∑ j = 0 t ( g j i ) 2 {σ_t^i}=\sqrt{\frac{1}{t+1}\sum_{j=0}^t{(g_j^i)^2}} σti=t+11j=0t(gji)2
η σ t i \frac{η}{σ_t^i} σtiη作为新的学习率,当过去的梯度变大,σ变大,学习率就会变小,反之增大,自适应调整更新的步伐

image-20250218111441009

RMSProp

AdaGrap仅考虑了某参数方向上梯度变化不大的情况,根据此调整步伐,实际上,同一个参数需要的学习率,也会随着时间而改变,同一个参数的同个方向,学习率也要动态调整,于是就有了新方法Root Mean Squared propagation.

image-20250218112044994

σ的定义变为:
σ t i = α ( σ t − 1 i ) 2 + ( 1 − α ) ( g t i ) 2 {σ_t^i}=\sqrt{\alpha(σ_t-1^i)^2+(1-\alpha)(g_t^i)^2} σti=α(σt1i)2+(1α)(gti)2
通过 α \alpha α可以决定当前梯度的权重大还是过去梯度的影响大,动态决定是否"踩刹车"

image-20250218112345074

Adam

最常用的优化的策略或者优化器(optimizer)是Adam(Adaptive moment estimation).Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自 适应调整学习率.

学习率调度

应用了自适应学习率,我们解决了更新步伐的问题,但是观察优化过程,又会发现新的问题

image-20250218112805100

在梯度小的地方优化时,学习率( η σ t i \frac{η}{σ_t^i} σtiη)会不断增大,步伐的增大让虽然很小的梯度也产生极大的影响发生"爆炸",之后梯度增大,学习率减小,慢慢修正回来,如此往复.

通过学习率调度(learning rate scheduling)可以解决这个问题.之前的学习率调整方法中 η 是一个固定的值,而在学习率调度中 η 跟时间有关 η → η t η\rightarrowη_t ηηt。学习率调度中最常见的策略是学习率衰减(learning rate decay),也称为学习率退火(learning rate annealing).随着参数的不断更新,让 η 越来越小

image-20250218113236784

除了学习率下降以外,还有另外一个经典的学习率调度的方式———预热。预热的方法是让学习率先变大后变小,至于变到多大、变大的速度、变小的速度是超参数.在预热阶段,一开始学习率比较小是用来探索收集一些有关误差表面的情 报,先收集有关 σ 的统计数据,等 σ 统计得比较精准以后,再让学习率慢慢爬升,而预热完成后开始有效的优化,随着时间进行,逐渐到临界点,步伐也就放慢

优化总结

我们的更新公式进化到了当前版本
θ t + 1 i ← θ t i − η t σ t i m t i θ_{t+1}^i \leftarrow θ_t^i-\frac {η^t}{σ_t^i} m_t^i θt+1iθtiσtiηtmti
这个版本里面有动量,其不是顺着某个时刻算出的梯度方向来更新参数,而是把过去所有算出梯度的方向做一个加权总和当作更新的方向。接下来的步伐大小为 $\frac {mi_t}{σi_t} $ 。最后通过 ηt来实现学习率调度。这个是目前优化的完整的版本,这种优化器除了 Adam 以外,还有各种变形,但其实各种变形是使用不同的方式来计算m或σ,或者是使用不同的学习率调度的方式

相关文章:

Machine Learning:Optimization

文章目录 局部最小值与鞍点 (Local Minimum & Saddle Point)临界点及其种类判断临界值种类 批量与动量(Batch & Momentum)批量大小对梯度下降的影响动量法 自适应学习率AdaGradRMSPropAdam 学习率调度优化总结 局部最小值与鞍点 (Local Minimum & Saddle Point) 我…...

wordpress get_footer();与wp_footer();的区别的关系

在WordPress中&#xff0c;get_footer() 和 wp_footer() 是两个不同的函数&#xff0c;它们在主题开发中扮演着不同的角色&#xff0c;但都与页面的“页脚”部分有关。以下是它们的区别和关系&#xff1a; 1. get_footer() get_footer() 是一个用于加载页脚模板的函数。它的主…...

Windows Docker运行Implicit-SVSDF-Planner

Windows Docker运行GitHub - ZJU-FAST-Lab/Implicit-SVSDF-Planner: [SIGGRAPH 2024 & TOG] 1. 设置环境 我将项目git clone在D:/Github目录中。 下载ubuntu20.04 noetic镜像 docker pull osrf/ros:noetic-desktop-full-focal 启动容器&#xff0c;挂载主机的D:/Github文…...

设计模式14:职责链模式

系列总链接&#xff1a;《大话设计模式》学习记录_net 大话设计-CSDN博客 1.概述 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;它允许将请求沿着处理者链传递&#xff0c;直到有一个处理者能够处理该请求。这种模式通过…...

Golang GORM系列:GORM并发与连接池

GORM 是一个流行的 Go 语言 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;用于简化数据库操作。它支持连接池和并发访问功能&#xff0c;这些功能对于高性能、高并发的应用场景非常重要。本文结合示例详细介绍gorm的并发处理能力&#xff0c;以及如何是哟个连接池提升…...

linux笔记:shell中的while、if、for语句

在Udig软件的启动脚本中使用了while循环、if语句、for循环&#xff0c;其他内容基本都是变量的定义&#xff0c;所以尝试弄懂脚本中这三部分内容&#xff0c;了解脚本执行过程。 &#xff08;1&#xff09;while循环 while do循环内容如下所示&#xff0c;在循环中还用了expr…...

【Java】逻辑运算符详解:、|| 与、 | 的区别及应用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Java 文章目录 &#x1f4af;前言&#x1f4af;一、基本概念与运算符介绍&#x1f4af;二、短路与与非短路与&#xff1a;&& 与 & 的区别1. &&&#xff1a;短路与&#xff08;AND&#xff09;2. …...

Java 设计模式之解释器模式

文章目录 Java 设计模式之解释器模式概述UML代码实现 Java 设计模式之解释器模式 概述 解释器模式(interpreter)&#xff1a;给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。如果一种特定…...

关于前后端分离跨域问题——使用DeepSeek分析查错

我前端使用ant design vue pro框架&#xff0c;后端使用kratos框架开发。因为之前也解决过跨域问题&#xff0c;正常是在后端的http请求中加入中间件&#xff0c;设置跨域需要通过的字段即可&#xff0c;代码如下所示&#xff1a; func NewHTTPServer(c *conf.Server, s *conf…...

Linux下ioctl的应用

文章目录 1、ioctl简介2、示例程序编写2.1、应用程序编写2.2、驱动程序编写 3、ioctl命令的构成4、测试 1、ioctl简介 ioctl&#xff08;input/output control&#xff09;是Linux中的一个系统调用&#xff0c;主要用于设备驱动程序与用户空间应用程序之间进行设备特定的输入/…...

Windows 环境下 Grafana 安装指南

目录 下载 Grafana 安装 Grafana 方法 1&#xff1a;使用 .msi 安装程序&#xff08;推荐&#xff09; 方法 2&#xff1a;使用 .zip 压缩包 启动 Grafana 访问 Grafana 配置 Grafana&#xff08;可选&#xff09; 卸载 Grafana&#xff08;如果需要&#xff09; 下载 G…...

【操作系统】操作系统概述

操作系统概述 1.1 操作系统的概念1.1.1 操作系统定义——什么是OS&#xff1f;1.1.2 操作系统作用——OS有什么用&#xff1f;1.1.3 操作系统地位——计算机系统中&#xff0c;OS处于什么地位&#xff1f;1.1.4 为什么学操作系统&#xff1f; 1.2 操作系统的历史1.2.1 操作系统…...

基于SSM+uniapp的鲜花销售小程序+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、商户功能模块&#xff1a;用户管理、商户管理、鲜花分类管理、鲜花管理、订单管理、收藏管理、购物车、充值、下单等技术选型&#xff1a;SSM&#xff0c;Vue&#xff08;后端管理web&#xff09;&#xff0c;uniapp等测试环境&#x…...

第3章 .NETCore核心基础组件:3.1 .NET Core依赖注入

3.1.1 什么是控制反转、依赖注入 杨老师在书中进行了一系列的文字阐述&#xff0c;总结一下就是&#xff1a;软件设计模式中有一种叫做【控制反转】的设计模式&#xff0c;而依赖注入是实现这种设计模式的一个很重要的方式。也就是说学习依赖注入&#xff0c;是学习怎样实现控…...

排序与算法:插入排序

执行效果 插入排序的执行效果是这样的&#xff1a; 呃……看不懂吗&#xff1f;没关系&#xff0c;接着往下看介绍 算法介绍 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c…...

uniapp 打包安卓 集成高德地图

接入高德地图 let vm this;uni.chooseLocation({success: function (res) {// console.log(位置名称&#xff1a; res.name);// console.log(详细地址&#xff1a; res.address);// console.log(纬度&#xff1a; res.latitude);// console.log(经度&#xff1a; res.long…...

python爬虫系列课程2:如何下载Xpath Helper

python爬虫系列课程2:如何下载Xpath Helper 一、访问极简插件官网二、点击搜索按钮三、输入xpath并点击搜索四、点击推荐下载五、将下载下来的文件解压缩六、打开扩展程序界面七、将xpath.crx文件拖入扩展程序界面一、访问极简插件官网 极简插件官网地址:https://chrome.zzz…...

win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统&#xff0c;报错&#xff1a;Operating System not found 二、原因分析 国产系统&#xff0c;需要注意的点&#xff1a; 需要看你的系统类…...

基于微信小程序的宿舍报修管理系统设计与实现,SpringBoot(15500字)+Vue+毕业论文+指导搭建视频

运行环境 jdkmysqlIntelliJ IDEAmaven3微信开发者工具 项目技术SpringBoothtmlcssjsjqueryvue2uni-app 宿舍报修小程序是一个集中管理宿舍维修请求的在线平台&#xff0c;为学生、维修人员和管理员提供了一个便捷、高效的交互界面。以下是关于这些功能的简单介绍&#xff1a; …...

分布式同步锁:原理、实现与应用

分布式同步锁&#xff1a;原理、实现与应用 引言1. 分布式同步锁的基本概念1.1 什么是分布式同步锁&#xff1f;1.2 分布式锁的特性 2. 分布式锁的实现方式2.1 基于数据库的分布式锁实现原理优缺点示例 2.2 基于 Redis 的分布式锁实现原理优缺点示例Redlock 算法 2.3 基于 ZooK…...

Chrome多开终极形态解锁!「窗口管理工具+IP隔离插件

Web3项目多开&#xff0c;继ads指纹浏览器钱包被盗后&#xff0c;更多人采用原生chrome浏览器&#xff0c;当然对于新手&#xff0c;指纹浏览器每月成本也是一笔不小开支&#xff0c;今天逛Github发现了这样一个解决方案&#xff0c;作者开发了窗口管理工具IP隔离插件&#xff…...

FreeSwitch的应用类模块

FreeSWITCH 应用类模块&#xff08;Applications&#xff09;完整表格 模块名称功能描述mod_callcenter提供呼叫中心功能&#xff0c;支持队列、座席管理、监控等。mod_conference提供多方会议功能&#xff0c;支持音频、视频会议。mod_blacklist提供黑名单功能&#xff0c;阻…...

【蓝桥杯集训·每日一题2025】 AcWing 6123. 哞叫时间 python

6123. 哞叫时间 Week 1 2月18日 农夫约翰正在试图向埃尔茜描述他最喜欢的 USACO 竞赛&#xff0c;但她很难理解为什么他这么喜欢它。 他说「竞赛中我最喜欢的部分是贝茜说 『现在是哞哞时间』并在整个竞赛中一直哞哞叫」。 埃尔茜仍然不理解&#xff0c;所以农夫约翰将竞赛以…...

Unity 淡入淡出

淡入&#xff08;Fade in&#xff09;&#xff1a;类似打开幕布 淡出&#xff08;Fade out&#xff09;&#xff1a;类似关上幕布 方案一 使用Dotween&#xff08;推荐&#xff09; using DG.Tweening; using UnityEngine; using UnityEngine.UI;public class Test : MonoB…...

PBR光照模型相关知识

PBR是基于物理的光照模型&#xff0c;与lambert光照模型以及Blinn-Phong光照模型有所不同 一、三种光照模型的区别 原理基础 Lambert 光照模型&#xff1a;基于朗伯余弦定律&#xff0c;该定律表明&#xff0c;漫反射光的强度与入射光的方向和物体表面法线的夹角的余弦值成正比…...

【Go | 从0实现简单分布式缓存】-2:HTTP服务端与一致性哈希

本文目录 一、回顾1.1 复习接口 二、http标准库三、实现HTTP服务端四、一致性哈希 本文为极客兔兔“动手写分布式缓存GeeCache”学习笔记。 一、回顾 昨天已经开发了一部分项目&#xff0c;我们先来看看项目结构。 分布式缓存需要实现节点间通信&#xff0c;建立基于 HTTP 的…...

STM32 低功耗模式

目录 背景 低功耗模式 睡眠模式 进入睡眠模式 退出睡眠模式 停止模式 进入停止模式 退出停止模式 待机模式 进入待机模式 退出待机模式 程序 睡眠模式 休眠模式配置 进入休眠模式 退出睡眠模式 停止模式 停止模式配置 进入停止模式 退出停止模式 待机模式…...

AI 百炼成神:逻辑回归, 垃圾邮件分类

第二个项目:逻辑回归垃圾邮件分类 项目代码下载地址:https://download.csdn.net/download/m0_56366541/90398247 项目目标 学习逻辑回归的基本概念。使用逻辑回归算法来实现垃圾邮件的分类。理解如何处理文本数据以及如何评估分类模型的性能。项目步骤 准备数据集 我们将使…...

#渗透测试#批量漏洞挖掘#Apache Log4j反序列化命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 Apache Log4j反序列化命令执行漏洞 一、…...

Docker__持续更新......

Docker 1. 基本知识1.1 为什么有Docker?1.2 Docker架构与容器化 画图解释 画图解释2. 项目实战 1. 基本知识 1.1 为什么有Docker? 用一行命令跨平台安装项目&#xff0c;在不同平台上运行项目。把项目打包分享运行应用。 1.2 Docker架构与容器化 准备机器&#xff0c;在机…...

什么是语料清洗、预训练、指令微调、强化学习、内容安全; 什么是megatron,deepspeed,vllm推理加速框架

什么是语料清洗、预训练、指令微调、强化学习、内容安全 目录 什么是语料清洗、预训练、指令微调、强化学习、内容安全语料清洗预训练指令微调强化学习内容安全什么是megatron,deepspeed,vllm推理加速框架语料清洗 语料清洗是对原始文本数据进行处理的过程,旨在去除数据中的…...

Ubuntu虚拟机NDK编译ffmpeg

目录 一、ffmpeg源码下载1、安装git(用于下载ffmpeg源码)2、创建源码目录&#xff0c;下载ffmpeg源码 二、下载ubuntu对应的NDK&#xff0c;并解压到opt下1、下载并解压2、配置 ~/.bashrc 三、源码编译、1、创建编译脚本2、脚本文件内容3、设置可执行权限并运行4、编译的结果在…...

SQLAlchemyError: A transaction is already begun on this Session.

资料 sqlalchemy 事务 - 简书 在 SQLAlchemy 中&#xff0c;事务是通过会话来管理的。当你开始一个事务&#xff08;例如使用 async with db.begin()&#xff09;&#xff0c;它会开启一个新的事务&#xff0c;并在事务块结束时自动提交或回滚。如果在同一个会话中&#xff0c…...

STM32 HAL库USART串口DMA IDLE中断编程:避坑指南

HAL_UART_Receive接收最容易丢数据了,STM32 HAL库UART查询方式实例 可以考虑用中断来实现,但是HAL_UART_Receive_IT还不能直接用,容易数据丢失,实际工作中不会这样用,STM32 HAL库USART串口中断编程&#xff1a;演示数据丢失, 需要在此基础优化一下. STM32F103 HAL库USART串口…...

打造一个有点好看的 uniapp 网络测速软件

大家好&#xff0c;我是一名前端小白。今天想和分享一个有点好看的网络测速 uniapp 组件的实现过程。这个组件不仅外观精美&#xff0c;而且具有完整的功能性&#xff0c;是一个非常适合学习和实践的案例。 设计理念 在开始coding之前&#xff0c;先聊聊设计理念。一个好的测…...

DeepSeek AI 视频创作完整指南:从注册到制作

DeepSeek AI 视频创作完整指南&#xff1a;从注册到制作 前言 DeepSeek作为国产AI的新星&#xff0c;不仅在代码能力上表现出色&#xff0c;在创意内容生成方面同样令人惊艳。本教程将带您从注册到实操&#xff0c;完整体验DeepSeek的强大功能。 第一步&#xff1a;获取Deep…...

DeepSeek学术指南:DeepSeek在学术翻译改写能力应用操作案例!

DeepSeek&#xff1a;助力学术研究的智能工具 DeepSeek作为一种先进的智能工具&#xff0c;为学术研究提供了强大的支持。它不仅能够处理复杂的学术文本&#xff0c;还能在翻译和润色方面表现出色&#xff0c;极大地提高了学术写作的效率和质量。通过其强大的语言处理能力&…...

栈回溯基础

指令集区分 thumb指令集 长度&#xff1a;thumb指令通常是 16 位。特点&#xff1a;thumb 指令集是为了压缩指令集长度减少程序占用空间。对齐方式&#xff1a;2字节对齐&#xff0c;存放 thumb 指令的地址一般会被1&#xff0c;设置为奇数&#xff0c;用于表示地址上存放的是…...

JavaScript系列(76)--浏览器API深入

JavaScript浏览器API深入 &#x1f310; 浏览器提供了丰富的API&#xff0c;使JavaScript能够与浏览器环境进行交互。本文将深入探讨常用的浏览器API、最佳实践和性能优化技巧。 核心浏览器API &#x1f31f; &#x1f4a1; 小知识&#xff1a;浏览器API是连接JavaScript与浏…...

计算机网络(3)TCP格式/连接

1、TCP三大特点&#xff1a;面向连接、可靠、基于字节流 2、如何唯一确定一个TCP连接&#xff1f;TCP四元组&#xff1a;源地址、源端口、目的地址、目的端口 源地址和目标地址的字段(32 位)是在 IP 头部中&#xff0c;作用是通过 IP 协议发送报文给对方主机源端口和目标端口…...

下载安装运行测试开源vision-language-action(VLA)模型OpenVLA

1. 安装 项目官网OpenVLA 首先按照官网提示的以下代码&#xff0c;执行创建环境->安装最小依赖->git克隆项目等 # Create and activate conda environment conda create -n openvla python3.10 -y conda activate openvla# Install PyTorch. Below is a sample comma…...

3D与2D机器视觉机械臂引导的区别

3D与2D机器视觉在机械臂引导中的主要区别如下&#xff1a; 数据维度 2D视觉&#xff1a;仅处理平面图像&#xff0c;提供X、Y坐标信息&#xff0c;无法获取深度&#xff08;Z轴&#xff09;数据。 3D视觉&#xff1a;处理三维空间数据&#xff0c;提供X、Y、Z坐标及物体的姿态…...

网站搭建基本流程

需求分析&#xff1a; 实现网站搭建的过程&#xff1a;首先进行网站的需求性分析 网站可分为前台系统和后台系统&#xff0c;由不同的功能拆分为不同的模块 如下是一个电商网站可以拆分出的模块&#xff1a; 在编写代码前&#xff0c;我们要先对网站进行架构&#xff0c;通过…...

SpringBoot启动时报错:cannot use an unresolved DNS server address: I:53

报错如下&#xff1a; 2025-02-17 13:59:41.374 [main] ERROR org.springframework.boot.SpringApplication:835 - Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name mySwaggerResourceProvider def…...

Ollama命令使用指南

Ollama 命令使用指南 Ollama 命令使用指南1. Ollama 命令概览2. Ollama 命令详解2.1 启动 Ollama2.2 创建模型2.3 查看模型信息2.4 运行模型2.5 停止运行的模型2.6 从注册表拉取模型2.7 推送模型到注册表2.8 列出本地模型2.9 查看正在运行的模型2.10 复制模型2.11 删除模型 3. …...

每日一题——将数字字符串转化为IP地址

将数字字符串转化为IP地址 题目描述解题思路回溯法步骤分解 代码实现全局变量有效性验证函数回溯函数主函数完整代码 复杂度分析关键点说明总结 这题难度还挺大的&#xff0c;整体上实现并不容易。建议参考视频 和https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%…...

2013年下半年软件设计师上午题考察知识点及其详细解释(附真题及答案解析)

以下是2013年下半年软件设计师上午题的所有题目&#xff08;从第1题到第75题&#xff09;的总结&#xff0c;按顺序列出每道题目的考察知识点及其详细解释&#xff0c;供考生背诵记忆&#xff1a; 1. Cache与主存的地址映像 知识点&#xff1a;存储管理解释&#xff1a;Cache与…...

实现可拖拽的 Ant Design Modal 并保持下层 HTML 可操作性

前言 在开发复杂的前端界面时&#xff0c;我们常常需要一个可拖拽的弹窗&#xff08;Modal&#xff09;&#xff0c;同时又希望用户能够在弹窗打开的情况下操作下层的内容。Ant Design 的 Modal 组件提供了强大的功能&#xff0c;但默认情况下&#xff0c;弹窗会覆盖整个页面&…...

unity学习43:子状态机 sub-state machine

目录 1sub-state machine子状态机 1.1 创建 sub-state machine 1.2 sub-state machine 内容 1.3 子状态机的应用 2 子状态机不同于blend tree的嵌套 3 应用例子&#xff1a;若角色拿不同武器的动画设计&#xff0c;可以使用2种方法 3.1 在1个图层layer里&#xff0c;使用…...

HTML之JavaScript DOM(document)编程处理事件

HTML之JavaScript DOM&#xff08;document&#xff09;编程处理事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...