吴恩达深度学习——有效运作神经网络
内容来自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)=n1∑i=1n(yi−y^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=1∑n(yi−y^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=1∑mwj2=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)=(x2−x1)2+(y2−y1)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(yi−xi)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 1−p 。这样做的效果是,训练阶段神经元输出的期望值与测试阶段所有神经元都正常工作时的期望值保持一致。
假设一个神经元在未应用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 1−0.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 μ=m1∑i=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=m1∑i=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}}) wij∼N(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}}) wij∼N(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,不是很大,说明该代码是正确的。
步骤(如上图)
- 定义损失函数和参数:明确神经网络的损失函数 J ( θ ) J(\theta) J(θ) 以及需要更新的参数 θ \theta θ。
- 初始化参数:给参数 θ \theta θ 赋予初始值。
- 使用反向传播计算梯度:通过反向传播算法计算损失函数 J ( θ ) J(\theta) J(θ) 关于参数 θ \theta θ 的梯度 ∇ θ J \nabla_{\theta}J ∇θJ(对损失函数求某个参数的导数)。
- 使用数值近似计算梯度:对于参数 θ \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} ∂θi∂J≈2ϵJ(θ1,⋯,θi+ϵ,⋯,θn)−J(θ1,⋯,θi−ϵ,⋯,θn) 计算梯度的近似值。
- 比较两种梯度:计算反向传播得到的梯度 ∇ θ 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=∥∇θJ∥2+∥∇θJapprox∥2∥∇θJ−∇θJapprox∥2
其中 ∥ ⋅ ∥ 2 \|\cdot\|_2 ∥⋅∥2 表示向量的 L2 范数(L2距离)。如果相对误差 d d d 非常小(例如小于 1 0 − 7 10^{-7} 10−7),则说明反向传播算法的实现是正确的;否则,可能存在代码实现错误。
一些建议
- 梯度检验仅用于调试,不能训练过程中使用。
- 若算法未能通过梯度检验,检查各个值,比如如 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变大,模型可能会在这一部分存在问题,因此这个时候在开启梯度检验比较合适。
相关文章:
吴恩达深度学习——有效运作神经网络
内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…...
ollama改模型的存盘目录解决下载大模型报c:盘空间不足的问题
使用Ollama和Open WebUI快速玩转大模型:简单快捷的尝试各种llm大模型,比如DeepSeek r1,非常简单方便,参见:使用Ollama和Open WebUI快速玩转大模型:简单快捷的尝试各种llm大模型,比如DeepSeek r1…...
springboot集成钉钉,发送钉钉日报
目录 1.说明 2.示例 3.总结 1.说明 学习地图 - 钉钉开放平台 在钉钉开放文档中可以查看有关日志相关的api,主要用到以下几个api: ①获取模板详情 ②获取用户发送日志的概要信息 ③获取日志接收人员列表 ④创建日志 发送日志时需要根据模板规定日志…...
Day49:添加字典元素
在 Python 中,字典是一个可变的数据类型,这意味着你可以随时添加新的键值对。今天我们将学习如何向字典中添加元素。 1. 使用方括号 ([]) 添加新元素 最简单的方法是通过字典的键,使用方括号 [] 来添加新的键值对。如果该键已经存在&#x…...
Keepalived 安装
环境介绍 操作系统Kylin Linux Advanced Server V10 (Lance)Kylin Linux Advanced Server V10 (Lance)Kylin Linux Advanced Server V10 (Lance)内核版本Linux 4.19.90-52.22.v2207.ky10.aarch64Linux 4.19.90-52.22.v2207.ky10.aarch64Linux 4.19.90-52.22.v2207.ky10.aarch64…...
AI应用部署——streamlit
如何把项目部署到一个具有公网ip地址的服务器上,让他人看到? 可以利用 streamlit 的社区云免费部署 1、生成requirements.txt文件 终端输入pip freeze > requirements.txt即可 requirements.txt里既包括自己安装过的库,也包括这些库的…...
C++中vector追加vector
在C中,如果你想将一个vector追加到另一个vector的后面,可以使用std::vector的成员函数insert或者std::copy,或者简单地使用std::vector的push_back方法逐个元素添加。这里我将展示几种常用的方法: 方法1:使用insert方…...
普通人可以从DeepSeek工具获得什么帮助?
普通人可以从DeepSeek工具获得多方面的帮助,具体如下: 学习与教育 DeepSeek可以为学生提供作业辅导、知识点整理、论文思路生成等服务,帮助他们更好地理解和掌握学习内容。例如,学生可以通过DeepSeek获得详细的解题步骤和思路&…...
EtherCAT-快速搭建
EtherCAT-快速搭建 快速简介 快速简介 EtherCAT现场总线协议是由德国倍福公司在2003年提出的,该通讯协议拓扑结构十分灵活,数据传输速度快,同步特性好,可以形成各种网络拓扑结构。倍福公司推出了自己的ASIC专用芯片有ET1100和ET1…...
[Collection与数据结构] B树与B+树
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
《大数据时代“快刀”:Flink实时数据处理框架优势全解析》
在数字化浪潮中,数据呈爆发式增长,实时数据处理的重要性愈发凸显。从金融交易的实时风险监控,到电商平台的用户行为分析,各行业都急需能快速处理海量数据的工具。Flink作为一款开源的分布式流处理框架,在这一领域崭露头…...
【AIGC专栏】AI在自然语言中的应用场景
ChatGPT出来以后,突然间整个世界都非常的为之一惊。很多人大喊AI即将读懂人类,虽然这是一句夸大其词的话,但是经过未来几十年的迭代,ChatGPT会变成什么样我们还真的很难说。在当前生成式内容来说,ChatGPT毫无疑问在当前…...
神经网络|(七)概率论基础知识-贝叶斯公式
【1】引言 前序我们已经了解了一些基础知识。 古典概型:有限个元素参与抽样,每个元素被抽样的概率相等。 条件概率:在某条件已经达成的前提下,新事件发生的概率。实际计算的时候,应注意区分,如果是计算综…...
数科OFD证照生成原理剖析与平替方案实现
数科OFD证照生成原理剖析及C#平替方案实现 1. OFD证照生成原理 OFD(Open Fixed-layout Document)是一种基于XML的固定版式文档格式,广泛应用于电子发票、电子证照等领域。数科OFD证照生成工具的核心原理包括以下几个方面: OFD文…...
未来无线技术的发展方向
未来无线技术的发展趋势呈现出多样化、融合化的特点,涵盖速度、覆盖范围、应用领域、频段利用、安全性等多个方面。这些趋势将深刻改变人们的生活和社会的运行方式。 传输速度提升:Wi-Fi 技术迭代加快,如 Wi-Fi7 理论峰值速率达 46Gbps&#…...
验证二叉搜索数(98)
98. 验证二叉搜索树 - 力扣(LeetCode) 解法: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...
Day51:type()函数
在 Python 中,type() 是一个内置函数,用于返回对象的类型。它可以用于检查变量的类型,也可以用于动态创建新的类型。今天,我们将深入了解 type() 函数的使用方法。 1. 使用 type() 获取变量的类型 最常见的使用方式是将一个对象…...
DeepSeek-R1大模型本地部署及简单测试
目录 DeepSeek-R1大模型本地部署及简单测试背景我的测试环境模型参数选择适用场景参数规模 本地部署安装 DeepSeek-R1大模型本地部署及简单测试 背景 最近deepseek非常火, 要说2025年震惊科技圈的事件要数DeepSeek这个国产AI的横空出世,这是一款免费、开源且隐私优…...
【OpenGL】OpenGL游戏案例(二)
文章目录 特殊效果数据结构生成逻辑更新逻辑 文本渲染类结构构造函数加载函数渲染函数 特殊效果 为提高游戏的趣味性,在游戏中提供了六种特殊效果。 数据结构 PowerUp 类只存储存活数据,实际逻辑在游戏代码中通过Type字段来区分执行 class PowerUp …...
AI学习指南Ollama篇-使用Ollama构建自己的私有化知识库
一、引言 (一)背景介绍 随着企业对数据隐私和效率的重视,私有化知识库的需求日益增长。私有化知识库不仅可以保护企业数据的安全性,还能提供高效的知识管理和问答系统,提升企业内部的工作效率和创新能力。 (二)Ollama和AnythingLLM的结合 Ollama和AnythingLLM的结合…...
灵芝黄金基因组注释-文献精读109
The golden genome annotation of Ganoderma lingzhi reveals a more complex scenario of eukaryotic gene structure and transcription activity 灵芝(Ganoderma lingzhi)的黄金基因组注释揭示了更复杂的真核基因结构和转录活性情况 摘要 背景 普遍…...
【Proteus仿真】【51单片机】多功能计算器系统设计
目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键 3、加减乘除,开方运算 4、带符号运算 5、最大 999*999 二、使用步骤 基于51单片机多功能计算器 包含:程序&…...
MySQL数据类型转换应注意什么?
文章目录 1. **隐式转换**2. **显式转换**3. **数据截断**4. **字符集与排序规则**5. **日期和时间转换**6. **数值转换**7. **NULL 处理**8. **性能影响**9. **错误处理**10. **函数选择**示例总结 在 MySQL 中进行数据类型转换时,需要注意以下几个关键点ÿ…...
【LLM-agent】(task1)简单客服和阅卷智能体
note 一个完整的agent有模型 (Model)、工具 (Tools)、编排层 (Orchestration Layer)一个好的结构化 Prompt 模板,某种意义上是构建了一个好的全局思维链。 如 LangGPT 中展示的模板设计时就考虑了如下思维链:Role (角色) -> Profile(角色…...
【Linux】使用管道实现一个简易版本的进程池
文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程: 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…...
新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战
生成式人工智能的发展既带来了有益的生产力转型机会,也提供了被恶意利用的机会。 最近,Abnormal Security的研究人员发现了一个专门为网络犯罪创建的无审查AI聊天机器人——GhostGPT,是人工智能用于非法活动的新前沿,可以被用于网…...
力扣017_最小覆盖字串题解----C++
题目描述 我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」现有窗口的 r 指针,和一个用于「收缩」窗口的 l 指针。在任意时刻,只有一个指针运动,而另一个保持静止。我们在 s 上滑动…...
C++:函数
在之前的博客中已经讲过了C语言中的函数概念了,重复的内容就不赘述了。C中的函数在C语言的基础上还有些补充,在这里说明一下。 一、引用 1.引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变…...
linux asio网络编程理论及实现
最近在B站看了恋恋风辰大佬的asio网络编程,质量非常高。在本章中将对ASIO异步网络编程的整体及一些实现细节进行完整的梳理,用于复习与分享。大佬的博客:恋恋风辰官方博客 Preactor/Reactor模式 在网络编程中,通常根据事件处理的触…...
第一篇:数据库基础与概念
第一篇:数据库基础与概念 目标读者: 没有接触过数据库的初学者。 内容概述: 在本篇文章中,我们将从零开始,详细介绍数据库的基本概念、常见的数据库管理系统(DBMS)以及数据库设计的基础知识…...
从理论到实践:Django 业务日志配置与优化指南
在现代 Web 开发中,日志记录是确保系统可维护性和可观测性的重要手段。通过合理的日志配置,我们可以快速定位问题、分析系统性能,并进行安全审计。本文将围绕 Django 框架,详细介绍如何配置和优化业务日志,确保开发环境和生产环境都能高效地记录和管理日志。 © ivwdc…...
基于Python的药物相互作用预测模型AI构建与优化(上.文字部分)
一、引言 1.1 研究背景与意义 在临床用药过程中,药物相互作用(Drug - Drug Interaction, DDI)是一个不可忽视的重要问题。当患者同时服用两种或两种以上药物时,药物之间可能会发生相互作用,从而改变药物的疗效、增加不良反应的发生风险,甚至危及患者的生命安全。例如,…...
常用的 ASCII 码表字符
ASCII(美国信息交换标准代码,American Standard Code for Information Interchange)是一种字符编码标准,用于表示英文字符、数字、标点符号以及一些控制字符。ASCII 码表包含 128 个字符,每个字符用 7 位二进制数表示&…...
AI大模型开发原理篇-8:Transformer模型
近几年人工智能之所以能迅猛发展,主要是靠2个核心思想:注意力机制Attention Mechanism 和 Transformer模型。本次来浅谈下Transformer模型。 重要性 Transformer模型在自然语言处理领域具有极其重要的地位,为NLP带来了革命性的突破。可以…...
Golang 并发机制-2:Golang Goroutine 和竞争条件
在今天的软件开发中,我们正在使用并发的概念,它允许一次执行多个任务。在Go编程中,理解Go例程是至关重要的。本文试图详细解释什么是例程,它们有多轻,通过简单地使用“go”关键字创建它们,以及可能出现的竞…...
NVLink 拓扑、DGX 硬件渲染图
文章目录 一个 server 固定 8 个GPUP100(4个NVL)V100(6个NVL)A100(12个NVL)H100(18个NVL)【DGX-2 :2018年发布NVSwitch,实现full-mesh】【NVLink 拓扑&#x…...
Python XML 解析
Python XML 解析 引言 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。Python 作为一种功能强大的编程语言,拥有多种解析 XML 的库,如 xml.etree.ElementTree 和 lxml。本文将详细介绍 Python 中 XML 解析的方法、技巧和注意事项,帮助您更好地掌握 XML 数据的…...
java求职学习day22
MySQL 基础 &SQL 入门 1. 数据库的基本概念 1.1 什么是数据库 1. 数据库 (DataBase) 就是 存储 和 管理 数据的仓库 2. 其本质是一个文件系统, 还是以文件的方式,将数据保存在电脑上 1.2 为什么使用数据库 数据存储方式的比较 通过上面的比较 , 我们可以看出 , 使…...
stm32教程:EXTI外部中断应用
早上好啊大佬们,上一期我们讲了EXTI外部中断的原理以及基础代码的书写,这一期就来尝试一下用它来写一些有实际效能的工程吧。 这一期里,我用两个案例代码来让大家感受一下外部中断的作用和使用价值。 旋转编码器计数 整体思路讲解 这里&…...
OVS-DPDK
dpdk介绍及应用 DPDK介绍 DPDK(Data Plane Development Kit)是一组快速处理数据包的开发平台及接口。有intel主导开发,主要基于Linux系统,用于快速数据包处理的函 数库与驱动集合,可以极大提高数据处理性能和吞吐量&…...
快速分析LabVIEW主要特征进行判断
在LabVIEW中,快速分析程序特征进行判断是提升开发效率和减少调试时间的重要技巧。本文将介绍如何高效地识别和分析程序的关键特征,从而帮助开发者在编写和优化程序时做出及时的判断,避免不必要的错误。 数据流和并行性分析 LabVIEW的图形…...
MySQL数据库(二)
一 DDL (一 数据库操作 1 查询-数据库(所有/当前) 1 所有数据库: show databases; 2 查询当前数据库: select database(); 2 创建-数据库 可以定义数据库的编码方式 create database if not exists ax1; create database ax2…...
Python 梯度下降法(五):Adam Optimize
文章目录 Python 梯度下降法(五):Adam Optimize一、数学原理1.1 介绍1.2 符号说明1.3 实现流程 二、代码实现2.1 函数代码2.2 总代码2.3 遇到的问题2.4 算法优化 三、优缺点3.1 优点3.2 缺点 Python 梯度下降法(五)&am…...
表格结构标签
<!-- thead表示表格的头部 tbody表示表格的主体 --> <thead></thead> <tbody></tbody> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&q…...
gcc和g++的区别以及明明函数有定义为何链接找不到
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
Git进阶之旅:tag 标签 IDEA 整合 Git
第一章:tag 标签远程管理 git 标签 tag 管理: 标签有两种: 轻量级标签(lightweight)带有附注标签(annotated) git tag 标签名:创建一个标签git tag 标签名 -m 附注内容 :创建一个附注标签git tag -d 标签名…...
计算机网络一点事(24)
TCP可靠传输,流量控制 可靠传输:每字节对应一个序号 累计确认:收到ack则正确接收 返回ack推迟确认(不超过0.5s) 两种ack:专门确认(只有首部无数据) 捎带确认(带数据…...
集合的奇妙世界:Python集合的经典、避坑与实战
集合的奇妙世界:Python集合的经典、避坑与实战 内容简介 本系列文章是为 Python3 学习者精心设计的一套全面、实用的学习指南,旨在帮助读者从基础入门到项目实战,全面提升编程能力。文章结构由 5 个版块组成,内容层层递进&#x…...
ubuntu20.04.6下运行VLC-Qt例子simple-player
下载examples-master.zip(https://github.com/vlc-qt/examples),编译运行simple-player 参考链接: https://blog.csdn.net/szn1316159505/article/details/143743735 本文运行环境 Qt 5.15.2 Qt creator 5.0.2 主要步骤…...
Node.js MySQL:深度解析与最佳实践
Node.js MySQL:深度解析与最佳实践 引言 Node.js作为一种流行的JavaScript运行时环境,以其轻量级、高性能和事件驱动模型受到开发者的青睐。MySQL则是一款功能强大的关系型数据库管理系统,广泛应用于各种规模的应用程序中。本文将深入探讨Node.js与MySQL的集成,分析其优势…...