【论文笔记】Multi-Task Learning as a Bargaining Game

news/2024/9/17 7:54:06/ 标签: 论文阅读, 人工智能, 深度学习

Abstract

本文将多任务学习中的梯度组合步骤视为一种讨价还价式博弈(bargaining game),通过游戏,各个任务协商出共识梯度更新方向。
在一定条件下,这种问题具有唯一解(Nash Bargaining Solution),可以作为多任务学习中的一种原则方法。
本文提出Nash-MTL,推导了其收敛性的理论保证。

1 Introduction

大部分MTL优化算法遵循一个通用方案。

  • 计算所有任务的梯度 g 1 , g 2 , ⋯ , g K g_1,g_2,\cdots,g_K g1,g2,,gK
  • 使用某种聚合算法 A \mathcal{A} A,聚合梯度,得到联合梯度 Δ = A ( g 1 , ⋯ , g K ) \Delta=\mathcal{A}(g_1,\cdots,g_K) Δ=A(g1,,gK)。最后采用单梯度优化算法更新模型参数。
    目前还没有原则性的、公理化的聚合方法。

本文将梯度组合视为一个合作讨价还价式博弈(cooperative bargaining game)来解决,每个玩家代表多任务中的一个任务,每个玩家的收益(utility)是梯度,所有玩家通过协商找到彼此达成一致的方向。
这个情景让讨价还价式博弈可以使用,从公理化的角度分析该问题。

在一定的公理下,讨价还价式博弈有唯一的解,称为纳什讨价还价解(Nash Bargaining Solution),这个解式最公平的,是最优的。

贡献:

  • 本文刻画了MTL的纳什讨价还价解,推导了一个有效的算法逼近这个值。
  • 从理论分析了本文方法,在凸和非凸的情况下建立了收敛性保证。
  • 实验表明Nash-MTL取得了最先进的效果。

2 Background

2.1 Pareto Optimality

MTL优化问题是多目标优化问题(multiple-objective optimization, MOO)的一个特例。
给定目标函数 ℓ 1 , ⋯ , ℓ K \ell_1,\cdots,\ell_K 1,,K,一个解 x x x的效果可以通过目标值 ( ℓ 1 ( x ) , ⋯ , ℓ K ( x ) ) (\ell_1(x),\cdots,\ell_K(x)) (1(x),,K(x))向量来表示。
MOO的主要性质是:由于向量上不存在自然的线性排序,因此并不总是可以比较解,因此没有明确的最优值。

我们说一个解 x x x优于 x ′ x' x,当且仅当 x x x在一个或多个任务上更好,而在其他任务上不差。
没有其他解更优的解,称为Pareto optimal,所有这样的解的集合成为Pareto front。在没有额外假设或用户偏好先验的情况下,无法从Pareto optimal中挑出最优解。

对于非凸问题,如果某点在包含它的某个开集内是Pareto最优的,则定义该点为局部Pareto最优。
如果某点存在梯度的凸组合,且梯度为0,则该点为Pareto stationary。Pareto stationary是Pareto optimal的必要条件。

2.2 Nash Bargaining Solution

在一个讨价还价博弈问题中,有 K K K个玩家,每个玩家的收益函数 u i : A ∪ { D } → R u_i:A\cup\{D\}\rightarrow\mathbb{R} ui:A{D}R,这个是每个玩家都希望最大化的。 其中 A A A是可能达成的协议的集合, D D D是不能达成协议的谈判破裂点,如果玩家没能达成协议,则玩家会默认 D D D

定义可能的收益集 U = { ( u 1 ( x ) , ⋯ , u K ( x ) ) : x ∈ A ⊂ R K U=\{(u_1(x),\cdots,u_K(x)):x\in A\subset\mathbb{R}^K U={(u1(x),,uK(x)):xARK d = ( u 1 ( D ) , ⋯ , u K ( D ) ) d=(u_1(D),\cdots,u_K(D)) d=(u1(D),,uK(D))
假设 U U U是凸紧的, U U U中存在一个点严格优于 d d d,称为存在 u ∈ U u\in U uU,使得 ∀ i : u i > d i \forall i: u_i>d_i i:ui>di

对于这样的收益集 U U U,两人讨价还价问题存在唯一解,该解满足以下性质或公理:Pareto optimality,对称性,无关方案独立性,仿射变换不变性。

Axiom 2.1 Pareto optimality

被认同的方案不能劣于其他方案。

Axiom 2.2 Symmetry

交换玩家的顺序后,最优解应当不变。

Axiom 2.3 Independence of irrelevant alternatives(IIA)

将收益集 U U U扩大到 U ~ ⊋ U \tilde{U}\supsetneq U U~U,解决方案在原始集合 U U U中, u ∗ ∈ U u^*\in U uU,那么最优解将仍是 u ∗ u^* u

Axiom 2.4 Invariance to affine transformation

将收益函数 u i ( x ) u_i(x) ui(x)变换成 u ~ i ( x ) = c i ⋅ u i ( x ) + b i \tilde{u}_i(x)=c_i\cdot u_i(x)+b_i u~i(x)=ciui(x)+bi c i > 0 c_i>0 ci>0,如果原始最优解的收益为 ( y 1 , ⋯ , y k ) (y_1,\cdots,y_k) (y1,,yk),那么变换后的最优解是 ( c 1 y 1 + b 1 , ⋯ , c k y k + b k ) (c_1y_1+b_1,\cdots,c_ky_k+b_k) (c1y1+b1,,ckyk+bk)

满足以上公理的唯一点被称为Nash bargaining solution,为
u ∗ = arg ⁡ max ⁡ u ∈ U ∑ i log ⁡ ( u i − d i ) s . t . ∀ i : u i > d i (1) u*=\arg\max_{u\in U}\sum_i\log(u_i-d_i) \ s.t. \forall i:u_i>d_i\tag{1} u=arguUmaxilog(uidi) s.t.∀i:ui>di(1)

3 Method

3.1 Nash Bargaining Multi-Task Learning

给定一个MTL优化问题和模型参数 θ \theta θ,目标是在以零点为中心,半径为 ϵ \epsilon ϵ的球 B ϵ B_\epsilon Bϵ内找到一个更新向量 Δ θ \Delta\theta Δθ
在讨价还价博弈情景下,可达成的协议为 B ϵ B_\epsilon Bϵ集合,谈判破裂点在零点(原参数 θ \theta θ不更新)。
定义每个玩家的收益函数为 u i ( Δ θ ) = g i T Δ θ u_i(\Delta\theta)=g_i^T\Delta\theta ui(Δθ)=giTΔθ,其中 g i g_i gi是模型参数为 θ \theta θ时任务 i i i的损失梯度。由于收益集是凸紧的,且收益是线性的,可以得出:可能的收益集合也是凸紧的。

基于主要假设,如果 θ \theta θ不是Pareto stationary,那么梯度是线性无关的。
在此猜想下,谈判崩裂点 Δ θ = 0 \Delta\theta=0 Δθ=0是列于 B ϵ B_\epsilon Bϵ中其他的解的。
如果 θ \theta θ不在Pareto front中,那么Nash bargaining solution具有如下形式:

Claim 3.1

G G G为一个 d × K d\times K d×K的矩阵,该矩阵第 i i i列为梯度 g i g_i gi
arg ⁡ max ⁡ Δ θ ∈ B ϵ ∑ i log ⁡ ( Δ θ T g i ) \arg\max_{\Delta\theta\in B\epsilon}\sum_i\log(\Delta\theta^T g_i) argmaxΔθBϵilog(ΔθTgi)的解是 ∑ i α i g i \sum_i \alpha_ig_i iαigi,其中 α ∈ R + K \alpha\in\mathbb{R}_+^K αR+K G T G α = 1 / α G^TG\alpha=1/\alpha GTGα=1/α的解, 1 / α 1/\alpha 1/α是逐元素倒数操作。

proof

该目标函数的导数是 ∑ i = 1 K 1 Δ θ T g i g i \sum_{i=1}^K \frac{1}{\Delta\theta^T g_i}g_i i=1KΔθTgi1gi。对于所有 Δ θ \Delta\theta Δθ向量, ∀ i : Δ θ T g i > 0 \forall i:\Delta\theta^T g_i>0 i:ΔθTgi>0,每个任务的收益函数以 Δ θ \Delta\theta Δθ的范数单调递增,显然 B ϵ B_\epsilon Bϵ球面上的解肯定是最优的。因此,最优点上的梯度 ∑ i = 1 K 1 Δ θ T g i g i \sum_{i=1}^K \frac{1}{\Delta\theta^T g_i}g_i i=1KΔθTgi1gi一定是径向的,如 ∑ i = 1 K 1 Δ θ T g i g i = λ Δ θ \sum_{i=1}^K\frac{1}{\Delta\theta^T g_i}g_i=\lambda \Delta\theta i=1KΔθTgi1gi=λΔθ

由于梯度之间互相独立,有 Δ θ = ∑ i α i g i \Delta\theta=\sum_i\alpha_i g_i Δθ=iαigi ∀ i : 1 Δ θ T g i = λ α i \forall i:\frac{1}{\Delta\theta^T g_i}=\lambda \alpha_i i:ΔθTgi1=λαi。(向量之间线性无关)
下降方向内积为正,因此可以得到 λ > 0 \lambda>0 λ>0。设定 λ = 1 \lambda=1 λ=1来确定 Δ θ \Delta\theta Δθ(范数可能更大)的方向。

现在找到bargaining solution的问题已经简化为找到一个 α ∈ R K \alpha\in\mathbb{R}^K αRK α i > 0 \alpha_i>0 αi>0,使得 ∀ i : Δ θ T g i = ∑ j α j g j T g i = 1 α i \forall i:\Delta\theta^T g_i=\sum_j\alpha_j g_j^T g_i=\frac{1}{\alpha_i} i:ΔθTgi=jαjgjTgi=αi1,这等价于 G T G α = 1 / α G^TG\alpha=1/\alpha GTGα=1/α,其中 1 / α 1/\alpha 1/α是逐元素取倒数。

现在为该解提供一些直观的说明。
首先,如果所有的 g i g_i gi是互相正交的,则有 α i = 1 / ∣ ∣ g i ∣ ∣ \alpha_i=1/||g_i|| αi=1/∣∣gi∣∣ Δ θ = ∑ g i ∣ ∣ g i ∣ ∣ \Delta\theta=\sum \frac{g_i}{||g_i||} Δθ=∣∣gi∣∣gi。这是明显的尺度不变解。
如果非相互正交,可得:
α i ∣ ∣ g i ∣ ∣ 2 + ∑ j ≠ i α j g j T g i = 1 α i (2) \alpha_i||g_i||^2+\sum_{j\neq i}\alpha_j g_j^T g_i=\frac{1}{\alpha_i}\tag{2} αi∣∣gi2+j=iαjgjTgi=αi1(2)
∑ j ≠ i α j g j T g i = ( ∑ j ≠ i α j g j ) T g i \sum_{j\neq i}\alpha_j g_j^T g_i=(\sum_{j\neq i}\alpha_j g_j)^T g_i j=iαjgjTgi=(j=iαjgj)Tgi可以被认为是任务 i i i对其他任务的影响。

  • 如果这个值是正值,说明存在正向影响,其他任务的梯度有助于第 i i i项任务。
  • 如果这个值是负值,说明存在负面影响,其他任务的梯度有碍于第 i i i项任务。

当该值为负值时,Eq.2等式左边变小,需要通过 α i \alpha_i αi变大来补偿。
当该值为正值时, α i \alpha_i αi变小。

3.2 Solving G T G α = 1 / α G^T G\alpha=1/\alpha GTGα=1/α

本节描述如何通过一系列凸优化问题有效逼近 G T G α = 1 / α G^TG\alpha=1/\alpha GTGα=1/α的最优解。

定义 β i ( α ) = g i T G α \beta_i(\alpha)=g_i^TG\alpha βi(α)=giTGα,希望找到一个 α \alpha α使得 ∀ i , α i = 1 / β i \forall i, \alpha_i=1/\beta_i i,αi=1/βi,或等价于 log ⁡ ( α i ) + log ⁡ ( β i ( α i ) ) = 0 \log(\alpha_i)+\log(\beta_i(\alpha_i))=0 log(αi)+log(βi(αi))=0
φ i ( α ) = log ⁡ ( α i ) + log ⁡ ( β i ( α ) ) \varphi_i(\alpha)=\log(\alpha_i)+\log(\beta_i(\alpha)) φi(α)=log(αi)+log(βi(α)) φ ( α ) = ∑ i φ i ( α ) \varphi(\alpha)=\sum_i\varphi_i(\alpha) φ(α)=iφi(α),目标是找到非负 α \alpha α使得 ∀ i , φ i ( α ) = 0 \forall i,\varphi_i(\alpha)=0 i,φi(α)=0。于是优化问题变成:
min ⁡ α ∑ i φ i ( α ) , s . t . ∀ i , − φ i ( α ) ≤ 0 , α i > 0 (3) \min_\alpha\sum_i\varphi_i(\alpha),\ s.t.\forall i, -\varphi_i(\alpha)\leq 0, \ \alpha_i>0\tag{3} αminiφi(α), s.t.∀i,φi(α)0, αi>0(3)
约束是凸的且线性的,但是目标函数是凹的。首先尝试解决下面的凸目标函数:
min ⁡ α ∑ i β i ( α ) , s . t . ∀ i , − φ i ( α ) ≤ 0 , α i > 0 (4) \min_\alpha\sum_i\beta_i(\alpha),\ s.t.\forall i, -\varphi_i(\alpha)\leq 0, \ \alpha_i>0\tag{4} αminiβi(α), s.t.∀i,φi(α)0, αi>0(4)
这里最小化 β i = g i T G α ≥ 1 / α i \beta_i=g_i^TG\alpha\geq 1/\alpha_i βi=giTGα1/αi约束下的 ∑ i β i \sum_i\beta_i iβi。虽然这个目标函数并不等价于原始问题,但却非常有效。很多情况下,得到的 φ ( α ) = 0 \varphi(\alpha)=0 φ(α)=0,符合需求。

为了进一步近似,考虑下面的问题:
min ⁡ α ∑ i β i ( α ) + φ ( α ) , s . t . ∀ i , − φ i ( α ) ≤ 0 , α i > 0 (5) \min_\alpha\sum_i\beta_i(\alpha)+\varphi(\alpha),\ s.t.\forall i, -\varphi_i(\alpha)\leq 0, \ \alpha_i>0\tag{5} αminiβi(α)+φ(α), s.t.∀i,φi(α)0, αi>0(5)
在目标函数中加入 φ ( α ) \varphi(\alpha) φ(α)可以进一步减小 φ ( α ) \varphi(\alpha) φ(α),虽然这可能导致问题是非凸的。但此时解可以被迭代地改进,通过将凹项 φ ( α ) \varphi(\alpha) φ(α)替换为其一阶近似 φ ~ τ ( α ) = φ ( α ( τ ) ) + ∇ φ ( α ( τ ) ) T ( α − α ( τ ) ) \tilde{\varphi}_\tau(\alpha)=\varphi(\alpha^{(\tau)})+\nabla\varphi(\alpha^{(\tau)})^T(\alpha-\alpha^{(\tau)}) φ~τ(α)=φ(α(τ))+φ(α(τ))T(αα(τ))(泰勒展开)。其中, α ( τ ) \alpha^{(\tau)} α(τ)是第 τ \tau τ轮迭代的解。这里只替代目标函数中的 φ \varphi φ,不替代约束中的。由于没有改变约束,对任意的 τ \tau τ α ( τ ) \alpha^{(\tau)} α(τ)总是满足原问题的约束。

最后,下面的命题表明,原始目标随 τ \tau τ单调递减:

Proposition 3.2

在Eq.5的优化问题中,将目标函数表示为 φ ( α ) = ∑ i β i ( α ) + φ ( α ) \varphi(\alpha)=\sum_i\beta_i(\alpha)+\varphi(\alpha) φ(α)=iβi(α)+φ(α)。于是对于所有 τ > 1 \tau>1 τ>1 φ ( α ( τ + 1 ) ) ≤ φ ( α τ ) \varphi(\alpha^{(\tau+1)})\leq \varphi(\alpha^{\tau}) φ(α(τ+1))φ(ατ)

3.3 Practical Speedup

许多主流MTL方法的缺点是需要所有任务梯度来获取联合更新的方向。当任务数量 K K K很大时,非常耗费计算资源。

实际操作中发现,使用特征级梯度作为共享参数的替代会显著降低本文方法的性能。
本文提议:每隔几次迭代,更新一次梯度权重 α ( t ) \alpha^{(t)} α(t),而不是每次迭代。这种方法在维持原有效果的同时显著降低运行时间。

Algorithm 1 Nash-MTL

输入:初始参数向量 θ ( 0 ) \theta^{(0)} θ(0),可微损失函数 { ℓ i } i = 1 K \{\ell_i\}_{i=1}^K {i}i=1K,学习率 η \eta η

对于每一轮迭代 t = 1 , ⋯ , T t=1,\cdots,T t=1,,T

计算任务梯度 g i ( t ) = ∇ θ ( t − 1 ) ℓ i g_i^{(t)}=\nabla_{\theta^{(t-1)}}\ell_i gi(t)=θ(t1)i
将矩阵 G ( t ) G^{(t)} G(t)的每一列设置为 g i ( t ) g_i^{(t)} gi(t)
通过 ( G ( t ) ) T G ( t ) α = 1 / α (G^{(t)})^TG(t)\alpha=1/\alpha (G(t))TG(t)α=1/α获得 α ( t ) \alpha^{(t)} α(t)
更新参数 θ ( t ) = θ ( t ) − η G ( t ) α ( t ) \theta^{(t)}=\theta^{(t)}-\eta G^{(t)}\alpha^{(t)} θ(t)=θ(t)ηG(t)α(t)

返回 θ ( T ) \theta^{(T)} θ(T)

5 Analysis

现在分析本文方法在凸和非凸情况下的收敛性。
即使是单任务,非凸优化也可能只收敛到一个稳定点,因此需要证明本文方法可以收敛到Pareto stationary点,即梯度的某个凸组合为0的点。如前所述,仍然假设在非Pareto stationary点时,梯度之间互相独立。这个假设排除了如两个相同任务的边缘情况。

通过将Assumption 5.1中的Pareto stationary替换成局部Pareto optimality,可以证明算法收敛到局部Pareto optimal point。
这一假设具有重要意义,意味着可以避免任意特定任务中的局部最大值和鞍点。

Assumption 5.1

对于由本文算法得到的序列 { θ ( t ) } t = 1 ∞ \{\theta^{(t)}\}_{t=1}^\infty {θ(t)}t=1,集合中任意一点和任意极限处的梯度向量 g 1 ( t ) , ⋯ , g K ( t ) g_1^{(t)},\cdots,g_K^{(t)} g1(t),,gK(t)都是线性无关的,除非该点是Pareto stationary。

Assumption 5.2

假设所有损失函数都是可微的,有下界,并且所有的次级集合都是有界的。输入域是开放且凸的。

Assumption 5.3

假设所有损失函数都是光滑的:
∣ ∣ ∇ ℓ i ( x ) − ∇ ℓ i ( y ) ∣ ∣ ≤ L ∣ ∣ x − y ∣ ∣ (6) ||\nabla\ell_i(x)-\nabla\ell_i(y)||\leq L||x-y||\tag{6} ∣∣∇i(x)i(y)∣∣L∣∣xy∣∣(6)

Theorem 5.4

{ θ ( t ) } t = 1 ∞ \{\theta^{(t)}\}_{t=1}^\infty {θ(t)}t=1为由 θ ( t + 1 ) = θ ( t ) − μ ( t ) Δ θ ( t ) \theta^{(t+1)}=\theta^{(t)}-\mu^{(t)}\Delta\theta^{(t)} θ(t+1)=θ(t)μ(t)Δθ(t)生成的参数序列, Δ θ ( t ) = ∑ i = 1 K α i ( t ) g i ( t ) \Delta\theta^{(t)}=\sum_{i=1}^K\alpha_i^{(t)}g_i^{(t)} Δθ(t)=i=1Kαi(t)gi(t)是Nash bargaining solution ( G ( t ) ) T G ( t ) α ( t ) = 1 / α ( t ) (G^{(t)})^T G^{(t)}\alpha^{(t)}=1/\alpha^{(t)} (G(t))TG(t)α(t)=1/α(t)的解。
μ ( t ) = min ⁡ i ∈ [ K ] 1 L K α i ( t ) \mu^{(t)}=\min_{i\in[K]}\frac{1}{LK\alpha_i^{(t)}} μ(t)=mini[K]LKαi(t)1。于是,序列 { θ ( t ) } t = 1 ∞ \{\theta^{(t)}\}_{t=1}^\infty {θ(t)}t=1存在一个子序列收敛于Pareto stationary point θ ∗ \theta^* θ。进一步地,所有的损失函数 ( ℓ 1 ( θ ( t ) ) , ⋯ , ℓ K ( θ ( t ) ) ) (\ell_1(\theta^{(t)}),\cdots,\ell_K(\theta^{(t)})) (1(θ(t)),,K(θ(t)))也收敛到 ( ℓ 1 ( θ ∗ ( t ) ∗ ) , ⋯ , ℓ K ( θ ∗ ( t ) ∗ ) ) (\ell_1(\theta^*{(t)}*),\cdots,\ell_K(\theta^*{(t)}*)) (1(θ(t)),,K(θ(t)))


http://www.ppmy.cn/news/1521959.html

相关文章

I2VGen-XL模型构建指南

一、介绍 VGen可以根据输入的文本、图像、指定的运动、指定的主体,甚至人类提供的反馈信号生成高质量的视频。它还提供了各类常用的视频生成模型工具,例如可视化、采样、训练、推理、使用图像和视频的联合训练,加速等各类工具和技术。 &quo…

微信小程序显示后台文章副文本,图片和视频正常显示

解决方案: 使用 wxParse 或 rich-text 组件: 这两种方式可以解析 HTML 字符串并渲染富文本内容,包括图片和视频。 数据处理: 将后台返回的富文本数据进行处理,提取出图片和视频的链接,并将其转换成小程序支持的格式。 方案一:使…

数据库学习01——mysql怎么创建数据库和表

第一步:创建数据库 使用 create database 语句,后跟要创建的数据库名称: CREATE DATABASE dbname;例如,要创建名为 my_db 的数据库,请输入: CREATE DATABASE my_db ;使用 show databases; 语句检查数据库是…

第十六篇:走入计算机网络的传输层--传输层概述

1. 传输层的功能 ① 分割与重组数据 一次数据传输有大小限制,传输层需要做数据分割,所以在数据送达后必然也需要做数据重组。 ② 按端口号寻址 IP只能定位数据哪台主机,无法判断数据报文应该交给哪个应用,传输层给每个应用都设…

Java基础 ——线程

多线程 并行和并发 需求:边打英雄联盟和边听音乐 问题:只能先后关系,并不能同时发生 多进程或者多线程来解决 并行和并发: 并行:多件事情在同一时刻发生 并发:多件事情在同一时间段发生,同一…

无线信道中ph和ph^2的场景

使用 p h ph ph的情况: Rayleigh 分布的随机变量可以通过两个独立且相同分布的零均值、高斯分布的随机变量表示。设两个高斯随机变量为 X ∼ N ( 0 , σ 2 ) X \sim \mathcal{N}(0, \sigma^2) X∼N(0,σ2)和 Y ∼ N ( 0 , σ 2 ) Y \sim \mathcal{N}(0, \sigma^2)…

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证 目录 回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于贝叶…

端口安全老化细节

我们都知道port-security aging-time命令用来配置端口安全动态MAC地址的老化时间,但是后面还可以加上类型: [SW1-GigabitEthernet0/0/1]port-security aging-time 5 type absolute Absolute time 绝对老化 inactivity Inactivity time相对老化 …

详解 HTTPS 与 TLS证书链校验

一文详解 HTTPS 与 TLS证书链校验_证书链怎么验证-CSDN博客 深入浅出 SSL/CA 证书及其相关证书文件(pem、crt、cer、key、csr) https://zhuanlan.zhihu.com/p/702745054

ASP.NET Core 入门教学十七 GraphQL入门指南

GraphQL 是一种用于 API 的查询语言,允许客户端请求所需的数据,并能够合并多个资源到一个请求中。在 ASP.NET Core 中使用 GraphQL 可以提供更灵活、高效和实用的数据查询方式。以下是 ASP.NET Core 中 GraphQL 的入门指南: 1. 安装必要的 N…

【Android】程序开发组件—探究Jetpack

引言 Jetpack是一个开发组件工具集,它的主要目的是帮助我们编写出更加简洁的代码,并简化我们的开发过程,在这么多的组件当中,最需要我们关注的其实还是架构组件,接下来就对Jetpack的主要架构组件进行学习!…

Jmeter终极线程组“Ultimate Thread Group“如何使用?

1、安装,点击"选项",再点击"Plugins Manager",下载"Custom Thread Groups" 2、添加"jpgc - Ultimate Thread Group" 3、"jpgc - Ultimate Thread Group"使用

从C到Py:面向对象程序设计

面向对象思想 我们先来介绍一下两大编程思想,其一是面向过程,它强调功能上的封装,运用的是简单的线性思维,二是面向对象,它主要是对属性和行为上的封装,处理复杂的事物。 面向过程的典型语言是C语言&…

西门子PLC MODBUS TCP通信

1. PLC要读设备的数据,PLC作为CLIENT(客户端),第三方设备作为SERVER(服务端)。https://zhuanlan.zhihu.com/p/705926399 2.PLC作为服务端 3.1 Modbus TCP 通信S7-1200Modbus TCP通信 Modbus TCP 服务器指令 MB_SERVER V5.0 新功…

android 15升级适配无法安装运行,并且提示应用未安装

最近升级项目到android15,一开始遇到这个报错,以为是广播的问题,因为当时在Log中发现这个的报错 One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be 这条报错的解决方案依据 google开发者android14 关于这条的 原文: …

Git撤销add

git要提交版本第一步是add,就算是文件本身已经存在只是修改,也需要添加,即添加到暂存区。其中最偷懒和也保险的命令是: git add . 即添加了本地(多称工作目录)所有文件。 撤销add有以下文章: …

了解一下HTTP 与 HTTPS 的区别

介绍: HTTP是超文本传输协议。规定了客户端(通常是浏览器)和服务器之间如何传输超文本,也就是包含链接的文本。通常使用TCP【1】/IP协议来传输数据,默认端口为80。 HTTPS是超文本传输安全协议,具有CA证书。…

【2024数模国赛赛题思路公开】国赛D题思路丨附可运行代码丨无偿自提

2024年国赛D题解题思路 问题一 【题目】 投射一枚深弹,潜艇中心位置的深度定位没有误差,两个水平坐标定位均服从正态分布。分析投弹最大命中概率与投弹落点平面坐标及定深引信引爆深度之间的关系,并给出使得投弹命中概率最大的投弹方案&…

【时时三省】(C语言基础)指针进阶 例题3

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 例题: 这个arr里面是放了[a b c d e f \0] 第一个arr 这个sizeof是计算这个数组的大小 这个里面加上\0一共是7个元素 所以打印7 第二个arr0 这个指数组…

SQL进阶技巧:每年在校人数统计 | 区间重叠问题

目录 0 问题分析 1 数据准备 2 问题分析 3 小结 区间重叠问题 0 问题分析 有一个录取学生人数表 in_school_stu,记录的是每年录取学生的人数及录取学生的学制,计算每年在校学生人数。 1 数据准备 create table in_school_stu as ( select stack(5,1,2001,2,1200,2,2000…