神经网络中的优化方法(一)
目录
- 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. 参数初始化
- 参考
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=1∑mL(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=1∑mlogpmodel(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(λ)V−1,那么 W t = V d i a g ( λ ) t V − 1 W^t=Vdiag(\lambda)^tV^{-1} Wt=Vdiag(λ)tV−1。当特征值不在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▽θi∑L(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)计算梯度估计:g←m1▽θi∑L(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计算临时点的梯度:g←m1▽θ˜i∑L(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) 深度学习(中文翻译版)
相关文章:

神经网络中的优化方法(一)
目录 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 随机梯度下降(小…...

输出1~n中能被3整除,且至少有一位数字是5的所有整数.:JAVA
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 输出1~n中能被3整除,且至少有一位数字是5的所有整数. 输入描述: 输入一行,包含一个整数n。(1 < n < 100000) 输出描述: 输出所有满足条件的数,以换…...

MySQL 主从同步一致性详解
MySQL主从同步是一种数据复制技术,它允许数据从一个数据库服务器(主服务器)自动同步到一个或多个数据库服务器(从服务器)。这种技术主要用于实现读写分离、提升数据库性能、容灾恢复以及数据冗余备份等目的。下面将详细…...

html+css网页设计 旅游 马林旅行社3个页面
htmlcss网页设计 旅游 马林旅行社3个页面 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&#…...

【短视频矩阵系统==saas技术开发】
在数字媒体领域,短视频的崛起已不可忽视。对于商业实体而言,掌握如何通过短视频平台有效吸引潜在客户并提高转化率,已成为一项关键课题。本文旨在深入剖析短视频矩阵系统的构成与作用机制,以期为企业提供一套系统化的策略…...

MongoDB-BSON 协议与类型
前言: MongoDB 是一个高性能、无模式的 NoSQL 数据库,广泛应用于大数据处理和实时数据存储。作为一个数据库系统,MongoDB 的核心之一就是其使用的 BSON(Binary JSON)格式,它用于存储数据以及在客户端和数据…...

论文:IoU Loss for 2D/3D Object Detection
摘要:在2D/3D目标检测任务中,IoU (Intersection-over- Union)作为一种评价指标,被广泛用于评价不同探测器在测试阶段的性能。然而,在训练阶段,通常采用常见的距离损失(如L1或L2)作为损失函数,以最小化预测值…...

Electron-vue 框架升级 Babel7 并支持electron-preload webapck 4 打包过程记录
前言 我这边一直用的electron-vue框架是基于electron 21版本的,electron 29版本追加了很多新功能,但是这些新功能对开发者不友好,对electron构建出来的软件,使用者更安全,所以,我暂时不想研究electron 29版…...

信创改造 - Redis -》TongRDS 安装方式之单节点模式安装
安装前准备 安装 JDK 参考链接:安装 JDK 8【Linux】 语雀 创建用户 # 用户名可以自己起 useradd rds 上传安装包到服务器 单节点模式是由两个部署单元组成:1 个RDS 服务节点,1 个 RDS 中心节点。 上传到 /home/rds 用户文件夹࿰…...

经典C语言代码——part 19(链表)
【程序72】 题目:创建一个链表。 1.程序分析: 2.程序源代码: /*creat a list*/ #include "stdlib.h" #include "stdio.h" struct list { int data; struct list *next; }; typedef str…...

【Leetcode 每日一题】52. N 皇后 II
问题背景 n n n 皇后问题 研究的是如何将 n n n 个皇后放置在 n n n \times n nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n n n,返回 n n n 皇后问题 不同的解决方案的数量。 数据约束 1 ≤ n ≤ 9 1 \le n \le 9 1≤n≤9 解题…...

Scala的模式匹配(1)
package hfdobject Test34_1 {def main(args: Array[String]): Unit {//从数据库中获得数据 1,2,3,4//要显示给用户的是 一等,二等,三等,四等val level1val levelTxtlevel match {case 1>"一等&q…...

Oracle 11G DataGuard GAP 修复过程(通过主库scn增备恢复)
Oracle 11G DataGuard GAP 修复 (通过主库scn增备恢复) 介绍 DG GAP 顾名思义就是:DG不同步,当备库不能接受到一个或多个主库的归档日志文件时候,就发生了 GAP。 那么,如果遇到GAP如何修复呢?…...

redis的应用----缓存
redis的应用----缓存 一、缓存的概念二、使用redis作为缓存2.1使用redis作为缓存的原因2.2缓存机制的访问步骤 三、缓存的更新策略3.1定期更新3.2实时更新3.3淘汰策略 四、缓存常见的问题4.1缓存预热(Cache preheating)4.2缓存穿透(Cache penetration)4.3缓存雪崩(Cache avalan…...

「Mac畅玩鸿蒙与硬件41」UI互动应用篇18 - 多滑块联动控制器
本篇将带你实现一个多滑块联动的控制器应用。用户可以通过拖动多个滑块,动态控制不同参数(如红绿蓝三色值),并实时显示最终结果。我们将以动态颜色调节为例,展示如何结合状态管理和交互逻辑,打造一个高级的…...

SpringBoot两天
SpringBoot讲义 什么是SpringBoot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式…...

基于Java Springboot诗词学习APP且微信小程序
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse微信开…...

3.建立本地仓库及常用命令
1.建立本地仓库 要使用Git对我们的代码进行版本控制,首先需要获得本地仓库 1)在电脑的任意位置创建一个空目录,作为我们的本地Git仓库 2)进入这个目录,右键点击Git Bash 窗口 3)执行命令git init 4) 如果创…...

【Linux——实现一个简易shell】
黑暗中的我们都没有说话,你只想回家,不想你回家............................................................... 文章目录 前言 一、【shell工作过程】 二、【命令行参数】 2.1、【获取命令行参数】 1、【输出命令行提示符】 2、【输入命令行参数】 2…...

python使用python-docx处理word
文章目录 一、python-docx简介二、基本使用1、新建与保存word2、写入Word(1)打开文档(2)添加标题(3)添加段落(4)添加文字块(5)添加图片(6…...

Typora设置自动上传图片到图床
Typora设置自动上传图片到图床 方法一:使用php 打开设置界面: 自定义命令: php F:/WWW/php-library/TyporaUploadImage.php ${filename}php代码: # TyporaUploadImage.php <?php // Set the API endpoint URL // $apiUrl…...

如何进行Appium实现移动端UI自动化测试呢?
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门,那么我们就直奔主题。文章结构如下: 为什么要使用…...

PHP语法学习(第三天)
老规矩,先回顾一下昨天学习的内容 PHP语法学习(第二天) 主要学习了PHP变量、变量的作用域、以及参数作用域。 今天由Tom来打开新的篇章 文章目录 echo 和 print 区别PHP echo 语句实例 PHP print 语句实例 PHP 数组创建数组利用array() 函数 数组的类型索引数组关联…...

mac访达打开终端
选择文件夹打开 选中文件夹,然后右键即可: 在当前文件夹打开 在访达的当前文件夹长按option键 左下角出现当前文件夹路径 右键即可打开终端...

游戏引擎学习第30天
仓库: https://gitee.com/mrxiao_com/2d_game 回顾 在这段讨论中,重点是对开发过程中出现的游戏代码进行梳理和进一步优化的过程。 工作回顾:在第30天,回顾了前一天的工作,并提到今天的任务是继续从第29天的代码开始,…...

git将远端库地址加入到本地库中
git将远端库地址加入到本地库中 git remote add test https://test.git其中test表示远端库的名称,url表示远端库的地址,这样添加后在.git/config配置文件中就能够看到新的remote已经被添加,并且通过git remote -v能够看到新添加的远端库...

学习HTML第三十五天
学习文章目录 一.全局属性二..meta 元信息 一.全局属性 常用的全局属性 id 给标签指定唯一标识,注意: id 是不能重复的。 作用:可以让 label 标签与表单控件相关联;也可以与 CSS 、 JavaScript 配合使 用class 给标签指定类名&a…...

MySQL 事务和索引
关于 MySQL 事务特性、 索引特性。 请你简单解释一下 MySQL 事务是什么? 事务是一组数据库操作,这些操作要么全部成功执行,要么全部不执行。它是一个不可分割的工作单元,用于保证数据的一致性和完整性。 请详细阐述一下事务的 AC…...

Matlab学习笔记
Magic Traits 文件读取 fid fopen(fn,rt);out fscanf(fid,spec,inf);fclose(fid);2. 读取数据 fid fopen(fn,rt); out textscan(fid,spec);运算篇 fprintf(" xxx %d",a),当a为数组时,会输出数组数目行,每行是一个元素相关文…...

在1~n中、找出能同时满足用3除余2,用5除余3,用7除余2的所有整数。:JAVA
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 在1~n中、找出能同时满足用3除余2,用5除余3,用7除余2的所有整数。 输入描述: 输入一行,包含一个正整数n ,n在100000以内 输出描述:…...

《极品飞车》游戏运行是弹窗“msvcp140.dll文件丢失”是如何造成的?“找不到msvcp140.dll文件”怎么解决?教你几招轻松解决
《极品飞车》游戏运行时弹窗“msvcp140.dll文件丢失”问题解析及解决方案 在畅游《极品飞车》这类精彩刺激的电脑游戏时,突然遇到弹窗提示“msvcp140.dll文件丢失”,无疑会让玩家感到头疼。那么,这个问题究竟是如何造成的?又该如…...

IDE如何安装插件实现Go to Definition
项目背景 框架:Cucumber Cypress 语言:Javascript IDE:vscode 需求 项目根目录cypress-automation的cypress/integration是测试用例的存放路径,按照不同模块不同功能创建了很多子目录,cucumber测试用例.feature文…...

【Vulkan入门】01-列举物理设备
目录 先叨叨git信息主要逻辑VulkanEnvEnumeratePhysicalDevices()PrintPhysicalDevices() 编译并运行程序 先叨叨 上一篇已经创建了VkInstance,本篇我们问问VkInstance,在当前平台上有多少个支持Vulkan的物理设备。 git信息 repository: https://gite…...

pytest(二)excel数据驱动
一、excel数据驱动 excel文件内容 excel数据驱动使用方法 import openpyxl import pytestdef get_excel():excel_obj openpyxl.load_workbook("../pytest结合数据驱动-excel/data.xlsx")sheet_obj excel_obj["Sheet1"]values sheet_obj.valuescase_li…...

主动安全和驾驶辅助模块(ASDM):未来驾驶的核心科技 随着汽车技术的不断进步,驾驶体验和安全性正经历着前所未有的变革。
未来驾驶的核心科技 随着汽车技术的不断进步,驾驶体验和安全性正经历着前所未有的变革。在这场变革中,主动安全和驾驶辅助模块(ASDM)扮演着至关重要的角色。本文将深入探讨ASDM模块的定义、功能、工作原理以及它如何改变我们的驾驶…...

8 Bellman Ford算法SPFA
图论 —— 最短路 —— Bellman-Ford 算法与 SPFA_通信网理论基础 分别使用bellman-ford算法和dijkstra算法的应用-CSDN博客 图解Bellman-Ford计算过程以及正确性证明 - 知乎 (zhihu.com) 语雀版本 1 概念 **适用场景:**单源点,可以有负边࿰…...

Oracle篇—11gRAC安装在linux7之后集群init.ohasd进程启动不了报错CRS-0715问题
💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...

[golang][MAC]Go环境搭建+VsCode配置
一、go环境搭建 1.1 安装SDK 1、下载go官方SDK 官方:go 官方地址 中文:go 中文社区 根据你的设备下载对应的安装包: 2、打开压缩包,根据引导一路下一步安装。 3、检测安装是否完成打开终端,输入: go ve…...

【乐企文件生成工程】搭建docker环境,使用docker部署工程
1、自行下载docker 2、自行下载docker-compose 3、编写Dockerfile文件 # 使用官方的 OpenJDK 8 镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR ./app# 复制 JAR 文件到容器 COPY ../lq-invoice/target/lq-invoice.jar app.jar # 暴露应用程序监听的端口 EXPOSE 1001…...
关于数据库数据国际化方案
方案一:每个表设计一个翻译表 数据库国际化的应用场景用到的比较少,主要用于对数据库的具体数据进行翻译,在需要有大量数据翻译的场景下使用,举个例子来说,力扣题目的中英文切换。参考方案可见: https://b…...

【目标跟踪】Anti-UAV数据集详细介绍
Anti-UAV数据集是在2021年公开的专用于无人机跟踪的数据集,该数据集采用RGB-T图像对的形式来克服单个类型视频的缺点,包含了318个视频对,并提出了相应的评估标准(the state accurancy, SA)。 文章链接:https://arxiv.…...

第10章 大模型的有害性(下)
在本章中,我们继续探讨大型语言模型(LLM)可能带来的有害影响,重点讨论有毒性(toxicity)和虚假信息(disinformation)。这些影响不仅影响用户的体验,也可能对社会产生深远的…...

DevOps工程技术价值流:GitLab源码管理与提交流水线实践
在当今快速迭代的软件开发环境中,DevOps(开发运维一体化)已经成为提升软件交付效率和质量的关键。而GitLab,作为一个全面的开源DevOps平台,不仅提供了强大的版本控制功能,还集成了持续集成/持续交付(CI/CD)…...

Qt 面试题学习11_2024-11-29
Qt 面试题 1、什么是Qt事件循环 ?2、纯虚函数和普通的虚函数有什么区别3、Qt 的样式表是什么? 1、什么是Qt事件循环 ? Qt事件循环是一种程序架构,它用于处理窗口系统和其他用户界面事件,以及与用户界面无关的事件例如…...

云原生和数据库哪个好一些?
云原生和数据库哪个好一些?云原生和数据库各有其独特的优势,适用于不同的场景。云原生强调高效资源利用、快速开发部署和高可伸缩性,适合需要高度灵活性和快速迭代的应用。而数据库则注重数据一致性、共享和独立性,确保数据的稳定…...

baomidou Mabatis plus引入异常
1 主要异常信息 Error creating bean with name dataSource 但是有个重要提示 dynamic-datasource Please check the setting of primary 解决方法:增加 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-sp…...

Oracle篇—通过官网下载最新的数据库软件或者历史数据库软件
💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...

初学git报错处理 | 从IDEA远程拉取、创建分支中“clone failed”“couldn‘t checkout”
1.远程拉取“clone failed” 我新建了一个文件夹,结果clone failed。后来发现,原来是在这个文件夹里没有建立本地仓库。 打开文件夹,右键git bush,然后键入git init,就可以成果clone啦! 2.新建分支“couldnt checkou…...

【趣味】斗破苍穹修炼文字游戏HTML,CSS,JS
目录 图片展示 游戏功能 扩展功能 完整代码 实现一个简单的斗破苍穹修炼文字游戏,你可以使用HTML、CSS和JavaScript结合来构建游戏的界面和逻辑。以下是一个简化版的游戏框架示例,其中包含玩家修炼的过程、增加修炼进度和显示经验值的基本功能。 图片…...

Luban数据插件的用法
配置后数据后,点击图1中的gen.bat文件启动生成配置数据和解析配置数据代码的程序,自动生成配置数据和解析用到的代码;因为我已经 指定了生成内容的输出路径为Unity项目的路径下面,所以,不用再搬运生成的内容到项目目录…...