自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(130)
  • 收藏
  • 关注

原创 leetcode-684.冗余连接

find,用于找到当前节点所在集合的唯一root,就是一直找它的parent。union,就是把两个节点所在的两个集合的两个root合一起,即把一个root本来指向自己的指向另一个root。在一开始,每个点都是一个独立的集合。每次迭代一条边,都会把两个集合合并起来,且是有方向地合并,这样才能在不断找parent的过程中,以唯一的root作为该集合的hash值。该题显然是要一次遍历给定数组,然后不断查看边的两个节点是否已经在一个集合里,是典型的并查集应用题。这是我第一次用并查集相关的数据结构。

2025-04-01 18:58:06 170

原创 leetcode-97.交错字符串

只能用动态规划,行为s1列为s2,用True False代表能不能拼成。第一行就是s2和s3逐位比较是不是True,加上前一列是不是True,俩都是True当前位才是True。如果来自s2,则考虑s2缩一位,也就是看左边的情况是不是True,且本位对应的s2和s3元素是不是想等,对应哪个s3元素可以从当前s1+s2的字符串长度看出来。如果最后一位来自s1,则行缩一位,看看上面的情况是不是True,再看s1和s3的对位。注意初始状态的设计,要额外增加一行一列的初始状态,即从无s1和无s2开始。

2025-04-01 15:47:28 223

原创 leetcod-80.删除有序数组中的重复项II

判断要不要移动,关键在慢指针往前2个位置是否和快指针指向的值一样,一样就不移了。一眼双指针,慢指针指向需要被替换的值,快指针指向要被移动到慢指针处的值。因此注意快慢指针要从2开始,快指针超过数组边界则停止。

2025-03-23 17:46:20 75

原创 leetcode-12.整数转罗马数字

首先应该把特殊规则构建出要添加的字符,,即把4、9、40、90这些要编成什么字符显式定义出来, 否则靠程序判别,会很麻烦,需要知道首位数字才行,莫不如把规则全写明白。这题对我有点反直觉。

2025-03-23 17:18:43 193

原创 leetcode-274.H指数

然后,从0到论文数量进行对h指数的遍历,当超过论文量时,停止遍历,break掉,找到了h。首先,用哈希表存储各个引用量的数量,超出论文数量的引用量可以不存。我这个是不用sort的方式,所以复杂度是n,但是耗额外空间。h遍历时,更新论文量,把低于h的删掉。

2025-03-23 17:02:14 182

原创 leetcode-45.跳跃游戏II

题很简单,怎么少点写代码比较困难。这题很明显贪心算法,每次跳跃我们都希望理论上能到达的地方更远。一开始站在初始点,那么可选范围就是0到nums[0],在这里面找能跳得最远的点i,接下来遍历nums[0]+1到 i+nums[i],这是下一个可选范围,仍然找能跳的最远的点j。可以发现,遍历一次就够。跳多少次怎么判断?我们需要遍历的时候保存当前可选范围和跳跃最远范围,当遍历到可选范围边界了,说明得从刚才的点里能跳的最远的地方跳一次了,此时jump+=1,可选范围更新。由于遍历总是在可选范围里(每次要超出可

2025-03-23 16:42:33 298

原创 leetcode-134.加油站

所以程序这么写:首先我要遍历补充和消耗,一来统计总油量是否足够消耗(求差值的和),而来看当前点是否油<0,满足则说明当前节点亏油,且之前节点补充不够,就要认下一个点为潜在出发点。油箱容积无限,要求能环岛,说明总共加起来的油是不少于消耗量的,这是唯一一个决定能否环岛的变量,只要油量够,那么必定有一段路是攒油的路,它供给后续的消耗,使得油箱总是不空。如果油量足够,在从任意一点出发时,总有一个点使得后续油量总是不空,因此我们需要查看当前油箱情况,油<0了,说明潜在出发点不在前面,可能在当前。

2025-03-23 15:40:10 204

原创 leetcode-200.岛屿数量

于是,代码就好写了。外面两个循环,当看到1了,就是找到岛了,然后启动毁岛程序func。func做两件事,一个是摧毁当前地块,一个是往四周移动,停止条件是当前地块的四周都不是岛,或者碰到了边界,则不需要继续破坏了。其次,我怎么知道两个点是否属于一个岛?只有一个方法,我踏上一个岛的某个点时,我就分别往四周走,且把当前地块毁掉,就像瘟疫一样。首先,想要找岛,肯定是要逐个遍历的,否则肯定会漏岛。

2025-03-23 15:26:48 190

原创 语音大模型补课

在理解时序音频是如何变成“图片”后,紧接着就要问,这个图片的处理和cv的大模型处理是否一样。全链路来说,为了做到音频输入->音频输出,一般分成以下三种链路:我们只关注上图(a)中的“语音转文本”,其他的后面再慢慢看。(反正语音已经做烂了,大模型出来之前就做烂了)

2025-03-21 17:26:01 873

原创 基础-语音是怎么进到LLM里面的

看完了就知道声音是怎么转为“图片”的了,后续再看看这些频谱图的处理与cv领域用的ViT处理方法有何不同。

2025-03-21 11:36:15 340

原创 rag-给一篇几百页的pdf,如何从中找到关键信息并汇总出关系图

小思考。

2025-03-19 11:03:45 312

原创 leetcode-50.Pow(x,n)

考虑n变成二进制,则就变成了1+2+4这种形式,如果有1 2 4,就乘,否则只迭代x。,可以发现,本来乘6次x,如果x自身也在迭代取平方,则只要4次乘法。如果n<0,就让x取反,n取绝对值。首先,先保证n是正数。然后考虑怎么快速乘法。快速计算次方的方法。

2025-03-18 23:40:20 262

原创 leetcode-47.全排列II

能防止的也只有同层,如果同层走一个值,但是该值重复,且走过了,则放弃走该分支。所以设layer_used_num这个set。基础写法肯定是按无重复值时的全排列写,在其中要加上防止走重复路径的分支。如何在有重复值的时候节省时间是优化重点。

2025-03-18 23:23:13 164

原创 DAPO速读

字节发力了。

2025-03-18 01:10:19 836

原创 leetcode974. 和可被 K 整除的子数组

使用前缀数组可以快速统计加和问题。然后基于题目,考虑是寻找整除的子集,换个说法,当前前缀的余数要与之前的某个余数一样,两前缀之差为合格子集。除此外,额外统计前缀中本身就余数为0的子集数量。

2025-03-17 19:01:23 472

原创 leetcode高质量代码学习-30.串联所有单词的子串

更好的思路是这样:一个word长度为3,那么统计时以0 1 2 为开始,分别统计到尾部。在分别统计中,维护windows长度的子串词表,并不断检查词表是否与给定词表相同。检查方式为:每次某个词进入时,检查该词数量与要求数量是否一致,一致则计数+1;某个词去除时,去除前若要求数量一致,则一致计数-1。这样,只需要检查计数是否与目标词表大小相等就行了,而不需要遍历检查一致。简单思路要以固定windows滑窗检查所有可能的子串,这样复杂度极高,且需要频繁地重新统计词表。

2025-03-17 08:59:07 199

原创 leetcode高质量代码学习-24.两两交换链表中的节点

没有难度。只要习惯了这种题总是创建个空root头就行了,然后周期性地往前移动、交换、判断边界。注意交换完的新root是什么。

2025-03-17 08:22:27 312

原创 leetcode高质量代码学习-32.最长有效括号

使用stack保存状态,如果匹配成功了,则该子串应该从哪儿开始算长度,这个信息在stack里找。显然,stack可以帮你找到当前右括号匹配的左括号的下标。如果是左括号,就把下标压进去。首先,初始统计位置为-1。

2025-03-16 21:20:10 143

原创 leetcode高质量代码学习-48.旋转图像

想不明白的话,完全可以拿一个例子对应着算下标公式。想明白每一位转90度转到哪里,就比较好做了。还有就是哪些元素要转也要算好,3。3矩阵要选到左上角那2。

2025-03-16 20:48:38 131

原创 leetcode高质量代码学习-29.两数相除

思路:暴力的想法是,对于被除数和除数,每次减去一个被除数,然后商+1.但是显然很慢。能加速,但是不让用乘除法,那么就用<<移位代替,尽可能地从大到小地看能一次性减去多少个被除数。就减,减不掉就把31变30.核心就在for循环那里。往后一点点挪,能减掉。

2025-03-16 20:36:03 138

原创 leetcode高质量代码学习-22.括号生成

很简单的题,只需要塞左右括号,然后讨论什么时候可以塞左or右,什么时候停止。

2025-03-16 20:17:10 89

原创 leetcode高质量代码学习-15.三数之和

经典题目了。

2025-03-16 19:59:31 270

原创 rpc和proto

首先,rpc是一种比http和restapi更轻量的协议,应该都知道http要有http头,header,rpc采用更紧凑的编码方式,具体我也不懂,反正它的协议叫做gRPC。然后,为了让rpc流行起来,需要一个在各种语言中都能被使用的方法,protobuf作为一种中间语言,在编写后可以被编译成各种语言的版本,然后供各语言的代码调用,这个编译器叫protoc,c是complier。nest message:它只是一种嵌套形式,在message里定义一个message,毕竟message也是一个变量类型。

2025-03-09 20:27:49 419

原创 向量数据库原理解析

基础的向量数据库原理想必都很熟了,其核心就是对于所有要查询的query embedding,找一个或多个与其最相似的data embedding。向量数据库做成对embedding得相似度计算很简单,难就难在:你面对的是一个可能存储几十万几百万embedding的数据库,对于任意一个来访的embedding,你真的要遍历这几百万数据库吗?为了搜索效率,各种框架就要开始发力了。

2025-03-07 11:34:17 833

原创 如何从PPO rlhf到DPO

说人话:优化后的模型,应该是基于原始模型的输出,然后让输出概率受e的reward次方调整一下,当reward够好时,y_win会自然被调整地概率更大。虽然这只是rlhf里KL散度的公式,但是对整体的min不耽误对它的min。当x已知时,上面的可以说是一串连续or离散值的归一化公式,所以让上面的式子对y积分的话,一定是1。且,每一个值都是>0的。如果你想让两个答案一较高下,就像我们在rl里做的那样,那么你的目的应该是让。的距离,注意这是个reverse KL,比forward KL方差更小,因此更稳定。

2025-03-03 23:57:20 811

原创 Deepseek-r1-zero和Deepseek-r1

zero是一个实验,它不足以作为商业化模型进行应用。

2025-02-27 12:02:12 622

原创 生成式模型与判别式模型的区别

llm总要给一个token做开头。但是也好解决,给所有话的前面加一个固定的token,就叫bos,那这就等于是初始状态了,就可以看做是生成式了。再考虑现在所有llm都要一个bos,所以现在的llm都是生成式。你想啊,生成式模型一开始可以啥都不给,就从初始状态(无)加一个转移矩阵获得第一个token。而判别式模型必须给一个x才能输出y。两者最主要的区别是提不提供x,也因此,二者的学习目标有差别,前者学习的联合概率P(x,y),后者是p(y‖x)。最标准的生成式模型是markov链。

2025-02-20 13:39:29 155

原创 label-smoothing有用的原因

但是如果数据不足,本来基模效果挺好,但是被小训练集搞得过拟合了,效果就会比大训练集差。所以不要追求完美的one-hot label,次一级的label-smoothing让基模保持自身性能的同时能够稍微拟合当下的小训练集,综合起来效果就好了。如果数据足,在学习中,模型被各条数据左右拉扯,最终会趋于一个对大家都好的状态。有时候模型效果不好,把label换成smoothing就会好一些。当然,这个方法并非一定有用,毕竟训练的事儿谁说得准呢。原因是数据不足,只能降低任务难度。

2025-01-10 14:19:23 97

原创 DeepSeek-v3笔记(1)

直接从第二章Architecture开始。

2025-01-07 16:56:49 1804

原创 vllm源码(一)

声明一个vllm_engine,它的过程是这样的。

2025-01-03 16:37:39 1240

原创 大模型训练,用基座还是chat(instruct)

chat因为有很多任务加训,所以指令遵循能力很强。虽然对新任务的训练效果可能由于老任务的对齐导致对你指令的理解有所偏差,导致效果比base训起来的(可能)会差,但是长远来看,对多指令的学习效果肯定更好,毕竟已经熟悉了很多种指令了。而base模型没有这种加训,导致你可能对单一指令效果较好,加一个指令它效果就不好了,它很难在没有大量指令训练的情况下做好对各个指令的效果的共同提高。因此,一般来说,微调选择chat更好。这两个的区别是有没有做指令对齐。

2024-12-12 15:52:23 176

原创 ESWA改APA格式,使用apalike,不要用apacite

bibliography{你的bib文件名,只要名字不要bib后坠}2.在\end{document}之前使用。3.替换所有\cite为\citep。

2024-12-08 18:23:23 345

原创 过渡句数据生成经验记录

我有一批过渡句标注数据,当初标注的方法是:启发下文的标,但是整体有增量信息的不标。过渡句作为一个经典句子种类,与其他定义都有重合,因此边界不好划分。出于应用目的,我们设置标注方法时,偏向它对总结全文无意义,或是废话,因此有增量信息限制。而新引入的增量信息概念对模型来说是可判断的,例如只要一个句子是重复上下文以达到过渡目的,则它不包含增量信息。因此我们认为它比较容易被识别。然而训练失败了。原因是预训练模型对过渡句的概念不那么好变过来,你需要大量实际过渡句数据来把这个定义的边界bias到你的概念上。

2024-11-29 16:50:09 226

原创 对你的LLM,如果有那么一批数据特别难学,就算搜参了也学不到,应该怎么办?

先prompt放一例gpt生成的qa,再从难例里抽一例,把q贴在prompt里,assistant贴对应的难例真实a。如果前者的ppl更低,说明当前例大概率对难例的预测有促进作用,可以作为补充数据。此时再去掉gpt的qa,再计算纯难例子生成真实a的ppl。这样补充一批训练数据,就有可能解决问题了。一个简单的方法可以解决。

2024-11-28 13:51:12 97

原创 阶段性prompt经验记录

例如我在识别过渡句时,就从模型定义中找到了 增量信息 的概念,并以此拆解并完善了工作流。

2024-11-27 23:05:34 437

原创 Redix树

字典树是简单的数据结构,以字母为树节点,一条从root到某leaf的路径上,所有字母串起来就是一条数据,你还可以在节点上统计词出现的次数,以此可以快速地检索并统计词频。它是Redis为了缓解字典树搞的,思路也简单,就是对那些还不着急分叉的节点,把它的后缀打包存到leaf上。例如,对于did这个词,root->d->i->d是它形成的一个字典树。在Redix树上,它就是root->did了。假设你的单词平均长度5,一共有26个字母,你的leaf理论上最多。这听着挺大的吼,实际上还真的挺占内存。

2024-11-25 19:19:55 185

原创 glob三个函数的效果

允许你给一个从dirname到basename pattern的整字符串路径,然后匹配一切符合要求的路径。

2024-11-22 20:13:20 242

原创 安装spark

spark依赖java和scale。所以先安装java,再安装scale,再是spark。总体教程跟着这个我跟着这个教程走安装java,但是有一些不同,原教程有一些错误,在环境变量设置的地方。

2024-11-21 15:06:06 674

原创 大规模数据去重——后缀数组

一开始从李沐那里听到的这个去重算法,记得是说把所有数据拼成一个长度为n的长字符串,然后从后往前切,形成n个后缀字符串,再字典排序,只要有两个断点处有部分重复的子串,它们在字典排序后挨得就近,就容易找到重复数据。实际的后缀排序方法为了降低复杂度做了很多优化。有倍增算法+基数排序,即先排序长度为1的字符块,然后基于它再排序长度为2的字符块,再是长度为4…并且如果长度不够,就在排序上给一个绝对领先的位置——0.上面的方法还算好理解,另一个叫做诱导排序(Suffix Array Induced Sorting

2024-11-15 15:16:30 1077 1

原创 focal-loss,triplet-loss和circle-loss TL.NR.

经典loss,针对分类任务数据不平衡问题,在基础的交叉熵上加了一些改动。p是数据分到t类的概率,log是交叉熵。γ是个超参数。当你的某条数据分类不准时,给个大loss显然会有帮助,那么γ0能显著帮助你提升pt过小情况下在整体训练loss中占的比重。α也是个超参数,用于t类训练数据loss的权重调整。显然,当t类数据数量过少时,它的loss会被淹没,α要让t类更有影响,则可以设为类的逆频率,即t类数据越少,αt​越大。

2024-11-10 14:46:15 1037

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除