xLSTM: Extended Long Short-Term Memory

更多内容,请关注微信公众号:NLP分享汇

原文链接:xLSTM: Extended Long Short-Term Memory


论文链接:https://arxiv.org/pdf/2405.04517

为什么要在27年后提出新的LSTM呢?

LSTM(长短期记忆网络)自20世纪90年代引入以来,在深度学习领域取得了巨大成功。然而,随着Transformer技术的出现,LSTM在规模化应用中的性能开始落后。

【感兴趣的小伙伴可以去读读之前写的这篇文章】

LSTM介绍

NLP分享汇,公众号:NLP分享汇长短期记忆网络 Long Short-Term Memory

所以,文章提出了一个问题:如果将LSTM扩展到数十亿参数规模,并利用LLMs的最新技术,同时解决LSTM的已知限制,那么在语言建模方面LSTM能走多远?

为了解决LSTM的限制,作者介绍了xLSTM,它通过以下两种主要改进来增强LSTM的能力

  • 指数门控(exponential gating)引入了适当的归一化和稳定技术,改进了LSTM的门控机制

  • 记忆结构修改(LSTM memory structure)对LSTM的记忆结构进行了修改,引入了两种新的记忆单元

    • sLSTM:具有标量记忆、标量更新和新的记忆混合技术。

    • mLSTM:具有矩阵记忆和协方差更新规则,能够完全并行化。

随后通过将这些LSTM扩展集成到残差块中,形成了xLSTM块,然后将这些块残差堆叠形成xLSTM架构。通过引入指数门控和修改记忆结构,xLSTM在性能和规模化方面能够与最先进的Transformer和状态空间模型相媲美。

一张图了解前世今生(xLSTM Family)

图片

图1 xLSTM 家族

图1左侧展示了传统的LSTM记忆单元,包括恒等误差旋转(Constant Error Carousel)和门控(Gating)机制。这些是LSTM的核心组成部分,用于处理和存储信息。在原始LSTM的基础上,引入了两种新的记忆单元sLSTM和mLSTM。然后将sLSTM和mLSTM记忆单元整合到残差块(Residual Blocks)中,形成了xLSTM Blocks。这些块是xLSTM架构的基本构建单元。最后通过残差堆叠(Residual Stacking)这些xLSTM块,形成了完整的xLSTM架构。这种架构设计用于处理长序列数据,并且能够扩展到数十亿参数规模。

记忆单元的特点:

  • 恒等误差旋转:表示LSTM中细胞状态的更新方式,通过输入和遗忘门控制。

  • Sigmoid门控:用于控制LSTM中信息的流动,包括输入、遗忘和输出门。

  • 循环推断:指的是LSTM在推断阶段的循环计算过程。

  • 循环训练:指的是LSTM在训练阶段的循环计算过程。

LSTM的局限性以及xLSTM是如何克服这些限制

图片

图2 三方较量图

图2左侧比较的是最近邻搜索问题(Nearest Neighbor Search problem)。LSTM在处理最近邻搜索问题时的局限性。这个问题要求模型在给定一个参考向量的情况下,顺序扫描序列以找到最相似的向量,并在序列末尾返回其附加值。均方误差(Mean Squared Error, MSE),这是衡量模型预测与实际值差异的指标。LSTM在找到更相似的向量时难以修正已存储的值,而新的xLSTM通过指数门控机制克服了这一限制。

图2右侧比较的是稀有词预测问题(Rare Token Prediction)。LSTM在预测Wikitext-103数据集中稀有词的性能问题。图中使用困惑度(Perplexity, PPL)来衡量不同词频桶(buckets of token frequency)上的预测性能。展示了不同词频下的PPL,LSTM在预测稀有词(即出现频率较低的词)时性能较差,这是因为其有限的存储容量。新的xLSTM通过矩阵记忆机制解决了这个问题,能够更有效地处理稀有词的预测。

Extended Long Short-Term Memory

LSTM

图片

  1. LSTM的引入:LSTM最初是为了解决循环神经网络(RNN)中的梯度消失问题而提出的。它通过引入一个称为“恒等误差旋转”(constant error carousel)的机制,以及输入、遗忘和输出门控(gating)来维持长期依赖关系。

  2. LSTM的核心方程:文章提供了LSTM的核心更新规则,包括单元状态(cell state)和隐藏状态(hidden state)的计算公式。这些方程定义了LSTM如何在时间步t更新其内部状态。

  3. 门控机制:LSTM包含三个门控:输入门(input gate)、遗忘门(forget gate)和输出门(output gate)。输入门控制新信息的流入,遗忘门决定哪些信息应该从单元状态中被遗忘,输出门则控制从单元状态到隐藏状态的转换。

  4. 权重和偏置:LSTM的每个门控都与权重向量(weight vectors)和偏置项(bias terms)相关联。权重向量用于处理输入和隐藏状态之间的交互,而偏置项则为模型提供了一个初始状态。

  5. 激活函数:LSTM使用特定的激活函数,如tanh,来规范化或压缩单元状态,确保其值保持在一定的范围内。sigmoid函数用于门控机制,以生成介于0和1之间的值,表示门控的开启程度。

sLSTM

图片

图片

  1. 指数门控(Exponential Gating):为了使LSTM能够修订其存储决策,sLSTM引入了指数激活函数的门控机制。与传统的sigmoid门控不同,指数门控可以产生更大的值,从而允许模型更灵活地更新其内部状态。

  2. 归一化和稳定化技术:由于指数激活函数可能导致数值溢出,sLSTM引入了一个归一化状态(normalizer state),该状态对输入门和所有未来遗忘门的乘积进行求和。此外,为了稳定门控,sLSTM使用了一个额外的稳定器状态(stabilizer state)来控制门控的值。

  3. sLSTM的前向传播方程:文章列出了sLSTM的核心更新规则,包括单元状态(cell state)、归一化状态(normalizer state)和隐藏状态(hidden state)的计算公式。这些方程定义了sLSTM如何在时间步t更新其内部状态。

  4. 记忆混合(Memory Mixing):sLSTM允许通过循环连接(recurrent connections)进行记忆混合,这在原始的LSTM中是不可能的。这种新的记忆混合技术允许sLSTM在不同的内存单元之间共享信息。

  5. 多头部结构(Multi-Head Structure):sLSTM可以具有多个头部,每个头部都有自己的记忆混合,但头部之间没有跨头的记忆混合。这种设计为sLSTM提供了一种新的记忆混合方式。

  6. 门控的激活和稳定化:sLSTM的输入门和遗忘门可以使用指数激活函数,而输出门仍然使用sigmoid函数。为了稳定化这些门控,sLSTM使用了一种广播机制,将原始的LSTM门控技术和偏差项扩展到新的架构中。

  7. sLSTM的参数和计算:sLSTM的每个门控都与权重向量和偏置项相关联,这些参数在模型训练过程中进行学习。激活函数和稳定化状态的引入增加了模型的计算复杂性,但同时也提高了其表达能力。

mLSTM

图片

  1. 矩阵记忆(Matrix Memory):mLSTM的核心创新是将传统的标量记忆单元扩展为矩阵记忆单元。这允许mLSTM以矩阵形式存储更多的信息,从而提高了模型的存储容量。

  2. 协方差更新规则(Covariance Update Rule):mLSTM使用协方差更新规则来存储和检索信息。这种规则通过将键(key)和值(value)对存储为矩阵的行或列来实现,从而提高了检索的分离度和信号/噪声比。

  3. Bidirectional Associative Memories (BAMs):mLSTM的设计灵感来源于双向联想记忆模型,它使用矩阵乘法来实现信息的存储和检索。

  4. mLSTM的前向传播方程:文章列出了mLSTM的核心更新规则,包括矩阵记忆状态(cell state)、归一化状态(normalizer state)和隐藏状态(hidden state)的计算公式。这些方程定义了mLSTM如何在时间步t更新其内部状态。

  5. 并行化(Parallelization):与sLSTM不同,mLSTM的设计允许完全的并行化处理,因为它放弃了隐藏层之间的循环连接(memory mixing)。这使得mLSTM可以更高效地在现代硬件上进行训练和推理。

  6. 输入门和遗忘门:mLSTM的输入门和遗忘门可以使用指数激活函数,而输出门仍然使用sigmoid函数。这些门控机制允许模型控制信息的流入和遗忘。

  7. 稳定化技术:为了稳定化mLSTM中的指数门控,文章采用了与sLSTM相同的稳定化技术。

  8. 多头部和多单元结构:mLSTM可以扩展为多个头部和多个单元,其中多个头部和多个单元在mLSTM中是等效的,因为它没有跨头部的记忆混合。

xLSTM Architectur

图片

图3  xLSTM block

左边是sLSTM残差块,这种块的设计模仿了Transformer架构中的残差连接和上投影(post up-projection)。输入首先进入一个sLSTM层,可能在进入LSTM之前会经过一个卷积层(Convolution)。接着是一个门控的多层感知机(gated MLP),这是Transformer中常见的组件。

右边是mLSTM残差块,这种块的设计类似于状态空间模型(State Space Models),其中上投影发生在mLSTM层之前。mLSTM被包裹在两个多层感知机(MLPs)之间,通过卷积层、可学习的跳跃连接(skip connection)和一个逐元素作用的输出门(output gate)。

在这两种类型的xLSTM块中,都使用了残差连接,这是从原始的LSTM架构中继承而来的特性,有助于训练更深的网络。

xLSTM架构的内存和速度考虑

与Transformer相比,xLSTM网络具有线性的计算复杂性和恒定的内存复杂性,这使得它们在处理长序列时更加高效。xLSTM的内存是压缩的,这使得它非常适合工业应用和在边缘设备上的实现。mLSTM的内存不需要参数,但是由于其d×d的矩阵内存和更新,计算上较为昂贵。尽管mLSTM可以并行化,类似于FlashAttention或其他并行注意力机制,但sLSTM由于内存混合(hidden-hidden connections)而无法并行化。为了解决sLSTM的非并行化问题,作者开发了一个快速的CUDA实现,包括GPU内存优化,使得sLSTM的性能通常不超过mLSTM的两倍。文章还讨论了两种xLSTM块的架构,一种是后上投影(post up-projection),另一种是前上投影(pre up-projection)。这些设计分别适用于sLSTM和mLSTM,以最大化它们的性能。尽管mLSTM的矩阵内存计算复杂,但由于可以在GPU上并行处理,因此对实际的墙钟时间(wall clock time)影响较小。

实验部分

图片

图4 xLSTM’s exponential gating with memory mixing

图4是文章中关键的实验结果之一,它直观地展示了xLSTM在处理需要复杂记忆和状态跟踪的任务时的优势。这些结果证明了xLSTM在语言建模和序列处理任务中的潜力,特别是在那些对传统LSTM构成挑战的任务中。

图4中的任务根据乔姆斯基层级(Chomsky hierarchy)进行了分组,这是一种描述形式语言的表达能力的方式。不同模型在解决这些任务时的准确率被标准化在0到1之间,其中0表示随机猜测,1表示完美解决。

图中比较了几种xLSTM变体,包括只有sLSTM的架构(xLSTM[0:1]),只有mLSTM的架构(xLSTM[1:0]),以及两者结合的架构(xLSTM[1:1])。除了xLSTM,还包括了其他几种模型的性能,如Llama、Mamba、RWKV-4、RWKV-5、RWKV-6、LSTM(Block)和传统的LSTM。

通过比较,可以看出xLSTM在处理需要状态跟踪的任务时的性能优势。例如,Transformer或没有状态跟踪的状态空间模型(SSMs)在解决某些正则文法任务(如奇偶性任务)时表现不佳。

图4的结果表明,xLSTM通过其指数门控和记忆混合机制,能够有效地解决状态跟踪问题,这是其在形式语言任务中表现出色的关键。

图片

图5 memory capacities of different models at the Multi-Query Associative Recall task with context length 2048

图5展示了xLSTM在处理多查询关联回忆(Multi-Query Associative Recall, MQAR)任务时的内存容量性能。MQAR任务要求模型记忆一系列随机选择的键值对(key-value pairs),并在稍后根据给定的键(key)回忆(recall)相应的值(value)。这个任务考验了模型的内存容量,尤其是它能够在多大程度上存储和回忆信息。

图5比较了不同模型在MQAR任务上的性能,包括Llama、Mamba、RWKV-5、RWKV-6、xLSTM[1:1]和xLSTM[1:0]。不同模型维度(Model Dim)下的性能,模型维度可能指的是模型的大小或复杂度。

y轴表示模型在回忆键值对时的准确率,准确率越高,表明模型的内存容量越好。x轴表示模型需要记忆的键值对的数量,从32到512不等。键值对的数量越多,任务的难度越大。

模型在每个键值对数量设置下的性能通过验证准确率来评估。准确率越高,表明模型在处理给定数量的键值对时越有效。xLSTM[1:1]在所有非Transformer模型中表现最佳,即使是在小模型尺寸下。此外,sLSTM块并没有降低内存容量,反而在处理最困难的任务(256键值对)时,它的性能更加明显。

图片

表1 comparison on next token prediction when trained on 15B tokens from SlimPajama

表1提供了在SlimPajama数据集上训练的不同语言模型的比较,特别是在15B个token上训练时的性能。表中的#Params列显示了每个模型的参数数量。表中的“SlimPajama (15B) ppl ↓”列显示了每个模型在SlimPajama数据集的验证集上的困惑度。困惑度是衡量语言模型性能的一个指标,越低表示模型性能越好。结果显示,xLSTM[1:0]和xLSTM[7:1]在验证集困惑度上表现最佳,这意味着它们在这些模型中具有最低的困惑度,因此在给定的数据集上表现最好。

图片

图6 comparison on next token prediction when trained on 15B tokens from SlimPajama

图6展示了不同语言模型在SlimPajama数据集上进行下一个词预测任务时的性能比较,特别是在不同模型大小下的验证集困惑度(Perplexity)。X轴表示模型的参数数量,通常以10亿(109)为单位。模型大小的不同可能会影响其在任务上的表现。Y轴表示验证集上的困惑度,这是一个衡量语言模型性能的指标,用于评估模型对真实数据分布的拟合程度。困惑度越低,表示模型的性能越好。

随着模型大小增加,各模型在验证集上的困惑度如何变化。这些趋势线可以帮助我们理解模型规模对性能的影响。

图片

表2 Ablation studies

表2提供了xLSTM模型的消融研究(Ablation Study)结果,这些研究旨在评估xLSTM中不同组件对整体性能的贡献。

顶部表:xLSTM新组件的消融研究

  • 模型修改:列出了对原始LSTM模型所做的修改,以逐步构建xLSTM模型。

  • 指数门控(Exponential Gating):指是否在模型中使用了指数门控机制。

  • 矩阵内存(Matrix Memory):指是否在模型中使用了矩阵内存结构。

  • 参数数量(#Params M):显示了每个修改后的模型的参数数量。

  • SlimPajama (15B) ppl ↓:展示了在SlimPajama数据集上,使用15B个token训练后,每个模型在验证集上的困惑度(Perplexity)。困惑度越低,表示模型性能越好。

  • 结果分析:通过比较不同修改后的模型,可以观察到指数门控和矩阵内存对性能提升的贡献。

底部表:不同门控技术的消融研究

  • 可学习门控(Learnable Gates):指模型中的门控是否是可学习的。

  • 遗忘门(Forget Gate):指模型是否使用了遗忘门。

  • 输入门(Input Gate):指模型是否使用了输入门。

  • 偏差初始化(Bias Init):展示了门控偏差的初始化方式,这对于模型的学习动态有重要影响。

  • SlimPajama (15B) ppl ↓:同样显示了在SlimPajama数据集上,使用15B个token训练后,每个模型在验证集上的困惑度。

  • 结果分析:通过比较不同门控配置的模型,可以了解哪些门控特性对性能提升更为关键。

图片

图7 Sequence extrapolation in language modeling

图7展示了不同大语言模型(LLMs)在序列长度外推(Sequence Length Extrapolation)方面的性能。序列长度外推是指模型在训练时使用一定长度的上下文,然后在测试时评估模型处理更长上下文的能力。这是衡量模型能否有效利用其学习到的表示来处理未见过的长序列的重要指标。X轴表示测试时使用的上下文长度,从2048一直到16384。模型在训练时使用的上下文长度为2048。Y轴表示模型在不同上下文长度下的困惑度。困惑度是衡量语言模型性能的一个指标,用于评估模型对真实数据分布的拟合程度。困惑度越低,表示模型的性能越好。

根据图7,xLSTM模型在所有测试的上下文长度下都保持了较低的困惑度,表明其在序列长度外推任务上的性能优于其他模型。xLSTM在处理比训练时更长的上下文时,仍然能够维持较低的困惑度,这表明xLSTM具有良好的外推能力。

图片

表3 Validation set perplexity and downstream tasks

表3展示了不同语言模型在SlimPajama数据集上的性能比较,特别是在不同模型大小下的验证集困惑度(Perplexity)和下游任务(Downstream Tasks)的性能。表中显示了各个模型在不同的下游任务上的性能。这些任务包括常识推理、文本分类、问答系统等,用于衡量模型在特定任务上的表现。

图片

表4  Performance on PALOMA Language Modeling Tasks

表4展示了不同语言模型在PALOMA语言任务上的下一个词预测性能,特别是在不同模型大小下的困惑度(Perplexity)。表中列显示了每个模型在PALOMA数据集的不同文本域上的下一个词预测困惑度。困惑度越低,表示模型在该文本域上的性能越好。表中最后一列显示了每个模型在所有PALOMA文本域上的平均困惑度。通过比较不同模型在同一文本域或平均困惑度上的性能,可以评估哪种模型结构更适合特定的语言任务。

图片

图8 Scaling Laws

图8在展示了不同语言模型在不同模型大小下的验证集困惑度(Perplexity)与参数数量的关系,这是对模型缩放行为(Scaling Laws)的分析。X轴表示模型的参数数量。这个参数范围可能涵盖了从较小到较大的模型尺寸。Y轴表示模型在验证集上的困惑度,这是一个衡量语言模型性能的指标,用于评估模型对真实数据分布的拟合程度。困惑度越低,表示模型的性能越好。通过观察曲线的斜率和分布,可以分析不同模型在缩放时的性能趋势。一般来说,如果曲线较为平缓,表明模型在增加参数后性能提升的边际效益较低。例如,xLSTM模型可能在所有尺寸下都展现出较低的困惑度,表明其在缩放时保持了较高的效率。

xLSTM局限性

sLSTM由于其内存混合特性,无法进行并行化操作。这与mLSTM形成对比,后者由于放弃了内存混合,可以实现并行处理。尽管为sLSTM开发了一个快速的CUDA实现,其速度仍然大约是并行mLSTM实现的1.5倍。对于mLSTM,当前的CUDA内核未经过优化,导致其性能大约是FlashAttention或Mamba中使用的scan操作的4倍慢。mLSTM的矩阵内存具有较高的计算复杂性,因为它需要处理d×d的矩阵。尽管矩阵内存的更新和检索不使用参数,并且可以并行化,但计算复杂性仍然是一个考虑因素。

遗忘门的初始化必须谨慎选择,以避免训练过程中的不稳定问题。

由于矩阵内存独立于序列长度,增加序列长度可能会在更长的上下文中对内存造成过载。然而,对于长达16k的上下文,这似乎并不是一个限制。

由于大语言模型实验的计算成本,xLSTM的架构和超参数并未完全优化。作者预计,为了使xLSTM发挥其全部潜力,需要一个广泛的优化过程。

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

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

相关文章

Java 生成二维码底下带content

直接上代码&#xff1a;效果如下图 需引入 zxing生成二维码包 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dependency><dependency><groupId>com.…

vue不同页面切换的方式(Vue动态组件)

v-if实现 <!--Calender.vue--> <template><a-calendar v-model:value"value" panelChange"onPanelChange" /></template> <script setup> import { ref } from vue; const value ref(); const onPanelChange (value, mod…

【Matplotlib作图-3.Ranking】50 Matplotlib Visualizations, Python实现,源码可复现

目录 03 Ranking 3.0 Prerequisite 3.1 有序条形图(Ordered Bar Chart) 3.2 棒棒糖图(Lollipop Chart) 3.3 点图(Dot Plot) 3.4 斜率图(Slope Chart) 3.5 杠铃图(Dumbbell Plot) References 03 Ranking 3.0 Prerequisite Setup.py # !pip install brewer2mpl import n…

FJSP:波搜索算法(WSA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

详细介绍 FJSP&#xff1a;波搜索算法(Wave Search Algorithm, WSA)求解柔性作业车间调度问题&#xff08;FJSP&#xff09;&#xff0c;提供MATLAB代码-CSDN博客 完整MATLAB代码 FJSP&#xff1a;波搜索算法(WSA)求解柔性作业车间调度问题&#xff08;FJSP&#xff09;&…

Java面试题:谈谈Java的内存屏障(Memory Barrier)是什么,它在并发编程中起什么作用?

Java内存屏障&#xff08;Memory Barrier&#xff09;&#xff0c;也称为内存栅栏&#xff0c;是一种同步机制&#xff0c;用于控制程序中不同内存操作的执行顺序。内存屏障在并发编程中起着至关重要的作用&#xff0c;主要体现在以下几个方面&#xff1a; 指令重排&#xff1a…

coredns 被误删了,可以通过重新应用 coredns 的 Deployment 或 DaemonSet 配置文件来恢复

如果 coredns 被误删了&#xff0c;可以通过重新应用 coredns 的 Deployment 或 DaemonSet 配置文件来恢复。以下是恢复 coredns 的步骤&#xff1a; 1. 下载 coredns 配置文件 你可以从 Kubernetes 的官方 GitHub 仓库下载 coredns 的配置文件。以下是下载并应用配置文件的步…

快速排序(排序中篇)

1.快速排序的概念及实现 2.快速排序的时间复杂度 3.优化快速排序 4.关于快速排序的细节 5.总代码 1.快速排序的概念及实现 1.1快速排序的概念 快速排序的单趟是选一个基准值&#xff0c;然后遍历数组的内容把比基准值大的放右边&#xff0c;比基准值小的放在左边&#xf…

一本企业画册怎么制作成二维码分享

​在这个数字化时代&#xff0c;二维码已经成为一种便捷的分享方式。企业画册&#xff0c;作为展示企业形象、宣传产品和服务的重要工具&#xff0c;也可以通过二维码进行分享。现在我来教你如何将一本企业画册制作成二维码分享。 1. 准备好制作工具&#xff1a;FLBOOK在线制作…

Springboot校园食堂智能排餐系统-计算机毕业设计源码85935

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对校园食堂智能排餐系统等问题&#xff0c;对…

ubuntu--Linux使用

Linux使用 Linux 系统简介 linux Linux 就是一个操作系统&#xff0c;与 Windows 和 Mac OS 一样是操作系统 。 操作系统在整个计算机系统中的角色 : Linux 主要是 系统调用 和 内核 那两层。使用的操作系统还包含一些在其上运行的应用程序&#xff0c;比如vim、google、vs…

Qt界面开发软件使用介绍

qt是跨平台软件&#xff0c;可以开发界面程序和软件框架&#xff0c;以及制作3d仿真软件&#xff0c;配合opengles可以实现图形图像开发。本文简要介绍qt开发上位机软件和嵌入式平台开发的使用方法和常见用法。 Qt有qtcreater用于开发程序&#xff0c;以及qtopensourse是跨平台…

7-Zip 介绍

7-Zip 介绍 7-Zip 介绍主要特点 7-Zip 命令行使用基本语法常用命令压缩文件 解压文件查看压缩文件内容测试压缩文件完整性常用选项压缩选项其他选项 7-Zip 介绍 7-Zip 是一款开源的文件压缩和解压工具&#xff0c;广泛用于文件和文件夹的压缩和解压缩操作。它由 Igor Pavlov 开…

Golang | Leetcode Golang题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; func maxProfit(prices []int) int {buy1, sell1 : -prices[0], 0buy2, sell2 : -prices[0], 0for i : 1; i < len(prices); i {buy1 max(buy1, -prices[i])sell1 max(sell1, buy1prices[i])buy2 max(buy2, sell1-prices[i])sell2 m…

C++的List

List的使用 构造 与vector的区别 与vector的区别在于不支持 [ ] 由于链表的物理结构不连续,所以只能用迭代器访问 vector可以排序,list不能排序(因为快排的底层需要随机迭代器,而链表是双向迭代器) (算法库里的排序不支持)(需要单独的排序) list存在vector不支持的功能 链…

网站建设方案书

网站建设方案书是指一份书面计划&#xff0c;用于描述关于建立和运营一个网站所需的资源和步骤。这份方案书的目的是确保网站建设过程中的顺利和成功&#xff0c;并最终获得对其所期望的效果。 在撰写方案书时&#xff0c;我们应该遵循以下几个步骤&#xff1a; 一、确定网站的…

2024/5/30 英语每日一段

It stood to reason, then, that somewhere in the brain leptin was being combined with other signals related to available energy, and that this information would then have to be compared with a homeostatic “set point.” This suggested a highly complex set o…

(笔记)如何评价一个数仓的好坏

如何评价一个数仓的好坏 1数据质量产生原因评估方法流程 2模型建设产生问题原因评估方法流程 3数据安全产生问题原因评估方法流程 4成本/性能产生问题原因评估方法流程 5 用户用数体验产生问题原因评估方法流程 6数据资产覆盖产生问题原因评估方法流程 数仓评价好坏是对数仓全流…

红队内网攻防渗透:内网渗透之windows内网权限提升技术:数据库篇

红队内网攻防渗透 1. 内网权限提升技术1.1 数据库权限提升技术1.1.1 数据库提权流程1.1.1.1 先获取到数据库用户密码1.1.1.2 利用数据库提权工具进行连接1.1.1.3 利用建立代理解决不支持外联1.1.1.4 利用数据库提权的条件及技术1.1.2 Web到Win-数据库提权-MSSQL1.1.3 Web到Win-…

[SWPUCTF 2023 秋季新生赛]Junk Code

方法一&#xff1a;手动去除 将所有E9修改为90即可 方法二&#xff1a;花指令去除脚本 start_addr 0x0000000140001454 end_addr 0x00000001400015C7 print(start_addr) print(end_addr) for i in range(start_addr,end_addr):if get_wide_byte(i) 0xE9:patch_byte(i,0x9…

自定义类型:结构体类型

在学习完指针相关的知识后将进入到c语言中又一大重点——自定义类型&#xff0c;在之前学习操作符以及指针时我们对自定义类型中的结构体类型有了初步的了解&#xff0c;学习了结构体类型的创建以及如何创建结构体变量&#xff0c;还有结构体成员操作符的使用&#xff0c;现在我…