You are the cloud, the sea, oblivion. You are also each self you have lost.
— Jorge Luis Borges, Clouds
You are the cloud, the sea, oblivion. You are also each self you have lost.
— Jorge Luis Borges, Clouds
上一篇笔记建立了 Transformer 的直觉和代码实现,这篇深入每个组件背后的数学原理。每个主题都标注了出处论文或博客,方便查阅原文。 一、Scaled Dot-Product:为什么除以 √dk? 出处:Vaswani et al. (2017) “Attention Is All You Need”, Section 3.2.1 上一篇笔记里我们知道 Attention 的计算公式是: $$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V$$其中: $Q$:Query 矩阵 $K$:Key 矩阵 $V$:Value 矩阵 $d_k$:Key 向量的维度 $\text{softmax}$:归一化函数(将分数转为概率分布) 但为什么要除以 $\sqrt{d_k}$?Vaswani et al. 在论文中给出了一句关键解释:“We suspect that for large values of $d_k$, the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients.” 下面把这句话拆成严格的数学推导。 1.1 方差推导 假设 $q$ 和 $k$ 的每个分量都是独立同分布的随机变量,均值为 0,方差为 1。点积 $q^T k = \sum_{i=1}^{d_k} q_i k_i$。 ...
经过CoOp的阅读,我们了解到了在单机上如何通过机器自己优化“soft prompt”来提高图像的识别,而promptFL则是在此基础上更进一步,将CoOp展现的强大迁移能力应用至联邦学习领域。 优势 成本:在传统联邦学习中,我们需要将大量的数据参数上传至服务器,而promptFL只需要上传提示词参数,在实验对比中,promptFL取得了惊人的成果: 指标 PromptFL Finetuning FL 差距 每轮上传量 6.3 MB 693 MB 110倍 可训练参数 0.01%~0.1% 100% 训练数据需求 202 张 50500 张 250倍 GPU 训练时间 2444s 7189s ~3倍 Non-IID 下不崩:Table 2 的 Extreme Non-IID 列非常关键:Finetuning FL 在 Non-IID 下准确率从 90% 暴跌到 29%,而 PromptFL 从 90% 只掉到 88%。因为 CLIP 冻结不动,prompt 只是轻微调整方向,不容易被某个客户端的偏置数据带偏。 Few-shot 有效: 每个客户端只需 2~16 张图就能训练,符合联邦场景下各设备数据量小的现实。 局限 局限一:所有客户端共享同一个 Global Prompt。 不区分客户端的域差异。比如客户端 A 拍的是白天户外的猫,客户端 B 拍的是夜间室内的猫,它们需要的"最佳开场白"显然不同,但 PromptFL 强制所有人用同一个。 局限二:没有考虑 Domain Generalization。 PromptFL 只在训练过的域上评估,没有测试"在完全没见过的新域上表现如何"。 ...
一、为什么要学 Transformer? Transformer 是当前深度学习的基础架构。NLP 领域的 BERT、GPT 系列,计算机视觉的 ViT,多模态模型 CLIP、Stable Diffusion——底层全是 Transformer。不理解 Transformer,后续读任何相关论文都会卡在架构细节上。 学完本笔记后,应该能回答:Q/K/V 怎么算?Multi-Head 为什么有用?Positional Encoding 干什么的?Encoder 和 Decoder 有什么区别? 二、Self-Attention(自注意力机制) 2.1 核心问题:如何处理变长序列? 输入可能是一句话(5个词)、一段语音(200帧)、一张图(196个patch),长度不固定。传统 FC 层要求固定输入维度,无法处理这种情况。 生活类比:你在教室里坐着,老师点名提问。FC 层相当于老师只看你一个人;Self-Attention 相当于老师让全班每个人都互相看一眼,综合所有人的信息后再做判断。 2.2 Self-Attention 的计算流程 假设输入序列有 T 个 token,每个 token 是一个 d 维向量: 输入:X = [x₁, x₂, ..., xT],shape = [T, d] 第1步:生成 Q, K, V(三个"角色") Q = X @ Wq # Query: "我在找什么?" shape = [T, dk] K = X @ Wk # Key: "我能提供什么?" shape = [T, dk] V = X @ Wv # Value: "我的实际内容" shape = [T, dv] 第2步:算 Attention Score(谁和谁最相关?) Score = Q @ K^T # shape = [T, T],每对 token 之间的相关性 Score = Score / √dk # 缩放,防止数值过大导致 softmax 梯度消失 第3步:Softmax 归一化 Attention = softmax(Score, dim=-1) # 每行和为1,变成概率分布 第4步:加权求和 Output = Attention @ V # shape = [T, dv] 生活类比: ...
确定方向后第一篇论文精读笔记,随看随做。 第一遍 Abstract 在图像识别领域,传统做法是用视觉模型提取图像特征,然后匹配一组随机初始化的固定权重向量(每个类别一个向量),这些权重就代表视觉概念。而这就存在一个缺陷:这些向量只是数字,没有语义信息,如“狗”、“猫”、“飞机”在模型眼中只是01、02、03,而无法意识到狗和猫比狗和飞机在语义上更接近。 这就引出了作者的一个发现:像 CLIP 这样的大型预训练视觉-语言模型在学习可跨越广泛下游任务迁移的表示方面展现了巨大潜力。每个类别不再是数字编号,而是一段自然语言描述(“a photo of a dog”)。模型学到的是图像和文本在共享语义空间里的对齐关系。 CoOp 论文想表达的核心对比:正因为 CLIP 用了语言监督而非离散标签,它学到的表征空间天然更 transferable(可迁移)。但要用好这个能力,你得写对 prompt——这就引出了 CoOp 的研究动机:让机器自己学 prompt,别靠人手写。 Introduction 传统视觉模型无法较好泛化,模型将“一只猫”,“一只狗”替换为编号,很大程度上丢失了文本语义信息,使其无法处理新类别,因为学习新分类器需要额外的数据。 最近,视觉-语言预训练成为有前景的一个方向,但提示词工程要求极其玄学的输入,一个词语的增删都会对结果造成显著影响。实验人员需要广泛的测试提示词,造成效率极其低下。 所以,作者从提示学习(NLP)中找到灵感,提出一种简单方法:上下文优化(context optimization,简称CoOp) conclusion 大致意思就是这个实验方向很新,效果很不错,还有很多地方可以细化展开,我们的文章主要做为一个引入。 第二遍阅读 CLIP是本文绕不开的一个话题。CLIP是openAI发布的开源模型,关联了图像和文字。我主要介绍两个概念: 特征空间:对于计算机来说,它是无法真正识别图像和文字的,我们需要将他们转换成一串数字(向量)。特征空间就是一个 512 维的数学坐标系,图像和文字都会被转换成这512维的向量,如果一张图片和一串文字在这个坐标系里算出来的距离很近(点积很大),那就说明他们成功匹配了。有趣的是,人类并不知道这512维每一个维度代表什么,这些都是模型在训练中自己决定的。 编码器(Encoder): 图像编码器:输入一张图片,输出一串512维的向量。 文字编码器:输入一句话,输出一串512维的向量。 在CLIP出来之前,CV和NLP之间有巨大的鸿沟。openAI通过4亿对图片与文字进行对比学习,最后训练出CLIP,完美对齐了视觉和语义。 具体实验流程不放了,下面进入复现 复现代码 第一次尝试复现代码,流程实在是繁琐。首先下载代码后需要进行环境配置,环境配置好后,需要下载数据集。数据集需要放入指定文件夹,然后在脚本中修改路径。这两步用copilot可以快速完成。 太tm难复现了这代码,到此为止。。。(3.12记)
全局视角:三篇"地基"论文 论文 定位 PromptFL(2023) 方向一的起点 Baseline,“联邦 Prompt 学习的 FedAvg” FedSR(NeurIPS 2022) 通用 FedDG Baseline,三个方向都必须比较的对象 SHOT(ICML 2020) 方向三的历史根源,Source-Free DA 的奠基之作 这三篇是"祖师爷"级别——必须理解,但后续工作要站在它们肩膀上,不是复现它们。 方向一:CLIP / LLM + 联邦提示微调 入门论文 CoOp — Prompt Learning for Vision-Language Models 会议:IJCV 2022(原版 ICCV 2021) 关键词:Soft Prompt, CLIP, Context Optimization 读这篇是因为 PromptFL 本质上就是"把 CoOp 塞进联邦框架",不懂 CoOp 就没法理解 PromptFL。 CLIP 用"a photo of a [CLASS]“这样的手工文本做零样本分类,但手工模板很依赖玄学——换一句话描述,准确率可能差 10%。CoOp 的解决方案很直接:别手写模板,让模型自己学出来。 Soft Prompt 的核心机制 手工 Prompt(Hard Prompt): 输入 → "a photo of a [cat]" → CLIP 文本编码 → 分类 Soft Prompt(CoOp 的做法): 输入 → [v1][v2][v3][v4][cat] → CLIP 文本编码 → 分类 ↑ 这 4 个 [v] 不是文字,是可学习的浮点向量 训练时只更新这 4 个向量,CLIP 的其余参数全部冻结 Soft Prompt 就是在类别词前面拼几个可学习的浮点向量,训练时只更新这几个向量,CLIP 其余参数全部冻结。 ...
前言 经过基础知识的学习,我需要将视角放到更宏大的范围来寻找科研方向,了解整体风向,因此本篇笔记记录一些我摘录的当前学科架构的情况和我对于后续科研方向的一些探索。 人工智能领域结构 在了解到联邦域泛化(FedDG)后,我回顾了之前的学习历程,发现我对于人工智能领域的全景缺乏理解,所以我让Claude帮我进行快速回顾: 1 2 3 4 5 6 7 8 9 10 11 12 13 人工智能 (Artificial Intelligence) ├── 机器学习 (Machine Learning) │ ├── 监督学习 (Supervised Learning) │ ├── 无监督学习 (Unsupervised Learning) │ ├── 强化学习 (Reinforcement Learning) │ └── 深度学习 (Deep Learning) ← 当前主流 │ ├── CV(计算机视觉) │ ├── NLP(自然语言处理)← LLM 在这 │ ├── 多模态 (Multimodal) ← CLIP 在这 │ └── 图神经网络 (GNN) ├── 知识表示 & 推理 (符号主义,老派) ├── 搜索与规划 └── 专家系统(已衰落) 而在所有的方向中,强化学习和深度学习无疑是最热门的方向,这里列出它们的内部结构: ...
本文为我入门域适应的一些随手记,按照时间顺序进行排序,包含了一些思考和反馈。 摘录我阅读的文章原文部分使用斜体,关于思考总结的部分使用正常字体。 第一次阅读 阅读材料:迁移学习入门之一:域适应的背景,理论与方法 在机器学习中,Domain Shift是一个很常见的问题,即在训练数据与真实场景来自于不同的分布。 如在医学深度学习模型中,用A医院的数据(Source Domain)训练的模型往往在B医院(Target Domain)预测不准。在摄像头行人重识别(Re-ID)问题中,多个摄像头捕捉的场景分布完全不一致,导致单个行人在多个摄像头中的"重识别"变得较为困难。在联邦学习中,不同客户的数据分布不一致(non-iid)也是最常见的全局模型训练问题。 而domain adaptation即是对于domain shift的一种解决方案。与其他流派(如迁移学习和微调)不同的点在于,domain adaptation保留了在source domain上的高精度, 并通过一些方法缩小表示空间(将数据从原始输入形式“如图像、文本”转换后得到的特征向量所在的抽象空间,在当前语境下,它是源域与目标域数据通过特征提取层映射后的空间)上Source与target模型特征的距离。 在了解大方向后,文章给出了一些数学推导,我感觉有点难以理解,这里先记录一些定义和简单的公式: 文章定义一个domain由两个部分组成:$D,f$ $D$(分布函数):可以理解为“画风“或数据长什么样。比如源域$D_S$是高清图,目标域$D_T$是高斯模糊图。 $f$(标签函数):是数据的标签,如在二分类问题中输入一张图$x$,它到底是猫还是狗(0或1)。 在 Domain Adaptation 中,我们通常假设物体的本质不变,只是画风变了。 也就是说,一张猫的图片,无论变多模糊,它依然是猫。也就是: $f_S \approx f_T$, 但是 $D_s \neq D_T$ 什么是误差? 公式 : $$ \epsilon(h, f; \mathcal{D}) = \mathbf{E}_{\mathbf{x} \sim \mathcal{D}}|h(\mathbf{x}) - f(\mathbf{x})| $$ $h$ (hypothesis,假设):学习函数,就是我们训练的模型网络。 $f$:真实标签。 $\epsilon$ (error):误差。 这个公式大概是代码里写的 Loss 函数(或者说测试集上的错误率)。 它表示:在某种画风 $\mathcal{D}$ 下,你的模型 $h$ 预测的结果,和真实答案 $f$ 之间相差多少。 $\epsilon_S(h)$:模型在源域(清晰图)上的错误率。 $\epsilon_T(h)$:模型在目标域(模糊图)上的错误率。 我们手里只有源域的标签,所以我们只能把 $\epsilon_S(h)$ 训练得很小。但我们真正想要的是,$\epsilon_T(h)$ 也很小。 关键公式:泛化误差上界 $$ \epsilon_T(h) \le \epsilon_S(h) + d_1(\mathcal{D}_S, \mathcal{D}_T) + \text{常量} $$我们把这个公式拆成三块来看: 你要想让目标域错误率 $\epsilon_T(h)$ 很小(等号左边),你必须让等号右边的三项都很小: ...