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

【深度学习】分布偏移纠正

分布偏移纠正

正如我们所讨论的,在许多情况下训练和测试分布 P ( x , y ) P(\mathbf{x}, y) P(x,y)是不同的。
在一些情况下,我们很幸运,不管协变量、标签或概念如何发生偏移,模型都能正常工作。
在另一些情况下,我们可以通过运用策略来应对这种偏移,从而做得更好。
本节的其余部分将着重于应对这种偏移的技术细节。

经验风险与实际风险

首先我们反思一下在模型训练期间到底发生了什么?
训练数据 { ( x 1 , y 1 ) , … , ( x n , y n ) } \{(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_n, y_n)\} {(x1,y1),,(xn,yn)}的特征和相关的标签经过迭代,在每一个小批量之后更新模型 f f f的参数。
为了简单起见,我们不考虑正则化,因此极大地降低了训练损失:

m i n i m i z e f 1 n ∑ i = 1 n l ( f ( x i ) , y i ) , \mathop{\mathrm{minimize}}_f \frac{1}{n} \sum_{i=1}^n l(f(\mathbf{x}_i), y_i), minimizefn1i=1nl(f(xi),yi),

其中 l l l是损失函数,用来度量:给定标签 y i y_i yi,预测 f ( x i ) f(\mathbf{x}_i) f(xi)的“糟糕程度”。

统计学家称上式(式4.9.1)中的这一项为经验风险。经验风险(empirical risk)是为了近似 真实风险(true risk),
整个训练数据上的平均损失,即从其真实分布 p ( x , y ) p(\mathbf{x},y) p(x,y)中抽取的所有数据的总体损失的期望值:

E p ( x , y ) [ l ( f ( x ) , y ) ] = ∫ ∫ l ( f ( x ) , y ) p ( x , y ) d x d y . E_{p(\mathbf{x}, y)} [l(f(\mathbf{x}), y)] = \int\int l(f(\mathbf{x}), y) p(\mathbf{x}, y) \;d\mathbf{x}dy. Ep(x,y)[l(f(x),y)]=∫∫l(f(x),y)p(x,y)dxdy.

然而在实践中,我们通常无法获得总体数据。
因此,经验风险最小化即在式4.9.1中最小化经验风险,是一种实用的机器学习策略,希望能近似最小化真实风险。

协变量偏移纠正

假设对于带标签的数据 ( x i , y i ) (\mathbf{x}_i, y_i) (xi,yi),我们要评估 P ( y ∣ x ) P(y \mid \mathbf{x}) P(yx)
然而观测值 x i \mathbf{x}_i xi是从某些源分布 q ( x ) q(\mathbf{x}) q(x)中得出的,而不是从目标分布 p ( x ) p(\mathbf{x}) p(x)中得出的。

幸运的是,依赖性假设意味着条件分布保持不变,即:
p ( y ∣ x ) = q ( y ∣ x ) p(y \mid \mathbf{x}) = q(y \mid \mathbf{x}) p(yx)=q(yx)
如果源分布 q ( x ) q(\mathbf{x}) q(x)是“错误的”,我们可以通过在真实风险的计算中,使用以下简单的恒等式来进行纠正:

∫ ∫ l ( f ( x ) , y ) p ( y ∣ x ) p ( x ) d x d y = ∫ ∫ l ( f ( x ) , y ) q ( y ∣ x ) q ( x ) p ( x ) q ( x ) d x d y . \begin{aligned} \int\int l(f(\mathbf{x}), y) p(y \mid \mathbf{x})p(\mathbf{x}) \;d\mathbf{x}dy = \int\int l(f(\mathbf{x}), y) q(y \mid \mathbf{x})q(\mathbf{x})\frac{p(\mathbf{x})}{q(\mathbf{x})} \;d\mathbf{x}dy. \end{aligned} ∫∫l(f(x),y)p(yx)p(x)dxdy=∫∫l(f(x),y)q(yx)q(x)q(x)p(x)dxdy.

换句话说,我们需要根据数据来自正确分布与来自错误分布的概率之比,来重新衡量每个数据样本的权重:

β i = d e f p ( x i ) q ( x i ) . \beta_i \stackrel{\mathrm{def}}{=} \frac{p(\mathbf{x}_i)}{q(\mathbf{x}_i)}. βi=defq(xi)p(xi).

将权重 β i \beta_i βi代入到每个数据样本 ( x i , y i ) (\mathbf{x}_i, y_i) (xi,yi)中,
我们可以使用”加权经验风险最小化“来训练模型(式4.9.5):

m i n i m i z e f 1 n ∑ i = 1 n β i l ( f ( x i ) , y i ) . \mathop{\mathrm{minimize}}_f \frac{1}{n} \sum_{i=1}^n \beta_i l(f(\mathbf{x}_i), y_i). minimizefn1i=1nβil(f(xi),yi).

由于不知道这个比率,我们需要估计它。
有许多方法都可以用,包括一些花哨的算子理论方法,试图直接使用最小范数或最大熵原理重新校准期望算子。

对于任意一种这样的方法,我们都需要从两个分布中抽取样本:
“真实”的分布 p p p,通过访问测试数据获取;训练集 q q q,通过人工合成的很容易获得。
请注意,我们只需要特征 x ∼ p ( x ) \mathbf{x} \sim p(\mathbf{x}) xp(x),不需要访问标签 y ∼ p ( y ) y \sim p(y) yp(y)

在这种情况下,有一种非常有效的方法可以得到几乎与原始方法一样好的结果:对数几率回归(logistic regression)。这是用于二元分类的softmax回归的一个特例。

综上所述,我们学习了一个分类器来区分从 p ( x ) p(\mathbf{x}) p(x)抽取的数据和从 q ( x ) q(\mathbf{x}) q(x)抽取的数据。
如果无法区分这两个分布,则意味着相关的样本可能来自这两个分布中的任何一个。
另一方面,任何可以很好区分的样本都应该相应地显著增加或减少权重。

为了简单起见,假设我们分别从 p ( x ) p(\mathbf{x}) p(x) q ( x ) q(\mathbf{x}) q(x)两个分布中抽取相同数量的样本。
现在用 z z z标签表示:从 p p p抽取的数据为 1 1 1,从 q q q抽取的数据为 − 1 -1 1
然后,混合数据集中的概率由下式给出

P ( z = 1 ∣ x ) = p ( x ) p ( x ) + q ( x ) and hence  P ( z = 1 ∣ x ) P ( z = − 1 ∣ x ) = p ( x ) q ( x ) . P(z=1 \mid \mathbf{x}) = \frac{p(\mathbf{x})}{p(\mathbf{x})+q(\mathbf{x})} \text{ and hence } \frac{P(z=1 \mid \mathbf{x})}{P(z=-1 \mid \mathbf{x})} = \frac{p(\mathbf{x})}{q(\mathbf{x})}. P(z=1x)=p(x)+q(x)p(x) and hence P(z=1x)P(z=1x)=q(x)p(x).

因此,如果我们使用对数几率回归方法,其中 P ( z = 1 ∣ x ) = 1 1 + exp ⁡ ( − h ( x ) ) P(z=1 \mid \mathbf{x})=\frac{1}{1+\exp(-h(\mathbf{x}))} P(z=1x)=1+exp(h(x))1 h h h是一个参数化函数),则很自然有:

β i = 1 / ( 1 + exp ⁡ ( − h ( x i ) ) ) exp ⁡ ( − h ( x i ) ) / ( 1 + exp ⁡ ( − h ( x i ) ) ) = exp ⁡ ( h ( x i ) ) . \beta_i = \frac{1/(1 + \exp(-h(\mathbf{x}_i)))}{\exp(-h(\mathbf{x}_i))/(1 + \exp(-h(\mathbf{x}_i)))} = \exp(h(\mathbf{x}_i)). βi=exp(h(xi))/(1+exp(h(xi)))1/(1+exp(h(xi)))=exp(h(xi)).

因此,我们需要解决两个问题:
第一个问题是关于区分来自两个分布的数据;
第二个问题是关于式4.9.5中的加权经验风险的最小化问题。
在这个问题中,我们将对其中的项加权 β i \beta_i βi

现在,我们来看一下完整的协变量偏移纠正算法
假设我们有一个训练集 { ( x 1 , y 1 ) , … , ( x n , y n ) } \{(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_n, y_n)\} {(x1,y1),,(xn,yn)}和一个未标记的测试集 { u 1 , … , u m } \{\mathbf{u}_1, \ldots, \mathbf{u}_m\} {u1,,um}
对于协变量偏移,我们假设 1 ≤ i ≤ n 1 \leq i \leq n 1in x i \mathbf{x}_i xi来自某个源分布, u i \mathbf{u}_i ui来自目标分布。
以下是纠正协变量偏移的典型算法:

  1. 生成一个二元分类训练集: { ( x 1 , − 1 ) , … , ( x n , − 1 ) , ( u 1 , 1 ) , … , ( u m , 1 ) } \{(\mathbf{x}_1, -1), \ldots, (\mathbf{x}_n, -1), (\mathbf{u}_1, 1), \ldots, (\mathbf{u}_m, 1)\} {(x1,1),,(xn,1),(u1,1),,(um,1)}
  2. 用对数几率回归训练二元分类器得到函数 h h h
  3. 使用 β i = exp ⁡ ( h ( x i ) ) \beta_i = \exp(h(\mathbf{x}_i)) βi=exp(h(xi))或更好的 β i = min ⁡ ( exp ⁡ ( h ( x i ) ) , c ) \beta_i = \min(\exp(h(\mathbf{x}_i)), c) βi=min(exp(h(xi)),c) c c c为常量)对训练数据进行加权。
  4. 使用权重 β i \beta_i βi进行式4.9.5 { ( x 1 , y 1 ) , … , ( x n , y n ) } \{(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_n, y_n)\} {(x1,y1),,(xn,yn)}的训练。

请注意,上述算法依赖于一个重要的假设:
需要目标分布(例如,测试分布)中的每个数据样本在训练时出现的概率非零。
如果我们找到 p ( x ) > 0 p(\mathbf{x}) > 0 p(x)>0 q ( x ) = 0 q(\mathbf{x}) = 0 q(x)=0的点,那么相应的重要性权重会是无穷大。

标签偏移纠正

假设我们处理的是 k k k个类别的分类任务。

q q q p p p中分别是源分布(例如训练时的分布)和目标分布(例如测试时的分布)。
假设标签的分布随时间变化: q ( y ) ≠ p ( y ) q(y) \neq p(y) q(y)=p(y),但类别条件分布保持不变: q ( x ∣ y ) = p ( x ∣ y ) q(\mathbf{x} \mid y)=p(\mathbf{x} \mid y) q(xy)=p(xy)
如果源分布 q ( y ) q(y) q(y)是“错误的”,我们可以根据定义的真实风险中的恒等式进行更正:

∫ ∫ l ( f ( x ) , y ) p ( x ∣ y ) p ( y ) d x d y = ∫ ∫ l ( f ( x ) , y ) q ( x ∣ y ) q ( y ) p ( y ) q ( y ) d x d y . \begin{aligned} \int\int l(f(\mathbf{x}), y) p(\mathbf{x} \mid y)p(y) \;d\mathbf{x}dy = \int\int l(f(\mathbf{x}), y) q(\mathbf{x} \mid y)q(y)\frac{p(y)}{q(y)} \;d\mathbf{x}dy. \end{aligned} ∫∫l(f(x),y)p(xy)p(y)dxdy=∫∫l(f(x),y)q(xy)q(y)q(y)p(y)dxdy.

这里,重要性权重将对应于标签似然比率

β i = d e f p ( y i ) q ( y i ) . \beta_i \stackrel{\mathrm{def}}{=} \frac{p(y_i)}{q(y_i)}. βi=defq(yi)p(yi).

标签偏移的一个好处是,如果我们在源分布上有一个相当好的模型,那么我们可以得到对这些权重的一致估计,而不需要处理周边的其他维度。
在深度学习中,输入往往是高维对象(如图像),而标签通常是低维(如类别)。

为了估计目标标签分布,我们首先采用性能相当好的现成的分类器(通常基于训练数据进行训练),并使用验证集(也来自训练分布)计算其混淆矩阵。

混淆矩阵 C \mathbf{C} C是一个 k × k k \times k k×k矩阵,其中每列对应于标签类别,每行对应于模型的预测类别。
每个单元格的值 c i j c_{ij} cij是验证集中,真实标签为 j j j,而我们的模型预测为 i i i的样本数量所占的比例。

现在,我们不能直接计算目标数据上的混淆矩阵,因为我们无法看到真实环境下的样本的标签,除非我们再搭建一个复杂的实时标注流程。
然而,我们所能做的是将所有模型在测试时的预测取平均数,得到平均模型输出 μ ( y ^ ) ∈ R k \mu(\hat{\mathbf{y}}) \in \mathbb{R}^k μ(y^)Rk,其中第 i i i个元素 μ ( y ^ i ) \mu(\hat{y}_i) μ(y^i)是我们模型预测测试集中 i i i的总预测分数。

结果表明,如果我们的分类器一开始就相当准确,并且目标数据只包含我们以前见过的类别,以及如果标签偏移假设成立(这里最强的假设),我们就可以通过求解一个简单的线性系统来估计测试集的标签分布

C p ( y ) = μ ( y ^ ) , \mathbf{C} p(\mathbf{y}) = \mu(\hat{\mathbf{y}}), Cp(y)=μ(y^),

因为作为一个估计, ∑ j = 1 k c i j p ( y j ) = μ ( y ^ i ) \sum_{j=1}^k c_{ij} p(y_j) = \mu(\hat{y}_i) j=1kcijp(yj)=μ(y^i)对所有 1 ≤ i ≤ k 1 \leq i \leq k 1ik成立,其中 p ( y j ) p(y_j) p(yj) k k k维标签分布向量 p ( y ) p(\mathbf{y}) p(y)的第 j t h j^\mathrm{th} jth元素。
如果我们的分类器一开始就足够精确,那么混淆矩阵 C \mathbf{C} C将是可逆的,进而我们可以得到一个解 p ( y ) = C − 1 μ ( y ^ ) p(\mathbf{y}) = \mathbf{C}^{-1} \mu(\hat{\mathbf{y}}) p(y)=C1μ(y^)

因为我们观测源数据上的标签,所以很容易估计分布 q ( y ) q(y) q(y)
那么对于标签为 y i y_i yi的任何训练样本 i i i,我们可以使用我们估计的 p ( y i ) / q ( y i ) p(y_i)/q(y_i) p(yi)/q(yi)比率来计算权重 β i \beta_i βi,并将其代入 式4.9.5中的加权经验风险最小化中。

概念偏移纠正

概念偏移很难用原则性的方式解决。
例如,在一个问题突然从“区分猫和狗”偏移为“区分白色和黑色动物”的情况下,除了从零开始收集新标签和训练,别无妙方。
幸运的是,在实践中这种极端的偏移是罕见的。
相反,通常情况下,概念的变化总是缓慢的。
比如下面是一些例子:

  • 在计算广告中,新产品推出后,旧产品变得不那么受欢迎了。这意味着广告的分布和受欢迎程度是逐渐变化的,任何点击率预测器都需要随之逐渐变化;
  • 由于环境的磨损,交通摄像头的镜头会逐渐退化,影响摄像头的图像质量;
  • 新闻内容逐渐变化(即新新闻的出现)。

在这种情况下,我们可以使用与训练网络相同的方法,使其适应数据的变化。
换言之,我们使用新数据更新现有的网络权重,而不是从头开始训练。

学习问题的分类法

有了如何处理分布变化的知识,我们现在可以考虑机器学习问题形式化的其他方面。

批量学习

批量学习(batch learning)中,我们可以访问一组训练特征和标签 { ( x 1 , y 1 ) , … , ( x n , y n ) } \{(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_n, y_n)\} {(x1,y1),,(xn,yn)},我们使用这些特性和标签训练 f ( x ) f(\mathbf{x}) f(x)
然后,我们部署此模型来对来自同一分布的新数据 ( x , y ) (\mathbf{x}, y) (x,y)进行评分。
例如,我们可以根据猫和狗的大量图片训练猫检测器。
一旦我们训练了它,我们就把它作为智能猫门计算视觉系统的一部分,来控制只允许猫进入。
然后这个系统会被安装在客户家中,基本再也不会更新。

在线学习

除了“批量”地学习,我们还可以单个“在线”学习数据 ( x i , y i ) (\mathbf{x}_i, y_i) (xi,yi)
更具体地说,我们首先观测到 x i \mathbf{x}_i xi,然后我们得出一个估计值 f ( x i ) f(\mathbf{x}_i) f(xi),只有当我们做到这一点后,我们才观测到 y i y_i yi
然后根据我们的决定,我们会得到奖励或损失。许多实际问题都属于这一类。
例如,我们需要预测明天的股票价格,这样我们就可以根据这个预测进行交易。在一天结束时,我们会评估我们的预测是否盈利。
换句话说,在在线学习(online learning)中,我们有以下的循环。
在这个循环中,给定新的观测结果,我们会不断地改进我们的模型。

m o d e l f t ⟶ d a t a x t ⟶ e s t i m a t e f t ( x t ) ⟶ o b s e r v a t i o n y t ⟶ l o s s l ( y t , f t ( x t ) ) ⟶ m o d e l f t + 1 \mathrm{model} ~ f_t \longrightarrow \mathrm{data} ~ \mathbf{x}_t \longrightarrow \mathrm{estimate} ~ f_t(\mathbf{x}_t) \longrightarrow \mathrm{observation} ~ y_t \longrightarrow \mathrm{loss} ~ l(y_t, f_t(\mathbf{x}_t)) \longrightarrow \mathrm{model} ~ f_{t+1} model ftdata xtestimate ft(xt)observation ytloss l(yt,ft(xt))model ft+1

老虎机

老虎机(bandits)是上述问题的一个特例。
虽然在大多数学习问题中,我们有一个连续参数化的函数 f f f(例如,一个深度网络)。
但在一个老虎机问题中,我们只有有限数量的手臂可以拉动。
也就是说,我们可以采取的行动是有限的。
对于这个更简单的问题,可以获得更强的最优性理论保证,这并不令人惊讶。
我们之所以列出它,主要是因为这个问题经常被视为一个单独的学习问题的情景。

控制

在很多情况下,环境会记住我们所做的事。
不一定是以一种对抗的方式,但它会记住,而且它的反应将取决于之前发生的事情。
例如,咖啡锅炉控制器将根据之前是否加热锅炉来观测到不同的温度。
在这种情况下,PID(比例—积分—微分)控制器算法是一个流行的选择。
同样,一个用户在新闻网站上的行为将取决于之前向她展示的内容(例如,大多数新闻她只阅读一次)。
许多这样的算法形成了一个环境模型,在这个模型中,他们的行为使得他们的决策看起来不那么随机。
近年来,控制理论(如PID的变体)也被用于自动调整超参数,以获得更好的解构和重建质量,提高生成文本的多样性和生成图像的重建质量

强化学习

强化学习(reinforcement learning)强调如何基于环境而行动,以取得最大化的预期利益。
国际象棋、围棋、西洋双陆棋或星际争霸都是强化学习的应用实例。
再比如,为自动驾驶汽车制造一个控制器,或者以其他方式对自动驾驶汽车的驾驶方式做出反应
(例如,试图避开某物体,试图造成事故,或者试图与其合作)。

考虑到环境

上述不同情况之间的一个关键区别是:
在静止环境中可能一直有效的相同策略,在环境能够改变的情况下可能不会始终有效。
例如,一个交易者发现的套利机会很可能在他开始利用它时就消失了。
环境变化的速度和方式在很大程度上决定了我们可以采用的算法类型。
例如,如果我们知道事情只会缓慢地变化,就可以迫使任何估计也只能缓慢地发生改变。
如果我们知道环境可能会瞬间发生变化,但这种变化非常罕见,我们就可以在使用算法时考虑到这一点。
当一个数据科学家试图解决的问题会随着时间的推移而发生变化时,这些类型的知识至关重要。

机器学习中的公平、责任和透明度

最后,重要的是,当我们部署机器学习系统时,不仅仅是在优化一个预测模型,而通常是在提供一个会被用来(部分或完全)进行自动化决策的工具。
这些技术系统可能会通过其进行的决定而影响到每个人的生活。

从考虑预测到决策的飞跃不仅提出了新的技术问题,而且还提出了一系列必须仔细考虑的伦理问题。
如果我们正在部署一个医疗诊断系统,我们需要知道它可能适用于哪些人群,哪些人群可能无效。
忽视对一个亚群体的幸福的可预见风险可能会导致我们执行劣质的护理水平。
此外,一旦我们规划整个决策系统,我们必须退后一步,重新考虑如何评估我们的技术。
在这个视野变化所导致的结果中,我们会发现精度很少成为合适的衡量标准。
例如,当我们将预测转化为行动时,我们通常会考虑到各种方式犯错的潜在成本敏感性。
举个例子:将图像错误地分到某一类别可能被视为种族歧视,而错误地分到另一个类别是无害的,
那么我们可能需要相应地调整我们的阈值,在设计决策方式时考虑到这些社会价值。我们还需要注意预测系统如何导致反馈循环。
例如,考虑预测性警务系统,它将巡逻人员分配到预测犯罪率较高的地区。
很容易看出一种令人担忧的模式是如何出现的:

  1. 犯罪率高的社区会得到更多的巡逻;
  2. 因此,在这些社区中会发现更多的犯罪行为,输入可用于未来迭代的训练数据;
  3. 面对更多的积极因素,该模型预测这些社区还会有更多的犯罪;
  4. 下一次迭代中,更新后的模型会更加倾向于针对同一个地区,这会导致更多的犯罪行为被发现等等。

通常,在建模纠正过程中,模型的预测与训练数据耦合的各种机制都没有得到解释,研究人员称之为“失控反馈循环”的现象。
此外,我们首先要注意我们是否解决了正确的问题。
比如,预测算法现在在信息传播中起着巨大的中介作用,个人看到的新闻应该由他们喜欢的Facebook页面决定吗?
这些只是在机器学习职业生涯中可能遇到的令人感到“压力山大”的道德困境中的一小部分。

相关文章:

【深度学习】分布偏移纠正

分布偏移纠正 正如我们所讨论的,在许多情况下训练和测试分布 P ( x , y ) P(\mathbf{x}, y) P(x,y)是不同的。 在一些情况下,我们很幸运,不管协变量、标签或概念如何发生偏移,模型都能正常工作。 在另一些情况下,我们…...

数据结构_前言

本次我们将进入一个新的阶段啦~ 要注意哦: 在学数据结构之前,我们要先掌握c语言中所学的指针、结构体、内存的存储这几部分,如果还没太掌握的话,那记得去复习回顾一下噢。 下面我们就一起进入数据结构的学习吧! 知识…...

spark任务运行

运行环境 在这里插入代码片 [roothadoop000 conf]# java -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01)[roothadoop000 conf]# echo $JAVA_HOME /home/hadoop/app/jdk1.8.0_144[roothadoop000 conf]# vi spark-env.sh …...

由because it is a JDK dynamic proxy that implements温习Spring的代理

由because it is a JDK dynamic proxy that implements温习Spring的代理 项目场景原因分析1、报错位置2、错误原因3、业务需求 解决方案1、注入CGlib代理2、取出原生对象 项目场景 昨日在启动一个SpringBoot项目时,发现启动失败,并在日志中出现了这样的…...

mac相关命令

显示和隐藏usr等隐藏文件文件 terminal输入: defaults write com.apple.Finder AppleShowAllFiles YESdefaults write com.apple.Finder AppleShowAllFiles NO让.bashrc每次启动shell自动生效 编辑vim ~/.bash_profile 文件, 加上 if [ -f ~/.bashrc ]; then. ~/.bashrc fi注…...

Banana Pi OpenWRT One 官方路由器的第一印象

OpenWRT One是OpenWRT开源社区推出的首款官方开发板,与Banana Pi社区共同设计,由Banana Pi制造和发行。路由器采用蓝色铝合金外壳,质感极佳,视觉效果远超宣传图。整体设计简洁,呈长方形,虽然不是特别时尚&a…...

基于SpringBoot的“高考志愿智能推荐系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“高考志愿智能推荐系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统首页界面 系统注册页…...

探索Hugging Face:开源AI社区的核心工具与应用实践

引言:AI民主化的先锋 在自然语言处理(NLP)领域,Hugging Face已成为开源社区的代名词。这个成立于2016年的平台,通过提供易用的工具和丰富的预训练模型库,彻底改变了开发者使用和部署AI模型的方式。截至202…...

SVM对偶问题

1、对偶问题数学基础 对偶问题:在线性规划中,每一个线性规划问题(称为原问题)都有一个与之对应的对偶问题。从数学形式上看,如果原问题是求解一个线性目标函数的最大值(或最小值),在满足一系列线性不等式&…...

萃取的实现(三)

探测成员 基于SFINAE&#xff0c;判断一个给定类型T&#xff0c;是否含有名为x的成员。 探测类型成员 判断一个给定类型T&#xff0c;是否含有类型成员size_type&#xff0c;源码如下&#xff1a; #include <type_traits> #include <iostream> #include <vect…...

nodejs版本管理,使用 nvm 删除node版本,要删除 Node.js 的某个版本详细操作

要删除 Node.js 的某个版本并保持 Node Version Manager (nvm) 的管理整洁&#xff0c;可以按以下步骤操作&#xff1a; 步骤 1&#xff1a;查看已安装的 Node.js 版本 nvm ls这会列出你通过 nvm 安装的所有 Node.js 版本。输出类似于&#xff1a; -> v18.17.1v16.20…...

openCV中如何实现滤波

图像滤波用于去除噪声和图像平滑&#xff0c;OpenCV 提供了多种滤波器&#xff1a; 1.1. 均值滤波&#xff1a; import cv2# 读取图像 image cv2.imread("example.jpg")# 均值滤波 blurred_image cv2.blur(image, (5, 5)) # (5, 5) 是滤波核的大小 滤波核大小的…...

vscode通过ssh连接服务器实现免密登录+删除

文章目录 参考&#xff1a; 1、 vscode通过ssh连接服务器实现免密登录删除&#xff08;吐血总结&#xff09;...

智能硬件新时代,EasyRTC开启物联音视频新纪元

在万物互联的时代浪潮中&#xff0c;智能硬件正以前所未有的速度融入我们的生活&#xff0c;从智能家居的便捷控制&#xff0c;到智能穿戴设备的健康监测&#xff0c;再到工业物联网的高效管理&#xff0c;智能硬件的应用场景不断拓展。而在这个智能硬件蓬勃发展的背后&#xf…...

《机器学习数学基础》补充资料:求解线性方程组的克拉默法则

《机器学习数学基础》中并没有将解线性方程组作为重点&#xff0c;只是在第2章2.4.2节做了比较完整的概述。这是因为&#xff0c;如果用程序求解线性方程组&#xff0c;相对于高等数学教材中强调的手工求解&#xff0c;要简单得多了。 本文是关于线性方程组的拓展&#xff0c;供…...

mysql的rpm包安装

(如果之前下载过mariadb&#xff0c;使用yum remove mariadb卸载&#xff0c;因为mariadb与rpm包安装的mysql有很多相似的组件和文件&#xff0c;会发生冲突&#xff0c;而源码包安装的mysql不会&#xff0c;所以不用删除源码包安装myqsl&#xff0c;只删除mariadb就可以&#…...

TailwindCss的vue3安装使用

按照官网的安装教程&#xff0c;属性最后无法生效&#xff0c;这是自我改良版&#xff0c;添加了额外步骤&#xff0c;但是每次引入新的tailwindcss属性 需要重新跑一次项目 npm下载tailwindcss npm install -D tailwindcss npx初始化tailwind配置 npx tailwindcss init 此时根…...

foobar2000设置DSP使用教程及软件推荐

foobar2000安卓中文版&#xff1a;一款高品质手机音频播放器 foobar2000安卓中文版是一款备受好评的高品质手机音频播放器。 几乎支持所有的音频格式&#xff0c;包括 MP3、MP4、AAC、CD 音频等。不论是经典老歌还是最新的流行音乐&#xff0c;foobar2000都能完美播放。除此之…...

开源多商户商城源码最新版_适配微信小程序+H5+APP+PC多端

在数字化时代&#xff0c;电子商务已经成为各行业不可或缺的一部分&#xff0c;开源多商户商城源码为中小企业和个人开发者提供了快速搭建和定制电商平台的利器。分享一款最新版的开源多商户商城源码&#xff0c;它能够适配微信小程序、H5、APP和PC等多个端口&#xff0c;满足商…...

【matlab】大小键盘对应的Kbname

matlab中可以通过Kbname来识别键盘上的键。在写范式的时候&#xff0c;遇到一个问题&#xff0c;我想用大键盘上排成一行的数字按键评分&#xff0c;比如 Kbname(1) 表示键盘上的数字1&#xff0c;但是这种写法只能识别小键盘上的数字&#xff0c;无法达到我的目的&#xff0c;…...

go语言并发的最佳实践

Go 语言的并发模型是其最强大的特性之一&#xff0c;基于 CSP&#xff08;Communicating Sequential Processes&#xff09;理论&#xff0c;通过 goroutine 和 channel 实现轻量级并发. 一、并发核心概念 1. Goroutine 在 Go 语言中&#xff0c;Goroutine 是实现并发编程的…...

超全Deepseek资料包,deepseek下载安装部署提示词及本地部署指南介绍

该资料包涵盖了DeepSeek模型的下载、安装、部署以及本地运行的详细指南&#xff0c;适合希望在本地环境中高效运行DeepSeek模型的用户。资料包不仅包括基础的安装步骤&#xff0c;还提供了68G多套独立部署视频教程教程&#xff0c;针对不同硬件配置的模型选择建议&#xff0c;以…...

重看Spring聚焦BeanDefinition分析和构造

目录 一、对BeanDefinition的理解 &#xff08;一&#xff09;理解元信息 &#xff08;二&#xff09;BeanDefinition理解分析 二、BeanDefinition的结构设计分析 &#xff08;一&#xff09;整体结构体会 &#xff08;二&#xff09;重要接口和类分析 三、构造 BeanDef…...

从MySQL5.7平滑升级到MySQL8.0的最佳实践分享

一、前言 升级需求&#xff1a;将5.7.35升级到8.0.27, 升级方式 in-place升级【关闭现有版本MySQL&#xff0c;将二进制或包替换成新版本并在现有数据目录上启动MySQL并执行升级任务的方式&#xff0c;称为in-place升级】 原版本 5.7.35 CentOS Linux release 7.9.2009 新版本…...

Node-Red

是什么? ——基于浏览器的流程编辑工具可连接设备、服务器和API应用 一、安装 1、本地安装(Windows) 在电脑上安装 Node.js 环境,然后使用 NPM 安装 Node-RED Node.js介绍: JavaScript 在不同的位置有不一样的解析器 写入 HTML 的 JS 语言,浏览器即它的解析器需要独…...

GO语言的安装以及第一个Go语言程序

1. Go语言的安装与设置 官网:golang.org 国内下载:https://studygolang.com/dl 国内镜像:https://goproxy.cn/ 2. GOland的安装 Go 1.13 及以上&#xff08;推荐&#xff09; 打开你的终端并执行 $ go env -w GO111MODULEon $ go env -w GOPROXYhttps://goproxy.cn,direc…...

年前集训总结python

1.用空格隔开输出列表list1 print(" ".jion(map(str,list1))) 2.转换函数 int() 将一个数字或字符串转换为整数。可以指定基数&#xff0c;支持从其他进制&#xff08;如二进制、十六进制&#xff09;转换为十进制。 int(101, 2) # 二进制字符串转十进制 > 5 …...

【JAVA实战】JAVA实现Excel模板下载并填充模板下拉选项数据

背景 有这样一个场景&#xff1a;前端下载Excel模板&#xff0c;进行数据导入&#xff0c;这个下载模板过程需要经过后端接口去数据库查询数据进行某些列的下拉数据填充&#xff0c;下拉填充的数据过程中会出现错误String literals in formulas can’t be bigger than 255 cha…...

【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题

【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题 【承接商业广告,如需商业合作请+v17740568442】 文章目录 【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题问题描述:解决方法方法一:手动中断并重启下载方法二:使用 Bash 脚本自动化下载在…...

Rust 面试题

1. Rust 中的所有权(Ownership)是什么? 回答: 所有权是 Rust 的核心概念之一,每个值在 Rust 中都有一个唯一的所有者,并且所有权在作用域内转移。当所有者离开作用域时,Rust 会自动释放该值的内存,避免了内存泄漏。 代码示例: fn main() {let s1 = String::from(&q…...

Copilot Next Edit Suggestions(预览版)

作者&#xff1a;Brigit Murtaugh&#xff0c;Burke Holland 排版&#xff1a;Alan Wang 我们很高兴向你介绍在本次 Visual Studio Code 发布中&#xff0c;关于 GitHub Copilot 的三个预览功能&#xff1a; Next Edit Suggestions&#xff08;NES&#xff09;Copilot Edits 的…...

LeetCode - 18 四数之和

题目来源 18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一…...

汽车零部件开发应该具备哪些编程思维?

目录 1、功能安全思维 2、实时性与确定性思维 3、可靠性和冗余思维 4、硬件软件协同思维 5、CAN总线通信思维 6、故障诊断和自诊断思维 7、功耗优化思维 8、软件更新和版本管理思维 9、用户体验与安全性思维 汽车零部件开发中&#xff0c;嵌入式软件在车辆系统中的作用…...

在Windows系统中安装Open WebUI并连接Ollama

Open WebUI是一个开源的大语言模型&#xff08;LLM&#xff09;交互界面&#xff0c;支持本地部署与离线运行。通过它&#xff0c;用户可以在类似ChatGPT的网页界面中&#xff0c;直接操作本地运行的Ollama等大语言模型工具。 安装前的核心要求&#xff1a; Python 3.11&#…...

React 与 Vue 对比指南 - 上

React 与 Vue 对比指南 - 上 本文将展示如何在 React 和 Vue 中实现常见功能&#xff0c;从基础渲染到高级状态管理 Hello 分别使用 react 和 vue 写一个 Hello World&#xff01; react export default () > {return <div>Hello World!</div>; }vue <…...

自动化办公|通过xlwings进行excel格式设置

1. 介绍 xlwings 是一个强大的 Python 库&#xff0c;可以用来操作 Excel&#xff0c;包括设置单元格格式、调整行高列宽、应用条件格式以及使用内置样式。本文将详细介绍如何使用 xlwings 进行 Excel 格式化操作&#xff0c;并附带代码示例。 2. 基础格式设置&#xff08;字…...

c# -01新属性-模式匹配、弃元、析构元组和其他类型

文章目录 **学习摘抄分享**模式匹配概述Null 检查类型测试比较离散值关系模型多个输入ObServation列表模式弃元元组和对象析构利用switch的模式进行匹配对于out的方法调用独立弃元析构元组和其他类型元组方法一方法二方法三方法四使用弃元元组的元素使用弃元的用户定义类型解构…...

银河麒麟V10SP1下qt5-12-12编译环境配置

下面的脚本在兆芯版kylin上试过,如果是本地编译,arm版应该也没有问题 a. 如果执行脚本安装有问题&#xff0c;读者可以拷贝命令多次安装 b. 建议在虚拟机环境下进行 #!/bin/bashsudo apt updatesudo apt-get install g gcc make cmake gperf bison flex libdrm-dev libxcompos…...

轻松搭建本地大语言模型(一)Ollama安装与使用

Ollama 是一款开源的本地大语言模型运行框架&#xff0c;支持在 Windows、macOS 和 Linux 系统上运行&#xff0c;能够帮助用户轻松下载和使用各种大语言模型&#xff08;例如deepseek、llama、qwen&#xff09;。本文将详细介绍 Ollama 的安装步骤&#xff0c;帮助你快速搭建本…...

【深度学习】Transformer入门:通俗易懂的介绍

【深度学习】Transformer入门&#xff1a;通俗易懂的介绍 一、引言二、从前的“读句子”方式三、Transformer的“超级阅读能力”四、Transformer是怎么做到的&#xff1f;五、Transformer的“多视角”能力六、Transformer的“位置记忆”七、Transformer的“翻译流程”八、Trans…...

浅识Linux高阶用法

&#xff08;前记&#xff1a;内容有点多&#xff0c;先看目录再挑着看。&#xff09; 问题&#xff1a;在Java面试中&#xff0c;当被提问到Linux的高阶用法以及如何使用Linux将程序、数据库、中间件等部署在云上时&#xff0c;可以从以下几个方面进行回答&#xff1a; Li…...

I²C简介

前言 IC&#xff08;Inter-Integrated Circuit, 内置集成电路&#xff09;总线是由Philips公司&#xff08;现属于恩智浦&#xff09;在上世纪80年代开发的两线式串行通信总线&#xff0c;用于连接微控制器及其外围设备&#xff0c;控制设备之间的通信。 IC总线的物理拓扑示意…...

Linux定时静默执行桌面/前台程序

Linux服务器上的程序大都在后台默默的执行&#xff0c;但有些需要在前台或桌面上运行的程序该怎么办呢&#xff1f;这就要借助虚拟显示技术&#xff0c;也就是在后台运行时提供虚拟的显示&#xff0c;使前台运行的程序也能默默的在后台运行&#xff0c;这就是所谓的以“无头模式…...

Redux中间件redux-thunk和redux-saga的具体区别是什么?

Redux 中间件是增强 Redux 功能的重要工具&#xff0c;redux-thunk 和 redux-saga 是两个常用的中间件&#xff0c;它们在处理异步操作和副作用时提供了不同的方式和理念。以下是两者的具体区别&#xff1a; 1. 概念与设计理念 redux-thunk 简洁&#xff1a;redux-thunk 是一…...

【STM32】DRV8833驱动电机

1.电机如何转动 只需要给电机两个端子加一正一负的极性就会转起来了&#xff0c;但是要注意的是不要将电机两端直接接在5v和gnd之间&#xff0c;这种电机一般要提供几百毫安的电流&#xff0c;而GPIO口只能提供几毫安&#xff0c;所以我们使用一个DRV8833来驱动 DRV8833输入口…...

【go语言规范】 使用函数式选项 Functional Options 模式处理可选配置

如何处理可选配置&#xff1f; Config Struct 方式 (config-struct/main.go) 这是最简单的方式&#xff0c;使用一个配置结构体&#xff1a; 定义了一个简单的 Config 结构体&#xff0c;包含 Port 字段创建服务器时直接传入配置对象优点&#xff1a;简单直接缺点&#xff1a…...

vue中为组建添加样式的方式

在 Vue 中&#xff0c;可以通过多种方式为 view 添加样式&#xff0c;并且支持动态绑定样式。以下是几种常见的方式&#xff1a; 1. 内联样式 直接在模板中使用 style 属性来添加样式。 <template><div style"color: red; font-size: 14px;">这是一个…...

如何简单的去使用jconsloe 查看线程 (多线程编程篇1)

目录 前言 1.进程和线程 进程 PCB 的作用 并发编程和并行编程 线程 为什么选择多线程编程 2.在IDEA中如何简单创建一个线程 1. 通过继承Thread类 2. 通过实现 Runnable 接口 3. 使用 Lambda 表达式 3.如何简单使用jconsloe去查看创建好的线程 前言 2025来了,这是第…...

机器学习·最近邻方法(k-NN)

前言 上一篇简单介绍了决策树&#xff0c;而本篇讲解与决策树相近的 最近邻方法k-NN。 机器学习决策树-CSDN博客 一、算法原理对比 特性决策树最近邻方法&#xff08;k-NN&#xff09;核心思想通过特征分割构建树结构&#xff0c;递归划分数据基于距离度量&#xff0c;用最近…...

网络安全试题

ciw网络安全试题 &#xff08;1&#xff09;&#xff08;单选题&#xff09;使网络服务器中充斥着大量要求回复的信息&#xff0c;消耗带宽&#xff0c;导致网络或系统停止正常服务&#xff0c;这属于什么攻击类型? A、拒绝服务 B、文件共享 C、BIND漏洞 D、远程过程调用 &a…...