ALBert 详解

ALBERT模型通过参数精简技术和句子顺序预测任务,实现了在减少模型参数量的同时提升NLP任务的性能。文章介绍了词嵌入的因式分解和跨层参数共享,以及SOP预训练任务对模型性能的提升。实验结果显示,ALBERT在多项任务上超越了BERT,尤其是在GLUE、RACE和SQuAD基准测试中达到新的SOTA,且参数量仅为BERT的1/18。

在NLP任务中,一个好的预训练模型能够提升模型的效果。当前一个SOTA的模型,它有几百万或者十亿以上的参数,如果要扩大模型规模,就会遇到这些计算机内存上的限制,同时训练速度会受到限制。目前存在的解决方法有两种:模型并行化、好的内存管理机制。但这两种方法都会存在通信开销。因此本论文设计了一个A lite BERT(ALBERT),它比BERT使用更少的参数。

1. Abstract

预训练自然语言表征时,增加模型大小一般是可以提升模型在下游任务中的性能。但是这种纯粹依赖模型尺寸进而期望大力出奇迹的想法在未来会越发困难。进一步增加模型大小将带来以下困难:

  • GPU/TPU内存不足
  • 训练时间会更长
  • 模型退化。

所以,为了解决上述这些问题,本文提出通过两种参数精简技术来降低内存消耗,并加快BERT的训练速度。此外,本文还引入一个自监督损失(self-supervised loss),用于对句子连贯性(inter-sentence coherence)建模,并证明该损失函数能够提升多句子作为输入的下游任务的性能。本文所提出的模型ALBERT在 GLUE、RACE 和 SQuAD 这3个基准上都取得了新的SOTA结果,且参数量还少于 BERT-large。

2. Introduction

过往的研究者们在诸多NLP任务上的实验已经表明,模型规模在取得SOTA结果上至关重要。在应用场景中通常是预训练一个大规模的模型,再对其进行蒸馏萃取出一个更小的模型。考虑模型大小的重要性,我们不禁要问:“拥有更好的NLP模型是否能够和拥有更大的模型一样容易?”

上述问题首要解决的便是

  1. 内存受限。当下的各种SOTA模型动辄数亿甚至数十亿个参数,倘若要扩大模型规模,这个内存问题是无法回避的。
  2. 训练速度上的限制。由于通信开销与模型中参数的数量成正比,在分布式训练中训练速度将成为一大瓶颈。简单地增加隐含层单元数,只会适得其反,从而降低性能。Table 1和Fig 1中可以看出将BERT-large 的隐藏层单元数增加一倍, 该模型(BERT-xlarge)在 RACE 基准测试上的准确率显著降低。


T a b l e 1 : 增 加 B E R T − l a r g e 的 隐 藏 层 单 元 数 量 , 模 型 在 R A C E 上 的 表 现 变 差 。 Table 1:增加 BERT-large 的隐藏层单元数量,模型在 RACE 上的表现变差。 Table1BERTlargeRACE

在这里插入图片描述
F i g 1 : B E R T − l a r g e 和 B E R T − x l a r g e 的 训 练 损 失 ( 左 ) 和 d e v m a s k 的 L M 准 确 率 ( 右 ) 。 模 型 增 大 之 后 , 其 m a s k L M 准 确 率 降 低 了 , 同 时 没 有 出 现 明 显 的 过 拟 合 迹 象 。 Fig 1:BERT-large 和 BERT-xlarge 的训练损失(左)和 dev mask 的 LM 准确率(右)。模型增大之后,其mask LM准确率降低了, 同时没有出现明显的过拟合迹象。 Fig1BERTlargeBERTxlargedevmaskLMmaskLM


为解决上述问题,已有先贤们做了一些研究,比如模型并行化、智能内存管理等。这些解决方案只解决了内存受限问题,而没有考虑模型通信开销过大和模型退化问题。为此,本文提出A Lite BERT(ALBERT)模型以解决上述三个问题。 该模型的参数量远远少于传统的 BERT 架构。

ALBERT 引入2种参数精简技术,克服了扩展预训练模型面临的主要障碍。

  • factorized embedding parameterization(词嵌入的因式分解):对嵌入参数进行因式分解,将一个大的词汇嵌入矩阵分解为两个小矩阵,从而将隐藏层的大小与词汇嵌入的大小分离开来。这种分离便于后续隐藏层单元数量的增加,怎么说呢?就是增加隐藏层单元数量,并不显著增加词汇嵌入的参数量。
  • cross-layer parameter sharing(交叉层的参数共享):这一技术可以避免参数量随着网络深度的增加而增加。

这两种技术都显著降低了 BERT 的参数量,同时不显著损害其性能, 从而提升了参数效率。ALBERT 的配置类似于 BERT-large,但参数量仅为后者的 1/18,训练速度却是后者的 1.7 倍。 这些参数精简技术还可以充当某种形式的正则化,可以使训练更加稳定,且有利于泛化。

为了进一步提升 ALBERT 的性能, 本文还引入了一个自监督损失函数,用于句子顺序预测(SOP,sentence-order prediction)。SOP 主要聚焦于句间连贯,用于解决原版 BERT中下一句预测(NSP)损失的低效问题。因为确实已有研究(Yang et al., 2019; Liu et al., 2019)表明NSP是可以去掉的。

基于上述的这3个设计,ALBERT 能够扩展为更大的版本,在参数量仍然小于 BERT-large的同时,性能可以显著提升。本文在GLUE、SQuAD 和 RACE 这3个自然语言理解基准测试上都刷新了记录:在 RACE 上的准确率为 89.4%,在 GLUE 上的得分为 89.4,在 SQuAD 2.0 上的 F1 得分为 92.2。

3. ALBert模型组成

3.1 参数缩减方法

本文提出两种模型参数缩减的方法,具体如下:

  • 从模型角度来讲,wordPiece embedding是学习上下文独立的表征维度为E,而隐藏层embedding是学习上下文相关的表征维度为H。为了应用的方便,原始的bert的向量维度E=H,这样一旦增加了H,E也就增大了。ALBert提出向量参数分解法,将一个非常大的词汇向量矩阵分解为两个小矩阵,例如词汇量大小是V,向量维度是E,隐藏层向量为H,则原始词汇向量参数大小为V * H,ALBert想将原始embedding映射到V * E(低纬度的向量),然后映射到隐藏空间H,这样参数量从 V*H下降到V * E+E * H,参数量大大下降。但是要注意这样做的损失确保矩阵分解后的两个小矩阵的乘积损失,是一个有损的操作。
  • 层之间参数共享。base的bert总共由12层的transformer的encoder部分组成,层参数共享方法避免了随着深度的加深带来的参数量的增大。具体的共享参数有这几种,attention参数共享、ffn残差网络参数共享

3.2 SOP预训练任务

我们知道原始的Bert预训练的loss由两个任务组成,maskLM和NSP(Next Sentence Prediction),maskLM通过预测mask掉的词语来实现真正的双向transformer,NSP类似于语义匹配的任务,预测句子A和句子B是否匹配,是一个二分类的任务,其中正样本从原始语料获得,负样本随机负采样。NSP任务可以提高下游任务的性能,比如句子对的关系预测。但是也有论文指出NSP任务其实可以去掉,反而可以提高性能,比如RoBert。

本文以为NSP任务相对于MLM任务太简单了,学习到的东西也有限,因此本文提出了一个新的loss,sentence-order prediction(SOP),SOP关注于句子间的连贯性,而非句子间的匹配性。SOP正样本也是从原始语料中获得,负样本是原始语料的句子A和句子B交换顺序。举个例子说明NSP和SOP的区别,原始语料句子 A和B, NSP任务正样本是 AB,负样本是AC;SOP任务正样本是AB,负样本是BA。可以看出SOP任务更加难,学习到的东西更多了(句子内部排序)。

4. 实验设置

4.1 Segments-Pair

Bert为了加速训练,前90%的steps使用了128个tokens的短句,最后10%才使用了512个词的长句来训练学习位置嵌入;而ALBert只有10%的情况下采用了短于512个tokens的句子进行训练。在RoBerta中指出,长句子训练更有利于模型的下游任务,所以这里在训练时的设置还是有些区别和影响的。

4.2 Masked-ngram

本文使用n-gram掩码,用于生成MLM目标的掩码输入,n-gram的mask的长度随机选取,最大设置为3,长度取值概率为:
在这里插入图片描述
注意这里,使用n-gram掩码训练模型,类似于之前介绍到的工作,对于最终的模型结果也是有一定影响的。

5. 实验结果

5.1 Bert与ALBert对比

  1. 从Table 3看出,ALBERT-xxlarge 的参数量只有 BERT-Large 70% ,但性能却能够显著超越BERT-large。具体表现在SQuAD v1.1上提升1.7%,在SQuAD v2.0上提升4.2%,MNLI上提升2.2%,在SST-2上提升3.0%,在RACE上提升8.5%。
  2. 此外,还观察到BERT-xlarge在全部的指标上全面溃败于BERT-base。这说明形如BERT-xlarge的大参数模型相较于更小参数量的模型是更难训练的。
  3. 另一个有趣的发现是,相同训练配置下(相同TPUs数量)训练一次,数据的吞吐速度差异。由于ALBERT模型通信更少,计算量更低,所以相比于BERT有更高的数据吞吐量。这里选用最慢的BERT-xlarge作为速度参照基准。

T a b l e   2 Table \space 2 Table 2

T a b l e   3 Table \space 3 Table 3

5.2 嵌入向量的因式分解

Table 4 展示了在ALBERT-base(具体设置参见上述Table 2)上修改词嵌入大小 E 带来的影响,它们的参数量及下游任务效果也都展示在内。


T a b l e   4 Table \space 4 Table 4

  1. 对于non-shared下(BERT-style),更大的嵌入尺寸能够取得更好的结果,但是提升的幅度其实不大。
  2. 对于all-shared(ALBERT-style),嵌入大小128是最好的。

基于上述这些结果,本文在后续的实验中的嵌入大小统一选用 E = 128 。

5.3 跨层参数共享

Table 5 展示了不同跨层参数共享的效果,同样使用 ALBERT-base 作为示例模型,此外还增加了嵌入大小为768的结果。对比了所有all-shared策略(ALBERT-style)、not-shared 策略(BERT-style)及其介于二者之间的中间策略(仅注意力参数共享,FNN不共享;仅FNN参数共享,注意力参数不共享)。


T a b l e   5 Table \space 5 Table 5

  1. 从上述结果可以看出,all-shared型策略在E=768和E=128上都会一定程度上降低性能。但是,需要说明的是,下降幅度较小,对于E=128,平均下降1.5;对于E=768,平均下降2.5。
  2. 再细看,共享FFN层的参数,应该是罪魁祸首;而注意力机制的参数共享带来的影响不能一概而论,对于E=128反而在平均性能上提升了0.1,对于E=768平均性能下降0.7。

5.4 句子次序预测(SOP)

Table 6 展示了SOP与下一句预测损失(NSP)的对比效果。


T a b l e   6 Table \space 6 Table 6
本文这里对比了3种策略:没有句子间损失(比如XLNet和RoBERTa)、NSP(比如BERT),SOP(ALBERT)。这里采用的ALBERT也是ALBERT-base。对比过程,一方面对比自身任务中的准确率,另一方面是下游任务的性能表现。

  • 在自身任务这一维度,可以看出NSP损失对于SOP几乎是没有任何益处,NSP训练后,在SOP上的表现只有52%,这跟瞎猜差不了多少。据此,可以得出结论:NSP建模止步于主题识别。反观SOP损失,确实一定程度上能够解决NSP任务,其准确率为78.9%,而自身的准确率为86.5%。
  • 更为重要的是,在下游任务上SOP损失统统起到促进作用,具体表现在SQuAD1.1提升1%,SQuAD 2.0提升2%,RACE提升1.7%。

5.5 相同训练时长下的对比

从Table 3中的提速结果看出BERT-large的数据吞吐量大概是ALBERT-xxlarge的3.17倍。一般而言,训练越长性能越高,鉴于此,我们进一步对比相同训练时长下不同模型的表现。
在这里插入图片描述
在训练了差不多相同的时间之后,ALBERT-xxlarge 明显优于 BERT-large。

5.6 引入额外训练集和Dropout的影响

上述实验都是在 Wikipedia 和 BOOKCORPUS 数据集上进行的,那么,如果增加额外的数据会对结果产生怎样的影响?这里采用的额外数据与XLNet和RoBERTa中的相同。
在这里插入图片描述
Figure 3a 表明,添加额外数据后,模型的开发集 MLM 准确率显著提升。
Figure 3b 表明,即使在训练了 100 万步之后,最大的模型仍然没有过拟合。因此,尝试删除dropout,以进一步提高模型能力。去掉 dropout 可以显著提高 MLM 准确度。


添加额外数据后模型在下游任务中的性能情况,如Table 8 所示:

在这里插入图片描述


去掉dropout后在下游任务上的表现,如Table 9所示:

在这里插入图片描述

5.7 当下SOTA模型在NLU任务上的对比

除了上述实验之外,ALBERT 在 GLUE、SQuAD 和 RACE 基准测试中都取得了 SOTA 结果,如Figure 10、11 所示:
在这里插入图片描述

6. 总结

本文的贡献主要在3个方面:

  1. 对嵌入矩阵分解,解除词嵌入和隐含层大小的关系,便于隐含层大小的扩展而不剧增模型参数
  2. 跨层参数共享,虽然一定程度上微微降低性能,但是可以大大地降低模型参数,收益很高
  3. 放弃NSP,引入SOP,更为有力地学习句子间的连贯性
内容概要:本文围绕“单相逆变器闭环逆变电路PWM模型仿真研究”展开,基于Simulink平台构建单相逆变器的闭环控制系统仿真模型,重点研究PWM调制技术在逆变电路中的应用与实现。文中详细阐述了系统架构设计、电压电流双闭环控制策略的实现原理、控制器参数设计及仿真建模全过程,并通过仿真结果验证了控制方案在动态响应、稳态精度与系统稳定性方面的有效性。同时,文档还涵盖多种电力电子系统典型应用场景,如多类型短路故障仿真(中性点不接地、经小电阻接地、经消弧线圈接地等)、软开关技术、微电网能量管理、MPPT控制等,体现出较强的技术综合性和工程实践价值。; 适合人群:电气工程、自动化、电力电子与新能源等相关专业的高校本科生、研究生、科研人员,以及从事电力系统仿真、逆变器设计与新能源并网技术研发的工程技术人员。; 使用场景及目标:①掌握基于Simulink的单相逆变器闭环控制系统建模与PWM仿真方法;②深入理解双闭环控制、SPWM/SVPWM调制、系统稳定性分析等核心技术原理;③为课程设计、毕业设计、科研项目或实际工程开发提供可复用的仿真模型与技术支持; 阅读建议:建议结合文中仿真模型动手实践,重点掌握PI控制器参数整定、PWM信号生成机制与仿真结果分析方法,同时可延伸学习文档中涉及的软开关、故障仿真、微电网控制等关联技术,以拓展系统级设计能力。
重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
内容概要:本文系统阐述了CUDA并行计算的核心优化技巧,围绕提升SM利用率、最大化内存带宽、隐藏访存延迟和减少指令开销四大目标,从GPU硬件架构、线程模型、内存访问、指令执行、内核设计及工程实践六个维度展开。重点讲解了线程块配置、Warp分支发散规避、全局内存合并访问、共享内存Bank冲突避免、寄存器与常量内存使用、异步传输与多流并行、快速数学函数、原子操作优化、内核拆分与融合、Tensor Core利用等关键技术,并提供了编译优化参数和Nsight系列性能分析工具的使用指导,形成了一套完整的CUDA性能优化方法论。; 适合人群:具备CUDA编程基础,从事高性能计算、深度学习、科学计算或GPU加速开发的工程师与研究人员,尤其适合工作2年以上的开发者提升底层优化能力。; 使用场景及目标:①解决CUDA程序中SM利用率低、内存带宽不足、访存延迟高等性能瓶颈;②掌握从基础到高阶的系统性优化策略,实现程序性能的指数级提升;③结合Nsight工具进行性能剖析与迭代优化。; 阅读建议:学习时应结合实际代码调试与性能分析工具(如Nsight Compute和Nsight Systems)进行验证,优先实施线程块配置、合并访问、-O3编译等低成本高回报的基础优化,再逐步深入共享内存优化、内核融合、Tensor Core利用等高阶技术,同时推荐优先使用cuBLAS、cuDNN等NVIDIA官方优化库以逼近硬件极限性能。
内容概要:本文提供了一份完整的“大学生创新创业训练计划项目”申报材料模板包,围绕“基于深度学习的智能垃圾分类回收箱设计与实现”项目,详细展示了从项目申报书、答辩PPT、中期检查表到结题报告的全套规范文档。内容涵盖项目背景、目标、研究内容、技术路线、创新点、进度安排、预期成果、经费预算及风险应对等关键环节,并以实际案例呈现各阶段成果,如YOLOv8轻量级模型识别准确率达96%、单台成本控制在780元、校园试点回收520kg可回收物、获得软著与论文成果等,形成可复制推广的校园绿色解决方案。; 适合人群:参与大学生创新创业训练计划(大创项目)的本科生团队,尤其是工科类、计算机相关专业、有意向开展人工智能+环保类实践项目的1-3年级学生;同时也适用于指导教师和项目评审人员作为参考模板。; 使用场景及目标:①帮助学生团队系统规划并撰写高质量的大创项目申报书与结题报告;②指导项目全过程管理,包括技术实施、进度控制、经费使用与成果凝练;③支撑项目答辩展示,提升项目规范性与竞争力,冲击“互联网+”“挑战杯”等赛事奖项; 阅读建议:此资源不仅提供文本模板,更体现了项目从立项到结题的完整逻辑链条,使用者应结合自身课题,参照其结构化表达方式、量化目标设定和技术落地路径进行模仿与创新,注重理论与实践结合,强化数据支撑与成果可视化。
内容概要:本文提供了一个基于Simulink的光伏储能单相逆变器并网仿真模型,系统实现了并网逆变电路的PWM调制控制、闭环控制策略及并网运行特性的仿真分析,涵盖系统建模、控制算法设计、稳定性验证与动态性能评估等关键环节。该模型不仅支持对单相逆变器在并网过程中的电流谐波、功率因数、电能质量及系统稳定性的深入研究,还可拓展应用于多类型电力系统仿真场景,如MPPT控制、软开关技术、微电网能量管理、短路故障分析(包括单相、两相接地及相间短路)、直流电机双闭环控制、Buck/Boost类变换器控制等,展现出广泛的科研适配性与工程实践价值。; 适合人群:面向具备电力电子、自动控制理论或电气工程背景,熟练掌握Simulink/Matlab仿真工具,从事新能源发电系统、微电网控制、逆变器拓扑与控制策略研究的硕士/博士研究生、科研人员及电力系统相关领域的工程技术人员。; 使用场景及目标:①开展光伏发电系统并网控制策略的设计与仿真验证;②学习并掌握单相逆变器PWM调制、锁相环(PLL)、电压电流双闭环控制等核心技术的建模方法;③作为课程设计、毕业设计或科研项目的仿真平台,支撑控制系统开发与优化;④结合文中提供的多种电力系统案例(如故障仿真、储能控制、微网调度),进行横向对比与综合能力提升; 阅读建议:建议读者结合文中列出的多个仿真案例进行扩展学习,重点关注控制器参数设计与系统动态响应之间的关系,动手复现模型并进行仿真调试,通过改变负载、电网条件或控制参数,深入理解并网逆变器的工作机理与控制规律,从而提升实际科研与工程应用能力。
重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
因为工作需要,每天需要打很多次卡,然后忙起来就忘了,忙完了就会想,刚才打卡了吗?弄错就会漏打卡了,漏打卡会有处罚。就想到写一个程序来解决这个痛点。就有了本次发布的这个程序。 PHP项目,修改起来也简单,也方便二开。本来就是H5页面布局,部署好,直接手机浏览器打开,或者使用封装工具,封装成apk。本人已打包为微信小程序,使用起来很方便。 项目简介 本项目是一个多用户打卡记录系统,基于 PHP + MySQL 开发,提供简洁的用户打卡功能和记录管理。 核心功能 功能模块 描述 用户认证 支持用户注册、登录、密码修改、密码重置 打卡功能 用户可进行每日打卡,记录打卡时间 记录查询 支持按日期查询打卡记录 用户管理 支持头像上传、个人信息查看 数据统计 提供打卡统计功能 技术特点 轻量级架构:纯 PHP 开发,无需框架依赖,部署简单 响应式设计:移动端友好的 UI 界面,支持触摸操作 安全性: 使用 prepare + bind_param 防止 SQL 注入 密码采用哈希加密存储 Session 会话管理用户状态 模块化设计:API 接口与前端分离,便于扩展 项目结构 Plain Text ├── api/ # RESTful API 接口 │ ├── checkin.php # 打卡接口 │ ├── login.php # 登录接口 │ ├── register.php # 注册接口 │ ├── records.php # 记录查询接口 │ ├── stats.php # 统计接口 │ └── … ├── config/ # 配置文件 │ ├── database.php # 数据库配置 │ └── auth.php # 认证配置 ├── sql/ # 数据库脚本 │ └── init.sql # 初始化脚本 ├── avatars/ # 头像存储目录 ├── ind
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值