浩天博客
博客
站内搜索
直接问 AI

博客

博客文章

这里收录浩天博客的主要技术文章,重点是机器学习、算法实现、深度学习数学、网络协议、AI 安全和电池建模。文章会尽量提供问题背景、实现解释、代码或实验输出,而不是只发布短摘要。

如果你是第一次访问,建议先按专题阅读:机器学习路线从数据和评估开始,算法路线从 8 皇后和 K-means 开始,网络路线从 DNS/TCP/TLS 到代理与缓存,AI 安全路线从威胁建模和 toy lab 开始。

当前重点路线

如何判断一篇文章是否值得读

本站会尽量避免只写“概念简介”或“工具清单”。一篇有价值的技术文章至少应该说明问题是什么、输入是什么、输出如何验证、关键代码在哪里,以及结论的适用边界。对于算法和机器学习内容,文章会优先保留中间状态、评估指标、错误样本或可下载材料;对于网络协议内容,文章会优先保留请求头、状态码、缓存状态、时间线和实验命令。

如果某篇文章只是入口、索引或工具说明,它应该明确指向更完整的主题页或正文文章,而不是假装自己已经解决了技术问题。这样的组织方式可以让首次访问者快速判断:这里是阅读路线、实验入口、下载资源,还是一篇完整教程。

内容类型与证据要求

内容类型 应该回答的问题 页面中应该保留的证据
机器学习实现 数据如何进入模型,指标为什么可信? 数据切分、基线、训练命令、错误样本、指标定义。
算法与 C/Python 代码 核心状态如何更新,边界条件在哪里? 输入格式、循环不变量、复杂度、输出示例和失败输入。
网络协议排查 问题发生在 DNS、TLS、代理、缓存还是应用层? 请求头、响应头、状态码、时间线、缓存命中和复现命令。
AI 安全实验 实验证明了什么,又没有证明什么? 授权边界、toy lab 条件、指标、缓解措施和误用限制。

近期维护方向

后续内容会继续围绕“可复现”和“可解释”补强。机器学习文章会增加数据切分、基线模型、错误分析和复现实验记录;网络文章会增加从浏览器、Cloudflare、Nginx 到应用层的分层排查案例;AI 安全文章会继续强调授权边界、toy lab 限制和防御性评审流程。

旧文章会根据实际复现结果继续修订:失效命令需要替换,依赖变化需要标明版本,只有结论的段落需要补上推导或运行证据。读者应该能够从正文判断一个结论来自公式、代码输出、协议响应还是受控实验。

全部文章索引

下面的索引按站点当前分类自动生成。工具页和问卷页不会作为核心文章显示,读者可以优先选择有完整正文、代码和实验说明的文章阅读。

分类博客

按项目阅读文章

文章按网络基础、电池建模、人工智能、2D 动画、算法实现和站点建设组织,每组都保留难度、阅读时间和技术栈。

专题系列

深度学习数学可视化系列

五篇文章从矩阵微积分、反向传播、优化器、卷积到 Attention,每篇都有手算、代码、图和动画。

5 篇文章

项目分类

网络基础原理

从 DNS、TCP、TLS 与 HTTP/3 到代理隧道、负载均衡和共享缓存,以可重现的代码和图分析网页请求路径。

14 篇文章

共享密钥容易,共享状态难:一套跨机单点登录的六个坑

把单机登录网关扩成覆盖多子域的 SSO,密钥同步很简单,难的是状态。这篇记录三台机器共用一套网关时踩到的问题:防重放为何变成站内有效跨站无效、密钥的第二份副本如何让 nginx 放行而应用回 401、部署脚本的白名单保留规则怎样静默关掉登录,以及为什么比对凭证不能比生成的口令。

阅读时间: 13 分钟
  • TOTP
  • HMAC
  • auth_request
  • nginx

「加了鉴权」不等于「受保护」:一次授权边界的自我审计

给自建文件管理器加上双因子网关之后,我问了自己一个问题:这个网关到底挡住了什么。答案是挡住了界面、没挡住文件——同一份字节有两条 URL 可达,而且验证时才发现网关根本不在请求路径上。这篇记录整个自查过程、补洞时踩的两个 nginx 坑,以及源站封掉之后边缘缓存仍然发了近一年。

阅读时间: 13 分钟
  • nginx
  • auth_request
  • TOTP
  • CDN

家宽入站到底通不通:一次从公网打回来的实测

本机扫端口全是开的,从外面根本连不上——这篇讲为什么本机探测必然错、对照端口为什么不可省,以及一次完整实测:公网 IPv4 不是 CGNAT、80 和 443 被运营商过滤而非未开、IPv6 有真实地址却入站全丢、AAAA 记录为什么不能用回显服务的结果。

阅读时间: 11 分钟
  • nc
  • CGNAT
  • hairpin NAT
  • IPv6
  • DNS-01

有证书不等于走 HTTPS:一次被误报为”缺证书”的排查

有人说某个子域名没有 SSL 证书。查下来证书好好的——一张通配符证书覆盖着它。但排查确实查出了问题,而且更严重:那个子域名的邮箱登录页可以通过明文 HTTP 访问,页面里有密码输入框,没有任何跳转。附两个把我带偏的坑:openssl 对所有目标同时失败时该怀疑工具,以及透明代理下 DNS 枚举完全失效。

阅读时间: 9 分钟
  • TLS
  • SNI
  • nginx
  • HSTS

项目分类

电池建模与 AI

围绕 PyBaMM、EIS、老化仿真、AI 标签数据与风险受控参数辨识,建立可复查的物理建模研究路线。

11 篇文章

PyBaMM 的容量衰减到底在量什么:80% capacity、Capacity [A.h] 与 Loss of capacity 实测

PyBaMM 里至少有几种不同的“容量”,退化研究常常不自觉地混用:80% capacity 终止条件比的是零电流 eSOH 容量而不是实测放电,汇总变量读的是每个循环最后一刻的状态,Loss of capacity to X 其实是锂而不是容量,默认参数集 Marquis2019 失锂后容量反而上升。PyBaMM 26.5 实测,附检查函数。

难度: 博士生 阅读时间: 25 分钟
  • PyBaMM
  • Capacity Fade
  • eSOH
  • LLI
  • OKane2022

PyBaMM SEI 与析锂实测:按时间老化的 SEI、占位速率常数、温度与孔隙堵塞

PyBaMM 里决定衰减曲线形状的选择都不会报错:OKane2022 的 SEI 只随时间增长,静置长短改变的是循环次数而不是寿终日期;SEI 速率常数是通用占位值,换模型差 450 倍;除 OKane2022 外活化能全为零;低温析锂堵孔在默认网格上高估 5 倍;irreversible 析锂在静置时也会沉积。PyBaMM 26.5 实测,附预检函数。

难度: 博士生 阅读时间: 27 分钟
  • PyBaMM
  • SEI
  • Lithium Plating
  • OKane2022
  • Arrhenius

PyBaMM 热模型实测:产热为零、缺失的熵热与从 25 °C 开始的低温仿真

PyBaMM 的热模型打开就能跑,下面这些设置都不会报错:等温模型的产热变量恒为零,四个参数集的熵系数为零、可逆热整项缺失,四个参数集把电池写成一张两面散热的极片,只设环境温度的低温仿真其实从 25 °C 开始。8 个参数集实测,附检查函数。

难度: 博士生 阅读时间: 16 分钟
  • PyBaMM
  • Thermal Model
  • Lumped
  • Entropic Heat
  • Chen2020

PyBaMM Experiment 跑完了却是错的:五个实测陷阱

PyBaMM 的 Experiment 几乎从不报错,下面五个问题都会让实验正常跑完、交回错误结果:安培写的步骤到 24 小时静默截断,平铺列表让循环寿命被高估 4 倍,save_at_cycles 留下 None,period 不影响精度却会让自己的积分出错,initial_soc=1 不等于 4.2V。附检查实验是否真正跑完的函数。

难度: 博士生 阅读时间: 9 分钟
  • PyBaMM
  • Experiment
  • save_at_cycles
  • initial_soc

PyBaMM 18 个内置参数集实测:四种静默出错的方式

把同一组实验在 PyBaMM 26.5 的 18 个内置参数集上全跑一遍。报错的不是问题,问题是能跑完却是错的:默认参数集的 "1C" 实际只有 0.78C,Chen2020 在 −10°C 下容量只掉 0.6%,实验字符串会把磷酸铁锂充到 4.2V 且零警告,SEI 能跑但用的是借来的示例参数。附一段可直接运行的检查代码。

难度: 博士生 阅读时间: 13 分钟
  • PyBaMM
  • Parameter Sets
  • Chen2020
  • OKane2022
  • Marquis2019

PyBaMM 参数拟合:为什么优化器给你的数字可能毫无意义

搜索排第一的 pybamm-param 已废弃、PyBOP 的 API 刚大改,而真正要命的是可辨识性:参数在方程里以组合出现,一条曲线分不开它们。附一套区分"拟合出来"与"编出来"的验证流程。

难度: 博士生 阅读时间: 8 分钟
  • PyBaMM
  • PyBOP
  • Parameter Fitting
  • Identifiability

项目分类

人工智能项目

从 AI、机器学习、训练评估、神经网络到 Python 小实战、手写数字识别、CIFAR-10 CNN、对抗性流量防御和 AI 安全攻防,按顺序建立基础。

28 篇文章

神经网络基础:从感知机到多层网络

从一个神经元讲起,解释权重、偏置、激活函数、前向传播、反向传播和典型神经网络训练循环。

难度: 进阶 阅读时间: 8 分钟
  • Neural Networks
  • Backpropagation
  • Python

从开发者角度理解大语言模型:文字接龙、token 与采样参数

LLM 的本质是在预测下一个 token,但「token」这个单位本身就是初学者误解最多的地方——它既不是字也不是词。这篇讲模型实际看到的输入是什么、为什么它数不清单词里有几个字母、上下文 8K 到底能装多少中文,以及温度和 top_p 各自在调整概率分布的哪一维。

难度: 入门 阅读时间: 8 分钟
  • AI
  • Machine Learning
  • Python
  • scikit-learn

多模态大模型架构:视觉特征如何对齐到语言空间

典型 MLLM 由视觉编码器、投影层和语言模型三部分构成。但选 MLP 还是 Q-Former,真正决定的不是表达能力而是 token 数量——576 与 32 的差距在预填充阶段会被平方放大 324 倍。这篇还讲了换高分辨率编码器时必须做的位置编码插值,以及视觉 token 借用一维位置编码带来的固有限制。

难度: 入门 阅读时间: 8 分钟
  • AI
  • Machine Learning
  • Python
  • scikit-learn

部署多模态大模型时的 KV Cache:先算对,再优化

KV Cache 显存随序列长度是线性增长,不是二次方;公式里要用的是 KV 头数而不是注意力头数,用错在 Llama-3-8B 上会高估 4 倍。算对之后会发现真正的瓶颈在预填充而不是解码——这直接决定了减少 token、量化缓存、分页管理这三件事的优先级顺序。

难度: 入门 阅读时间: 8 分钟
  • AI
  • Machine Learning
  • Python
  • scikit-learn

视觉指令微调的损失函数:掩码算错时,loss 曲线看起来是正常的

混合图文 token 时,损失只应该作用在助手回答的位置上。这篇讲掩码怎么构造,以及两种最常见的错法各自的特征:漏掉视觉 token 会让 loss 起点异常高并卡在一个平台;漏掉指令部分则 loss 曲线完全正常,但模型推理时会自问自答。

难度: 入门 阅读时间: 8 分钟
  • AI
  • Machine Learning
  • Python
  • scikit-learn

项目分类

2D 动画原理

从人物图片分层和 SVG 资产开始,继续学习骨骼矩阵、双骨骼 IK、蒙皮权重、接缝修复和关键帧插值。

11 篇文章

现代 2D 骨骼运行时:网格形变、绘制顺序与约束系统

线性混合蒙皮表达不了褶皱、绘制顺序和跟随延迟。说明网格形变为什么必须加在绑定空间、绘制顺序为什么是离散轨道,以及 Live2D 参数驱动形变的伪 3D 原理。

难度: 专业 阅读时间: 12 分钟
  • Spine
  • Live2D
  • Mesh Deformation
  • Constraints

次级运动:用阻尼弹簧让头发和尾巴跟上来

关键帧调好了动作还是显得硬,缺的是被主体带动、慢半拍跟上来的次级运动。这篇讲阻尼弹簧怎么用频率与阻尼比两个正交参数暴露给动画师,以及接进 2D 骨骼系统时的五个坑:显式欧拉为何无条件不稳定、帧率不同结果不同、骨骼链必须同帧从根到梢更新、该弹角度而不是位置、以及瞬移为什么会让弹簧爆炸。

难度: 实战 阅读时间: 13 分钟
  • 半隐式欧拉
  • 阻尼比
  • 骨骼链
  • 固定步长

挤压与拉伸:非均匀缩放为什么不能穿过旋转传下去

挤压拉伸接进骨骼系统之后,麻烦几乎全部来自一件事——非均匀缩放不能像旋转平移那样安全地沿层级传递。这篇讲二维的面积守恒与它不守恒的两样东西、缩放中心选错为什么让球陷进地板,以及核心的层级陷阱:父节点非均匀缩放乘以子节点旋转会产生切变,症状是只有转了角度的部件变成平行四边形。

难度: 实战 阅读时间: 12 分钟
  • 仿射变换
  • 切变
  • 缩放锚点
  • 拖影

项目分类

算法实现项目

围绕回溯、位运算和聚类实现,保留可以复查的代码、流程图和下载资料。

5 篇文章

轮廓追踪的终止条件:三行代码顺序错了,面积大二十倍

Moore 邻域追踪的 Jacob 终止准则要求位置和方向同时匹配。我把检查写在了方向更新之前,用的是上一轮遗留的方向,于是条件几乎永不成立,追踪器绕圈直到被点数上限强行截断——鞋带公式再把不闭合的首尾直接连起来,横穿整个区域。

难度: 进阶 阅读时间: 7 分钟
  • Moore 邻域
  • Jacob 准则
  • 鞋带公式

项目分类

站点建设项目

记录这个双语技术站的结构、内容同步、分类、评论和部署方式。

12 篇文章

给自己的站点量结构:一个错了八倍的指标

想量化"这些文章是不是长得太像了",第一次算出 92%,写进了结论;后来发现那个数字把主题模板算成了文章结构,修正后是 12%。这篇讲测量本身:怎么定义"形状"、边界画错在哪、为什么单一指标会掩盖真正的问题,以及推翻它的其实是一次意外的对照。

阅读时间: 10 分钟
  • curl
  • Python
  • 结构熵
  • WordPress

把整条图像处理链路放进浏览器:省下的不只是 CPU

一个上传角色图片、自动抠图分层、转成 SVG 资产库的工具,约束是不上传服务器。最初动机是单核源站扛不住服务端图像处理,做完发现真正省下的是存储、审核、隐私责任和并发这四样。含解码到矢量化的五步实现、IndexedDB 的代价、用 ZIP 存储模式替代压缩库,以及模型下载这唯一无法回避的成本。

难度: 进阶 阅读时间: 11 分钟
  • Canvas
  • IndexedDB
  • ONNX Runtime Web
  • ZIP

特色图片设好了,og:image 却是空的:Yoast 索引表的陈旧缓存

给 19 篇文章补上特色图片,后台显示正常,页面源码里却没有 og:image——而同一页的 JSON-LD 里 thumbnailUrl 已经指向新封面。这个"schema 有、og 没有"的组合就是诊断关键:两者走的是不同数据通路,一条实时算,一条读预计算的索引表。

阅读时间: 6 分钟
  • WordPress
  • Yoast
  • WP-CLI
  • Open Graph

8.3 GB 备份里只有 276 MB 是独有的:一次删除前的取证

服务器磁盘报到 86%,部署备份占 8280 MB。删除前先算清楚有多少是独有内容——答案是 276 MB,其余是同一批文件被复制了 228 遍。以及删除前那一步集合差集运算,救回了 7 个只存在于历史快照里的文件。

阅读时间: 9 分钟
  • rsync
  • tar
  • sha256
  • Cloudflare Tunnel

分数只定价,不判决:把人工审批换成工作量证明

把邮箱申请的人工审批换成 PoW + 本地 IP 评分。核心不在算法而在一条原则:没有任何信誉分会导致拒绝,它只决定你算多久的哈希。含手写 SHA-256 为什么必须拿分块边界向量对拍、难度为什么是体验参数而不是安全参数(23 bit = 24 秒,太长了),以及刻意不做外部信誉 API、不做国家加权的理由。

难度: 说明 阅读时间: 4 分钟
  • WordPress
  • Cloudflare
  • Content Workflow

两张不同的显卡,报同一个名字

在 WSL2 上给双显卡机器搭 JAX 环境,坑几乎都是同一类:你观测到的东西不等于实际的东西。device_kind 对两张不同的卡报同一个型号,按名字路由会把 16GB 的 batch 扔到 8GB 的卡上。还有装得上但没用的 CPU 版 jaxlib、被静默杀掉且不留 journal 的后台进程、把大卡饿死的最佳适配策略,以及跨 WSL 边界必然死锁的 stdin 管道。

难度: 说明 阅读时间: 4 分钟
  • WordPress
  • Cloudflare
  • Content Workflow

回环网络不可能丢包,但它重传了 62 次

一台网关高峰期卡死、重启就好、重启后什么都查不到。唯一的入口是一个物理上不该存在的观测:回环上出现了 62 次重传,且全部集中在 LAST_ACK 和 CLOSE_WAIT。顺着它查到一条防火墙规则保护错了地址,丢光了两个本地进程之间的拆连信号。含完整故障链、一个会让你追错方向的岔路,以及 nftables 链优先级导致 ct 条件静默失效的对拍验证。

难度: 说明 阅读时间: 4 分钟
  • WordPress
  • Cloudflare
  • Content Workflow

八个不报错的失败:拟合器安静地返回了初始猜测

写阻抗谱等效电路拟合器撞到的八个问题,没有一个抛异常。最贵的那个是 LM 步长少了一个负号,于是每步都往上坡走、全部被拒、函数把初始猜测原样返回——界面上看起来完全像一次成功的拟合。还有沿平坦山谷跑到 1e154 的参数、把正常收敛判成失败的守卫,以及换个权重就差 250 倍的系统偏差。

难度: 说明 阅读时间: 4 分钟
  • WordPress
  • Cloudflare
  • Content Workflow

同一个排名下,工具页的点击是文章页的 6.4 倍

三个月 12491 次展现只换来 53 次点击。把 Search Console 数据按位次分桶、逐个排除标题截断和移动端压制之后,剩下一个统计显著的分裂:位次 1-10 区间,工具页 CTR 4.76%,文章页 0.74%,p=0.0012。这篇是完整的排查过程,包括一个把"没人做过"当成"有人需要"的失败尝试。

难度: 说明 阅读时间: 4 分钟
  • WordPress
  • Cloudflare
  • Content Workflow

「只读」是结构问题,不是纪律问题:自建邮箱接 AI 的十个坑

把自建邮箱接给 AI 助手,协议部分不难,难的是让「只读」成为结构而不是承诺。这篇记录接入过程中踩到的问题:拒稿信里的 has been accepted 如何让分类器判反、语法检查通过而鉴权整个失效、单用户改多用户时共享闩锁怎样连坐所有人,以及为什么合成点击测不出一个死按钮。

难度: 说明 阅读时间: 4 分钟
  • WordPress
  • Cloudflare
  • Content Workflow
向下探索