LLM - Llama 3 的 Pre/Post Training 阶段 Loss 以及 logits 和 logps 概念

news2025/1/13 20:39:33

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/145056912


Llama 3 是 Meta 公司发布的开源大型语言模型,包括具有 80 亿和 700 亿参数的预训练和指令微调的语言模型,支持广泛的应用场景。在多个行业标准基准测试中展示了最先进的性能,特别是在推理、代码生成和指令遵循方面表现出色,超过了同等规模的商业模型。

Llama 3 Paper: The Llama 3 Herd of Models,Llama3 模型群

参考:大模型训练 RLHF 阶段的 PPO/DPO 策略公式与源码

1. Llama 3 Loss

Llama 3 主要包括 2个阶段,即 预训练阶段(Pre-Training) 和 后训练阶段(Post-Training)。

Llama 3 的网络架构,如下:

Llama 3

1.1 预训练阶段(Pre-Training)

预训练阶段(Pre-Training),包括:

  1. 初始预训练(Initial Pre-Training):使用 AdamW 优化器对 Llama 3 405B 进行预训练,峰值学习率为 8 × 1 0 − 5 8 × 10^{−5} 8×105;线性预热步数为 8,000 步,采用余弦学习率调度,在 1,200,000 步内衰减至 8 × 1 0 − 7 8 × 10^{−7} 8×107 ;为了提高训练稳定性,在训练初期使用较小的 BatchSize,在后续逐步增加以提高效率。具体:
    1. 初始使用 Batch Size 是 4M Tokens 和 序列(Sequences)长度是 4,096 (4K) Tokens,预训练 252M 个 Token。
    2. 将 Batch Size 和序列长度,增加至 8M Tokens (batch size) 和 8,192 (8K) Tokens (sequences),预训练 2.87T 个 Token。
    3. 再次将批量大小增加到 16M。
    4. 降低到损失值的突刺(Spikes),不需要进行干预以纠正模型训练的发散(Divergence)。
  2. 长上下文预训练(Long Context Pre-Training):使用 800B 个训练 Token,上下文长度增加到 6 个阶段,从 8K 的上下文窗口开始,达到 128K。在长上下文预训练中,自注意力层的计算量,随着序列长度的平方增长。评估模型适应长上下文的标准:
    1. 模型在 短上下文 评估中的性能是否完全恢复。
    2. 在特定长度中,模型是否能够完美解决 大海捞针(needle in a haystack) 任务。
  3. 退火阶段(Annealing):最后 400M 个 token 预训练,线性的(Linearly) 将学习率退火到 0,同时,保持上下文长度 128K Token。使用少量高质量的代码和数学数据,进行退火,提高预训练模型在关键基准测试上的性能。退火阶段,在 8B 模型中效果明显,但是,在 405B 模型中改进较小。

损失函数都是 交叉熵损失,其中 w i w_{i} wi 是第 i i i 个词, N N N 是序列长度, p p p 是概率(softmax), C C C 是 类别数(也就是输出维度),即:

L o s s = − 1 N ∑ i = 1 N l o g   p ( w i ∣ w 1 , w 2 , . . . , w i − 1 ) L o s s = − 1 N ∑ i = 1 N ∑ j = 1 C y i j l o g ( p i j ) \begin{align} Loss &= -\frac{1}{N}\sum_{i=1}^{N}log \ p(w_{i}|w_{1},w_{2},...,w_{i-1}) \\ Loss &= -\frac{1}{N}\sum_{i=1}^{N}\sum_{j=1}^{C}y_{ij}log(p_{ij}) \end{align} LossLoss=N1i=1Nlog p(wiw1,w2,...,wi1)=N1i=1Nj=1Cyijlog(pij)

这 2 个公式的含义是一样的,第 1 个是选择 w i w_{i} wi ,第 2 个是通过 y i j = 1 y_{ij}=1 yij=1 确定 w i w_{i} wi

Post-Training

1.2 后训练阶段(Post-Training)

后训练阶段(Post-Training),包括:

  1. 奖励模型(Reward Modeling, RM):偏好数据(Preference data) 包含 3 个经过排序的响应,即 编辑后(edited) > 所选(chosen) > 被拒(rejected)。

Reward Model 训练 Loss 函数:
L o s s = − l o g   σ ( r ϕ ( x , y w i n ) − r ϕ ( x , y l o s s ) ) Loss = -log \ \sigma(r_{\phi}(x,y_{win}) - r_{\phi}(x,y_{loss})) Loss=log σ(rϕ(x,ywin)rϕ(x,yloss))
源码:

loss = -torch.nn.functional.logsigmoid(chosen_scores.float() - rejected_scores.float()).mean()
  1. 监督微调 (Supervised Finetuning, SFT):使用奖励模型对于人工标注提示进行拒绝采样(Rejection Sampling)。 SFT 的 Loss 函数与 PreTraining 阶段一致,数据略有不同。

  2. 直接偏好优化 (Direct Preference Optimization, DPO),其中,在 Llama3 中,学习率 L R = 1 0 − 5 LR=10^{-5} LR=105,超参数 β = 0.1 \beta=0.1 β=0.1 α = 0.2 \alpha=0.2 α=0.2,即:

L o s s D P O = L o s s D P O + α L o s s N L L = − l o g   σ ( β l o g π θ ( y w i n ∣ x ) π r e f ( y w i n ∣ x ) − β l o g π θ ( y l o s e ∣ x ) π r e f ( y l o s e ∣ x ) ) − α l o g   π θ ( y w i n ∣ x ) \begin{align} Loss_{DPO} &= Loss_{DPO} + \alpha Loss_{NLL} \\ &= - log \ \sigma(\beta log\frac{\pi_{\theta}(y_{win}|x)}{\pi_{ref}(y_{win}|x)} - \beta log\frac{\pi_{\theta}(y_{lose}|x)}{\pi_{ref}(y_{lose}|x)}) - \alpha log \ \pi_{\theta}(y_{win}|x) \end{align} LossDPO=LossDPO+αLossNLL=log σ(βlogπref(ywinx)πθ(ywinx)βlogπref(ylosex)πθ(ylosex))αlog πθ(ywinx)

DPO 训练的改进如下:

  1. 在 DPO 损失中,在 所选(chosen) 和 被拒(rejected) 的响应中,屏蔽 特殊格式令牌(Special Formatting Tokens)。学习这些标记,导致模型出现不期望的行为,例如尾部重复或突然生成终止标记。可能是由于 DPO 损失的对比性质,在选定和拒绝的响应中都存在常见标记,这导致了冲突的学习目标,因为模型需要同时增加和减少这些标记的出现概率。
  2. DPO 损失 增加 NLL (Negative Log-Likelihood, 负对数似然) 损失,避免 所选(chosen) 响应的对数概率下降。参考论文 Iterative Reasoning Preference Optimization 。
  1. 模型平均(Model Averaging):训练多个模型,在不同的数据集、不同的初始化、不同的学习率或其他超参数设置下进行训练,对于模型权重进行平均,可以使用简单的算术平均,也可以使用加权平均。
  2. 迭代轮次(Iterative Rounds):划分 6 个轮次应用上述方法(RM、SFT、DPO、MA)。在每个轮次中,收集新的偏好标注和 SFT数据,以及从最新模型中采样合成数据。

Llama 3 的网络参数:

Llama 3


2. 补充内容

前置概念:

  1. PreTraining 阶段 与 SFT 阶段 的差异
  2. logits 含义
  3. logps 含义

1.1 PreTraining 阶段 与 SFT 阶段 的差异

PreTraining 与 SFT 在训练过程中,没有任何区别,主要区别在于数据的组成形式上,包括 6 点,即:

  1. PreTraining 样本数据都是满编 4K / 8K;SFT 样本数据保持不变,原始多长就是多长。
  2. SFT 引入 PreTraining 阶段中未见过的 special_token,让模型学习全新的语义。
  3. SFT 让模型 重新学习 最重要的 eos_token,停止生成;PreTraining 阶段 eos_token 只是作为样本的一部分,无法停止生成。
  4. SFT 借助 special_token,把语料切分成不同的角色,标配包括 systemuserassistant,根据业务需求也可以自定义。
  5. SFT 的 prompt 部分不做 loss 反传,原因是 prompt 的同质化严重,如果不做 loss_mask,同样的一句话会被翻来覆去的学。如果保证每条 prompt 都是独一无二的,也可以省略 promptloss_mask 部分。
  6. SFT 的 session 数据(多轮对话),可以每一个 answer 都计算 loss,也可以只对最后一轮的 answer 计算 loss

两者的训练目的也不一样,PreTraining 是在背书,纯粹的学习知识;SFT 则是在做题,学习的是指令 follow 能力。

整体的数据源码,参考 Llama-Factory 的 src/llamafactory/data/preprocess.py 文件,包括不同阶段的数据处理,即 ptsftrmkto 等。

其中,PreTraining 数据源码(src/llamafactory/data/processors/pretrain.py),

def preprocess_pretrain_dataset(
    examples: Dict[str, List[Any]], tokenizer: "PreTrainedTokenizer", data_args: "DataArguments"
) -> Dict[str, List[Any]]:
    # build grouped texts with format `X1 X2 X3 ...` if packing is enabled
    eos_token = "<|end_of_text|>" if data_args.template == "llama3" else tokenizer.eos_token
    text_examples = [messages[0]["content"] + eos_token for messages in examples["_prompt"]]
    
    tokenized_examples = tokenizer(text_examples, add_special_tokens=False)  # add_special_tokens=False
    concatenated_examples = {k: list(chain(*tokenized_examples[k])) for k in tokenized_examples.keys()}
    total_length = len(concatenated_examples[list(concatenated_examples.keys())[0]])
    block_size = data_args.cutoff_len
    total_length = (total_length // block_size) * block_size
    result = {
        k: [t[i : i + block_size] for i in range(0, total_length, block_size)]
        for k, t in concatenated_examples.items()
    }
    return result

其中,SFT 的 prompt mask 源码(src/llamafactory/data/processors/supervised.py),参考:

IGNORE_INDEX = -100

if train_on_prompt:
    source_label = source_ids
elif template.efficient_eos:
    # mask 掉 prompt(source) 部分,保留 answer(target) 部分
    source_label = [tokenizer.eos_token_id] + [IGNORE_INDEX] * (source_len - 1)
else:
    source_label = [IGNORE_INDEX] * source_len

if mask_history and turn_idx != 0:  # train on the last turn only
    # 只训练最后 1 轮
    target_label = [IGNORE_INDEX] * target_len
else:
    target_label = target_ids

PreTraining 阶段的数据

  • 数据组成形式:
    • 输入 input: <bos> X1 X2 X3
    • 标签 labels:X1 X2 X3 </s>
  • 典型的 Decoder 架构的数据训练方式

SFT 阶段的数据

  • 数据组成形式:
    • 输入 input:<bos> prompt response
    • 标签 labels: -100 ... -100 response </s>
  • labels 的重点在于prompt部分的被 -100 所填充

训练过程源码,参考 transformers/src/transformers/models/llama/modeling_llama.py,即:

logits = self.lm_head(hidden_states)
logits = logits.float()

loss = None
if labels is not None:
    # Shift so that tokens < n predict n
    shift_logits = logits[..., :-1, :].contiguous()
    shift_labels = labels[..., 1:].contiguous()
    # Flatten the tokens
    loss_fct = CrossEntropyLoss()
    shift_logits = shift_logits.view(-1, self.config.vocab_size)
    shift_labels = shift_labels.view(-1)
    # Enable model parallelism
    shift_labels = shift_labels.to(shift_logits.device)
    loss = loss_fct(shift_logits, shift_labels)

其中,shift_logitsshift_labels 数据:

输入文本<bos><eos>
shift_logits<bos>
shift_labels<eos>

1.2 logits 含义

模型输出的数值部分,被称为 logits,其英文含义是 log-odds,即对数几率,即:logits = self.lm_head(hidden_states)

  • logits 是模型在 应用激活函数(如 softmax)之前 的原始输出。假设有一个分类问题,模型的输出层有多个神经元,每个神经元对应一个类别。这些神经元的输出值就是 logits。例如,对于一个三分类问题,模型输出层的三个神经元输出值可能是[2.1, -1.5, 0.7],这就是 logits。
  • logits 可以看作是每个类别的 对数几率,表示某个事件发生的几率的对数。在分类问题中,假设某个类别发生的概率是 p,那么该类别的几率是 p/(1 - p)。对数几率就是 log(p/(1 - p))。模型输出的 logits 通过一些变换(如 softmax 函数)来近似地表示这种对数几率。在 softmax 函数中,使用 e 为底数,将 对数几率(logits) 转换为概率分布,使得输出值在 0 到 1 之间,并且所有类别的概率之和为 1。

Softmax 公式,其中 x 就是 logits ,即:
s o f t m a x ( X ) = e x ∑ i = 1 n e x i softmax(X) = \frac{e^x}{\sum_{i=1}^{n}e^{x_{i}}} softmax(X)=i=1nexiex
Sigmoid 公式,其中 x 就是 logits ,即:
σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1
例如源码:

logits = self.lm_head(hidden_states)
logits = logits.float()

1.3 logps 含义

logpslog probabilities 的缩写,即对数概率。具体来说,logps 是模型输出的对数概率分布,通过对 logits 应用 softmax 函数,并且取 对数(log) 得到的。

源码测试:

  1. 初始化数据 logitslabels
import torch
from torch import nn
import torch.nn.functional as F
torch.manual_seed(42)

logits = torch.randn(3, 4)  # 模拟 logits,3个样本,维度是4
# 真实标签,即4个维度中,正确的是0位置、1位置、1位置,也就是说让 logits 的这些位置的对数几率最大。
labels = torch.tensor([0, 1, 1])  
print(f"[Info] logits: {logits}")
print(f"[Info] labels: {labels}")

[Info] logits: tensor([[ 0.3367,  0.1288,  0.2345,  0.2303],
        [-1.1229, -0.1863,  2.2082, -0.6380],
        [ 0.4617,  0.2674,  0.5349,  0.8094]])
[Info] labels: tensor([0, 1, 1])
  1. 计算 logps 使用 log_softmax ,即 softmax -> log,先概率化,再转换成对数(负值)
logps = torch.log(nn.Softmax(dim=1)(logits))
print(f"[Info] logps1: {logps}")
logps = F.log_softmax(logits, dim=1)
print(f"[Info] logps2: {logps}")

[Info] logps1: tensor([[-1.2849, -1.4928, -1.3871, -1.3912],
        [-3.5008, -2.5643, -0.1698, -3.0160],
        [-1.4621, -1.6565, -1.3889, -1.1144]])
[Info] logps2: tensor([[-1.2849, -1.4928, -1.3871, -1.3912],
        [-3.5008, -2.5643, -0.1698, -3.0160],
        [-1.4621, -1.6565, -1.3889, -1.1144]])
  1. 再调用 负对数似然(Negative Log-Likelihood,NLL) Loss,把多个样本的 logps 均值,再计算负值,因为负负得正,即 loss 值(正值),优化越来越小
v_nll = - (-1.2849 + -2.5643 + -1.6565) / 3  # 0,1,1 位置
print(f"[Info] NLL1: {v_nll}")
v_nll = nn.NLLLoss()(torch.log(nn.Softmax(dim=1)(logits)), labels)
print(f"[Info] NLL2: {v_nll}")

[Info] NLL1: 1.8352333333333333
[Info] NLL2: 1.8352112770080566
  1. 直接使用 CrossEntropyLoss 函数,代替这些操作,即 CrossEntropyLoss = Softmax+log+NLLLoss
v_nll = nn.CrossEntropyLoss()(logits, labels)
print(f"[Info] NLL3: {v_ce}")

[Info] NLL3: 1.835211157798767

参考 PPL (Perplexities,困惑度) 源码 (scripts/stat_utils/cal_ppl.py):

outputs = model(**batch)
shift_logits: "torch.Tensor" = outputs["logits"][..., :-1, :]
shift_labels: "torch.Tensor" = batch["labels"][..., 1:]
loss_mask = shift_labels != IGNORE_INDEX
flatten_logits = shift_logits.contiguous().view(shift_labels.size(0) * shift_labels.size(1), -1)
flatten_labels = shift_labels.contiguous().view(-1)
token_logps: "torch.Tensor" = criterion(flatten_logits, flatten_labels)
token_logps = token_logps.contiguous().view(shift_logits.size(0), -1)
sentence_logps = (token_logps * loss_mask).sum(-1) / loss_mask.sum(-1)
total_ppl += sentence_logps.exp().sum().item()
perplexities.extend(sentence_logps.exp().tolist())

参考:

  • 知乎 - 详解 PyTorch 的损失函数:NLLLoss()和CrossEntropyLoss()
  • 知乎 - 大模型Pretrain和SFT阶段的Loss分析
  • 大模型训练(SFT)实践总结

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

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

相关文章

[RabbitMQ] RabbitMQ运维问题

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

MongoDB如何使用

1.简单介绍 MongoDB是一个开源、高性能、无模式的文档型数据库&#xff0c;当初的设计就是用于简化开发和方便扩展&#xff0c;是NoSQL数据库产品中的一种。是最 像关系型数据库&#xff08;MySQL&#xff09;的非关系型数据库。 MongoDB是一个基于分布式文件存储的数据库由C语…

【2024年华为OD机试】(C卷,100分)- 分割均衡字符串 (Java JS PythonC/C++)

一、问题描述 题目描述 均衡串定义&#xff1a;字符串中只包含两种字符&#xff0c;且这两种字符的个数相同。 给定一个均衡字符串&#xff0c;请给出可分割成新的均衡子串的最大个数。 约定&#xff1a;字符串中只包含大写的 X 和 Y 两种字符。 输入描述 输入一个均衡串…

React Fiber框架中的Commit提交阶段——commitMutationEffect函数

Render阶段 Render阶段可大致归为beginWork&#xff08;递&#xff09;和completeWork&#xff08;归&#xff09;两个阶段 1.beginWork流程&#xff08;递&#xff09; 建立节点的父子以及兄弟节点关联关系 child return sibling属性给fiber节点打上flag标记(当前节点的flag) …

【STM32-学习笔记-6-】DMA

文章目录 DMAⅠ、DMA框图Ⅱ、DMA基本结构Ⅲ、不同外设的DMA请求Ⅳ、DMA函数Ⅴ、DMA_InitTypeDef结构体参数①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…

IoT平台在设备远程运维中的应用

IoT平台是物联网技术的核心组成部分&#xff0c;实现了设备、数据、应用之间的无缝连接与交互。通过提供统一的设备管理、数据处理、安全监控等功能&#xff0c;IoT平台为企业构建了智能化、可扩展的物联网生态系统。在设备远程运维领域&#xff0c;IoT平台发挥着至关重要的作用…

浅谈云计算05 | 云存储等级及其接口工作原理

一、云存储设备 在当今数字化飞速发展的时代&#xff0c;数据已然成为个人、企业乃至整个社会的核心资产。从日常生活中的珍贵照片、视频&#xff0c;到企业运营里的关键业务文档、客户资料&#xff0c;数据量呈爆炸式增长。面对海量的数据&#xff0c;如何安全、高效且便捷地存…

网络传输层TCP协议

传输层TCP协议 1. TCP协议介绍 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一个要对数据的传输进行详细控制的传输层协议。 TCP 与 UDP 的不同&#xff0c;在于TCP是有连接、可靠、面向字节流的。具体来说&#xff0c;TCP设置了一大…

【Linux系列】`find / -name cacert.pem` 文件搜索

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【论文笔记】Sign Language Video Retrieval with Free-Form Textual Queries

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Sign Language Video Retr…

Observability:将 OpenTelemetry 添加到你的 Flask 应用程序

作者&#xff1a;来自 Elastic jessgarson 待办事项列表可以帮助管理与假期计划相关的所有购物和任务。使用 Flask&#xff0c;你可以轻松创建待办事项列表应用程序&#xff0c;并使用 Elastic 作为遥测后端&#xff0c;通过 OpenTelemetry 对其进行监控。 Flask 是一个轻量级…

网站目录权限加固

说明 在一个入侵链路中&#xff0c;往往是利用某个安全漏洞&#xff0c;向服务器写入或上传一个webshell&#xff08;后门&#xff09;&#xff0c;再通过webshell提权或进行后续渗透入侵行为。 这个过程中&#xff0c;获取webshell是最关键最重要的一个步骤&#xff0c;如能在…

qt QPainter setViewport setWindow viewport window

使用qt版本5.15.2 引入viewport和window目的是用于实现QPainter画出来的内容随着窗体伸缩与不伸缩两种情况&#xff0c;以及让QPainter在widget上指定的区域(viewport)进行绘制/渲染&#xff08;分别对应下方demo1&#xff0c;demo2&#xff0c;demo3&#xff09;。 setViewpo…

一些计算机零碎知识随写(25年1月)-1

我原以为世界上有技术的那批人不会那么闲&#xff0c;我错了&#xff0c;被脚本真实了。 今天正隔着画画呢&#xff0c;手机突然弹出几条安全告警通知。 急忙打开服务器&#xff0c;发现问题不简单&#xff0c;直接关服务器重装系统..... 首先&#xff0c;不要认为小网站&…

分布式锁Redisson详解,Redisson如何解决不可重入,不可重试,超时释放,主从一致问题的分析解决(包括源码简单分析)

目录 1. Redisson解决不可重入锁导致的死锁问题 2. 不可重试问题 Pub/Sub 的优势 锁释放的发布逻辑 3. 超时释放的问题 1. 锁的超时释放机制背景 2. 源码分析 2.1 锁的获取 2.2 看门狗机制 2.3 看门狗续期实现 2.4 手动设置锁的过期时间 总结 4. 主从一致性 问题…

【微服务】面试 4、限流

微服务限流技术总结 一、微服务业务面试题引入 在微服务业务面试中&#xff0c;限流是重要考点&#xff0c;常与分布式事务、分布式服务接口幂等解决方案、分布式任务调度等一同被考查。面试官一般会询问项目中是否实施限流及具体做法&#xff0c;回答需涵盖限流原因、采用的方…

爬虫基础之爬取歌曲宝歌曲批量下载

声明&#xff1a;本案列仅供学习交流使用 任何用于非法用途均与本作者无关 需求分析: 网站:邓紫棋-mp3在线免费下载-歌曲宝-找歌就用歌曲宝-MP3音乐高品质在线免费下载 (gequbao.com) 爬取 歌曲名 歌曲 实现歌手名称下载所有歌曲 本案列所使用的模块 requests (发送…

树莓派-5-GPIO的应用实验之GPIO的编码方式和SDK介绍

文章目录 1 GPIO编码方式1.1 管脚信息1.2 使用场合1.3 I2C总线1.4 SPI总线2 RPI.GPIO2.1 PWM脉冲宽度调制2.2 静态函数2.2.1 函数setmode()2.2.2 函数setup()2.2.3 函数output()2.2.4 函数input()2.2.5 捕捉引脚的电平改变2.2.5.1 函数wait_for_edge()2.2.5.2 函数event_detect…

Scala分布式语言二(基础功能搭建、面向对象基础、面向对象高级、异常、集合)

章节3基础功能搭建 46.函数作为值三 package cn . itbaizhan . chapter03 // 函数作为值&#xff0c;函数也是个对象 object FunctionToTypeValue { def main ( args : Array [ String ]): Unit { //Student stu new Student() /*val a ()>{"GTJin"…

CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞

漏洞描述 GiveWP 插件中发现了一个严重漏洞&#xff0c;该插件是 WordPress 最广泛使用的在线捐赠和筹款工具之一。该漏洞的编号为 CVE-2025-22777&#xff0c;CVSS 评分为 9.8&#xff0c;表明其严重性。 GiveWP 插件拥有超过 100,000 个活跃安装&#xff0c;为全球无数捐赠平…