独家丨DeepMind科学家、AlphaTensor一作解读背后的故事与实现细节

news2024/11/24 1:06:46

一直以来,DeepMind的Alpha系列工作,AlphaGo、AlphaStar等致力于棋类和游戏应用中战胜人类,而两个月前发布的AlphaTensor则把目标指向了科学计算领域,意在为矩阵乘法等基本计算任务自动设计更高效的经典算法,这一工作一经推出,效果显著,让人眼前一亮,甚至被知名AI主播Lex Fridman评价为值得「诺贝尔奖和菲尔兹奖」的工作。

AlphaTensor是如何做到的?其工作背后的灵感来源是什么?智源社区邀请到该工作第一作者Alhussein Fawzi博士,为我们独家讲授了如何将强化学习方法应用到矩阵乘法等基础科学问题,同时Fawzi博士也分享了项目背后的细节,以及给交叉学科研究者的建议。

7ca9142ea5e685c783c994fabc62759c.png

Fawzi博士是DeepMind的研究科学家。他于2016年从洛桑联邦理工学院(EPFL)信号处理实验室获得了博士学位。2012年他获得了EPFL电气工程学士学位。他在2013-2014和2015-2016学年获得了IBM博士奖学金(IBM PhD Fellowship awards)。目前Fawzi博士从事的是科学人工智能方面的工作,尤其是使用机器学习来解锁数学领域的新成果。同时,他对机器学习系统的可靠性也很感兴趣,尤其是计算机视觉方面。

Q&A

1、AlphaTensor的灵感从何而来?

A:我的灵感本质上就是我们如何使用机器学习来自动化算法发现的过程。发现新的算法是一个艰难的过程,所以我们可以尝试使用机器学习自动化其中的一部分,我们想专注于一个特定的问题,例如,矩阵乘法这种影响重大的问题。我们的工作表明对于矩阵乘法这个概念是可行的,希望在未来,对于其他算法也是可行的。另一个灵感就是要尝试使用现有的算法,像AlphaZero 本来就是专门用来玩复杂游戏,我们看看这是否可以被超越。

2、这个项目是如何一步一步开始的?团队是如何组织的?

A:好的,这个项目本质上是从监督学习开始的,我们一开始并不喜欢应用强化学习,所以尝试只使用这种综合演示。然后,我们做了一个为期两周的冲刺,有点像黑客松,想尝试使用强化学习解决这个问题,结果证明是非常有前途的。我们团队中有数学、强化学习和transformer等各个方面的专家。我认为,还有一件有趣的事情是,团队做了一个leaderboard(排行榜),结果开始真正变得越来越好。leaderboard列出每个人的运行实验所有结果,互相之间进行竞争以获得本质上最好的结果。

3、在整个过程之间里程碑是什么?

A:首先尝试实现现有算法,比如第一个就是重新发现Strassen算法,然后尝试重新发现其他算法,然后就超越现有的算法,就是非常自然的里程碑。

4、有哪些经验可以向跨学科领域的同行(包括AI和基础数学等)分享?

A:AlphaTensor中谈到的这些方法实际上适用于许多领域,特别是数学领域。例如,关于证明一个特定的定理,但这对定理的多样化描述很重要,我们本质上尝试以等效的方式表达定理,并生成训练数据。这就是我认为一件非常重要的事情。第二,我要分享的是不要直接去做强化学习,因为强化学习很难从“零”开始直接运行。所以,恰当的步骤非常重要,比如首先进行监督学习,如果你发现监督学习有效,那么你尝试在它之上做一些搜索,然后如果监督学习、交叉搜索都有效之后再尝试嵌入到强化学习的流程。

研究背景

矩阵乘法,是矩阵变换的基础运算之一,也是线性代数的基础工具,不仅在数学中有大量应用,在物理学、工程学等领域也有广泛使用。作为构成数学算法的基础运算之一,矩阵乘法的应用史长达数千年。

68a64d1cc82ecb54711c3ebb23d72f8d.png

矩阵乘法在现代计算机中更是无处不在,被广泛地应用于处理图像、语音、图形甚至仿真模拟、数据压缩等,在当代数字世界有着巨大的影响力。世界各地的公司花费了大量的时间和金钱来开发计算软硬件,以有效地进行矩阵乘法。因此,即使是对矩阵乘法效率的微小改进也会产生广泛的影响。几个世纪以来,人们一直认为标准的矩阵乘法算法在效率方面已经达到最佳状态。

但在1969年,德国数学家Volken Strassen表明确实存在更好的算法,震惊了数学界。矩阵乘法的标准算法与Strassen的算法相比,后者在计算两个2x2矩阵相乘时少用了一个标量乘法(共用7次而不是8次)。矩阵乘法需要执行多次标量的数值乘法或加法运算,考虑计算机架构的乘指令开销远大于加法,在保证结果正确的前提下,尽量减少矩阵乘中的数值乘法次数。经过几十年的研究,这个问题仍然没有更好的解决办法。

f15db5a556f6854dfe947f84da986ac7.png

使用机器学习来发现新的可证明正确的高效算法来解决有影响力的问题!Fawzi博士开宗明义讲出他做这项研究的目标,并强调了其中的关键字:可证明正确。算法不针对于特定的测试分布,而对所有实例或所有输入都是正确的。高效,算法运行速度快或者具有良好的渐近复杂度。

意义重大的问题或者称之为根节点问题,是指如果解锁这些问题,其他位于根节点路径上的问题也将被解决,因而将产生很大的影响。如果能够使用机器学习自动化来寻找这些算法,可能会产生变革性的影响和巨大的价值。如下图中的矩阵乘法就是重要的根节点问题之一。

f3aa5685592e0b293fb26831b5ce9e63.png

但是,使用机器学习自动化发现算法面临着许多挑战。首先,为了找到一个可证明正确的算法,用来表示算法的空间是什么?如何在这个空间中描述问题,比如两个矩阵之间的乘法?即使能够找到这个空间,在规模巨大的空间中搜索也相当困难。

那么,如何能够高效的找到需要的解?有效地应用最先进的机器学习方法非常重要。

矩阵乘法及其算法的描述

342de2f24cd4c6d9bc72f003515e28ff.png

如上图所示,两个大小为2x2矩阵做乘法,在标准定义下总共需要 8 次标量乘法。Strassen算法首先把矩阵的一些切片组合在一起构成中间变量,然后这些中间结果被分配到目标的结果当中。这个算法确实需要一定的独创性才能想出,但检查它是否正确却很容易,只要判断两种算法得到的结果是否完全一样即可。两个2X2矩阵乘法中Strassen算法与标准算法相比只减少了1次乘法,但是依然非常重要,因为超过2X2矩阵大小可以递归地应用该算法。例如对于N X N矩阵,把矩阵分块,递归地应用Strassen算法,分治处理矩阵乘子块,可以将矩阵乘法的复杂度由原来的O(N3)降低为O(N2.81)。

参考文献[6]中较早地解释了如何用张量空间描述双线性操作,需要确定两个对应关系:(1)将矩阵乘法对应为表征张量(2)将表征张量的一种低秩分解 (将表征张量拆分为R个秩1的张量的和) 对应为一种包含R次数值乘法的矩阵乘法算法。

矩阵乘法描述张量

d41b020c59b3d55bc6ff3d0eec462f4b.png

就像线性运算可以表示为矩阵,双线性运算可以表示为张量,矩阵乘法张量代表矩阵乘法这种双线性运算。从本质上相当于引入了一种新语言,这种语言对于自动化发现算法非常重要,因为这个张量记录了矩阵乘法的操作。需要指出的是这个张量表达的是在操作层次而不是在实例层次的内容,所以这个张量与想要相乘的具体矩阵无关。表示n x m与m x p矩阵相乘,需要张量大小为32860b05d9fff7fe451dce476fda8b3b.png。如上图,以两个2x2矩阵为例,对应的矩阵乘法张量大小为4x4x4。

张量中的元素要么是 0 要么是 1,并用1指示具体的乘法。a、b维度表示读,c维度表示写。若<ai,bj,ck> 位置是1,则代表ck中包括ai*bj的积。例如,为了得到76926c03e36831e295aa0bd56ab99b24.png要用55f6176e8ba06acc62b0158d0e7aac69.png  乘以0cc042c5ff42b276209be9ebea194e4d.png,因此在<ecb19a23ac7469dfd128dfbeb5f33d41.png,3f169b76a98fb5a6e9de4446bfc38627.png,3e3303a741e930985a03f0e6a96a8515.png>处为 1。同理,<738e79641b45c18e421654b6600219a4.png,0b6fdede78b71abfa6f89ec379a0b618.png,98539f0e5fcd6be968d85ca132558f89.png>位置的值也为1。因此这个描述标准算法的张量中共有8个1,其余为0。

矩阵乘法算法的张量分解描述

f260ef3a980d6c6ea92f4381bb08c8d1.png

如何通过张量如何描述矩阵乘法的算法?其实可以将具体算法看作是这个特定张量的一种低阶分解。与矩阵分解需要两个模式向量的外积进行求和类似,张量分解可以看作是三个模式向量的外积求和。如图,原始张量分解为R个秩(Rank)为1的张量的和,其中每个秩为1的张量是3个向量uq, vq,wq的外积。所以有了张量的分解就可以得到任何矩阵A和B相乘的一种算法。这个算法正是由上图的公式给出。需要指出的是这个分解的秩R是一个非常重要的属性,因为它控制着渐近复杂性。一旦通过张量分解得到算法就可以使用递归地将其应用于任意大小矩阵之间的乘法。

38a3a626cb2f5122a7149da6b7631616.png

如上图,使用这种张量分解“语言”同样可以描述Strassen算法。这里张量的大小为4x4x4,Strassen算法实际上对应于7个秩为1的分解。算法和张量分解之间对应关系如上图所示。从这个简单的例子可以看出,u向量表示的A矩阵中元素的线性组合,v向量表示B矩阵中元素的线性组合,u和v的外积表示相应线性组合值的一次标量乘法运算,并记为一个中间结果,w向量表示哪些最终结果包括该中间结果作为部分和。

现在面临的问题是,如果想找到矩阵乘法的快速算法,就需要找到矩阵乘法张量的低秩分解,即一个R较小的张量分解。与矩阵能够用多项式时间算法计算其秩非常不同,即使很尺寸很小的张量的秩的计算也非常困难,这正是可以使用机器学习的地方。

机器学习解决数学问题

应用机器学习解决数学问题的主要困难

03a9c79e626d44ab4d10c37ed90d4915.png

计算张量秩是非常非常困难的问题。通过前文的方法定义好了搜索空间后,考虑 N 阶方阵乘法的定义直接确定了张量 e6a7e694dfa3ecddbac557361b342bf1.png的每个元素的0/1取值,可以不断尝试对 bd5eb5f968a5214789f95386630ef80e.png进行低秩分解就可以实现 N 阶方阵乘法算法的自动搜索。搜索目标很简单,也就是用尽可能少的秩1张量凑出62068c310702cc49fba8fc5037a2c35f.png

为了解决这个问题,可以把尝试低秩分解的过程看作游戏,将张量作为三维棋盘,玩家可以做的是在每一步中从剩余张量中减去一个秩为1的张量并更新状态,如果到达零张量,则玩家获胜。由前面的描述可知,到达零张量所需的步数实际上就是对应张量的秩,为了使Agent 尽可能早地凑出零张量,每一步得到一个常数 -1的奖励;若指定的最长的步后没凑出零张量,会得到额外的的奖励,其数值与最后剩下的张量的秩有关,秩越大惩罚就越多。

然而,完成这样的游戏面临非常多的困难:1)动作空间非常大。秩为1的张量数量实际上是无限的。即使把它离散化也会得到一个非常非常大的动作空间。2)没有训练数据。像围棋这样的游戏可以在线找到很多专家游戏,但是并没有张量分解相应的训练数据。3)游戏中只有一个张量,并考虑如何去分解这个张量,问题本质上没有足够的机器学习所需要的多样性。4)对称性。

下图比较了不同游戏中Agent的动作空间的大小。在张量游戏中即使将所有元素离散化为-2、-1、0、1、2, 动作空间仍然非常大,不可能枚举所有这些情况。例如,两个2x2矩阵相乘的游戏中Agent具有108 的动作空间,如果是两个 5x5 矩阵相乘,那么对应的阶数为1052,与围棋相比动作空间大很多。找到一个很好的低阶分解无异于「大海捞针」,这也是许多数学问题中存在的巨大的挑战。

5f1fa09302f7fb627f01b6bb557ffe61.png

基于AlphaZero构建张量分解游戏

1227c2ef0679fb7bbe03daaf45098bbd.png

AlphaZero是一种强化学习算法,其包含 2 个组件即Actor和Learner。AlphaZero在训练的开始时候选择的动作很差,每个秩为1的张量相当于随机选择。Actor收集所有这些游戏,并将它们发送到Learner。Learner将尝试理解或者说模仿这些数据,通过对状态进行采样作为神经网络的输入。

网络的输出包括两个部分:第一个输出是策略即采取的下一步行动,第二个输出是价值(即对当前状态的估计),这里指当前情况下张量秩的估计。网络将尝试模仿游戏进行有效地训练,然后将训练后的网络发送回Actor,需要同时使用策略和价值来指导树搜索,因此也使得比仅仅进行随机搜索效果要好一点。蒙特卡洛树搜索(MCTS)尝试改进神经网络给出的策略和价值,并将这些改进的游戏发送给Learner。然后,神经网络再模拟该数据,再发送回Actor。这是一个自我强化的循环 ,也是取得突破的基础,最终显示出令人难以置信的能力。

使用机器学习解决数学问题的「秘笈」

为了让AlphaZero适应Tensor游戏,Fawzi 博士给出了 4 个特别的「秘笈」。

eae9519aa70f262060d9acb1afe6ae20.png

第一,合成数据。在数学问题中,可用数据不多所以需要依赖合成数据。很多数学问题表现得像“单边函数”,有一个方向很难但是其他方向很容易。例如张量分解很难,但是如果有一个分解,从它得到张量很容易。所以可以生成一些随机分解,然后从这个分解中创建张量,并通过这种方式生成很多随机张量和分解。这种方法的好处是很容易地将它合并到训练数据中,因此训练数据是混合训练数据。混合数据的真正挑战是,合成数据的分布可能与目标数据的分布相去甚远。但这种方法仍然非常有用,特别是在训练开始时这些合成数据能够帮助提供有关张量分解问题的更多信息。

75c3541c50a031f97d0c033a3f8ea26d.png

第二,目标多样化。正如之前所述,这个问题没有足够的多样性。从某种意义上说,游戏开始只考虑一个张量。但机器学习通常更关心测试分布,如果只关注这个张量,一遍又一遍地生成同一个游戏,基本上不会有足够的多样性。解决的方法是通过数学上等效的方式表达张量。原始张量以规范基表示,可以通过更改基得到新的张量。因为这些是非常不同的张量,神经网络会变得丰富,并使对称乘法张量更接近于训练数据分布。因为这些张量的数学等价性,如果找到其中任何一个的分解,都可以将它映射回规范基,所以求解其中一个等价于解决所有这些问题。

8a57a5e471b973321e8017ea93b5b25b.png

第三,训练一个多面手智能体,而不是几个专家智能体t。分别为不同尺寸张量训练一个智能体比训练分解所有这些张量的智能体更糟糕,智能体能够在不同规模之间转移技术,因此全能的智能体具有更好性能。对所有这些目标训练一个智能体,而不是为每个目标训练一个智能体,效率也要高得多。

b3527355f40d159559f3d49b8eb3ee48.png

第四,专用深度网络。神经网络架构对于嵌入先验知识非常重要。因为使用三维张量计算量很大,这里的主干网络将三维张量投影到 3 组特征中以降低维度。可以认为3个特征网格是张量的不同视图,每个代表 3 种模式中的 2 种。同时,这里的自注意力机制之间只存在于有限的组或者切片当中,因为属于同一切片的元素比不同切片的元素更相关,而且如果重排切片,张量的秩保持不变。通过对彼此更相关的元素进行受限的注意力操作,就将关于张量分解问题的直觉与先验纳入架构中。

成果

c1e1fe21fd54c9c4b5bd9c6070c84018.png

同一个Agent在所有不同的张量大小以及在不同的数域(离散域F2和实数域R)训练得到的结果如上图所示。AlphaTensor重新发现像Strassen算法等重要算法,在较大矩阵乘法上超越人类已知的结果,可以说越大的矩阵AlphaTensor 甩开人类的差距越大。传统算法用100次乘法对实现4x5乘以5x5的矩阵乘法,而人类的当下最好的算法将其减少到80次,AlphaTensor找到了只用76次乘法就能完成同样操作的算法。除此之外,AlphaTensor首次在有限域中改进了Strassen的两级算法。此外,AlphaTensor还发现了先进复杂度的多样化算法即每种大小的矩阵乘法算法多达数千种,表明矩阵乘法算法的空间比以前想象的要丰富。

38a1567c79bb9e6db7c6aa1c05a08ddd.png

AlphaTensor也可以用来寻找在特定硬件上加速算法,如英伟达V100 GPU和谷歌TPU v2。这里采用与之前完全相同的工作流程,仅仅增加了与该算法在特定硬件上的运行时间成正比的额外奖励。特别强调的是,强化学习的奖励不一定是可微的,而可以是任何可计算的函数。从下图可以看出这些算法在相同的硬件上比常用的算法快10-20%,这展示了AlphaTensor在优化任意目标上的灵活性。需要指出的是,在特定硬件上优化的加速算法在其他不同硬件上并不一定能够起到加速的效果。

d86b41b2011d019661a62894343ac906.png

结论

2b0366e84cdee0e14c0747b76328bda3.png

Fawzi博士最后总结到,像 AlphaZero等深度强化学习方法可以用于解决算法发现和组合问题中非常复杂的问题,该方法在这些领域有巨大的潜力。虽然存在无法保证最优解以及需要离散化空间等局限性,这种方法仍可普遍地适用于不同的双线性运算和其他搜索问题。无论在任何类型的域或任何空间,采用任何可计算的奖励函数,只要存在乘法加法表,就可以用这种方法。

参考链接

1. GitHub:https://github.com/deepmind/alphatensor

2. Paper:https://www.nature.com/articles/s41586-022-05172-4

3.paper-appendix:https://static-content.springer.com/esm/art%3A10.1038%2Fs41586-022-05172-4/MediaObjects/41586_2022_5172_MOESM1_ESM.pdf

4. 中文视频:http://www.deeprlhub.com/d/942-alphatensorslide

5. DeepMind blog: https://www.deepmind.com/blog/discovering-novel-algorithms-with-alphatensor

6. Smirnov, A. V. (2013). The bilinear complexity and practical algorithms for matrix multiplication. Computational Mathematics and Mathematical Physics, 53(12), 1781-1795.

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

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

相关文章

Burpsuite超详细安装教程(附安装包)

写在开头 Burp Suite 是用于攻击web 应用程序的集成平台&#xff0c;包含了许多工具。Burp Suite为这些工具设计了许多接口&#xff0c;以加快攻击应用程序的过程。所有工具都共享一个请求&#xff0c;并能处理对应的HTTP 消息、持久性、认证、代理、日志、警报。 接下来我来…

软件测试面试经 | 双非院校,从外包到外企涨薪85%,他的涨薪秘籍全公开

本文为霍格沃兹测试开发学社优秀学员跳槽笔记&#xff0c;测试开发进阶学习文末加群。 本身是一所不入流的院校毕业的一名建工类专业的瓜娃子&#xff0c;至今记得当初是因为找工作被培训公司忽悠才加入到这个行业的&#xff0c;抱着做着试试的想法这一干在深圳就是6年&#xf…

excel替换技巧:如何将手机号码的部分数字变成星号

每个销售员经常会接触大量客户&#xff0c;会用小本本记下众多客户的信息&#xff0c;而手机号码就是其中重要的一项。为了保护客户隐私&#xff0c;在公开的信息里销售员需要把客户手机号码的部分数字变成星号。比如说&#xff0c;把客户A的手机号码15867852976修改成158****2…

SpringMvc源码分析(三) 请求执行过程之获取MethodHandler

1.请求是如何关联到DispatcherServlet的 DispatcherServlet是Servlet的实现&#xff0c;遵循Servlet生命周期的规则。 Servlet的生命周期即其出生到死亡的过程中分别会调用Servlet里的以下方法&#xff1a; 加载和实例化&#xff1a;可以参考SpringMvc源码分析一 init方法…

【JavaEE】博客前端

目录 一、列表页 1.1导航条 1.2主题区域 1.2.1个人信息框 1.2.2 内容区 二、登录页 三、详情页 一、列表页 整体布局如下&#xff1a; 1.1导航条 导航条分为三块&#xff0c;整体都设置id为导航栏&#xff0c;然后左右分为导航栏左和导航栏右。左边靠左&#xff0c;右边靠…

计算机视觉Computer Vision课程学习笔记四之Region and Edge Descriptions

第四章讲了区域和边界的描述 包括最佳区域评估方法&#xff0c;多物体识别&#xff0c;标签算法&#xff0c;斑点标记 以及矩评估的方法和优劣 Region Description Simple measurements on binary images • Use for recognition, etc. • Generate region descriptions whic…

Win10+CMake+VS2017编译OpenCV4.5.5

第一步&#xff1a;准备工作1 下载opencv4.5.5下载OpenCV4.5.5&#xff0c;并解压到自己新建文件夹opencv下。2 下载opencv_contrib4.5.5下载opencv_contrib4.5.5&#xff0c;解压到上面的opencv文件夹中&#xff0c;并在opencv文件夹中新建一个build文件夹&#xff0c;用来存放…

第一天总结 之 用户管理界面的实现 之 添加操作 的实现

添加操作的实现 明确页面的跳转 找到 admin_adduser.jsp中 form表单 前端的添加页面展示 在表单中输入 信息 点击注册跳转到 from表单对应的 action地址 UserAddServlet 创建UserAddServlet 从前端的form表单中获取值 然后在service层 进行 业务操作 即将这些属性存放在 Ob…

私有部署与SaaS模式网站有什么区别

什么是SaaS SaaS 是 Software-as-a-Service 的简称&#xff0c;它是一种通过互联网提供软件的模式。 以官网为例&#xff0c;SaaS订阅的网站通常统一部署在SaaS提供商的云服务器上。用户通过自己的实际需求订购对应的网站系统服务&#xff0c;按订购的系统功能、使用流量/存储…

Word处理控件Aspose.Words功能演示:用Java从Word文档中提取文本

Aspose.Words For .NET是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c;API支持所有流行的Word…

凭记忆错题记录-

3、某种部件用在2000合计算机系统中&#xff0c;运行工作1000小时后&#xff0c;其中有4台计算机的这种部件失效&#xff0c;则该部件的千小时可靠性度R为()。 A.0.990 B.0.992 C.0.996 D.0.998 【参考答案】D  8、9、X509数字证书标准推荐使用的密码算法是(8)&#xff0c;而…

计算机视觉Computer Vision课程学习笔记八之Recognition识别 low level

第八章讲了全局图像识别的方法 距离 空间特征 简单的分类模型 Recognition (low level / global matching) Task – from a description of the image in terms of “good” features (not just blobs) extract a meaning • Detect • Classify • Etc. • Techniques – Te…

C++动态规划超详细总结

动态规划首先来介绍一下动态规划&#xff0c;但我不想用过于官方的语言来介绍。动态规划是一种思想&#xff0c;它常用于最优解问题&#xff08;即所有问题包括所有子问题的解为最优解&#xff09;&#xff0c;它有点像递推&#xff0c;是在已知问题的基础上解决其他问题。这种…

【openWrt】安装后进行定制

修改openWrt管理后台默认端口vim /etc/config/uhttpd修改如下图内容然后重启uhttpd服务即可生效etc/init.d/uhttpd restart修改openWrt软件包源可以在openwrt后台改也可以在/etc/opkg/distfeeds.conf直接改vim /etc/opkg/distfeeds.conf配置如下src/gz handsomemod_core https:…

通讯录的实现

问天下谁与争锋&#xff0c;唯我傲视苍穹 此句赠与在看文章的你 该通讯录使用的语言是C语言&#xff0c;涉及的知识有动态开辟内存&#xff0c;和文件内存管理。 动态开辟内存是用来不断给通讯录增加容量的 文件管理是用来将通讯录的信息存储到文件里。 我会先从简单的写起&am…

公司裁员70%,小组从20个人降到5个人,年底公司耍无赖,全员打绩效C,就为了不发年终奖!...

年终奖写进合同&#xff0c;公司还能耍赖不给吗&#xff1f;一位网友吐槽&#xff1a;坐标小公司&#xff0c;公司裁员70%&#xff0c;自己组从20个人降到5个人。现在年底了&#xff0c;公司耍无赖&#xff0c;全员打绩效C&#xff0c;就为了不发年终奖&#xff01;年终奖都是写…

454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和

454. 四数相加 II 巧用哈希表&#xff0c;哈希表键值对对应的是两数之和&#xff0c;两数之和出现次数。 首先定义 一个unordered_map&#xff0c;key放a和b两数之和&#xff0c;value 放a和b两数之和出现的次数。遍历大A和大B数组&#xff0c;统计两个数组元素之和&#xff0…

Nginx与LUA(4)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;Nginx既然可以限制流量&#xff0c;那能不能「扩展」流量呢&#xff1f;当然可以&#xff0c;但可能不是你想象的那种「扩展」&#xff0c;更准确地来说是复制&am…

KVM虚拟化基本操作

1&#xff0c;虚拟化的一些介绍 虚拟化软件是可以让一台物理主机建立与执行一至多个虚拟化环境的软件&#xff0c;虚拟化将硬件、操作系统和应用程序一同封装一个可迁移的虚拟机档案文件中。 安装位置分类 目前从Hypervisor(虚拟机管理程序)安装位置分类&#xff0c;虚拟化层…

[linux] 进程相关概念理解

文章目录1. 什么是进程管理本质的解释描述组织结论2.查看进程查看进程方法1创建终端输入命令显示进程一个程序存在多个进程查看进程方法2查看成功查看失败结论3.通过系统调用获取进程标识符1.获取PID值验证PID值是否正确2. 获取父进程PID值验证3. 父进程为什么不变化&#xff1…