【复现DeepSeek-R1之Open R1实战】系列6:GRPO源码逐行深度解析(上)
目录
- 4 GRPO源码分析
- 4.1 数据类 `GRPOScriptArguments`
- 4.2 系统提示字符串 `SYSTEM_PROMPT`
- 4.3 奖励函数
- 4.3.1 accuracy_reward函数
- 4.3.2 verify函数
- 4.3.3 format_reward函数
- 4.4 将数据集格式化为对话形式
- 4.5 初始化GRPO Trainer
【复现DeepSeek-R1之Open R1实战】系列3:SFT和GRPO源码逐行深度解析(上)
【复现DeepSeek-R1之Open R1实战】系列5:SFT和GRPO源码逐行深度解析(中)
4 GRPO源码分析
前面两篇博文已经详细介绍了一些基础知识和SFT源码,本文继续解读GRPO源码。与SFT源码差不多的部分,我们就不展开细说了,这里只解析GRPO独特的部分。
4.1 数据类 GRPOScriptArguments
该类使用了 Python 的 dataclass 装饰器,这是一种简化类定义的方式,特别是对于那些主要用来存储数据的类。它继承自 ScriptArguments 类。
-
reward_funcs: 这是一个列表,包含了一系列可能的奖励函数名称,默认值为
["accuracy", "format"]。这些奖励函数可能是用于评估模型性能的不同标准。reward_funcs: list[str] = field(default_factory=lambda: ["accuracy", "format"],metadata={"help": "List of reward functions. Possible values: 'accuracy', 'format', 'reasoning_steps', 'cosine', 'repetition_penalty', 'length'"}, ) -
cosine_min_value_wrong 和 cosine_max_value_wrong: 分别表示错误答案在余弦相似度尺度上的最小和最大奖励值,默认分别为
0.0和-0.5。 -
cosine_min_value_correct 和 cosine_max_value_correct: 分别表示正确答案在余弦相似度尺度上的最小和最大奖励值,默认分别为
0.5和1.0。 -
cosine_max_len: 表示余弦相似度尺度的最大长度,默认值为
1000。 -
repetition_n_grams: 表示用于重复惩罚奖励的n-gram数量,默认值为
3。 -
repetition_max_penalty: 表示重复惩罚奖励的最大负值,默认值为
-1.0。
每个字段都使用了 field() 函数来定义其默认值和元数据(如帮助信息)。这有助于工具和库更好地理解和处理这些字段,例如生成命令行解析器时。
4.2 系统提示字符串 SYSTEM_PROMPT
SYSTEM_PROMPT = ("A conversation between User and Assistant. The user asks a question, and the Assistant solves it. The assistant ""first thinks about the reasoning process in the mind and then provides the user with the answer. The reasoning ""process and answer are enclosed within <think> </think> and <answer> </answer> tags, respectively, i.e., ""<think> reasoning process here </think><answer> answer here </answer>"
)
字符串描述了一个对话场景,用户先提问,助手首先思考推理过程,然后提供答案。推理过程和答案分别用 <think> 和 <answer> 标签包裹,这种格式化有助于区分和识别不同的部分,和DeepSeek-R1的思考过程格式一致。
4.3 奖励函数
奖励函数的定义如下,GRPO默认用到了accuracy_reward和format_reward这两个函数。
# Get reward functionsREWARD_FUNCS_REGISTRY = {"accuracy": accuracy_reward,"format": format_reward,"reasoning_steps": reasoning_steps_reward,"cosine": get_cosine_scaled_reward(min_value_wrong=script_args.cosine_min_value_wrong,max_value_wrong=script_args.cosine_max_value_wrong,min_value_correct=script_args.cosine_min_value_correct,max_value_correct=script_args.cosine_max_value_correct,max_len=script_args.cosine_max_len,),"repetition_penalty": get_repetition_penalty_reward(ngram_size=script_args.repetition_n_grams,max_penalty=script_args.repetition_max_penalty,),"length": len_reward,}reward_funcs = [REWARD_FUNCS_REGISTRY[func] for func in script_args.reward_funcs]
这段代码定义了一个奖励函数注册表 REWARD_FUNCS_REGISTRY,并根据用户提供的配置动态生成一个奖励函数列表 reward_funcs。每个奖励函数用于评估模型输出的不同方面,如准确性、格式、推理步骤等。
- 注册表定义
accuracy: 使用accuracy_reward函数评估模型输出的准确性。format: 使用format_reward函数评估模型输出的格式。reasoning_steps: 使用reasoning_steps_reward函数评估模型输出的推理步骤。cosine: 使用get_cosine_scaled_reward函数计算余弦相似度奖励,参数包括:min_value_wrong: 错误情况下的最小值。max_value_wrong: 错误情况下的最大值。min_value_correct: 正确情况下的最小值。max_value_correct: 正确情况下的最大值。max_len: 最大长度。
repetition_penalty: 使用get_repetition_penalty_reward函数计算重复惩罚奖励,参数包括:ngram_size: n-gram 的大小。max_penalty: 最大惩罚值。
length: 使用len_reward函数评估模型输出的长度。
- 动态生成奖励函数列表
reward_funcs = [REWARD_FUNCS_REGISTRY[func] for func in script_args.reward_funcs]
- 根据
script_args.reward_funcs中指定的奖励函数名称,从REWARD_FUNCS_REGISTRY中获取相应的奖励函数,并生成一个列表reward_funcs。
4.3.1 accuracy_reward函数
该函数用于计算模型生成的补全与真实答案之间的准确性奖励。它通过解析和验证生成的内容与真实答案来确定奖励值。
def accuracy_reward(completions, solution, **kwargs):"""Reward function that checks if the completion is the same as the ground truth."""contents = [completion[0]["content"] for completion in completions]rewards = []for content, sol in zip(contents, solution):gold_parsed = parse(sol,extraction_mode="first_match",extraction_config=[LatexExtractionConfig()],)if len(gold_parsed) != 0:# We require the answer to be provided in correct latex (no malformed operators)answer_parsed = parse(content,extraction_config=[LatexExtractionConfig(normalization_config=NormalizationConfig(nits=False,malformed_operators=False,basic_latex=True,equations=True,boxed="all",units=True,),# Ensures that boxed is tried firstboxed_match_priority=0,try_extract_without_anchor=False,)],extraction_mode="first_match",)# Reward 1 if the content is the same as the ground truth, 0 otherwisereward = float(verify(answer_parsed, gold_parsed))else:# If the gold solution is not parseable, we reward 1 to skip this examplereward = 1.0print("Failed to parse gold solution: ", sol)rewards.append(reward)return rewards
- completions (
list): 包含多个补全结果的列表,每个补全结果是一个包含内容的字典列表。 - solution (
list): 真实答案的列表。 - kwargs: 其他可选参数(在本函数中未使用)。
-
提取补全内容
contents = [completion[0]["content"] for completion in completions]- 从
completions列表中提取每个补全的第一个内容(假设每个补全是单个元素的列表),形成一个新的contents列表。
- 从
-
初始化奖励列表
rewards = [] -
遍历每个补全和对应的真实答案
for content, sol in zip(contents, solution):gold_parsed = parse(sol,extraction_mode="first_match",extraction_config=[LatexExtractionConfig()],)- 使用
zip函数将contents和solution配对。 - 对于每一对补全内容和真实答案,首先解析真实答案
sol,使用parse函数提取其中的信息。
- 使用
-
处理解析结果
if len(gold_parsed) != 0:answer_parsed = parse(content,extraction_config=[LatexExtractionConfig(normalization_config=NormalizationConfig(nits=False,malformed_operators=False,basic_latex=True,equations=True,boxed="all",units=True,),# Ensures that boxed is tried firstboxed_match_priority=0,try_extract_without_anchor=False,)],extraction_mode="first_match",)- 如果解析得到的真实答案
gold_parsed非空,则继续解析生成的补全内容content。 - 使用
LatexExtractionConfig和NormalizationConfig进行详细配置,确保解析过程中考虑了各种格式要求(如方程、单位等)。
- 如果解析得到的真实答案
-
计算奖励
reward = float(verify(answer_parsed, gold_parsed))- 使用
verify函数比较生成的补全解析结果和真实答案的解析结果。 - 如果两者匹配,则返回
1.0,否则返回0.0。
- 使用
-
处理无法解析的情况
else:reward = 1.0print("Failed to parse gold solution: ", sol)- 如果真实答案无法解析,则默认给予奖励
1.0并打印警告信息。
- 如果真实答案无法解析,则默认给予奖励
-
添加奖励到列表
rewards.append(reward) -
返回所有奖励
return rewards
4.3.2 verify函数
该函数用于验证目标表达式是否与参考表达式匹配,它通过多种比较策略来处理不同的数学对象(如数字、表达式、集合、矩阵等),并提供灵活的配置选项以适应不同的需求。
def verify(gold: list[Basic | MatrixBase | str] | Basic | MatrixBase | str, target: list[Basic | MatrixBase | str] | Basic | MatrixBase | str, float_rounding: int=6,numeric_precision: int=15,strict: bool=True,timeout_seconds: int=3
) -> bool:
- gold: 参考或正确的表达式,可以是单个 SymPy 表达式(
Basic或MatrixBase)、字符串或这些类型的列表。 - target: 需要验证的表达式,类型同
gold。 - float_rounding: 浮点数舍入的小数位数,默认为 6。
- numeric_precision: 数值比较时考虑的小数位数,默认为 15。
- strict: 是否启用严格比较模式,默认为
True。- 在严格模式下:变量很重要,集合不可与元组比较。
- 在非严格模式下:变量按位置匹配,集合可与元组比较。
- timeout_seconds: 单次比较操作的最大超时时间(秒),默认为 3 秒。
-
定义内部比较函数
compare_single_extraction@timeout(timeout_seconds=timeout_seconds) def compare_single_extraction(gold: Basic | MatrixBase | str, target: Basic | MatrixBase | str) -> bool:...- 使用装饰器
@timeout设置超时保护,默认超时时间为timeout_seconds。 - 比较两个表达式:
- 如果两者都是 SymPy 表达式(
Basic或MatrixBase),则调用sympy_expr_eq进行比较。 - 如果两者都是字符串,则进行简单的字符串比较。
- 如果两者都是 SymPy 表达式(
- 使用装饰器
-
定义包装函数
compare_single_extraction_wrapperdef compare_single_extraction_wrapper(g, t):try:return compare_single_extraction(g, t)except Exception as e:logger.exception(f"Error comparing {g} and {t}")return False- 包装
compare_single_extraction,捕获并记录任何异常,返回False以避免程序中断。
- 包装
-
处理输入列表
if not isinstance(gold, list):gold = [gold] if not isinstance(target, list):target = [target]- 如果
gold或target不是列表,则将其转换为单元素列表,以便统一处理。
- 如果
-
组合所有可能的比较
return any(compare_single_extraction_wrapper(g, t) for g, t in product(gold, target))- 使用
itertools.product生成所有可能的gold和target组合。 - 对每个组合调用
compare_single_extraction_wrapper,如果任意一对匹配成功,则返回True。
- 使用
4.3.3 format_reward函数
函数用于检查给定的完成文本是否符合特定的格式,它验证完成文本是否包含 <think> 和 <answer> 标签,并且这两个标签的内容是非空的。
def format_reward(completions, **kwargs):"""Reward function that checks if the completion has a specific format."""pattern = r"^<think>.*?</think>\s*<answer>.*?</answer>$"completion_contents = [completion[0]["content"] for completion in completions]matches = [re.match(pattern, content, re.DOTALL | re.MULTILINE) for content in completion_contents]return [1.0 if match else 0.0 for match in matches]
- completions: 这是一个列表,其中每个元素都是一个包含完成内容的对象(通常是字典)。假设每个完成对象的第一个元素包含一个键
"content",其值是需要检查的文本。 - kwargs: 其他关键字参数,这里没有使用,但可以为未来的扩展提供灵活性。
-
正则表达式模式定义:
pattern = r"^<think>.*?</think>\s*<answer>.*?</answer>$"- 这个正则表达式用于匹配字符串是否以
<think>开始,紧接着是任意字符(非贪婪匹配),然后是</think>,接着可能有任意数量的空白字符(包括换行符),最后是以<answer>开始并以</answer>结束。 .*?是非贪婪匹配,确保尽可能少地匹配字符。\s*匹配零个或多个空白字符(包括换行符)。re.DOTALL | re.MULTILINE标志允许点号.匹配所有字符(包括换行符),并且使多行文本中的每一行都可以独立匹配。
- 这个正则表达式用于匹配字符串是否以
-
提取完成内容:
completion_contents = [completion[0]["content"] for completion in completions]- 这里通过列表推导式从
completions列表中提取每个完成对象的第一个元素的"content"字段,形成一个新的列表completion_contents。
- 这里通过列表推导式从
-
匹配正则表达式:
matches = [re.match(pattern, content, re.DOTALL | re.MULTILINE) for content in completion_contents]- 使用
re.match函数对completion_contents中的每个内容应用正则表达式模式。 matches列表将包含re.Match对象(如果匹配成功)或None(如果匹配失败)。
- 使用
-
生成奖励分数:
return [1.0 if match else 0.0 for match in matches]- 最后一步是根据匹配结果生成奖励分数。如果匹配成功(即
match不是None),则返回1.0;否则返回0.0。
- 最后一步是根据匹配结果生成奖励分数。如果匹配成功(即
示例代码:
completions = [[{"content": "<think>This is reasoning.</think><answer>This is answer.</answer>"}],[{"content": "<think>This is reasoning.</think>"}],[{"content": "<answer>This is answer.</answer>"}],[{"content": "This does not match."}]
]reward_scores = format_reward(completions)
print(reward_scores) # 输出: [1.0, 0.0, 0.0, 0.0]
在这个例子中:
- 第一个完成内容完全匹配正则表达式,因此得分为
1.0。 - 后三个完成内容不符合要求,因此得分均为
0.0。
4.4 将数据集格式化为对话形式
# Format into conversationdef make_conversation(example):return {"prompt": [{"role": "system", "content": SYSTEM_PROMPT},{"role": "user", "content": example["problem"]},],}dataset = dataset.map(make_conversation)for split in dataset:if "messages" in dataset[split].column_names:dataset[split] = dataset[split].remove_columns("messages")
将一个数据集中的每个示例转换为对话格式,并确保数据集中没有多余的列(如 messages)。
- 输入:
example是一个字典,包含单个数据样本的信息,其中"problem"键对应的值是用户的问题或任务描述。 - 输出:返回一个新的字典,包含一个
"prompt"键,其值是一个对话列表:- 第一条消息是系统消息,内容由
SYSTEM_PROMPT定义。 - 第二条消息是用户消息,内容是
example["problem"]。
- 第一条消息是系统消息,内容由
dataset.map(make_conversation):使用map方法将make_conversation函数应用到数据集的每个示例上,生成新的对话格式。- 移除多余列:遍历数据集的每个拆分(split),如果存在
"messages"列,则将其移除。
4.5 初始化GRPO Trainer
trainer = GRPOTrainer(model=model_args.model_name_or_path,reward_funcs=reward_funcs,args=training_args,train_dataset=dataset[script_args.dataset_train_split],eval_dataset=dataset[script_args.dataset_test_split] if training_args.eval_strategy != "no" else None,peft_config=get_peft_config(model_args),callbacks=get_callbacks(training_args, model_args),)
篇幅有限,训练部分的代码我们放到下一篇博文详细解读!
相关文章:
【复现DeepSeek-R1之Open R1实战】系列6:GRPO源码逐行深度解析(上)
目录 4 GRPO源码分析4.1 数据类 GRPOScriptArguments4.2 系统提示字符串 SYSTEM_PROMPT4.3 奖励函数4.3.1 accuracy_reward函数4.3.2 verify函数4.3.3 format_reward函数 4.4 将数据集格式化为对话形式4.5 初始化GRPO Trainer 【复现DeepSeek-R1之Open R1实战】系列3࿱…...
若依Flowable工作流版本监听器使用方法
1.前言 本文详细介绍如何在若依Flowable工作流版本(RuoYi-Vue-Flowable)中配置执行监听器和任务监听器。是以我二次开发的代码为基础,介绍如何配置监听器,已解决源码在新增或删除监听器出现的问题,如果需要二次开发的…...
机器视觉--图像的运算(乘法)
一、引言 在图像处理领域,Halcon 是一款功能强大且广泛应用的机器视觉软件库。它提供了丰富的算子和工具,能够满足各种复杂的图像处理需求。图像的乘法运算作为其中一种基础操作,虽然不像一些边缘检测、形态学处理等操作那样被频繁提及&…...
突破反爬困境:从服务端渲染到客户端SPA,爬虫环境的演变与新挑战(一)
声明 本文所讨论的内容及技术均纯属学术交流与技术研究目的,旨在探讨和总结互联网数据流动、前后端技术架构及安全防御中的技术演进。文中提及的各类技术手段和策略均仅供技术人员在合法与合规的前提下进行研究、学习与防御测试之用。 作者不支持亦不鼓励任何未经授…...
matlab下载安装图文教程
【matlab介绍】 MATLAB是一款由美国MathWorks公司开发的专业计算软件,主要应用于数值计算、可视化程序设计、交互式程序设计等高科技计算环境。以下是关于MATLAB的简要介绍: MATLAB是MATrix LABoratory(矩阵实验室)的缩写&#…...
七、敏捷开发工具:持续集成与部署工具
一、敏捷开发工具——持续集成与部署工具 持续集成(CI)与持续部署(CD)是现代敏捷开发中不可或缺的关键实践。通过自动化构建、测试和部署流程,团队可以快速反馈、提高代码质量,并加速产品交付。为此,持续集成与部署工具应运而生,它们能够帮助开发团队在整个开发周期内…...
重看Spring聚焦BeanDefinition分析和构造
目录 一、对BeanDefinition的理解 (一)理解元信息 (二)BeanDefinition理解分析 二、BeanDefinition的结构设计分析 (一)整体结构体会 (二)重要接口和类分析 三、构造 BeanDef…...
2025年新型智慧城市整体解决方案下载:顶层规划设计,应用总体建设方案
一、引言 随着信息技术的飞速发展和城市化进程的加速,智慧城市已成为未来城市发展的新趋势。新型智慧城市通过深度融合物联网、大数据、云计算、人工智能等先进技术,旨在实现城市管理的智能化、精细化和服务的人性化,提升城市治理效能&#…...
【旋转框目标检测】基于YOLO11/v8深度学习的遥感视角船只智能检测系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
【物联网】电子电路基础知识
文章目录 一、基本元器件1. 电阻2. 电容3. 电感4. 二极管(1)符号(2)特性(3)实例分析5. 三极管(1)符号(2)开关特性(3)实例6. MOS管(产效应管)(1)符号(2)MOS管极性判定(3)MOS管作为开关(4)MOS管vs三极管7. 门电路(1)与门(2)或门(3)非门二、常用元器件…...
Linux-GlusterFS配置
文章目录 GlusterFS配置 🏡作者主页:点击! 🤖Linux专栏:点击! ⏰️创作时间:2025年02月18日19点21分 GlusterFS配置 1、分区操作 fdisk -l #查看本地磁盘 fdisk /dev/vdb #对/dev/vdb进…...
IIS asp.net权限不足
检查应用程序池的权限 IIS 应用程序池默认使用一个低权限账户(如 IIS_IUSRS),这可能导致无法删除某些文件或目录。可以通过以下方式提升权限: 方法 1:修改应用程序池的标识 打开 IIS 管理器。 在左侧导航树中&#x…...
centos 9 时间同步服务
在 CentOS 9 中,默认的时间同步服务是 chrony,而不是传统的 ntpd。 因此,建议使用 chrony 来配置和管理时间同步。 以下是使用 chrony 配置 NTP 服务的步骤: 1. 安装 chrony 首先,确保系统已安装 chrony。 在 CentOS…...
使用Java爬虫获取1688按图搜索商品(拍立淘API接口)
在电商领域,按图搜索商品(拍立淘)是一种非常实用的功能,尤其适合用户通过图片快速查找相似商品。1688开放平台提供了按图搜索商品的API接口,允许开发者通过图片获取相关的商品信息。本文将详细介绍如何使用Java爬虫技术…...
DeepSeek 助力 Vue 开发:打造丝滑的范围选择器(Range Picker)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
常用标准库之-std::iota
定义与头文件 std::iota 是 C 标准库 <algorithm> 头文件中提供的一个算法,用于将一个连续递增的值赋给指定范围内的元素。 函数原型 template< class ForwardIt, class T > void iota( ForwardIt first, ForwardIt last, T value );ForwardIt&#…...
Linux环境Docker使用代理推拉镜像
闲扯几句 不知不觉已经2月中了,1个半月忙得没写博客,这篇其实很早就想写了(可追溯到Docker刚刚无法拉镜像的时候),由于工作和生活上的事比较多又在备考软考架构,拖了好久…… 简单记录下怎么做的…...
SCI学术论文图片怎么免费绘制:drawio,gitmind
SCI学术论文图片怎么免费绘制 目录 SCI学术论文图片怎么免费绘制overleaf怎么图片不清晰怎么办SCI学术论文图片怎么导出pdfdrawiogitmind**1. 使用在线工具****Lucidchart****2. Draw.io****3. ProcessOn****4. 使用桌面工具****Dia****5. 使用Markdown工具(如Typora)**如果你…...
伯克利 CS61A 课堂笔记 10 —— Trees
本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理,全英文内容,文末附词汇解释。 目录 01 Trees 树 Ⅰ Tree Abstraction Ⅱ Implementing the Tree Abstraction 02 Tree Processing 建树过程 Ⅰ Fibonacci tree Ⅱ Tree Process…...
全局动态组件uniapp(vue)
全局动态组件uniapp(vue) 在我们很多项目中,我们需要创建一个组件,使其他在所有的路由页都存在,比如手机上的悬浮在屏幕上的圆形快捷按钮,那么我们就需要创建一个全局组件。 创建组件时我们所考虑的主要是两个点,一个…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
