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

神经网络中的优化方法(一)

目录

  • 摘要
  • Abstract
  • 1. 与纯优化的区别
    • 1.1 经验风险最小化
    • 1.2 代理损失函数
    • 1.3 批量算法和小批量算法
  • 2. 神经网络中优化的挑战
    • 2.1 病态
    • 2.2 局部极小值
    • 2.3 高原、鞍点和其他平坦区域
    • 2.4 悬崖和梯度爆炸
    • 2.5 长期依赖
    • 2.6 非精确梯度
    • 2.7 局部和全局结构间的弱对应
  • 3. 基本算法
    • 3.1 随机梯度下降(小批量算法)
    • 3.2 动量
    • 3.3 Nesterov动量
  • 4. 参数初始化
  • 参考
  • 总结

摘要

  本周,我了解了神经网络中优化的挑战,基本优化算法和参数初始化策略。

Abstract

  This week, I learned about the challenges of optimization in neural networks, basic optimization algorithms, and parameter initialization strategies.

1. 与纯优化的区别

  在大多数机器学习问题中,我们关注的某些性能度量 P P P,其定义在测试集上可能是不可解的,因此我们只能间接优化 P P P,希望通过降低代价函数 J ( θ ) J(\theta) J(θ)来提高 P P P。这一点与纯优化不同,纯优化直接最小化目标 J J J本身。训练深度模型的优化算法通常也会包括一些针对机器学习目标函数的特定结构进行的特化。

1.1 经验风险最小化

  机器学习算法的目标是降低 J ( θ ) = E ( x , y ) ∼ p d a t a L ( f ( x ; θ ) , y ) \displaystyle \Large J(\theta)=E_{(x,y)\sim p_{data}}L(f(x;\theta),y) J(θ)=E(x,y)pdataL(f(x;θ),y)( p d a t a p_{data} pdata是真实分布)这个式子表示的期望泛化误差。但是由于不知道数据的真实分布,只知道训练集中的样本,因此将机器学习问题转化为一个优化问题的最简单方法是最小化训练集上的期望损失,即把上面式子中的真实分布 p d a t a p_{data} pdata替换为训练集上的经验分布 p ^ d a t a \hat{p}_{data} p^data
  经验风险最小化的公式为
E ( x , y ) ∼ p ^ d a t a [ L ( f ( x ; θ ) , y ) ] = 1 m ∑ i = 1 m L ( f ( x ( i ) ; θ ) , y ( i ) ) . \displaystyle \Large E_{(x,y)\sim\hat{p}_{data}}[L(f(x;\theta),y)]=\frac{1}{m}\sum_{i=1}^mL(f(x^{(i)};\theta),y^{(i)}). E(x,y)p^data[L(f(x;θ),y)]=m1i=1mL(f(x(i);θ),y(i)).
  在一系列不同理论构造的条件下,最优化经验风险也能使真实风险的期望下降。然而经验风险最小化很容易导致过拟合,并且在很多情况下经验风险最小化并非真的可行。最有效的现代优化算法是基于梯度下降的,但是很多有用的损失函数如0-1损失没有有效的导数,因此在深度学习上很少使用经验风险最小化。

1.2 代理损失函数

  有时,损失函数并不能被高效地优化,比如对于线性分类器来说,精确地最小化0-1损失通常是不可解的。在这种情况下,通常会优化代理损失函数,代理损失函数作为原目标的代理,还具备一些优点。比如正确类别的负对数似然通常替代0-1损失函数,负对数似然允许模型估计给定样本类别的条件概率,如果该模型效果好,那么它能够输出期望最小分类误差所对应的类别。
  在某些情况下,代理损失函数比原函数学到的更多。比如,使用对数似然替代函数时,在训练集上的0-1损失达到0之后,测试集上的0-1损失还能持续下降很长一段时间。这是因为即使0-1损失期望为0时,还能拉开不同类别的距离以改进分类器的泛化能力,获得一个更强壮的,更值得信赖的分类器。相较于简单地最小化训练集上的平均0-1损失,它能够从训练数据中抽取更多的信息。

1.3 批量算法和小批量算法

  机器学习算法的目标函数通常可以分解为训练样本上的求和。机器学习中的优化算法在计算参数的每一次更新时通常仅使用整个代价函数中一部分项来估计代价函数的期望值。
  比如最大似然估计问题可以在对数空间中分解成各个样本的总和:
θ M L = arg max ⁡ θ ∑ i = 1 m l o g p m o d e l ( x ( i ) , y ( i ) ; θ ) . \displaystyle\Large \theta_{ML}=\argmax_{\theta}\sum_{i=1}^mlogp_{model}(x^{(i)},y^{(i)};\theta). θML=θargmaxi=1mlogpmodel(x(i),y(i);θ).
  最大化这个总和等于最大化训练集在经验分布上的期望:
J ( θ ) = E ( x , y ) ∼ p ^ d a t a l o g p m o d e l ( x , y ; θ ) . \Large J(\theta)=E_{(x,y)\sim \hat{p}_{data}}logp_{model}(x,y;\theta). J(θ)=E(x,y)p^datalogpmodel(x,y;θ).
  优化算法用到的目标函数 J J J中的大多数属性也是训练集上的期望,比如梯度:
▽ θ J ( θ ) = E ( x , y ) ∼ p ^ d a t a ▽ θ l o g p m o d e l ( x , y ; θ ) . \Large \triangledown_{\theta}J(\theta)=E_{(x,y)\sim\hat{p}_{data}}\triangledown_{\theta}logp_{model}(x,y;\theta). θJ(θ)=E(x,y)p^dataθlogpmodel(x,y;θ).
  精确计算这个期望的代价很大,因为需要在整个数据集上的每个样本上评估模型。在实践中,可以从数据集中随机采样少量的样本,然后计算这些样本上的平均值。
   n n n个样本均值的标准差为 σ n \displaystyle\frac{\sigma}{\sqrt{n}} n σ,其中 σ \sigma σ是样本值真实的标准差。分母 n \sqrt{n} n 表明使用更多的样本来估计梯度的方法的回报是低于线性的。如果能够快速地计算出梯度的估计值,而不是缓慢地计算准确值,那么大多数优化算法会收敛地更快。
  在最坏的情况下,训练集中所有的 m m m个样本都是彼此相同的拷贝。基于采样的梯度估计可以使用单个样本计算出正确的梯度,而比原来的做法少花了 m m m倍的时间。在实践中可以发现大量样本都对梯度做出了非常相似的贡献。
  使用整个训练集的优化算法被称为批量梯度算法;每次只使用单个样本的算法称为随机算法或者在线算法;大多数用于深度学习的算法使用一个以上又不是全部的训练样本,这些算法被称为小批量算法或者小批量随机算法。
  小批量算法的典型示例是小批量随机梯度下降。只要没有重复使用样本,小批量梯度下降算法将遵循着真实泛化误差的梯度。很多小批量梯度下降方法的实现都会打乱数据顺序一次,然后多次遍历数据来更新参数。

2. 神经网络中优化的挑战

  优化通常是一个极其困难的任务。传统的机器学习会小心设计目标函数和约束,以确保优化问题是凸的,从而避免一般优化问题的复杂度。在训练神经网络时,我们肯定会遇到一般的非凸情况。即使是凸优化,也并非没有问题。

2.1 病态

  病态问题一般认为存在神经网络的训练过程中,具体体现在随机梯度下降会卡在某些情况,此时即使很小的更新步长也会增加代价函数。以代价函数的二级泰勒级数展开式来预测梯度下降中的 − ϵ g -\epsilon g ϵg对代价函数产生的变化,代价函数会增加 1 2 ϵ 2 g T H g − ϵ g T g \displaystyle\frac{1}{2}\epsilon^2g^THg-\epsilon g^Tg 21ϵ2gTHgϵgTg这么多值。当 1 2 ϵ 2 g T H g \displaystyle \frac{1}{2}\epsilon^2g^THg 21ϵ2gTHg超过 ϵ g T g \epsilon g^Tg ϵgTg时,梯度的病态会成为问题。
  在很多情况中,梯度范数 g T g g^Tg gTg g T H g g^THg gTHg不会在训练过程中显著缩小,但是 g T H g g^THg gTHg的增长会超过一个数量级,其结果就是尽管梯度很强,学习会变得非常缓慢,因为学习率必须收缩以弥补更强的曲率。

2.2 局部极小值

  潜变量是模型用来隐式表示输入数据中的某些结构或关系的抽象特征。这些潜变量通常被认为是数据的低维表示或隐藏因子,能够有效地捕捉输入数据的核心信息,而无需直接建模所有显性变量。
  如果一个足够大的训练集可以唯一确定一组模型参数,那么该模型称为可辨认的。带有潜变量的模型通常是不可辨认的,因为通过相互交互潜变量就能得到等价的模型。对于神经网络而言,交换神经网络中某一层中单元 i i i j j j的传入权重向量和传出权重向量就可以得到等价的模型,这种不可辨认性称为权重空间对称性。除了权重空间对称性,神经网络还有其他导致不可辨认的原因。
  神经网络的不可辨认性会导致神经网络的代价函数具有非常多甚至不可数无限多的局部极小值,并且这些局部极小值对应的代价函数值都相同。如果这些局部极小值相比全局最小值有很大的代价,那么这些局部极小值会使模型变得很糟糕。
  对于实际网络,是否存在大量代价很高的局部极小值,优化算法是否会碰到这些局部极小值,都是尚未解决的公开问题。对于足够大的神经网络而言,大部分局部极小值都具有很小的代价函数,只需要在参数空间中找到一个代价很小的点。

2.3 高原、鞍点和其他平坦区域

  对于高维非凸函数,局部极小值和局部极大值远少于另一类梯度为零的点——鞍点。鞍点附近的某些点可能比鞍点具有更大的代价,而其他点则具有更小的代价。尽管真实神经网络的损失函数中确实存在许多高代价的鞍点,梯度下降在许多情况下仍然能够有效地逃离这些鞍点,进而找到代价较小的区域,从而避免停留在高代价的鞍点附近。鞍点在高维非凸优化中是一个挑战。

2.4 悬崖和梯度爆炸

  多层神经网络通常存在像悬崖一样的斜率较大区域,这是由于几个较大的权重相乘导致的。从上方接近斜率较大的悬崖结构时,梯度更新通常会很大程度地改变参数值,通常会完全跳过这类悬崖结构。从下方接近悬崖区域时,梯度会变得非常大,导致梯度爆炸,使得参数更新过于剧烈,进而使优化过程不稳定。

2.5 长期依赖

  当计算图变得极深时,神经网络优化算法会面临另一个问题——长期依赖。由于变深的结构使得模型失去了学习到先前信息的能力,让优化变得困难。深层的计算图不仅存在于前馈神经网络,还存在于循环网络。因为循环网络要在很长时间序列的各个时刻重复应用相同操作来构建非常深的计算图并且模型参数共享,这使得问题更加严重。
  假设某个计算图中包含一条反复与矩阵 W W W相乘的路径,那么 t t t步后,相当于乘以 W t W^t Wt。假设 W W W有特征值分解 W = V d i a g ( λ ) V − 1 W=Vdiag(\lambda)V^{-1} W=Vdiag(λ)V1,那么 W t = V d i a g ( λ ) t V − 1 W^t=Vdiag(\lambda)^tV^{-1} Wt=Vdiag(λ)tV1。当特征值不在1附近时,若在量级上大于1则会梯度爆炸;若小于1则会梯度消失。

2.6 非精确梯度

  大多数优化算法的先决条件都是知道精确的梯度或者Hessian矩阵,在实践中,通常这些量会有噪声,甚至有偏的估计。几乎每一个深度学习算法都需要基于采样的估计,至少使用训练样本的小批量来计算梯度。当目标函数不可解的时候,通常其梯度也是难以处理的,只能对梯度进行近似。

2.7 局部和全局结构间的弱对应

  局部结构和全局结构的若对应问题在神经网络优化中影响深远,主要体现在优化路径的选择和最终解的质量上。局部结构指的是损失函数在小范围内的形态,例如局部最小值、鞍点或平坦区域,而全局结构则代表了损失函数在整个参数空间中的分布,包括全局最小值、局部极小值、鞍点和极大值。
  局部结构的性质直接影响了优化过程:
  1. 局部的梯度信息引导优化器的更新方向,若局部极小值或鞍点处的梯度信息不明显,可能导致优化器陷入这些不理想的区域,影响全局优化的搜索效率。
  2. 在局部结构中,梯度爆炸或消失可能导致优化过程变得不稳定,尤其是在接近悬崖或鞍点时,局部的不平衡梯度变化会阻碍有效的全局探索。
  3. 局部极小值可能与全局最小值相差很大,优化器如果停留在这些局部最小值,可能导致无法找到全局最优解。过参数化的神经网络通常通过局部极小值更容易接近全局极小值,但仍需通过优化算法有效避免不良局部极值。

3. 基本算法

3.1 随机梯度下降(小批量算法)

随机梯度下降在第 k 个训练迭代的更新 参数 : 学习率 ϵ , 初始参数 θ w h i l e 停止准则为满足 d o 从训练集中采集包含 m 个样本 { x ( 1 ) , ⋯ , x ( m ) } 的小批量 , 其中 x ( i ) 对应的目标为 y ( i ) 计算梯度更新 : g ^ ← 1 m ▽ θ ∑ i L ( f ( x ( i ) , θ ) , y ( i ) ) 应用更新 : θ ← θ − ϵ g ^ e n d w h i l e \begin{aligned} &随机梯度下降在第k个训练迭代的更新\\ &参数:学习率\epsilon, 初始参数\theta\\ &while \quad 停止准则为满足\quad do\\ &\quad 从训练集中采集包含m个样本\{x^{(1)},\cdots,x^{(m)}\}的小批量,其中x^{(i)}对应的目标为y^{(i)}\\ &\quad计算梯度更新:\hat{g}\leftarrow\frac{1}{m}\triangledown_{\theta}\sum_iL(f(x^{(i)},\theta),y^{(i)})\\ &\quad应用更新:\theta\leftarrow\theta-\epsilon\hat{g}\\ &end \quad while \end{aligned} 随机梯度下降在第k个训练迭代的更新参数:学习率ϵ,初始参数θwhile停止准则为满足do从训练集中采集包含m个样本{x(1),,x(m)}的小批量,其中x(i)对应的目标为y(i)计算梯度更新:g^m1θiL(f(x(i),θ),y(i))应用更新:θθϵg^endwhile
  SGD算法中一个关键参数是学习率。尽管SGD梯度估计中会引入噪声,多个小批量的平均效果会逐渐减少噪声,使得固定学习率仍能有效收敛。在实践中有必要随着时间的推移逐渐降低学习率,一般会线性衰减学习率直到第 τ \tau τ次,在 τ \tau τ步迭代之后,学习率会保持常数:
ϵ k = ( 1 − k τ ) ϵ 0 + k τ ϵ τ . \displaystyle\Large \epsilon_k=(1-\frac{k}{\tau})\epsilon_0+\frac{k}{\tau}\epsilon_{\tau}. ϵk=(1τk)ϵ0+τkϵτ.
  上面是一种学习率衰减的方法,PyTorch中也实现了很多学习率衰减的方法,可以在How to adjust learning rate找到具体使用方法。

3.2 动量

  随机梯度下降的学习过程有时候会很慢,而动量方法旨在加速学习,特别是处理高曲率,小但一致的梯度,或者是带噪声的梯度。动量算法累积了之前梯度指数级衰减的移动平均,并且继续沿该方向移动。在梯度较小的区域,动量能帮助优化器更快地前进;动量平滑梯度,减少在陡峭区域或鞍点附近的震荡;动量有助于跳过鞍点,避免优化停滞;通过累积历史梯度,动量帮助优化器选择更合适的更新方向。
使用动量的随机梯度下降 参数 : 学习率 ϵ , 动量参数 α , 初始参数 θ , 初始速度 v w h i l e 没有达到停止准则 d o 从训练集中采集包含 m 个样本 { x ( 1 ) , ⋯ , x ( m ) } 的小批量 , 其中 x ( i ) 对应的目标为 y ( i ) 计算梯度估计 : g ← 1 m ▽ θ ∑ i L ( f ( x ( i ) , θ ) , y ( i ) ) 计算速度更新 : v ← α v − ϵ g 应用更新 : θ ← θ + v e n d w h i l e \begin{aligned} &使用动量的随机梯度下降\\ &参数:学习率\epsilon,动量参数\alpha,初始参数\theta,初始速度v\\ &while \quad 没有达到停止准则\quad do\\ &\quad 从训练集中采集包含m个样本\{x^{(1)},\cdots,x^{(m)}\}的小批量,其中x^{(i)}对应的目标为y^{(i)}\\ &\quad计算梯度估计:g\leftarrow\frac{1}{m}\triangledown_{\theta}\sum_iL(f(x^{(i)},\theta),y^{(i)})\\ &\quad计算速度更新:v\leftarrow\alpha v-\epsilon g\\ &\quad应用更新:\theta\leftarrow\theta+v\\ &end\quad while \end{aligned} 使用动量的随机梯度下降参数:学习率ϵ,动量参数α,初始参数θ,初始速度vwhile没有达到停止准则do从训练集中采集包含m个样本{x(1),,x(m)}的小批量,其中x(i)对应的目标为y(i)计算梯度估计:gm1θiL(f(x(i),θ),y(i))计算速度更新:vαvϵg应用更新:θθ+vendwhile

3.3 Nesterov动量

  Nesterov动量中,梯度计算在施加当前速度之后,因此Nesterov动量可解释为往标准动量方法中添加了一个校正因子。
使用 N e s t e r o v 动量的随机梯度下降 参数 : 学习率 ϵ , 动量参数 α , 初始参数 θ , 初始速度 v w h i l e 没有达到停止准则 d o 从训练集中采集包含 m 个样本 { x ( 1 ) , ⋯ , x ( m ) } 的小批量 , 其中 x ( i ) 对应的目标为 y ( i ) 应用临时更新 : θ ˜ ← θ + α v 计算临时点的梯度 : g ← 1 m ▽ θ ˜ ∑ i L ( f ( x ( i ) , θ ˜ ) , y ( i ) ) 计算速度更新 : v ← α v − ϵ g 应用更新 : θ ← θ + v e n d w h i l e \begin{aligned} &使用Nesterov动量的随机梯度下降\\ &参数:学习率\epsilon,动量参数\alpha,初始参数\theta,初始速度v\\ &while \quad 没有达到停止准则 \quad do\\ &\quad从训练集中采集包含m个样本\{x^{(1)},\cdots,x^{(m)}\}的小批量,其中x^{(i)}对应的目标为y^{(i)}\\ &\quad应用临时更新:\~\theta\leftarrow\theta+\alpha v\\ &\quad计算临时点的梯度:g\leftarrow\frac{1}{m}\triangledown_{\~\theta}\sum_iL(f(x^{(i)},\~\theta),y^{(i)})\\ &\quad计算速度更新:v\leftarrow\alpha v-\epsilon g\\ &\quad应用更新:\theta\leftarrow\theta+v\\ &end\quad while \end{aligned} 使用Nesterov动量的随机梯度下降参数:学习率ϵ,动量参数α,初始参数θ,初始速度vwhile没有达到停止准则do从训练集中采集包含m个样本{x(1),,x(m)}的小批量,其中x(i)对应的目标为y(i)应用临时更新:θ˜θ+αv计算临时点的梯度:gm1θ˜iL(f(x(i),θ˜),y(i))计算速度更新:vαvϵg应用更新:θθ+vendwhile

4. 参数初始化

  深度学习模型的训练算法通常是迭代的,因此要求使用者指定一些开始迭代的初始点。大多数算法都很大程度地受到初始化选择的影响,初始点能决定算法是否收敛,当学习收敛时,初始点能决定学习收敛得多快,以及是否收敛到一个代价高或低的点。此外,差不多代价的点可以具有区别极大的泛化误差,初始点也影响泛化。
  现代的初始化策略是简单的,启发式的,因为初始化策略中哪些好的性质会在哪些情况下保持是未知的,以及无法判断初始化点是否对泛化有利。初始化策略唯一要做到的是初始参数需要在不同单元间破坏对称性,初始化每个单元使其和其他单元计算不同的函数值。这有助于确保输入模式没有丢失在前向传播空间中,没有梯度模式丢失在反向传播的零空间中。在高维空间上使用高熵分布来初始化,计算代价小并且保证不会分配单元计算彼此相同的函数。
  通常情况下,可以为每个单元的偏置和额外的参数设置启发式挑选的常数,仅随机初始化权重。初始化模型的权重为高斯或者均匀分布中随机抽取的值。
  更大的初始化权重具有更强的破坏对称性的作用,有助于避免冗余单元,也有助于避免在每层线性成分的前向或反向传播中丢失信号。如果初始权重太大,那么会在前向传播和反向传播中产生爆炸的值。较大的权重使得产生使激活函数饱和的值,导致饱和单元的梯度完全丢失。这些因素决定了权重的理想初始大小。此外,优化观点认为权重应该足够大以成功传播信息,但正则化希望小一点。
  设置偏置的方法必须和设置权重的方法相协调,在大多数情况下偏置设置为0是可行的。但也存在可能需要设置偏置为非零值的情况:
  1.如果是输出单元的偏置,初始化偏置以获得正确的输出边缘统计是有利的,将偏置设置为应用于训练集上输出边缘统计的激活函数的逆。
  2.选择偏置以避免初始化引起太大饱和,比如ReLU的隐藏单元偏置设为0.1。
  3.一个单元会控制其他单元是否参与到计算中,比如有一个单元输出 u u u,另一个单元 h ∈ [ 0 , 1 ] h\in[0,1] h[0,1],将h视作门控制u是否参与学习,在这种情况h应初始化为1,否则u没有机会学习。

参考

[美]伊恩·古德费洛(lan Goodfellow)[加]约书亚·本吉奥(Yoshua Bengio)[加]亚伦·库维尔(Aaron Courville) 深度学习(中文翻译版)

总结

  本周,我了解了神经网络中优化的挑战,基本优化算法和参数初始化策略。
  下周,我将学习自适应学习率算法、二阶近似方法和优化策略。

相关文章:

神经网络中的优化方法(一)

目录 摘要Abstract1. 与纯优化的区别1.1 经验风险最小化1.2 代理损失函数1.3 批量算法和小批量算法 2. 神经网络中优化的挑战2.1 病态2.2 局部极小值2.3 高原、鞍点和其他平坦区域2.4 悬崖和梯度爆炸2.5 长期依赖2.6 非精确梯度2.7 局部和全局结构间的弱对应 3. 基本算法3.1 随…...

Linux 计算机网络基础概念

目录 0.前言 1.计算机网络背景 1.1 独立模式 1.2 网络互联 1.3 局域网(Local Area Network,LAN) 1.4 广域网(Wide Area Network,WAN) 2.协议 2.1什么是协议 2.2协议分层和软件分层 2.3 OSI七层网络模型 2.3…...

qt QGraphicsEllipseItem详解

1、概述 QGraphicsEllipseItem是Qt框架中QGraphicsItem的一个子类,它提供了一个可以添加到QGraphicsScene中的椭圆项。QGraphicsEllipseItem表示一个带有填充和轮廓的椭圆,也可以用于表示椭圆段(通过startAngle()和spanAngle()方法&#xff…...

Python websocket

router.websocket(/chat/{flow_id}) 接口代码,并了解其工作流程、涉及的组件以及如何基于此实现你的新 WebSocket 接口。以下内容将分为几个部分进行讲解: 接口整体概述代码逐行解析关键组件和依赖关系如何基于此实现新功能示例:创建一个新的…...

【MySQL-5】MySQL的内置函数

目录 1. 整体学习的思维导图 2. 日期函数 ​编辑 2.1 current_date() 2.2 current_time() 2.3 current_timestamp() 2.4 date(datetime) 2.5 now() 2.6 date_add() 2.7 date_sub() 2.8 datediff() 2.9 案例 2.9.1 创建一个出生日期登记簿 2.9.2 创建一个留言版 3…...

深度学习笔记之BERT(三)RoBERTa

深度学习笔记之RoBERTa 引言回顾:BERT的预训练策略RoBERTa训练过程分析静态掩码与动态掩码的比较模型输入模式与下一句预测使用大批量进行训练使用Byte-pair Encoding作为子词词元化算法更大的数据集和更多的训练步骤 RoBERTa配置 引言 本节将介绍一种基于 BERT \t…...

C++知识点总结(59):背包型动态规划

背包型动态规划 一、背包 dp1. 01 背包(限量)2. 完全背包(不限量)3. 口诀 二、例题1. 和是质数的子集数2. 黄金的太阳3. 负数子集和4. NASA的⻝物计划 一、背包 dp 1. 01 背包(限量) 假如有这几个物品&am…...

C++:反向迭代器的实现

反向迭代器的实现与 stack 、queue 相似&#xff0c;是通过适配器模式实现的。通过传入不同类型的迭代器来实现其反向迭代器。 正向迭代器中&#xff0c;begin() 指向第一个位置&#xff0c;end() 指向最后一个位置的下一个位置。 代码实现&#xff1a; template<class I…...

webGL入门教程_04vec3、vec4 和齐次坐标总结

vec3、vec4 和齐次坐标总结 1. vec3 和 vec4 1.1 什么是 vec3 和 vec4&#xff1f; vec3&#xff1a; GLSL 中的三维向量类型&#xff0c;包含 3 个浮点数&#xff1a;(x, y, z)。常用于表示三维坐标、RGB 颜色、法线、方向等。 vec4&#xff1a; GLSL 中的四维向量类型&…...

uniapp中父组件数组更新后与页面渲染数组不一致实战记录

简单描述一下业务场景方便理解: 商品设置功能,支持添加多组商品(点击添加按钮进行增加).可以对任意商品进行删除(点击减少按钮对选中的商品设置进行删除). 问题: 正常添加操作后,对已添加的任意商品删除后,控制台打印数组正常.但是与页面显示不一致.已上图为例,选中尾…...

优化 Conda 下载速度:详细的代理配置和网络管理策略

优化 Conda 下载速度&#xff1a;详细的代理配置和网络管理策略 为了彻底解决使用 Conda 下载 PyTorch 时遇到的速度问题&#xff0c;并确保下载过程稳定可靠&#xff0c;这需要一个详细、综合的技术方案。让我们更深入地分析问题原因&#xff0c;然后详尽地解释采取的解决策略…...

服务器遭受DDoS攻击后如何恢复运行?

当服务器遭受 DDoS&#xff08;分布式拒绝服务&#xff09;攻击 后&#xff0c;恢复运行需要快速采取应急措施来缓解攻击影响&#xff0c;并在恢复后加强防护以减少未来攻击的风险。以下是详细的分步指南&#xff1a; 一、应急处理步骤 1. 确认服务器是否正在遭受 DDoS 攻击 …...

MFC音视频播放器-支持电子放大等功能

前言 本播放器在VS2019下开发&#xff0c;使用ffmpegD3D实现视频播放渲染功能。同时本播放器支持录像功能、截图功能、音视频播放功能、码流信息显示、电子放大功能等。D3D的渲染同时支持surface和texture两种方式&#xff0c;电子放大功能是在D3D Texture方式下进行实现。以下…...

c语言编程1.17蓝桥杯历届试题-回文数字

题目描述 观察数字&#xff1a;12321&#xff0c;123321 都有一个共同的特征&#xff0c;无论从左到右读还是从右向左读&#xff0c;都是相同的。这样的数字叫做&#xff1a;回文数字。 本题要求你找到一些5位或6位的十进制数字。满足如下要求&#xff1a; 该数字的各个数位之…...

el-table 纵向 横向 多级表头

<el-table :data"tableData" class"diaTable":span-method"handleSpanMethod"border:header-cell-style"{background:#292929,color:#fff}"><!-- 纵向表头 --><el-table-column label"纵向表头" width"…...

uniapp开发微信小程序笔记8-uniapp使用vant框架

前言&#xff1a;其实用uni-app开发微信小程序的首选不应该是vant&#xff0c;因为vant没有专门给uni-app设置专栏&#xff0c;可以看到目前Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本&#xff0c;并由社区团队维护 React 版本和支付宝小程序版本。 但是vant的优…...

分布式项目使用Redis实现数据库对象自增主键ID

hello。大家好&#xff0c;我是灰小猿&#xff0c;一个超会写bug的程序猿&#xff01; 在分布式项目中&#xff0c;数据表的主键ID一般可能存在于UUID或自增ID这两种形式&#xff0c;UUID好理解而且实现起来也最容易&#xff0c;但是缺点就是数据表中的主键ID是32位的字符串&a…...

npm-运行项目报错:A complete log of this run can be found .......npm-cache_logs\

1.问题 没有找到对应的某种依赖&#xff0c;node_modules出现问题。 2.解决 (1)查看对应依赖是否引入或者是由于合并分支错误 引入js或依赖不存在。谨慎删除依赖包 (2)查找对应引入依赖进行安装最后解决方法-删除依赖包清除缓存 npm cache clean --force (2)重新向同事引入…...

SolarCube: 高分辨率太阳辐照预测基准数据集

太阳能作为清洁能源在减缓气候变化中的作用日益凸显&#xff0c;其稳定的供应对电网管理至关重要。然而&#xff0c;太阳辐照受云层和天气变化的影响波动较大&#xff0c;给光伏电力的管理带来挑战&#xff0c;尤其是在调度、储能和备用系统管理方面。因此&#xff0c;精确的太…...

华为小米苹果三星移动设备访问windows共享文件夹windows11

如果移动设备和windows电脑都在同一个局域网内&#xff0c;可以用移动设备访问windows11的共享文件夹 1、设置共享文件夹 2、添加everyone用户即可 3、查看ip地址 4、在华为手机上点击文件管理&#xff0c;里面有个网上邻居 5、正常情况下&#xff0c;华为手机会扫描到同一局域…...

网络安全三防指南:只防病毒不安全

5月17日&#xff0c;瑞星全球反病毒监测网截获一个恶性病毒&#xff0c;由于该病毒的破坏能力和当年著名的CIH病毒几乎完全一样&#xff0c;因此瑞星将该病毒命名为“新CIH”病毒。被“新CIH”感染的电脑&#xff0c;主板和硬盘数据将被破坏&#xff0c;致使电脑无法启动&#…...

论文概览 |《Urban Analytics and City Science》2023.05 Vol.50 Issue.4

本次给大家整理的是《Environment and Planning B: Urban Analytics and City Science》杂志2023年5月第50卷第4期的论文的题目和摘要&#xff0c;一共包括19篇SCI论文&#xff01; 论文1 Data analytics and sustainable urban development in global cities 全球城市的数据…...

【ROS2】ROS2 C++版本 与 Python版本比较

ROS 系列学习教程(总目录) ROS2 系列学习教程(总目录) 目录 一、功能包的构建方式二、功能包组织结构三、代码编写四、性能与效率五、兼容性六、应用场景 目前ROS开发主要使用 C 和 Python 语言&#xff0c;这里会分别实现并讲解。 相较于ROS1&#xff0c;ROS2的 C 和 Python …...

物联网射频识别和RFID开发(一):RFID基础—概念、应用

一、RFID的发展历史 二、RFID与物联网 &#xff08;一&#xff09;物联网与RFID的关系 物联网的基本思想是美国麻省理工学院在1999年提出的&#xff0c;其核心思想是为全球每个物品提供唯一的电子标识符。这种电子标识符就是现在经常提到的“电子产品编码(Electronic Product …...

JVM:即时编译器,C2 Compiler,堆外内存排查

1&#xff0c;即时编译器 1.1&#xff0c;基本概念 常见的编译型语言如C&#xff0c;通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译&#xff0c;处处运行”的特性&#xff0c;把编译的过程分成两部分&#xff0c;首先它会先由javac编译成通用的…...

webpack5 的五大核心配置(二)

webpack主要构成部分&#xff1a; entry 入口output 出口loaders 转化器plugins 插件mode 模式devServer 开发服务器 webpack.config.js 配置文件基本格式 module.exports{//入口文件entry:{},//出口文件output:{},//module rules loadersmodule{};//插件plugins:[],//开发…...

【查询基础】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...

git push使用

推送指定分支 将当前分支推送远程 git push origin HEAD:<branch-name> 这里的 HEAD 是一个特殊的指针&#xff0c;它指向当前分支的最新提交。这条命令会将当前分支的更改推送到远程的 master 分支。 示例 git push origin HEAD:main 当前分支是test&#xff0c;远…...

【iOS】多线程基础

【iOS】多线程基础 文章目录 【iOS】多线程基础前言进程与线程进程进程的状态进程的一个控制结构进程的上下文切换 线程为什么要用线程什么是线程线程和进程的关系线程的上下文切换 线程和进程的优缺点 小结 前言 笔者由于对于GCD不是很了解&#xff0c;导致了项目中网络请求哪…...

常用网站网址

目录 1.docker hub2.csdn 1.docker hub https://image.cgdcgd.cc/ 2.csdn https://www.csdn.net/ ​...

手机微信官方网站/独立站seo实操

文章目录一、 关于需求分析与建模的读书心得1) 我对需求分析与建模的认识与建议1. 需求问题是当前软件开发面临的主要问题2. 需求问题具体原因分析3. 需求工程的重要性4. 需求工程的复杂性2) 我对需求分析与建模的读书心得1. 我对需求分析与建模的读书心得二、 关键词查找结合小…...

万网做网站花多少钱/优化大师下载安装

在前面提到过&#xff0c;Starling是Sparrow的姊妹篇&#xff0c;正因为这样&#xff0c;Starling里的touch事件的机制其实是为移动设备的触摸交互设计的&#xff0c;所以当你使用它进行使用鼠标交互的桌面应用开发时&#xff0c;第一眼会感觉有些困惑。 首先&#xff0c;如果你…...

wordpress结构化标签/拉新推广赚钱的app

目录 1. asyncio 简介 1.1 协程与 asyncio协程编写的三个组成部分&#xff1a;1. 事件循环&#xff0c; 2. 回调(驱动生成器)&#xff0c; 3. epoll&#xff08;IO 多路复用&#xff09; asyncio 是 python 用于解决异步 IO 编程的一整套解决方案。基于 asyncio 的框架有: torn…...

网站引导页怎么做的/软文推广发稿

idea中&#xff0c;我当前设置的是eclipse的快捷键&#xff08;从eclipse转过来的&#xff09; 一般情况下&#xff0c;查看类的子类CtrlT 如何以树的形式查看完整继承关系&#xff0c;快捷键&#xff1a;F4 效果如下&#xff1a; 尤其从根节点查看的时候&#xff0c;完整的继承…...

o2o商城分销网站开发/泉州网站关键词排名

我能邢 2020.11.03 17:02:08 字数 198 阅读 4,084 不要慌 不要气 一步一步来 首先 打开浏览器 输入 chrome://version/ 可以看到版本号 版本号 为什么之前我玩的特溜 现在就不行 就是因为我的浏览器会自己升级&#xff01;&#xff01;&#xff01;&#xff01; 此处省略一…...

三网合一网站怎么做/济南网络seo公司

日本折纸大师神谷哲史&#xff08;生于1981&#xff09;的作品。视频长达7分钟&#xff0c;值得仔细一看。他用一张纸&#xff0c;就可以完成极为复杂的造型&#xff0c;让人赞叹不已。 真是鬼斧神工啊...