深度探讨大模型位置编码及其外推性

news2024/11/23 15:47:15

深度探讨大模型位置编码及其外推性

作者:王嘉宁,转载请注明出处:https://wjn1996.blog.csdn.net/article/details/120607050

  现如今很多大模型都开始支持超过4096长度的推理,例如GPT-4支持超过30k,ChatGLM2-6B也支持最长为32K的文本,但是由于显存资源的限制,这些大模型在真正在训练过程中不一定要训练这么长的文本,通常在预训练时只会设计到4k左右,因此如何确保在模型推理阶段可以支持远远超过预训练时的长度,是目前大模型的核心问题之一,我们将这一问题归为大模型的外推性

  大模型的外推性目前主要在这两个方面考虑,也是提升最有效的两个角度:

  • 寻找或设计合适的位置编码;
  • 设计局部注意力机制。

  本文从这两方面进行深度探讨大模型的位置编码和外推性问题。


一、位置编码基础介绍

  对于一个token w i w_i wi,其表征向量记作 x i \mathbf{x}_i xi,对于一个句子 w = { w 1 , ⋯   } w=\{w_1, \cdots\} w={w1,}则表示为 x \mathbf{x} x。那么可以通过一个映射函数将这个句子中的token表征为 q m \mathbf{q}_m qm k n \mathbf{k}_n kn v n \mathbf{v}_n vn


其中 m m m n n n表示第 m m m和第 n n n个token。

1.1 绝对位置编码

  在Transformer中,采用正余弦函数来表示绝对位置,公式如下:

  这种编码方式又叫做Sinusoidal编码。直觉上看,第 i i i个位置的表征向量维度是 d d d,这个向量的奇数位置元素使用余弦值,偶数位置元素使用正弦值。
可视化图如下所示:

  • 相邻的位置编码向量很相似,较远的位置编码向量差异很大,说明基于正余弦函数的绝对位置可以表征位置的相关性;
  • 不需要显式地学习位置,提高效率。

  最后 f f f映射函数可以定义如下所示。即输入表征为token的表征和其对应的绝对位置表征。

该表征通常是直接将位置表征与Word表征直接相加。

1.2 相对位置编码

(1)显式的相对位置
  对于第 m m m和第 n n n个位置的token,其相对位置可以表示为 r = c l i p ( m − n , r m i n , r m a x ) r=clip(m-n, r_{min}, r_{max}) r=clip(mn,rmin,rmax),即两个token之间的相对距离,且由最大最小值做约束(相对位置不能超过最大值或小于最小值)。

  因此,相比于绝对位置,相对位置只需要有 r m a x − r m i n + 1 r_{max}-r_{min}+1 rmaxrmin+1个表征向量即可,即在计算两个token之间的attention值时,只需要在attention计算过程中注入这两个位置对应的相对位置 r r r对应的相对位置表征向量即可:

  这样一来,只需要有限个位置编码,就可以表达出任意长度的相对位置(因为进行了截断),不管是选择可训练式的还是三角函数式的,都可以达到处理任意长度文本的需求。

该表征通常是直接将位置表征与Word表征直接相加。
参考论文:《Self-Attention with Relative Position Representations》

(2)Transformer-XL(XLNet)

  将第 m m m和第 n n n个位置的QK计算进行了分解。引入了一些可学习的参数:
image.png
其中 p m \mathbf{p}_m pm表示待学习的第 m m m个token的相对位置向量, p n \mathbf{p}_n pn表示待学习的第 n n n个token的相对位置向量。通过分解让相对位置注入在attention的计算过程中。

该表征通常是在Attention计算过程中融入绝对位置。

(3)Transformer-XL的改进:
image.png第二和第四项使用相对位置表征 p ~ m − n \tilde{\mathbf{p}}_{m-n} p~mn来替换绝对位置表征。同时加入新的可训练参数 u \mathbf{u} u v \mathbf{v} v
该表征方法在T5模型中被首次使用,参考论文:《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》

该表征通常是在Attention计算过程中融入相对位置。

(4)可训练偏置项

  Transformer-XL中的位置表征是将QK分解为4项,而后面3个够项都有跟位置有关的参数,可以直接将后面的3项之和抽象为一个偏置:

进一步改造还可以得到:
以及:
这三种方法均是对Transformer-XL的表征形式进行改进。

二、RoPE旋转位置编码

  RoPE(Rotary Position Embedding)的出发点就是“通过绝对位置编码的方式实现相对位置编码”,或者可以说是实现相对位置编码和绝对位置编码的结合。这样做既有理论上的优雅之处,也有实践上的实用之处,比如它可以拓展到线性Attention中就是主要因为这一点。

2.1 复数的引入

  假设 q m \mathbf{q}_m qm k n \mathbf{k}_n kn是对应位置的二维行向量(即每个位置都有两个向量来表征位置),因此这个二维向量可以用复数来代替(包括实部和虚部),因此他们的内积可以作为其对应的Attention值。内积的计算可以由两个复数实现: ⟨ q m , k n ⟩ = R E [ q m k n ∗ ] \langle\mathbf{q}_m, \mathbf{k}_n\rangle=RE[\mathbf{q}_m\mathbf{k}_n^*] qm,kn=RE[qmkn],其中 ∗ ^* 表示共轭复数, R E [ ] RE[] RE[]表示取复数中的实部。

两个二维向量的内积,等于把它们当复数看时,一个复数与另一个复数的共轭的乘积的实部。

  因此当分别对 q m \mathbf{q}_m qm k n \mathbf{k}_n kn融入绝对位置时,即得到:
image.png

RoPE求解过程推导了如何确定获得每个位置编码是 q m e i m θ \mathbf{q}_me^{im\theta} qmeimθ

  可以发现,当乘以绝对位置 e i m θ e^{im\theta} eimθ e i n θ e^{in\theta} einθ时,等价于复数运算中乘以 e i ( m − n ) θ e^{i(m-n)\theta} ei(mn)θ,即相当于在复数空间中是相对位置 m − n m-n mn,这样就巧妙地通过复数运算的形式将绝对位置转换为相对位置。

  复数乘法的几何意义是向量的旋转,假设 f q , k ( x , m ) f_{q,k}(\mathbf{x}, m) fq,k(x,m)表示向量 x \mathbf{x} x m m m位置的位置编码,则有:

其中 q = W q x m \mathbf{q}=\mathbf{W}_q\mathbf{x}_m q=Wqxm k = W k x n \mathbf{k}=\mathbf{W}_k\mathbf{x}_n k=Wkxn

等价于
image.png

后面两项的乘积本质就是向量 q \mathbf{q} q(或 k \mathbf{k} k)的两个二维行向量。

  当向量维度为 d d d时( d d d为偶数),则可以扩展为:
image.png

每两个为一组二维向量,一共有 d / 2 d/2 d/2个组合,可以直接拼接作为 d d d维度的旋转位置编码。
二维扩展到多维的解读:Transformer升级之路:4、二维位置的旋转式位置编码 - 科学空间|Scientific SpacesTransformer升级之路:6、旋转位置编码的完备性分析 - 科学空间|Scientific Spaces

2.2 RoPE的实现

image.png

  • 当输入一个句子“Enhanced Transformer with Rotary Position Embedding”时,首先获得其Query和Key向量 q \mathbf{q} q k \mathbf{k} k,其对应的维度均为 d d d,然后对于向量中相邻两个元素为一组,可以得到 d / 2 d/2 d/2组(图中左下部分相同颜色的两个元素作为一组,对于每一组,一个文本则可以得到两个行向量);
  • 获得每个词的绝对位置编号(该句子由6个词,位置编号分别为1,2,3,4,5,6),假设取“Enhanced”单词为例,其第一组元素为 θ 1 \theta_1 θ1,位置为 m = 1 m=1 m=1,那么通过旋转位置编码可以的到新的元素值 x 1 ′ , x 2 ′ x_1', x_2' x1,x2
  • 所有单词的 d / 2 d/2 d/2个组合都按照这种形式进行“旋转”,即可得到新的位置编码(右下角)

RoPE一种线性的实现如下所示:

RoPE的性质

(1)远程衰减

  从图中我们可以可以看到随着相对距离的变大,内积结果有衰减趋势的出现。因此,选择 θ i = 1000 0 − 2 i / d θ_i=10000^{−2i/d} θi=100002i/d,确实能带来一定的远程衰减性。当然,能带来远程衰减性的不止这个选择,几乎任意的光滑单调函数都可以。如果以 θ i = 1000 0 − 2 i / d θ_i=10000^{−2i/d} θi=100002i/d为初始化,将 θ i θ_i θi视为可训练参数,然后训练一段时间后发现 θ i θ_i θi并没有显著更新,因此干脆就直接固定 θ i = 1000 0 − 2 i / d θ_i=10000^{−2i/d} θi=100002i/d了。

(2)优势

  1. 用一个旋转矩阵rotation matrix来对绝对位置进行编码,于此同时,meanwhile;
  2. 在自注意力机制中导入显式的位置依赖。
  3. 自由的序列长度;
  4. 随着相对位置的增大,而逐步延缓退化(=衰减)的inter-token dependency;
  5. 用相对位置编码来“武装”线性自注意力。

  具体来说,RoPE 使用旋转矩阵对绝对位置进行编码,同时将显式的相对位置依赖性纳入自注意公式中。 【核心的两个点,一个是“旋转矩阵”,一个是“显式的相对位置依赖”】。


三、长文本外推性

  外推性的含义是在长文本表征过程中,如何在训练阶段只需要学习有限的长度,即可以在推理阶段能够延伸长度至若干倍且依然保持不错的性能和效果。
长度外推性是一个训练和预测的长度不一致的问题,主要体现在两个方面:

  • 预测的时候用到了没训练过的位置编码(不论是绝对位置还是相对位置);
  • 预测的时候注意力机制所处理的token数量远超训练时的数量。

  解决长文本外推性问题的一个简单有效的方法是Attention Mask,如图所示:
image.png

  • 通过类似滑动窗口的结构,约束一个每个token只能对局部区域的token计算Attention值,因此对于相对位置大小不会超过窗口大小,解决了第一个问题;
  • Attention只会在窗口内计算,避免了对大量的token的Attention进行加权平均导致最终权重过度“平滑”现象。

  在实现过程中,本质上是在计算完 q m T k n \mathbf{q}_m^T\mathbf{k}_n qmTkn之后减去一个矩阵,即 q m T k n − M \mathbf{q}_m^T\mathbf{k}_n-M qmTknM,其中 M M M的形状如下图所示:

  可以看出,蓝色区域(即滑动窗口内的局部区域)为0,说明保持原始的Attention归一化前的值;其他区域则为一个INT内最大的整数,说明Attention值是一个非常小的数(在softmax归一化后几乎为0)。

3.1 ALIBI

论文:《Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation》

  其与上面的思想一样,只是改进了上面的 M M M矩阵为 λ ∣ m − n ∣ \lambda|m-n| λmn,即Attention在归一化前的计算为: q m T k n − λ ∣ m − n ∣ \mathbf{q}_m^T\mathbf{k}_n-\lambda|m-n| qmTknλmn,其中 λ > 0 \lambda>0 λ>0为超参数,Transformer的多头注意力中的每个头的值可设置不同。矩阵 λ ∣ m − n ∣ \lambda|m-n| λmn的形状如下所示:

  相比于原始的方法,相对距离越长, λ ∣ m − n ∣ \lambda|m-n| λmn值就越大,越远的位置Attention值被归一化后就约小,相对于“滑动窗口”采用的方法是hard(在窗口内就计算attention,不在窗口内不计算),AIBLI是比较soft的(离得近attention就会比较大,离得远就比较小)。

3.2 KERPLE

论文:《KERPLE: Kernelized Relative Positional Embedding for Length Extrapolation》

  其对ALIBI进行了一些改进,引入了两个可学习的参数 r 1 r_1 r1 r 2 r_2 r2来“动态”学习局部区域。如下图所示,左侧为原始的 q m T k n \mathbf{q}_m^T\mathbf{k}_n qmTkn,通过引入参数来动态减去AIBLI中的 λ ∣ m − n ∣ \lambda|m-n| λmn矩阵:

定义了两种模式,分别是power和logarithmic,分别对应没有对数和有对数的形式:
image.png

  在logarithmic模式中, r 1 r_1 r1控制了整体的量, r 2 r_2 r2相当于ALIBI中的 λ \lambda λ c c c是一个常数。苏神版简化写作:

3.3 Sandwich

论文:《Receptive Field Alignment Enables Transformer Length Extrapolation》

  Sandwich与KEPRLE是同一个作者提出的,其对KEPRLE进行了少量改进,即对应的公式改写为: q m T k n + λ p m T p n \mathbf{q}_m^T\mathbf{k}_n+\lambda\mathbf{p}_m^T\mathbf{p}_n qmTkn+λpmTpn,其中 p m \mathbf{p}_m pm p n \mathbf{p}_n pn可以使用Sinusoidal编码表示,即:

  由于Sinusoidal编码在单调性上等价于 ∣ m − n ∣ |m-n| mn,都是线性递增形式,因此Sandwich只是改头换面了。

3.4 XPOS

论文:《A Length-Extrapolatable Transformer》
参考解读:Transformer升级之路:7、长度外推性与局部注意力

  其在RoPE的基础上引入了局部注意力。RoPE的本质是:

其中:

在第2大节中已经介绍了RoPE是通过使用复数来实现绝对位置表示相对位置的。XPOS通过引入一个新的标量 ξ \xi ξ,即有:

  由于RoPE相对位置是 m − n m-n mn,而不是 ∣ m − n ∣ |m-n| mn,因此XPOS约束在了单向Transformer,从而避免了负数出现。

  XPOS又设计了一个局部感知的注意力机制Blockwise Causal Attention,进一步提升了局部注意力的性能,提升了长文本的外推性。


四、外推性的其他探索

(1)混合注意力Mask

  在解决长文本位置表征时,典型的代表有Transformer-XL、BigBird、LongFormer,他们除了局部注意力机制以外,还引入了随机位置的性质:
image.png
  如上图,第2张图为局部注意力(滑动窗口),第3章图为有限的全局感知(例如只限制前两个token可以看见所有的token)。而第一张图则是随机mask,以缓解过度hard的局部注意力。三者注意力混合起来后得到第四张图,这也是普遍训练超长文本大模型时采用的方法。

(2)随机位置表征

论文:《Randomized Positional Encodings Boost Length Generalization of Transformers》

  绝对位置表征时,会存在位置上的OOV问题,随机位置编码则是通过在训练过程中采用如下策略:
image.png
对应的代码也很简单:

def random_position_ids(N, L=2048):
    """从[0, L)中随机不重复挑N个整数,并从小到大排列
    """
    return np.sort(np.random.permutation(L)[:N])

  苏神对随机位置编码的新探索:
image.png
对应的代码为:

def random_position_ids(N):
    """先随机采样n,然后从[0, n]均匀取N个点
    """
    n = sample_from_xxx()
    return np.linspace(0, 1, N) * n

(3) log ⁡ n \log n lognAttention Scale

  原始的Attention计算公式为:

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q, K, V)=softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dk QKT)V

只需要简单的改成下面即可:

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( log ⁡ m n d k Q K T ) V Attention(Q, K, V)=softmax(\frac{\log_{m}n}{\sqrt{d_k}}QK^T)V Attention(Q,K,V)=softmax(dk logmnQKT)V

其中 m m m是训练时的最大长度, n n n是预测时的位置,通常来说 n > > m n>>m n>>m。直觉来看,就是直接在计算 Q K T QK^T QKT时,根据其相对位置来控制Attention的值。当 m m m n n n距离很远时, log ⁡ m n \log_mn logmn的值会很大,会使得整体Attention归一化后会比较平缓,有助于解决外推性问题。

(4)全局依赖

  滑动窗口的方法如果在一层Transformer Layer里看,本质上类似长度为 w w w的N-Gram模型,即如下图所示:

  如果Transformer又 L L L层,那么,从输入层开始,长度为 w w w的窗口内的信息,可以在经过 L L L层之后传给一个更广的区域,区域长度为 ( w − 1 ) L + 1 (w-1)L+1 (w1)L+1,如下图所示:

  苏神给出的一种新的想法,就是假设我有 L L L层Transformer,则可以在前 L − 1 L-1 L1层利用这种扩张特性,得到最终 ( w − 1 ) ( L − 1 ) + 1 (w-1)(L-1)+1 (w1)(L1)+1长度的区域后,在最后一层采用上面提到的 log ⁡ n \log n lognAttention Scale方法,讲前 L − 1 L-1 L1层扩张的信息快速在最后一层与所有token进行交互。引入苏神的原文为:
image.png  这种局部注意力+Attention Scale的结合也是一种很巧妙的idea。实验也发现这种策略的外推性很惊艳。


参考文献:

《Self-Attention with Relative Position Representations》
ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING
Transformer升级之路:4、二维位置的旋转式位置编码 - 科学空间|Scientific SpacesTransformer升级之路:6、旋转位置编码的完备性分析 - 科学空间|Scientific Spaces
《Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation》
《KERPLE: Kernelized Relative Positional Embedding for Length Extrapolation》
《A Length-Extrapolatable Transformer》
《Randomized Positional Encodings Boost Length Generalization of Transformers》
Transformer升级之路:7、长度外推性与局部注意力
【OpenLLM 009】大模型基础组件之位置编码-万字长文全面解读LLM中的位置编码与长度外推性(上)
Transformer升级之路:8、长度外推性与位置鲁棒性 - 科学空间|Scientific Spaces
Transformer升级之路:9、一种全局长度外推的新思路 - 科学空间|Scientific Spaces
Bias项的神奇作用:RoPE + Bias = 更好的长度外推性 - 科学空间|Scientific Spaces

  博客记录着学习的脚步,分享着最新的技术,非常感谢您的阅读,本博客将不断进行更新,希望能够给您在技术上带来帮助。


【大模型&NLP&算法】专栏

近200篇论文,300份博主亲自撰写的markdown笔记。订阅本专栏【大模型&NLP&算法】专栏,或前往https://github.com/wjn1996/LLMs-NLP-Algo即可获得全部如下资料:

  • 机器学习&深度学习基础与进阶干货(笔记、PPT、代码)
  • NLP基础与进阶干货(笔记、PPT、代码)
  • 大模型全套体系——预训练语言模型基础、知识预训练、大模型一览、大模型训练与优化、大模型调优、类ChatGPT的复现与应用等;
  • 大厂算法刷题;

在这里插入图片描述

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

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

相关文章

mysql数据库-----事务

目录 1.事务的概念 2. 事务的ACID特点 (1)脏读 (2)不可重复读 (3)幻读 (4) 丢失更新 1.事务的概念 MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说&…

Spring IoC 自定义简单实现案例

IoC 极简实现案例 1.引入依赖 <dependencies><dependency><!--Dom4j是java的XML解析组件--><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.1</version></dependency><dependency…

从VAE到Diffusion生成模型详解(2.1):普通GAN的改进及变种

文章目录 1. JS散度的问题2. LSGAN(Least Square GAN)LSGAN目标函数 3. WGAN&#xff08;wasserstein GAN&#xff09;WGAN的目标函数 4. 条件GANcGANSGANACGANInfoGANtext2imageimage2image 参考 1. JS散度的问题 上一篇博客从VAE到Diffusion生成模型详解(2)&#xff1a;生成…

Node+MySQL+Vue2.0+elementUI实现的博客管理系统(一)

前端部分&#xff1a; Vue项目的入口文件main.js: //引入Vue import Vue from vue //引入App import App from ./App.vue //引入VueRouter import VueRouter from vue-router import router from ./router/index import Vuex from vuex import store from ./store //完整引入…

数学专题训练2 组合计数

1. 硬币购物 4 种面值的硬币&#xff0c;第 i 种的面值是 C i C_i Ci​​。 n n n​ 次询问&#xff0c;每次询问给出每种硬币的数量 D i D_i Di​​ 和一个价格 S S S​&#xff0c;问付款方式。 n ≤ 1 0 3 , S ≤ 1 0 5 n\leq 10^3,S\leq 10^5 n≤103,S≤105​. 如果用…

第一百零九天学习记录:C++实战:职工管理系统(黑马教学视频)

1、管理系统需求 代码进入一个 while 循环&#xff0c;不断从文件流 ifs 中读取数据。循环的条件是 ifs 从文件中读取 id、name 和 dId 三个值的操作都成功。如果读取成功&#xff0c;循环内部的代码块会执行一次&#xff0c; num 的值加一。 这段代码的作用是从文件中逐行读取…

ENSP路由器的基本命令操作(第十六课)

ENSP路由器的基本命令操作(第十六课) 1-1 代码重点回顾 1 ipconfig 查看 pc机的IP地址2 ping 连接的IP地址3 system-view 进入系统视图4 [Huawei]interface GigabitEthernet 0/0/1 进入接口视图 过0/0/15 quit 返回上一层视图6 ctrlZ 快速返回用户视图7 [sy]sysna…

【V8】【2. 内联函数、Slot】

什么是内联函数 在 V8 执行函数的过程中&#xff0c;会观察函数中一些调用点 (CallSite) 上的关键的中间数据&#xff0c;然后将这些数据缓存起来&#xff0c;当下次再次执行该函数的时候&#xff0c;V8 就可以直接利用这些中间数据&#xff0c;节省了再次获取这些数据的过程&…

PS图层混合模式超详细解答-图层混合模式的原理(Part2)

对比度组 叠加Overlay 此模式是正片叠底和滤色的组合&#xff0c;组合依据是底图的中性灰平面&#xff0c;如果在 [ 0 , 128 ] [0,128] [0,128]则使用正片叠底&#xff0c;若是在 ( 128 , 255 ] (128,255] (128,255]之间&#xff0c;则是实用滤色。 公式 r O v e r L a y (…

专项练习29

目录 一、选择题 1、如果修改obj里面的name属性时会发生什么&#xff1f; 2、以下代码执行后&#xff0c;a.x 和 b.x 的结果分别为&#xff08;&#xff09; 3、在ECMAScript6 中,Promise的状态有&#xff08;&#xff09; 4、下面哪些方式在同一个窗口下能够检测一个js对象是…

解决:eclipse无法查看源代码

eclipse的jdk没有配置对应的src&#xff0c;需要手动去添加jdk的源代码附件。 步骤如下&#xff1a; 1、找到以下路径&#xff1a;windows(窗口)–>Preferences(首选项)–>Java–>Installed JRES(已安装的JRE)&#xff0c;出现如下图所示的图片后&#xff0c;选中点…

15 - 信号处理设计模式

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;Linux系统编程训练营 - 目录 文章目录 1. Linux应用程序安全性讨论1.1 问题1.2 不同场景1.2.1 场景一&#xff1a;不需要处理信号1.2.2 场景二&#xff1a;需要处理信号 2. 场景…

SQLmap使用指南(包含使用SQLmap获取shell)

文章标题 一&#xff1a;SQLmap基础知识二&#xff1a;SQLmap各大模块中的常用命令&#xff08;一&#xff09; 基础命令&#xff08;二&#xff09; target模块&#xff08;三&#xff09; Emuneration模块&#xff08;四&#xff09;其他命令 三&#xff1a;SQLmap应用示例&a…

数据结构_进阶(2):二叉树的OJ练习题

目录 1. 二叉树创建字符串。OJ链接 2. 二叉树的分层遍历1。OJ链接 3. 二叉树的分层遍历2。OJ链接 4. 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 。OJ链接 5. 二叉树搜索树转换成排序双向链表。OJ链接 6. 根据一棵树的前序遍历与中序遍历构造二叉树。 OJ链接…

2023年NOC决赛-加码未来编程赛项决赛模拟题-Python模拟题--卷4

第一题、计算 1+2+3+⋯+(n−1)+n 的值,其中正整数 n 不大于 100。由于你没有高斯聪明,所以你不被允许使用等差数列求和公式直接求出答案。 输入格式 输入一个正整数 n。 输出格式 输出一个正整数,表示最后求和的答案。 输入输出样例 输入 #1 100 输出 #1 5050 第二…

手撕自定义类型:结构体,枚举,联合——【C语言】

在开始学习之前我们先来欣赏一下五岳之一华山的风景&#xff0c;来营造一个好心情&#xff0c;只有一个好心情我们才能更好的学习 目录 结构体 1 结构体的声明 1.1 结构的基础知识 1.2 结构的声明 1.3 特殊的声明 1.4 结构的自引用 1.5 结构体变量的定义和初始化 1.6 …

Go语言之重要数组类型切片(slice)make,append函数

切片是一个动态数组&#xff0c;因为数组的长度是固定的&#xff0c;所以操作起来很不方便&#xff0c;比如一个names数组&#xff0c;我想增加一个学生姓名都没有办法&#xff0c;十分不灵活。所以在开发中数组并不常用&#xff0c;切片类型才是大量使用的。 切片基本操作 切片…

Linux系统文件编程及文件读、写操作

Linux 系统编程Day01 文章目录 Linux 系统编程Day011.文件编程概述1.1 文件的打开及创建1.1.1 参数说明1.1.2 文件写入操作示例1.1.3 文件的权限 2.文件操作2.1 写入文件2.2 文件读取操作2.3 文件的光标移动操作 3.文件操作原理简述3.1文件描述符3.2 Linux文件操作流程 1.文件编…

【数据结构】二叉树的前中后序遍历(C语言)

文章目录 什么是二叉树树相关的概念树的表示形式特殊的二叉树如何创造出一棵二叉树二叉树的遍历先序遍历(前序遍历)中序遍历后序遍历 总结 什么是二叉树 [二叉树] 顾名思义就是有两个分支节点的树&#xff0c;不仅如此&#xff0c;除了叶子外的所有节点都具有两个分支节点&…

单个电源模块给多个负载使用,并且电源后还经过了磁珠-二级电源直流压降仿真

单个电源模块给多个负载使用,并且电源后还经过了磁珠-二级电源直流压降仿真 下面介绍单个电源模块给多个负载使用,并且电源后还经过了磁珠-二级电源直流压降仿真,常见于二级压降仿真,以下图为例