当前位置: 首页 > 编程日记 > 正文

Uber提出损失变化分配方法LCA,揭秘神经网络“黑盒”

640?wx_fmt=jpeg

作者 | Janice Lan,Rosanne Liu等
译者 | 清儿爸
责编 | 夕颜
出品 | AI科技大本营(ID: rgznai100)
【导读】神经网络(Neural networks,NN)在过去十年来硕果累累,推动了整个行业的机器学习进程。然而,虽然许多神经网络在一些任务中表现相当出色,但网络本质上是一个复杂的系统,之前的研究已经分析了神经网络训练的过程,但它在很大程度上仍然是一个黑盒子,我们对其训练和操作模式仍然知之甚少。因此,产学研界都在为更好地理解网络属性和模型预测而不懈努力。

针对这个问题,Uber 在论文中提出了一种称为损失变化分配 (Loss Change Allocation,LCA)的方法,为神经网络训练过程提供了丰富的观察窗口,有望提高神经网络的可解释性。

在 Uber,工程师们将神经网络用于各种目的,包括检测和预测自动驾驶车辆的目标运动,更快地响应客户,以及构建更好的地图。

在神经网络训练过程中,尽管数以百万计的参数在训练期间可以通过简单的规则进行调整,但我们对过程本身的看法仍然局限于标量损失量,这严重限制了我们对丰富、高维处理过程的了解。例如,可能网络的一部分正在执行所有的学习,而另一部分却是无用的,但是仅仅观察损失,永远不会揭示这一点。

在 Uber 的论文《LCA:神经网络训练的损失变化分配》(LCA: Loss Change Allocation for Neural Network Training)中,Uber 提出的 LCA 方法可以将损失的变化分配给各个参数,从而度量每个参数的学习量。使用 LCA,Uber 提出了三个关于神经网络有趣的观察,包括噪音、层贡献和层同步。
640?wx_fmt=jpeg

LCA方法详解

揭示神经网络训练过程的详细见解的一种方法是,度量神经网络的每个可训练参数在任何时间点的学习量。此处 Uber 将“学习”视为对网络的改变,从而降低训练集的损失。请注意,他们考虑的是整个训练集的损失,而不仅是一批;在 SGD 中,虽然批量驱动参数更新,但他们衡量的是整个训练集的学习。
假设正在训练一个网络,在一次训练迭代中,参数向量从640?wx_fmt=png移动到640?wx_fmt=png。由于这一运动,损失从 1.85 减少到 1.84。在这种 640?wx_fmt=png情况下,可以说网络“学会了”将损失减少 0.01。我们可以通过一阶泰勒级数来近似这种损失的变化:
640?wx_fmt=png
一个与我们可以直接计算近似的量似乎毫无意义,但近似并非 Uber 的最终目标:Uber 用近似来将标量损失的变化分解成单个的分量。在这种情况下,方程的右侧是两个向量的点积,其长度等于参数的数量。Uber 可以将这个点积分解成它的分量总和:
640?wx_fmt=png
其中,640?wx_fmt=png是参数向量或梯度向量上的索引。通过在每个训练迭代中对此进行度量,能够将标量损失的变化分配给各个参数。Uber 将其称为损失变化分配(Loss Change Allocation,LCA):参数在迭代中的移动造成的损失上升或下降的程度。下面是 LCA 的一些直观属性:
  • 如果参数具有零梯度或者不移动,那么它的 LCA 为零,如图 1b 所示。
  • 如果参数具有非零梯度并沿着负梯度方向移动,那么它具有负 LCA,如图 1c 所示。Uber 称这些参数为“帮助”,因为它们减少了迭代中的损失。
  • 如果参数沿着梯度的正方向移动,它就会因为增加损失而“受伤”。这可能是由于嘈杂的小批量或动量导致的参数移动错误方向引起的。
640?wx_fmt=jpeg

图 1. 损失表面的虚构示例 (a) 描述了两个参数的 LCA。一个参数 (b) 移动但不影响损失,另一个参数 (c) 具有负 LCA,因为它的移动导致损失减少。

LCA 分量具有很好的接地特性,这意味着它们是损失的实际变化的总和(对近似方法作了一些修改,考虑了曲率,并保证精度,正如 Uber 在论文所揭示的那样)。在整个训练过程中,度量每个参数和迭代的 LCA。对参数进行求和,将得到每次迭代的总损失变化量;如果对迭代进行求和,将得到每个参数的总 LCA。


通过训练显微镜进行可视化
有了如上所述定义的 LCA 度量,Uber 就可以将其作为显微镜,用于训练数据集(例如 MNIST 或 CIFAR-10)的一些示例网络的训练过程。对于 MNIST,Uber 训练了两个网络:FC(一个三层全连接网络)和 LeNet(一个带有两个卷积层,然后是两个全连接层的网络)。对于 CIFAR-10,Uber 训练了 ResNet(一个 20 层的残差网络)。本文中所有的网络都使用 SGD 进行训练(要了解其他网络和优化器的结果,请参阅 Uber 的论文)。
在下面的视频中,Uber 将直接对 LCA 数据进行可视化,每个帧给定迭代中所有参数的 LCA。FC 在本例中表示,每个像素代表一个参数,以层的形式布置。


视频 1. Uber在 MNIST 上为 FC 训练的前 400 次迭代制作了动画。绿色表示负 LCA(帮助),红色表示正 LCA(受伤)。

在上面的视频中,Uber看到了一些趋势:
  • 迭代 1-10:在开始时,损失急剧下降,Uber看到许多绿色参数。
  • 迭代 10-100:经过几次迭代之后,Uber看到绿色和红色的嘈杂混合,表明一些参数是有帮助的,而另一些参数正在受伤。
  • 迭代 100+:一旦损失接近其最终值,Uber看到大多数像素接近白色,表明参数不再具有明显的帮助或伤害。
本文的第 S2 节提供了更多直接可视化的示例。这样的可视化很吸引人,可以帮助表面缺陷或识别死亡的神经元和无用的参数,但很难从中得出更多的定量结论。为了更好地理解更高级别的 LCA 模式,Uber 接下来尝试一些定量聚合。

结果 1:训练很嘈杂
Uber 考虑的第一个聚合是 LCA 值在所有参数和所有迭代上的分布。下面的图 2 显示了 ResNet 的 LCA 分布,其中绿色条表示有助于损失的分量,红色条表示伤害损失的分量:
640?wx_fmt=jpeg

图 2. 显示所有 LCA 元素分布情况的直方图(所有迭代中的所有参数),显示只有不到一半是负数(帮助)。相应的直方图以对数刻度(左)显示,以查看分布的尾部和常规刻度(右),以便更清楚地显示负 / 正比率。

LCA 分布有几个有趣的属性。在绘制这张图之前,Uber 已经知道这个分布的均值是多少:平均 LCA 仅为(总损失变化)/(参数数量 x 训练步骤数量)。对于图 2 中的运行,平均值为 -2.4e-9,用蓝线高亮显示。假设平均值是 -2.4e-9,Uber可能已经预期在该值附近会有一个狭窄的正态分布。相反,他们看到的是一个非常广泛的分布。事实上,它是如此之宽,以至于在这种细节层面上,它的均值与 0 无法区分。这意味着,并非所有的网络参数都在单一方向上移动,将网络推向更低的损耗,而是在训练过程中充满了帮助和受伤的参数之间的竞争。LCA 也是重尾分布的:如果它是正态分布的,那么对数空间中的直方图就会呈现出倒抛物线的形状。
Uber 可以通过计算帮助(绿色)而不是受伤(红色)的权重百分比来量化这种张力。他们发现,在给定的迭代中,只有 80.7% 的权重对该网络有帮助。换言之,在任何给定的时间里,所有参数只有不到一半对网络训练是有帮助的,其余的参数都朝着错误的方向移动!
令人惊讶的是,正 LCA 参数朝着错误的方向移动,这引发了一些额外的问题:
  • 随着训练网络的时间越来越长,损失最终会停止下降,可以想象,有帮助的参数百分比将会收敛到 50%。因此,他们不禁要问:这个接近 50% 的比例,仅仅是否因为网络训练时间过长而产生的?然而,下面的图 3a 表明,情况并非如此:在训练期间的大多数时间点,这个比率仅略高于 50%,在最速学习的早期迭代中,这一比例略高,但仍然低于 60%。
  • 其次,鉴于许多函数的帮助被许多参数的伤害所抵消,那么一些参数是否一直在“帮忙”,如果是,它们是否一直被其他参数的伤害所抵消?换句话说,是否有一些“英雄”参数几乎一直在帮助,而“恶棍”参数却不断造成伤害?但图 3b 显示并非如此:帮助最多的参数通常在 53% 的时间内有帮助,而帮助最少的参数仍然有 48% 的时间帮助。
640?wx_fmt=png

图 3. 研究发现:(a) 在所有迭代中,参数的帮助率接近 50%;(b) 所有参数的帮助大约为一半时间。

这两个观察结果在很大程度上可以解释为训练中普遍存在的震荡现象。在下面的图 4 中,Uber展示了两个示例参数随时间变化的运动、底层梯度和结果 LCA。在这些图标中,可以清楚看到震荡现象:
640?wx_fmt=png
640?wx_fmt=png

图 4. 显示了 ResNet 最后一层的两个参数:在给定的迭代过程中,一个参数伤害最大(顶部),另一个参数帮助最大(底部)(net LCA 分别为 +3.41e-3 和 -3.03e-3)。权重(橙色)和梯度(蓝色)轨迹都在震荡,导致 LCA(绿色和红色)在帮助和伤害之间交替。

除了震荡权重和梯度之外,图 4 还揭示了参数的运动和底层梯度有同时波动的趋势。这表明震荡是由于参数在局部极小值上来回摆动所致,与小批量噪声驱动无关。
虽然图 4 中只显示了两个参数,但震荡在整个训练和整个网络中是普遍存在的。例如,在所描述的运行期间,权重值平均每 7 次迭代改变方向,梯度每 10 次迭代改变符号。事实上,即使调整学习率、批量大小和动量值,使网络能够合理地训练,仍然可以观察到震荡普遍存在,并测量出近一半的参数会受到伤害(详情请参阅 Uber 的论文)。
通过这些实验,LCA 揭示了关于神经网络训练的第一个见解:在任何给定的时间,几乎将近一半的参数都会受到伤害,或者在训练梯度上出现偏差。网络之所以能够进行整体学习,只是因为许多有噪声的 LCA 分量的平均值略微为负。

结果 2:有些层是向后的
Uber 不仅可以使用自己方法来研究低层次的、每个参数的 LCA,也可以在更高层次的分解上聚合 LCA。Uber 期望,通过这种方式能够看到不同的见解;在参数级别上有很多噪音,但总体来说,网络是有学习能力的。聚合 LCA 的一种方法是对每一层中所有参数和所有时间进行求和。这可以度量每一层在训练过程中的学习量,如下面的图 5 中两个网络所示:
640?wx_fmt=png

图 5. Uber对 FC(左)和 LeNet(右)的每个层中的所有参数进行 LCA 求和。不同的层学习不同的数量,每层 LCA 的差异主要可以通过层中参数的数量来解释。

如果按照参数的数量将每一层的 LCA 进行归一化,不出意外的话,我们会看到相反的效果,其中较小的层的参数平均具有更多的 LCA。接下来,我们来看看 ResNet 是否表现出不同的行为:
640?wx_fmt=png

图 6.ResNet 揭示了一个不同的模式:第一层和最后一层具有正 LCA,这意味着它们的移动实际上增加了训练过程的损失。这很让人惊讶,因为网络总体上是有学习能力的,而且对于一大组参数的 LCA 总和而言,持续为正是没有意义的。

虽然 FC 和 LeNet 并没有给出任何令人惊讶的结论,但 Uber 注意到,ResNet 有些不正常。第一层和最后一层具有正 LCA,这意味着它们的移动实际上增加了训练过程中的损失!虽然他们已经观察到个别参数受到伤害,但Uber预计在大群体上进行总和时,LCA 将为负,因为平均 LCA 为负。然而,对于这些有害的层来说,情况并非如此,它们每次运行时,LCA 始终为正(并且 10 次运行时 p-value < 1e-4)。
对于这个奇怪的结果,Uber 想知道:如果一个层受伤了,那么在初始化时就冻结该层会怎么样呢?通过阻止权重移动,Uber 就可以阻止让它受到伤害或帮助。这会让网络整体表现变得更好吗?Uber 在第一层尝试了这项技术,但最终的损失并没有变得更好:即使阻止了第一层的伤害,其他的层也没能起到同样的作用。因此,尽管 LCA 为正,但第一层的参数移动是很重要的。然而,如果冻结最后一层(如图 7 所示),它将提高整体网络性能,从而降低整体损失。
640?wx_fmt=png

图 7. Uber 展示了 ResNet 中每层的 LCA,用于常规训练场景(实心柱),以及在初始化时冻结最后一层(阴影线)的场景,平均每个场景超过 10 次运行。通过冻结最后一层,Uber可以防止它受到伤害。虽然其他层的帮助没有那么多(LCA 的负面影响较小),但最后一层 LCA 的变化弥补了这一点,从而降低了整体损失(图右)。

这些结果表明,最后一层最好要冻结。先前的研究已经发现冻结最后一层或者用不同的方法对其进行不同的处理是有好处的。LCA 提供了原则性的提示,即冻结最后一层可能会更好,同时也解释了它最初的问题所在:它普遍地受到了伤害。
为了理解为何一个层会首先受到伤害,Uber 考虑了一些可能的原因。小批量梯度是整个训练集梯度的无偏估计,因此,小批量噪声本身并不能解释总 LCA 为何为正。Uber 之前观察到的参数震荡现象是另一种可能的解释,但如果没有其他因素的话,震荡不应该导致在错误的方向上的漂移,因此这也不能解释为何总 LCA 为正。
在排除这些选项之后,Uber 假设解释与不同层对优化器相应的速度有关。如果由于各种因素的收敛,各层以不同的延迟进行学习,那么最后一层可能会一直滞后于其他层,与其他层稍微不同步。由于层间竞争以减少损失,延迟的最后一层可能会丧失收集 LCA 的能力。
幸运的是,Uber 可以通过优化器的动量直接调整每个层的延迟来检验这个假设是否正确。由于动量640?wx_fmt=png是过去梯度的指数加权平均值,因此 Uber 使用的平均梯度是640?wx_fmt=png迭代的。到目前为止,Uber 对每一层都使用了动量 0.9,对应 9 次迭代的延迟。动量为 0 时,延迟则为 0。如果减少最后一层的动量,就能够减少最后一层相对于其他层的延迟。
Uber 可以在不同的最后一层延迟级别下运行同一个网络,从 0 到 9 次进行迭代,而保持所有其他层的持续延迟为 9。正如假设的那样,最后一层的延迟越少,它的帮助就越大!从伤害到帮助的转变几乎与延迟成线性关系。此外,由于其他层相对于最后一层的延迟更大,它们会因为现在的滞后和最后一层向前推进而受到更大的伤害,如下图 8 所示:
640?wx_fmt=png

图 8. Uber 为最后一层训练了一个具有不同动量的 ResNet,并为每层绘制了总 LCA(为了更好的可视化效果,省略了前十层)。随着最后一层动量的减少,梯度新区驱动学习相对于其他层的延迟减小,最后一层的 LCA 以其他层的损失为代价向前推进。

从这些实验中,LCA 揭示了不同层的行为是不同的,有些层甚至在平均水平上逆着梯度移动,并受到伤害。通过信息延迟的角度来看训练,似乎是有效的。总之,这些结果表明,对每层进行优化调整可能是有益处的。

层是同步的
现在,Uber 已经了解了每一层的整体学习情况,下一步自然是研究不同层何时进行学习。先前的研究已经发现了层表示的广泛手链模式,但通过使用 LCA,Uber 可以在较小的范围内检查层间的学习。
LCA 方法的一个有用的特性是,它让研究人员可以分析他们所关心的任何损失函数。Uber 可以利用这一点,将训练集的损失分解成 10 个单独的损失(每个真相类 1 个),画出更加细化的训练过程视图,使 Uber 能够确定每一层何时学习对分类有用的概念(在这种情况下,是 MNIST 的每个类)。
为了精确定位最高时间分辨率的学习,Uber 将层和类的“学习峰值时刻”定义为该层和类的 LCA 的局部最小值。换句话说,该类的损失由于该层在迭代 t 上的移动而减少,而非由于 t+1 或 t-1 的移动而减少。
在下面的图 9 中,Uber 为 MNIST-FC 的每个层和每个类绘制了学习的前 20 个峰值时刻:
640?wx_fmt=png

图 9. Uber 将 MNIST-FC 的“学习峰值时刻”按层和类进行可视化,每个点代表特定类和层的 LCA 峰值,其中网络中的三个层显示为三个堆叠的点。当所有个层的学习在同一次迭代中排列起来时,Uber 用红色标出这些点。

奇怪的是,研究人员经常在一条直线上看到三个点的集合(以红色高亮表示可见性),这意味着所有三个层都在完全相同的迭代中为同一个类学习了一些东西。假设层是独立进行的,那么精确排列的学习峰值时刻的平均数量明显要高于预期的数量 (p < 0.001)。
这些点的同步不能简单地使用单个批次在网络中引起大的同步变化来解释,因为虽然权重运动也是同步的(见 Uber 论文中图 S18),但峰值权重运动和峰值 LCA 的迭代通常不会重合。每层和类的渐变也是同步的(见论文的图 S15),这是另一个令人惊讶的观察结果:对于同一次迭代的所有层,每类训练集的损失会变得非常大,这无疑有助于时同步学习成为可能。
这就引出了 Uber 最后的结论:层学习在微观尺度上是同步的。

总结和展望
Uber 已经介绍了损失变化分配(LCA)方法,并通过以各种方式聚合 LCA 来证明,他们可以发现训练过程中的噪声,发现某些层对梯度的奇异流动,并揭示增量学习的跨层同步。
在论文中,Uber 详细阐述了这些发现,分析了更多的网络和优化器,并讨论了这项工作的前景。例如:
  • 到目前为止讨论的所有实验都使用了训练集。如果Uber 也 跟踪验证 LCA,可以比较训练 LCA 和验证 LCA 来度量哪些参数导致了过拟合。这种分析可以实现有针对性的正则化。
  • LCA 可用于识别没有帮助的权重,因此是修剪或重新初始化的目标。除了识别要冻结的层之外,LCA 还可能是一个重要的诊断工具,用于识别次优超参数或配置不良的网络结构。
  • 更好的优化器可能能够考虑到频繁的参数级的震荡现象,或者实现每层可调的超参数。
LAC 的可能性多种多样,可用于任何参数化模型。如果你对这项工作感兴趣,可详读完整论文,并咋你自己的网络下试验一下代码。
论文链接:https://eng.uber.com/research/lca-loss-change-allocation-for-neural-network-training/

GitHub 代码:https://github.com/uber-research/loss-change-allocation
原文链接:https://eng.uber.com/loss-change-allocation/

(*本文为AI科技大本营编译文章,转载微信联系1092722531)


精彩推荐



【结果提交倒计时】PV,UV流量预测算法大赛,结果提交截止时间为9月20日,还没有提交的小伙伴抓紧时间了~~9月25日公布初赛成绩。最新排行榜请扫码查看。


推荐阅读

  • 掌握这些步骤,机器学习模型问题药到病除

  • 值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(下)

  • 6张拓扑图揭秘中心化交易所的5种行为, 原来中心化比你想象的重要!

  • 分布式存储春天已来Storj首登top10; Cardano排名上升; 以太坊比特币活跃地址双下降 | 数据周榜

  • 华为愿出售5G技术渴望对手;苹果将向印度投资10亿美元;华为全联接大会首发计算战略;腾讯自研轻量级物联网操作系统正式开源……

  • TDD 就是个坑!

  • 我愿出 2 倍工资,挖这个被裁的程序员!

  • 厉害!接班马云的为何是张勇?

640?wx_fmt=png

你点的每个“在看”,我都认真当成了喜欢“

相关文章:

范登读书解读《亲密关系》(婚姻、爱情) 笔记

来源&#xff1a;邀请你看《樊登解读《亲密关系》&#xff08;已婚人士必看&#xff09;》&#xff0c;https://url.cn/5HJvLk5?sfuri 人们在童年的时候始终追寻着两种东西&#xff0c;第一种叫做归属感&#xff0c;第二叫做确认自己的重要性、价值感。 如果再童年的时候缺失这…

myeclipse莫名其妙的问题

2019独角兽企业重金招聘Python工程师标准>>> 怎么刷新&#xff0c;clean项目都不管用&#xff0c;结果删除相应工作空间下的那个项目就行。类似路径如D:\workspace\.metadata\.plugins\org.eclipse.core.resources\.projects 转载于:https://my.oschina.net/u/14488…

数据科学家需要知道的5种图算法

作者&#xff1a;Rahul Agarwal编译&#xff1a;ronghuaiyang来源 | AI公园&#xff08;ID:AI_Paradise&#xff09;【导读】因为图分析是数据科学家的未来。作为数据科学家&#xff0c;我们对pandas、SQL或任何其他关系数据库非常熟悉。我们习惯于将用户的属性以列的形式显示在…

在Windows7/10上快速搭建深度学习框架Caffe开发环境

之前在 http://blog.csdn.net/fengbingchun/article/details/50987353 中介绍过在Windows7上搭建Caffe开发环境的操作步骤&#xff0c;那时caffe的项目是和其它依赖项目分开的&#xff0c;每次换新的PC机时再次重新配置搭建还是很不方便&#xff0c;而且caffe的版本较老&#x…

扫码下单支持同桌单人点餐FAQ

一、使用场景 满足较多商户希望同一桌台&#xff0c;各自点各自的菜品的业态场景&#xff08;例如杭味面馆&#xff0c;黄焖鸡米饭店&#xff0c;面馆等大多数轻快餐店&#xff09; 二、配置步骤及注意事项 管理员后台配置--配置管理--店铺配置--扫码点餐tab页 1、开启扫码下单…

使用photoshop 10.0制作符合社保要求的照片

2019独角兽企业重金招聘Python工程师标准>>> 北京市社保新参统人员照片修制方法 修改目标&#xff1a;照片规格:358像素&#xff08;宽&#xff09;&times;441像素&#xff08;高&#xff09;&#xff0c;分辨率350dpi。 颜色模式:24位RGB真彩色。 储存格式&am…

C++11中std::addressof的使用

C11中的std::addressof获得一个对象的实际地址&#xff0c;即使 operator& 操作符已被重载。它常用于原本要使用 operator& 的地方&#xff0c;它接受一个参数&#xff0c;该参数为要获得地址的那个对象的引用。一般&#xff0c;若operator &()也被重载且不一致的话…

一份职位信息的精准推荐之旅,从AI底层架构说起

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】也许&#xff0c;每天早上你的邮箱中又多了一封职位推荐信息&#xff0c;点开一看&#xff0c;你可能发现这些推荐正合你意&#xff0c;于是按照这些信息&#xff0c;你顺利找到一份符合自己期待的…

Vue.js 生命周期

2019独角兽企业重金招聘Python工程师标准>>> 每个 Vue 实例在被创建之前都要经过一系列的初始化过程 vue在生命周期中有这些状态&#xff0c; beforeCreate,created,beforeMount,mounted,beforeUpdate,updated,beforeDestroy,destroyed。Vue在实例化的过程中&#x…

AX2009取销售订单的税额

直接用以下方法即可&#xff1a; Tax::calcTaxAmount(salesLine.TaxGroup, salesLine.TaxItemGroup, systemDateGet(), salesLine.CurrencyCode, salesParmLine.LineAmount, salesTable.taxModuleType()); salesParmLine.LineAmount&#xff1a;这个直接取的是装箱单或者发票…

Dubbo源码解析之服务路由策略

1. 简介 服务目录在刷新 Invoker 列表的过程中&#xff0c;会通过 Router 进行服务路由&#xff0c;筛选出符合路由规则的服务提供者。在详细分析服务路由的源码之前&#xff0c;先来介绍一下服务路由是什么。服务路由包含一条路由规则&#xff0c;路由规则决定了服务消费者的调…

C++中std::reverse和std::reverse_copy的使用

std::reverse&#xff1a;反转排序容器内指定范围中的元素。std::reverse_copy与std::reverse唯一的区别是&#xff1a;reverse_copy会将结果拷贝到另外一个容器中&#xff0c;而不影响原容器的内容。std::reverse: defined in header <algorithm>, reverses the order …

真相!30K拿到互联网大厂offer,网友:我服了!

最近笔者在知乎刷到一个帖子&#xff0c;其中&#xff0c;这条回答让人印象深刻&#xff1a;其实&#xff0c;最近几年人工智能大火&#xff0c;其中深度学习岗位的薪酬爆增&#xff0c;BAT大厂高薪招聘AI人才&#xff0c;收到的简历却寥寥无几&#xff1f;究竟是大厂岗位要求高…

OracleDesigner学习笔记1――安装篇

OracleDesigner学习笔记1――安装篇 QQ&#xff1a;King MSN&#xff1a;qiutianwhmsn.com Email&#xff1a;qqkinggmail.com 一&#xff0e; 前言 Oracle是当今最流行的关系型数据库之一&#xff0c;和很多朋友一样&#xff0c;我也是一个Oracle的爱好者&#xff0c;从…

C++/C++11中std::queue的使用

std::queue: 模板类queue定义在<queue>头文件中。队列(Queue)是一个容器适配器(Container adaptor)类型&#xff0c;被特别设计用来运行于FIFO(First-in first-out)场景&#xff0c;在该场景中&#xff0c;只能从容器一端添加(Insert)元素&#xff0c;而在另一端提取(Ext…

常见的http状态码(Http Status Code)

常见的http状态码&#xff1a;&#xff08;收藏学习&#xff09; 2**开头 &#xff08;请求成功&#xff09;表示成功处理了请求的状态代码。 200 &#xff08;成功&#xff09; 服务器已成功处理了请求。 通常&#xff0c;这表示服务器提供了请求的网页。201 &#xff08;已创…

“不给钱就删库”的勒索病毒, 程序员该如何防护?

作者 | 阿木&#xff0c;王洪鹏&#xff0c;运营有个人公众号新新生活志。目前任职网易云计算技术部高级工程师&#xff0c;近3年云计算从业经验&#xff0c;爱读书、爱写作、爱技术。责编 | 郭芮来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;近期一家名为ProPub…

ruby实时查看日志

(文章是从我的个人主页上粘贴过来的&#xff0c; 大家也可以访问我的主页 www.iwangzheng.com) 在调试代码的时候&#xff0c;把日志文件打开&#xff0c;边操作边调试能很快帮助我们发现系统中存在的问题。 $tail rails_2014_03_03.log -f转载于:https://www.cnblogs.com/iw…

干货 | OpenCV看这篇就够了,9段代码详解图像变换基本操作

作者 | 王天庆&#xff0c;长期从事分布式系统、数据科学与工程、人工智能等方面的研究与开发&#xff0c;在人脸识别方面有丰富的实践经验。现就职某世界100强企业的数据实验室&#xff0c;从事数据科学相关技术领域的预研工作。来源 | 大数据&#xff08;ID&#xff1a;hzdas…

C++/C++11中std::priority_queue的使用

std::priority_queue:在优先队列中&#xff0c;优先级高的元素先出队列&#xff0c;并非按照先进先出的要求&#xff0c;类似一个堆(heap)。其模板声明带有三个参数&#xff0c;priority_queue<Type, Container, Functional>, 其中Type为数据类型&#xff0c;Container为…

left join 和 left outer join 的区别

老是混淆&#xff0c;做个笔记&#xff0c;转自&#xff1a;https://www.cnblogs.com/xieqian111/p/5735977.html left join 和 left outer join 的区别 通俗的讲&#xff1a; A left join B 的连接的记录数与A表的记录数同 A right join B 的连接的记录数与…

php减少损耗的方法之一 缓存对象

即把实例后的对象缓存起来(存入变量)&#xff0c;当需要再次实例化时&#xff0c;先去缓存里查看是否存在。存在则返回。否则实例化。转载于:https://www.cnblogs.com/zuoxiaobing/p/3581139.html

windows10 vs2013控制台工程中添加并编译cuda8.0文件操作步骤

一般有两种方法可以在vs2013上添加运行cuda8.0程序&#xff1a;一、直接新建一个基于CUDA8.0的项目&#xff1a;如下图所示&#xff0c;点击确定后即可生成test_cuda项目&#xff1b;默认会自动生成一个kernel.cu文件&#xff1b;默认已经配置好Debug/Release, Win32/x64环境&a…

算法人必懂的进阶SQL知识,4道面试常考题

&#xff08;图片付费下载自视觉中国&#xff09;作者 | 石晓文来源&#xff5c;小小挖掘机&#xff08;ID&#xff1a;wAlsjwj&#xff09;近期在不同群里有小伙伴们提出了一些在面试和笔试中遇到的Hive SQL问题&#xff0c;Hive作为算法工程师的一项必备技能&#xff0c;在面…

007-迅雷定时重启AutoHotkey脚本-20190411

;; 定时重启迅雷.ahk,;;~ 2019年04月11日;#SingleInstance,forceSetWorkingDir,%A_ScriptDir%DetectHiddenWindows,OnSetTitleMatchMode,2#Persistent ;让脚本持久运行&#xff08;即直到用户关闭或遇到 ExitApp&#xff09;。#NoEnv;~ #NoTrayIcon Hotkey,^F10,ExitThisApp lo…

关于ExtJS在使用下拉列表框的二级联动获取数据

2019独角兽企业重金招聘Python工程师标准>>> 使用下拉列表框的二级联动获取数据&#xff0c;如果第一个下拉列表框有默认值时&#xff0c;需要设置fireEvent执行select事件 示例&#xff1a; var combo Ext.getCmp("modifyBuildCom"); combo.setValue(re…

C++中std::sort/std::stable_sort/std::partial_sort的区别及使用

某些算法会重排容器中元素的顺序&#xff0c;如std::sort。调用sort会重排输入序列中的元素&#xff0c;使之有序&#xff0c;它默认是利用元素类型的<运算符来实现排序的。也可以重载sort的默认排序&#xff0c;即通过sort的第三个参数&#xff0c;此参数是一个谓词(predic…

阿里云智能 AIoT 首席科学家丁险峰:阿里全面进军IoT这一年 | 问底中国IT技术演进...

作者 | 屠敏受访者 | 丁险峰来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;「忽如一夜春风来&#xff0c;千树万树梨花开。」从概念的流行、至科技巨头的相继入局、再到诸多应用的落地&#xff0c;IoT 的发展终于在万事俱备只欠东风的条件下真正地迎来了属于自己的…

eBCC性能分析最佳实践(1) - 线上lstat, vfs_fstatat 开销高情景分析...

Guide: eBCC性能分析最佳实践&#xff08;0&#xff09; - 开启性能分析新篇章eBCC性能分析最佳实践&#xff08;1&#xff09; - 线上lstat, vfs_fstatat 开销高情景分析eBCC性能分析最佳实践&#xff08;2&#xff09; - 一个简单的eBCC分析网络函数的latency敬请期待...0. I…

spring-data-mongodb必须了解的操作

http://docs.spring.io/spring-data/data-mongo/docs/1.0.0.M5/api/org/springframework/data/mongodb/core/MongoTemplate.html 在线api文档 1关键之识别 KeywordSampleLogical resultGreaterThanfindByAgeGreaterThan(int age){"age" : {"$gt" : age}}Le…