我的博客

简约 · 思考 · 记录

0. DDPM的优化目标

扩散模型的最终目标是学习一个从噪声生成真实数据的分布 pθ(x0)p_\theta(x_0)。最直接的方法是极大似然估计

maxθlogpθ(x0)\max_{\theta} \log p_{\theta}(x_0)

其中x0x_0表示训练图片,pθp_{\theta}为参数为θ\theta的模型生成图片x0x_0的概率。

DDPM 本质上是一个隐变量生成模型(与 VAE 同类)。它不直接对复杂的高维数据分布建模,而是引入一组隐变量 x1,,xTx_1, \ldots, x_T,通过一个 TT 步的反向马尔可夫链定义联合分布

pθ(x0:T)=p(xT)t=1Tpθ(xt1xt)p_\theta(x_{0:T}) = p(x_T) \prod_{t=1}^T p_\theta(x_{t-1} \mid x_t)

既然模型定义的是联合分布,数据分布 pθ(x0)p_\theta(x_0)x0x_0是观测数据)就必然是这个联合分布的边缘分布——通过对所有隐变量积分得到:

pθ(x0)=pθ(x0:T)dx1:T=pθ(x0,x1:T)dx1:Tp_\theta(x_0) = \int p_\theta(x_{0:T}) \, dx_{1:T} = \int p_\theta(x_0, x_{1:T}) \, dx_{1:T}

解释:

  • pθ(x0:T)p_\theta(x_{0:T}) 是扩散模型反向过程的联合分布,表示从纯噪声 xTx_T 逐步去噪生成数据 x0x_0 的概率。
  • 但我们只关心最终生成数据 x0x_0 的似然(边缘似然),因此需要对所有中间隐变量 x1,x2,,xTx_1, x_2, \dots, x_T(简记为 x1:Tx_{1:T})进行积分,将其"边缘化"掉。

使用的定理:

  • 概率边缘化公式(Law of Total Probability / Marginalization)。对于连续随机变量,联合分布对其中一部分变量积分即得剩余变量的边缘分布。

这不是人为“引入”的数学技巧,而是模型定义的自然结果。 扩散模型选择用隐变量链来建模复杂数据分布,将“一次性从噪声生成高维数据”这个不可能直接学习的任务,分解为 TT 步简单的去噪高斯转移。代价就是:我们必须处理这个边缘积分。

这个边缘积分遍历了所有可能的隐变量(加噪序列)x1,x2,,xTx_1, x_2, \dots, x_T,他面临三个根本障碍:

困难 说明
无法解析积分 反向过程 pθ(xt1xt)p_\theta(x_{t-1}|x_t) 是神经网络,没有闭式解
无法直接采样 pθ(x0:T)p_\theta(x_{0:T}) 采样需要先验知识,而反向过程正是我们要学习的
无法求梯度 积分号包裹着神经网络,无法直接对 θ\theta 求梯度优化

因此,必须引入数学工具,将"不可积分的极大似然"转化为"可计算、可采样、可求梯度"的目标。

阅读全文 »

1. 引言

视觉-语言预训练(Vision-Language Pre-training, VLP)旨在学习视觉与语言两种模态的统一表征,是多模态人工智能领域的核心研究方向。从2017年至2025年,VLP技术经历了三次深刻的范式变革:从依赖外部目标检测器的双流/单流融合架构,到基于Vision Transformer的端到端对比预训练,再到以大语言模型(LLM)为核心的多模态大模型时代。每一次范式的跃迁都带来了表征学习能力的质变,推动VLP模型从特定下游任务的微调适配,逐步走向通用化、多任务化与规模化。

MLLM_trend

目标检测器驱动的多模态融合时代(2017—2020)。

  • 早期VLP模型普遍依赖Faster R-CNN等预训练目标检测器提取图像区域特征,再将区域特征与文本表示输入Transformer进行跨模态融合。这一阶段的代表性工作聚焦于探索视觉-语言交互的架构设计:
  • ViLBERT提出双流共注意力Transformer架构,语言流与视觉流通过共注意力层实现深层交互;LXMERT进一步拓展为三编码器架构,引入独立的物体关系编码器与跨模态编码器,并设计了五种预训练任务以学习细粒度模态对齐;
  • UNITER则转向单流Transformer架构,以条件掩码策略与最优传输词-区域对齐(WRA)提升跨模态对齐精度;OSCAR另辟蹊径,利用对象标签作为语义锚点,通过三元组表示(词元、对象标签、区域特征)将视觉语义显式注入预训练过程。尽管这些模型在视觉问答、图文检索等任务上取得了显著进展,但其对外部检测器的依赖导致推理速度受限,且区域级特征难以捕捉图像的全局语义。

端到端多模态融合时代(2021—2022)。

  • 随着Vision Transformer(ViT)的提出,图像被统一表示为序列化的patch嵌入,为VLP的端到端训练奠定了基础。
  • CLIP开创性地采用双编码器对比预训练范式,在4亿图文对上学习对齐的视觉-语言表示,实现了强大的零样本分类能力。SigLIP及其后续版本SigLIP 2进一步优化对比学习目标,以Sigmoid损失解耦批次大小与任务定义的依赖,并通过统一训练配方(结合LocCa解码器、自蒸馏、掩码预测与ACID数据)将语言覆盖扩展至109种语言,同时支持可变分辨率处理。
  • 在架构层面,ViLT完全摒弃CNN和区域监督,首次实现纯Transformer的VLP;ALBEF提出"先对齐后融合"策略,配合动量蒸馏分离对齐层与融合层;VLMO设计多路Transformer(MOME),引入模态专属前馈网络专家实现参数高效的多模态学习;BLIP提出多模态编码器-解码器(MED)架构与CapFilt数据引导机制,有效提升数据质量与生成能力;
  • Flamingo开创冻结大语言模型结合门控交叉注意力层的少样本学习范式;CoCa以解耦解码器统一对比学习与生成式描述任务;BEiT-3通过Multiway Transformer实现掩码数据建模的统一框架。
  • 在规模化与多语言方向,PaLI系列(PaLI、PaLI-X、PaLI-3)系统探索了模型与数据的联合缩放,从17B参数的mT5+ViT-e架构到55B参数的ViT-22B+UL2-32B,再到5B参数的SigLIP对比预训练"小即是美"方案,逐步确立了多语言视觉-语言理解的标杆。

以LLM为核心的多模态大模型时代(2023—2025)。

  • 2023年起,VLP研究的重心转向如何将视觉能力高效接入预训练的大语言模型。BLIP-2提出Q-Former作为可学习的桥接模块,在两阶段训练中连接冻结的视觉编码器与冻结的LLM,开启了"冻结LLM + 可学习桥接"的新范式。
  • LLaVA则开创了视觉指令微调范式,通过简单的线性投影层将ViT特征映射至LLaMA/Vicuna的嵌入空间,引爆了开源多模态大语言模型(MLLM)的研究热潮。以Qwen-VL为代表的MLLM进入了快速迭代期间。
  • Qwen-VL系列展现了清晰的迭代脉络:Qwen-VL采用Q-Former风格适配器与三阶段训练;Qwen2-VL引入动态分辨率ViT、Patch Merger与M-RoPE位置编码;Qwen3-VL进一步升级为SigLIP2视觉编码器、DeepStack特征聚合与交错M-RoPE。
  • Llama系列从3.2 Vision的ViT-H/14+门控交叉注意力视觉适配器,演进至Llama 4的MoE架构(17B激活/400B总参数)与早期融合策略。
  • DeepSeek-VL系列同样呈现了快速迭代:DeepSeek-VL采用SigLIP-L+SAM-B混合视觉编码器与两层混合MLP适配器,通过模态平衡训练(70% VL + 30%文本)实现视觉-语言能力的协调;DeepSeek-VL2进一步引入动态分块视觉编码(SigLIP-SO400M)、MoE与MLA注意力机制,提供Tiny(3B)、Small(16B)、Base(27B)三规模版本。
  • PaliGemma系列则以轻量高效为特色:PaliGemma将SigLIP与Gemma-2B结合实现3B参数的高效模型;Gemma 3支持128K上下文窗口与Pan and Scan视觉处理;PaliGemma 2则升级为SigLIP2+Gemma 2架构,延续了PaLI系列的技术传统。

本报告系统梳理2017年至2025年间视觉-语言预训练领域的技术演进脉络,重点围绕上述三大范式转变展开:从依赖检测器的特征融合(ViLBERT、LXMERT、UNITER、OSCAR),到端到端的多模态融合(CLIP、BEiT、BLIP、PaLI系列等),再到以大语言模型为核心的多模态大模型时代(BLIP-2、LLaVA、Qwen-VL、DeepSeek-VL、PaliGemma系列等)。报告剖析各阶段代表性模型的架构设计、预训练策略与技术贡献,阐明模型间的技术承接关系与演进逻辑,为希望了解MLLM发展脉络的同学提供技术参考与范式洞察。

阅读全文 »

asyncio 是 Python 3.4+ 引入的标准库,用于编写并发代码。本文将带你快速入门 asyncio 的核心概念。

为什么要用异步?

在传统的同步编程中,当程序遇到 I/O 操作(如网络请求、文件读写)时,线程会阻塞等待。而异步编程允许我们在等待 I/O 时去执行其他任务,极大地提高了资源利用率。

核心概念

1. coroutine(协程)

使用 async def 定义的函数就是协程:

1
2
3
4
5
6
7
8
9
import asyncio

async def say_hello():
print("Hello")
await asyncio.sleep(1)
print("World")

# 运行协程
asyncio.run(say_hello())

2. await 关键字

await 用于等待一个可等待对象(协程、任务、Future)完成。注意:await 只能在 async def 函数中使用。

3. Task(任务)

任务用于并发调度协程:

1
2
3
4
5
6
7
8
async def main():
task1 = asyncio.create_task(fetch_data("url1"))
task2 = asyncio.create_task(fetch_data("url2"))

result1 = await task1
result2 = await task2

print(result1, result2)

4. gather 并发执行

1
2
3
4
5
6
7
async def main():
results = await asyncio.gather(
fetch_data("url1"),
fetch_data("url2"),
fetch_data("url3"),
)
print(results)

实战示例:并发爬虫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import asyncio
import aiohttp

async def fetch(session, url):
async with session.get(url) as response:
return await response.text()

async def main():
urls = [
"https://api.github.com",
"https://api.github.com/users/python",
"https://api.github.com/users/google",
]

async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks)

for url, result in zip(urls, results):
print(f"{url}: {len(result)} bytes")

asyncio.run(main())

注意事项

  1. 不要在协程中使用阻塞操作:如 time.sleep(),应使用 asyncio.sleep()
  2. 事件循环asyncio.run() 会自动管理事件循环,高级用法可手动控制
  3. 异常处理:使用 try/except 包裹 await 语句

总结

asyncio 让 Python 也能高效处理 I/O 密集型任务。虽然学习曲线略陡,但掌握后能够编写出高性能的并发程序。

推荐阅读 官方文档 深入学习。

十一月的京都,是红叶的季节。这座千年古都,在秋色的映衬下更显静谧与优雅。

行程概览

  • 时间:2023 年 11 月中旬
  • 天数:5 天 4 夜
  • 交通:关西机场进出,京都市内以公交和步行为主

必去景点

清水寺

清晨六点到达清水寺,避开了人潮。站在清水舞台上俯瞰京都,晨雾中的城市仿佛一幅水墨画。

清水寺

岚山

岚山的竹林小径虽然游客众多,但当你抬头仰望高耸入云的竹林时,依然会被那种静谧的力量所震撼。

琉璃光院

这里是京都赏枫的终极目的地。虽然需要提前预约,但当你坐在二楼的窗前,看着满院红叶倒映在漆黑桌面上时,一切都值得。

美食推荐

餐厅 类型 推荐菜品
菊乃井 怀石料理 秋季限定套餐
中村藤吉 抹茶甜品 抹茶帕菲
名代猪排 炸物 特选里肌猪排

旅行感悟

京都是一座适合慢下来的城市。不需要赶景点,在巷弄间随意走走,在寺庙的台阶上静坐片刻,在茶室里喝一杯抹茶,就是最好的旅行体验。

期待下一个季节的京都。

Hexo 是一个快速、简洁且高效的博客框架。本文将介绍如何使用 Hexo 搭建一个精美的个人博客。

为什么选择 Hexo?

  • 极速生成:基于 Node.js,数百篇文章可在数秒内生成
  • Markdown 支持:使用 Markdown 编写文章,专注内容本身
  • 主题丰富:拥有大量精美的开源主题
  • 一键部署:支持 GitHub Pages、Vercel 等多种平台

快速开始

1. 安装 Hexo

1
npm install -g hexo-cli

2. 初始化博客

1
2
3
hexo init myblog
cd myblog
npm install

3. 本地预览

1
hexo server

4. 新建文章

1
hexo new "我的文章标题"

目录结构

1
2
3
4
5
6
7
8
myblog/
├── _config.yml # 站点配置文件
├── package.json # 依赖包
├── scaffolds/ # 文章模板
├── source/ # 用户资源文件
│ ├── _posts/ # 博客文章
│ └── about/ # 自定义页面
└── themes/ # 主题文件夹

进阶配置

你可以通过修改 _config.yml 来自定义站点信息、主题、插件等。更多配置请参考 Hexo 官方文档

总结

Hexo 让搭建博客变得异常简单。只需几步,你就能拥有一个属于自己的博客空间,开始记录和分享。

简约设计(Minimalist Design)是一种追求极致简洁的设计风格。它不是简单地减少元素,而是提炼精华,让核心内容更加突出。

核心理念

“少即是多” —— 路德维希·密斯·凡德罗

简约设计的本质是通过去除多余的装饰,让用户能够专注于最重要的内容和功能。

四大原则

1. 留白(Whitespace)

留白不是空白,而是一种主动的设计元素。适当的留白可以:

  • 让页面呼吸,减轻视觉压力
  • 引导用户视线,突出重点内容
  • 营造高端、优雅的氛围

2. 色彩克制

简约设计通常采用有限的色彩:

类型 用途 示例
主色 品牌识别 #1565c0
辅助色 功能区分 #757575
背景色 页面基底 #ffffff
强调色 重点突出 #ff4081

3. 排版清晰

  • 选择 1-2 种字体家族
  • 建立清晰的字号层级
  • 保持足够的行高和字间距

4. 功能优先

每一个元素都应该有其存在的理由。问自己:

  • 这个元素是否帮助用户理解内容?
  • 去掉它会影响用户体验吗?
  • 是否有更简洁的表达方式?

实践建议

  1. 先加法,后减法:先列出所有需要的内容,再逐步精简
  2. 以内容为中心:设计服务于内容,而非相反
  3. 保持一致性:统一的设计语言能降低认知负担
  4. 注重细节:简约设计中,每一个细节都会被放大审视

结语

简约设计是一种态度,是对用户时间和注意力的尊重。当我们学会做减法,设计的力量反而会更加强大。

詹姆斯·克利尔的《原子习惯》是一本关于习惯养成的经典之作。书中提出了许多实用的方法论,帮助我们建立好习惯、戒除坏习惯。

核心观点

1% 的复利效应

每天进步 1%,一年后你会进步 37 倍;每天退步 1%,一年后你会几乎归零。

习惯是自我提高的复利。

习惯养成的四个定律

阶段 定律 方法
提示 让它显而易见 环境设计、习惯叠加
渴望 让它有吸引力 喜好绑定、群体归属
反应 让它简便易行 减少阻力、两分钟规则
奖励 让它令人愉悦 即时奖励、习惯追踪

我的实践

读完这本书后,我尝试了以下几个方法:

  1. 习惯叠加:在现有习惯后添加新习惯,比如"早晨泡咖啡后,冥想 5 分钟"
  2. 环境设计:把运动服放在床头,降低运动的启动成本
  3. 两分钟规则:任何习惯都可以在两分钟内开始,先建立动作,再优化时长

经典语录

  • “你不需要提升目标,你只需要降低标准。”
  • “身份转变是最强大的改变方式。不是我想戒烟,而是我不抽烟。”
  • “成功的最大威胁不是失败,而是无聊。”

总结

《原子习惯》给我的最大启发是:关注系统,而非目标。当你建立了正确的日常系统,想要的结果自然会随之而来。

强烈推荐给每一个想要自我提升的朋友阅读。

0%