1. 人工智能的历史与宏观视角
1.1. History of AI
1. 人工智能 (Artificial Intelligence, AI) - 始于 1950 年代
- PPT内容解读:
- 在1952年,Arthur Samuel开发的跳棋程序是世界上最早的能够自主学习的程序之一,它可以通过与自己对弈来提升棋艺。这代表了早期AI的核心目标:在特定任务上(如下棋、逻辑推理)模拟甚至超越人类的智能。
- AI的诞生: “人工智能”这一术语正式诞生于1956年的达特茅斯会议。当时,一批顶尖科学家共同探讨了用机器模拟人类智能的可能性,为AI学科奠定了基础。
- 早期AI(符号主义AI):这个时期的主流方法是符号主义AI(也被称为“老式AI”或GOFAI)。它的核心思想是,智能行为可以通过对符号进行逻辑操作来模拟。这本质上是一种基于规则 (Rule-Based) 的方法,需要人类将知识和逻辑规则明确地编写成程序。
- AI寒冬 (AI Winter):虽然早期AI非常激动人心,但也因为技术瓶颈和过度承诺,导致在70年代末和80年代末出现了两次“AI寒冬”。由于期望过高而实际进展缓慢,科研经费被大量削减,AI研究进入了低谷期。这也是机器学习要到80年代才开始“蓬勃发展”的原因之一。
2. 机器学习 (Machine Learning, ML) - 兴起于 1980 年代
- 机器学习在80年代开始“蓬勃发展 (to flourish)”。
- 垃圾邮件过滤器(将邮件分拣到垃圾桶)是ML最经典的商业应用之一。它不需要程序员写下成千上万条“如果邮件包含XX词,就是垃圾邮件”的规则,而是让算法自动从大量已标记的邮件中“学习”垃圾邮件的特征。
- **范式转移**:机器学习标志着AI研究的一次重要**范式转移**从“教”计算机如何做(编程规则)**,转变为**让计算机自己从数据中“学”会怎么做。
- **核心在于特征工程 (Feature Engineering)**:在经典机器学习时代,算法本身虽然能学习,但它无法直接处理原始数据(如一张图片的所有像素)。它需要人类专家先对数据进行处理,**手动设计和提取出有用的“特征”**,然后将这些特征喂给算法。例如,在垃圾邮件分类中,专家可能会提取“发件人地址”、“特定词汇的出现频率”、“是否包含链接”等作为特征。这个过程耗时耗力,且特征的好坏直接决定了模型性能的上限。
- **代表算法**:这个时期的代表算法包括决策树 (Decision Trees)、支持向量机 (SVM)、逻辑回归 (Logistic Regression) 等。这些在今天仍然是非常强大和常用的工具。
3. 深度学习 (Deep Learning, DL) - 爆发于 2010 年代
- **革命性突破**:深度学习的爆发点通常被认为是**2012年的ImageNet图像识别大赛**。由Geoffrey Hinton团队开发的深度神经网络AlexNet,其识别准确率远超所有基于传统机器学习方法的对手,震惊了整个学术界和工业界,从此开启了深度学习的黄金时代。
- **核心优势:自动学习特征(表示学习)**:与经典ML最大的不同是,深度学习模型(主要是深度神经网络)**不需要人类进行繁琐的特征工程**。它可以直接从原始数据(如图片像素)中,通过其深层的网络结构,**自动地、层次化地学习特征**。底层网络可能学习到边缘、颜色等简单特征,中层网络将它们组合成纹理、形状等复杂特征,而高层网络则能学习到“猫脸”、“猫耳”等更抽象的概念。这就是表示学习 (Representation Learning)**。
- **成功的原因**:深度学习的成功并非偶然,而是ABCD四大要素**共同作用的结果:更优的**算法 (A)**、海量的**大数据 (B)**、强大的**计算能力 (C)**(特别是GPU),以及巨额的**资金投入 (D)**。
1.2. Turing Test
- 图灵测试
- 图灵测试的本质是一个“模仿游戏 (Imitation Game)”。
- 游戏中有三个参与者:玩家A(机器)、玩家B(人类) 和 玩家C(裁判)。
- 裁判 C 与 A 和 B 相互隔离,只能通过文字进行交流。C 的任务是通过提问来判断 A 和 B 哪一个是机器,哪一个是人类。
- 通过测试的标准是:如果机器 A 能够成功地“欺骗”裁判 C,让 C 相信它是一个人类,那么这台机器就被认为通过了图灵测试。
- 图灵提出,如果一台机器能通过这个测试,那么它就可以被认为是“智能的 (intelligent)”。这为“人工智能”提供了一个可操作的、经验性的定义:人工智能就是由机器所表现出的人类智能。
- ELIZA 聊天机器人
- ELIZA是历史上第一个著名的心理治疗聊天机器人,由 Joseph Weizenbaum 于1966年开发。
- 它通过非常简单的基于规则的方法来模拟对话。从PPT的对话示例中,我们可以清晰地看到它的工作原理:
- 关键词识别 (Spot the keyword):它会捕捉用户输入中的特定词汇,如 "always", "depressed", "unhappy"。
- 模板化回复 (Canned response):根据识别到的关键词,它会从预设的句式模板中生成回复。例如,用户说“我感到很沮丧(depressed)”,ELIZA会回复“听到你很沮丧我感到难过”。
- 通用回复 (Same response to all answers):当没有识别到特定关键词时,它会使用一些通用的、模棱两可的回复,比如“你觉得这之间有什么联系呢?”。
- 尽管ELIZA的机制非常简单,但当时有很多人在和它聊天的过程中,真的以为它能够理解自己,这被称为“ELIZA效应”。
1.3. Rule-Based Systems
这类系统的工作流程:
输入 (Input) -> 手动设计的程序 (Hand-design program) -> 输出 (Output) 。
这类系统通常被称为“专家系统 (Expert System)”,其内部包含的是“手动设计的事实和逻辑 (hand-designed facts and logics)” 。
- 一个典型的专家系统通常包含两个核心部分:
- 知识库 (Knowledge Base):这就是存储“事实和逻辑”的地方。它包含了某个特定领域(如医学、金融)的专家知识,通常以一系列 IF-THEN 形式的规则来表示。
- 例如 (医疗诊断):
IF病人有“流鼻涕”AND病人有“发烧”THEN病人“可能患有感冒”。 - 例如 (银行贷款) :
IF申请人“年收入 > 50万”AND申请人“没有不良贷款记录”THEN“批准贷款”。
- 例如 (医疗诊断):
- 推理机 (Inference Engine):这就是“手动设计的程序”部分。它是一个通用的逻辑推理模块,负责将知识库中的规则应用于用户提供的具体输入(事实),然后推导出结论(输出)。
- 知识库 (Knowledge Base):这就是存储“事实和逻辑”的地方。它包含了某个特定领域(如医学、金融)的专家知识,通常以一系列 IF-THEN 形式的规则来表示。
- 这种将知识(知识库)与推理(推理机)分离的设计,是专家系统的一个重要创新,使得更新知识变得相对容易,而无需修改整个程序的逻辑。
特点:
- 高透明性与可解释性 (Explainability):这是基于规则的系统最大的优点之一。因为所有的规则都是由人类明确编写的,所以系统做出任何一个决策,都可以清晰地追溯其推理路径(“系统之所以做出这个判断,是因为触发了规则A、B和C”)。这与许多现代深度学习模型的“黑箱”特性形成鲜明对比,在金融、医疗等需要高度信任的领域至关重要。
- 确定性与一致性:只要规则不变,同样的输入必然会得到同样的输出,系统行为稳定可靠。
1.4. Learning-Based Systems
与其试图制造一个程序来模拟成年人的心智,我们何不试试制造一个可以模拟孩童心智的程序呢?如果这个程序能够接受适当的教育,它最终将成长为一个成年人的大脑。
如果说基于规则的系统像是试图直接“创造”一个拥有特定领域知识的“成人专家”。我们把所有已知的规则、事实和逻辑一次性地灌输给它。它的知识是静态的。
那么基于学习的系统则像是“创造”一个“孩童”。它一开始非常简单,甚至是一张白纸。它本身不具备现成的知识,但它拥有学习的能力。
白纸一个很强的哲学假设,意味着完全从零开始学习。但在现代机器学习实践中,我们很少采用纯粹的白板。
- 模型的架构选择 (Architecture Selection) 本身就是一种先验知识 (Prior Knowledge) 或 归纳偏置 (Inductive Bias)。
- 举个例子:在处理图像识别任务时,我们通常会选择卷积神经网络 (CNN)。CNN的结构(卷积层、池化层)本身就被设计为能有效处理图像的空间局部性特征。我们作为设计者,已经预先赋予了模型一种“看”图像的先天结构。这更像是孩童的大脑天生就具备处理视觉信号的脑区,而不是一块完全没有结构的“白板”。同样,在处理语言任务时,我们选择Transformer架构,也是因为它有更适合处理序列数据的内在结构。
1.5. Supervised Learning
有监督学习有这四个要点:
- 有监督 (Supervised) 的含义就在于,我们给机器提供的数据是成对的“问题 (Questions)”和“答案 (Answers)”。
- 训练数据 (Training data):就像学生做的“练习题”,数量庞大,用来学习基本概念和解题方法。
- 验证数据 (Validation data):如同“模拟考试”,用来检验学习方法是否有效,并据此调整学习策略(在机器学习中称为“模型选择”和“超参数调优”)。
- 测试数据 (Testing data):相当于“期末大考”,在最后用来评估学生(模型)的最终学习成果和泛化能力。
监督学习的标准化流程:
1. 未知函数 $F$:在现实世界中,总有一个客观存在的、但我们无法得知的真实规律 F,它描述了输入 X (如婴儿年龄) 和输出 Y (身高) 之间的关系 Y = F(X)。
2. 训练数据 (Training data):我们通过观测和采样,得到一组包含了输入和对应输出的数据点 (X₁, Y₁), (X₂, Y₂), ...。这些数据点可以看作是真实函数 F 的一些样本。
3. 学习算法 (Learning Algorithm):这个算法的任务是分析训练数据,并从中找出一个最能描述这些数据背后规律的函数。
4. 假设函数 $G$:学习算法的产出就是一个假设函数 G。我们希望 G 能够尽可能地逼近 (≈)那个我们永远无法得知的真实函数 F。这个 G 就是我们最终训练得到的模型。
5. 预测 (Prediction):一旦我们有了模型 G,就可以用它来对全新的、未见过的数据(如一个新的婴儿)进行预测。
我们假设一个线性回归问题,假设函数 $G$ 的具体形式就是一条直线,通用的线性模型 $G$ 的数学表达式为: $$Y=\theta_0+\theta_1x_1+\theta_2x_2+...+\theta_Nx_N$$ 这个公式也可以写成向量形式:$Y=θX$。
监督学习算法的核心任务,就是从训练数据中学习到一组最佳的参数值 $θ_i$(也称为权重 weights 或系数 coefficients),使得模型 $G$ 的预测结果与真实值最接近。
手动设计特征
基于规则的系统中,人类专家需要完成所有核心的“思考”工作。他们不仅要定义输入数据,还要手动编写一个完整的程序,包含所有的事实和逻辑规则,来直接从输入得到输出。整个“输入 -> 输出”的映射规则是人类硬编码的。
- 经典机器学习系统中,人类专家的角色发生了变化。工作被分成了两部分:
- 人类的工作:从原始输入数据中,手动设计和提取特征 (Hand-design features)。
- 机器的工作:学习从这些特征到输出的映射关系 (ML learns to map features to output)。
- 核心区别在于,我们不再手动编写
IF-THEN规则,而是让机器自己从我们提供的特征中“学习”出这些规则或模式。
手动设计特征是经典机器学习的关键。这个过程也叫做特征工程 (Feature Engineering)。
- 原始数据(如一张图片的所有像素、一封邮件的全部文字)通常是复杂、高维且充满噪声的。直接将这些原始数据喂给传统的机器学习算法,效果往往很差。
- 特征工程是利用人类的领域知识 (Domain Knowledge),将原始数据转化为一组更有意义、更具代表性的数值或向量(即“特征”),以便于机器学习算法进行处理和学习。特征的好坏,直接决定了模型性能的天花板。
一些具体的例子:
- 图像识别(在深度学习之前):
- 原始数据:一张猫的图片的像素矩阵。
- 手动设计的特征:计算机视觉专家设计了很多算法来提取关键特征,如 SIFT (尺度不变特征变换) 或 HOG (方向梯度直方图)。这些算法可以从像素中计算出图像的边缘、角点、纹理等信息,并生成一个特征向量。然后,机器学习模型(如SVM)再来学习如何将这个特征向量分类为“猫”。模型本身从未“看见”原始图片,它看到的只是人类专家精心提取的特征。
- 垃圾邮件分类:
- 原始数据:一封电子邮件的全文。
- 手动设计的特征:
- 邮件中是否包含“免费”、“中奖”等关键词?
- 邮件中大写字母的比例是多少?
- 邮件中包含多少个链接或感叹号?
- 发件人邮箱的域名是什么? 我们将这些信息量化后,形成一个特征向量,然后让机器学习模型(如逻辑回归)来学习不同特征的权重,最终判断这是否是一封垃圾邮件。
深度学习的思考
- 当一个孩子学习识别什么是“小黄人”时,父母并不会像一个“特征工程师”那样对他进行教学。父母不会说:“看,儿子,这个物体有两个特征:特征A是它有一个大眼镜,特征B是它是黄色的。请记住这两个特征的组合。”
- 相反,儿童的学习过程是端到端的 和 整体的。他们直接从原始的感官输入(看到的图像、听到的声音)中进行学习。他们可能在电视上、书本上、玩具上看到过几次小黄人,他们的大脑就会自动地、无意识地从这些原始像素中提取出关键的模式和特征,并最终形成“小黄人”这个抽象概念。
- 这个过程是层次化的。大脑首先感知到光点、颜色、边缘等低级信息,然后将它们组合成形状、纹理等中级信息,最后再组合成“眼睛”、“身体”等高级概念。
- 将儿童的学习方式与PPT中间的“经典ML”流程图对比,我们会发现一个非常不自然、甚至可以说是“反人类直觉”的步骤——“手动设计特征 (Hand-design features)”。
- 经典ML范式要求我们必须有一个“专家”预先介入,把现实世界的问题(如识别蛋糕上的小黄人)分解成一个精心定义的特征列表。这个过程不仅繁琐、困难,而且也限制了模型的学习能力。如果专家设计的特征不够好,再强大的学习算法也无能为力。
- 这与图灵最初设想的“模拟孩童大脑,并通过教育使其成长”的理念,实际上是有一定差距的。经典ML模拟的更像是一个需要老师“划重点”、“喂考点”的学生,而不是一个能自主探索和发现知识的孩子。
1.6. Deep Learning vs Machine Learning
- 人类是从原始数据 (raw data) 开始学习概念的。
- 比如,一个孩子看到几只猫的实例后,很快就能学会识别“猫”这种动物。
- 这个学习过程并不需要父母来为他指出具体的特征(例如,“看它的胡须”、“看它的皮毛”或“看它的尾巴”)。
- 人类的学习是一个直接从原始数据到结论的过程,中间没有一个需要他人明确指出特征并提供给学习者的步骤。
- 深度学习的核心理念:“从原始数据中学习 (Learn from raw data)”。
这个“从原始数据中学习”的思想在机器学习领域有一个更正式的术语,叫做端到端学习 (End-to-End Learning)。
- 端到端学习系统指的是一个模型能够直接接收最原始的输入(如图片像素、文本字符),并直接输出最终需要的结果(如“猫”、一段译文),而不需要人类专家将处理流程分解成多个独立的、需要手动设计的模块。
- 整个系统从“一端”(输入)到“另一端”(输出)的所有参数,都是通过一个统一的优化过程共同学习的。
- 传统机器学习流程(非端到端):
原始数据 -> [手动特征工程] -> [机器学习模型] -> 输出这个流程被清晰地分成了两个部分。第一部分(特征工程)是固定的、由人类设计的;第二部分(模型)是可学习的。这两部分是割裂的。 - 深度学习流程(端到端):
原始数据 -> [深度学习模型] -> 输出在这个流程中,特征提取和最终的分类/回归任务被整合进了同一个模型中。模型在学习如何进行最终分类的同时,也自动地学习到了完成这个任务所需要的最佳特征。
1.7. Representation Learning
机器学习的四种范式:
- 1. 基于规则的系统 (Rule-Based System):
- 人类工作:定义所有输入、编写所有处理逻辑、得到最终输出。
- 机器工作:忠实地执行程序。
- 几乎所有智能部分都由人类完成。
- 2. 经典机器学习 (Classic ML):
- 人类工作:从原始输入中手动设计和提取特征。
- 机器工作:学习从这些特征到输出的映射关系。
- 智能被分割:人类负责“表示”数据,机器负责“学习”映射。
- 3. 表示学习 (Representation Learning):
- 人类工作:提供原始输入数据,并设计一个能够学习的模型。
- 机器工作:自动从原始数据中学习特征,并同时学习从这些特征到输出的映射。
- 这是一个巨大的飞跃。“特征提取”这个关键步骤从人类手中转移到了机器手中。
- 4. 深度学习 (Deep Learning):
- 这是表示学习的一种具体且强大的实现方式。
- 它进一步揭示了“学习特征”这个黑箱的内部结构:它是一个多层次、递进的过程。机器先学习到最简单的特征,然后逐层组合,形成越来越复杂和抽象的特征,最后再进行映射得到输出。
- 深度学习模型学习到了多层次的表示,而这些表示对应了多层次的抽象
表示学习的意义与价值
- 解耦变异因素 (Disentangling Factors of Variation):这是表示学习的一个核心目标。一个好的表示应该能将数据中变化的独立因素分离开。例如,对于人脸图像,变化的因素可能包括身份、光照、姿态、表情等。一个理想的表示模型会学习到不同的特征来分别捕捉这些因素,这使得模型更加鲁棒和通用。
- 催生迁移学习 (Transfer Learning):由于深度模型学习到的特征(尤其是底层和中层的简单特征,如边缘、纹理检测器)通常是通用的,不只适用于一个特定任务。因此,我们可以将在一个大规模数据集(如ImageNet)上预训练好的模型,将其学到的特征提取能力“迁移”到新的、数据量较小的任务上。我们只需替换或微调最后的映射层即可。这是现代深度学习应用中非常强大和常用的一种技术,极大地降低了对数据的需求和训练成本。
1.8. The ABCD’s of the Journey
- A - Algorithms (算法)
- 高效学习 (Efficient learning):幻灯片首先提到了高效学习的算法。
- 反向传播算法 (Back-propagation):PPT中特别展示了1986年关于反向传播算法的开创性论文。这个算法是当今训练几乎所有深度神经网络的核心,它能够高效地计算出模型预测的误差,并将这个误差从输出层反向传播回网络的每一层,从而指导每一层的参数(权重)应该如何进行微调,以减小未来的误差。
- 开源AI软件 (Open-source AI software):提到了 TensorFlow 和 PyTorch 等现代深度学习框架。
- 算法的“复兴”:一个值得思考的问题是,既然反向传播算法在1986年甚至更早就已存在,为什么直到近三十年后才大放异彩?这是因为它需要与其他三个要素结合才能发挥威力。早期的计算机算力不足,数据集太小,网络层数很浅,导致反向传播的优势无法体现,甚至会遇到梯度消失/爆炸等难以解决的问题。
- 框架的革命性作用:TensorFlow和PyTorch等框架的出现极大地降低了深度学习的门槛。它们将复杂的反向传播求导过程(自动微分)封装起来,提供了高级、易用的API。研究者和开发者不再需要手动编写复杂的数学运算和底层代码,可以像搭积木一样快速地构建、训练和部署复杂的深度学习模型,从而极大地加速了AI领域的创新和迭代速度。
2. B - Big Data (大数据)
- ImageNet:幻灯片以ImageNet为例,这是一个包含约1500万张已标注图片、覆盖约22000个类别的大规模数据集。
- 互联网 (Internet):海量数据的来源是互联网。
- 数据的“燃料”作用:如果说算法是引擎,那么大数据就是驱动引擎的燃料。深度学习模型,特别是深度神经网络,通常包含数百万甚至数十亿的参数。它们需要“喂”入海量的数据才能充分学习,避免过拟合,并捕捉到数据中细微而复杂的模式。没有大数据,深度学习的潜力就无法被激发。
- ImageNet的里程碑意义:ImageNet的价值不仅在于其规模,更在于它催生了ImageNet大规模视觉识别挑战赛(ILSVRC)。2012年是这个故事的转折点,Geoffrey Hinton团队的深度卷积神经网络AlexNet在该竞赛中以远超第二名的碾压性优势夺冠,首次向全世界证明了深度学习在复杂视觉任务上的巨大潜力,从而点燃了本轮AI革命的火种。
3. C - Computing Resources (计算资源)
- GPU:提到了图形处理器(GPU)。
- 云资源 (Cloud resources):提到了云计算平台。
- 为什么是GPU?:深度学习训练中的核心计算是大规模的矩阵和向量运算。CPU(中央处理器)核心少但功能强大,擅长处理复杂的串行逻辑任务。而GPU(图形处理器)拥有成千上万个相对简单的核心,天然地适合执行大规模并行计算。将神经网络的运算放在GPU上,可以获得相比CPU数十倍甚至上百倍的加速,使得训练过去需要数月甚至数年的复杂模型在几天或几小时内完成成为可能。
- 云计算的普及:AWS、Google Cloud、Azure等云服务平台,使得强大的GPU计算资源变得像自来水一样即取即用。研究人员、学生或初创公司无需购买和维护昂贵的物理服务器,就可以按需租用顶级的计算能力,这进一步推动了AI研究和应用的民主化。
4. D - Dollars (资金)
- 巨头入局:Google, Meta (Facebook), Microsoft, OpenAI等科技巨头。
- 投资驱动创新:这些科技巨头投入了数百亿美元用于AI研发和人才招募。这笔资金不仅资助了像DeepMind (Google) 和 FAIR (Meta) 这样的顶级研究机构,使它们能够进行长期的、探索性的基础研究,也为AI应用的大规模落地提供了保障。
- 人才争夺与生态构建:巨额的资金投入引发了全球性的AI人才争夺战,吸引了最聪明的大脑投身于此。同时,这些公司也通过开源工具(如TensorFlow, PyTorch)、发布预训练模型(如BERT, GPT)等方式,构建了强大的AI生态系统,反过来又推动了整个行业的快速发展。
综上所述,算法的成熟、海量的数据、强大的算力、以及雄厚的资金,这四大要素如齿轮般紧密啮合,缺一不可,共同驱动了我们今天所见的深度学习和人工智能的飞速发展。
2. 监督学习与核心算法
2.1. 成本函数 (Cost Function)
损失函数 (Loss function):它衡量的是模型在单个训练样本上的预测错误程度。有时也被称为误差函数 (Error function)。
成本函数 (Cost function) $J(θ)$:它衡量的是模型在整个训练数据集上所有样本的平均损失。我们的最终目标就是要最小化 (minimize) 这个成本函数。
在训练机器学习模型时,尤其是在使用随机梯度下降(SGD)等算法时,我们常常会计算单个样本或一小批样本的“损失”来指导模型参数的更新方向,但整个训练过程的宏观目标始终是降低代表全局性能的“成本”。
我们的目标是找到一个超平面或直线 (hyperplane or line) 来拟合数据,其数学形式为假设函数 $h(x)$。对于有 N 个特征的输入 $x=(x_1,...,x_N)$,线性模型的假设函数为: $$h(x)=\theta_0+\theta_1x_1+\cdots+\theta_Nx_N$$ 其向量化的简洁形式: $$h_\theta(x)=\theta x\quad(\text{其中 }x_0=1)$$ 需要注意的是,成本函数 $J(θ)$ 的自变量是模型的参数 $θ$,而不是输入数据 $x$。我们的训练数据 $(x,y)$ 是给定的、不变的。我们要做的是在这些固定的数据上,通过调整 $θ$ 的值,来寻找使成本 $J(θ)$ 达到最小值的那个最佳 $θ$。
因此,整个监督学习的训练过程,本质上就转化为了一个寻找函数 $J(θ)$ 最低点的最优化 (Optimization) 问题。后续的“梯度下降”等算法,就是用来解决这个最优化问题的工具。
2.2. 均方误差 (Mean Square Error, MSE)
均方误差 (MSE),也被称为 L2范数损失 (norm 2),其计算公式为: $$J(\theta)=\mathrm{MSE}=\frac{1}{M}\sum_{i=1}^M(h_\theta(x_i)-y_i)^2$$
- $M$ 是训练样本的总数。
- $h_{\theta}(x_i)$ 是模型对第 $i$ 个样本的预测值。
- $y_i$ 是第 $i$ 个样本的真实值。
- $(h_\theta(x_i)-y_i)$ 就是第 $i$ 个样本的预测误差。
1/2 MSE: $$J(\theta)=\frac{1}{2M}\sum_{i=1}^M(h_\theta(x_i)-y_i)^2$$
这个 1/2 是为了数学计算上的方便。在后续使用梯度下降算法对成本函数求导时,根据求导法则,平方项的指数“2”会乘到前面,正好与这个 1/2 相抵消,使得梯度的表达式更为简洁。
平均绝对误差 (MAE / L1 Loss),也叫 L1范数损失 (norm 1): $$\mathrm{MAE}=\frac{1}{M}\sum_{i=1}^M|h(x_i)-y_i|$$
- 对离群点的敏感度:
- MSE:由于使用了平方,对离群点非常敏感。一个离群点会产生巨大的平方误差,从而在很大程度上影响最终拟合直线的位置。
- MAE:使用绝对值,误差是线性增长的,因此对离群点更具鲁棒性 (robust)。如果你的数据中包含一些不希望其过度影响模型的异常值,MAE可能是更好的选择。
- 解的稳定性与唯一性:
- MSE:通常会产生唯一且稳定的解。
- MAE:可能会有多个最优
2.3. Gradient Descent
机器学习的训练过程可以总结为一个迭代猜测 (Iterative Guessing)的朴素算法:
- 随机猜一组参数 $θ$。
- 计算在这组参数下的成本 $J(θ)$。
- 然后做出一个更好的猜测,并重复此过程,直到成本足够小。
这个做出更好猜测的过程,就是梯度下降。
![[Pasted image 20250913173146.png]]
图中的蓝色曲线代表成本函数 $J(θ)$。我们的目标是找到这条曲线的最低点,因为那里的成本最小。梯度下降的核心思想是:在曲线的任意一点,我们计算该点的梯度 (Gradient),梯度就是该点切线 (tangent line) 的斜率。
这个梯度 $∇J(θ)$ 告诉我们哪个方向是“上坡”方向,而且坡度最陡。因此,我们只需要朝着梯度的相反方向走一小步,就一定是“下坡”最快的方向,这样就能最快地接近最低点。梯度下降的“下山”策略可以用一个简洁而强大的数学公式来表示,这就是参数更新法则: $$\theta\leftarrow\theta-\alpha\nabla J(\theta)$$
在这个过程中,学习率 $α$ 是一个需要我们手动设置的超参数 (hyperparameter),它的选择至关重要:
- 如果 $α$ 太小:就像下山时每一步都只挪动一小寸,虽然方向正确,但需要非常非常多次迭代才能到达山底,训练速度会很慢。
- 如果 $α$ 太大:就像下山时一步迈得太大,可能会直接“跨过”山谷,跳到对面的山坡上,甚至可能越跳越高,导致成本不断增大,模型无法收敛甚至发散。
因此,选择一个合适的学习率是训练好一个模型的关键技术之一。在实践中,我们常常会使用一些策略,比如在训练初期使用较大的学习率,随着训练的进行慢慢减小学习率。
图示为了简化,只展示了一个参数 $θ$ 的情况。在真实的机器学习模型中,我们有多个参数 $(\theta_0,\theta_1,...,\theta_N)$,因此成本函数是一个高维的曲面,梯度 $∇J(θ)$ 则是一个包含了所有参数偏导数的向量 $[\frac{\partial J}{\partial\theta_{0}},\frac{\partial J}{\partial\theta_{1}},\ldots]$。但其核心思想沿着负梯度方向更新参数是完全一样的。
线性回归中梯度下降的具体公式
当成本函数 $J(\theta_0,\theta_1)=\frac{1}{2M}\sum_{i=1}^M(h_\theta(x_i)-y_i)^2$ 且 $h_\theta(x_i)=\theta_0+\theta_1x_i$ 时,通过微积分的链式法则可以求得: $$\frac{\partial J}{\partial\theta_0}=\frac{1}{M}\sum_{i=1}^M(h_\theta(x_i)-y_i)$$ $$\frac{\partial J}{\partial\theta_1}=\frac{1}{M}\sum_{i=1}^M(h_\theta(x_i)-y_i)x_i$$ 将此结果代入更新法则,我们就得到了单特征线性回归中梯度下降的完整算法。
进一步,当模型有N个特征时,这个规律可以被推广到每一个参数 $θ_j$ (for j=0 to N): $$\theta_j\leftarrow\theta_j-\alpha\frac{1}{M}\sum_{i=1}^M(h_\theta(x_i)-y_i)x_{i,j}$$
(其中,我们约定 $x_{i,0}=1$ 以统一形式)
- 对于 $θ_0$ (偏置项/截距):它的更新值与平均误差 $(h_\theta(x_i)-y_i)$ 成正比。这很直观:如果模型的预测值平均来看都太高了(误差为正),那么我们就减小 $θ_0$ 把整条直线往下拉一点;反之则往上提。
- 对于 θj (权重项):它的更新值不仅与平均误差成正比,还与对应的特征值 $x_{i,j}$ 成正比。这也非常合理:如果一个样本的误差很大,并且这个样本的特征 $x_j$ 的值也很大,那么我们就认为这个特征的权重 $θ_j$ “负有更大的责任”,因此需要对它进行更大幅度的调整。
2.4. Logistic Regression
我们不能直接用之前学的线性回归模型 $(h(x)=θx)$ 来做分类:线性回归的输出是任意实数(可以远大于1或小于0)。而对于二元分类,我们希望输出的是一个概率,概率值必须严格地落在 $[0, 1]$ 区间内。强行用线性回归的输出去拟合0或1的标签,效果会很差。
逻辑回归分为两步:
- 先像线性回归一样,计算出一个线性的风险得分 (risk score),$s=θx$。这个得分可以是任意实数。
- 然后,用一个特殊的函数(即逻辑函数)将这个得分“压缩”到 $[0, 1]$ 区间内,从而得到一个合法的概率值。
2.4.1. Sigmoid
数学定义为:$$\sigma(s)=\frac{e^s}{1+e^s}=\frac{1}{1+e^{-s}}$$ 它的函数签名是 $\sigma:\mathbb{R}^N\to[0,1]$ ,意味着它能将任意实数 $s$ 映射到 $(0, 1)$ 区间内,这个输出值可以被解释为概率。
Sigmoid函数的关键特性(如图所示):
- 它是一条光滑的“S”形曲线。
- 当输入 s 趋向于正无穷大 (s→∞) 时,输出的概率 p 趋向于 1。
- 当输入 s 趋向于负无穷大 (s→−∞) 时,输出的概率 p 趋向于 0。
- 当输入 s=0 时,输出的概率 p 恰好是 0.5。
![[Pasted image 20250913180920.png]]
结合线性的“风险得分”和Sigmoid函数,我们就得到了逻辑回归模型的假设函数 (hypothesis function): $$h(x)=\sigma(s)=\sigma(\theta x)$$ 这里的 $h(x)$ 输出的就是模型预测的“事件发生的概率”。
2.4.2. 逻辑回归模型
我们可以将逻辑回归模型可视化为一个计算单元,并将其与生物学中的神经元和早期AI中的“感知机”联系起来
![[Pasted image 20250913181131.png]]
- 输入层 (Inputs):左侧的 $x_1,...,x_N$ 代表样本的 $N$ 个特征。特别要注意还有一个值为 1 的输入,它对应的权重是 $θ_0$,这就是我们之前公式中的偏置项/截距项 (bias term)。
- 加权求和 (Summation, $Σ$):所有输入值 $x_j$ 乘以它们各自对应的权重 $θ_j$ ,在 $Σ$ 节点进行求和,得到我们之前提到的“风险得分” $s=(\theta_1x_1+\cdots+\theta_Nx_N)+\theta_0$。
- 激活函数 (Activation Function, $σ$):求和的结果 $s$ 被送入一个非线性函数 $σ$(在这里是Sigmoid函数)进行处理,最终得到一个0到1之间的概率输出 $h(x)$。
- 这个计算单元的设计灵感来源于神经生物学 (neurobiology),并展示了生物神经元的结构图。
- 我们可以建立如下的类比关系:
- 树突 (Dendrites) ≈ 输入 ($x_j$):负责接收来自其他神经元的信号。
- 细胞体 (Cell body) ≈ 求和与激活 ($Σ$ 和 $σ$):负责整合所有接收到的信号,并在信号强度超过某个阈值时产生“兴奋”或“激活”。
- 轴突 (Axon) ≈ 输出 ($h(x)$):负责将自身的激活信号传递给下一个神经元。
- 权重 $θ_j$ 则可以类比为神经元之间连接的强度,即突触 (Synapse) 的强度。大脑的学习过程,在很大程度上就是通过调整突触的强度来实现的。
- $θ_0$ 可以被看作是神经元的激活阈值 (activation threshold) 的一种体现:
- $θ_0>0$(正权重)是兴奋性的 (excitatory),意味着这个神经元本身就更容易被激活(“天生比较兴奋”)。
- $θ_0<0$(负权重)是抑制性的 (inhibitory),意味着需要更强的输入信号才能激活它(“天生比较冷静”)。
- 从数学上讲,偏置项 $\theta_0$ 赋予了决策边界平移的能力,使其不必强制穿过原点,从而增加了模型的灵活性。
这个模型称为感知机 (Perceptron),刚刚分析的整个结构,就是一个完整的人工神经元 (Artificial Neuron)。逻辑回归模型,本质上就是一个只包含单个神经元的、最简单的神经网络。由于它只有一个神经元,它只能学习线性的决策边界。
而深度学习 (Deep Learning) 的威力,正来自于将成千上万个这样的神经元组织起来,形成多层次的神经网络 (Neural Network, NN)。前一层神经元的输出,会成为后一层神经元的输入。通过这种方式,神经网络就能够学习到极其复杂的、非线性的决策边界,并实现我们之前讨论的“层次化表示学习”。
2.4.3. 分类决策
- 我们通常以0.5 (即50%的概率) 作为一个默认的决策阈值 (decision threshold)。
- 如果模型输出的概率 $h(x)$ 大于 0.5,我们就将样本预测为正类 (positive class, y=1)。
- 如果模型输出的概率 小于 0.5,我们就将样本预测为负类 (negative class, y=0)。
根据Sigmoid函数,可以有如下结论;
- 概率大于 0.5 对应于 $s>0$。
- 概率小于 0.5 对应于 $s<0$。
所以,$θx=0$ 就是区分正负类的边界线。需要注意的是模型在学习参数 $θ$ 的过程中,是使用连续的概率输出 $h(x)$(例如0.82, 0.13等)来计算损失的。因为损失函数需要是可微的,才能用梯度下降进行优化。当我们使用训练好的模型去对新数据做预测时,才会用到这个阈值,将模型输出的连续概率值“二值化”,得到一个离散的、非0即1的最终分类结果。
2.4.4. 对数损失 (Log Loss)
不能直接将MSE用在逻辑回归上,因为如果我们把逻辑回归的假设函数 $h(x)=σ(θx)$ 代入MSE成本函数:
来看一下两个函数的组合:
- MSE成本函数:$J=(h(x)-y)^2$。如果把 $h(x)$ 看作自变量,这个函数本身是一个二次函数,也就是一个抛物线(“碗”形)。
- Sigmoid假设函数:$h(x)=\sigma(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}}$。这是一个非线性的“S”形函数。
这里的关键在于 Sigmoid函数的非线性。Sigmoid函数在两端(当输入 $θ^Tx$ 很大或很小时)非常“平坦”,梯度接近于0。当将这样一个两端平坦、中间陡峭的S形曲线“塞”进一个原本很规则的抛物线碗里时,这个碗的形状就被“扭曲”了,所以我们最后的得到的loss是非凸函数。
非凸函数意味着它有很多个“山谷”,即存在许多局部最小值 (local minima)。如果我们使用梯度下降在这种函数上进行优化,它很可能会陷入某个局部最小值而无法到达全局最小值。这使得模型的优化变得非常困难且结果不稳定。因此,我们需要一个专门为逻辑回归设计的、能够保证成本函数为凸函数的损失函数。
我们希望的损失函数应该具备的特性:
- 当真实标签是1,且我们的模型预测概率也接近1时(预测正确),损失应该接近0。
- 当真实标签是1,但我们的模型预测概率却接近0时(预测大错特错),损失应该非常大,趋近于无穷。
- 反之,当真实标签是0时,情况类似。
为了实现这个目标,我们引入了对数函数 (logarithm)。幻灯片给出了分两种情况定义的损失函数:
当真实类别为正类 (y=1) 时: $$\mathrm{loss}=-\log(h(x))$$ 这里的 $h(x)$ 是模型预测 $y=1$ 的概率。当预测概率 $h(x)$ 越接近1,$log(h(x))$ 越接近0,损失就越小。当 $h(x)$ 越接近0,$log(h(x))$ 越接近负无穷,损失就越大。这完美符合我们的要求。
当真实类别为负类 (y=0) 时: $$\mathrm{loss}=-\log(1-h(x))$$ 这里的 $1−h(x)$ 是模型预测 $y=0$ 的概率。同理,当 $h(x)$ 越接近0(即 $1−h(x)$ 越接近1)时,损失越小。当 $h(x)$ 越接近1(即 $1−h(x)$ 越接近0)时,损失越大。这也符合我们的要求。
这个损失函数的正式名称是交叉熵损失 (Cross-Entropy Loss),它源于信息论。交叉熵是用来衡量两个概率分布之间差异性的指标。
- 在我们的二元分类问题中,我们有两个概率分布:
- 真实分布 (P):由真实标签 $y$ 决定。如果 $y=1$,那么真实分布就是 $[P(y=0)=0, P(y=1)=1]$ 。
- 预测分布 (Q):由模型的输出 h(x) 决定,即 $[Q(y=0)=1-h(x), Q(y=1)=h(x)]$ 。
- 我们训练模型的目标,就是让我们预测的概率分布 $Q$ 尽可能地接近真实的概率分布 $P$。交叉熵损失就是度量这个“接近程度”的尺子。
- 当我们把交叉熵的通用公式应用到二元分类的场景中时,推导出的结果就恰好是幻灯片上分段定义的对数损失函数。
- 因此,最小化逻辑回归的对数损失,等价于最小化模型预测分布与真实数据分布之间的交叉熵。
所以我们的分段损失函数如下: $$J(h_\theta(x),y)=\begin{cases}-\log(h_\theta(x))&\mathrm{if~}y=1\-\log(1-h_\theta(x))&\mathrm{if~}y=0&&\end{cases}$$ 合并后的单一表达式: $$J(h_\theta(x),y)=-y\log(h_\theta(x))-(1-y)\log(1-h_\theta(x))$$ 这里的 $J$ 仍然表示单个样本的损失,逻辑回归的成本函数 $J(θ)$ 就是所有 $M$ 个训练样本的平均损失: $$J(\theta)=\frac{1}{M}\sum_{i=1}^MJ(h_\theta(x_i),y_i)$$ 将我们上面得到的单一损失表达式代入,就得到了逻辑回归最终的成本函数: $$J(\theta)=-\frac{1}{M}\sum_{i=1}^M\left[y_i\log(h_\theta(x_i))+(1-y_i)\log(1-h_\theta(x_i))\right]$$ 这个公式就是我们接下来要使用梯度下降算法去最小化的目标函数。
- 与最大似然估计 (MLE) 的关系
最大似然估计的目标是,寻找一组参数 θ,使得当前这组训练数据出现的概率最大。
首先,我们可以将模型预测单个样本 $(x,y)$ 的概率也写成一个统一的式子: $$P(y|x;\theta)=(h_\theta(x))^y(1-h_\theta(x))^{1-y}$$ 整个数据集(假设样本独立同分布)出现的似然 是所有单个样本概率的乘积: $$L(\theta)=\prod_{i=1}^MP(y_i|x_i;\theta)=\prod_{i=1}^M(h_\theta(x_i))^{y_i}(1-h_\theta(x_i))^{1-y_i}$$ 直接对乘积进行优化很困难,所以我们通常优化它的对数形式,对数似然,因为对数可以将乘法变为加法: $$\ell(\theta)=\log L(\theta)=\sum_{i=1}^M[y_i\log(h_\theta(x_i))+(1-y_i)\log(1-h_\theta(x_i))]$$ 这个对数似然函数 $ℓ(θ)$ 和我们上面定义的成本函数 $J(θ)$ 在求和符号内的部分是完全一样的,最大化对数似然函数,就等价于最小化 它的相反数,即我们的成本函数 $J(θ)$,即最小化交叉熵损失等价于最大化模型的似然。
2.4.5. 推导梯度
逻辑回归的成本函数: $$J(\theta)=-\frac{1}{M}\sum_{i=1}^M\left[y_i\log h(x_i)+(1-y_i)\log(1-h(x_i))\right]$$ 目标是求这个函数对任意一个参数 $θ_j$ 的偏导数:$\frac{\partial J(\theta)}{\partial\theta_j}$ 将单个样本的损失对 $θ_j$ 的求导分解为三项的乘积: $$\frac{\partial J_i(\theta)}{\partial\theta_j}=\frac{\partial J_i}{\partial h(x_i)}\cdot\frac{\partial h(x_i)}{\partial s_i}\cdot\frac{\partial s_i}{\partial\theta_j}$$
- 计算 $\frac{\partial J_i}{\partial h(x_i)}$
根据对数函数的求导法则 $\frac{\partial}{\partial x}\log x=\frac{1}{x}$ ,可以得到: $$\frac{\partial J_i}{\partial h(x_i)}=-\left(\frac{y_i}{h(x_i)}-\frac{1-y_i}{1-h(x_i)}\right)=-\left(\frac{y_i-y_ih(x_i)-h(x_i)+y_ih(x_i)}{h(x_i)(1-h(x_i))}\right)=\frac{h(x_i)-y_i}{h(x_i)(1-h(x_i))}$$
- 计算 $\frac{\partial h(x_i)}{\partial s_i}$
这一项是 Sigmoid函数自身的导数。Sigmoid函数有一个很好的导数性质:$\sigma^{\prime}(s)=\sigma(s)(1-\sigma(s))$。因为 $h(x_i)=σ(s_i)$,所以:
$$\frac{\partial h(x_i)}{\partial s_i}=h(x_i)(1-h(x_i))$$ 3. 计算 $\frac{\partial s_i}{\partial\theta_j}$
我们知道 $s_i=x_i\theta=\theta_0x_{i,0}+\cdots+\theta_jx_{i,j}+\cdots+\theta_Nx_{i,N}$ 我们对一个特定的 $θ_j$ 求偏导数时,所有不含 $θ_j$ 的项都变为0,只剩下 $\theta_jx_{i,j}$ 这一项,其导数就是 $$\frac{\partial s_i}{\partial\theta_j}=x_{i,j}$$ 将链式法则的三部分乘起来: $$\frac{\partial J_i(\theta)}{\partial\theta_j}=\underbrace{\left(\frac{h(x_i)-y_i}{h(x_i)(1-h(x_i))}\right)}{\text{第一步}}\cdot\underbrace{(h(x_i)(1-h(x_i)))}{\text{第二步}}\cdot\underbrace{(x_{i,j})}{\text{第三步}}$$ 我们得到: $$\frac{\partial J_i(\theta)}{\partial\theta_j}=(h(x_i)-y_i)x{i,j}$$ 最后,我们把这个结果代入到整个成本函数 $J(θ)$ 的求导公式中(即对所有样本求和再平均),就得到了逻辑回归的梯度: $$\frac{\partial J(\theta)}{\partial\theta_j}=\frac{1}{M}\sum_{i=1}^M(h(x_i)-y_i)x_{i,j}$$ 这个最终的梯度公式如下: $$\frac{\partial J(\theta)}{\partial\theta_j}=-\frac{1}{M}\sum_{i=1}^M(y_i-h(x_i))x_{i,j}$$
2.4. 评价指标
2.4.1. threshold
对于Sigmoid函数,我们可以把threshold不仅仅设为0.5,实际上它是很灵活的,此时通用的决策规则变为:
- 如果模型输出的概率 $h(x)$≥ threshold,则预测 y = 1。
- 如果模型输出的概率 $h(x)$< threshold,则预测 y = 0。
2.4.2. Precision
精确率回答的是:“在所有预测为正类 (Predicted 1) 的样本中,有多大比例是真正为正类 (Actual 1) 的”,它衡量的是模型阳性预测的“质量”或“可靠性”。公式为:
$$\mathrm{precision}=\frac{\text{true positives}}{\text{predicted positives}}=\frac{\text{true positives}}{\text{false positives}+\text{true positives}}$$
过调整决策阈值,我们可以直接控制模型的精确率,其具体逻辑如下:
高阈值 ⟹ 模型预测为“正类”的门槛变高了,需要更有把握才敢预测为1 ⟹ 这会减少那些模棱两可的样本被错误地预测为正类(即假阳性 (false positive) 会减少) ⟹ 精确率会提高。
因此有如下关系:
- ↑ 阈值 (threshold) ⟹ ↑ 精确率 (precision)
- ↓ 阈值 (threshold) ⟹ ↓ 精确率 (precision)
所以,一个模型可以通过变得极其保守来获得很高的精确率,但代价是漏掉大量的正类样本。
2.4.3. Recall
召回率回答的是:“在所有真正为正类 (Actual 1) 的样本中,你成功预测为正类 (Predicted 1) 的比例是多少?”它衡量的是模型找出所有正样本的“能力”或“完整性”。公式为:
$$\mathrm{recall}=\frac{\text{true positives}}{\text{actual positives}}=\frac{\text{true positives}}{\text{false negatives}+\text{true positives}}$$
召回率与决策阈值之间的关系是反向关系,逻辑是:
提高阈值 ⟹ 模型预测为“正类”的门槛变高了,整体预测结果会更偏向于“负类” ⟹ 这会导致一些原本应该被正确识别为正类的样本,因为没达到高门槛而被错误地预测为负类(即假阴性 (false negative) 会增加) ⟹ 召回率会降低。
因此有如下关系:
- ↑ 阈值 (threshold) ⟹ ↓ 召回率 (recall)
- ↓ 阈值 (threshold) ⟹ ↑ 召回率 (recall)
2.4.4. F1-Score
理想情况下,我们希望精确率和召回率都达到1(即100%),但现实中这几乎不可能。调整阈值可以提高一个指标,但通常会牺牲另一个。在某些应用中,我们对其中一个指标有明显偏好(如疾病筛查重召回率,刑事定罪重精确率)。但在另一些场景下,我们希望两者兼顾。
F1分数的公式为: $$F1=2\cdot\frac{\mathrm{precision}\cdot\mathrm{recall}}{\mathrm{precision}+\mathrm{recall}}$$ F1分数是精确率和召回率的调和平均数,而非简单的算术平均数,其目的是为了惩罚极端值。
注:调和平均数有一个特性,它会向两个数中较小的那个数“严重倾斜”。因此,只有当精确率和召回率两者都比较高时,F1分数才会高。任何一个指标的极端低下都会导致F1分数急剧降低。
F-beta 分数
F1分数给予了精确率和召回率同等的权重。但在某些场景下,我们可能认为其中一个比另一个稍微重要一点点。这时,我们可以使用更通用的 F-beta 分数。
公式: $$F_\beta=(1+\beta^2)\cdot\frac{\mathrm{precision}\cdot\mathrm{recall}}{(\beta^2\cdot\mathrm{precision})+\mathrm{recall}}$$
- 当 $β=1$ 时,就是F1分数,给予两者同等权重。
- 当 $β>1$ 时(如 F2 分数),更看重召回率。
- 当 $β<1$ 时(如 F0.5 分数),更看重精确率。
- 通过调整 $β$ 的值,我们可以得到一个更符合特定业务需求的、可定制化的综合评估指标。
2.4.5. P-R curve
P-R曲线展示了在不同决策阈值下,精确率和召回率之间的权衡关系。其绘制过程如下:
- 获取预测分数:首先,我们用训练好的模型对验证集或测试集中的每一个样本进行预测,得到一个0到1之间的概率分数。
- 分数排序:将所有样本按照预测分数从高到低进行排序。
- 遍历阈值:我们从高到低,依次将每个样本的预测分数作为“潜在的决策阈值”。
- 计算P和R:对于每一个潜在的阈值,我们都将分数高于它的样本预测为“1”,低于它的预测为“0”,然后计算出当前阈值下的精确率和召回率。
- 绘图:将计算出的一系列 (Recall, Precision) 点对,以Recall为横坐标,Precision为纵坐标,绘制在图上并连接起来,就形成了P-R曲线。
评估P-R曲线的好坏
- 理想模型:一个理想模型的P-R曲线会尽可能地靠近图的右上角 (Recall=1, Precision=1)。这意味着模型可以在保持很高精确率的同时,也能找出绝大多数的正样本。
- 曲线下面积 (AUC):由于我们常常需要一个单一的数值来量化模型的整体性能,我们可以计算P-R曲线下方的面积 (Area Under Curve, AUC)。AUC值越接近1,说明模型的性能越好。一个好的模型,其曲线会“拱”得很高,因此下方的面积也很大。
- AUC-PR:P-R曲线下面积的正式名称。
- AP (Average Precision):在很多领域(如信息检索、目标检测),人们常用平均精确率(AP)来近似计算AUC-PR。它是一种对P-R曲线上不同点的精确率进行加权平均的计算方式。
- mAP (mean Average Precision):这个“m”代表“mean(平均)”。当我们的任务是多元分类(例如识别猫、狗、汽车等多个类别)时,我们会为每一个类别单独计算一个AP值,然后将这些AP值取一个平均,就得到了mAP。它是衡量模型在所有类别上综合表现的黄金指标。对于二元分类,AP和AUC-PR基本是等价的。
2.5. Multi-Classification
逻辑回归解决的是二分类问题,即答案只有两种可能,例如“是/否”、“通过/不通过”、“类别A/类别B”,而对于需要预测的类别超过两种的多分类问题,逻辑回归是无能为力的。我们需要一种新的机制,它必须能够:
- 针对每一个类别都计算出一个概率。
- 确保所有类别的概率加起来等于1。
2.5.1. Softmax
以MNIST数据集为例,一个自然的想法是,既然我会做二分类,那我能不能为每个类别都训练一个独立的逻辑回归分类器?比如,对于MNIST,我训练一个“判断是不是0”的分类器,再训练一个“判断是不是1”的分类器……以此类推,总共训练10个。
这种“一对多 (One-vs-All)”的策略有一个主要缺陷:每个分类器都是独立输出一个概率,这些概率之间没有关联。它们的和不一定等于1。你可能会得到“图片是‘7’的概率是0.9,是‘1’的概率是0.85”,这在逻辑上是不合理的,因为它不是一个规范的概率分布。
Softmax提供了一个更优雅的解决方案。它不是独立地看每个类别的得分,而是将所有类别的得分放在一起,进行全局的考量和计算。
- 首先,模型为每一个类别(Class 1 到 Class K)都计算出一个原始的分数 (score) 或称为对数几率 (logit)。这个分数来自于我们熟悉的线性计算($Σ$ 节点),可以看作是模型认为样本属于该类别的“原始证据强度”,它可以是任意实数。
- 然后,这些分数被一起送入一个统一的Softmax层。
- Softmax层输出 $K$ 个值,分别对应 $K$ 个类别的概率。
有了这个概率分布之后,做出最终预测就变得非常简单直观了,最高概率的类别就是最终的预测类别。
softmax的计算公式如下,在K分类问题中,我们需要为每个类别都计算一个分数,因此我们有 K 个分数:$s_1,s_2,\ldots,s_K$,Softmax函数计算任意一个类别 $k$ 的概率为: $$\text{Class k probability: }\frac{e^{s_k}}{\sum_{i=1}^Ke^{s_i}}$$ 这个公式的核心思想有两点:
- 使用指数函数 ($e^x$):将所有的分数 $s_k$ 都通过指数函数进行映射。这样做有两个好处:一是确保所有值都为正数;二是放大分数之间的差异,使得分数最高的类别在计算概率时优势更明显。
- 归一化:将每个类别指数化后的结果,除以所有类别指数化结果的总和。这步操作确保了最终输出的所有类别概率值都在$[0,1]$之间,并且它们的总和恰好为1,形成一个有效的概率分布。
而在sigmoid中,针对在二分类问题,类别1和2的概率分别为: $$\text{Class 1 probability: }\sigma(s)=\frac{1}{1+e^{-s}}$$ $$\text{Class 2 probability: }1-\sigma(s)=\frac{e^{-s}}{1+e^{-s}}=\frac{1}{1+e^s}$$ 整个过程我们只需要一个输入分数 $s$
如果我们将通用的Softmax公式应用到 $K=2$ 的特殊情况的时候,此时我们有两个分数:$s_1$ (对应类别1) 和 $s_2$ (对应类别2)。根据Softmax公式,类别1的概率是: $$\text{Class 1 probability: }\frac{e^{s_1}}{e^{s_1}+e^{s_2}}$$ 类别2的概率是: $$\text{Class 2 probability: }\frac{e^{s_2}}{e^{s_1}+e^{s_2}}$$ 我们对类别1的概率公式的分子和分母同时除以 $e^{s1}$: $$\frac{e^{s_1}}{e^{s_1}+e^{s_2}}=\frac{e^{s_1}/e^{s_1}}{(e^{s_1}/e^{s_1})+(e^{s_2}/e^{s_1})}=\frac{1}{1+e^{s_2-s_1}}$$ 如果我们定义Sigmoid函数中的那个单一分数 $s$ 为两个类别分数之差,即 $s=s_1−s_2$,那么 $s_2−s_1=−s$。那么有: $$\frac{1}{1+e^{-(s_1-s_2)}}=\frac{1}{1+e^{-s}}$$ 因此,Softmax是Sigmoid的泛化形式。当类别数量减少到2时,Softmax函数就退化成了Sigmoid函数。
2.5.2. Categorical Cross Entropy
在我们用Softmax函数得到了一个关于各个类别的概率分布后,下一步就需要一个函数来衡量这个预测的概率分布与真实的标签之间的差距。差距越大,损失函数的值(Loss)就应该越大。
我们首先需要理解多分类任务中“真实标签 (Label y)”的格式。于一个有 K 个类别的任务,标签 y 是一个 K 维的向量。在这个向量中,只有代表真实类别的那个位置是1,其余所有位置都是0。这被称为被独热编码 (One-Hot Encoding)。
分类交叉熵的通用公式: $$\mathrm{Loss}(h(x),y)=-\sum_cy_c\log(h(x)_c)$$ 这里的 $c$ 代表遍历所有类别。$y_c$ 是真实标签向量的第 $c$ 个元素,$h(x)_c$ 是模型预测的第 $c$ 个类别的概率。由于真实标签 $y$ 是 one-hot 编码的,向量中只有一个 $y_c$ 是1,其他都是0。这意味着在求和 $∑$ 的过程中,所有 $y_c=0$ 的项都变成了0,只有真实类别对应的那一项被保留了下来。
因此,这个复杂的求和公式可以被大大简化为:
$$\text{Loss} = - \log(h(x)_{\text{true_class}})$$
也就是说,损失值就是模型对那个“正确的类别”所预测的概率的负对数。
- 如果模型对正确类别的预测概率 $h(x)$ 接近1(非常自信且正确),那么 $log(h(x))$ 接近0,Loss值就接近0。
- 如果模型对正确类别的预测概率 $h(x)$ 接近0(非常自信但错了),那么 $log(h(x))$ 趋近于负无穷,Loss值就会变得非常巨大。