吴恩达深度学习——有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。

文章目录

  • 训练集、验证集、测试集
  • 偏差、方差
  • 正则化
    • 正则化参数
    • 为什么正则化可以减少过拟合
    • Dropout正则化
      • Inverted Dropout
      • 其他的正则化方法
        • 数据增广
        • Early stopping
  • 归一化
  • 梯度消失与梯度爆炸
    • 产生原因
    • 权重初始化
      • He初始化
      • Xavier初始化
  • 梯度检验
    • 梯度的数值逼近
    • 步骤(如上图)
    • 一些建议

训练集、验证集、测试集

  • 训练集:用于训练模型的数据集。通过学习训练集中的数据特征和标签之间的关系,来调整自身的参数,以尽可能准确地对数据进行拟合。
  • 验证集:在模型训练过程中对模型进行评估和调整。在训练过程中,使用验证集可以监控模型的性能,如准确率、损失函数值,根据验证集上的表现来选择最优的模型参数。
  • 测试集:在模型训练和调优完成后,最终评估模型的性能。是一组完全独立于训练集和验证集的数据,测试模型在实际应用中的泛化能力和准确性,判断模型是否能够很好地处理未见过的数据。

一般来说,数据集按照6:2:2或7:2:1的比例划分为训练集、验证集和测试集。对于数据量非常大的数据集,验证集和测试集的比例可以降低,比如95:2.5:2.5;而对于数据量较小的数据集,可以使用上述的原则。

有的时候会遇到这样的场景:训练一个识别猫的模型,训练的时候使用的训练集是大小固定,分辨率较低的图片,但是在测试的时候使用的验证集、测试集是随机大小的,分辨率比较高的图片。这两类图片是不同的,应该确保训练集和验证机、测试集的数据是同一个分布

在训练集上训练数据,尝试使用不同的模型框架;在验证集上评估这些模型,迭代选出适用的模型;最后测试。

偏差、方差

偏差是模型的预测值(期望输出)与真实值之间的差异。高偏差意味着模型过于简单,不能很好地捕捉数据中的复杂模式和特征,导致模型在训练集和测试集上的表现都较差,出现欠拟合现象。
方差描述的是模型对于给定数据集的预测结果的离散程度。如果模型在不同的训练数据集上训练后,得到的模型参数差异很大,导致预测结果波动较大,那么这个模型的方差就很高。高方差通常是因为模型过于复杂,对训练数据中的噪声和特定样本的特征过度拟合,在训练集上表现很好,但在测试集等新数据上表现不佳,出现过拟合现象。

偏差反映的是模型本身的拟合能力。从数学角度看,偏差衡量的是模型的期望预测与真实值之间的偏离程度;方差衡量的是模型预测结果的稳定性。
在这里插入图片描述

  • 左图 - high bias(高偏差):也叫欠拟合。模型过于简单,无法很好地捕捉数据中的规律和特征,导致在训练集上的表现就很差,对数据的拟合程度低。图中用一条简单的直线去划分两类数据点(圆圈和叉叉),明显没有很好地分开数据,在训练集上的误差就较大,更不用说在新数据上的表现了。
  • 中图 - just right(正好):也叫适度拟合。模型复杂度适中,能够较好地学习到数据中的模式,既不会过于简单而无法拟合数据,也不会过于复杂而只对训练数据表现好。图中用一条曲线比较合理地划分了两类数据点,在训练集上有较好的拟合效果,同时也有较好的泛化能力,在新数据上也能有不错的表现。
  • 右图 - high variance(高方差):也叫过拟合。模型过于复杂,把训练数据中的一些偶然的特征也学习了进去,导致在训练集上表现非常好,几乎能完美拟合训练数据,但在新数据上表现很差,泛化能力弱。图中曲线过度地围绕着数据点,甚至把一些可能是误差的数据点也考虑进去了,虽然在训练集上误差极小,但在新数据上难以有好的表现。

在二维中可以直接可视化偏差和方差。但是在更多维中描述较为困难,使用几个指标来描述偏差和方差。
在这里插入图片描述
识别一张猫的图片,假设人的识别率是0%的错误。

  • 在训练集和测试集上错误率分别为1%和11%:说明模型对训练集过拟合,对新的数据表现较差,称为高方差。
  • 在训练集和测试集上错误率分别为15%和16%:说明模型对训练集欠拟合,对新的数据表现也较差,称为高偏差。
  • 在训练集和测试集上错误率分别为15%和30%:说明模型对训练集欠拟合,但是对新的数据表现更差,称为高偏差和高方差。
  • 在训练集和测试集上错误率分别为0.5%和1%:说明模型对训练集和新的数据表现均较好,称为低偏差和低方差。

在这里插入图片描述

图中训练集的紫色部分表现为高方差和高偏差。两边部分几乎是一条直线,欠拟合,表现为高偏差,但是中间部分很灵活,对一些可能的错误点过拟合,(在新的数据上表现较差)表现为高方差。

对于高偏差的问题,尝试选择一个新的网络、花费更多时间去训练或者尝试更先进的优化算法,一直到解决这个问题。当偏差降低到可以接受的范围时,查看验证集性能,检查方差是否有问题。若方差较高,需要更多的数据去验证或寻找更合适的神经网络,但是有的时候并不能找到更多的数据的时候,可以采用正则化来减少过拟合。做到具体问题具体分析,比如算法存在高偏差的问题,采用更多的数据去训练作用则效果不大。

在这里插入图片描述

正则化

正则化参数

在模型的损失函数中添加一个惩罚项,对模型的参数进行约束。

以线性回归模型为例,其原始损失函数为 L ( w , b ) = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 L(w,b)=\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^2 L(w,b)=n1i=1n(yiy^i)2,添加正则化项后变为 L ( w , b ) = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 + λ 2 m R ( w ) L(w,b)=\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^2+ \frac{\lambda}{2m} R(w) L(w,b)=n1i=1n(yiy^i)2+2mλR(w)。其中 λ \lambda λ是正则化系数,用于控制正则化的强度。 2 m 2m 2m是样本数量的2倍,数字2主要是为了求导的方便。 R ( w ) R(w) R(w)是正则化项,它对模型参数 w w w进行约束,使模型参数不会过大,避免模型过于复杂而出现过拟合。

正则化项取 R ( w ) = ∑ j = 1 m w j 2 = w T w R(w)=\sum_{j=1}^{m}w_{j}^{2}=w^Tw R(w)=j=1mwj2=wTw称为L2正则化(岭回归),对模型参数的平方求和。L2正则化使得 参数趋于较小的值,但不会使参数变为0,通过减小参数的量级来降低模型的复杂度,防止过拟合。

L2距离(欧几里得距离)

  • 在二维空间中:假设有两个点 P ( x 1 , y 1 ) P(x_1,y_1) P(x1,y1) Q ( x 2 , y 2 ) Q(x_2,y_2) Q(x2,y2),它们之间的L2距离 d ( P , Q ) d(P,Q) d(P,Q)计算公式为 d ( P , Q ) = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 d(P,Q)=\sqrt{(x_2 - x_1)^2+(y_2 - y_1)^2} d(P,Q)=(x2x1)2+(y2y1)2 。几何意义是两点之间直线段的长度。
  • 在n 维空间中:对于两个 n 维向量 x = ( x 1 , x 2 , ⋯ , x n ) \mathbf{x}=(x_1,x_2,\cdots,x_n) x=(x1,x2,,xn) y = ( y 1 , y 2 , ⋯ , y n ) \mathbf{y}=(y_1,y_2,\cdots,y_n) y=(y1,y2,,yn),它们之间的L2距离 d ( x , y ) d(\mathbf{x},\mathbf{y}) d(x,y)的计算公式为 d ( x , y ) = ∑ i = 1 n ( y i − x i ) 2 d(\mathbf{x},\mathbf{y})=\sqrt{\sum_{i = 1}^{n}(y_i - x_i)^2} d(x,y)=i=1n(yixi)2

正则化系数 λ \lambda λ是一个超参数,需要通过验证集等方法进行调整。 λ \lambda λ值过小,正则化效果不明显,无法有效防止过拟合; λ \lambda λ值过大,会过度约束模型参数,导致模型过于简单,出现欠拟合。采用交叉验证等方法,在不同的 λ \lambda λ取值下训练模型并在验证集上评估性能指标,选择使验证集性能最优的 λ \lambda λ值。

反向传播的时候,不要忘记对惩罚项的求导。
d w = ( 原损失函数求导的结果 ) + λ m w [ l ] \mathbf{d}w=(原损失函数求导的结果) + \frac{\lambda}{m}w^{[l]} dw=(原损失函数求导的结果)+mλw[l] w [ l ] : = w [ l ] − α d w [ l ] w^{[l]}:=w^{[l]}-\alpha\mathbf{d}w^{[l]} w[l]:=w[l]αdw[l]

为什么正则化可以减少过拟合

在这里插入图片描述
对于该损失函数,若 λ \lambda λ足够大,求导后的 d w \mathbf{d}w dw也大,导致梯度下降的 w w w更小,当接近于0时,相当于将神经网络的多个隐藏单元权重设置为0,整个大的神经网络简化成一个小的神经网络,导致网络欠拟合,更接近于高偏差的神经网络。在调整 λ \lambda λ的过程中,总有个值让神经网络适度拟合。

实际上不是隐藏单元消失了,而是其权重变的更小。
在这里插入图片描述

Dropout正则化

在这里插入图片描述
对于左边的过拟合的神经网络,采用Dropout正则化,在模型训练过程中,Dropout以一定的概率随机 丢弃(设置为 0)神经网络中隐藏层和输入层的一些神经元。右图中,假设有遍历每一层的神经元,假设每个神经元有50%的概率被丢弃。

Inverted Dropout

在普通Dropout中,训练时以概率 p p p随机将神经元的输出设置为0,测试时所有神经元都正常工作,这就导致训练和测试阶段网络的行为存在差异,测试时需要对网络输出进行额外的缩放调整来匹配训练时的预期输出。

反向随机失活(Inverted Dropout)在训练阶段对激活值进行缩放补偿,使测试阶段无需额外调整。具体做法是:在训练时,对于每个神经元,以概率 p p p将其输出设置为0,同时将保留(未被丢弃)的神经元输出除以 1 − p 1 - p 1p 。这样做的效果是,训练阶段神经元输出的期望值与测试阶段所有神经元都正常工作时的期望值保持一致。

假设一个神经元在未应用Dropout时的输出为 x x x ,Dropout概率为 p = 0.5 p = 0.5 p=0.5

  • 普通Dropout训练:该神经元有 0.5 0.5 0.5的概率输出为0, 0.5 0.5 0.5的概率输出为 x x x,其输出的期望值为 0.5 × 0 + 0.5 × x = 0.5 x 0.5\times0 + 0.5\times x = 0.5x 0.5×0+0.5×x=0.5x 。测试时,所有神经元正常工作,输出为 x x x ,因此测试时需要将训练阶段的输出乘以2来匹配测试时的输出。
  • inverted dropout训练:该神经元有 0.5 0.5 0.5的概率输出为0, 0.5 0.5 0.5的概率输出为 x 1 − 0.5 = 2 x \frac{x}{1 - 0.5}=2x 10.5x=2x ,其输出的期望值为 0.5 × 0 + 0.5 × 2 x = x 0.5\times0 + 0.5\times2x = x 0.5×0+0.5×2x=x 。测试时,所有神经元正常工作,输出同样为 x x x ,无需额外调整。

每一层的概率(keep-prob)可以设置为不同的值,1表示全部保留。如果担心某些层比其他层更容易发生拟合,可以将该层的keep-prob设置的比其他层更低,但这样做缺点是需要使用交叉验证搜寻更多的超参数。

Dropout正则化的缺点是损失函数 J J J不再有明确的定义,从而不能很好地绘制损失函数图像。

其他的正则化方法

数据增广

如果想要通过扩增训练数据来解决过拟合问题,但是扩增数据代价较高,这个时候,可以在原有的数据集上添加改变后的数据集来增加训练集(数据增广)。比如对图片进行反转或者裁剪;对文字旋转或者变形。

在这里插入图片描述

Early stopping

在模型训练过程中,模型在训练集上的损失通常会不断降低,而在验证集上的损失会先下降,到达某一时刻后可能开始上升,这表明模型开始过拟合训练数据。Early stopping 会在训练过程中持续监控验证集上的性能指标,当验证集上的性能指标出现过拟合时,就停止训练。
在这里插入图片描述

Early stopping提前停止训练可能导致模型没有充分学习到数据中的所有有用信息,没有达到全局最优解,使得模型性能未达到理论上的最佳状态。

归一化

  • 第一步,零均值化 μ = 1 m ∑ i = 1 m x ( i ) , x : = x − μ \mu=\frac{1}{m}\sum_{i=1}^{m}x^{(i)},\ x:=x-\mu μ=m1i=1mx(i), x:=xμ。将数据的均值调整为 0 。有助于使数据在特征空间中分布更加对称,减少数据的偏置影响。
  • 第二步,方差归一化 σ 2 = 1 m ∑ i = 1 m x ( i ) 2 , x / = σ 2 \sigma^2=\frac{1}{m}\sum_{i=1}^{m}x^{(i)^{2}},\ x/=\sigma^2 σ2=m1i=1mx(i)2, x/=σ2。调整数据的方差,使不同特征的方差保持一致。如果不同特征的方差差异较大,那么方差大的特征可能会在模型训练中占据主导地位,而方差小的特征的作用可能被忽视。
    在这里插入图片描述

如果没有归一化,损失函数图像像一个狭长的碗,在这样的图上运行梯度下降法,在更新参数时步伐不一致,可能导致在某些方向上过度更新,而在其他方向上更新不足,为了照顾不同的方向,学习率需设置的较小,从而需要更多的迭代次数才能收敛到最优解,增加了训练时间和计算成本;归一化使得损失函数更加对称,算法可以更有效地调整参数,学习率可以设置的更大,花费更低的成本达到最优解。

在这里插入图片描述

梯度消失与梯度爆炸

  • 梯度消失:在深度神经网络的反向传播过程中,梯度值随着网络层数的增加而逐渐变小,趋近于零。使得网络中靠近输入层的神经元的参数更新非常缓慢,甚至几乎不更新,导致模型无法学习到足够的信息,难以收敛到最优解。
  • 梯度爆炸:与梯度消失相反,在反向传播过程中,梯度值随着网络层数的增加而变得越来越大,导致参数更新步长过大,使得模型无法稳定收敛,甚至可能导致参数值变为NaN(非数值)。

产生原因

  • 激活函数选择:如果使用Sigmoid或Tanh等激活函数,它们的导数取值范围是有限的,Sigmoid函数的导数在输入值较大或较小时趋近于0。在深度网络中,经过多层的链式求导后,梯度会不断相乘,导致梯度值变得极小,从而引发梯度消失问题。
  • 网络层数过深:随着网络层数的增加,反向传播时梯度需要经过多次乘法运算,这使得梯度值容易出现指数级的衰减(梯度消失)或增长(梯度爆炸)。
  • 参数初始化不当:如果初始参数设置过大,在反向传播过程中可能会导致梯度爆炸;如果初始参数设置过小,则可能加剧梯度消失问题。

权重初始化

He初始化

当使用ReLU激活函数时,传统的初始化方法(如随机初始化)可能会导致某些神经元在训练初期就处于“死亡”状态(即输入小于0,输出恒为0),或者使得梯度在反向传播过程中迅速消失或爆炸。

He初始化是根据输入层的神经元数量来调整初始化参数的方差,使得每一层的输出方差在正向传播过程中保持大致不变,同时在反向传播时梯度的方差也能保持稳定,从而避免梯度消失和梯度爆炸问题,加速模型的收敛。

对于一个具有 n i n p u t (简写为 n i n ) n_{input}(简写为n_{in}) ninput(简写为nin个输入神经元的全连接层,其权重参数 W W W的每个元素 w i j w_{ij} wij按照以下方式进行初始化:

  • 从均值为0,标准差为 σ = 2 n i n \sigma = \sqrt{\frac{2}{n_{in}}} σ=nin2 的正态分布中随机采样得到,即 w i j ∼ N ( 0 , 2 n i n ) w_{ij} \sim N(0, \frac{2}{n_{in}}) wijN(0,nin2)
  • 也可以从均匀分布 U ( − 6 n i n , 6 n i n ) U(-\sqrt{\frac{6}{n_{in}}}, \sqrt{\frac{6}{n_{in}}}) U(nin6 ,nin6 )中进行采样。

对于卷积层, n i n n_{in} nin表示输入通道数乘以卷积核的高度和宽度。

Xavier初始化

对于一个具有 n i n n_{in} nin 个输入神经元和 n o u t n_{out} nout 个输出神经元的全连接层,其权重参数 W W W 的每个元素 w i j w_{ij} wij 可以按照以下两种方式进行初始化:

  • 正态分布初始化:从均值为 0,标准差为 σ = 2 n i n + n o u t \sigma = \sqrt{\frac{2}{n_{in} + n_{out}}} σ=nin+nout2 的正态分布中随机采样得到,即 w i j ∼ N ( 0 , 2 n i n + n o u t ) w_{ij} \sim N(0, \frac{2}{n_{in} + n_{out}}) wijN(0,nin+nout2)
  • 均匀分布初始化:从均匀分布 U ( − 6 n i n + n o u t , 6 n i n + n o u t ) U(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}) U(nin+nout6 ,nin+nout6 ) 中进行采样。

Xavier初始化比较适用于使用Sigmoid、Tanh等传统激活函数的神经网络。

梯度检验

在实现复杂的神经网络和反向传播算法时,代码中可能会出现各种错误,如索引错误、矩阵运算错误等。梯度检验可以帮助我们及时发现这些错误,确保反向传播算法的实现是正确的。

梯度的数值逼近

由导数的定义可知。在微积分中,函数 f ( x ) f(x) f(x) 在某一点 x x x 处的导数可以用极限来近似表示:
f ′ ( x ) ≈ f ( x + ϵ ) − f ( x − ϵ ) 2 ϵ f'(x) \approx \frac{f(x + \epsilon)-f(x - \epsilon)}{2\epsilon} f(x)2ϵf(x+ϵ)f(xϵ)
其中 ϵ \epsilon ϵ 是一个非常小的正数。

在神经网络中,我们通过反向传播算法计算损失函数 J ( θ ) J(\theta) J(θ) 关于参数 θ \theta θ 的导数 ∂ J ∂ θ \frac{\partial J}{\partial \theta} θJ,梯度检验就是将反向传播计算得到的梯度与使用上述近似公式计算得到的梯度进行比较,如果两者非常接近,则说明反向传播算法的实现是正确的。
在这里插入图片描述

g ( θ ) g(\theta) g(θ) f ( θ ) f(\theta) f(θ)的导数。

可以看出误差是0.0001,不是很大,说明该代码是正确的。

步骤(如上图)

  1. 定义损失函数和参数:明确神经网络的损失函数 J ( θ ) J(\theta) J(θ) 以及需要更新的参数 θ \theta θ
  2. 初始化参数:给参数 θ \theta θ 赋予初始值。
  3. 使用反向传播计算梯度:通过反向传播算法计算损失函数 J ( θ ) J(\theta) J(θ) 关于参数 θ \theta θ 的梯度 ∇ θ J \nabla_{\theta}J θJ(对损失函数求某个参数的导数)。
  4. 使用数值近似计算梯度:对于参数 θ \theta θ 中的每一个元素 θ i \theta_i θi,分别计算 J ( θ 1 , ⋯ , θ i + ϵ , ⋯ , θ n ) J(\theta_1, \cdots, \theta_i + \epsilon, \cdots, \theta_n) J(θ1,,θi+ϵ,,θn) J ( θ 1 , ⋯ , θ i − ϵ , ⋯ , θ n ) J(\theta_1, \cdots, \theta_i - \epsilon, \cdots, \theta_n) J(θ1,,θiϵ,,θn),然后使用近似公式 ∂ J ∂ θ i ≈ J ( θ 1 , ⋯ , θ i + ϵ , ⋯ , θ n ) − J ( θ 1 , ⋯ , θ i − ϵ , ⋯ , θ n ) 2 ϵ \frac{\partial J}{\partial \theta_i} \approx \frac{J(\theta_1, \cdots, \theta_i + \epsilon, \cdots, \theta_n)-J(\theta_1, \cdots, \theta_i - \epsilon, \cdots, \theta_n)}{2\epsilon} θiJ2ϵJ(θ1,,θi+ϵ,,θn)J(θ1,,θiϵ,,θn) 计算梯度的近似值。
  5. 比较两种梯度:计算反向传播得到的梯度 ∇ θ J \nabla_{\theta}J θJ 和数值近似得到的梯度之间的差异,通常使用相对误差来衡量:
    d = ∥ ∇ θ J − ∇ θ J a p p r o x ∥ 2 ∥ ∇ θ J ∥ 2 + ∥ ∇ θ J a p p r o x ∥ 2 d = \frac{\|\nabla_{\theta}J - \nabla_{\theta}J_{approx}\|_2}{\|\nabla_{\theta}J\|_2 + \|\nabla_{\theta}J_{approx}\|_2} d=θJ2+θJapprox2θJθJapprox2
    其中 ∥ ⋅ ∥ 2 \|\cdot\|_2 2 表示向量的 L2 范数(L2距离)。如果相对误差 d d d 非常小(例如小于 1 0 − 7 10^{-7} 107),则说明反向传播算法的实现是正确的;否则,可能存在代码实现错误。

一些建议

  • 梯度检验仅用于调试,不能训练过程中使用。
  • 若算法未能通过梯度检验,检查各个值,比如如 d z \mathbf{d}z dz d w \mathbf{d}w dw d a \mathbf{d}a da,大概定位。
  • 进行梯度检验时要考虑正则化项。
  • 梯度检验不适用于带有随机失活(Dropout)的情况。
  • 刚开始的时候初始化的W和b都很小,趋于0,而模型可能在W和b小的时候可以很好的计算梯度,但是当迭代了一段时间后,W和b变大,模型可能会在这一部分存在问题,因此这个时候在开启梯度检验比较合适。

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

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

相关文章

基于RK3588/RK3576+MCU STM32+AI的储能电站电池簇管理系统设计与实现

伴随近年来新型储能技术的高质量规模化发展,储能电站作为新能源领域的重要载体, 旨在配合逐步迈进智能电网时代,满足电力系统能源结构与分布的创新升级,给予相应规模 电池管理系统的设计与实现以新的挑战。同时,电子系…

K8s 分布式存储后端(K8s Distributed Storage Backend)

K8s 分布式存储后端 在 K8s 中实现分布式存储后端对于管理跨集群的持久数据、确保高可用性、可扩展性和可靠性至关重要。在 K8s 环境中,应用程序通常被容器化并跨多个节点部署。虽然 K8s 可以有效处理无状态应用程序,但有状态应用程序需要持久存储来维护…

FFmpeg:多媒体处理的瑞士军刀

FFmpeg:多媒体处理的瑞士军刀 前言 FFmpeg 是一个功能强大且跨平台的开源多媒体框架,广泛应用于音视频处理领域。 它由多个库和工具组成,能够处理各种音视频格式,涵盖编码、解码、转码、流处理等多种操作。 无论是专业视频编辑…

unordered_map/set的哈希封装

【C笔记】unordered_map/set的哈希封装 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】unordered_map/set的哈希封装前言一. 源码及框架分析二.迭代器三.operator[]四.使用哈希表封装unordered_map/set后言 前言 哈…

编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama

​​ 系列文章: 编程AI深度实战:私有模型deep seek r1,必会ollama-CSDN博客 编程AI深度实战:自己的AI,必会LangChain-CSDN博客 编程AI深度实战:给vim装上AI-CSDN博客 编程AI深度实战:火的编…

neo4j-community-5.26.0 install in window10

在住处电脑重新配置一下neo4j, 1.先至官方下载 Neo4j Desktop Download | Free Graph Database Download Neo4j Deployment Center - Graph Database & Analytics 2.配置java jdk jdk 21 官网下载 Java Downloads | Oracle 中国 path: 4.查看java -version 版本 5.n…

网络原理(5)—— 数据链路层详解

目录 一. 以太网 1.1 认识以太网 1.2 网卡与以太网 1.3 以太网帧格式 二. 认识MAC地址 三. MAC地址 与 IP地址 的区别 4.1 定义 4.2 分配方式 4.3 工作层次 4.4 地址格式 4.5 寻址方式 四. ARP协议 4.1 引入 4.2 ARP的概念 4.3 ARP工作原理 五. MTU 与 MSS …

【从零开始的LeetCode-算法】922. 按奇偶排序数组 II

给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。 对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。 你可以返回 任何满足上述条件的…

H264原始码流格式分析

1.H264码流结构组成 H.264裸码流(Raw Bitstream)数据主要由一系列的NALU(网络抽象层单元)组成。每个NALU包含一个NAL头和一个RBSP(原始字节序列载荷)。 1.1 H.264码流层次 H.264码流的结构可以分为两个层…

AI大模型(二)基于Deepseek搭建本地可视化交互UI

AI大模型(二)基于Deepseek搭建本地可视化交互UI DeepSeek开源大模型在榜单上以黑马之姿横扫多项评测,其社区热度指数暴涨、一跃成为近期内影响力最高的话题,这个来自中国团队的模型向世界证明:让每个普通人都能拥有媲…

图的基本术语——非八股文

我之前只看到了数据结构与算法的冰山一角,感觉这些术语只会让知识越来越难理解,现在来看,他们完美抽象一些概念和知识,非常重要。 本篇概念肯定总结不全,只有遇到的会写上,持续更新,之前文章已经…

oracle: 表分区>>范围分区,列表分区,散列分区/哈希分区,间隔分区,参考分区,组合分区,子分区/复合分区/组合分区

分区表 是将一个逻辑上的大表按照特定的规则划分为多个物理上的子表,这些子表称为分区。 分区可以基于不同的维度,如时间、数值范围、字符串值等,将数据分散存储在不同的分区 中,以提高数据管理的效率和查询性能,同时…

本地快速部署DeepSeek-R1模型——2025新年贺岁

一晃年初六了,春节长假余额马上归零了。今天下午在我的电脑上成功部署了DeepSeek-R1模型,抽个时间和大家简单分享一下过程: 概述 DeepSeek模型 是一家由中国知名量化私募巨头幻方量化创立的人工智能公司,致力于开发高效、高性能…

C++11详解(一) -- 列表初始化,右值引用和移动语义

文章目录 1.列表初始化1.1 C98传统的{}1.2 C11中的{}1.3 C11中的std::initializer_list 2.右值引用和移动语义2.1左值和右值2.2左值引用和右值引用2.3 引用延长生命周期2.4左值和右值的参数匹配问题2.5右值引用和移动语义的使用场景2.5.1左值引用主要使用场景2.5.2移动构造和移…

手写MVVM框架-构建虚拟dom树

MVVM的核心之一就是虚拟dom树,我们这一章节就先构建一个虚拟dom树 首先我们需要创建一个VNode的类 // 当前类的位置是src/vnode/index.js export default class VNode{constructor(tag, // 标签名称(英文大写)ele, // 对应真实节点children,…

【大数据技术】教程03:本机PyCharm远程连接虚拟机Python

本机PyCharm远程连接虚拟机Python 注意:本文需要使用PyCharm专业版。 pycharm-professional-2024.1.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本地PyCharm远程连接虚拟机,运行Python脚本,提高编程效率。 注意: …

pytorch实现门控循环单元 (GRU)

人工智能例子汇总:AI常见的算法和例子-CSDN博客 特性GRULSTM计算效率更快,参数更少相对较慢,参数更多结构复杂度只有两个门(更新门和重置门)三个门(输入门、遗忘门、输出门)处理长时依赖一般适…

PAT甲级1032、sharing

题目 To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the same suffix. For example, loading and being are stored as showed in Figure …

最小生成树kruskal算法

文章目录 kruskal算法的思想模板 kruskal算法的思想 模板 #include <bits/stdc.h> #define lowbit(x) ((x)&(-x)) #define int long long #define endl \n #define PII pair<int,int> #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); using na…

为何在Kubernetes容器中以root身份运行存在风险?

作者&#xff1a;马辛瓦西奥内克&#xff08;Marcin Wasiucionek&#xff09; 引言 在Kubernetes安全领域&#xff0c;一个常见的建议是让容器以非root用户身份运行。但是&#xff0c;在容器中以root身份运行&#xff0c;实际会带来哪些安全隐患呢&#xff1f;在Docker镜像和…