- 博客(108)
- 收藏
- 关注
原创 深度学习进阶:自然语言处理|4.2.3 QA|交叉熵、激活函数与 y − t:一套数学框架的三个侧面
本文揭示了神经网络输出层与损失函数设计的统计学本质:它们都是基于最大似然估计(MLE)原理的自然选择。文章首先区分了回归(输出连续值)和分类(输出概率)问题,指出分类任务需要将原始输出转换为概率形式。通过抛硬币案例阐释了MLE的核心思想——寻找使观测结果概率最大的参数。在推导过程中,取对数和负号是为了数值稳定和适配梯度下降优化。最终证明交叉熵损失函数(多分类和二分类)都是从MLE推导而来,其本质是最大化正确类别的预测概率。特别指出二分类公式中的两项结构源于只有一个输出神经元的设计约束,但本质上与多分类交叉熵
2026-05-24 13:51:41
188
原创 深度学习进阶:自然语言处理|4.1.2 QA|grads 列表与省略号 [...] 详解
本文探讨了神经网络中梯度计算的关键细节,主要聚焦于三个核心问题:1)grads[0]的含义及其与参数的对应关系;2)使用[...]原地赋值与直接赋值的区别;3)Embedding层梯度清零的必要性。文章通过代码示例说明,原地赋值能保持数组引用不变,而直接赋值会导致优化器引用失效。对于Embedding层,梯度清零是为了清除上一轮的残留梯度,确保当前批次梯度计算的准确性。同时指出,虽然Embedding梯度本质是稀疏的,但为兼容优化器接口仍使用完整矩阵表示。最后分析了重复词ID导致的梯度覆盖问题,通过实验验证
2026-05-24 11:55:28
214
原创 深度学习进阶:自然语言处理|3.4 QA|用 SimpleCBOW 讲清楚 backward 为什么有的 return,有的不 return
摘要: 神经网络反向传播中,梯度分为参数梯度(dW/db)和输入梯度(dx)。参数梯度(如dW_out/dW_in)存储在self.grads中用于优化器更新权重;输入梯度(如dx/da)需返回给前一层继续反向传播。以SimpleCBOW为例:out_layer计算dW_out留存,返回da给in_layer;in_layer计算dW_in留存,dcontexts因无前置层而被丢弃。最终模型梯度存入self.grads供优化器使用,backward()返回None。核心规则:参数梯度本地留存更新,输入梯度向
2026-05-22 15:58:47
61
原创 深度学习进阶:自然语言处理|3.4 QA|共享权重与 `remove_duplicate` 详解
本文解释了神经网络中权重共享机制导致参数重复的问题。当多个层共享同一权重矩阵时,参数列表会出现重复项,而每个层会独立计算梯度。若不处理,优化器(如Adam)会错误地为同一参数维护多套历史状态并多次更新。解决方案是在参数更新前调用remove_duplicate()函数:1)识别重复参数;2)合并对应梯度;3)删除重复项。该方法确保共享权重只被更新一次,同时正确处理梯度累积,避免优化器状态混乱。文中还说明了转置矩阵共享的特殊处理方式。核心在于保证每个参数对应唯一的优化器状态记录。
2026-05-20 15:49:11
254
原创 深度学习进阶:自然语言处理|3.2.3 QA|word2vec 中为什么输入和输出权重都可以表示单词
本文介绍了word2vec模型中W_in、h和W_out三个关键组件的功能。W_in是输入矩阵,将one-hot编码的输入词转换为隐藏向量h;h作为中间表示,用于与输出矩阵W_out的列向量计算点积得分,预测目标词。W_out存储每个词作为输出时的向量表示。三者协同工作:W_in将输入词映射为h,h通过与W_out的交互计算各候选词的得分,最终实现词向量学习和上下文预测。这种架构有效捕捉了词语间的语义关系。
2026-05-19 16:36:37
117
原创 为什么你的指令Prompt在聊天时会失效?
摘要: 文章探讨了大模型在长对话场景中指令失效的问题及解决方案。常规Prompt写法在短对话中有效,但随着轮数增加,模型倾向于延续对话风格而非执行指令。作者提出两种改进方法:1)将指令与历史消息合并放入System Prompt,用户输入改为任务指令;2)在用户输入后追加指令要求。这两种方法通过重构上下文,打破对话惯性,引导模型聚焦任务而非闲聊。从技术层面分析,这利用了Attention机制的近因效应,并通过调整输入分布覆盖了预训练、微调和RLHF阶段的不同偏好。实验证明改进方法能有效提升指令遵循率,尤其在
2026-04-30 16:48:47
375
原创 PYTHONPATH
Python 通过sys.path决定去哪些目录里查找模块与当前工作目录相关,而与脚本路径无关如果你的包不在sys.path里的任何一个路径下面 →本质就是“把某个目录临时塞进sys.path”,让解释器能看到你的项目根目录通过项目根目录找到子目录(包),比如,因此成功则是通过.pth/ PEP 660 Editable 机制,把项目根目录“注册”进当前 Python 环境这两种方式本质相同:都是“让解释器知道你的源码目录在哪”,只是一个是临时、一个是长期、工程化。
2025-11-19 14:55:39
854
原创 第2章 数值与字符串-Python工匠:案例、技巧与工程实践
类别工程实践建议精确计算使用Decimal替代浮点数条件统计边界值处理使用可读性保留表达式,不写魔法数字字符串格式化优先f-string文件 I/O指定encoding,区分 str/bytes文本处理善用r*()方法SQL 与模板使用 ORM / 模板引擎而非字符串拼接工具掌握dis与timeit进行验证。
2025-10-15 11:35:51
789
原创 第1章 变量与注释-Python工匠:案例、技巧与工程实践
解包赋值 (unpacking)比index✅ 直观、少错误❌ 不要忘记:左边变量数要和右边结构对应。🔧 开发场景:解析结构化数据(如 API 响应 / CSV 行)时,比手动切片更安全、可读性更强。“定义要靠近使用。# ❌ 坏习惯:统一放最上面...# ✅ 好习惯:逻辑块内初始化# 初始化 waypoints 数据...# 处理 photo_markers...📍 实践经验:在长函数中靠近使用点定义变量,可以显著提升可读性和减少上下滚动。主题在工程实践中的作用命名规范。
2025-10-14 20:51:42
730
原创 async实战
什么是迭代器(Iterator)是一个实现了__iter__()方法和__next__()方法的对象。__iter__()方法返回迭代器自身(self),使迭代器也可被迭代。__next__()方法返回下一个元素,当没有元素时触发异常。什么是可迭代对象(Iterable)是一个实现了__iter__()方法的对象,且该方法返回一个迭代器(Iterator)。常见的可迭代对象有列表、字符串、字典等,它们自身不是迭代器,但通过__iter__()可以生成迭代器。可迭代对象 → 能提供迭代器的对象(通过。
2025-08-24 22:41:47
589
原创 python的raw string与编码
你不是用“两个反斜杠替换%”,而是代码里用"\\"来表示一个反斜杠。最终是把替换为,让Python能识别Unicode转义。
2025-07-18 11:20:37
1041
原创 python的执行顺序
ifname== “mainPython解释器自上而下逐行执行所有顶层语句。def和class只是创建对象并绑定名字,def体不会执行,class体会执行(如顶层print等)。import语句会立即导入模块,首次导入会执行模块顶层代码。类中方法/变量/魔术方法的定义过程就是函数对象绑定到类命名空间,不会被执行,只有实例化或调用时才会自动触发。**ifname== “main”**常用于脚本入口保护。下面我将结合前述讲解和你的新问题什么是类命名空间?
2025-06-26 17:27:41
1443
原创 函数的默认参数值是可变对象的注意点
在 Python 中,函数的默认参数值在函数定义时计算并绑定到函数对象,而不是每次调用函数时重新计算。这是 Python 设计的一部分,旨在提高效率,但对于可变对象(如列表、字典等)可能会导致一些意想不到的行为。函数对象:默认参数的存储:为什么只计算一次:比如结果缓存/记忆:可变对象的问题:如果默认参数是一个可变对象,比如列表或字典,那么所有调用该函数的实例都会共享同一个对象。这意味着如果你在函数中修改了这个默认参数的值,那么这些修改会在后续的函数调用中保留。示例正确使用方法为了避免
2025-06-24 14:31:02
833
原创 用mac的ollama访问模型,为什么会出现模型胡乱输出,然后过一会儿再访问,就又变成正常的
大模型推理是一个链式计算过程,任何环节数据损坏(如参数未加载、激活丢失、推理中断),都会让后续输出出现问题。内存/CPU资源不足,导致关键数据丢失、损坏;底层框架忍受了这种错误,导致“看似正常、实则混乱”的输出。这些问题不会必然崩溃,因为模型和框架都具有一定的容错机制,但输出的质量会大幅下降。
2025-06-18 17:11:01
670
原创 CHAPTER 19 Concurrency Models in Python
本节将深入探讨如何使用 Python 的threading模块实现一个简单的终端动画 Spinner。该程序在执行耗时操作时,通过在终端显示旋转动画来提示用户程序正在运行,而不是卡死。char } {char } {char } {breakprint(f'\rchar } {return 42', done))char } {')done.set()char } {char } {线程与 GIL。
2025-06-17 22:06:21
812
原创 python debug 监控双下划线的变量显示没有此变量
用单下划线来表示“内部使用”的属性和方法,但不是真正的私有。用双下划线在需要避免子类命名冲突时提供额外的保护。选择使用哪种下划线取决于你的需求和代码设计的复杂性。self.__state = "inactive" # 私有属性,避免子类覆盖def __render(self): # 私有方法,避免子类覆盖self . __state = "inactive" # 私有属性,避免子类覆盖 def __render(self) : # 私有方法,避免子类覆盖 print(f"Rendering {
2025-06-17 17:18:15
540
原创 Build a Large Language Model (From Scratch)-appendix A-Introduction to PyTorch
本附录旨在为您提供将深度学习应用于实践并从头开始实现大型语言模型(LLM)所需的技能和知识。PyTorch 是一个流行的基于 Python 的深度学习库,它将是本书使用的主要工具。我将指导您设置一个配备 PyTorch 和 GPU 支持的深度学习工作环境。然后,你将学习张量的基本概念及其在 PyTorch 中的应用。我们还将深入探讨 PyTorch 的自动微分引擎,该功能使我们能够便捷、高效地使用反向传播,而反向传播是神经网络训练的关键环节。本附录旨在为刚接触PyTorch深度学习的读者提供入门指南。尽管它
2025-06-16 11:46:48
1169
原创 处理两种不同json文件的python代码
在处理 JSON 文件时,文件的结构决定了如何解析它。这种格式实际上不是标准的 JSON 格式,因为一个 JSON 文件通常只能包含一个 JSON 值。因此,文件中多个独立的 JSON 对象需要逐行读取和解析。这种格式是标准的 JSON 格式,其中一个 JSON 数组包含多个对象,可以直接使用json.load方法解析。
2025-06-11 16:37:29
418
原创 Build a Large Language Model (From Scratch) 第二章 Working with text data
你将学习如何为训练大型语言模型(LLMs)准备输入文本。这包括将文本拆分为单个单词和子词标记,然后将这些标记编码为适合LLM的向量表示。你还将了解高级标记化方案,如字节对编码(BPE)——这是GPT等流行LLM中使用的技术。最后,我们将实现一种采样和数据加载策略,以生成训练LLM所需的输入-输出对。
2025-06-10 00:36:00
1458
原创 Build a Large Language Model (From Scratch) 第一章 Understanding large language models
自监督学习过程简图│ 原始文本数据(没有标签) │↓构造预测任务(如遮盖词、预测下一个词)↓输入序列 → 目标词(伪标签)↓模型预测 + 损失函数↓反向传播更新参数(学习)大型语言模型(LLMs)已经彻底改变了自然语言处理领域——该领域此前主要依赖显式的基于规则的系统和较为简单的统计方法。大型语言模型的出现引入了全新的深度学习驱动方法,推动了人类语言理解、生成和翻译等领域的进步。
2025-06-07 16:07:55
1157
原创 Build a Large Language Model (From Scratch) 序章
从零构建大型语言模型》旨在。全书首先聚焦于文本数据处理的基础知识和注意力机制的编码,随后指导读者逐步实现一个完整的GPT模型。书中还涵盖了预训练机制以及针对文本分类和指令遵循等特定任务的微调方法。通过阅读本书,读者将深入理解LLM的工作原理,并掌握构建自有模型的技能。尽管书中创建的模型规模小于大型基础模型,但它们使用相同的核心概念,是掌握构建尖端LLM所需核心机制和技术的有力教学工具。
2025-06-04 00:58:27
887
原创 minhash-大模型输入前的去重
本文介绍了使用MinHash和局部敏感哈希(LSH)进行文本去重的方法。首先将文档切分为n-gram单元,然后为每个n-gram生成多个哈希值以提高相似性估计的准确性。接着通过取最小值得到文档的MinHash签名,再使用LSH将签名分条带处理,将相同条带值的文档聚到同一桶中备选。这种方法能有效识别相似文档,在大批量文本处理中显著减少计算量,平衡了计算效率和相似性检测的需求。MinHash通过多哈希值提高了鲁棒性,而LSH的分条带策略则灵活控制了相似性阈值。
2025-05-27 17:26:33
1355
原创 CHAPTER 17 Iterators, Generators, and Classic Coroutines
迭代是数据处理的基础:程序对数据序列进行计算,这些数据序列涵盖从像素到核苷酸等各种类型。如果数据无法全部存入内存,我们就需要按需惰性获取数据——一次获取一个数据项。这正是迭代器的作用。本章将展示迭代器设计模式是如何内置于Python语言中的,这样你就无需手动编写相关代码。Python中的每个标准集合都是可迭代的。for循环列表、字典和集合推导式解包赋值集合实例的创建Python如何使用内置的iter()函数处理可迭代对象如何在Python中实现经典的迭代器模式。
2025-05-07 14:28:03
866
原创 CHAPTER 12 Special Methods for Sequences
通过这一版Vector支持任意维度的向量;通过定制化的特殊方法(如__repr____str____eq__等),丰富了类的功能;提供了高效的计算方式(如基于math.hypot的模长计算)。这种设计方式非常贴合 Python 的数据类型设计哲学(例如list或tuple),同时通过模块化和类方法便捷地实现了序列化操作,值得在工程中深刻实践和学习。在面向对象编程的上下文中,协议是一种非正式接口,它通过文档定义了对象必须遵守的规则,但在代码中这种规则是非强制的(不像 Java 的接口。
2025-05-01 10:58:05
763
原创 python 执行顺序
MRO (方法解析顺序) 是 Python 用来在多继承情况下决定方法查找顺序的规则。它定义了解决方法或属性时的搜索顺序——即在类继承关系中先搜索哪个类的定义。你可以通过 或 查看类的 MRO。分析:输出:当调用 时,Python 按照 MRO 顺序查找方法:首先在类 中查找,但类 没有定义 方法。接着查找 类,发现 定义了 方法,于是执行 的 ,输出:更复杂的继承关系让我们看一个更加复杂的多继承例子。分析:当调用 时,Python 遵循 MRO:先
2025-04-21 20:42:38
1085
原创 CHAPTER 11 A Pythonic Object
对于一个库或框架而言,符合Python风格意味着让Python程序员能够尽可能轻松自然地掌握如何完成一项任务。—— 马丁·法森(Martijn Faassen),Python和JavaScript框架的创造者。得益于Python数据模型,你自定义的类型可以表现得和内置类型一样自然。你只需实现让对象按预期行为表现所需的方法即可。在前面的章节中,我们研究了许多内置对象的行为。现在,**我们将构建表现得像真正Python对象的用户自定义类。
2025-04-21 16:19:32
506
原创 langchain tools源码解析以及扩展
a: intb: int# 支持字段校验 或 复杂嵌套"""加法定制"""方面自定义 ToolExecutor.register_tool装饰对象Python函数工具类(通常继承BaseModel)内部逻辑封装:函数、元信息、参数schema → Tool对象需显式传给Agent注册:类进全局map,参数结构自动提取调用入口由Agent调度由ToolExecutor.execute_tool统一入口调度注册方式没有全局注册(只生成对象实例)有全局注册(map写入)
2025-04-18 11:10:52
1359
原创 CHAPTER 8 Type Hints in Functions
Python 是一种动态类型语言,这意味着变量类型在运行时才能确定,而不是像某些静态类型语言(如 Java、C++)那样在编译时就需要定义类型。渐进式类型系统是一种用来平衡动态类型和静态类型的方式,允许我们在 Python 中逐步引入类型提示,如有必要,也可以完全不使用类型提示。渐进式类型系统是 Python 的一大特色,带来了类型安全性和开发效率之间的平衡。类型提示可选,无需重构已有代码。可以辅助静态工具发现潜在错误。类型注解不会影响 Python 的运行时行为,也不会提升性能。
2025-03-24 11:43:47
1230
原创 CHAPTER 10 Design Patterns with First-Class Functions
策略模式是一种行为设计模式,用于定义一组算法,将每个算法封装起来,使它们可以互换使用,同时使使用这些算法的客户端独立于算法的实现。定义(Design Patterns 书中定义)“定义一组算法,将每个算法封装起来,并使它们可以互换使用。策略模式允许算法独立于使用它的客户而变化。在本例中,策略模式用于在电子商务系统中计算折扣,具体折扣逻辑取决于不同的促销策略。这些数据类用于表示客户、订单项和订单的基本信息。name: str# 上下文类:管理订单数据和执行折扣运算逻辑"""计算订单总金额"""
2025-03-24 11:42:10
818
原创 CHAPTER 9 Decorators and Closures
装饰器本质上是一个可调用对象(通常是函数),它接受另一个函数作为参数,并可能会对这个函数进行处理(添加功能、修改行为等),然后返回一个新的函数或可调用对象。换句话说,装饰器可以用来包装另一个函数,从而在调用这个被包装的函数时实现新的功能。举个例子,我们定义了一个装饰器decorateprint(f'hexid')@registerdef f1():@registerdef f2():在函数定义时(导入时间)立即执行装饰器代码。常用于动态注册、函数增强或替换。
2025-03-20 11:07:23
1051
原创 CHAPTER 7 Functions as First-Class Objects
开启了新一篇章,之前的章节1-6都在讲数据结构,从这一新篇章开始,讲的是函数即对象。因为本文会碰到map等用到迭代器的方法,所以在此之前我们先将这个介绍清楚。好的,我们现在进一步深入,将迭代器与 计算机系统中的内存分配和使用 联系起来,通过图解的形式描述内存是如何被迭代器利用的,并解释为什么它能保持高效。在计算机中,内存的使用分为以下几个主要部分:迭代器的特点:迭代器不一次性把所有数据加载到 堆 或 栈 中,而是动态生成数据,仅使用栈或少量堆空间来存储计算上下文(比如当前索引、已生成的位置)。代码:内存
2025-03-10 16:46:24
1066
原创 CHAPTER 6 Object References, Mutability, and Recycling
共享引用的影响l1[1]和l2[1]同时指向内层列表。因此,对内层列表的修改会互相影响。等价于,直接修改了列表,使l1[1]同样变化。不可变对象的行为创建了一个新的元组并重新绑定到l2[2]。l1[2]保持原始元组(7, 8, 9),两者不再共享。浅拷贝bus2是bus1的浅拷贝,二者共享passengers列表的引用。修改bus1的passengers会影响bus2。深拷贝bus3是bus1的深拷贝,二者拥有独立的passengers列表。修改不影响。del。
2025-03-05 22:00:54
965
原创 CHAPTER 5 Data Class Builders
namedtuple特性普通元组namedtupledataclass内存效率高高较低字段访问方式按索引按名或索引按名可变性不可变不可变默认可变默认值支持不支持支持支持适合使用场景无需字段名的简易结构轻量的、不可变的数据对象结构更灵活、复杂的数据模型在 Python 中,NamedTuple是一种结合了元组的不可变特性和类的可读性的新型构造器。它允许我们定义类似类的结构体,同时支持通过名称访问字段的值。随着 Python 类型注解的引入,
2025-03-05 22:00:00
1108
原创 第4章 Unicode 文本和字节序列
在计算机中,字符需要一种数字方式来表示,这就是代码点的作用。可以把代码点理解为每个字符的身份证号。在Unicode标准中,这个身份证号是一个十六进制的数字,并以“U+”开头。举几个例子:字母“A”:代码点是U+0041。这里的“0041”是一个十六进制数字,转换成十进制就是65。这意味着在Unicode中,“A”这个字符的唯一标识就是U+0041。欧元符号“€”:代码点是U+20AC。十六进制的“20AC”转换成十进制是8364。
2025-02-25 21:46:18
1225
原创 网络安全前置知识-linux操作系统
虚拟机是由各种虚拟文件所构成的虚拟计算机,而这些虚拟文件都可以由文件系统进行管理。快照本身就是帮助用户记录当前虚拟机状态的方式,这个状态包含虚拟磁盘状态(相当于真实机中的硬盘)、机器内存状态、虚拟机配置信息。1、虚拟磁盘状态:数据、分区格式、文件内容等;
2024-05-02 20:00:45
1410
原创 MIT6S.081 如何切换lab分支
写第二个lab的时候发现代码对不上,后来知道是因为分枝不对。博客搜了几下,没找到想要的,就自己弄了,弄成后写下这篇博客来分享下。
2023-03-04 15:31:09
733
原创 Spring IOC概念与实现(注解方式)
1、使用 Spring 框架2、反射机制IoC 控制反转 Inverse of Control 创建对象的权限,Java 程序中需要用到的对象不再由程序员自己创建,而是交给 IoC 容器来创建。前置要求:强大的反射和注解基础,可以参考:https://blog.csdn.net/jsdoulaoula/article/details/125529609。
2022-09-04 11:30:33
497
原创 Ajax-老杜
写在前面,此文只能满足想知道ajax是如何一步步实现和框架下封装的是什么。想快速实现,直接去看VUE等框架如何实现即可。传统请求存在的问题页面全部刷新导致了用户的体验较差。传统的请求导致用户的体验有空白期。(用户的体验是不连贯的)四、XMLHttpRequest对象XMLHttpRequest对象是AJAX的核心对象,发送请求以及接收服务器数据的返回,全靠它了。XMLHttpRequest对象,现代浏览器都是支持的,都内置了该对象。直接用即可。创建XMLHttpRequest对象
2022-07-21 20:53:12
1268
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅