【Leetcode Python题解】「2097. Valid Arrangement of Pairs」
【Leetcode Python题解】「2097. Valid Arrangement of Pairs」在这篇技术博客中,我们将深入解析 LeetCode 的第 2097 题 —— Valid Arrangement of Pairs,并全面介绍如何从题意理解、图论建模到算法实现逐步解决问题。题目:2097. Valid Arrangement of Pairs问题描述给定一个二维数组 pairs,其中 pairs[i] = [start, end],我们需要重新排列这些数字对,使得相邻的两个数字对 [start1, end1] 和 [start2, end2] 满足以下条件: end1 == start2。 输入数据保证一定存在这样一种合法的排列方式。 示例示例 1输入: 1pairs = [[5,1],[4,5],[11,9],[9,4]] 输出: 1[[11,9],[9,4],[4,5],[5,1]] 解释:排列后满足条件: end0 = 9 == 9 = start1 end1 = 4 == 4 = start2 end2 = 5 == 5 = start3 ...
LoRA, DPO, KTO 与 SFT 技术详解
LoRA, DPO, KTO 与 SFT 技术详解本篇文档将详细介绍几种在大型语言模型(如 LLAMA3)微调和优化中的重要技术,包括 SFT(Supervised Fine-Tuning)、LoRA(Low-Rank Adaptation)、Alignment 技术、KTO(Kahneman-Tversky Optimization) 和 DPO(Direct Preference Optimization)。文中还将详细阐述每种技术的原理、具体实现方法以及相应的损失函数与优化器选择。 1. SFT(Supervised Fine-Tuning)1.1 原理SFT 是一种传统的微调方法,通过监督学习对预训练模型进行微调,调整模型的参数使其在特定任务上表现更好。SFT 通常用于针对特定的标注数据进行模型微调,训练的过程类似于常规的监督学习。 1.2 实现方法 选择预训练模型:如 GPT、BERT 等语言模型。 准备标注数据集:数据集包含输入和输出对。 训练模型:使用标准的交叉熵损失函数对模型进行训练,通过梯度下降优化参数。 1.3 核心代码使用 Hugging Face 的 ...
使用压缩有限状态机进行本地 LLM 的快速 JSON 解码
使用压缩有限状态机进行本地 LLM 的快速 JSON 解码作者: Liangsheng Yin, Ying Sheng, Lianmin Zheng日期: 2024 年 2 月 5 日 本文内容基于 LMSYS Org 发布的一篇博客文章,原文链接:LMSYS Org 博客。相关的代码库可以在以下链接找到:SGLang 代码库。 让一个 LLM 始终生成符合特定模式的有效 JSON 或 YAML,对于许多应用来说是一个关键特性。在这篇博客文章中,我们介绍了一种显著加速这种约束解码的优化方法。我们的方法利用了压缩的有限状态机,并且兼容任何正则表达式,因此可以适用于任何 JSON 或 YAML 模式。与现有系统逐步解码一个标记的方式不同,我们的方法分析了正则表达式的有限状态机,压缩了单一的转换路径,并在可能的情况下一次性解码多个标记。与最先进的系统(guidance + llama.cpp,outlines + vLLM)相比,我们的方法可以将延迟减少最多 2 倍,并提高吞吐量最多 2.5 倍。这一优化还使得约束解码比普通解码更快。你可以在 SGLang 上试用它。 图一展示了 ...
使用vLLM运行微调后的Gemma-2
使用vLLM运行微调后的Gemma-2-2b-it的详细步骤在这里分享一下我运行微调后的Gemma-2-2b-it模型并使用vLLM的步骤,希望对其他人有所帮助。本文将详细介绍安装过程、环境配置以及常见问题的解决方法。 安装和验证vLLM首先,确保安装并验证vLLM的版本是0.5.3。 安装vLLM: 1pip install vllm==0.5.3 验证安装: 123import vllmprint(vllm.__version__)# 输出: 0.5.3 安装Flashinfer按照以下步骤安装Flashinfer,并确保您的torch版本和CUDA兼容性。 检查torch版本和CUDA兼容性: 123import torchprint(torch.__version__) # 应输出: 2.3.1+cu121print(torch.version.cuda) # 应输出: 12.1 安装Flashinfer:根据文档,Gemma运行在版本0.08。vLLM需要FlashInfer v0.0.8(请参阅vLLM版本和Flashinfer文档中关于Gemma 2的部...
如何准确计算固定长度模型的困惑度(PPL)
如何计算固定长度模型的困惑度(PPL)困惑度(PPL)是评估语言模型最常用的指标之一。在深入探讨之前,我们应该注意这个指标特别适用于传统语言模型(有时被称为自回归或因果语言模型),而对于像 BERT 这样的 masked language models 则没有明确定义(见模型总结)。 困惑度被定义为序列的指数化平均负对数似然。如果我们有一个标记化序列 $X = (x_0, x_1, \dots, x_t)$,那么 $X$ 的困惑度为, $$\text{PPL}(X) = \exp \left{ -\frac{1}{t}\sum*{i=1}^t \log p\theta (xi|x*{<i}) \right}$$ 其中 $\log p\theta (x_i|x{<i})$ 是第 i 个标记的对数似然,条件是根据我们的模型前面的标记 $x_{<i}$。直观上,它可以被认为是评估模型在语料库中指定标记集合上预测均匀性的能力。重要的是,这意味着标记化程序直接影响模型的困惑度,这在比较不同模型时应始终考虑。 这也相当于数据和模型预测之间的交叉熵的指数化。想要了解更多关于困...
【Python题解】2834. 找出美丽数组的最小和
2834. 找出美丽数组的最小和 Problem: 2834. 找出美丽数组的最小和 题目描述给定两个正整数 n 和 target,目标是找到一个长度为 n 的数组,满足以下条件: 数组由两两不同的正整数组成。 不存在两个不同下标 i 和 j 使得 nums[i] + nums[j] == target。返回符合条件的美丽数组所可能具备的最小和,并对结果进行 10^9 + 7 取模。 测试用例示例 1: 输入:n = 2, target = 3 输出:4 示例 2: 输入:n = 3, target = 3 输出:8 示例 3: 输入:n = 1, target = 1 输出:1 原始思路方案初始方案是从最小的数字开始,逐个检查每个数字是否可以被添加到数组中,同时确保不会存在两个数字之和等于 target。 从 1 开始逐个尝试添加数字到数组。 对于每个数字,检查是否与数组中已有的数字相加会得到 target。 如果不会,将其添加到数组中。 继续此过程,直到数组长度达到 n。 代码123456789101112def minimumPossibleSum(n...
跟着GPT老师学小聊:如何做一个好的捧哏
英语小聊 (small talk) 是日常生活中不可或缺的交流形式,它不仅有助于打破沉默,也能在轻松的氛围中促进理解和友谊。在这篇文章中,我们将结合 10 个主题,提供相关的词汇、短语,并分享生活故事的开场白。同时,学习如何成为一名优秀的捧哏,通过提问和接话,让对话更加流畅和有趣。 1. 旅游体验 (Travel Experiences) 词汇:Itinerary (行程), off the beaten path (人迹罕至), picturesque (如画的), excursion (远足), landmark (地标)。 短语:Cultural immersion (文化沉浸), travel off the beaten path (走偏僻的路), soak up the atmosphere (沉浸在气氛中)。 故事开场: “One place I really enjoyed visiting was…” (我非常喜欢去的一个地方是…) 追问: “That sounds amazing! What was the most unforgettable part of...
【Python题解】100226. 在带权树网络中统计可连接服务器对数目
题目:100226. 在带权树网络中统计可连接服务器对数目题目描述你被给定一个未定根的加权树,它有 n 个顶点,代表从 0 到 n - 1 编号的服务器,一个数组 edges,其中 edges[i] = [ai, bi, weighti] 代表顶点 ai 和 bi 之间的双向边,边的权重为 weighti。你还被给定一个整数 signalSpeed。 如果满足以下条件,两个服务器 a 和 b 可以通过服务器 c 连接: a < b,a != c 且 b != c。 从 c 到 a 的距离可被 signalSpeed 整除。 从 c 到 b 的距离可被 signalSpeed 整除。 从 c 到 b 和从 c 到 a 的路径不共享任何边。 返回一个整数数组 count,长度为 n,其中 count[i] 是通过服务器 i 可连接的服务器对数。 示例示例 1: 输入: edges = [[0,1,1],[1,2,5],[2,3,13],[3,4,9],[4,5,2]], signalSpeed = 1输出: [0,4,6,6,4,0]解释: 由于 signalSpeed 为...
【Python题解】100232. 超过阈值的最少操作数 II
题目:100232. 超过阈值的最少操作数 II题目描述超过阈值的最少操作数 II 给定一个从 0 开始的整数数组 nums 和一个整数 k。你可以进行如下操作: 选择 nums 中最小的两个整数 x 和 y。 将 x 和 y 从 nums 中删除。 将 min(x, y) * 2 + max(x, y) 添加到数组中的任意位置。 注意,只有当 nums 至少包含两个元素时,你才可以执行以上操作。 目标是使数组中的所有元素都大于或等于 k。请返回实现此目标所需的最少操作次数。 示例 示例 1: 输入:nums = [2,11,10,1,3], k = 10 输出:2 解释:第一次操作中,我们删除元素 1 和 2,然后添加 1 _ 2 + 2 到 nums 中,nums 变为 [4, 11, 10, 3]。第二次操作中,我们删除元素 3 和 4,然后添加 3 _ 2 + 4 到 nums 中,nums 变为 [10, 11, 10]。此时,数组中的所有元素都大于等于 10,所以我们停止操作。需要的最少操作次数为 2。 示例 2: 输入:nums = [1,1,2,4,9...
【Python题解】100231. 超过阈值的最少操作数 I
超过阈值的最少操作数 I题目给定一个下标从 0 开始的整数数组 nums 和一个整数 k。在每次操作中,你可以删除 nums 中的最小元素。目标是通过最少的操作次数使数组中的所有元素都大于或等于 k。需要返回实现此目标所需的最少操作次数。 示例示例 1: 输入:nums = [2, 11, 10, 1, 3], k = 10 输出:3 解释: 第一次操作后,nums 变为 [2, 11, 10, 3]。 第二次操作后,nums 变为 [11, 10, 3]。 第三次操作后,nums 变为 [11, 10]。 此时,数组中的所有元素都大于等于 10,所以停止操作。 使数组中所有元素都大于等于 10 需要的最少操作次数为 3。 示例 2: 输入:nums = [1, 1, 2, 4, 9], k = 1 输出:0 解释:数组中的所有元素都大于等于 1,所以不需要对 nums 做任何操作。 示例 3: 输入:nums = [1, 1, 2, 4, 9], k = 9 输出:4 解释:nums 中只有一个元素大于等于 9,所以需要执行 4 次操作。 提示 1 <= ...