VQ一下Key,Transformer的复杂度就变成线性了

news2024/9/30 15:32:41

613939a7daba5c85ba3bd801d6eb2b38.gif

©PaperWeekly 原创 · 作者 | 苏剑林

单位 | 月之暗面

研究方向 | NLP、神经网络

Efficient Transformer,泛指一切致力于降低 Transformer 的二次复杂度的工作,开始特指针对 Attention 的改进,后来更一般的思路,如傅立叶变换、线性 RNN 等,也被归入这个范畴。不得不说,为了降低 Transformer 的二次复杂度,各路大牛可谓是“八仙过海,各显神通”,各种神奇的思路“百花齐放”,笔者也从中学习到了不少理论知识。

然而,尽管 Efficient Transformer 在理论上是精彩的,但实际上该领域一直都是不愠不火的状态,并没有实际表现十分出色的模型,在 LLM 火爆的今天,甚至已经逐渐淡出了大家的视野,也淡出了笔者的兴趣范围。

不过,最近有一篇论文《Transformer-VQ: Linear-Time Transformers via Vector Quantization》[1],却让笔者为之拍案叫绝。作者非常高明地洞察到,只需要对标准 Attention 的 Key 做一下 VQ(Vector Quantize),复杂度就会自动降低为线性!这种线性化思路保留了标准 Attention 的形式,是标准 Attention 到线性 Attention 的一个完美过渡,同时最大程度上保留了标准 Attention 的能力。

c9c95b6b8e964d4a739d6a59de8af297.png

高效难题

说起来,本站也算是比较早关注 Efficient Transformer 相关工作了,最早可以追溯到 2019 年解读 Sparse Transformer 的一篇文章《为节约而生:从标准Attention到稀疏Attention》。此后,陆续写的关于 Efficient Transformer 的其他文章还有:

线性Attention的探索:Attention必须有个Softmax吗?

Performer:用随机投影将Attention的复杂度线性化

Nyströmformer:基于矩阵分解的线性化Attention方案 [2]

Transformer升级之路:从Performer到线性Attention

线性Transformer应该不是你要等的那个模型

FLASH:可能是近来最有意思的高效Transformer设计

Google新作试图“复活”RNN:RNN能否再次辉煌?

然而,正如本文开头所说,尽管 Efficient Transformer 已有不少工作,也曾被大家寄予厚望,但实际上该领域一直都没什么能“出圈”的作品,这其中的原因可能是:

1. 不少 Efficient Transformer 的提速以牺牲效果为代价;

2. 很多 Efficient Transformer 的复杂度降低仅仅是理论上的,实际使用提升不明显;

3. 有些 Efficient Transformer 难以用来训练 Causal LM,所以在 LLM 流行的今天就没有了用武之地;

4. Flash Attention 的出现表明即便是标准的 Transformer 仍有很大的提速空间。

21231580a1a8f013e6a937145077f659.png

VQ一下

那么,Transformer-VQ 为何又具备的“出圈”潜力?

简单来说,Transformer-VQ 就是对 Attention 的 Key 向量序列进行了“聚类”,并用所属类的类别中心近似原向量,然后 Attention 的复杂度就变成线性了。也就是说,Transformer-VQ 仅仅改变了 Key 的形似,其余部分(理论上)完全不变,所以这是一种对 Attention 改动非常小的线性化方案,也能非常清楚体现出线性化后损失的精度在哪里(即用类别中心近似原向量的差距)。

铺垫得有点多了,现在我们正式介绍 Transformer-VQ。首先,我们假设 ,标准 Attention 就是

35ee34e1239ebfee437513c1f9488f4a.png

简单起见,这里省略了 scale factor。Transformer-VQ 改为

b00ed3f46b8d401dd7d324936a998e77.png

其中 是训练参数,也是 VQ 的编码表(Codebook)。对了,这里的 “VQ” 就是指 VQ-VAE 中的 VQ,不了解的读者可以移步参考《VQ-VAE的简明介绍:量子化自编码器》[3] 和《简单得令人尴尬的 FSQ:“四舍五入”超越了 VQ-VAE》,这里不重复介绍了。总之,经过 之后,最直接的表现就是 的每个向量都变成了 中与之最相近的那个,这意味着 的每个向量都是 的向量之一,用数学的语言就是说 变成了。

a4d420d56a2a77f90a2a0f058dbc0b0f.png

Encoder

当然,直接按照式(2)去实现 Transformer-VQ 的话,复杂度还是二次的,但由于 的每个向量都是 的向量之一,所以我们可以先算 ,然后从中“挑出” 对应的结果,而由于 的大小是固定的,所以关键运算 的复杂度是线性的,这就是 Transformer-VQ 能线性化的原理(我们不妨称为“挑出”技巧)。

作为铺垫,我们先考虑双向注意力的 Encoder 情形。由于

c045393c6b4311b9a725bdef5424d2c7.png

这里 指的是 大小的全1矩阵,分母可以视为分子的一个特殊形式,所以我们只需要考虑分子 。由于 的每个向量都是 中之一,所以我们可以构建一个 one hot 矩阵 ,其中 是一个 one hot 向量,如果 1 所在的维度为 ,那么 ,于是 。

于是对于 Transformer-VQ 来说有:

b5feb4aa0cece3298d33a7e3d10f57ce.png

很明显,这里最关键的地方就是第二个等号!对于 one hot 矩阵 ,右乘以它的转置可以从 中分离出来,这就是原理中的“挑出”技巧的数学表述。分离出来之后,由于矩阵乘法结合律, 可以先跟 相乘,得到一个 的矩阵,而 是一个 的矩阵,乘以 就得到一个 的矩阵,总的理论复杂度是 。

最后,根据式(3),将 的结果代入去,就可以计算完整的 Attention 结果(可能还要加一些避免溢出的细节),整个过程可以在线性复杂度内完成。

7b4097793b80ff45b872684105b1bb58.png

Decoder

现在我们来考虑单向注意力的 Decoder,这是训练生成模型的关键,也是当前 LLM 的基础。有了 Encoder 的铺垫后,Decoder 理解起来也就没那么困难了。假设 是向量序列 的行向量之一,那么对于 Decoder 的分子有

7c28b3c328f70ef6be4fecfedbde1221.png

如果 不大,那么最后的式子可以直接用 算子完成,不过一般情况下,尤其是 Multi-Heaad 时,为了节省显存,通常是跟《线性Attention的探索:Attention必须有个Softmax吗?》中的“自回归生成”一节一样,转为 RNN 来递归计算,即设 ,那么

aa96f99cb68c4f0879d77e17de3bf8e5.png

在推理阶段这样 step by step 递归计算自然是没问题,但训练阶段 step by step 的话可能会比较慢,我们可以改为 block by block 来加速:不失一般性,设 , 代表 block_size, 代表 block 数目,block 切片 简写为 ,那么

9e958d1e7f027ff2f59fce85cb97da67.png

其中 是下三角的 Attention Mask,即当 时 ,否则 。于是记 后,我们有

12afbe16475bd8dc3399e25640403582.png

这样我们就将递归步数减少为 了,可以在保证线性效率的同时,更充分发挥硬件的并行能力。用同样的方式也可以计算分母,最后相除得到完整的 Attention 结果。

0b54b6be40deed6302a714e49da2d618.png

局域增强

就这样完了?并不是,如果仅仅是这样的话,Transformer-VQ 可能跟以往基于矩阵分解的 Kernelized Attention 如 Performer 并没有太多区别。当序列长度 远大于编码表大小 时,由抽屉原理我们知道部分编码向量必然会反复出现,甚至可以合理猜测所有编码向量应该会均匀分布在整个序列中。

这样一来,邻近 token 的 Attention 就会跟远处某些 token 的 Attention一样,也就是说模型无法区分远近,这本质上就是所有 Kernelized Attention都存在的低秩问题。

已有的经验告诉我们,对于语言模型来说,相对于远处的 token 的来说邻近的 token 往往更为重要,所以一个好的语言模型架构应该具有区分远近的能力。为此,Transformer-VQ 选择在 之后,加上一个 Sliding Window 形状的 Attention Bias(记为 ),来对邻近 token 进行加权,如下图:

453e91a99268ed13bfcf030c61e0dbd6.png

▲ Window Attention Bias 示意图

从最后一个图可以看出,如果将 Window 大小直接设为 block 大小 ,即 或者 时 ,那么在分 block 计算时,矩阵 顶多影响最邻近的两个 block,再远的 block 依旧可以用“挑出”技巧来线性化。为了便于下面的推导,我们记 ,那么

a9b25997682e95732fd543ab847ed90c.png

所以很明显,有(约定 都是全零矩阵):

760ced1cfea2f49d3e9495707ebedcc7.png

笔者认为, 的引入是 Transformer-VQ 是跟其他 Kernelized Attention 拉开差距的关键,为了减少参数量且支持变长生成,我们约束 的非零部分为 “Toeplitz 矩阵”,即 是 的函数,此时 就相当于加性相对位置编码。除了这种做法外,也可以考虑换为笔者之前提出的 ReRoPE,它是旋转位置编码的窗口版,跟 具有同样的相对位置编码形状。

6e90491504ea6b3242f6958e849514ea.png

梯度回传

等等,我们好像忘记了点什么。了解 VQ-VAE 的读者都知道,“ 的每个向量都是 的向量之一”只是前向传播的表现,反向传播用的可是原始的 ,这意味着即便不同位置的 等于同一个 ,但它们的梯度却不相等,这叫做 STE(Straight-Through Estimator)。由于 STE 的存在,“挑出”技巧理论上仅可用于推理阶段,训练阶段是无法线性化的。

没有其他办法了吗?确实如此,如果我们坚持要获得精确的梯度结果,那么并没有线性化效率的方案。然而,考虑到 VQ 的梯度本身就是近似的,所以 Attention 获取精确的梯度似乎也没多大必要。于是作者想了个折衷的方案:然是按照式 (10)进行递归计算,仅在前两项使用 STE(Key 序列可以获得梯度),而 的梯度直接停掉( 算子)

这样我们就保持了模型的线性性,同时也已经保留了最重要的梯度(邻近的两个 block),算是一个比较合理的近似方案。从这一点来看,Transformer-VQ 跟 Transformer-XL [4] 很像,Transformer-XL 在递归的同时也停掉了历史窗口的梯度,即历史窗口可以参与递归计算,不传递梯度。

解决了梯度回传问题之后,在自回归交叉熵损失的基础上,再上 VQ 带来的用来更新编码表的辅助 loss,就得到完整的训练目标了。当然,对于编码表的更新,Transformer-VQ 采用了直接滑动平均的方案,所以只补充了 Key 的辅助 loss,这些细节读者在熟悉 VQ-VAE 之后,稍微看一下原论文就理解了。

ee8e50ae57a69268a93d12c096a43996.png

实验结果

这一节我们来看一下原论文的实验结果。作者已经将代码开源如下:

Github:

https://github.com/transformer-vq/transformer_vq

值得指出的是,作者做 VQ 的基础架构并不是常规的 MHA(Multi-Head Attention),而是笔者一直很推崇的 GAU(Gated Attention Unit)+Softmax,Transformer-VQ更准确的命名应该是 “GAU-VQ”,不了解 GAU 的读者可以参考《FLASH:可能是近来最有意思的高效Transformer设计》和《听说Attention与Softmax更配哦》。简单来说,GAU 本身比 MHA 有着更高的效率,配合上 VQ 技巧后,就更加“如虎添翼”了。

实验方面,作者做了语言模型(ENWIK8、PG-19)和图像生成(IMAGENET64),所有的实验中的编码表大小都是 。模型最大参数量为 1.3B,虽然比不上主流的大模型参数量,但其实对于科研来说不算小了。实验结果总体来说算得上优异:

aaed0e96c94f60a4e4b6960941968513.png

▲ PG-19的实验结果

5a93e58c1a0e8f89747715b4304d7173.png

▲ 母语与非母语对话占比

最后,让人惊奇的是,Transformer-VQ 的作者只有一个,并且身份是 “Independent Researcher”。

a0bf0755c1a375497c4d0ea2f208c9bf.png

发散思考

笔者发现,从 Transformer-VQ 出发,可以联系到非常多的研究主题,这也是为什么笔者如此欣赏它的原因之一。

首先,再次为作者惊人的洞察力点赞,“只需 VQ一下Key,Transformer 的复杂度就会变成线性”这个发现实在太美妙了,它实现了标准 Attention 到线性  Attention 的自然过渡,并且可以通过加 Attention Bias 的方式让它比很多的 Kernelized Attention 都有效。然后,通过 VQ 进行“聚类”的方式,也比 Linformer [5]、Nyströmformer [2] 等更为高明,因为它防止了未来信息的泄漏,可以自然地用来做 Causal 的语言模型。

我们知道,VQ 本质上也是将序列转为离散 id 的运算,这跟 Tokenizer 的作用是非常相似的。从这个角度来看,Transformer-VQ 跟 MegaByte [6] 等模型一样,都是将 Tokenizer 内置在模型之中,并且相比 MegaByte,VQ 这一操作跟我们传统意义上的 Tokenizer 更为相似、直观。所以,Transformer-VQ 实际上非常适合用来训练直接以 Bytes 输入的 “No Tokenizer” 模型,事实上,上述 ENWIK8 实验就是 Bytes 输入,Transformer-VQ 效果明显优于 MegaByte。

相比近来出的 RetNet,Transformer-VQ 没有显式的远程衰减,所以 Long Context 能力有可能会更好,同时由于 Key 经过了 VQ,都是有限集合之一,所以不会出现没有学过的 Key,因此长度外推能力大概率也会更好。

虽然 Transformer-VQ 的基础架构 GAU 只是 Single-Head 的,但它在递归过程中模型记忆状态大小是 ,在默认的设置中,这比 Multi-Head 的 RetNet 还大(RetNet 的记忆状态大小是 ,默认设置下 ),因此,记忆容量理论上是足够的。

由于上一篇文章刚好写了《简单得令人尴尬的FSQ:“四舍五入”超越了VQ-VAE》,可能会有读者想知道可否用更简单的 FSQ 取代 VQ?笔者认为比较难,原因其实在上一篇文章给出了:

第一, 还属于 VQ 优于 FSQ 的编码数量范围,所以换 FSQ 大概率会掉效果;

第二,由于每层 Attention 的 Key 都要被VQ,所以平均来说 VQ 的 Encoder 和 Decoder 都不强,这种情况 VQ 近似精度更高,FSQ 更适合 Decoder 和 Decoder 都足够强的场景;

第三,Transformer-VQ 需要用的是 Key 被 VQ 之后的中心向量而不是 id,而 FSQ 则直接得到 id,反而不容易恢复为近似的中心向量。

除此之外,用 VQ 而不是 FSQ,使得 Transformer-VQ 有希望从现有的预训练模型如 LLAMA2 中微调过来,而不单单是从零训练。因为 VQ 具有鲜明的几何意义,跟 K-Means 有诸多相通之处,我们可以从现有预训练模型出发,选取一些样本计算出 Key,对 Key 进行 K-Means 得到中心向量作为编码表的初始化,然后在原模型基础上加上 VQ 进行微调。

不过 Transformer-VQ 不大好适配 RoPE,所以要如前面所说,RoPE 的模型要换成 ReRoPE 再 VQ 比较好,此时就可以不用加 Bias 了。

总之,在笔者眼中,Transformer-VQ 在众多 Efficient Transformer 工作中,是非常独特、出色而又潜力深厚的之一。

7e859b1f176bdee7927a4d9ebee8f116.png

文章小结

本文介绍了一个名为 Transformer-VQ 的 Efficient Transformer 方案,它基于“只需 VQ一下Key,Transformer 的复杂度就会变成线性”的观察结果进行展开,个人认为是一种非常独特且亮眼的线性化思路,实验结果也很优异。它既可以理解为一种更高明的线性 Attention/RNN 模型,也可以理解为一个带有“可训练的 Tokenizer” 的 Attention 模型。

outside_default.png

参考文献

outside_default.png

[1] https://arxiv.org/abs/2309.16354

[2] https://kexue.fm/archives/8180

[3] https://kexue.fm/archives/6760

[4] https://arxiv.org/abs/1901.02860

[5] https://arxiv.org/abs/2006.04768

[6] https://arxiv.org/abs/2305.07185

更多阅读

3385eb3cf2406a09399ad25aec734b88.png

8203a4ec46cae9dd72b174af8d4258d1.png

4d4a2c9f3906ade6047b98e0c4abdbf2.png

13a8c97d905c4673e62d80dc49aa9e5f.gif

#投 稿 通 道#

 让你的文字被更多人看到 

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析科研心得竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。

📝 稿件基本要求:

• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注 

• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题

• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算

📬 投稿通道:

• 投稿邮箱:hr@paperweekly.site 

• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者

• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿

cd84fb92e0a03a4fcc17b2c95875ce6a.png

△长按添加PaperWeekly小编

🔍

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

·

·

d7cd665dfb7f1dcf1a07f64d164bd204.jpeg

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

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

相关文章

Linux文件系统以及动静态库

目录 一、系统 I/O 1.1 接口介绍 1.2 系统调用和库函数 1.3 文件描述符 1.4 重定向 二、理解文件系统 2.1 inode 2.2 硬链接 2.3 软连接 三、动静态库 3.1 初识动静态库 3.2 静态库的打包与使用 3.2.1 打包 3.2.2 使用 3.3 动态库的打包与使用 3.3.1 打包 3.3…

四川劳动保障杂志社四川劳动保障编辑部四川劳动保障杂志2023年第10期目录

主题报道 四川抢抓“金九银十”招聘季多措并举稳就业促就业 举措频“上新” 金秋送岗忙 张玉芳; 2-5 法眼《四川劳动保障》投稿:cnqikantg126.com 筑牢长期护理保险基金安全防线 李科仲;赖晓薇; 6-7 调研 提升职业技能培训工作的举措 寇爵; 8-9 城乡…

2023.11.26 关于 Spring Boot 单元测试

目录 单元测试 优势 单元测试的使用 具体步骤 实现不污染数据库 阅读下面文章之前 建议点击下方链接了解 MyBatis 的创建与使用 MyBatis 的配置与使用 单元测试 单元测试 指对软件中的最小可测试单元进行检查和验证的过程单元测试 由开发人员在编码阶段完成,…

销售人员应该具备哪些良好心态和素养

销售人员应该具备哪些良好心态和素养 作为市场的前线战士,销售人员的心态与素养对于成功销售至关重要。以下所列举的,正是销售人员不可或缺的十种良好心态与专业素养,它们将帮助你更好地应对销售挑战,提升业绩。 1. 积极乐观的态…

11.盛最多的水的容器

一、题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 题目难度:中等 示例&a…

【备忘录】快速回忆ElasticSearch的CRUD

导引——第一条ElasticSearch语句 测试分词器 POST /_analyze {"text":"黑马程序员学习java太棒了","analyzer": "ik_smart" }概念 语法规则 HTTP_METHOD /index/_action/IDHTTP_METHOD 是 HTTP 请求的方法,常见的包括…

Flask 运用Xterm实现交互终端

Xterm是一个基于X Window System的终端仿真器(Terminal Emulator)。Xterm最初由MIT开发,它允许用户在X Window环境下运行文本终端程序。Xterm提供了一个图形界面终端,使用户能够在图形桌面环境中运行命令行程序。而xterm.js是一个…

物理世界中的等距3D对抗样本

论文题目:Isometric 3D Adversarial Examples in the Physical World 会议:NIPS 2022 点云: 点云——表达目标空间分布和目标表面特性的海量点集合,点包含xyz坐标信息 能够包含颜色等其他信息 使用顶点、边和面的数据表征的三维…

【操作宝典】SQL巨擘:掌握SQL Server Management的终极秘籍!

目录 ⛳️【SQL Server Management】 ⛳️1. 启动登录 ⛳️2. 忘记密码 ⛳️3. 操作数据库和表 3.1 新建数据库text 3.2 新建表 3.3 编辑表 3.4 编写脚本 ⛳️【SQL Server Management】 ⛳️1. 启动登录 需要开启服务 ⛳️2. 忘记密码 登录windows--> 安全性 -->…

基于Java SSM框架+Vue留学生交流互动论坛网站项目【项目源码+论文说明】

基于java的SSM框架Vue实现学生交流互动论坛网站演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所…

四川开启智能巡河形式,无人机水利行业应用再创新

在四川省某区域,复亚智能无人机系统以其独特的机场网格化部署得到成功应用,覆盖了该区域内多条市级、省级河流,成为水利行业的新亮点。这一先进系统以无人机水利行业应用为核心,通过网格化和信息化手段,实现了对水域环…

Java核心知识点整理大全19-笔记

目录 14.1.5.2. MemStore 刷盘 全局内存控制 MemStore 达到上限 RegionServer 的 Hlog 数量达到上限 手工触发 关闭 RegionServer 触发 Region 使用 HLOG 恢复完数据后触发 14.1.6.HBase vs Cassandra 15. MongoDB 15.1.1. 概念 15.1.2. 特点 16. Cassandra 16.1.1…

activate jrebel JRebel激活过程

1.下载反向代理 地址:https://pan.baidu.com/s/1wklvDtyrSBXE4I6lKCxXBg?pwdidos 下载完后双击运行 2.在idea中如下步骤点击:File ——> Setting... ——> JRebel ——> Activate now 填入Team URL 1.http://127.0.0.1:8888/uuid //这个…

用于图像分类任务的经典神经网络综述

🎀个人主页: https://zhangxiaoshu.blog.csdn.net 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️,如有错误敬请指正! 💕未来很长,值得我们全力奔赴更美好的生活&…

电脑如何录音?适合初学者的详细教程

“电脑怎么录音呀?参加了一个学校举办的短视频大赛,视频拍摄都很顺利,音乐却出了问题,朋友说可以用电脑录制一段音乐应付一下,可是我不会操作,有哪位大佬教教我!” 声音是一种强大的媒介&#…

回归预测 | MATLAB实现SMA+WOA+BOA-LSSVM基于黏菌算法+鲸鱼算法+蝴蝶算法优化LSSVM回归预测

回归预测 | MATLAB实现SMAWOABOA-LSSVM基于黏菌算法鲸鱼算法蝴蝶算法优化LSSVM回归预测 目录 回归预测 | MATLAB实现SMAWOABOA-LSSVM基于黏菌算法鲸鱼算法蝴蝶算法优化LSSVM回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现SMAWOABOA-LSSVM基于黏菌算法…

Ubuntu18.04磁盘取证-中难度篇

涉及的镜像文件: sdb.vhd uac.tar ubuntu.20211208.mem 需要利用的工具: volatility3 volatility2.6.1 FTK/Autopsy Strings 题干 容器是一个Ubuntu Linux 蜜罐,用来观察利用 CVE-2021-41773 的漏洞攻击者想要做什么。 您将看到一个 cr…

高仿IT之家微信小程序(附精选源码32套,涵盖商城团购等)

项目预览 主要包含主页资讯,圈子俩大模块 主页 资讯详情 圈子 相关代码 网络请求 import wx from wx import Fly from flyioconst request new Fly()request.interceptors.request.use((request) > {wx.showNavigationBarLoading()return request })requ…

Linux - 动静态库(下篇)

前言 在上篇博客当中,对静态库是什么,怎么使用,简单实现自己的静态库,这些做了描述,具体请看上篇博客: 本篇博客将会对 动态库是什么,怎么使用,简单实现自己的动态库&#xff0c…

什么是yum?

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 &#x1f…