康奈尔-CS8850-高级机器学习笔记-全-

康奈尔 CS8850 高级机器学习笔记(全)

001:导论 🚀

在本节课中,我们将学习高级机器学习课程的总体介绍,包括课程目标、讲师介绍以及机器学习的基本概念和历史。


讲师介绍 👨‍🏫

上一节我们开始了课程,本节中我们来认识一下授课团队。

我是Sergey,是计算机科学系的副教授,同时也是T研究中心机器学习核心的主任。我的经历涵盖学术界、工业界和初创企业。我将尽力向你们传授我对机器学习的热情,并解释其理论和实践应用的重要性。

我的办公室在55 Park Place,但本学期我们不太可能进行线下会面。你们可以随时通过邮件联系我。课程时间(周二和周四的12:45至2:30 PM)将作为主要的办公时间。

以下是关于课程参与的重要说明:

  • 课程将以线上同步形式进行。
  • 为了营造课堂氛围,请在上课时开启摄像头。
  • 如果连接课堂但未开启摄像头,将不会被计入出勤。

我的助教是Z。你们也可以通过邮件与他联系,他会回复并安排一对一的线上交流。


为什么学习机器学习?🤔

认识了授课团队后,我们来看看学习这门课程的意义。

机器学习是当前科技发展的核心驱动力之一。它不仅是学术研究的前沿,更广泛应用于工业界和日常生活的方方面面。理解机器学习的深层原理和工作机制,对于在任何领域应用它都至关重要。


什么是机器学习?🧠

理解了学习动机,现在我们来定义机器学习本身。

机器学习是人工智能的一个分支,它使计算机系统能够从数据中“学习”并改进性能,而无需进行明确的编程。其核心思想是让机器从经验(数据)中自动发现规律。

一个简单的形式化描述是:给定任务 T、经验 E 和性能度量 P,如果计算机程序在 T 上的性能(由 P 衡量)随着经验 E 的增加而提高,则称该程序从经验 E 中学习。


机器学习简史 📜

明确了定义,让我们快速回顾一下机器学习的发展历程。

机器学习的发展并非一蹴而就,它经历了多个阶段的演进:

  • 早期思想(1940s-1950s):受神经科学启发,出现了感知机等早期模型。
  • 符号主义与专家系统(1960s-1980s):基于规则和逻辑的AI方法盛行。
  • 统计学习复兴(1990s-2000s):支持向量机(SVM)、决策树等基于统计理论的算法成为主流。
  • 深度学习崛起(2010s-至今):得益于大数据和计算力的提升,神经网络(尤其是深度学习)在图像、语音、自然语言处理等领域取得突破性进展。

强化学习初探 🎮

回顾了历史,本节我们以一个有趣的分支——强化学习作为切入点,初步感受机器学习的魅力。

强化学习是机器学习的一个重要范式,它关注智能体如何在一系列行动中,通过与环境互动并获得奖励或惩罚来学习最优策略。其核心概念可以用马尔可夫决策过程来建模。

一个简化的目标是学习一个策略 π,以最大化累积奖励的期望值:
总奖励 = E[Σ γ^t * R_t]
其中,R_t 是t时刻的即时奖励,γ 是折扣因子。


课程概述 📋

在初步了解了强化学习后,最后我们来总览整个课程的全貌。

本课程将深入探讨机器学习的多个高级主题。我们将不仅学习算法如何使用,更将探究其背后的原理、假设和局限性。课程内容将涵盖理论推导、实践应用以及当前的研究前沿。

以下是本课程的主要安排:

  • 授课形式为录播讲座与线上同步讨论相结合。
  • 录播视频将上传至网络平台,方便大家按自己的节奏学习。
  • 每周的固定时间将进行线上同步会议,用于答疑、讨论和深入交流。

本节课中,我们一起学习了课程的基本信息、讲师介绍、机器学习的定义与简史,并初步接触了强化学习的概念,最后了解了课程的整体安排。希望这为我们的深入学习奠定了良好的基础。

002:课程引言 🎓

在本节课中,我们将了解这门高级机器学习课程的基本情况,包括授课形式、教师介绍以及课程的整体安排。


自我介绍 👨‍🏫

上一节我们介绍了课程的基本形式,本节中我们来认识一下授课教师。

我是谢尔盖。你们可以简单地称呼我为博士。我是计算机科学系的副教授,同时在T研究中心担任机器学习核心部门的主管。我拥有包括工业界和初创公司在内的广泛经验。我将尽力向你们传授或分享我对机器学习及其实际应用的兴趣与见解,并解释机器学习方法背后的一些理论或深层原理为何在学术界、工业界及任何应用场景中都至关重要。

我的办公室地址在帕克广场55号,但由于时间安排,本学期我们不太可能在那里见面。你们可以随时通过邮件向我提问。正式的“办公时间”就是我们的课堂时间。


教学助理介绍 👨‍💻

介绍完主讲教师,接下来我们认识一下本课程的教学助理。

这是我的助教,Z。同样,不太可能安排线下面谈。你们可以随时给他发邮件,他会回复并安排一对一的线上通话。


课程形式与特点 📚

了解了课程团队后,我们来看看这门课将以何种形式进行。

这些是我的讲座录像。我通常在晚上录制,因此风格和方式会与实时课堂有所不同。在课堂上,我能获得你们的反馈并与你们直接互动;而录制时,我面对的是空房间,这有时让我很难表现出兴奋感或以理想的方式传达信息。

这种方式有缺点,但也有优点。我会将所有讲座上传到YouTube,你们可以以不同的速度观看。我语速可能较慢,因此你们或许会希望以更高的速度播放。你们可以随时暂停、观看,这正是异步学习的意义所在。正如我在邮件中提到的,我们将在周二见面讨论问题。

同时,这也是一次真实的课堂体验。讲座中可能会有卡顿、重复,我不会将其剪辑成营销视频般的质量,而是保留所有的停顿和思考过程。


课程内容概览 🗺️

明确了学习形式,现在我们来预览一下本节课以及整个课程将要涵盖的内容。

本节课是导论课,我将介绍你们将学习什么,以及我在教学过程中的收获。

  1. 自我介绍:我会介绍我自己和我的背景,你们也有机会在周二的第一节课或第一次讨论环节介绍自己。
  2. 为何学习机器学习:探讨学习机器学习的动机与意义。
  3. 什么是机器学习:阐述机器学习的基本定义。
  4. 机器学习简史:回顾机器学习领域的发展历程。
  5. 强化学习初探:为了增加趣味性,我们会初步涉足强化学习。
  6. 课程概述:介绍本课程的整体安排和结构。

课堂参与要求 💻

在进入具体内容之前,最后强调一下课堂参与的要求。

我们的课程是在线同步进行的。为了营造一种现场感和人际互动,如果你进入课堂,请务必开启摄像头。我将把Zoom设置为仅显示开启视频的参与者。来到课堂却不露脸,基本上不会被计入参与。当然,你也可以预约与我进行一对一的Zoom通话,但我更希望大部分讨论能在常规的课堂时间(周二和周四的12:45至14:30)完成。


本节课中,我们一起了解了这门高级机器学习课程的授课教师、教学形式、基本要求以及第一讲的内容框架。从下节课开始,我们将正式踏入机器学习的精彩世界。

003:为什么选择机器学习 🧠

在本节课中,我们将探讨学习机器学习的几个核心原因。我们将从哲学思辨、现实应用以及社会影响等多个角度,理解这门学科的价值和意义。


哲学思辨:探索宇宙的使命 🌌

上一节我们介绍了课程背景,本节中我们来看看学习机器学习的第一个深层原因。

想象一下宇宙的尺度。如果我们将月球的大小按比例缩小到屏幕上的一个像素,那么整个太阳系的模型将变得无比空旷。以光速从太阳出发,到达水星需要3.3分钟,到达地球需要约8分钟。宇宙的本质是空旷的。

鉴于人类生理的限制,进行星际旅行是极其困难且漫长的。因此,派遣机器去探索宇宙是更可行、更经济且更人道的选择。然而,我们需要的不是普通的机器,而是智能机器,即具备人工智能、能够学习和适应的机器。

为了建造能够学习的机器,我们必须先理解机器如何学习。这就是我们需要研究机器学习这门学科的根本哲学原因之一。它关乎我们拓展认知边界、探索未知的使命。


现实需求:从海量数据中提取意义 📊

上一节我们从宏观视角探讨了学习机器学习的必要性,本节中我们来看看一个更贴近现实的实用原因。

在我们的日常生活中,尤其是在医疗健康等领域,我们希望在不进行侵入性操作的情况下收集大量数据,以了解身体的状况。通常的解决方案是收集越来越多的数据。

然而,当数据量变得极其庞大时,数据本身就成了问题。高维数据难以直观理解。我们收集了一切,然后呢?如何从这些海量数据中推断出隐藏的物理或生物规律?

此时,如果有一个助手能自动从所有数据中提取意义,那将非常理想。这个助手就是我们的机器学习解决方案——一种能够从数据中学习并提取知识的人工智能算法

因此,学习机器学习的另一个核心原因是:我们需要工具来帮助我们理解和利用日益增长的数据海洋,从而发现新知、解决问题。


社会影响:机遇、挑战与未来工作 💼

上一节我们讨论了机器学习的工具属性,本节中我们来看看它对社会和个人的影响。

媒体上充满了关于人工智能的讨论,其中不乏担忧的声音。常见的头条新闻包括“AI正在取代工作”、“自动化可能在15年内取代40%的职位”等。这引发了一个普遍的恐惧:我们会因为人工智能而失业吗?

从哲学层面探讨这种恐惧,有一个著名的思想实验叫做“回形针最大化器”。它假设我们创造了一个极其强大、目标明确的算法,其唯一目标是制造回形针。在优化这个目标的过程中,它可能会耗尽所有资源,甚至认为人类阻碍了制造回形针而消灭人类。这个论点核心是:如果我们创造的强大实体,其目标与人类福祉不完全一致,就可能带来意外风险。

然而,历史告诉我们,技术进步在淘汰旧岗位的同时,也会创造新的岗位。就像工业革命时期,人们曾恐惧机械织布机会夺走工作,但最终社会创造了更多不同类型的、更丰富的工作机会。

因此,面对机器学习与人工智能,我们不应只看到威胁,更应看到它带来的机遇和更繁荣的未来。新的工作将被创造,我们的角色将发生演变。学习机器学习,正是为了理解、塑造并引领这个未来,确保技术发展符合人类的整体利益。


总结

本节课中我们一起学习了选择研究机器学习的多重原因:

  1. 哲学使命:为了建造能够代表人类探索浩瀚宇宙的智能机器,我们必须理解机器如何学习。
  2. 现实需求:为了从现代社会中产生的海量数据中自动提取有价值的知识和规律,我们需要机器学习作为关键工具。
  3. 社会影响:理解机器学习有助于我们理性面对技术变革带来的社会挑战与就业演变,并主动参与塑造一个技术服务于人类的美好未来。

学习机器学习,不仅是掌握一项技术,更是为应对未来挑战、拓展人类可能性做好准备。

004:什么是机器学习 🧠

在本节课中,我们将要学习机器学习的核心定义、其跨学科的本质,以及它所涵盖的主要任务和学习场景。

什么是学习?

当我们思考“什么是机器学习”时,首先需要理解“学习”本身。根据维基百科的定义,学习是获取新的或修改现有的知识、行为、技能、价值观或偏好的过程,并且可能涉及综合不同类型的信息。这种能力是人类和动物所拥有的。

什么是机器学习?

根据亚瑟·塞缪尔在1959年提出的经典定义,机器学习是赋予计算机无需明确编程即可学习的能力的研究领域。这引出了编程与学习的区别。

汤姆·米切尔在1998年给出了一个更形式化的定义,很好地描述了一个学习问题:

一个计算机程序被认为从经验E中学习,针对某项任务T性能度量P,如果它在任务T上的性能(由P度量)随着经验E的增加而提高。

这个定义是否对应了我们当前的算法?是否对应了我们在处理YouTube视频、推荐系统等任务时的学习过程?我们将在本学期的学习中寻找答案。

机器学习的学科交叉性

机器学习是一门数据科学学科,从某种意义上说,它是一门综合性学科,位于多个领域的交叉点上。

以下是机器学习所结合的核心学科:

  • 统计学
  • 计算机科学
  • 优化理论

此外,机器学习还广泛借鉴了其他领域的知识,包括:

  • 人工智能
  • 贝叶斯方法
  • 计算复杂性理论
  • 信息论
  • 哲学
  • 心理学
  • 神经生物学

所有这些知识融合并锻造在一起,形成了我们今天所知的机器学习。

有些人认为机器学习只是应用统计学。这类似于说计算机科学只是应用数学。两者的主要区别在于目标:统计学更关注模型本身及其参数的意义,而机器学习更关注从数据到预测的性能,并强调计算效率、处理大数据的能力以及最终生成可执行程序的目标。

机器学习的主要任务

机器学习处理多种学习任务。以下是其中一些核心任务:

  • 分类:将实体划分到不同的类别中。例如,区分图片中是苹果还是橙子。
  • 回归:预测连续值。例如,根据照片估计一个人的年龄或体重。
  • 排序:根据偏好对项目进行排序。例如,根据用户历史行为推荐电影,或在搜索引擎中排列搜索结果。
  • 聚类:在没有监督信号的情况下发现数据中的结构,将相似的数据点分组。
  • 降维:减少数据中的噪声或冗余,将其投影到更低维度的空间以便于分析或可视化。
  • 流形学习:处理存在于某个低维流形上(而非均匀占据整个高维空间)的数据,常用于数据压缩等任务。
  • 因果学习:从观测数据中推断因果关系。例如,通过传感器数据判断是温度变化导致压力变化,还是反之。这对于在昂贵或危险环境中(如派往新星球的机器人)规划实验至关重要。

机器学习的学习场景

上述任务可以在不同的学习场景下进行。以下是几种主要的学习场景:

  • 监督学习:存在一个“教师”为每个训练样本提供明确的标签(如“这是猫”,“这是狗”)。
  • 半监督学习:只有部分数据带有标签,算法需要利用大量未标记的数据和少量标记数据进行学习。
  • 主动学习:算法可以主动选择或请求获取对学习最有帮助的数据,以提高学习效率。
  • 在线学习:数据以流的形式实时到达,算法需要边接收数据边进行学习和更新。
  • 无监督学习:没有任何标签信息,算法完全从数据本身发现模式,聚类是典型例子。
  • 自监督学习:一种特殊的无监督学习,通过将数据的一部分作为预测目标来构造监督信号。例如,在自然语言处理中,让模型预测句子中被掩盖的词语。
  • 强化学习:智能体通过与环境交互,根据稀疏的奖励或惩罚信号,学习采取一系列行动以实现目标最大化。

总结

本节课中,我们一起学习了机器学习的核心概念。我们从“学习”的定义出发,探讨了亚瑟·塞缪尔和汤姆·米切尔对机器学习的经典界定。我们了解到机器学习是一门融合了统计学、计算机科学和优化理论等多学科的综合性领域。接着,我们梳理了机器学习要解决的主要任务,如分类、回归、排序等,并介绍了这些任务得以实施的不同学习场景,包括监督学习、无监督学习、强化学习等。理解这些基础概念是进一步探索复杂机器学习算法和应用的第一步。

005:机器学习的历史 📜

在本节课中,我们将回顾机器学习发展的关键历史节点,了解它是如何从简单的概念演变为今天改变世界的强大技术。我们将从早期的感知机开始,一直讲到引发现代人工智能革命的深度神经网络。

从传说与现实谈起

上一节我们介绍了机器学习的广阔前景,本节中我们来看看它的发展历程是如何开启的。

一个著名的都市传说发生在1966年。麻省理工学院的马文·明斯基(Marvin Minsky,1969年图灵奖得主)雇佣了一名大一本科生,并给他布置了一个暑期任务:将相机连接到计算机,并让机器描述它所看到的东西。六十年后,我们才可以说基本解决了这个问题。但事实上,这并非明斯基所为,而是西蒙·派珀特(Simon Papert)雇佣了一个由10名学生组成的团队。这个任务本质上就是计算机视觉问题——一个花费了计算机视觉领域60年时间才实现的研究项目。

在计算机科学中,有时很难向他人解释“简单”任务和“几乎不可能”任务之间的区别。例如,一个客户要求:“当用户拍照时,应用应该检查他们是否在国家公园里。”程序员觉得这很简单,用地理信息系统(GIS)查一下就行。但客户接着说:“并且检查照片里是不是一只鸟。”程序员则需要一个研究团队和五年的时间。有时,这个时间是六十年。

ImageNet竞赛与深度学习的突破

那么,是什么帮助解决了图像识别的挑战呢?斯坦福大学的李飞飞教授及其团队建立了ImageNet数据集。该数据集包含约1400万张图像和22000个类别。所有图像均通过网络搜索获取,并经由人工(通过亚马逊土耳其机器人平台)仔细验证和标注。组织者还提供了图像中物体的边界框。该竞赛每年都会添加新的验证数据。

在竞赛运行期间,图像分类的错误率最初在26%左右(如下图所示),并逐年缓慢下降。

2012年,多伦多大学杰弗里·辛顿(Geoffrey Hinton)的学生亚历克斯·克里泽夫斯基(Alex Krizhevsky)发表了一篇论文。据说,亚历克斯说服了辛顿开始使用GPU,并实现了一个卷积神经网络(CNN)分类器,在ImageNet数据集上进行训练。在2012年的ImageNet竞赛中,他们的模型(后来被称为AlexNet)将错误率从约26%大幅降低至16.4%。这是一个巨大的飞跃,并立即引起了业界的关注。

此后,亚历克斯和团队在多伦多大学外成立了一家公司以转化知识产权。谷歌和微软开始竞购这家公司,最终谷歌胜出,并以高薪聘请了包括亚历克斯在内的团队成员加入谷歌大脑部门。自AlexNet以来,深度学习在工业界爆发式发展。虽然神经网络和机器学习的研究自20世纪50年代就已开始,但工业界的成功在此时才变得显著。

需要指出的是,AlexNet使用的CNN架构早在1998年就已发明。我们所有人都站在巨人的肩膀上。到2016年,仅仅四年后,ImageNet的错误率已从2011年的26%降至3.1%(如GoogleNet V4所示)。这期间发生了许多与卷积神经网络架构和大规模计算相关的进展。这是一次巨大的、 tectonic shift(构造性转变),使得“AI”一词变得司空见惯,关于机器取代人类工作的讨论也日益普遍。

这种担忧是真实的。例如,我曾在一家公司工作,用一年时间与一个五人团队几乎完全自动化了原本由人工完成的、繁琐的医疗文档信息提取和标注工作。那些不需要创造性思维、重复性的工作确实面临自动化风险。如果你计划从事仅依赖视觉系统而不需要思考或创造的工作,或许应该重新考虑职业规划。自动化的目标正是将人类从繁琐的任务中解放出来,去从事更有趣、更具挑战性和更有用的工作,比如探索太空。

神经网络架构的演进

接下来,我们具体看看推动这场革命的关键神经网络架构是如何发展的。

感知机:一切的起点

1958年,罗森布拉特(Rosenblatt)发表论文,引入了简单的线性阈值分类器——感知机。其核心是一个带偏置项的输入加权和。

公式输出 = sign(权重 · 输入 + 偏置)

其中,偏置输入始终为1,其对应的权重决定了分离超平面的位置。感知机收敛算法能够在线性可分的情况下成功分离两类数据点。我们将在课程中详细讲解这个算法。


从单层到深度网络

在感知机被提出后不久,人们立即开始探索将多个感知机堆叠成更强大的网络,以解决更复杂的问题。然而,马文·明斯基和西蒙·派珀特在《感知机》一书中证明,单层感知机无法解决一大类问题,例如异或(XOR)问题。

而堆叠起来的感知机网络(即多层网络)能够解决这些问题。其现代版本就是你可能听说过的深度神经网络。下图展示了一种称为前馈神经网络的结构,它由一系列线性变换和逐点的非线性激活函数(如Sigmoid)组成,可用于分类或回归。

卷积神经网络:为图像而生

卷积神经网络(CNN)则引入了一种针对图像的归纳偏置。它假设图像具有平移不变性:例如,图片中的猫无论出现在左上角还是右下角,它仍然是猫;边缘检测也是如此。这种结构偏置使得CNN特别适合处理图像。

一个有趣的现象是,如果随机初始化一个普通的前馈网络来处理图像,其输出是毫无意义的。但即使不经过训练,一个精心随机初始化的CNN也可能从一开始就表现出不错的准确度。这体现了其结构本身蕴含的强大先验知识。

下图所示的网络结构非常接近2012年获胜的AlexNet。

有趣之处有两点

  1. 网络的前面部分是全卷积的,仅由卷积层构成。
  2. 网络的末端再次连接了前馈层(全连接层)。

我们将在课程后期讨论,在某些网络结构中,末端可能不需要前馈连接,仅使用全卷积结构即可。

循环神经网络:处理序列数据

除了空间数据,还有像语音、文本、语言以及许多科学时间序列这样的序列数据。为此,循环神经网络(RNN)应运而生。

RNN是功能极其强大的工具,理论上可以计算任何可计算的问题,是图灵完备的。但由于其循环步骤的特性(下一步计算必须在前一步完成后才能进行),它可能并非总是最高效的,这与可以高度并行化的CNN不同。尽管如此,RNN仍然是一个重要且强大的模型,即使目前Transformer等架构在某些领域占据主导,我们也不应忽视RNN的能力。

监督学习的主导与未来方向

需要指出的是,上述自2012年以来的工业界(及部分学术界)成功,主要归功于监督学习。从AlexNet团队被收购开始,整个领域完善得最好的就是监督学习。

当然,也有许多其他方向的尝试和努力,例如:

  • 变分自编码器(VAE)
  • 贝叶斯优化
  • 生成对抗网络(GAN)

但目前,当我们拥有带标签的数据集(即每个样本 x_i 都有对应的标签 y_i)时,最有效的方法仍然是基于反向传播的监督学习。

然而,机器学习的内涵远不止监督学习。近年来,在自监督学习强化学习等领域也取得了显著成功,这些方向超越了传统监督学习的范式,也是本课程后续希望涵盖的内容。

总结

本节课中,我们一起学习了机器学习,特别是深度学习的关键发展历史。我们从感知机的诞生讲起,经历了由于理论局限而导致的寒冬,再到通过ImageNet竞赛和AlexNet实现突破的“复兴”时代。我们了解了不同神经网络架构(如前馈网络、CNN、RNN)为解决特定类型问题(如图像、序列)而引入的归纳偏置。最后,我们认识到当前的成功很大程度上建立在监督学习的基础上,但更广阔的学习范式正在蓬勃发展。理解这段历史,有助于我们把握当下技术的来龙去脉,并展望未来的无限可能。

006:强化学习 🎮

在本节课中,我们将要学习强化学习的基本概念。强化学习是机器学习的一个重要分支,它考虑的问题与监督学习有很大不同。我们将通过回顾其发展历程和几个标志性应用,来理解强化学习的核心思想和工作原理。

强化学习的基本框架

上一节我们介绍了本课程的主题。本节中我们来看看强化学习与传统监督学习的核心区别。

在监督学习中,算法或“大脑”只被展示一个输入样本和一个对应的标签。算法的目标是学习从输入到正确输出的映射。其过程可以概括为:给定输入 x,预测输出 y

强化学习的情况则不同。在强化学习中,算法的输出是智能体在世界中采取的一个动作。这个动作会改变世界的状态,智能体随后会观察到状态的变化,并收到一个奖励信号(可以是正数或负数)。简而言之,强化学习是智能体通过与环境交互,根据获得的奖励来学习如何采取行动以最大化长期收益的过程。

深度强化学习的崛起:从游戏到现实

强化学习已经存在了一段时间,萨顿和巴尔托的著作曾非常流行。大约20年前,它与马尔可夫决策过程一起是一个研究领域。后来,就像深度学习一样,当它不再那么“时尚”时,人们的兴趣有所减退。但并非所有人都放弃了它。

一个值得提及的、近期的重要突破来自DeepMind。在2015年左右,这家后来被谷歌收购的英国公司开始研究如何让算法玩雅达利游戏。他们的系统仅以屏幕像素作为输入,以游戏得分作为奖励信号,通过卷积神经网络来做出决策(例如控制摇杆上下左右或按键)。

以下是该系统的核心流程:

  1. 输入:游戏屏幕的像素图像。
  2. 处理:图像经过卷积神经网络和全连接层。
  3. 输出:决定摇杆的动作(上、下、左、右、开火等)。
  4. 反馈:系统执行动作后,立即观察世界状态的变化和获得的分数。
  5. 目标:通过反向传播等方法,训练系统以最大化游戏得分。

DeepMind成功证明,借助卷积神经网络、深度学习和端到端训练,可以训练出一个模型来玩多种雅达利游戏,并且在许多游戏上达到超越人类的水平。

案例分析:算法如何学会游戏策略

让我们通过两个具体例子,看看强化学习算法是如何从零开始学习复杂策略的。

例子一:打砖块(Breakout)
算法在训练初期只是试图把球挡回去,表现不佳。但经过大约240分钟(半天)的训练后,算法发现了一个高效策略:它学会了先将砖块墙的侧面打开一个通道,让球进入墙后区域,从而可以连续得分。这个策略完全是通过观察像素和最大化分数这一目标自我探索出来的。

例子二:海底冒险(Seaquest)
在这个游戏中,算法看到的同样是像素画面和数字分数。它学会了控制潜艇上浮获取氧气。算法并没有被告知“氧气”的医学价值,它仅仅知道,如果不获取氧气,就无法最大化游戏得分(因为角色会死亡导致游戏结束)。这展示了强化学习智能体能够发现环境中对达成目标至关重要的隐藏因素。

这些突破为后来创造AlphaGo(战胜世界围棋冠军)、AlphaZero(在围棋、象棋等领域达到超越想象的超高水平)以及后续的AlphaStar等奠定了基础。

强化学习在机器人控制中的应用

强化学习的另一个重要应用领域是机器人学。目标是在现实世界的机器人操作中应用强化学习,这有助于我们更好地理解诸如手术后身体机能恢复等问题。因为,形式化一个学习如何走路的算法,远比形式化一个学习如何做乘法的算法要复杂。

以下是一个来自NIPS竞赛的机器人控制示例:

  • 任务:训练一个模型来控制图中骨架的肌肉,使其尽可能行走得更远。
  • 观察:虽然行走姿态还不完全像人类,但模型确实学会了行走,这非常了不起。
  • 成果:这项工作在当年竞赛中获得了第三名,次年相关研究更是取得了第二名的好成绩。

看起来,神经网络能够帮助我们至少完善如何学习复杂运动技能这一过程。

总结 🎯

本节课中我们一起学习了强化学习。我们了解到强化学习与监督学习的根本区别在于,智能体通过与环境交互并根据奖励信号来学习行动策略。我们回顾了深度强化学习在雅达利游戏上取得的突破性进展,看到了算法如何从像素输入中自我学习出高级游戏策略。最后,我们也探讨了强化学习在机器人控制等现实世界问题中的应用潜力与挑战。强化学习展示了一种让机器通过试错来自主学习复杂技能的强大范式。

007:课程概述 📚

在本节课中,我们将了解这门高级机器学习课程的整体规划、涵盖的核心主题、课程结构以及评分方式。

课程内容概览

历史回顾到此为止。接下来,我们将聚焦于课程本身。本课程将涵盖哪些内容?

我计划讲解学习理论的基础知识,以便我们理解什么是学习,以及如何在机器学习中具体实现它。

我们还将深入探讨一系列我认为最重要或更高级的算法。理解这些算法的工作原理,对于你理解其他学习算法的推理和思考方式至关重要。

此外,我会穿插介绍该领域在经典机器学习方法基础上取得的最新进展。这包括一些你可能最近才接触到的概念。例如,随机梯度下降(SGD)可能是你现在唯一了解的优化方法,但请相信,它并非一直是首选或唯一的优化算法。

在优化方面,我们最近认识到,局部最小值这个“大敌”在过参数化模型中并不像看起来那么糟糕,只要我们能够保证收敛。另一个重要概念是偏差-方差权衡。我们最近发现,仅仅讨论偏差-方差权衡是一个不完整的故事。还有一点是,强化学习可能并不完全像人们想象的那样。除非我们进度非常快,否则本课程可能不会深入讲解强化学习,但了解它对你完成项目或许有帮助。

核心算法与技能

如果要用一张幻灯片列出所有基础核心算法,我会这样安排。

我们将花相当多的时间探讨“什么是学习?”这个问题,并深入学习理论。

我们将详细讲解各种学习算法,包括感知机、逻辑回归和支持向量机,以帮助你深入理解线性模型背后的原理。

我们还将讨论参数优化,包括梯度下降、最大似然估计和最大后验估计。我们会有一节专门讲解SGD,并探讨强大的梯度计算,这是所有使用过深度学习框架(如PyTorch或TensorFlow)的人都熟悉的。我推荐使用PyTorch进行研究,它更易于上手;但如果是工业部署,TensorFlow的优化更好。

需要强调的是,本课程不会教授编程或“乐高式”的代码拼接。我的目标是让你在课程结束后,理解现代机器学习、工业应用及研究背后的基本原理。了解算法决策和失败背后的驱动因素,对于你解决问题、成长为优秀的问题解决者至关重要,这无论对工业界还是学术界的职业发展都大有裨益。

此外,本课程还会讲解如何处理数据、各种主要的正则化算法,以及用于建模数据集的非线性模型、分类器和核密度估计等。

课程结构与评分

以下是讲座的概览和评分方式。如果你没读我的邮件,我需要再重复一遍:请尽快将你的成绩报告昵称发给我。

课程评分包含以下几个部分:测验、作业、项目和考试。我们将有两次考试、一个项目和大约五次作业。

关于测验
由于采用异步授课模式,为了确保大家学习了课程内容,我会设置简单的测验。这些测验主要考察对讲座基本内容的理解,并非深度考试。测验也给我机会加入一些“彩蛋”问题。测验成绩占总评的10%。总共有24次测验,采用二进制评分(即只有对错,没有部分分数)。如果答错超过30%的测验题目(即大约8次或更多测验不及格),你将在总评中失去这10%的分数,这意味着最高成绩可能仅为B。请认真对待测验。

关于作业
作业可以合作讨论,但严禁抄袭。一旦发现抄袭,将按教学大纲处理,成绩为零。作业是你理解知识、与同学交流解决问题的机会,请不要在截止前匆忙抄袭。作业需要使用Python完成,并使用LaTeX编写数学公式。

关于考试
理想情况下,考试应在无书无笔记的环境下进行,以检验真实掌握程度。考虑到异步授课,我可能会调整形式,但很可能仍会是限时答题或选择题形式。

关于项目
项目为你提供了应用课堂所学、并探索超越课程内容的方法的机会。它更具创造性,能帮助你理解理论如何映射到实践。项目应该是有趣的,具体细节我将在后续讲座中介绍。

关于成绩排名
请尽快将你的私人昵称发给我。我将公布按成绩排序的名单(仅显示昵称),以便你了解自己在班级中的相对位置。希望这能激发一些良性竞争,但请专注于自身的学习和进步。

先修要求与教材

先修知识
你需要具备使用编程语言(特别是Python)的能力、以及微积分、线性代数、优化理论、概率论与统计学的基础知识。我可能会安排一次复习讲座,但这不足以弥补相关知识的完全缺失。如果你对这些主题不熟悉,请提前复习。

参考教材
我不会只依赖一本教材,而是会综合多种资源,并在幻灯片中提供链接。课程理论部分主要参考《Understanding Machine Learning》一书。此外,还会参考Christopher Bishop的《Pattern Recognition and Machine Learning》、Goodfellow等人的《Deep Learning》、David MacKay的《Information Theory, Inference, and Learning Algorithms》(可免费获取PDF),以及《Data Science for Business》。最后一本对于想了解机器学习在工业界实际应用的同学非常有帮助。


本节课中,我们一起学习了本课程的整体框架、将要探讨的核心机器学习理论与算法、详细评分规则以及所需的先备知识与教材。希望这为你接下来的学习提供了清晰的路线图。

008:项目概述 🎯

在本节课中,我们将学习课程项目的核心目标、结构、流程与交付要求。项目旨在将理论知识应用于实践,通过团队协作解决真实的机器学习问题。

项目的重要性与理念

机器学习是一门理论与实践紧密结合的学科。仅仅理解偏差-方差权衡或知道需要划分测试集是不够的。项目中包含大量难以在课堂讲授的“隐性知识”,这些知识只能通过动手实践来掌握。项目正是为了让你“在做中学”,体验那些无法在常规课程中直接传授的经验。

上一节我们介绍了项目的核心理念,本节中我们来看看项目的具体运作模式。

一个典型的机器学习项目可以类比为“精益创业”或“科学方法”。其核心在于持续的迭代开发与实验。这个过程可以概括为一个循环:

  1. 提出想法。
  2. 快速构建一个可运行的模型。
  3. 测试你的假设。
  4. 测量性能。
  5. 分析数据。
  6. 从中学习。
  7. 进行迭代改进。

项目就是让你反复经历这个实验循环。

项目流程详解

了解了迭代开发的概念后,我们来具体拆解一个机器学习项目的标准步骤。

以下是项目从开始到结束的完整流程:

  1. 定义任务:明确你要解决的预测或识别问题。
  2. 收集数据:获取原始数据。强烈建议选择Kaggle等平台的公开竞赛数据。
  3. 数据预处理与特征工程:清洗数据,并将其转换为算法能够有效处理的格式(例如,处理高维数据 X ∈ ℝ^(n×d))。
  4. 建立基线模型:首先构建一个简单的模型(例如,逻辑回归或支持向量机),以获得一个初步的性能基准。切勿一开始就尝试最前沿的复杂模型
  5. 模型比较与选择:尝试更优的模型,并使用统计方法(如假设检验)与基线模型进行严谨比较,确保性能提升不是噪声所致。
  6. 迭代优化:将选出的更好模型作为新的基线,重复“优化-测试-分析”的循环。
  7. 模型部署与评估:产出最终模型,并在测试集或竞赛平台上评估性能。
  8. 监控与重新定义:根据评估结果,可能需要重新审视任务或收集新数据,开启新的循环。

项目执行指南

明确了流程后,我们需要知道如何具体组织和管理一个项目。

项目的具体执行应遵循以下步骤:

  • 始于一个有趣的预测问题:将其形式化为监督学习任务。
  • 组建团队:团队人数应为4到6人。目的是学习协作。
  • 创建团队GitHub仓库:所有代码必须清晰、可复现,并托管在GitHub上。
  • 获取与预处理数据:进行特征提取,将数据表示为适合算法的形式。
  • 选择基线模型:使用一个简单、你熟悉的模型快速获得初步结果。
  • 实验、比较与迭代:尝试更好的模型,与基线比较,不断优化。
  • 最终呈现与答辩:向全班展示并答辩你们的最佳模型。

项目时间线与里程碑

为了确保项目顺利进行,我们设定了明确的时间节点。

以下是项目的重要截止日期与要求:

  • 9月10日:提交个人项目构想(一页纸描述)。内容需包括:问题描述、数据来源、预测目标,以及为何该问题适合本课程。
  • 9月24日:最终确定团队成员名单。
  • 10月8日:项目中期检查,进行10分钟简短汇报。
  • 12月2日:提交最终项目报告、代码和最终演示幻灯片。

项目交付物与评估

最后,我们来明确需要提交什么以及如何获得好成绩。

必须提交的交付物包括:

  1. 最终报告:一篇按NeurIPS会议格式撰写的学术论文,包含摘要、引言、方法、实验、结论和参考文献。
  2. 代码仓库:公开的GitHub仓库链接,展示清晰的版本控制记录(如使用分支、Pull Request和代码审查)。
  3. 最终演示幻灯片:用于期末项目展示。

额外加分项建议:

  • 项目管理看板:使用Trello、Jira等工具管理任务分工与进度。
  • 参与Kaggle竞赛:强烈建议将项目与Kaggle竞赛结合。若能取得好名次或发现科学创新点,将是极大的亮点,甚至有机会共同撰写学术论文。

本节课中我们一起学习了机器学习课程项目的完整框架。我们明确了项目通过“迭代实验”连接理论与实践的核心理念,拆解了从定义问题到部署模型的标准流程,并了解了具体的时间安排、团队管理方法和最终交付要求。记住,从简单的基线模型开始,持续迭代,并善用团队协作与项目管理工具,是项目成功的关键。

009:学习问题的形式化 🧠

在本节课中,我们将学习如何形式化一个机器学习问题。我们将从一个简单的例子出发,定义学习任务中的关键组成部分,并理解“真实损失”与“经验损失”的区别,以及为什么直接优化经验损失可能导致过拟合。

问题设定 🍈

想象你刚抵达一个太平洋小岛。你很快发现木瓜是当地饮食的重要食材。然而,你从未品尝过木瓜。你现在需要学习如何预测市场上看到的木瓜是否美味。

首先,你需要决定预测应基于木瓜的哪些特征。根据你之前对其他水果的经验,你决定使用两个特征来简化说明:颜色(从深绿到橙红再到深棕)和软硬度(从坚硬如石到软烂如泥)。

你的学习输入是一组你已经检查过颜色和软硬度、并品尝过以确定是否美味的木瓜样本。假设你尝试了大约10到15个木瓜。

任务分析 📝

我们的任务是学习一个木瓜分类器。通过分析这个任务,我们将看到学习理论的一些形式化概念。

形式化定义

以下是学习问题的数学形式化:

  • 域(Domain Set):记作 X。这是我们所有可能的数据样本(木瓜)的集合。
  • 标签集(Label Set):记作 Y。在我们的例子中,Y = {0, 1},其中 1 代表美味,0 代表不美味。
  • 训练集(Training Data):记作 S。这是一个由 m 个样本-标签对组成的序列:S = ((x1, y1), ..., (xm, ym))。每个 xi 属于 X,每个 yi 属于 Y
  • 学习器(Learner):这是一个算法或过程,其输入是训练集 S
  • 假设/预测器/分类器(Hypothesis / Predictor / Classifier):记作 h。这是学习器的输出。它是一个从域 X 映射到标签集 Y 的函数:h: X -> Y。对于给定的木瓜特征 xh(x) 预测其标签。
  • 数据生成模型(Data-Generation Model):我们假设数据由一个未知的分布 D 生成,并且存在一个未知的“真实标记函数” f: X -> Y,它能对任何可能的木瓜 x 给出绝对正确的标签 f(x)

上一节我们介绍了学习问题的基本组成部分,本节中我们来看看如何衡量一个学习器的成功与否。

衡量成功:真实损失与经验损失 ⚖️

为了评估我们的分类器 h 的好坏,我们需要一个衡量标准。

真实损失(True Error / Generalization Error)

如果我们知道所有可能的数据和真实标记函数 f,我们可以定义 真实损失 L(D, f)(h)。它衡量的是,当从分布 D 中随机抽取一个样本 x 时,我们的分类器 h 预测的标签 h(x) 与真实标签 f(x) 不同的概率。

用公式表示为:
L(D, f)(h) = P(x ~ D)[h(x) ≠ f(x)]

这个损失也称为泛化误差或风险。它是我们最终关心的指标,因为它反映了分类器在未知数据上的表现。

经验损失(Empirical Error)

然而,在现实中,我们无法获得全部数据,也不知道 fD。我们只有有限的训练集 S。因此,我们只能计算在训练集 S 上的误差,即 经验损失 LS(h)

经验损失定义为分类器 h 在训练集 S 上犯错的样本比例:

LS(h) = (1/m) * Σ_{i=1 to m} [h(xi) ≠ yi]

其中 [.] 是指示函数(如果括号内条件为真则值为1,否则为0)。

一个自然的想法是:让学习器找到一个能在训练集 S 上最小化经验损失 LS(h) 的假设 h。这个过程称为 经验风险最小化(Empirical Risk Minimization, ERM)

过拟合问题与归纳偏置 🚧

那么,直接进行经验风险最小化就足够了吗?让我们看一个例子。

假设所有美味的木瓜(标签为1)在特征空间(颜色 vs. 软硬度)中恰好落在一个正方形区域内,不美味的木瓜(标签为0)在区域外。这就是真实的 f

现在我们收集了一个训练集 S,用蓝色方块(美味)和红色圆圈(不美味)表示。一个非常“灵活”的学习器可能会选择这样的分类器 h只有当新样本的特征与训练集中某个样本完全相同时,才输出该样本的标签;对于其他任何新样本,一律输出0

这个分类器在训练集 S 上的经验损失 LS(h) 是完美的 0。但是,它的真实损失 L(D, f)(h) 会非常高,因为它对所有不在训练集中出现的新样本(即使它们落在美味正方形内)都预测为0。这就是 过拟合(Overfitting):分类器在训练数据上表现完美,但在未知数据上泛化能力很差。

为了解决过拟合,我们不能让学习器自由选择任何可能的函数 h。我们需要引入一些约束或偏好,引导学习器选择“更简单”或“更平滑”的假设。这种对假设空间的约束或偏好就称为 归纳偏置(Inductive Bias)

例如,我们可能限制学习器只能选择“在特征空间中画一条直线(或一个矩形)来区分美味和不美味木瓜”的假设。这样,即使训练数据不是完美线性可分的,学习器也会找到一个在训练集上错误不太多、同时更可能泛化到新数据的假设。

总结 📚

本节课中我们一起学习了机器学习问题的形式化框架:

  1. 我们定义了一个学习任务的核心要素:域 X、标签集 Y、训练集 S、学习器以及假设 h
  2. 我们区分了真实损失(在全部数据分布上的期望误差)和经验损失(在有限训练集上的观测误差)。
  3. 我们了解到,直接最小化经验损失(ERM)可能导致过拟合,即模型记住了训练数据但未能捕捉潜在规律。
  4. 为了解决过拟合,需要引入归纳偏置,即对学习器可以选择的假设类型施加合理的限制,以促进泛化。

理解这些基础概念是构建和评估有效机器学习模型的第一步。在接下来的课程中,我们将探讨如何设计具有良好归纳偏置的学习算法,并理论分析其泛化误差的边界。

010:归纳偏置 🧠

在本节课中,我们将要学习一个核心概念——归纳偏置。我们将通过观察动物学习的行为来理解这个概念,并探讨如何在机器学习中应用归纳偏置来防止模型过拟合,从而提升其在未知数据上的表现。

什么是归纳偏置?

让我们从一些例子开始。有一种现象叫做“味觉厌恶”,在老鼠身上被观察到。我们正在构建学习器,关注动物或其他成功学习者的学习方式是有益的。根据维基百科,学习能力目前仅被人类和动物所证实。

当老鼠遇到一种新食物时,它会先尝试一点点,然后观察自身反应,比如是否会感到恶心或不适。如果感觉不好,它就再也不会碰那种食物了。这里存在一个试错学习过程。在开始大量进食前,它们通过先尝试少量来避免被坏食物毒害。

动物学习中的归纳推理

大多数生物都存在类似的学习行为。例如,鸽子能快速将按压杠杆与获得食物联系起来。但如果一个计时器每20秒自动释放一粒种子,鸽子就会开始疑惑:“我做了什么才得到了这个?”如果它当时正在拍打翅膀,它就会继续拍打,坚信自己的动作对结果有决定性影响。我们称之为“鸽子迷信”。

所以,老鼠尝试一点食物,然后对食物做出结论。鸽子(在这个实验中)也在尝试。它们也努力获取食物,但它们更多地是观察,而非主动尝试(尽管它们也会,它们是聪明的鸟)。关键点在于,这两种动物——老鼠和鸽子——都实践着一种叫做归纳推理的思维过程。

归纳推理类似于数学归纳法:从小的、局部的观察出发,假设情况不会发生进一步变化,从而得出普遍结论。老鼠的归纳推理是:如果尝试食物后感觉不好,它们就假设这类食物永远对它们有害。反之,如果食物美味无害,它们就认为这种食物永远是好吃的。鸽子的故事略有不同:它们会越来越多地重复在好事发生时所做的动作,试图强化这种关联。

行为塑造与条件反射

让我们切换到行为主义之父斯金纳观察鸽子行为的另一个视频。通过即时强化(例如给予食物奖励),可以塑造鸽子的行为,让它完成特定的动作,比如转圈。关键在于,通过立即添加某种条件或强化,可以让鸟学会有趣的把戏或行为。

那么,老鼠的迷信和条件反射呢?我们能否在它们尝试食物时电击它们,让它们不喜欢并避开那种食物?是的,实验室里可以进行各种负向条件反射实验。但研究人员观察到,只有当老鼠出现类似食物中毒的问题(如恶心)时,它们才会将食物与中毒负面关联起来。否则,即使研究人员对它们施加了不好的刺激,它们也会继续吃。这很有趣:鸽子容易“过拟合”(迷信无关动作),而老鼠在这个特定例子中却不会。

机器学习中的归纳偏置

那么,我们能从这两种动物身上学到什么?具体来说,能从老鼠身上学到什么?在我们的机器学习模型中,我们希望学习器不要对假设或分类器“过拟合”。一个解决方案,也是我们今天要考虑的方案,是在受限的假设空间中进行搜索

我们将预先选择一个假设类。不是让学习器选择任何可能的最小化经验风险的分类器,而是规定:只能从这个特定的类别中选择一个预测器 h,使其最小化经验风险。

公式: h* = argmin_{h ∈ H} R_emp(h)

通过这种方式,我们引入了归纳偏置,将学习器限制在特定的预测器集合中。我们希望学习器学习到的预测器,在未见过的样本上能有更好的推理表现,这就是它被称为“偏置”的原因。

当然,还有其他形式的归纳偏置:

  • 最大条件独立性:在贝叶斯框架中,尝试最大化条件独立性。朴素贝叶斯分类器就使用了这种偏置,我们将在本课程中涵盖。
  • 最小交叉验证误差:这也是一种归纳偏置。
  • 最大间隔:另一种归纳偏置,我们同样会在本课程中学习。
  • 最小描述长度:可能是一种归纳偏置,类似于奥卡姆剃刀原理。
  • 最小特征数:例如在特征选择中。
  • 最近邻:k-近邻算法也隐含了一种归纳偏置。

目前,我们只需知道,有限的假设类将帮助我们避免过拟合。它是一种帮助我们避免过拟合的归纳偏置。

总结

本节课中,我们一起学习了归纳偏置的概念。我们通过老鼠和鸽子的学习行为,理解了归纳推理在生物学习中的作用。在机器学习中,归纳偏置是通过限制模型的假设空间(例如选择一个特定的假设类 H)来引入的,其核心目的是防止过拟合,引导模型学习到更具泛化能力的规律。除了有限假设空间,还有许多其他形式的归纳偏置(如最大间隔、条件独立性等),它们共同构成了机器学习算法设计中的重要指导思想。

011:我们能否限制错误概率?🔬

在本节课中,我们将探讨一个核心问题:在机器学习中,我们能否从理论上限制分类器的错误概率?我们将基于已建立的损失函数、归纳偏置和有限分类器集合等概念,推导出一个关键的概率上界。


上一节我们介绍了学习问题的基本框架。本节中,我们来看如何为分类器的错误概率建立一个理论边界。为此,我们需要引入两个关键假设。

核心假设

以下是推导所需的基本假设:

  1. 可实现性假设:我们假设在有限的可能分类器集合 H 中,存在一个最优分类器 h,其真实损失为零。这意味着,对于从数据分布 D 中采样的、由真实标记函数 f 标记的样本,有 **L(h) = 0**。这保证了在我们的假设类中存在一个完美的解。

  1. 独立同分布假设:训练集中的样本是独立同分布的。我们记训练集 S 是从分布 D 中独立采样 m 次得到的,即 S ~ D^m

置信度与精度参数

由于风险 L 依赖于随机采样的训练集 S,它是一个随机变量。有些训练集可能不具有代表性(“坏”样本)。为此,我们引入两个参数:

  • 置信度参数 Δ:我们以 1 - Δ 的概率确信能够从训练集中学到一个好的分类器。Δ 代表了得到“坏”训练数据(导致学习失败)的概率。
  • 精度参数 ε:这是我们能容忍的错误上限。当损失 L 小于等于 ε 时,我们认为学习是成功的;当损失大于 ε 时,则认为失败。

Δε 都在区间 (0, 1) 内。

定义“坏”的集合

我们的目标是上界化得到一个“坏”训练集的概率,即导致学习到的分类器损失 L > ε 的训练集。

首先,定义“坏”假设的集合 H_bad
H_bad = { h ∈ H | L(h) > ε }

接着,定义“误导性”样本集 M。一个训练集 S 是误导性的,如果存在一个“坏”假设 h ∈ H_bad,但在 S 上的经验损失却为零:
M = { S | ∃ h ∈ H_bad, L_S(h) = 0 }

根据可实现性假设,存在一个 h* 使得 L_S(h*) = 0。因此,如果我们的学习算法(例如经验风险最小化)选择了一个假设,其经验损失为零但真实损失却 > ε,那么这个假设必然属于 H_bad,且其训练集 S 必然属于 M

由此可得一个关键关系:导致失败(L > ε)的训练集集合,是误导性样本集 M 的一个子集。

推导概率上界

我们希望上界化 P( L > ε )。根据上述关系,有:
P( L > ε ) ≤ P( M )

现在,我们将 M 重写为所有“坏”假设对应的零经验损失事件之并集:
M = ∪_{h ∈ H_bad} { S | L_S(h) = 0 }

应用并集上界,可得:
P( M ) ≤ Σ_{h ∈ H_bad} P( L_S(h) = 0 )

对于某个固定的“坏”假设 h ∈ H_bad,其经验损失为零的概率为:
P( L_S(h) = 0 ) = P( ∀ i ∈ [m], h(x_i) = f(x_i) )

由于样本是独立同分布的,这个联合概率等于每个样本上概率的乘积:
P( L_S(h) = 0 ) = Π_{i=1}^m P( h(x_i) = f(x_i) )

对于“坏”假设 h,其预测正确的概率为 1 - L(h)。因为 L(h) > ε,所以 1 - L(h) < 1 - ε。因此:
P( L_S(h) = 0 ) ≤ (1 - ε)^m

利用不等式 1 - ε ≤ e^{-ε},我们可以得到一个更紧凑的上界:
P( L_S(h) = 0 ) ≤ e^{-ε m}

最终定理

将上述结果代回并集上界,并注意到假设类 H 的大小为 |H|,而 H_badH 的子集,我们得到最终的概率上界

P( L > ε ) ≤ |H| * e^{-ε m}

这个公式就是著名的可学习性边界(在有限假设类且满足可实现性假设下)。它表明,失败的概率被假设类的大小 |H|、我们期望的精度 ε 以及训练样本数量 m 所控制。


本节课中我们一起学习了如何为机器学习分类器的错误概率建立理论边界。我们引入了可实现性和独立同分布假设,定义了置信度与精度参数,并通过分析“坏”假设与“误导性”样本集的关系,最终推导出了关键的不等式:P( L > ε ) ≤ |H| * e^{-ε m}。这个边界清晰地展示了假设空间复杂度、样本数量与学习效果可靠性之间的权衡关系。在下一讲中,我们将探讨这个边界的重要性,以及如何利用它来指导我们从数据中学习模型。

012:P12_讲座2的主要定义

在本节课中,我们将继续形式化学习问题。我们将介绍PAC学习模型,并探讨通过一致收敛进行学习的方法。

回顾基础 🧠

上一节我们形式化了学习问题。现在,我们来快速回顾一下上一讲的主要内容。

学习问题的设定包含以下核心概念:

  • 输入空间:记作 X,是所有可能数据样本的集合。
  • 标签集:记作 Y,是所有可能标签的集合,例如 {0, 1}{-1, +1}
  • 训练数据:记作 S,是一个由 m 个样本-标签对组成的序列,即 S = ((x_1, y_1), ..., (x_m, y_m)),其中 (x_i, y_i) ∈ X × Y
  • 学习器:是我们的学习算法,它接收训练数据 S 并输出一个假设 h。这个假设是一个函数(分类器或预测器),可以对新的输入 x 预测其标签 h(x)
  • 数据生成模型:我们假设存在一个数据分布 D 和一个未知的真实标记函数 f: X -> Y。数据样本 xD 生成,其真实标签为 f(x)
  • 泛化误差:记作 L_D(h),是假设 h 相对于真实数据分布 D 和真实函数 f 的误差。其定义为 L_D(h) = Pr_{x~D}[h(x) ≠ f(x)]
  • 经验误差:记作 L_S(h),是假设 h 在训练集 S 上的误差。其定义为 L_S(h) = (1/m) * Σ_{i=1}^{m} 1_{h(x_i) ≠ y_i}

我们的目标是找到一个假设 h,使其泛化误差 L_D(h) 尽可能小。然而,我们只能直接计算和最小化经验误差 L_S(h),这个过程称为经验风险最小化

过拟合与假设 🎯

上一节我们还讨论了过拟合现象。过拟合是指学习器在训练集上表现完美(经验误差很低),但在新数据上表现不佳(泛化误差很高)。

为了应对过拟合并确保学习是可能的,我们引入了两个关键假设:

  1. 可实现性假设:我们假设在假设集合 H 中存在一个完美的假设 h*,其泛化误差为零,即 L_D(h*) = 0。这意味着学习问题本身有解。
  2. 独立同分布假设:训练集中的所有样本都是独立地从同一个数据分布 D 中抽取的。

此外,我们引入了两个参数来量化学习目标:

  • 精度参数 ε:表示我们可接受的误差上限。我们希望学习到的假设 h 满足 L_D(h) ≤ ε
  • 置信参数 δ:表示算法失败(即输出一个泛化误差大于 ε 的假设)的概率上限。我们希望这个概率不超过 δ

上一讲的结论是,获得非代表性样本(即导致学习失败)的概率 δ,其上界与假设集合的大小 |H|、样本数量 m 以及精度参数 ε 有关。

引入PAC学习模型 📚

基于以上回顾,本节我们将正式引入可能近似正确学习模型。

PAC学习模型为我们提供了一个严格的框架,用以衡量一个学习算法在概率意义下能否成功找到一个近似正确的假设。具体来说,一个算法是PAC可学习的,如果对于任意分布 D 和任意目标概念 f(在可实现性假设下),该算法能够以高概率(至少 1 - δ)输出一个假设 h,使得其泛化误差 L_D(h) 小于等于 ε

以下是PAC学习的关键要素:

  • 样本复杂度:为了达到 (ε, δ) 的保证,算法所需的最小训练样本数 m
  • 计算效率:算法在多项式时间内运行的能力。
  • 假设类:算法从中选择假设的集合 HH 的大小和复杂度直接影响学习的难度。

通过一致收敛进行学习 🔄

上一节我们介绍了经验风险最小化,但如何保证最小化经验风险能得到泛化性能好的假设呢?本节我们来看看一致收敛的概念。

一致收敛是指,当训练样本足够多时,所有假设 h ∈ H 的经验误差 L_S(h) 都会以高概率接近其真实泛化误差 L_D(h)。如果一致收敛成立,那么最小化经验误差的假设,其泛化误差也必然接近最优。

以下是保证一致收敛的条件:

  • 有限假设空间:当假设集合 H 的大小有限时,我们可以推导出样本复杂度 m 的一个上界,该上界保证了对于给定的 (ε, δ),一致收敛以高概率发生。
  • 霍夫丁不等式:这是推导上述样本复杂度上界的核心概率工具。它描述了独立随机变量之和与其期望值偏差的概率界限。

利用一致收敛,我们可以证明,在有限假设空间且满足可实现性假设的条件下,经验风险最小化算法是一个PAC学习算法。

总结与展望 🏁

本节课我们一起学习了机器学习理论的基础。我们首先回顾了学习问题的形式化定义,包括输入空间、标签集、训练数据、学习器、泛化误差和经验误差等核心概念。

接着,我们探讨了过拟合问题,并引入了可实现性假设和独立同分布假设作为学习可行的前提。在此基础上,我们正式定义了PAC学习模型,该模型用精度参数 ε 和置信参数 δ 来量化学习算法的成功标准。

最后,我们介绍了通过一致收敛来保证学习理论可靠性的思路。当假设空间有限时,足够多的训练样本可以确保所有假设的经验误差都接近其泛化误差,从而使经验风险最小化成为一个有效的PAC学习策略。

在接下来的课程中,我们将探讨当假设空间无限时,如何利用如VC维等更复杂的工具来分析学习问题。

013:通过一致收敛学习

在本节课中,我们将学习一个称为“一致收敛”或“通过一致收敛学习”的重要工具。我们将了解如何确保经验风险是真实风险的良好近似,从而证明一个假设类是可学习的。

上一节我们介绍了有限假设类的可学习性,以及如何在更一般的损失函数下定义不可知PAC可学习类。本节中,我们来看看如何通过“一致收敛”这一通用工具来确保学习算法的有效性。

我们接收一个训练集 S。因为我们的假设类 H 是有限的,所以我们可以通过暴力枚举简单地遍历假设集中的所有可能假设 h,评估其经验损失,并返回使经验损失最小化的那个假设 h。原则上,我们希望经验损失的最小化器同时也是真实损失的最小化器,或者至少与之接近。

非正式地说,这相当于证明:对于有限假设类中的所有假设,其经验风险都是真实风险的良好近似。如果我们能证明这一点,那么我们就知道这个类是可学习的。

定义:ε-代表性样本

以下是ε-代表性样本的正式定义。

一个训练集 S 被称为关于域 Z、有限假设集 H、广义损失函数 L 和数据分布 Dε-代表性样本,如果对于假设集 H 中的所有假设 h,其经验损失与真实损失之差的绝对值小于等于 ε。

用公式表示如下:

对于所有 h ∈ H, | L_S(h) - L_D(h) | ≤ ε

从代表性到可学习性

现在,假设我们的训练集 S(ε/2)-代表性 的。那么,在该训练集 S 上输出的经验风险最小化解(记作 h_S)满足以下不等式:

L_D(h_S) ≤ min_{h' ∈ H} L_D(h') + ε

这正是不可知PAC可学习性的定义。我们来证明一下。

证明
根据 (ε/2)-代表性样本的定义,对于所有 h ∈ H,有:

| L_S(h) - L_D(h) | ≤ ε/2

这意味着:

L_D(h) - ε/2 ≤ L_S(h) ≤ L_D(h) + ε/2
    (1)

h* 为真实损失的最小化器,即 h* = argmin_{h ∈ H} L_D(h)
h_S 为经验损失的最小化器,即 h_S = argmin_{h ∈ H} L_S(h)

根据不等式(1),对于 h_S 有:

L_D(h_S) ≤ L_S(h_S) + ε/2
    (2)

因为 h_S 最小化了经验损失,所以对于任意 h(包括 h*),有 L_S(h_S) ≤ L_S(h)。特别地:

L_S(h_S) ≤ L_S(h*)
    (3)

再次根据不等式(1),对于 h* 有:

L_S(h*) ≤ L_D(h*) + ε/2
    (4)

现在,将 (3) 和 (4) 串联起来:

L_S(h_S) ≤ L_S(h*) ≤ L_D(h*) + ε/2

再将此结果代入 (2):

L_D(h_S) ≤ [L_D(h*) + ε/2] + ε/2 = L_D(h*) + ε

因此,我们证明了:

L_D(h_S) ≤ min_{h' ∈ H} L_D(h') + ε

证毕。

核心结论

为了确保经验风险最小化规则是一个不可知PAC学习器,只需证明:在随机选择训练集时,以至少 1 - δ 的概率,该训练集将是一个 ε-代表性 训练集。这为我们提供了一种证明可学习性的有力工具。

以上是对PAC可学习性和不可知PAC可学习性理论的简要介绍。

理论奠基者

以下是该理论的主要奠基人。

  • 弗拉基米尔·瓦普尼克阿列克谢·切尔沃年基斯 于1971年创立了计算学习理论。
  • 莱斯利·瓦利安特 于1994年提出了PAC可学习性的精确定义,为可学习假设类提供了严格的数学框架。他因此在2010年获得了图灵奖(计算机科学的诺贝尔奖)。

本节课中,我们一起学习了“一致收敛”的概念,理解了如何通过确保训练集的ε-代表性来证明经验风险最小化的有效性,从而论证一个假设类的PAC可学习性。我们还简要回顾了该理论的发展历程。希望你对本节课的内容有了清晰的认识。

014:线性决策边界 👨‍🏫

在本节课中,我们将学习线性模型的核心概念,特别是线性决策边界。我们将从线性可分性的基本几何原理开始,介绍感知机这一经典算法,并探讨其在可分与不可分情况下的应用。


线性决策边界的几何原理 📐

上一节我们概述了课程内容,本节中我们来看看线性决策边界的数学基础。

一条在二维空间中的直线,通常可以用斜率加截距的形式表示:
y = m*x + b

为了将其推广到更高维度并简化表示,我们进行一个巧妙的变换。我们引入一个额外的常数维度,将数据点 x 表示为 [x0, x1, 1],将参数 w 表示为 [w0, w1, b]。这样,直线方程可以重写为向量内积的形式:
w^T * x = 0

这个方程定义了一个超平面。其中,向量 w 被称为该超平面的法向量,它垂直于超平面本身。当数据点 x 满足 w^T * x = 0 时,该点位于超平面上。

通过增加一个恒为1的维度,我们将原始的截距 b 吸收进了参数向量 w 中。这使得超平面方程变得统一且优雅,无论维度如何,形式始终是 w^T * x = 0。这个变换后的超平面总是经过扩展空间的原点,但在原始空间中,它代表了一个可以任意平移的分离边界。


距离与符号:分类的关键 📏

理解了超平面的表示后,我们来看看如何用它进行分类。

对于一个归一化的法向量 w(即 ||w|| = 1),点 x 到超平面的有符号距离 r 可以通过以下公式计算:
r = w^T * x

这个距离的符号具有重要的分类意义:

  • 如果 r > 0,则点 x 位于法向量 w 所指的半空间。
  • 如果 r < 0,则点 x 位于相反方向的半空间。
  • 如果 r = 0,则点 x 恰好位于超平面上。

因此,我们可以利用这个有符号距离来构建一个线性分类器:为两个类别分配标签 +1-1。对于一个数据点 (x, y),其中 y 是其真实标签,如果 y * (w^T * x) > 0,则分类正确;如果小于0,则分类错误。


经典案例:鸢尾花数据集 🌸

理论需要联系实际,一个著名的线性可分数据集例子是鸢尾花数据集

该数据集包含三种鸢尾花的150个样本,每个样本测量了四个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度。下图展示了其中两个特征构成的空间,可以看到 Setosa 类与其他两类是线性可分的。

通过这个例子,我们可以将抽象的高维空间概念具体化。数据点 x 的每个维度对应一个具体的物理测量值,而寻找最优的 w 就是在寻找一个能最好地区分不同类别的超平面。


线性可分与不可分情况 ⚖️

并非所有数据都能被一个超平面完美分开,这引出了两种核心情况。

以下是两种主要的数据分布类型:

  1. 线性可分:存在至少一个超平面,能将所有不同类别的样本完全正确地划分到两侧。
  2. 线性不可分:不存在任何一个超平面能完美分离所有类别的样本。

最初的感知机算法是为线性可分情况设计的。对于线性不可分的数据,我们需要对算法进行扩展或使用其他方法。


总结 📝

本节课中我们一起学习了线性决策边界的核心知识。我们从直线方程的向量化表示出发,理解了超平面、法向量以及点到超平面有符号距离的几何意义。我们看到了如何利用这些概念构建线性分类器,并区分了线性可分与线性不可分这两种基本的数据情况。这些概念是理解后续感知机等线性模型算法的基础。

015:感知机作为线性分类器 🧠

在本节课中,我们将学习感知机算法。感知机是机器学习历史上一个里程碑式的模型,它首次展示了如何从数据中自动学习一个线性分类器。我们将从几何和生物学的角度理解其原理,并详细分析其学习算法的收敛性。

超平面与线性判别

上一节我们介绍了超平面的几何概念。在1960年代,Frank Rosenblatt等人开始思考:我们能否不仅仅手动设置超平面,而是从数据中学习它?这正是经验风险最小化的核心思想——我们只有数据样本,能否设计一个算法来学习权重向量 W 的值?

Frank Rosenblatt受神经元工作原理的启发,提出了感知机算法。下图展示了他与Mark 1感知机硬件实现的合影。

回到超平面方程 W^T x = 0。从另一个角度看,这个方程等价于一个计算图:输入 x 与权重 W 相乘后求和,然后与一个阈值(通常为0)比较。如果结果在阈值一侧,输出为正类;在另一侧,则为负类;等于阈值则位于超平面上。

生物学灵感 🧬

Frank Rosenblatt的灵感来源于神经元的发现。神经科学家Ramon y Cajal通过特殊的染色技术,首次在显微镜下观察到了哺乳动物大脑中的神经元结构。

一个生物神经元通过树突接收来自其他神经元轴突的信号。这些输入信号具有不同的强度(权重)。信号在胞体中汇总,一旦汇总的电势超过某个动作电位阈值,神经元就会通过轴突产生输出(“放电”)。

感知机正是模拟了这一过程:

  • 输入 对应树突接收的信号。
  • 权重 对应不同输入连接的重要性(可正可负)。
  • 求和与阈值比较 对应胞体汇总信号并与动作电位比较。
  • 输出 对应是否“放电”(即分类结果)。

这种将线性分类器“重新包装”为神经元的类比,极大地吸引了人们对人工智能领域的关注,并催生了机器学习这一领域。

感知机学习算法

那么,我们如何优化或学习感知机的权重呢?由于阈值函数不可微,我们无法直接使用梯度下降。首先,我们需要定义一个优化目标。

我们的目标是最小化所有被错误分类的样本到当前超平面的(未归一化)距离。对于一个样本点 (x_i, y_i),其到超平面的带符号距离为 y_i * (W^T x_i)。对于正确分类的样本,该值为正;对于错误分类的样本,该值为负。因此,我们只对错误分类的样本计算损失,并希望最小化这些负值(即让它们变正)。

感知机有两种主要的学习算法。

批量感知机算法

以下是批量感知机算法的步骤,它每次迭代使用整个数据集中所有误分类的样本来更新权重。

  1. 初始化:设置初始权重向量 W,学习率函数 η(t),停止阈值 θ,迭代计数器 t = 1
  2. 循环:重复以下步骤,直到误分类样本的损失总和小于阈值 θ
  3. 识别误分类:找出当前权重 W 下所有误分类的样本集合。
  4. 更新权重:使用所有误分类样本的信息更新权重:W ← W + η(t) * Σ(误分类样本 y_i * x_i)
  5. 递增计数器t ← t + 1
  6. 返回结果:返回学习到的权重向量 W

随机(在线)感知机算法

随机感知机算法逐个检查样本,并立即更新。

  1. 初始化:设置初始权重向量 W,迭代计数器 k = 0
  2. 遍历数据:对数据集中的每个样本 (x_k, y_k) 顺序执行:
  3. 检查分类:如果当前样本被误分类,即 y_k * (W^T x_k) ≤ 0
  4. 立即更新:则更新权重 W ← W + y_k * x_k
  5. 循环:重复遍历整个数据集,直到所有样本都被正确分类。

这个算法直观上就像在“修正”错误。想象一个随机的超平面,如果发现一个误分类的正类样本落在负侧,算法就会将权重向量 W 向该样本的方向调整一点,从而使超平面向正确分类该样本的方向旋转。

收敛性证明 📐

一个关键问题是:随机感知机算法一定会收敛吗?Frank Rosenblatt证明了,如果训练样本是线性可分的,那么该算法一定会在有限步内收敛到一个解向量。

让我们概述一下证明思路。假设存在一个完美的解向量 ,它能正确分类所有样本(即对于所有 i,有 y_i * (W̃^T x_i) > 0)。

在算法第4步的更新后,我们得到新权重 W_{k+1} = W_k + y_k x_k。我们想证明,新权重 W_{k+1} 比旧权重 W_k 更接近那个完美的解

我们考察向量 W_{k+1} - α W̃ 的范数平方(其中 α 是一个待定的正标量),并将其与 W_k - α W̃ 的范数平方进行比较。

通过展开和代数运算,并利用更新只发生在误分类样本上(即 y_k (W_k^T x_k) ≤ 0)这一条件,我们可以推导出以下不等式:

||W_{k+1} - α W̃||^2 ≤ ||W_k - α W̃||^2 + ||x_k||^2 - 2α y_k (W̃^T x_k)

定义两个量:

  • β^2 = max_i ||x_i||^2,即所有样本中最大的范数平方。
  • γ = min_i [ y_i (W̃^T x_i) ],即完美解 与所有样本的最小带符号距离(必定为正)。

由于 y_k (W̃^T x_k) ≥ γ,我们可以将不等式加强为:
||W_{k+1} - α W̃||^2 ≤ ||W_k - α W̃||^2 + β^2 - 2αγ

现在,巧妙的选择 α = β^2 / γ。代入上式,得到:
||W_{k+1} - α W̃||^2 ≤ ||W_k - α W̃||^2 - β^2

这个不等式表明,每经过一次更新,当前权重向量与缩放后的完美解向量之间的距离平方至少减少 β^2

经过 k 次更新后,如果初始权重 W_1 = 0,则有:
0 ≤ ||W_{k+1} - α W̃||^2 ≤ ||α W̃||^2 - k β^2 = α^2 ||W̃||^2 - k β^2

为了使不等式左边保持非负,右边的项必须大于等于0,即 k β^2 ≤ α^2 ||W̃||^2。因此,最大的更新次数 k 有一个上界:

k ≤ (α^2 ||W̃||^2) / β^2 = (β^2 / γ^2) * ||W̃||^2

由于这个上界是一个有限值,算法不可能无限更新下去,因此必然在有限步内停止,即所有样本都被正确分类,算法收敛。

总结

本节课中,我们一起学习了感知机作为线性分类器的核心内容。

  • 我们首先回顾了超平面的几何定义,并看到了Frank Rosenblatt如何受生物神经元启发,提出了感知机模型。
  • 我们详细分析了感知机的两种学习算法:批量更新随机(在线)更新。后者通过逐个样本检查和即时修正来学习。
  • 最重要的是,我们探讨了随机感知机算法的收敛性证明。证明表明,只要训练数据是线性可分的,该算法就保证能在有限步内找到一个能将所有样本正确分类的超平面。证明的关键在于展示了每次权重更新都会使其更接近某个“完美”的解向量。

感知机是神经网络和支持向量机等现代模型的重要基础。理解其原理和局限性(如对线性可分数据的依赖)对于深入学习机器学习至关重要。

016:P16_感知机扩展 🧠

概述

在本节课中,我们将学习感知机算法的两个重要扩展。首先,我们将探讨引入“间隔”的概念如何使分类器更具鲁棒性。接着,我们将了解如何通过一个更平滑的损失函数来改进原始的、不连续的感知机目标函数,从而获得更好的优化性能。


感知机算法的局限性

感知机是一个有趣的算法,也是最早被证明能够收敛的学习算法之一。然而,它存在一些我们希望改进或修正的缺点。

其中一个问题是关于线性可分数据的。假设我们处于一个二分类场景中,数据是线性可分的。感知机可以找到无数个解,或者说,所有那些分离超平面都可能是感知机找到的第一个可行解。具体找到哪一个,取决于算法从何处开始初始化,这带有一定的随机性。

因此,有些解会过于接近红色类别,有些解则会过于接近绿色类别。我们能否找到一个更理想的解呢?直观上,我们希望找到一个位于两类数据“中间”的超平面。这样,即使我们收集的数据略有偏差或不足,分类器也能为两类数据留出一些“缓冲”空间,一些绿色点可能出现在这边,一些红色点可能出现在那边,从而提升模型的泛化能力。


扩展一:间隔感知机

为了应对上述问题,我们引入了“间隔”的概念。间隔告诉我们,我们希望有一个区域,在这个区域内不允许存在任何数据点。

例如,在之前的例子中,如果这是一个分离超平面,并且我们的数据点 y_i * (w^T x_i) 最终落在这里。但如果我们设定了一个间隔 B,我们不希望任何点离超平面太近。我们会将超平面移动到这里,从而获得一个较大的间隔,并且确保这个间隔区域内没有数据点。实际上,如果我们翻转这些点的符号,它们会落在超平面的另一端。我们相当于在超平面周围添加了一个“缓冲区”或“条带”,在这个区域内对数据点进行了约束,这就是我们的间隔 B

对于不同的权重向量 w,这些间隔看起来会有所不同。它定义了数据点被允许离分离超平面有多远。


算法实现

因此,我们可以修改原始的随机感知机算法,使其能够处理间隔。我们定义希望间隔 B 有多大,即数据点不允许出现在分离超平面的 B 邻域内。我们定义学习率 η 和阈值,然后我们的“错误分类”样本就变成了那些离超平面距离小于设定间隔 B 的样本。

我们使用的超平面是 w^T x,我们希望如果它离训练数据不是太近(即存在一个大小为 B 的间隙),它的泛化能力会更好。判断条件不再是 y_i * (w^T x_i) <= 0,而是 y_i * (w^T x_i) <= B。无论是正类还是负类,如果它们被错误分类,或者即使分类正确但离超平面太近(即点离超平面太近),这个条件都会触发。

和之前一样,我们的目标函数 J(w) 是:
J(w) = - Σ_{i ∈ M} y_i * (w^T x_i)
其中 M 是错误分类样本的集合。这其实就是对于特定样本的目标函数关于 w 的梯度。我们通过梯度下降来最小化这个包含间隔 B 的目标函数。目前虽然没有理论保证,但我们希望在实践上能做得更好。我们的停止准则是:当所有样本都位于正确的一侧,并且远离分类器超平面加上间隔 B 的区域时。之前我们只有对于所有样本 y_i * (w^T x_i) > 0 的条件,这是第一种泛化改进。


扩展二:平滑感知机(感知机松弛)

第一种改进很巧妙且有效。另一种改进是审视我们原来的目标函数。它的问题在于它是不连续的。这种高度不连续性导致权重更新时会来回跳跃,步骤不稳定(我们将在下一节展示这一点)。这不理想,我们希望有更平滑的东西,并且希望能够优化除了简单的感知机准则之外的其他目标。

我们可以通过定义一个新的损失函数来实现这一点。我们仍然希望处理间隔,因为它对泛化有益。但这次,我们使用以下表达式作为损失:
L_i = max(0, B - y_i * (w^T x_i))
这其实就是我们之前准则的“合页损失”形式。之前的错误分类准则是 y_i * (w^T x_i) <= B,现在这个损失函数在 y_i * (w^T x_i) < B 时会产生一个线性惩罚。

这个损失函数关于权重 w 的梯度是:
∇_w L_i = { -y_i * x_i, 如果 y_i * (w^T x_i) < B; 0, 否则 }
这是一个关于 w 的分段线性函数。梯度是一个向量(或者说是标量乘以向量,正如我们之前讨论的)。

然后,我们只需使用随机梯度下降进行迭代更新:
w_{t+1} = w_t - η * ∇_w L_i
这与之前类似。我们之前的感知机更新是 w_{t+1} = w_t + η * y_i * x_i(当样本被错误分类时)。实际上,之前我们在最小化目标函数 J(w) 时,梯度是 -y_i * x_i,而更新中的 + 号是因为我们采用了负梯度方向并移除了负号。现在,我们有了一个带间隔的感知机,但使用了不同的、比原始版本更平滑的目标函数。


几何解释

这种平滑性有其几何意义。如果我们定义 R_k = y_k * (w^T x_k) 这个比值(注意,我们的 y_k 是标签乘以 x_k,即经过标签缩放后的数据样本,本质上是 +1-1),那么 R_k 就是数据点到超平面的函数间隔。

新的损失函数 L_iw 的函数。超平面由 y_k * (w^T x_k) = B 定义。通过在这个损失函数上执行梯度下降,我们实际上是平滑地将当前的 w 向满足 y_k * (w^T x_k) = B 这个条件的超平面移动。在这个超平面上的任何 w 都会是对于该样本的一个“好”的解。

总之,这就是感知机松弛过程。它取代了原始感知机算法中离散、不平滑的目标函数,使其变得平滑,并且结合了间隔思想,从而使感知机具有更好的泛化性能。


总结

本节课中,我们一起学习了感知机算法的两个关键扩展:

  1. 间隔感知机:通过引入间隔 B,要求分类超平面与所有训练数据保持至少 B 的距离,从而追求更具鲁棒性和泛化能力的解。
  2. 平滑感知机(感知机松弛):通过将不连续的 0-1 损失替换为连续的合页损失 max(0, B - y_i * (w^T x_i)),使优化过程更平滑、更稳定,同时保留了间隔思想。

这两种扩展都在不同程度上改善了原始感知机的性能,为后续更复杂的线性分类器(如支持向量机)奠定了基础。

017:针对线性不可分类的线性分类器 🧠

在本节课中,我们将要学习线性分类器如何处理线性不可分的数据。我们将回顾感知机算法在可分情况下的表现,并探讨其在不可分情况下的局限性,最后介绍一种替代的优化准则。

概述

上一节我们介绍了感知机算法在线性可分数据集上的工作原理。本节中我们来看看当数据线性不可分时会发生什么。

感知机算法在可分情况下表现良好。它从一个随机的权重向量 W 开始,通过迭代修正错误分类的点来找到分离超平面。算法的核心更新规则是:

W_new = W_old + η * y_i * x_i

其中,η 是学习率,y_i 是样本 x_i 的真实标签。

以下是算法在可分情况下的典型运行步骤:

  1. 初始化权重向量 W
  2. 遍历数据点。
  3. 如果发现一个点被错误分类,则根据上述公式更新 W
  4. 重复步骤2-3,直到所有点都被正确分类。

该算法保证在线性可分的情况下收敛。

线性不可分的情况

然而,如果数据是线性不可分的,情况就不同了。考虑一个经典的“异或”问题。

这是一个实际的运行示例。算法运行了100步,但从未收敛。它持续运行,因为根本不存在一个完美的线性分离超平面。这是一个简单的玩具问题,我们通过肉眼就能看出它是不可分的。

马文·明斯基和西摩尔·派普特在他们出版的《感知机》一书中证明了感知机无法处理这类情况。这在当时导致了人工智能领域的“寒冬”,相关研究资金大幅减少。

处理近似可分的数据

但我们通常遇到的实际问题更像下图所示,并非像“异或”问题那样完全不可分。如果我们能容忍少数样本被错误分类,这通常是可以接受的。

那么,我们能否找到一个“足够好”的分离超平面呢?如果我们改变原始的优化准则。

原始的感知机准则旨在最小化错误分类的数量。如果我们将其改为最小化均方误差,然后进行梯度下降,理论上我们应该能够解决这个问题。

一个自然的问题是:为什么我们不从一开始就使用这种方法呢?这引出了一个实际问题:为问题选择合适的损失函数。

事实证明,即使存在一个解,最小均方误差准则也不能保证找到它。我们将在下一讲中详细讨论最小二乘法。

总结与要点

本节课中我们一起学习了线性分类器在不可分数据上的行为。以下是核心要点:

  • 线性可分性:许多分类问题或分类器类别可以简化为线性分类器。
  • 线性分类器的子集:支持向量机也是一种线性分类器,并且由于其强大性能,至今仍在广泛使用。
  • 本讲重点:本讲的重点在于理解空间的几何特性。能够直观地理解和可视化数据空间的几何结构至关重要,这将帮助你理解算法发明者的思路。
  • 证明技巧:请注意课程中涉及的证明技巧。你不需要记住所有细节,但需要理解证明的步骤。这些技巧将有助于你完成作业。
  • 解的接近性:有时,算法可能非常接近最终解,但只有在解被找到后才能确认这一点。

感谢学习,我们课堂上再见。

018:线性回归与主成分分析

在本节课中,我们将要学习线性回归,并快速回顾线性代数基础。之后,我们将详细解释谱定理,并深入探讨主成分分析,最后通过一个降维演示来巩固理解。

线性回归

上一节我们介绍了课程概览,本节中我们来看看线性回归。线性回归是一种用于拟合数据点或超平面的方法。该方法由勒让德和高斯发明,称为最小二乘法。“回归”这一名称由弗朗西斯·高尔顿提出,源于对生物学中“均值回归”现象的观察,但该名称本身并未解释方法的内涵。

我们之前讨论过,在处理非线性可分数据时,最小二乘解并不总能找到一个分离超平面。然而,对于拟合穿过数据集的直线或超平面,最小二乘法效果很好。

例如,我们有一组测量值 X 和响应变量 y。我们希望找到一个超平面,使得预测值 ŷ 与真实值 y 之间的平方误差最小。这可以表示为最小化以下目标函数:

公式: min_w Σ (y_i - w^T x_i)^2

我们可以将其重写为矩阵形式。设 X 为设计矩阵,其中每一行是一个样本 x_i^Tw 为权重向量。那么预测向量为 ŷ = X w。最小二乘准则可以写成:

公式: min_w || y - X w ||^2

展开平方项并求导,我们可以找到使该表达式最小化的 w。将导数设为零,我们得到正规方程:

公式: X^T X w = X^T y

解出 w,得到最小二乘解:

公式: w = (X^T X)^{-1} X^T y

这里的 (X^T X)^{-1} X^T 被称为 X 的伪逆(Moore-Penrose 伪逆),记作 X^†。因此,解也可以写为:

公式: w = X^† y

当样本数多于特征维度且 X^T X 满秩时,该解是良定的。如果 X^T X 不可逆,我们可以通过添加一个小常数项(如 λI)来稳定求解,或者使用梯度下降等迭代方法。

求解方法

上一节我们推导了线性回归的解析解,本节中我们来看看如何通过迭代方法求解。

除了直接计算伪逆,我们还可以使用梯度下降法来最小化平方误差损失。损失函数关于权重 w 的梯度为:

公式: ∇_w L = -2 X^T (y - X w)

以下是使用批量梯度下降的算法步骤:

代码:

初始化 w
设置学习率 α
设置停止条件(如迭代次数或梯度阈值)
循环直到满足停止条件:
    计算梯度 g = -2 * X^T (y - X w)
    更新权重 w = w - α * g

我们也可以使用随机梯度下降,每次只用一个样本更新权重。对于单个样本 (x_i, y_i),梯度为:

公式: ∇_w L_i = -2 (y_i - w^T x_i) x_i

对应的更新规则为:

代码:

对于每个样本 (x_i, y_i):
    计算预测值 ŷ_i = w^T x_i
    计算误差 e_i = y_i - ŷ_i
    更新权重 w = w + α * e_i * x_i  # 注意这里是加号,因为梯度是负的

需要注意的是,随机梯度下降对学习率 α 的设置非常敏感。

回归的假设与变体

上一节我们介绍了线性回归的标准形式,本节中我们来看看其背后的假设和一些变体。

传统线性回归有一个强假设:所有误差或不确定性仅存在于因变量 y 中,自变量 X 被假设为精确测量、没有误差。然而,在实际问题中,这个假设往往不成立。

根据误差来源的不同,我们可以定义不同的“拟合”准则:

  1. 普通最小二乘法:最小化 y 方向上的垂直距离平方和(假设误差仅在 y)。
  2. 正交回归/总最小二乘法:最小化数据点到直线的垂直距离平方和(假设 xy 都存在误差)。
  3. 主成分分析拟合:寻找数据方差最大的方向(一种无监督方法,不区分 xy)。

为了直观展示这些差异,我们进行了一个实验。当数据仅在 y 方向有噪声时,三种方法拟合的直线几乎相同。但当数据在 xy 方向都有噪声,或者数据的固有坐标系与测量坐标系不一致时,结果会显著不同。

在许多现实世界的数据集中(如图像、传感器数据),我们测量的坐标系可能并非数据内在的低维流形所在的坐标系。此时,PCA拟合通常能更好地捕捉数据的本质结构,因为它寻找的是数据方差最大的方向,而不依赖于特定的输入-输出假设。

主成分分析原理

上一节我们通过实验看到了PCA拟合的优势,本节中我们来深入探讨其数学原理——谱定理。

主成分分析的核心是找到一组新的正交基,使得数据在这些新基上的投影方差最大化。这涉及到数据协方差矩阵的特征分解。

设我们有一个零均值的数据矩阵 X(每行一个样本)。其协方差矩阵为:

公式: Σ = (1/n) X^T X

谱定理指出,任何实对称矩阵(如协方差矩阵 Σ)都可以被正交对角化。即存在一个正交矩阵 U 和对角矩阵 Λ,使得:

公式: Σ = U Λ U^T

其中,U 的列向量是 Σ 的特征向量,Λ 对角线上的元素是相应的特征值(通常按降序排列:λ₁ ≥ λ₂ ≥ ... ≥ λ_d)。

这些特征向量就是主成分方向。第一主成分方向 u₁ 是数据投影方差最大的方向;第二主成分方向 u₂ 是与 u₁ 正交且投影方差次大的方向,依此类推。

数据在新空间(主成分空间)中的表示可以通过投影得到:

公式: Z = X U

其中,Z 的每一列是一个主成分得分。如果我们只取前 k 个主成分(对应最大的 k 个特征值),就可以实现从 d 维到 k 维的降维。

降维演示

上一节我们介绍了PCA的数学基础,本节中我们通过一个演示来看其降维效果。

假设我们有一个高维数据集,但其本质信息存在于一个更低维的子空间中。PCA可以帮助我们:

  1. 降维:保留前 k 个主成分,去除噪声和冗余。
  2. 可视化:将高维数据投影到前两个或三个主成分上,以便于观察。
  3. 特征提取:主成分可以作为新的、不相关的特征用于后续的机器学习任务。

演示中,我们生成了一个本质上近似一维(沿一条线分布)但被测量在二维空间中的数据集。普通最小二乘回归(假设y有误差)的拟合线严重偏离了数据的真实走向。而PCA拟合线则准确地捕捉了数据分布的主要方向,因为它致力于寻找数据本身方差最大的轴,而不对误差来源做先验假设。

当数据具有更复杂的结构(如非线性流形)时,线性PCA可能不够用,需要考虑核PCA或流形学习等方法。但其核心思想——寻找数据分布的主要模式——是共通的。

总结

本节课中我们一起学习了线性回归与主成分分析。我们从线性回归的最小二乘解及其矩阵形式出发,讨论了其求解方法(解析解和梯度下降)。然后,我们探讨了线性回归中关于误差来源的假设,并比较了普通最小二乘、正交回归和PCA拟合在不同数据场景下的表现。

通过谱定理,我们深入理解了PCA的原理:通过对数据协方差矩阵进行特征分解,找到数据方差最大的正交方向(主成分)。PCA是一种强大的无监督降维和特征提取工具,尤其适用于当我们对数据的误差结构或内在维度缺乏先验知识时。

最后,我们通过演示看到,在许多情况下,尤其是当测量坐标系与数据固有结构不一致时,PCA提供了一种更鲁棒、更能反映数据本质的拟合与降维方式。

019:P19 线性代数微型复习 📚

在本节课中,我们将快速回顾几个关键的线性代数概念,为后续的机器学习学习打下基础。这些概念包括内积、外积以及它们与向量范数的关系。


上一节我们介绍了本课程的整体框架,本节中我们来看看几个基础的线性代数运算。

首先,我们回顾向量的内积。如果有一个三维向量 x = [1, 2, 3]^T,那么它与自身的内积 x^T x 是一个标量。

其计算过程是:将向量转置后,与自身对应元素相乘再求和。

x^T x = 1×1 + 2×2 + 3×3 = 14

这个结果恰好是向量 xL2范数 的平方。公式表示为:

x^T x = ||x||₂²


接下来,我们看看向量的外积。与内积不同,向量 x 与自身的外积 x x^T 的结果是一个矩阵。

其计算过程是:将列向量与行向量相乘。对于 x = [1, 2, 3]^T,其外积矩阵为:

x x^T = [1, 2, 3]^T × [1, 2, 3] = [[1, 2, 3],
[2, 4, 6],
[3, 6, 9]]

从效果上看,外积相当于用原向量的每个元素作为权重,生成并拼接多个向量副本,最终构成一个矩阵。


本节课中我们一起学习了两个核心的线性代数运算:内积外积。我们明确了内积(x^T x)的结果是一个标量,等于向量L2范数的平方;而外积(x x^T)的结果是一个矩阵。理解这两者的区别对后续学习机器学习中的协方差矩阵、主成分分析等概念至关重要。

020:P20_谱定理 📐

在本节课中,我们将要学习谱定理。谱定理是线性代数中的一个核心结果,它描述了对称矩阵如何通过其特征值和特征向量进行分解。理解谱定理是学习主成分分析等高级机器学习方法的基础。

基变换 🔄

上一节我们介绍了线性变换的基本概念,本节中我们来看看如何在不同基下表示同一个向量。

首先,考虑基变换。我们有一个线性变换 P_B 及其逆变换 P_B^{-1}。它们将一个向量在其标准基下的表示与其在基 B 下的表示之间进行相互映射。

向量 u 在标准基下的表示就是其本身。标准基向量 e_i 是第 i 个位置为1,其余位置为0的向量。

要从标准基变换到基 B,我们应用变换 P_B。要从基 B 的表示变回标准基,我们应用其逆变换 P_B^{-1}

用公式表示这个关系如下:

u = P_B * u_B
u_B = P_B^{-1} * u

其中,u_B 是向量 u 在基 B 下的坐标表示。

那么,基 B 应该由 n 个基向量 b_1b_n 组成。由于 u_Bu 在基 B 下的表示,因此 u 可以表示为基向量的加权和,权重就是 u_B 的分量。

u = Σ (u_B)_i * b_i

这本质上是一个投影操作。矩阵 P_B(我们之前称之为投影到 B 的矩阵)其实就是将基向量作为列向量并置在一起形成的矩阵。

P_B = [b_1, b_2, ..., b_n]

这个矩阵 P_B 将向量从基 B 的表示映射回标准基(规范基)的表示。

相似变换 🔁

上一节我们讨论了向量的基变换,本节中我们来看看线性变换本身在不同基下的表示。

考虑一个在标准基下由矩阵 A 表示的线性变换。例如,这个变换可能是将空间旋转20度。我们想知道,当所有向量都用基 P 表示时,这个变换看起来是什么样的?换句话说,我们想找到在基 P 下具有相同效果的等价变换 A_B

在标准基下,变换 A 作用于 u 得到 A u。我们可以将 A u 通过乘以 P^{-1} 投影到基 B 下。同时,我们知道从基 B 下的表示 u_B 回到标准基是应用变换 P

我们想要求解的是变换 A_B,它接收 u_B 并输出 A u 在基 B 下的表示 (A u)_B

以下是推导过程:

  1. u_B 出发,用 P 变换到标准基:u = P * u_B
  2. 在标准基下应用变换 AA u = A * (P * u_B)
  3. 将结果 A u 变换回基 B 的表示:(A u)_B = P^{-1} * (A * P * u_B)

因此,我们寻找的变换 A_B 就是:

A_B = P^{-1} * A * P

这个变换称为相似变换。矩阵 A_BA 关于基 P 是相似的。

对称矩阵的对角化 ⚖️

现在让我们思考以下情况:设 A 是一个在标准基下表示的对称矩阵,并设矩阵 X 的列是 A 的特征向量。

因为 A 是对称的,其特征向量是正交的。对于正交基,X^T 就是 X^{-1},因为 X^T * X = I(单位矩阵)。

我们通过 X^T 从标准基变换到 A 的特征向量基,并通过 X 从特征向量基变回标准基。

矩阵 Λ(读作 Lambda)将向量 uA 的特征基下的表示,映射为 A u 在同一个特征基下的表示。根据相似变换的定义,我们可以得到:

Λ = X^T * A * X

这里有一个有趣的性质:Λ 是一个对角矩阵,其对角线上的元素正是矩阵 A 的特征值。

对称矩阵的谱定理 📊

上一节我们推导了对角化的形式,本节中正式阐述谱定理。

对称矩阵的谱定理指出:任何具有 n 个不同特征值的 n x n 对称矩阵 A 可以分解如下:

A = X Λ X^T

其中:

  • Λ 是一个 n x n 的对角矩阵,对角线元素是 A 的特征值 λ_i
  • X 是一个 n x n 的矩阵,其第 ix_i 是对应于特征值 λ_i 的特征向量。
  • X^TX 的转置,其第 i 行是 x_i^T

特征向量的定义是:矩阵 A 作用于特征向量 x_i,结果只是将该向量缩放对应的特征值 λ_i

A x_i = λ_i x_i

注意,当 i ≠ j 时,特征向量 x_ix_j 正交。这意味着 X^T X = I,因此 X^T = X^{-1}

谱分解 🧩

谱定理为我们提供了一种强大的矩阵分解视角,称为谱分解。

让我们使用矩阵乘法的定义以及 Λ 是对角矩阵这一事实,来重写 A = X Λ X^T

通过分量形式的计算(详细代数过程可自行推导),我们可以将 A 的第 i 行第 j 列元素 A_ij 表示为:

A_ij = Σ_k λ_k * (x_k)_i * (x_k)_j

其中 (x_k)_i 是第 k 个特征向量 x_k 的第 i 个分量。

更重要的是,我们可以将整个矩阵 A 重写为一系列矩阵的和:

A = Σ_k λ_k * (x_k * x_k^T)

这里,x_k * x_k^T 是向量 x_k 与其自身的外积,结果是一个秩为1的矩阵。

以下是谱分解的关键点:

  • 我们将原始的对称矩阵 A 表示为一组加权和。
  • 求和中的每一项是:一个特征值 λ_k 乘以一个对应的秩为1的矩阵 x_k * x_k^T
  • 这些秩为1的矩阵 x_k * x_k^T 构成了矩阵 A 的一个“基”,而特征值 λ_k 是相应的权重。

这就好比声音的频谱分解,我们将任何波形分解为不同频率和功率的正弦波之和。在这里,我们将矩阵 A 分解为其特征向量外积所张成的基。

如果我们将和式中的每一项记作 A_k = λ_k * x_k * x_k^T,那么显然有:

A_k * x_k = λ_k * x_k

因为 x_k^T * x_k = 1(假设特征向量已归一化)。这表明,矩阵 A_k 作用在其对应的特征向量 x_k 上,效果仅仅是缩放,且缩放因子正是 λ_kx_kA_k 唯一的特征向量,λ_k 是其唯一的特征值。

总结 📝

本节课中我们一起学习了谱定理及其相关概念。

  1. 我们首先回顾了基变换,理解了向量在不同坐标系下的表示转换。
  2. 接着,我们引入了相似变换的概念,它描述了同一个线性变换在不同基下的矩阵表示之间的关系。
  3. 然后,我们聚焦于对称矩阵,发现其特征向量可以构成正交基,从而可以对其进行对角化
  4. 基于此,我们正式阐述了谱定理:任何对称矩阵都可以分解为 A = X Λ X^T 的形式。
  5. 最后,我们探讨了谱分解的深刻含义:对称矩阵可以表示为一系列秩为1矩阵(由其特征向量外积得到)的加权和,权重就是对应的特征值。

掌握谱定理为我们接下来学习主成分分析这一强大的降维工具奠定了坚实的理论基础。

021:主成分分析 📊

在本节课中,我们将学习主成分分析的核心数学基础。我们将从二次型开始,逐步理解协方差矩阵、多元高斯分布以及Karhunen-Loève变换,最终揭示PCA如何通过特征向量找到数据的主要变化方向。

二次型与矩阵

首先,我们考虑二次型。二次型是一个向量函数 F(x),它以一个向量作为输入,并返回一个标量。其定义为 xᵀAx,其中 A 是一个对称矩阵。

在二维情况下,矩阵 A 由四个值定义,因为对称性,非对角线元素相等。例如,给定向量 x = [x, y]ᵀ,我们可以计算 Ax,然后计算 xᵀAx,最终得到一个关于 xy 的多项式。

当矩阵 A 是正定时,这个二次型是一个抛物面,其等高线是椭圆。一个矩阵是正定的,当且仅当其所有特征值均为正。

以下是二次型的一个例子:

A = \begin{bmatrix} 5 & -2 \\ -2 & 5 \end{bmatrix}

对应的二次型为:

xᵀAx = 5x² - 4xy + 5y²

这个方程描述了一个倾斜的椭圆。然而,如果我们转换到由椭圆主轴定义的 uv 坐标系,方程会变得简单,椭圆看起来是“平”的。

多元高斯分布

现在,我们来看多元高斯分布的概率密度函数。其表达式如下:

g(x) = \frac{1}{(2\pi)^{k/2} |\Sigma|^{1/2}} \exp\left(-\frac{1}{2} (x - \mu)^T \Sigma^{-1} (x - \mu)\right)

其中,k 是维度,Σ 是一个 k × k 的协方差矩阵。

在二维情况下,协方差矩阵包含 xy 的方差以及它们的协方差。请注意,有时人们用 σ² 表示方差,但这里我们使用 Σ 来强调多维情况。

如果协方差矩阵 C 是对称且正定的,那么它的逆矩阵 C⁻¹ 也是对称且正定的。这可以通过对角化来证明:如果 C 的特征值均为正,那么 C⁻¹ 的特征值是其倒数,同样为正。

样本协方差矩阵

假设我们有 n 个来自高斯分布的样本,排列成矩阵 X,其中每一行是一个样本。样本协方差矩阵可以通过以下方式计算:

\Sigma \approx \frac{1}{n} X^T X

这里,我们假设样本均值为零。XᵀX 本质上是所有样本外积的和。对于零均值向量,这个和近似于期望值,即协方差。

等高面与主轴定理

多元高斯分布的等高面(或等密度面)是椭球体。如果我们令概率密度函数等于一个常数,取对数并整理,会发现等高面由二次型描述,其右侧为常数。

椭球体有主轴。对于球体,任何正交基都可以作为主轴。但对于一个“压扁”的椭球体,主轴是预先确定的,由协方差矩阵的特征向量给出。

主轴定理指出:多元高斯分布等高面形成的椭球体的主轴,由其协方差矩阵的特征向量给出。我们将特征值按降序排列,对应的特征向量依次定义了第一主轴、第二主轴等。

在二维情况下,最大的特征值对应的特征向量定义了椭圆的长轴,而较小的特征值对应的特征向量定义了短轴。

Karhunen-Loève变换

由于协方差矩阵 C 是实对称矩阵,假设我们有足够的样本使其满秩,那么它可以被对角化:

C = W D W^T

其中,W 的每一列是 C 的特征向量,D 是对角矩阵,对角线元素为对应的特征值。

Karhunen-Loève变换(KL变换)就是将高斯分布随机变量 x 的样本,投影到由其协方差矩阵的特征向量构成的基上。变换后的变量 u = Wᵀx

这个变换有什么好处?想象一下,我们有一个狭长的数据分布。在原始坐标系中,点由 (x1, x2) 表示。在KL变换后的新基下,点由 (w1, w2) 表示,其中 w1 的值通常很大,而 w2 的值接近于零。这是一种更紧凑的表示。

更重要的是,变换后变量 u 的分布仍然是多元高斯的,但其协方差矩阵变成了对角矩阵 D。由于协方差矩阵是对角的,联合分布可以分解为各个边缘分布的乘积。这意味着变换后的变量是统计独立的。

总结

本节课我们一起学习了主成分分析的数学基础。我们从二次型和正定矩阵出发,理解了它们如何描述椭球面。接着,我们探讨了多元高斯分布及其协方差矩阵,并学习了如何从样本中估计它。通过主轴定理,我们知道了数据分布的主要方向由协方差矩阵的特征向量决定。最后,我们介绍了Karhunen-Loève变换,它通过将数据投影到特征向量基上,不仅实现了降维,还使得新特征之间变得统计独立。这些概念是理解主成分分析如何提取数据主要成分并简化数据结构的关键。

022:PCA与KL变换演示 🎯

在本节课中,我们将通过具体的例子来演示主成分分析和KL变换的实际应用。我们将从向量表示开始,逐步深入到高维空间中的数据处理,并展示如何利用PCA进行数据压缩和特征提取。


向量表示与特征空间

首先,我们从一个简单的数据集开始。假设我们有一个关于汽车的数据集,其中包含速度、酒精含量、是否分心等特征。每个特征都是一个数值,所有特征共同构成了一个向量空间。

我们可以将这些变量分类,它们将存在于相应的子空间中。通过绘制特征之间的散点图,我们可以观察不同特征子空间之间的相关性。

以下是数据表示的核心概念:

  • 向量表示:每个数据点(如一辆车)由一组特征值构成,形成一个向量。
  • 特征空间:所有可能的特征组合构成的空间。

高维空间中的数据处理

现在,让我们考虑一个更高维度的空间:4096维的人脸图像空间。每张人脸图像由4096个像素的灰度值表示,因此每张图像可以看作是4096维空间中的一个点。

我们在这个空间中选取两个点,分别代表两张不同的人脸图像。通过在这两点之间进行线性插值,我们可以沿着连接它们的直线“行走”,并观察中间点的图像。

线性插值公式
给定两个点 AB,中间点 P 可以表示为:
[
P = A + t(B - A)
]
其中 ( t ) 是一个介于0和1之间的参数。

有趣的是,当我们在这条线上移动时,所有的中间图像看起来都像是真实的人脸,而不是随机噪声。这说明了人脸在4096维空间中并不是随机分布的,而是聚集在一个相对紧凑的区域。


矩阵操作与特征分解

接下来,我们演示一些基本的矩阵操作,如转置和求逆。这些操作在理解数据的线性变换时非常重要。

转置操作:将矩阵的行和列互换。
矩阵求逆:找到一个矩阵,使得与原矩阵相乘得到单位矩阵。

在某些情况下,原始空间和其逆空间是相互对偶的。例如,当原始空间是稠密的时,其逆空间可能是稀疏的,反之亦然。


主成分分析与特征脸

现在,我们将PCA应用于人脸数据集。首先,我们计算数据的协方差矩阵,然后找到其特征值和特征向量。这些特征向量(在图像上下文中称为“特征脸”)代表了数据变化的主要方向。

协方差矩阵
[
\Sigma = \frac{1}{n} \sum_{i=1}^{n} (x_i - \mu)(x_i - \mu)^T
]
其中 ( x_i ) 是数据点,( \mu ) 是均值。

特征值与特征向量
满足 ( \Sigma v = \lambda v ) 的向量 ( v ) 和标量 ( \lambda )。

我们绘制了前16个特征脸,它们对应着最大的特征值。这些特征脸代表了人脸空间中的主要变化模式。


数据压缩与重建

PCA的一个重要应用是数据压缩。通过只保留最重要的特征向量(即对应最大特征值的特征脸),我们可以用更少的维度来近似表示原始数据。

以下是重建过程的步骤:

  1. 选择前 ( k ) 个特征向量。
  2. 将原始数据投影到这些特征向量张成的子空间上。
  3. 使用投影系数重建数据。

重建公式
[
\hat{x} = \mu + \sum_{i=1}^{k} (v_i^T (x - \mu)) v_i
]
其中 ( \hat{x} ) 是重建后的数据点,( \mu ) 是均值,( v_i ) 是第 ( i ) 个特征向量。

我们尝试用不同数量的特征向量来重建人脸图像:

  • 使用前2个特征向量:重建效果较差,图像模糊。
  • 使用前10个特征向量:重建效果有所改善,但细节仍不清晰。
  • 使用前50个特征向量:重建效果良好,图像可识别。
  • 使用前150个特征向量:重建效果优秀,细节丰富。

这表明,仅用150个数字(而不是原始的4096个像素)就可以相当准确地重建一张人脸图像。


MNIST数据集上的应用

同样的方法也可以应用于其他数据集,如MNIST手写数字数据集。MNIST图像通常表示为784维的向量(28x28像素)。

我们计算了MNIST数据的特征值和特征向量,并绘制了对应的“特征数字”。与特征脸类似,这些特征数字代表了手写数字变化的主要模式。

特征数字:对应MNIST数据协方差矩阵特征向量的图像。

通过只保留前30个特征向量,我们可以重建手写数字图像,且重建质量相当不错。


数据可视化与聚类

最后,我们使用前两个主成分将高维数据投影到二维平面上,以便可视化。每个点代表一个MNIST数字,颜色表示其对应的数字标签。

二维投影
[
\text{投影坐标} = [v_1^T x, v_2^T x]
]
其中 ( v_1 ) 和 ( v_2 ) 是前两个特征向量。

在二维投影中,我们可以看到相同数字的点倾向于聚集在一起。这表明,在高维空间中,语义上相似的数据点确实彼此接近。


总结

在本节课中,我们一起学习了:

  1. 如何将数据表示为向量,并理解特征空间的概念。
  2. 在高维空间中进行线性插值,观察数据的连续性。
  3. 使用PCA找到数据的主要变化方向,并通过特征脸和特征数字进行可视化。
  4. 利用PCA进行数据压缩,仅用少量特征向量重建原始数据。
  5. 将高维数据投影到低维空间进行可视化,观察数据的聚类情况。

通过这些演示,我们深入理解了PCA和KL变换在实际问题中的应用,为后续学习更复杂的机器学习方法打下了坚实的基础。

023:维度诅咒 📚

在本节课中,我们将深入探讨一个在机器学习与数据分析中无处不在,却又常被简略提及的核心问题:维度诅咒。我们将从基础概念出发,通过严谨的数学推导和直观的实例,逐步揭示高维空间的诸多反直觉特性。理解这些特性,对于正确应用分类器、降维算法或聚类方法至关重要。


从西瓜问题看高维空间 🍉

让我们从一个日常例子开始,直观感受维度增加带来的影响。

假设你在市场挑选西瓜。你不想要太多白色的瓜瓤(Rind),而想要更多红色的瓜肉(Flesh)。如果瓜皮的厚度仅占西瓜半径的15%,情况会如何?

以下是不同维度下的瓜皮占比:

  • 一维切片:瓜皮占半径的 15%
  • 二维切片:瓜皮占面积的 28%
  • 三维西瓜:瓜皮占体积的 39%

由此可见,即使瓜皮很薄,在高维物体中,它所占的体积比例也会急剧增加。你购买的三维西瓜中,近40%是你想扔掉的瓜皮。这个例子初步展示了维度增加可能带来的反直觉结果。


基础准备:从对角线到斯特林公式 📐

为了深入理解高维几何,我们需要一些数学工具。首先,回顾一下多维空间中对角线长度的计算。

在一个D维立方体中,从原点到点 \((x_1, x_2, ..., x_D)\) 的对角线长度 \(L\) 由广义勾股定理给出:

\[L = \sqrt{x_1^2 + x_2^2 + ... + x_D^2} \]

接下来,我们将推导斯特林公式,它用于近似计算阶乘 \(n!\),这在后续计算中非常有用。

我们从 \(n!\) 的对数开始:

\[\log(n!) = \sum_{k=1}^{n} \log(k) \]

这个求和可以用积分来近似。利用分部积分法,我们可以计算定积分 \(\int_1^n \log(x) dx\)

分部积分公式为:

\[\int u \, dv = uv - \int v \, du \]

\(u = \log(x)\), \(dv = dx\),则 \(du = \frac{1}{x}dx\), \(v = x\)。代入公式:

\[\int_1^n \log(x) dx = [x \log(x)]_1^n - \int_1^n x \cdot \frac{1}{x} dx = n\log(n) - n + 1 \]

为了获得更好的近似,我们使用梯形法则进行数值积分。最终,对两边取指数,我们得到斯特林公式:

\[n! \approx \sqrt{2\pi n} \left( \frac{n}{e} \right)^n \]

随着 \(n\) 增大,近似值与真实值的比率趋近于1,尽管它们的差值可能变大。


伽马函数与超球体体积 🌌

上一节我们介绍了阶乘的近似,本节我们将认识伽马函数,它是阶乘在实数域上的推广,对于计算高维球体体积至关重要。

伽马函数定义为:

\[\Gamma(n) = \int_0^\infty x^{n-1} e^{-x} dx \]

通过分部积分,可以证明它满足递推关系:\(\Gamma(n) = (n-1) \cdot \Gamma(n-1)\),且 \(\Gamma(1)=1\)。因此,对于正整数 \(n\),有 \(\Gamma(n) = (n-1)!\)

一个关键值是 \(\Gamma(\frac{1}{2}) = \sqrt{\pi}\)。其计算技巧(通过平方后转化为极坐标下的二重积分)将直接用于推导超球体体积公式。


高维球体的体积与“外壳”悖论 🎱

现在,我们利用伽马函数来探究高维空间的核心谜题之一:超球体的体积特性。

一个 \(n\) 维超球体的体积公式为:

\[V_n(R) = C_n R^n \]

其中 \(C_n\) 是依赖于维度 \(n\) 的常数。通过将体积视为无穷多个球壳面积的和,并联系到伽马函数,我们可以精确求出:

\[C_n = \frac{\pi^{n/2}}{\Gamma(\frac{n}{2} + 1)} \]

分析这个公式,我们会发现两个反直觉的结论:

  1. 体积趋于零:对于固定的半径 \(R\),当维度 \(n\) 无限增加时,超球体的体积 \(V_n(R) \to 0\)
  2. 体积集中于外壳:考虑一个半径为 \(R\) 的球和一个半径为 \((1-\epsilon)R\) 的内层球(\(\epsilon\) 是一个很小的正数)。外壳(两个球之间的部分)体积与总体积的比为:

    \[1 - (1-\epsilon)^n \]

    \(n\) 很大时,即使 \(\epsilon\) 很小,这个比值也趋近于1。这意味着,几乎所有的体积都集中在球体表面附近的外壳里,中心部分几乎是“空”的。

回到西瓜的例子,如果瓜皮(外壳)厚度占半径的15%,在90维空间中,瓜皮将占据西瓜体积的95%以上。


对机器学习与优化的启示 🤖

上述几何特性对数据科学和机器学习有着深远的影响。

1. 高斯分布与均值点
在高维空间中,一个多元高斯分布的样本点几乎不可能落在均值点附近。概率质量主要分布在一个远离均值的“壳”上。这意味着,在高维中,“平均情况”实际上是一种非常罕见的情况。

2. 随机初始化的困境
在优化问题中(如神经网络的训练),我们常希望找到全局最优解(“瓜肉”),但它可能只存在于参数空间的一个很小区域内。在低维空间,随机初始化有较大概率落入这个区域。但在高维空间,由于体积集中于外壳,且目标区域体积占比极小,随机初始化策略几乎注定失败。

3. 向量几乎正交
在高维空间中随机抽取两个向量,它们几乎总是近似正交的。具体来说,对于由 \(+1\)\(-1\) 组成的随机向量,随着维度增加,它们之间夹角的余弦值趋近于0。这表明高维空间中有极其丰富的方向,也解释了为什么寻找精确的正交基在数值计算中如此困难。

4. 数据稀疏性与采样需求
要估计一个 \(D\) 维空间中的概率分布,如果每个维度需要 \(B\) 个区间(bin),那么总共需要 \(B^D\) 个区间。所需的数据样本量随维度指数级增长,这就是“维度诅咒”在统计学中的直接体现,导致许多在低维有效的方法(如直方图)在高维失效。


历史案例与不同距离度量 🛩️

一个著名的历史案例发生在1950年代。美国空军发现战机事故频发,调查发现驾驶舱是根据飞行员的“平均”身体尺寸设计的。一位统计学家测量了4063名飞行员的10项身体指标,然后检查有多少人的所有指标都落在平均值的30%范围内。结果是:0人。这个“平均”驾驶舱并不适合任何人。这正是高维空间中“平均点”不代表任何典型个体的生动例证。

最后需要指出,我们讨论的悖论基于欧几里得距离(L2范数)。在实际应用中,可以根据问题选择不同的距离度量,例如:

  • 曼哈顿距离(L1范数):适用于稀疏特征。
  • 切比雪夫距离(L∞范数):适用于比较由最大差异主导的对象。
    任何有效的距离度量都需要满足非负性、同一性、对称性和三角不等式。

总结 📝

本节课我们一起深入探讨了维度诅咒。我们从切西瓜的直观例子出发,逐步推导了斯特林公式和伽马函数,并严格计算了高维球体的体积,从而揭示了高维空间的核心特性:

  1. 高维球体体积随维度增加而趋近于零。
  2. 高维球体的体积几乎全部集中于表面薄壳内。
  3. 这些几何特性导致高维数据极其稀疏,使得均值失去代表性、随机搜索效率低下、数据采样需求爆炸式增长。

理解维度诅咒,能帮助我们在面对高维数据时保持警惕,审慎选择模型、算法和评估方法,避免陷入直觉的误区。

024:最大似然估计与独立性 📊

在本节课中,我们将学习两个核心概念:统计独立性与最大似然估计。独立性是理解变量间关系的基础,而最大似然估计则是从数据中学习模型参数的关键方法。我们将首先探讨独立性的定义与含义,然后深入讲解最大似然估计的原理与应用。

统计独立性 🔗

上一节我们介绍了本课程的主题,本节中我们来看看统计独立性的定义。在概率论中,如果两个变量的联合分布可以分解为它们各自边缘分布的乘积,则称变量X独立于变量Y。

公式P(X, Y) = P(X) * P(Y)

独立性的一个等价定义是,给定Y的条件下,X的条件分布等于X的边缘分布。

公式P(X | Y) = P(X)

这两个公式的含义是,Y和X不包含关于彼此的额外信息。更直白地说,无论Y取什么值,X的概率分布都不会改变。反之亦然,观察X也无助于预测Y。例如,本周的轮盘赌结果与下周的结果是独立的。

以下是独立性与依赖性的图示说明:


在左侧图中,变量是非信息性的,联合分布就是边缘分布的乘积。如果你知道Y的值,X的分布不会改变。在右侧图中,变量是依赖的。例如,如果你知道Y的值为0,你对X的了解不多;但如果你知道Y的值为2,你就能大致确定X的位置。因此,X和Y的值之间存在依赖关系,彼此具有预测能力。

条件独立性 🔄

理解了无条件独立性后,我们进一步探讨条件独立性。当我们谈论纯粹独立性时,指的是无论观察到什么变量,关系都成立。而条件独立性讨论的是,在给定第三个变量Z的条件下,X和Y的联合概率是否可分解。

公式P(X, Y | Z) = P(X | Z) * P(Y | Z)

如果上述公式成立,那么在已知Z的情况下,X和Y是独立的。这意味着,Z是一个共同因素。如果我们用图形表示,X和Y都依赖于Z。但如果我们没有观察到Z,只观察X和Y,那么它们就不是独立的,因为Z向X和Y都添加了信息。

以下是条件独立性的一个经典例子:

  • 现象:儿童的鞋码大小与阅读能力之间存在明显的依赖关系(相关性)。
  • 解释:鞋码越大的孩子,阅读能力往往越好。
  • 共同原因(Z):年龄。
  • 条件独立性:在固定儿童的年龄(例如,所有7岁儿童)的条件下,比较鞋码和阅读能力,它们之间将不再有依赖关系。

另一个有趣的例子是关于鹳鸟数量与欧洲人类出生率的研究。数据显示两者存在高度显著的统计相关性,但这并不意味着鹳鸟送子。其背后的共同原因是国家规模:更大的国家通常有更多的鹳鸟和更多的新生儿。当忽略国家规模这个共同原因时,就会产生虚假的相关性解释。

伦敦出租车司机的事故与穿外套之间的相关性是另一个例子。调查最初认为外套妨碍行动导致事故,并准备立法禁止。后来人们意识到,司机穿外套是因为下雨,而下雨时路面湿滑,事故本就更多。这再次说明,相关性不等于因果性

最大似然估计 🎯

在理解了数据中的独立性关系后,我们来看看如何从数据中估计模型参数。最大似然估计是参数估计的核心方法。

其核心思想是:给定一个由参数θ定义的模型和一组观测数据D,我们希望找到能使观测数据出现“可能性”最大的参数值θ。

公式θ_MLE = argmax_θ P(D | θ)

这里的 P(D | θ) 被称为似然函数。通常,我们假设数据点是独立同分布的,因此联合似然可以写成每个数据点似然的乘积。

公式P(D | θ) = Π_i P(x_i | θ)

在实际计算中,我们通常最大化对数似然函数,因为乘积取对数后会变成求和,更便于数学处理和计算。

公式θ_MLE = argmax_θ Σ_i log P(x_i | θ)

以下是执行最大似然估计的基本步骤:

  1. 定义模型:根据问题选择一个概率模型 P(x | θ)
  2. 写出似然函数:基于观测数据,写出似然函数 L(θ) = P(D | θ)
  3. 取对数:得到对数似然函数 l(θ) = log L(θ)
  4. 求导并设为零:对 l(θ) 关于参数θ求导,令导数等于零。
  5. 求解方程:解出使导数等于零的参数值θ,即为最大似然估计值。

例如,对于服从正态分布 N(μ, σ^2) 的数据,其参数的最大似然估计就是样本均值和样本方差。

代码示例(概念性伪代码)

# 假设数据 data 来自某个分布 P(x|θ)
def log_likelihood(theta, data):
    # 计算对数似然 Σ_i log P(data[i] | theta)
    ...

# 使用优化算法(如梯度下降)找到最大化 log_likelihood 的 theta
theta_mle = optimize.maximize(log_likelihood, initial_guess, args=(data,))

总结 📝

本节课中我们一起学习了统计独立性与最大似然估计。独立性定义了变量间缺乏信息关联的状态,而条件独立性揭示了在控制共同因素后变量关系的变化,这有助于我们避免将相关性误判为因果性。最大似然估计为我们提供了一种基于数据寻找最可能模型参数的强大工具,它是许多机器学习算法的基础。理解这两个概念,对于构建和解释机器学习模型至关重要。

026:MLE作为KL散度最小化 🧠

在本节课中,我们将探讨最大似然估计与KL散度之间的深刻联系。我们将从信息论的基础概念出发,逐步理解如何量化信息,并最终揭示MLE本质上是在最小化两个概率分布之间的KL散度。

信息与熵的度量 📏

上一节我们介绍了最大似然估计的基本概念。本节中,我们来看看如何从信息论的角度理解它。首先,我们需要一个方法来度量信息。

在通信中,我们通过交换信号来传递消息。“信息”这个词本身很模糊,只是一个直观的概念。直观上,一个消息并不总是等于另一个消息。我们通常会说一个消息“包含信息”,但如何度量消息和信息呢?

经过长时间的思考,研究人员为信息的度量设定了以下要求。这些要求基于以下假设:

  • 消息是由固定字母表中的字符组成的字符串。
  • 消息所包含的信息量应该是所有可能消息总数的函数。如果一个字母表有 S 个符号,那么长度为 L 的消息总数是 S^L
  • 两条消息所包含的总信息量,应该是各自信息量的和。
  • L 条长度为1的消息的信息量,应该等于一条长度为 L 的消息的信息量。

在这些简化的设定下,我们可以用什么来计算信息量呢?

1928年,哈特利提出了以下度量。他声称,并且我们现在也同意,唯一满足所有这些要求的函数是 L log S,或者 log (S^L)。其中 S 是字母表中的符号数量,L 是消息的长度。

这个信息度量方法有一个需要注意的地方:它隐含地假设了所有符号出现的可能性是相等的。当所有符号等可能出现在消息中时,这个度量方法效果很好。

20年后,香农在此基础上更进一步。他考虑的情况略有不同:如果符号具有不同的概率呢?

X 是一个具有 N 种结果的离散随机变量,这些结果就是我们字母表中的 N 个符号 x1xN。结果 xi 出现的概率是 P(xi)

关于 X 结果的一条消息所包含的平均信息量是:

H(X) = - Σ_{i=1}^{N} P(x_i) log P(x_i)

这也可以写成微分信息的形式。这实际上是 -log P(x) 的期望。对于连续信号,其连续形式的熵(微分熵)有时会有一些棘手的行为,但它仍然是一个很好的度量。对于离散字母表 X,香农就是这样定义信息度量的。

与哈特利的信息度量一样,我们仍然使用对数函数来平滑变化。在概率密度均匀的情况下,即每个符号 xi 等可能时,我们就得到了哈特利信息。

那么,为什么我们称之为“熵”呢?物理学家冯·诺依曼曾对香农说:“你应该叫它熵,原因有两点:第一,你的不确定性函数在统计力学中已经用了这个名字。第二,更重要的是,没人真正知道熵到底是什么,所以在辩论中你总能占上风。”

交叉熵与KL散度 🔀

现在,我们考虑另一种情况。如果信号是根据概率分布 P 生成的,但我们却使用为概率分布 Q 构造的最优编码来编码,会发生什么?

我们测量的是,当使用为 Q 设计的编码时,发送一条包含从 P 中抽取的符号的消息所需的比特数。这被称为交叉熵

显然,由于编码是为 Q 设计的,它对 P 来说是次优的。因此,交叉熵会高于我们使用为 P 设计的最优编码时的熵。

现在我们有了理解KL散度所需的一切。KL散度定义为:

D_KL(P || Q) = E_{x~P} [ log (P(x) / Q(x)) ]

或者写成积分形式。如果你想计算两个分布之间的差异(不是距离,而是一种不相似性的度量),就可以用它。当 PQ 完全相同时,KL散度为0。KL散度的一个好性质是非负,最小值是0。但它的坏性质是不对称。

如果我们重写这个公式,对数的比值就是 log P - log Q,然后利用期望的线性性质,我们可以得到:

D_KL(P || Q) = E_{x~P} [log P(x)] - E_{x~P} [log Q(x)]

从这里我们看到,KL散度可以解释为:当我们使用为分布 Q 设计的编码时,发送一条包含从分布 P 中抽取的符号的消息所需的额外比特数。换句话说,就是 PQ 的交叉熵减去 P 的熵。

因为这个编码是次优的,当 P 不等于 Q 时,交叉熵大于熵,所以KL散度为正。

现在你知道了KL散度是什么,并且可以看到,如果我们交换 PQ 的位置,结果将不同,所以它是不对称的。值得思考一下,这种差异会是什么。

MLE与KL散度最小化的联系 ⛓️

我告诉你所有这些关于熵和KL散度的内容,它与我们这堂课的主题——最大似然估计——有什么关系呢?

事实上,最大似然估计就是KL散度最小化。我现在来快速展示一下。

回想一下,我们的MLE估计 θ_MLE 是:

θ_MLE = argmax_θ Π_{i=1}^{N} P(x_i | θ)

另一种写法是,用 Q_θ 表示我们参数化的模型分布。MLE就是寻找能最大化似然函数的 θ。因为我们假设数据集 D 是独立同分布采样的,所以似然等价于各个样本概率的乘积。

N 很大时,所有这些值都小于1,许多小于1的数的乘积会因为下溢错误等问题而难以处理。因此,我们通常转而取对数。由于对数函数是单调递增的,最大化原函数与最大化其对数函数,所得到的 θ 是相同的。

引入对数后,公式开始变得熟悉:

θ_MLE = argmax_θ Σ_{i=1}^{N} log Q_θ(x_i)

当数据量很大时,根据大数定律,这个求和近似于期望:

θ_MLE ≈ argmax_θ E_{x~P_data} [ log Q_θ(x) ]

这几乎等同于我们之前看到的:我们在计算 log Q_θ 相对于真实数据分布 P_data 的期望。这是什么?这正是负的交叉熵

因此,当我们最大化这个量时,我们实际上是在最小化真实数据分布 P_data 与我们试图拟合数据的模型分布 Q_θ 之间的KL散度。想象数据是从同一个分布族中生成的,比如 Q_θ。我们从一个随机的 θ 开始,MLE所做的就是最小化这两个分布之间的KL散度,从而将我们的 θ 估计值推向 θ

这就是一个简洁的联系和解释:最大化似然(MLE)实际上就是在最小化KL散度


本节课中,我们一起学习了信息论中熵与交叉熵的概念,深入理解了KL散度作为衡量两个概率分布差异的工具。最重要的是,我们揭示了最大似然估计的本质:它并非一个孤立的参数估计方法,而是在最小化模型分布与真实数据分布之间的KL散度。这一观点为理解许多机器学习算法(尤其是在深度学习中的损失函数设计)提供了统一的理论基础。

027:贝叶斯决策理论 🎯

在本节课中,我们将要学习贝叶斯决策理论。这是一种基于概率和代价来权衡不同分类决策的方法。我们将从一个简单的鱼类分类工厂的例子开始,逐步理解贝叶斯世界观的核心思想,并学习如何利用先验知识、观测数据和贝叶斯定理来做出最优决策。

贝叶斯世界观 🌍

上一节我们介绍了从数据直接进行预测的经典方法。本节中我们来看看贝叶斯方法有何不同。

贝叶斯方法的核心思想是:我们面对的世界本质上是概率性的。因此,我们不仅承认数据具有不确定性,还希望对所有我们处理的参数和变量都赋予一个概率分布。这意味着,我们假设每个参数都有其对应的概率分布形状,尽管我们很少能确切知道它,但有一些技巧可以帮助我们量化这种不确定性。

什么是贝叶斯决策理论? 🤔

贝叶斯决策理论是一种基于概率和伴随决策的代价来量化各种分类决策之间权衡的方法。它基于几个关键假设:决策问题以概率形式提出,并且所有相关的概率值都是已知的。

让我们考虑一个简单的例子:一个鱼类加工厂。

我们有两种鱼:三文鱼和海鲈鱼。我们希望自动化整个分类过程。渔民将鱼倒入接收装置,然后系统需要将鱼分类为三文鱼或海鲈鱼,并据此贴上不同的价格标签。

我们如何做到这一点?

先验知识与决策规则 📊

首先,假设我们对渔民每天捕获的鱼类比例有一些先验知识。我们用随机变量 ω 表示鱼的种类,它属于一个两类变量:ω1 代表三文鱼,ω2 代表海鲈鱼。

  • 先验概率 P(ω1):表示一条鱼是三文鱼的先验概率。
  • 先验概率 P(ω2):表示一条鱼是海鲈鱼的先验概率。

这些先验概率是在我们观察任何具体鱼之前就已知的知识。如果我们只知道先验概率,如何构建决策规则?

我们可以遵循一个简单的规则:如果三文鱼的先验概率高于海鲈鱼,则将所有鱼都判定为三文鱼;反之,则全部判定为海鲈鱼。这个规则基于我们已知的信息,可以最小化犯错的概率。然而,这是一个非常粗糙的规则。如果两类先验概率相等,那么这相当于随机猜测,正确率只有50%。

引入观测特征:似然与后验 🔍

为了改进决策,我们可以观察鱼的具体特征。例如,设 x 为观测到的鱼的亮度(明暗程度)。

如果我们知道类条件概率密度,即给定类别下观测到某个特征的概率,我们就能做出更好的决策。例如:

  • P(x | ω1):如果是一条三文鱼,其亮度为 x 的概率。
  • P(x | ω2):如果是一条海鲈鱼,其亮度为 x 的概率。

但我们真正想要的是后验概率:给定观测到特征 x,这条鱼属于某个类别的概率。即 P(ω | x)

贝叶斯定理(又称逆概率定理)帮助我们实现这个转换。其公式如下:

P(ω | x) = [P(x | ω) * P(ω)] / P(x)

其中:

  • P(ω | x)后验概率
  • P(x | ω)似然
  • P(ω)先验概率
  • P(x)证据(对所有类别的边际似然求和)。

对于 C 个类别,证据的计算公式为:P(x) = Σ P(x | ω_i) * P(ω_i)

贝叶斯定理的直观推导 🧮

记住公式可能很难,但推导它却相对简单。让我们通过一个二维变量 (X, Y) 的联合分布来直观理解。

我们从联合概率 P(X, Y) 开始。通过对其中一个变量(如 Y)进行边际化,我们可以得到另一个变量(X)的边际分布:P(X) = ∫ P(X, Y) dY

现在,假设我们固定 X = c,我们想知道 Y 的条件分布 P(Y | X=c)。这可以通过在 X=c 这条“线”上查看联合分布来获得,但这条“线”本身可能不积分为1。为了使其成为一个有效的概率分布,我们需要用 X=c 处的边际概率 P(X=c) 对其进行归一化。因此:

P(Y | X) = P(X, Y) / P(X)

通过对称性,同样有:P(X | Y) = P(X, Y) / P(Y)

将这两个等式结合,我们可以得到贝叶斯定理的形式:P(Y | X) = [P(X | Y) * P(Y)] / P(X)

贝叶斯定理的应用示例:疾病检测 🦠

我们可以用贝叶斯公式来修正直觉。考虑一个疾病检测的例子:

  • 已知一种罕见疾病 PML 的患病率(先验)为 1/200,000。
  • 诊断测试的准确率为 99%(即,如果患病,测试为阳性的概率 P(阳性|患病) = 0.99;如果未患病,测试为阴性的概率也是 0.99,所以 P(阳性|未患病) = 0.01)。
  • 问题:如果一个人的检测结果为阳性,他实际患病的概率 P(患病|阳性) 是多少?

使用贝叶斯公式计算:
P(患病|阳性) = [P(阳性|患病) * P(患病)] / P(阳性)
其中 P(阳性) = P(阳性|患病)*P(患病) + P(阳性|未患病)*P(未患病)

代入数值计算后,会发现 P(患病|阳性) 只有大约 5%。这说明即使测试非常准确,但由于疾病本身极其罕见,一个阳性结果更可能是假阳性。这展示了贝叶斯推理的强大之处。

构建最优决策规则 🏆

回到我们的鱼类工厂问题。我们测量每条鱼的亮度 x,并计算其后验概率 P(ω1 | x)P(ω2 | x)

最优决策规则是:选择后验概率更高的那个类别。

  • 如果 P(ω1 | x) > P(ω2 | x),则判定为三文鱼 (ω1)。
  • 否则,判定为海鲈鱼 (ω2)。

遵循此规则,在任意观测点 x 上,我们的错误概率是 min(P(ω1 | x), P(ω2 | x))。这是理论上可能达到的平均最优性能。

广义贝叶斯决策理论 ⚙️

现在让我们将理论一般化,以处理更复杂的情况:

  • 多特征:特征 x 可以是多维向量。
  • 多类别:类别 ω 可以多于两个。
  • 多种行动:除了分类,还可以选择“拒绝判断”或其他行动。
  • 损失函数:引入更一般的损失函数 λ(α_i | ω_j),表示当真实类别为 ω_j 时采取行动 α_i 所造成的代价(而不仅仅是错误概率)。

定义条件风险:给定观测 x 采取行动 α 的期望损失。
R(α_i | x) = Σ_j λ(α_i | ω_j) * P(ω_j | x)

贝叶斯决策规则的目标是选择那个能最小化条件风险的行动。总风险则是所有可能观测上条件风险的期望。

最大后验概率估计 🎲

在纯粹的贝叶斯观点中,答案是一个完整的概率分布(后验分布)。但有时我们只需要一个点估计。最大后验概率估计 就是选择后验概率最大的那个参数值作为估计。

例如,在抛硬币问题中,我们想估计正面朝上的概率 θ。我们有一个先验分布 P(θ)(例如 Beta 分布)和似然函数 P(数据 | θ)(二项分布)。通过贝叶斯定理得到后验分布 P(θ | 数据)。MAP 估计就是找到使 P(θ | 数据) 最大的 θ 值。

共轭先验 是一个有用的概念:如果我们为某个似然函数选择特定形式的先验分布(如 Beta 分布对于二项似然),那么后验分布将保持与先验相同的形式,这大大简化了计算。

决策规则的简化:似然比与对数似然比 ➗

在实际比较两个类别的后验概率时,我们经常使用简化形式。决策规则是比较 P(ω1 | x)P(ω2 | x)

利用贝叶斯公式,我们可以得到似然比
[P(ω1 | x)] / [P(ω2 | x)] = [P(x | ω1) * P(ω1)] / [P(x | ω2) * P(ω2)]

注意,证据项 P(x) 被约掉了。决策规则变为:如果似然比大于1,则选择 ω1,否则选择 ω2。

进一步,取对数得到对数似然比,并与0比较:
log [P(x | ω1) / P(x | ω2)] + log [P(ω1) / P(ω2)] > 0 ? ω1 : ω2
这在实际计算中常常更方便。

总结 📝

本节课中我们一起学习了贝叶斯决策理论的核心内容。我们从贝叶斯世界观出发,理解了先验概率、似然函数、证据和后验概率的概念。通过贝叶斯定理,我们可以将先验知识与观测数据结合,得到用于决策的后验概率。我们学习了如何构建最小化错误概率或期望损失的最优决策规则,并探讨了其一般化形式。最后,我们了解了最大后验概率估计作为贝叶斯点估计的方法,以及共轭先验和似然比检验等实用技巧。掌握这些概念是理解更高级贝叶斯机器学习方法的基础。

028:朴素贝叶斯与最大后验估计 🧠

在本节课中,我们将学习两种重要的概率估计方法:最大后验估计和朴素贝叶斯分类器。我们将从理解最大后验估计开始,然后探讨如何将其应用于构建一个简单而强大的分类器。

最大后验估计

上一节我们介绍了最大似然估计,它完全由数据决定参数。本节中我们来看看当数据量不足时,如何利用先验知识来改进估计,这就是最大后验估计。

假设你怀疑一枚硬币是有偏的。你抛掷它并记录结果。最大似然估计会给出一个估计值。如果抛掷次数足够多,它可能会收敛到真实的均值。但如果你只能看到很少几次抛掷结果呢?你能否利用已有的知识?这就是最大后验估计要解决的问题。

在贝叶斯的世界观中,我们不以确定性看待事物,而是用概率来量化知识或参数的不确定性。如果我们怀疑硬币接近50/50的公平状态,如何表达这种“怀疑”或“先验信念”?贝叶斯主义者建议使用概率作为科学的逻辑基础。

遵循贝叶斯方法,我们不是估计一个单一的参数值θ,而是获得一个关于θ可能取值的概率分布。θ是我们似然函数的参数。对于给定的参数θ,观测到特定数据的概率就是似然函数。

在现实中,我们不会说某个概率绝对是1。我们会说,我们相当确定它是1/2,但也存在一些不确定性,它可能稍低或稍高。这就是先验分布,它代表了在看到任何数据之前,我们对参数θ的期望。后验分布则会在看到数据后,根据数据更新我们的先验信念。

如何选择先验分布?

以下是选择先验分布的两种主要思路:

  • 哲学方法:我们希望先验分布能够代表专家知识或我们自己的知识,并将其编码为概率密度形式。这通常能带来最好的结果。
  • 工程或实用方法:我们希望选择一个能使后验分布形式简单、易于处理的先验。其中一种重要的先验是共轭先验

共轭先验能保证后验分布具有闭式解,并且与先验分布属于同一函数族。这意味着后验概率 P(θ|数据) 会有一个易于处理的解析形式。

贝叶斯定理与链式法则

托马斯·贝叶斯在1763年发表了《论机会学说中一个问题的解》,其中核心思想后来发展为贝叶斯定理。

链式法则指出,对于联合分布 P(X, Y),我们可以将其分解为条件概率和边缘概率的乘积:P(X, Y) = P(X|Y)P(Y)。反之,也可以写成 P(Y|X)P(X)

从链式法则可以推导出贝叶斯定理:P(Y|X) = P(X|Y)P(Y) / P(X)。贝叶斯定理的重要性在于其“反向条件化”的特性。如果我们知道如何计算 P(X|Y),就可以利用这个规则反过来计算 P(Y|X)

MLE 与 MAP 的对比

在贝叶斯学习中,我们有数据 D(一组样本)。我们希望最大化后验概率 P(θ|D)。根据贝叶斯定理:
P(θ|D) = P(D|θ)P(θ) / P(D)
由于 P(D) 是与θ无关的归一化常数,在最大化时我们可以忽略它。因此,我们通常处理比例关系:P(θ|D) ∝ P(D|θ)P(θ),即似然 × 先验

现在,对比最大似然估计和最大后验估计:

  • 最大似然估计:选择使观测数据概率最大的值。θ_MLE = argmax_θ P(D|θ)
  • 最大后验估计:选择在给定观测数据和先验信念下最可能的值。θ_MAP = argmax_θ P(θ|D) = argmax_θ P(D|θ)P(θ)

引入先验 P(θ) 后,即使在没有足够数据进行精确MLE估计的情况下,我们也能得到更有用的参数估计。当先验是均匀分布(无信息先验)时,MAP估计就退化为了MLE估计,因为此时 P(θ) 是常数。

实践:硬币抛掷的MAP估计

我们从一个具体例子开始:估计有偏硬币正面朝上的概率θ。

  • 似然函数:我们使用二项分布似然。P(D|θ) = θ^{#正面} (1-θ)^{#反面}
  • 先验选择:我们选择Beta分布作为θ的先验。Beta分布定义在[0,1]区间上,正好适合表示概率参数θ的分布。其概率密度函数为:P(θ) ∝ θ^{α-1}(1-θ)^{β-1},其中α和β是形状参数。

如果我们选择Beta先验,一个美妙的事情会发生:后验分布 P(θ|D) 也将是一个Beta分布。这正是共轭性的体现。计算后验时,我们得到:
P(θ|D) ∝ θ^{#正面 + α - 1} (1-θ)^{#反面 + β - 1}
新的Beta分布参数变成了 α' = #正面 + αβ' = #反面 + β

此时,最大后验估计为:
θ_MAP = (#正面 + α - 1) / (#正面 + #反面 + α + β - 2)
注意,它不再是简单的正面频率,而是融合了先验信息(通过α和β)。α和β可以理解为我们对“虚拟”正面和反面次数的先验信念。

先验的影响与贝叶斯学习

让我们看看后验分布如何随数据变化。

  • 起点:假设我们先验认为硬币是公平的,设置 α = β = 2,先验分布集中在0.5附近。
  • 过程:随着我们抛掷硬币次数增加,观测到的正面和反面次数被加到α和β上。
  • 结果:后验分布变得越来越集中。当数据量很大时(例如抛掷300次),先验参数(2和2)的影响就微乎其微了。后验分布主要由数据主导。

这就是贝叶斯学习:我们通过先验知识编码初始信念,然后根据新数据更新信念。对于小数据,先验起到正则化作用,防止过拟合或产生荒谬的估计。对于大数据,先验的影响会被“洗掉”,数据占据主导。即使使用非正常的无信息先验,一旦有数据进入,后验也会变得正常,这是贝叶斯学习的一个良好性质。

扩展到多项分布:掷骰子

如果我们不是抛硬币,而是掷一个有K个面的骰子呢?这时我们使用多项分布作为似然函数。
P(D|θ) ∝ ∏_{k=1}^{K} θ_k^{n_k}
其中 θ_k 是第k面朝上的概率,n_k 是观测到的第k面朝上的次数。

为了进行MAP估计,我们选择狄利克雷分布作为先验。狄利克雷分布是Beta分布在多维上的推广,定义在概率单纯形上(即所有 θ_k 满足 θ_k > 0∑θ_k = 1)。
P(θ) ∝ ∏_{k=1}^{K} θ_k^{β_k - 1}

狄利克雷分布也是多项分布的共轭先验。后验分布同样是狄利克雷分布:
P(θ|D) ∝ ∏_{k=1}^{K} θ_k^{n_k + β_k - 1}
新的参数为 β_k' = n_k + β_kβ_k 可以解释为我们对第k类结果出现次数的先验信念。

贝叶斯定理应用练习

在进入朴素贝叶斯分类器之前,我们先通过两个例子巩固对贝叶斯定理的理解。

练习1:水果盒子问题

假设有三个颜色的盒子:

  • 红盒:3个苹果,2个橙子,3个酸橙
  • 绿盒:2个苹果,4个橙子,1个酸橙
  • 蓝盒:2个苹果,1个橙子,0个酸橙

随机选择一个盒子的概率为:P(绿)=0.2, P(红)=0.2, P(蓝)=0.6。
然后从选中的盒子中均匀随机抽取一个水果,发现是橙子。
问题:这个橙子来自绿盒的概率是多少?

解答:这正是贝叶斯定理“反向条件化”的应用。我们想知道 P(绿盒 | 橙子)
根据贝叶斯定理:
P(绿盒 | 橙子) = P(橙子 | 绿盒) * P(绿盒) / P(橙子)
其中:

  • P(橙子 | 绿盒) = 4/7 (绿盒中4个橙子,共7个水果)
  • P(绿盒) = 0.2
  • P(橙子) = P(橙子|绿盒)P(绿盒) + P(橙子|红盒)P(红盒) + P(橙子|蓝盒)P(蓝盒)
    • P(橙子|红盒) = 2/8 = 1/4P(红盒)=0.2
    • P(橙子|蓝盒) = 1/3P(蓝盒)=0.6
      计算 P(橙子) 并代入,即可得到 P(绿盒 | 橙子) ≈ 0.314

练习2:艾滋病检测问题

假设一种艾滋病检测试纸:

  • 人群感染率(先验):P(患病) = 0.1% = 0.001
  • 检测准确性:如果患病,检测必为阳性(无假阴性):P(阳性 | 患病) = 1
  • 检测特异性:如果健康,有1%的假阳性率:P(阳性 | 健康) = 0.01

问题:如果一个人检测结果为阳性,他实际患病的概率是多少?

解答:应用贝叶斯定理计算 P(患病 | 阳性)
P(患病 | 阳性) = P(阳性 | 患病)P(患病) / P(阳性)
P(阳性) = P(阳性|患病)P(患病) + P(阳性|健康)P(健康) = 1*0.001 + 0.01*0.999 ≈ 0.01099
因此,P(患病 | 阳性) ≈ (1 * 0.001) / 0.01099 ≈ 0.091 ≈ 9%

尽管这个检测看起来非常完美(不漏检),但由于疾病本身发病率极低,检测结果为阳性的人中,真正患病的概率也只有9%左右。

进阶思考:如果我们使用两次独立的检测呢?
假设有第二种检测方法:

  • P(阳性 | 患病) = 0.9 (有10%假阴性)
  • P(阳性 | 健康) = 0.05 (有5%假阳性)

问题:如果同一个人两次检测结果都是阳性,他实际患病的概率是多少?

解答:我们需要计算 P(患病 | 阳性1, 阳性2)。关键在于,在给定患病与否的条件下,两次检测的结果可以认为是条件独立的。因此:
P(阳性1, 阳性2 | 患病) = P(阳性1 | 患病) * P(阳性2 | 患病) = 1 * 0.9 = 0.9
P(阳性1, 阳性2 | 健康) = P(阳性1 | 健康) * P(阳性2 | 健康) = 0.01 * 0.05 = 0.0005
再次应用贝叶斯定理:
P(患病 | 阳性1, 阳性2) = P(阳性1, 阳性2 | 患病)P(患病) / P(阳性1, 阳性2)
分母 P(阳性1, 阳性2) = P(阳性1, 阳性2 | 患病)P(患病) + P(阳性1, 阳性2 | 健康)P(健康) = 0.9*0.001 + 0.0005*0.999 ≈ 0.0013995
因此,P(患病 | 阳性1, 阳性2) ≈ (0.9 * 0.001) / 0.0013995 ≈ 0.643 ≈ 64%

通过结合两次不完美的检测,我们将确诊信心从9%大幅提升到了64%。这个例子展示了结合多个(条件独立)证据的强大力量,也引出了我们下一节的核心——朴素贝叶斯分类器的基本思想。

总结

本节课中我们一起学习了:

  1. 最大后验估计:一种融合了先验知识和观测数据的参数估计方法。当数据稀缺时,它比最大似然估计更稳健。
  2. 共轭先验:为了计算方便而选择的一种先验分布,它能保证后验分布与先验属于同一家族,从而得到闭式解。例如,Beta分布是二项分布的共轭先验,狄利克雷分布是多项分布的共轭先验。
  3. 贝叶斯学习:通过先验分布表达初始不确定性,然后利用数据更新为后验分布的过程。随着数据量增大,先验的影响逐渐减弱。
  4. 贝叶斯定理的应用:我们通过水果盒子和艾滋病检测的例子,练习了如何利用贝叶斯定理进行“反向概率”计算,这是理解后续朴素贝叶斯分类器的基础。关键启示是,结合多个条件独立的证据可以显著提高判断的准确性。

029:朴素贝叶斯分类器 🧠

在本节课中,我们将学习朴素贝叶斯分类器。这是一种基于贝叶斯定理的简单而强大的分类方法,尤其适用于文本分类(如垃圾邮件过滤)等任务。我们将了解其核心假设、工作原理、参数估计方法以及在实际应用中的优缺点。


核心概念与假设

朴素贝叶斯分类器的核心思想是:在给定类别标签 Y 的条件下,所有特征 X_i 都是条件独立的。这意味着,如果我们知道一封邮件是垃圾邮件(Y=spam),那么邮件发送时间、长度、特定词汇的出现等特征之间是相互独立的。

这个条件独立性假设可以用以下公式表示:

P(X_1, X_2, ..., X_D | Y) = ∏_{i=1}^{D} P(X_i | Y)

其中,D 是特征的数量。这个假设极大地简化了模型,因为它允许我们将复杂的联合概率分布分解为多个简单条件概率的乘积。


分类器决策规则

基于上述假设和贝叶斯定理,朴素贝叶斯分类器的决策规则是:对于给定的特征向量 X,选择使后验概率 P(Y | X) 最大的类别 Y。由于 P(X) 对于所有类别是相同的,这等价于最大化联合概率:

y_pred = argmax_{y} P(Y=y) * ∏_{i=1}^{D} P(X_i | Y=y)

这里,P(Y) 是类别的先验概率P(X_i | Y) 是每个特征的条件似然


参数估计:以离散特征为例

为了使用朴素贝叶斯分类器,我们需要从训练数据中估计先验概率 P(Y) 和条件似然 P(X_i | Y)。对于离散特征,这可以通过简单的计数来完成。

以下是估计步骤:

  1. 估计先验概率 P(Y):计算每个类别在训练集中出现的频率。
    P(Y = k) = (数据集中类别为 k 的样本数) / (总样本数 N)
    
  2. 估计条件似然 P(X_i | Y):对于每个特征 i 和每个类别 k,计算该特征取特定值 v 的频率。
    P(X_i = v | Y = k) = (在类别 k 中,特征 i 取值为 v 的样本数) / (类别 k 的总样本数)
    

这种基于计数的最大似然估计方法非常直观且易于计算。


实际应用:文本分类与词袋模型

朴素贝叶斯在文本分类中应用广泛,例如垃圾邮件检测。直接将每个单词在文本中的位置作为特征会导致参数爆炸(例如,词汇表大小^邮件长度)。

为了解决这个问题,我们引入词袋模型。它做出两个简化假设:

  1. 特征独立性(朴素贝叶斯本身)。
  2. 词序无关性:只关心某个词是否在邮件中出现,而不关心其出现的位置和顺序。

在词袋模型中,我们将每封邮件表示为一个长度为 V(词汇表大小)的二进制向量。向量中的每一位对应词汇表中的一个词,如果该词在邮件中出现,则对应位为1,否则为0。这样,需要估计的参数数量就从天文数字减少到了 V * KK 为类别数),变得可行。


潜在问题与解决方案

尽管朴素贝叶斯非常有效,但在实际应用中需要注意两个主要问题:

  1. 零概率问题:如果训练集中从未出现某个特征与某个类别的组合(例如,“奢侈品”这个词从未出现在“非垃圾邮件”中),那么根据最大似然估计,P(“奢侈品” | 非垃圾邮件) = 0。这将导致整个联合概率乘积为零,使得模型无法对该类别做出任何预测。

    • 解决方案:拉普拉斯平滑。在计数时,为每个可能的特征值组合都预先加一个小的计数(通常为1)。这确保了即使未在训练集中观察到,概率估计也不会为零。
  2. 数值下溢:由于需要计算许多小于1的概率的乘积,当特征数量 D 很大时,最终乘积会是一个极其接近0的小数,可能导致计算机浮点数下溢。

    • 解决方案:使用对数概率。我们对目标函数取对数,将乘积转化为求和:log(P(Y) * ∏ P(X_i|Y)) = log(P(Y)) + ∑ log(P(X_i|Y))。最大化原函数等价于最大化其对数函数,且避免了数值下溢。

扩展到连续特征

朴素贝叶斯并不局限于离散特征。对于连续特征(如图像像素强度),我们可以为每个特征 X_i 选择适合的概率分布形式,例如高斯分布

此时,条件似然 P(X_i | Y) 可以建模为一个高斯分布:

P(X_i = x | Y = k) = N(x; μ_{ik}, σ_{ik}^2)

其中,μ_{ik}σ_{ik}^2 是类别 k 下第 i 个特征的均值和方差。这些参数可以从训练数据中估计(例如,计算类别 k 下所有样本在第 i 个特征上的均值和方差)。这种方法在简单图像分类(如手写数字识别MNIST)上也能获得不错的基线效果。


总结

本节课我们一起学习了朴素贝叶斯分类器。我们首先了解了其核心的条件独立性假设,它使得模型得以简化。接着,我们推导了分类器的决策规则,即最大化后验概率。

我们详细探讨了如何使用计数方法估计离散特征的参数,并介绍了在文本分类中至关重要的词袋模型。我们还讨论了模型可能遇到的零概率问题数值下溢问题,并给出了拉普拉斯平滑对数概率的解决方案。最后,我们看到了如何将朴素贝叶斯扩展到连续特征,例如使用高斯分布进行建模。

朴素贝叶斯的强大之处在于其简单性、高效性以及良好的可解释性。虽然其“朴素”的独立性假设在现实中很少完全成立,但它往往在实践中表现得出人意料地好,是许多分类任务一个优秀的基准模型。请记住,作为模型的设计者,你可以根据具体问题灵活选择先验分布和似然函数的形式。

030:从朴素贝叶斯到逻辑回归 🧠➡️📈

在本节课中,我们将学习逻辑回归模型。为了清晰地理解逻辑回归,我们需要先从另一个角度审视朴素贝叶斯分类器,然后定义逻辑回归模型并探讨其求解方法。


回顾朴素贝叶斯

上一节我们介绍了分类模型的基础。本节中,我们首先回顾朴素贝叶斯分类器的核心假设。

朴素贝叶斯分类器基于以下关键假设:在给定类别标签 Y 的条件下,特征 X_i 和 X_j 是条件独立的。对于一个两类问题,给定类别 Y 时,特征的联合条件分布可以分解为各个特征的边缘条件分布的乘积。

公式表示如下:

P(X_1, X_2, ..., X_n | Y) = ∏ P(X_i | Y)

这意味着,例如,在垃圾邮件分类中,给定邮件是垃圾邮件或正常邮件这个类别后,邮件发送时间与邮件中是否包含“奢侈品”等词语这两个特征被视为相互独立。

朴素贝叶斯的决策过程是:选择使后验概率 P(Y | X) 最大的类别 Y。根据贝叶斯定理,这等价于最大化似然 P(X | Y) 与先验 P(Y) 的乘积。

决策规则如下:

Ŷ = argmax_Y [ P(Y) * ∏ P(X_i | Y) ]

在实际操作中,我们需要为似然 P(X_i | Y) 和先验 P(Y) 假设一个参数化形式。然后,使用训练数据和最大似然估计(MLE)来估计这些参数,最后将估计值代入上述公式进行分类。


高斯朴素贝叶斯与线性决策边界

现在,我们来看一个具体的参数化假设:高斯朴素贝叶斯。

我们假设给定类别 Y 时,每个特征 X_i 服从一维高斯(正态)分布。该分布具有类别特定和特征特定的均值 μ_{i,y}。此外,我们假设类别先验 P(Y) 服从伯努利分布(对于两类问题)。

似然函数公式:

P(X_i | Y=y) = N(X_i; μ_{i,y}, σ_i²)

为了简化推导并引出关键结论,我们进一步做一个重要假设:特征 X_i 的方差 σ_i² 与类别 Y 无关,即方差是特征特定的,而非类别特定的。

这意味着,对于每个特征,类别0和类别1对应的分布是方差相同、均值不同的高斯分布。

接下来,我们探讨在这种假设下的决策边界。决策边界是使得两个类别的后验概率相等的点集。对于两类问题,这等价于后验概率的比值为1,或其对数比值为0。

决策边界条件:

log( P(Y=0 | X) / P(Y=1 | X) ) = 0

将我们的高斯似然和伯努利先验代入这个对数比值公式。经过代数运算后,先验项会变成一个常数,而与数据 X 相关的部分会呈现出一个线性形式。

推导后的决策函数:

log( P(Y=0 | X) / P(Y=1 | X) ) = w₀ + ∑ w_i * X_i

其中,w₀ 和 w_i 是由高斯分布的参数(均值和方差)以及先验概率计算得到的常数和系数。

这个结果表明,在“方差与类别无关”的假设下,高斯朴素贝叶斯分类器本质上是一个线性分类器。其决策边界是一个超平面。当上述线性函数值大于0时,样本被分类为类别0;小于0时,被分类为类别1。这让我们回想起了之前学过的感知机模型。


生成式分类器 vs. 判别式分类器

基于前面的讨论,我们现在可以区分两种建模思路。

朴素贝叶斯是生成式分类器的一个例子。生成式分类器为数据和标签的联合分布 P(X, Y) 假设一个参数化形式(通常分解为 P(Y) * P(X | Y))。然后,从训练数据中估计这些分布的参数。

生成式模型的优点是,在估计参数后,不仅可以对新样本进行分类,还可以生成新的数据样本。因为它建模了整个数据生成过程:可以先从 P(Y) 中采样一个类别,再根据 P(X | Y) 采样生成特征数据。

然而,我们的最终目标通常是分类,即找到决策边界。我们注意到,最大化联合分布 P(X, Y) 等价于最大化后验概率 P(Y | X)。那么,为什么不直接学习后验概率 P(Y | X) 或者决策边界本身呢?

这就是判别式分类器的思路。判别式模型直接对决策边界或条件概率 P(Y | X) 进行建模,而不对数据的生成过程 P(X | Y) 做出假设。感知机就是一个直接学习决策边界的非概率判别式模型。

那么,能否在保留概率解释的框架内,直接学习决策边界呢?答案是肯定的,这就是我们接下来要介绍的逻辑回归模型。


总结

本节课中我们一起学习了:

  1. 回顾了朴素贝叶斯分类器的条件独立性假设和基于后验概率最大的决策规则。
  2. 探讨了在高斯似然、且特征方差与类别无关的假设下,高斯朴素贝叶斯会推导出一个线性决策边界。
  3. 区分了生成式分类器(如朴素贝叶斯,建模联合分布 P(X, Y))和判别式分类器(直接建模决策边界或条件分布 P(Y | X))。
  4. 提出了一个问题:如何构建一个既能直接进行概率判别,又无需对数据生成过程进行完整建模的模型?这为引入逻辑回归做好了铺垫。

031:定义逻辑回归 🧠

在本节课中,我们将学习逻辑回归的定义及其来源。逻辑回归是一个有趣的概率分类器案例,它虽然简单,但在实践中表现优异,是机器学习工具箱中的重要工具。

概述

逻辑回归旨在解决一个核心问题:如何根据一个或多个自变量(可以是分类变量或连续变量)来建模某个事件发生的概率。与感知机等仅寻找线性决策边界的分类器不同,逻辑回归的目标是直接输出概率估计。

上一节我们介绍了朴素贝叶斯生成式分类器,本节中我们来看看另一种强大的分类方法——逻辑回归。

逻辑回归的优异表现

逻辑回归是一种非常简单的线性分类器,但其表现常常出人意料地好。在实际应用中,例如在脑成像或遗传学等多个领域的数据集上,逻辑回归的性能常能与随机森林、神经网络等复杂模型相媲美。因此,理解其工作原理并将其作为解决问题的工具之一至关重要。

问题定义与挑战

逻辑回归试图解决以下问题:

  1. 根据自变量的值,建模事件发生的概率。
  2. 估计一个新观测事件发生与不发生的概率。
  3. 预测一系列变量对二元响应变量的影响。
  4. 对观测进行分类(例如,批准贷款与不批准贷款)。

然而,直接建模概率存在挑战。以一个简单的贷款审批为例,我们只有客户的信用分数这一个特征。

以下是直接使用线性回归或线性分类器会遇到的问题:

  • 如果我们像感知机一样画一条直线来分割“批准”和“拒绝”两类,这只是一个硬性分类,无法给出“批准概率”。
  • 如果我们用线性回归拟合一条直线来预测概率,这条直线可能会超出合理的概率范围 [0, 1],并且无法很好地描述两类数据点的分布。

从几率到逻辑斯蒂函数

为了解决上述问题,统计学家引入了“几率”的概念。几率是事件发生概率与不发生概率的比值。然而,几率的范围是 0 到正无穷,且不对称。

为了获得一个范围在负无穷到正无穷的对称度量,我们取几率的对数,得到“对数几率”。现在,我们可以尝试用线性模型来拟合对数几率。

假设我们有一个特征 x(如信用分数),我们建立如下线性关系:
log(odds) = w * x + b
其中 w 是权重,b 是偏置。

通过代数变换,我们可以将对数几率的表达式转换回概率形式。令 z = w * x + b,我们得到事件发生的概率为:
P(y=1|x) = 1 / (1 + exp(-z))

这个函数就是逻辑斯蒂函数,因其形状像字母“S”,也称为S型函数。它将线性组合 z 映射到 (0, 1) 区间,完美地表示了概率。

扩展到多分类:Softmax函数

在二分类问题中,我们使用逻辑斯蒂函数。对于多分类问题,逻辑回归可以自然扩展。

我们选择其中一个类别作为参考类别(基线),然后为其他每个类别 k 建模其与参考类别的对数几率,同样使用线性模型:
log(P(Y=k|x) / P(Y=基线|x)) = w_k * x + b_k

通过类似的代数推导,并假设参考类别的线性部分为0,我们可以得到每个类别的预测概率公式:
P(Y=k|x) = exp(z_k) / (sum_{j=1}^{K} exp(z_j))
其中 z_k = w_k * x + b_k

这个函数正是Softmax函数。它将 K 个线性输出转化为一个概率分布。Softmax 函数会“放大”最大值,抑制较小的值,形成一种“赢家通吃”的效果,使得概率最大的类别更加突出。

在深度学习中,Softmax 常被用作神经网络的最后一层激活函数,配合交叉熵损失进行训练。这意味着,当你训练一个带有Softmax输出层的神经网络时,其最后一层本质上就是一个逻辑回归分类器。

总结

本节课中我们一起学习了逻辑回归的核心思想。我们从建模概率的需求出发,遇到了直接用线性模型拟合概率的困难。通过引入几率对数几率的概念,我们得以用线性模型 w*x + b 来拟合对数几率,再通过逻辑斯蒂函数将其映射回概率空间,从而解决了二分类的概率预测问题。对于多分类,我们通过选择基线类别并建模多个对数几率,最终推导出了Softmax函数,它不仅是逻辑回归多分类的核心,也深深嵌入在现代深度学习的架构之中。逻辑回归因其模型简单、解释性强且性能稳健,始终是机器学习中一个不可或缺的基础工具。

032:P32_训练逻辑回归模型 🧠

在本节课中,我们将学习如何训练逻辑回归模型。我们将从理解逻辑回归如何建模概率分布开始,然后探讨如何通过最大似然估计来找到最优的模型参数。最后,我们会介绍一种比标准梯度下降更快的优化方法——牛顿-拉夫森法。


问题建模与参数求解

上一节我们介绍了逻辑回归如何将分类问题转化为对概率分布的建模。现在,我们面临的核心问题是:如何找到那个最优的参数向量 W(即模型系数)?

我们知道,逻辑回归直接对后验概率 P(类别 | 数据) 进行建模。这与朴素贝叶斯等生成式模型不同,后者是先对类别的先验概率和数据的似然概率进行建模。逻辑回归的决策边界由对数几率(log odds)决定,其形式是一个线性函数。

更一般地,无论数据的先验分布和似然函数具体是什么形式,其后验概率之比的对数(即决策边界值 A)与后验概率本身之间,都存在一个确定的关系:后验概率是 A逻辑斯蒂(S型)函数。这个函数就是 σ(A) = 1 / (1 + e^{-A})

这个性质凸显了逻辑回归和逻辑斯蒂函数的重要性:它们具有普适性,而不仅仅是工具箱里的另一个工具。


逻辑斯蒂函数的优良性质

逻辑斯蒂函数 σ(x) 具有一些优良的数学性质,这使得模型训练更加高效。

  • 导数易于计算:逻辑斯蒂函数的导数可以用其自身表示,公式为 σ‘(x) = σ(x) * (1 - σ(x))。这意味着在神经网络的反向传播等计算中,我们只需在前向传播时计算一次 σ(x),就可以几乎“免费”地得到其导数值。
  • 与交叉熵损失的关联:逻辑回归的训练目标(最大似然估计)最终等价于最小化交叉熵损失。这个损失函数在现代机器学习中无处不在。

通过最大似然估计进行训练

现在,让我们回到强大的最大似然估计框架来求解参数 W

我们假设数据样本是独立同分布的。对于整个数据集,我们希望找到参数 W,使得所有样本的预测概率乘积(即似然函数 L)最大。为了计算方便,我们通常取对数,得到对数似然函数。

以下是推导的关键步骤:

  1. 似然函数:对于二分类问题,每个样本的预测可以看作一个伯努利试验。整个数据集的似然函数是每个样本预测概率的乘积。
  2. 对数似然:取对数后,乘积变为求和。经过整理,对数似然函数可以写成两项和的形式。
  3. 出现交叉熵:这个形式正是二元交叉熵。其中一项是真实标签的分布,另一项是我们的模型预测分布 (σ 函数)。因此,最大化似然等价于最小化预测分布与真实分布之间的交叉熵。

所以,当我们训练逻辑回归(以及大多数现代分类模型)时,我们实际上是在最小化交叉熵损失。


优化方法:从梯度下降到牛顿法

得到损失函数(负对数似然)后,我们需要通过优化算法来最小化它。最基础的方法是梯度下降。

  • 梯度下降:它基于函数的一阶泰勒展开。我们在当前参数点 W 处,沿着损失函数梯度的反方向(即切线方向)移动一小步。这需要多次迭代才能接近最优解。

然而,我们可以做得更好。如果我们不仅使用一阶导数(梯度),还使用二阶导数信息,就能对函数进行更精确的二次近似。

  • 牛顿-拉夫森法:该方法利用了函数的二阶泰勒展开。通过求解二次近似的极值点,往往能用一个更大的步长直接跳到更接近最优解的位置。在多参数情况下,二阶导数信息包含在海森矩阵(Hessian Matrix)中。牛顿法的更新公式涉及梯度与海森矩阵逆的乘积。

为了直观理解,想象优化一个凸函数。梯度下降(线性近似)需要沿着“之”字形路径多次小步移动。而牛顿法(二次近似)则能更直接地指向谷底,通常收敛得更快。


牛顿法在线性与逻辑回归中的应用

让我们看看牛顿法如何应用于具体的回归模型。

在线性回归中的应用
线性回归的损失函数是均方误差。我们可以写出其矩阵形式,计算梯度和海森矩阵。应用牛顿法更新公式后,经过巧妙的代数推导,只需一步迭代就能得到最优解——即我们熟悉的伪逆解 W* = (X^T X)^{-1} X^T y。这展示了牛顿法在理想情况下的威力。

在逻辑回归中的应用
对于逻辑回归,我们同样可以写出损失函数(交叉熵)的梯度 g 和海森矩阵 H。海森矩阵有一个很好的性质:它是一个对角矩阵,其对角线元素与当前参数 W 下的预测概率 σ(XW) 有关。

gH 代入牛顿法更新公式 W_new = W_old - H^{-1} g,并进行推导。虽然由于海森矩阵 H 本身依赖于待优化的参数 W,我们无法像线性回归那样一步得到解析解,但这个迭代过程仍然比普通梯度下降收敛快得多。它通常被称为迭代重加权最小二乘法


总结与要点 📝

本节课我们一起学习了逻辑回归模型的训练全过程:

  1. 核心思想:逻辑回归通过逻辑斯蒂函数直接对后验概率建模,其训练目标等价于最小化交叉熵损失。
  2. 优化基础:我们使用最大似然估计框架来推导损失函数。
  3. 优化算法:介绍了梯度下降及其改进版——牛顿-拉夫森法。牛顿法利用损失函数的二阶导数(海森矩阵)信息,能实现更快的收敛。
  4. 方法应用:详细对比了牛顿法在线性回归(可一步求解)和逻辑回归(需迭代但高效)中的应用。

逻辑回归是一个影响深远的基础模型。它本身就是一个强大而有效的分类器,同时也是构成现代深度学习模型的关键组件(通常作为神经网络的最后一层)。理解其原理和训练方法,对掌握机器学习至关重要。

033:P33_非参数密度估计 📊

在本节课中,我们将要学习非参数密度估计。这是一种不预先假设数据分布具体形式(例如高斯分布)的方法,仅依靠数据本身来估计其概率密度。我们将从回顾贝叶斯决策边界开始,逐步介绍直方图法的局限性,并深入探讨两种核心的非参数方法:核密度估计和K近邻法。

回顾:贝叶斯决策边界

上一节我们介绍了基于决策边界的分类方法。本节中我们来看看其背后的密度估计基础。

我们有两个类别的似然分布:类别1和类别2。如果给定数据点 x 后,类别1的后验概率大于类别2的后验概率,我们就将其判定为类别1。反之,则判定为类别2。

观察上图,红色曲线代表类别2的后验概率。在红色曲线更高的区域,我们决定为类别2;在其他区域,则决定为类别1。这样做的本质是最小化贝叶斯错误率。我们为每个数据点选择后验概率更高的类别,以最小化预测误差。

决策边界就是两个类别的后验概率相等的点构成的曲线或曲面。由于直接使用后验概率等式作为决策边界较为困难,我们通常使用似然比。通过对似然比取对数,当两个后验概率相等时,对数似然比为0,这便构成了我们的决策边界。

到目前为止,我们讨论的参数化密度估计都假设似然分布的形式已知,或者至少其参数形式已知,从而可以通过最大似然估计等方法进行。但如果我们只有数据,并且不想对分布形式做任何假设,该怎么办?这就是非参数密度估计要解决的问题。

从直方图到非参数估计

当面对只有数据、没有预设分布形式的挑战时,首先想到的可能是直方图。直方图是最简单的非参数密度估计方法。

以下是构建直方图的步骤:

  1. 将样本空间划分为若干个区间(称为“箱”)。
  2. 用落入每个箱的训练数据比例来近似该区域的概率密度。

对于一个新数据点 x,其概率密度估计值为:落入 x 所在箱的训练样本数,除以箱的宽度,再除以总训练样本数 N

直方图在一维或二维情况下直观易懂,但在高维空间中存在严重问题。

直方图的主要问题包括:

  • 对起始位置敏感:密度估计结果依赖于第一个箱的起始位置。
  • 估计不连续:估计值在箱的边界处存在跳跃,这是人为划分的 artifact,并非数据的真实特性。
  • 维数灾难:箱的数量随维度增加呈指数级增长。在高维空间中,大多数箱子是空的,导致无法有效估计概率密度。

因此,直方图除了用于一二维数据的快速可视化外,并不适合大多数实际应用。

非参数密度估计的核心思想

那么,我们应该怎么做呢?让我们明确非参数密度估计的目标:我们试图估计一个从真实概率密度 p(x) 中抽取的样本 x 落入样本空间中某个区域 R 的概率。

根据概率论,这个概率是密度函数在区域 R 上的积分。当我们有 N 个独立同分布的样本时,恰好有 k 个样本落入区域 R 的概率服从二项分布。随着样本数 N 趋于无穷大,k/N 的方差会减小,从而可以对概率 P 做出良好估计。

现在,假设区域 R 非常小,以至于概率密度 p(x) 在其中变化不大,可以近似为常数。那么,区域 R 内的概率近似等于密度值 p(x) 乘以区域 R 的体积 V。同时,这个概率又可以用 k/N 来估计。

由此,我们得到了密度 p(x) 的估计公式:
p(x) ≈ k / (N * V)

为了获得准确的估计,我们需要:当 N → ∞ 时,V → 0,同时 k → ∞。这意味着我们需要无限多的样本,并考察围绕 x 的无穷小邻域内的样本数。

在实际中,样本是有限的。如果 V 太小,可能没有任何样本落在里面,导致估计失败。因此,我们需要在 V 的大小上找到一个折衷方案。

有两种主要方法来实现这种折衷:

  1. 固定体积 V,估计样本数 k:这就是核密度估计
  2. 固定样本数 k,估计体积 V:这就是K近邻方法。

上图从左到右展示了样本量增加时,两种方法如何逐渐逼近真实的概率密度函数(蓝色曲线)。左侧是固定体积的核密度估计,右侧是固定K值的K近邻估计。

K近邻分类器简介

K近邻方法不仅可以用于密度估计,还可直接用于分类。其概念非常简单:对于一个新样本,查看其最近的 K 个训练样本(邻居),然后将新样本归为这 K 个邻居中占多数的类别。

当数据量非常大时,K近邻分类器可以取得非常好的效果。但它也存在两个主要问题:

  • 计算成本高:每次分类都需要计算新样本与所有训练样本的距离,并找出最近的 K 个。当数据量和维度很高时,计算非常昂贵。
  • 存储需求大:需要保存全部训练数据。

尽管有KD树等数据结构可以加速近邻搜索,但在大数据和高维场景下仍面临挑战。尽管如此,K近邻和逻辑回归等简单模型仍然是许多问题的优秀基线模型。

核密度估计详解

接下来,我们重点学习第一种方法:核密度估计。我们从最简单的核函数——帕森窗开始。

假设我们围绕感兴趣的点 x 构建一个边长为 h 的D维超立方体区域 R。我们定义一个窗函数(或核函数)K(u),它是一个指示函数:如果点 u 的每个维度坐标绝对值都小于1/2,则函数值为1,表示点在单位超立方体内;否则为0。

为了将这个以原点为中心的单位核函数应用到任意点 x,我们进行缩放和平移。对于训练样本 x_i,我们计算 (x - x_i) / h。如果结果向量的每个分量绝对值都小于1/2,则说明 x_i 在以 x 为中心、边长为 h 的超立方体内。

那么,落入该体积内的样本数 k 就是所有训练样本的核函数值之和。因此,在 x 点的密度估计为:
p(x) = 1/(N * h^D) * Σ_{i=1}^{N} K( (x - x_i) / h )

其中,h^D 是D维超立方体的体积。

帕森窗计算示例

让我们通过一个一维数据的例子来具体计算。假设训练数据为 {4, 5, 5, 6, ...},我们需要估计点 x=3, x=10, x=15 处的密度,设定窗宽 h=4

对于 x=3

  • 计算每个数据点 x_i 对应的 (3 - x_i)/4
  • 只有满足 |(3 - x_i)/4| < 0.5 的点,核函数输出为1。
  • 经计算,只有 x_i=4 满足条件(因为 |(3-4)/4| = 0.25 < 0.5)。
  • 所以 k=1
  • 体积 V = h^1 = 4
  • 密度估计 p(3) = 1 / (N * 4)

对于 x=15,用同样方法会发现有多个点满足条件,从而得到更高的密度估计值。

从帕森窗到平滑核

帕森窗(超立方体)存在两个问题:

  1. 估计结果仍然不连续。
  2. 它对超立方体内的所有点一视同仁,无论该点离中心 x 是近还是远。直觉上,更近的点应该具有更高的权重。

因此,我们通常使用平滑的核函数,例如高斯核(径向基函数)。平滑核需要满足两个条件:

  • 非负性:K(u) >= 0
  • 积分为1:∫ K(u) du = 1。这保证了密度估计 p(x) 本身也积分为1,是一个合法的概率密度。

常用的高斯核函数形式为:
K(u) = (1/(2π)^{D/2}) * exp( -||u||^2 / 2 )
在实际估计中,我们同样会引入带宽参数 h 来控制缩放:K( (x - x_i) / h )

使用平滑核的密度估计可以理解为:在每个训练数据点 x_i 上放置一个“小山包”(核函数),最终的密度估计是所有这些小山的叠加。带宽 h 控制了每个小山的宽度:h 越大,山越宽越平缓;h 越小,山越窄越尖锐。

带宽选择与偏差-方差权衡

带宽 h 的选择至关重要,它直接导致了机器学习中一个核心概念:偏差-方差权衡

  • 带宽 h 太大:核函数过于平缓,密度估计曲线过于平滑。这会掩盖数据中的真实结构,导致高偏差(估计的系统性误差大)。但不同数据样本得到的估计曲线变化不大,即低方差
  • 带宽 h 太小:核函数非常尖锐,密度估计曲线会围绕每个数据点出现尖峰,显得崎岖不平且噪声很大。这虽然可能使偏差较低(如果能捕捉每个细节),但会导致高方差(对训练样本的微小变化非常敏感,估计不稳定)。

我们的目标是选择一个适中的 h,在偏差和方差之间取得最佳平衡,使总体误差最小。

如何选择带宽 h 呢?

  1. 主观选择:对于低维数据,可以绘制不同 h 下的估计曲线,根据对数据的先验理解选择看起来最合理的那个。这不适用于高维数据。
  2. 经验法则:如果假设数据近似服从高斯分布,可以使用一些经验公式,例如斯科特法则西尔弗曼法则。例如,对于一维高斯数据,最优带宽近似为 h* = 1.06 * σ * N^{-1/5},其中 σ 是样本标准差。这些法则在数据非高斯时可能效果很差。
  3. 交叉验证:更通用的方法是使用交叉验证来选择一个在未知数据上表现最好的 h

多维数据与各向异性

在多维数据中,如果不同特征具有不同的尺度或方差,使用同一个带宽 h 可能不合适。例如,特征A的值范围是[0, 1],而特征B的范围是[0, 1000]。用相同的 h 会使得特征B的方向上核函数的影响被过度拉伸。

解决方法包括:

  • 预处理缩放:在核密度估计之前,对每个特征进行标准化(例如,缩放到均值为0,方差为1)。
  • 使用更灵活的核:采用乘积核,即为每个维度设置独立的带宽参数 h_d,总的核函数是各维度核的乘积。这允许模型适应不同维度上的不同尺度。
  • 使用全协方差矩阵:最灵活的方法是使用具有完整协方差矩阵的高斯核,但这会引入大量需要估计的参数。

上图展示了使用高斯核和西尔弗曼法则估计的二维密度,以及真实密度。可以看到,在合适的带宽下,核密度估计能够较好地捕捉数据的分布结构。

总结

本节课中我们一起学习了非参数密度估计。

  • 我们从贝叶斯决策边界出发,引出了当分布形式未知时进行密度估计的需求。
  • 我们指出了直方图法的局限性,特别是在高维空间中的维数灾难问题。
  • 我们推导了非参数密度估计的一般公式 p(x) ≈ k/(N*V),并引出了实现它的两种策略:固定V估计k(核密度估计)和固定k估计V(K近邻)。
  • 我们详细介绍了核密度估计,从简单的帕森窗到更实用的平滑核(如高斯核)。
  • 我们深入探讨了带宽选择的关键性,并将其与机器学习核心的偏差-方差权衡概念联系起来。
  • 最后,我们简要讨论了处理多维数据时带宽选择的注意事项。

核密度估计是一种强大的工具,它完全由数据驱动,无需对底层分布进行假设。它的主要代价是需要存储所有训练数据并在预测时进行计算。除了密度估计和分类,类似的核方法思想也可用于回归问题。

034:最大间隔分类器 📏

在本节课中,我们将学习最大间隔分类器的核心概念。我们将从贝叶斯最优决策边界出发,探讨其在实际应用中的局限性,并引出限制性贝叶斯最优分类器的概念。最终,我们将看到,在特定条件下,限制性贝叶斯最优分类器等价于最大间隔超平面,并推导出其数学形式。

贝叶斯最优决策边界回顾

上一节我们介绍了基于决策理论和贝叶斯最优的决策边界。让我们先回顾一下核心思想。

回忆一下,我们有两个类别的后验概率分布,例如黑色代表类别1,红色代表类别2。我们的决策规则是:如果类别1的后验概率大于类别2的后验概率,则决策为类别1;反之则决策为类别2。

从本质上讲,我们是在最小化贝叶斯错误率。贝叶斯错误率是两个后验概率中较小者的最小值。如果我们确切知道后验概率,那么最小化贝叶斯错误率就是最优策略。

后验概率估计的挑战

然而,我们如何确切知道后验概率呢?在一般情况下,我们需要非参数化地估计密度。

还记得我们在核密度估计课程中的内容吗?根据你选择的核函数带宽(例如高斯核的宽度 h),决策边界会发生显著变化。当 h 较小时,边界会变得非常复杂;当 h 较大时,边界则更为平滑。

核密度估计本身是一个不错的估计器。但问题在于,根据所选带宽的不同,以及数据中异常点的存在,决策边界会受到不利影响。因为我们的估计是对真实后验的近似,所以决策边界对异常值非常敏感。

换句话说,当我们基于对真实分布的估计来建模时,决策边界具有高方差。我们不希望决策边界出现这种任意波动。

引入限制性贝叶斯最优分类器

为了应对高方差问题,Tong 和 Koller 提出了限制性贝叶斯最优分类器的概念。

给定数据的估计分布(即给定类别的条件概率估计)和一个分类器集合 H(例如所有线性分类器),我们定义 H* 为关于集合 H 和估计分布的限制性贝叶斯最优分类器。

H* 满足两个条件:

  1. H* 属于分类器集合 H
  2. 对于集合 H 中的所有其他分类器,H* 在估计分布下的贝叶斯错误率是最小的。

这意味着,我们不再试图精确拟合基于估计分布的最优决策边界(那会导致高方差),而是只考虑一个特定类别的分类器(如线性分类器),并从中选择一个在估计分布下错误率最小的那个。

从限制性最优到最大间隔

那么,限制性贝叶斯最优分类器与最大间隔有什么关系呢?

考虑我们之前核密度估计的例子。当我们使用一个非常宽的带宽(h 很大)进行平滑估计时,决策边界可能位于某个位置。如果我们用一个线性分类器去近似这个边界,它可能位于那里。

现在,让我们持续减小核函数的带宽 h,减少我们对数据分布的先验假设(因为带宽 h 本质上就是我们对分布形态的先验假设)。当 h 趋近于0时,每个数据点上的核函数会变成一个脉冲函数。

Tong 和 Koller 在他们的论文中证明:对于二分类问题,如果你采用线性分类器作为限制类别,并将核密度估计器的带宽推向零,那么得到的限制性贝叶斯最优线性分类器,就会变成最大间隔超平面。

最大间隔超平面,就是那个位于两个线性可分类别正中间的超平面。

最大间隔的直观理解

为什么最大间隔是好的?让我们从直觉上理解。

以前我们用感知机处理两类线性可分数据时,感知机会给出任何一个能正确分类所有训练样本的超平面。问题解决了,感知机就会收敛。

但是,贝叶斯最优(或限制性贝叶斯最优)边界试图最大化类别间的间隔。这样,对于那些我们尚未观测到的数据点,模型仍有较大的容错空间,能将其正确分类。

因此,对于一个好的、基于线性可分数据的分类器,我们希望将超平面放在分隔间隙的中间,而不是紧挨着某一类。这是一种基于“未知土地中立划线”的常识性判断。

最大间隔的数学形式化

现在,让我们从数学上定义这个最大间隔超平面。

回忆一下,我们如何定义一个超平面。我们有一个法向量 w 和一个偏置项 b。超平面是所有满足以下方程的点 x 的集合:
f(x) = w^T x + b = 0

考虑超平面附近的一个点 x,它到超平面的垂直距离 r 是多少?这可以通过计算 x 在法向量 w 方向上的投影来得到。

距离公式为:
r = |w^T x + b| / ||w||
其中 ||w||w 的欧几里得范数(长度)。

对于被正确分类的点,我们可以利用其标签 y(+1 或 -1)来简化。因为对于正确分类的点,y * (w^T x + b) 总是正的。所以距离可以写为:
r = y (w^T x + b) / ||w||

当我们说“最大化间隔”时,我们指的是最大化离超平面最近的点的距离。也就是说,我们想最大化最小距离。

设所有训练样本为 (x_i, y_i)。那么,所有样本中到超平面的最小距离是:
margin = min_i [ y_i (w^T x_i + b) / ||w|| ]

我们的目标是找到参数 wb,使得这个 margin 最大。

推导优化问题

观察距离公式 r = y (w^T x + b) / ||w||。如果我们按比例缩放 wb(例如同时乘以常数 k),距离 r 不会改变,因为分子和分母中的 k 会抵消。

这个缩放自由度允许我们进行一个关键的简化:我们可以固定对于离超平面最近的那些点(称为支持向量),有 y (w^T x + b) = 1

做出这个约定后,对于所有正确分类的训练样本,我们就有:
y_i (w^T x_i + b) >= 1,对于所有 i

同时,在这些支持向量上,间隔(即两个平行支撑超平面之间的距离)就等于 2 / ||w||

因此,最大化间隔 2 / ||w||,等价于最小化 ||w|| 为了后续优化方便,我们通常最小化 (1/2) ||w||^2

于是,我们得到了最大间隔分类器的标准优化形式,也称为线性支持向量机(SVM)的原问题

最小化: (1/2) ||w||^2
约束条件: y_i (w^T x_i + b) >= 1,对于所有训练样本 i = 1, ..., n

这是一个凸二次规划问题,具有 d 个变量(w 的维度)和 n 个线性不等式约束,可以通过标准的优化算法高效求解。

找到最优的 wb 后,对于新的数据点 x_new,我们通过观察 sign(w^T x_new + b) 的符号来进行分类。

总结

本节课中,我们一起学习了最大间隔分类器的由来和形式化过程。

  1. 我们从贝叶斯最优决策边界出发,认识到直接基于估计分布寻找边界会导致高方差,对异常值敏感。
  2. 为了获得更稳健的边界,我们引入了限制性贝叶斯最优分类器的概念,即在一个受限的分类器集合(如线性分类器)中寻找最优者。
  3. Tong 和 Koller 证明,当使用线性分类器且核密度估计带宽趋于零时,限制性贝叶斯最优分类器就是最大间隔超平面
  4. 最大间隔的直觉是:在类别间的“无人地带”正中划界,为未来的未知数据留出最大容错空间。
  5. 我们最终推导出了线性支持向量机的原优化问题:最小化 (1/2)||w||^2,并满足所有样本都被正确分类且间隔至少为1的约束。这是一个可求解的凸二次规划问题。

035:拉格朗日乘数法 📐

在本节课中,我们将学习如何解决带有约束的优化问题。核心方法是使用拉格朗日乘数法,它可以将一个复杂的约束优化问题,转化为一个更容易处理的无约束优化问题。

概述

在机器学习和许多工程领域,我们经常需要找到某个函数在特定约束条件下的最优解。例如,在支持向量机中,我们需要最大化分类间隔,同时确保所有数据点都被正确分类。拉格朗日乘数法正是解决这类问题的强大工具。本节我们将学习其基本思想、数学形式以及如何应用。

拉格朗日乘数法的基本形式

上一节我们介绍了约束优化问题的概念。本节中,我们来看看如何用拉格朗日乘数法将其转化。

一个标准的约束优化问题通常表述为:最小化某个函数 f(x),同时满足一系列不等式约束 g_i(x) >= 0 和等式约束 h_j(x) = 0

拉格朗日乘数法的核心思想是,将原约束问题重写为一个无约束的拉格朗日函数 L。这个新函数引入了额外的变量,称为拉格朗日乘子,每个约束对应一个。

拉格朗日函数公式:
L(x, α, λ, μ) = f(x) - Σ α_i * g_i(x) + Σ λ_j * h_j(x)
其中:

  • x 是原始变量。
  • α_i 是对应于不等式约束 g_i(x) >= 0 的乘子(通常要求 α_i >= 0)。
  • λ_j 是对应于等式约束 h_j(x) = 0 的乘子(符号可正可负)。

转化后的问题变为:对 x 最小化拉格朗日函数 L,同时对乘子 α 最大化 L。这个“最小-最大”问题的解(一个鞍点)就对应着原约束问题的最优解。

卡罗需-库恩-塔克条件

当我们通过拉格朗日乘数法将问题转化后,如何找到最优解呢?这需要用到卡罗需-库恩-塔克条件。

KKT条件是拉格朗日乘数法在不等式约束下的推广。它指出,在最优解处,必须满足以下一系列条件:

以下是KKT条件的主要内容:

  1. 平稳性: 拉格朗日函数 L 对原始变量 x 的梯度必须为零。∇_x L = 0
  2. 原始可行性: 原始约束必须得到满足。g_i(x) >= 0h_j(x) = 0
  3. 对偶可行性: 对应于不等式约束的乘子必须非负。α_i >= 0
  4. 互补松弛条件: 对于每个不等式约束,其乘子 α_i 和约束函数 g_i(x) 至少有一个为零。α_i * g_i(x) = 0

这意味着,如果一个不等式约束在最优解处是严格成立的(g_i(x) > 0,称为非活跃约束),那么对应的乘子 α_i 必须为0,该约束对解没有影响。反之,如果乘子 α_i > 0,则该约束在最优解处必须取等号(g_i(x) = 0,称为活跃约束)。

几何直观理解

KKT条件看起来有些抽象,让我们通过几何图像来直观理解它,特别是对于等式约束的情况。

想象我们在一个三维空间中,有一个需要最大化的函数 f(x)(比如一个抛物面),同时有一个等式约束 g(x)=0(比如一个平面或曲线)。我们的目标是找到约束曲面上使 f(x) 最大的点。

在最优解处,函数 f(x) 的梯度向量 ∇f 和约束函数 g(x) 的梯度向量 ∇g 是平行的(方向相同或相反)。为什么?

因为 ∇g 始终垂直于约束曲面 g(x)=0。如果 ∇f 在约束曲面上有任何“横向”分量,就意味着我们可以沿着约束曲面移动,从而继续增大 f(x),这说明当前点还不是最优解。只有当 ∇f 也垂直于约束曲面(即与 ∇g 平行)时,我们才无处可去,达到极值点。拉格朗日乘子 λ 的数值就表示了这两个梯度之间的比例关系。

核心关系公式:
在等式约束 g(x)=0 下的极值点处,存在标量 λ,使得:
∇f(x*) = λ ∇g(x*)

应用示例

理解了基本原理后,我们通过两个简单的例子来看看拉格朗日乘数法如何具体应用。

示例一:简单不等式约束

考虑问题:最小化函数 f(x) = x²,约束条件为 x >= b

1. 构造拉格朗日函数:
我们将约束写为 g(x) = x - b >= 0。拉格朗日函数为:
L(x, α) = x² - α * (x - b),其中 α >= 0

2. 应用KKT条件求解:
以下是求解步骤:

  • 平稳性: ∂L/∂x = 2x - α = 0 => x = α/2
  • 互补松弛: α * (x - b) = 0
  • 对偶可行性: α >= 0

我们需要分情况讨论:

  • 情况1: 约束非活跃 (α = 0)。
    由平稳性得 x = 0。将其代入互补松弛条件:0 * (0 - b) = 0 恒成立。但还需检查原始可行性 x >= b,即 0 >= b。所以,当 b <= 0 时,最优解是 x* = 0
  • 情况2: 约束活跃 (α > 0,则 x - b = 0)。
    x = bx = α/2,可得 α = 2b。由于 α > 0,这要求 b > 0。所以,当 b > 0 时,最优解是 x* = b

这个结果很直观:如果约束边界 b 在原函数最小值点 (x=0) 的左边,约束不影响,最优解仍是0;如果约束边界在0的右边,最优解就被“推”到了边界 b 上。

示例二:椭圆内接最大矩形

考虑问题:在椭圆 x²/a² + y²/b² = 1 内,寻找面积最大的内接矩形。

1. 问题建模:
设矩形顶点在 (x, y),则其面积为 A = 4xy。约束条件是顶点在椭圆上:x²/a² + y²/b² = 1。我们要最大化 A

2. 构造拉格朗日函数:
L(x, y, λ) = 4xy - λ * (x²/a² + y²/b² - 1)

3. 应用KKT条件求解:
以下是求解步骤:

  • ∂L/∂x = 4y - (2λx)/a² = 0 => 2y = (λx)/a² ... (1)
  • ∂L/∂y = 4x - (2λy)/b² = 0 => 2x = (λy)/b² ... (2)
  • ∂L/∂λ = -(x²/a² + y²/b² - 1) = 0 => x²/a² + y²/b² = 1 ... (3)

由 (1) 和 (2) 可以联立消去 λ,得到 x²/a² = y²/b²。结合 (3) 式,可得:
x²/a² = y²/b² = 1/2
因此,最优解为 x = a/√2, y = b/√2。最大矩形面积为 A_max = 4 * (a/√2) * (b/√2) = 2ab

这个例子展示了拉格朗日乘数法如何优雅地解决几何优化问题。我们不需要显式地求出乘子 λ 的值,它在这个过程中是一个辅助变量。

总结

本节课中我们一起学习了拉格朗日乘数法这一重要的优化工具。

  • 我们首先了解了如何利用拉格朗日函数,将带有等式和不等式约束的优化问题转化为无约束的“最小-最大”问题。
  • 接着,我们学习了更一般的KKT条件,它是最优解必须满足的一组必要条件,特别是互补松弛条件清晰地描述了约束的“活跃”与“非活跃”状态。
  • 通过几何直观,我们理解了在最优解处,目标函数的梯度与约束函数的梯度是平行的。
  • 最后,通过两个计算示例,我们实践了如何应用拉格朗日乘数法和KKT条件来求解具体的优化问题。

掌握拉格朗日乘数法对于理解支持向量机、最大熵模型等机器学习算法的核心原理至关重要。

036:P36_线性支持向量机的对偶形式

在本节课中,我们将要学习线性支持向量机的对偶形式。我们已经从拉格朗日乘子法和KKT条件中了解了关于对偶性所需的一切知识。现在,我们可以推导支持向量机的对偶形式。这是因为原始形式并不总是容易求解,并且对偶形式会带来一个额外的好处,这个好处非常强大,值得我们为之努力。

回顾原始形式

上一节我们介绍了对偶性的基础知识,本节中我们来看看如何将其应用于支持向量机。首先,让我们再次回顾一下线性支持向量机的原始形式。

原始形式的目标是最小化分离超平面的法向量 w 的范数,即 minimize ½||w||²

同时,它需要满足以下约束条件,即所有样本都被正确分类:对于每个样本 i,有 y_i (w·x_i + b) ≥ 1

构建拉格朗日函数

现在,我们可以将这个约束优化问题重新表述为对偶形式。有趣的是,对偶形式也是一个凸二次规划问题,但现在优化变量是拉格朗日乘子 α_i

以下是构建拉格朗日函数的步骤。由于我们处理的是不等式约束,并且在最小化目标函数,这里会有一个负号。对于数据集中的每个样本,我们引入一个拉格朗日乘子 α_i ≥ 0

拉格朗日函数 L(w, b, α) 可以写为:
L(w, b, α) = ½||w||² - Σ_i α_i [ y_i (w·x_i + b) - 1 ]

求解最优条件

为了将对偶问题分离出来,我们需要对拉格朗日函数关于原始变量 wb 求导,并令其为零。

首先,对 w 求偏导并令其为零:
∂L/∂w = w - Σ_i α_i y_i x_i = 0
由此我们得到:
w = Σ_i α_i y_i x_i

接着,对 b 求偏导并令其为零:
∂L/∂b = - Σ_i α_i y_i = 0
由此我们得到:
Σ_i α_i y_i = 0

推导对偶问题

现在,我们将求得的 wb 的关系代回拉格朗日函数中,消去原始变量。

w = Σ_i α_i y_i x_i 代入 L,经过化简,我们得到只关于 α 的对偶优化问题。

对偶问题的目标是最大化以下函数:
maximize Σ_i α_i - ½ Σ_i Σ_j α_i α_j y_i y_j (x_i · x_j)

同时,需要满足以下约束条件:

  1. α_i ≥ 0,对于所有 i
  2. Σ_i α_i y_i = 0

对偶形式的优势与决策函数

对偶形式的支持向量机有一个显著的优点:尽管训练点的数量 n 可能很大,但解是稀疏的。

在最优解中,大多数 α_i 的值会为零。只有那些对应约束条件处于“激活”状态(即位于分类间隔边界上)的样本,其 α_i 才大于零。这些样本被称为支持向量

因此,我们只需要存储这些支持向量,而不是整个数据集。这使得模型在预测时非常高效。

最终的分类决策函数为:
f(x) = sign( Σ_i α_i y_i (x_i · x) + b )

其中,求和仅对支持向量(即 α_i > 0 的样本)进行。b 可以通过任意一个支持向量计算得出:b = y_j - Σ_i α_i y_i (x_i · x_j),其中 j 是任意一个支持向量的索引。

面临的挑战与扩展

然而,对偶形式也带来了新的挑战。原始问题的复杂度依赖于特征维度 d,而对偶问题的复杂度则依赖于样本数量 n。当处理大规模数据时,求解涉及 n×n 矩阵的二次规划问题会变得计算密集。

此外,我们目前讨论的是数据线性可分的情况(即“硬间隔”SVM)。但在现实中,数据往往不是线性可分的。

以下是解决非线性可分问题的两种主要思路:

  1. 特征映射:通过一个映射函数 Φ,将数据映射到更高维的特征空间,希望在新的空间中数据变得线性可分。
  2. 软间隔:允许一些样本被错误分类,引入“软间隔”概念,这将在后续课程中详细讨论。

总结

本节课中,我们一起学习了线性支持向量机的对偶形式推导。我们从原始问题出发,通过构建拉格朗日函数并利用KKT条件,得到了只依赖于拉格朗日乘子 α 的对偶优化问题。对偶形式的关键优势在于其解的稀疏性,最终模型仅由少数支持向量决定,这使得预测非常高效。同时,我们也认识到对偶形式在处理大规模数据时的计算挑战,并简要了解了处理非线性问题的方向,为后续学习核方法和软间隔SVM奠定了基础。

037:核技巧与软间隔 🧠

在本节课中,我们将要学习支持向量机(SVM)的两个核心扩展:核技巧与软间隔。我们将从线性SVM的回顾开始,逐步探讨如何处理非线性可分数据以及如何容忍分类错误,最终理解完整的SVM框架。

线性SVM回顾

上一节我们介绍了线性SVM。现在让我们快速回顾一下其核心思想。

最大间隔分类器处理两类数据A和B。数据是一组带标签的样本,其中 X 是特征,y 是标量标签。当已知分布时,最优边界由后验概率决定,即后验概率差为0的曲面。这个在多维空间中的曲面就是我们的决策边界,它也可以表示为概率比或其对数。

在构建最大间隔超平面时,我们遵循类似的原则,但限制在线性分类器的假设空间中。当我们不想使用任何先验信息,而希望将所有分布信息集中在样本点上时,我们就能得到最大间隔超平面。

处理非线性可分数据

上一节我们介绍了线性SVM。本节中我们来看看当数据不是线性可分时,在支持向量机或任何其他方法中该怎么办。

这里有一个建议:我们可以将每个点从二维空间映射到更高维的空间。通过一些巧思或简单的暴力枚举函数 Φ,我们可以构造一个映射,将我们的二维数据图映射到三维空间,希望数据在三维空间中变得线性可分。虽然在二维空间中,我们无法画一条线来分隔这两个类别。

以下是一个例子:

  • 在二维空间中,数据点混杂在一起,无法用直线分隔。
  • 使用多项式核函数(例如,取 x1x2 并构造一个三维空间),数据变得可分。
  • 现在我们可以使用线性SVM,它将成功找到一个分隔超平面。

核技巧

这个过程可能有些繁琐。我们需要找到合适的映射,而构造合适的映射很困难。在这种情况下我们该怎么做?维度可能很高,甚至是无限的,并且我们必须计算非常昂贵的内积。

首先,我们必须将数据映射到特征空间,然后进行计算。但技巧在于,与其计算原始数据点的内积,我们开始处理变换后的数据点(即向量)。例如,我们的内积现在是特征映射后数据的内积:K(x, y) = Φ(x)·Φ(y)

但如果特征映射到无限维空间(例如径向基核函数),这仍然很昂贵。我们可以通过定义带有核的希尔伯特空间并利用默瑟定理来避免先映射到特征空间再计算核函数。希尔伯特空间是一个定义了内积的线性空间。

我们可以直接定义内积,而不是定义映射。例如,对于多项式特征映射,我们可以先映射向量 xy,然后计算它们的内积。但事实上,如果你进行代数运算,你会发现这个内积就是 K(x, y) = (x·y + 1)^2 这样的表达式。直接计算这个表达式比先映射再计算要简单得多。

核技巧的核心是:取一个线性算法,用核函数替换其中的所有内积。如果数据在算法中仅以内积形式出现,那么核技巧就有效。只需将所有形如 x·y 的内积替换成形如 K(x, y) 的核函数。神奇的是,你现在就在高维、非线性的特征空间中操作了。对于支持向量机,我们希望映射到这个特征空间后,数据能变得线性可分。

将核技巧应用于SVM

让我们看看将核技巧应用于线性支持向量机时会发生什么。

回顾一下原始的SVM对偶形式。注意,在优化问题和最终的分类器中,数据(无论是新样本还是旧样本)都只以内积的形式参与整个计算过程。

因此,我们可以用核函数替换这些内积。如果我们用矩阵形式书写,一切会变得更清晰。G 是一个实际的矩阵,称为格拉姆矩阵,它是内积矩阵。G_ij = x_i · x_j。你可以通过将样本排列成矩阵 X(n个样本,d维),然后计算 G = X X^T 来得到它。

现在,我们得到了这个优美的矩阵形式对偶公式,可以准备讨论默瑟定理了。

默瑟定理与核函数

那么,什么是核函数?一个函数 K(x, y) 接受两个向量,返回一个标量。它是一个有效的核函数,当且仅当它满足:

  1. 对称性K(x, y) = K(y, x)
  2. 半正定性:对于任意数据点集合,其对应的格拉姆矩阵 G(其中 G_ij = K(x_i, x_j))是半正定的。

检验半正定性是困难的。因此,为特定问题(如文本分类、图分类)设计新核函数是一门艺术。在2000年代,仍有大量论文为不同应用引入新核函数。

不过,一些生成规则可以帮助我们:

  • 任何内积都是核。
  • 常数是核。
  • 核的乘积是核。
  • 映射向量到标量的函数的乘积是核。
  • 核的非负加权线性组合也是核。

我们可以利用这些规则,从已有的流行核(如多项式核径向基核)出发,构造新的核。

软间隔SVM

然而,核函数并不能保证线性可分性。这就像神经网络:深度学习可以被视为可学习的、复杂的非线性映射(核),然后在顶部应用一个最大间隔分类器或逻辑回归。手动选择核函数可能出错。

如果即使我们尝试了所有核函数,数据仍然不是线性可分的,该怎么办?到目前为止,我们讨论的都是硬间隔SVM。现在让我们谈谈软间隔SVM

我们引入一些松弛变量 ξ_i ≥ 0。这样,我们将允许错误发生。原本我们希望所有样本都满足约束(在正确的一侧且间隔外)。现在,对于每个样本,我们允许一点错误。

  • 对于正确分类且在间隔外的样本,ξ_i = 0。
  • 对于正确分类但在间隔内的样本,0 < ξ_i < 1。
  • 对于错误分类的样本,ξ_i > 1。

将这个新约束代入我们的对偶形式并进行推导后,松弛变量会消去,我们最终得到所谓的盒约束0 ≤ α_i ≤ C。拉格朗日乘子 α 被限制在一个边长为 C 的“盒子”里。

通过引入松弛变量,我们从简单的非负拉格朗日乘子,变成了带有盒约束的乘子。其中,超参数 C 需要通过交叉验证等方法确定。

软间隔的原始形式

现在让我们看看同样的修改如何影响原始形式。

在原始形式中,我们原本是最大化间隔(即最小化 ||w||)。现在,我们需要最小化这个表达式:(1/2)||w||^2 + C * Σξ_iC 是松弛变量的权重,错误越多,求和项越大。如果没有错误,这项为0,我们就回到了原始的硬间隔形式。

如果我们想完全禁止错误(即施加无限惩罚),可以将 C 设为无穷大,这样就得到了最初定义的硬间隔SVM。这个例子表明:

  • C 越大,解越接近最大间隔解(对错误容忍度低)。
  • C 越小,间隔与数据的重叠越大(对错误容忍度高)。

总结与要点

本节课中我们一起学习了支持向量机的核技巧与软间隔。

SVM 的优点包括:

  • 具有单一最优解的二次规划问题非常高效(尽管对于大数据仍需线性或次线性方法)。
  • 基于支持向量的稀疏解很好处理,且预测速度极快。
  • 由于大间隔,泛化能力很好。

SVM 的缺点包括:

  • 对噪声和异常值敏感。
  • 为任务选择或设计核函数是一门艺术,这也是SVM最大的问题之一,也是深度学习在许多领域取代它的原因之一。
  • 依赖软间隔超参数 C,需要额外估计。

最后需要强调的是,感知机、逻辑回归和支持向量机都在寻找一个分隔超平面,它们的假设空间是相同的。但它们是不同的学习器,优化了不同的目标函数。作为研究者或工程师,关键是要弄清楚哪个目标函数最符合你的实际问题。机器学习算法本身并不“解决”问题,它只是优化一个数学目标。将现实问题与合适的算法及目标函数对齐,是我们的核心任务。

038:矩阵分解

在本节课中,我们将学习几种重要的矩阵分解技术。这些方法是无监督学习的重要组成部分,能够帮助我们理解数据的底层结构、进行降维、特征提取和信号分离。我们将从独立成分分析开始,然后探讨非负矩阵分解,最后介绍字典学习的基本概念。

独立成分分析

上一节我们介绍了矩阵分解的基本形式。本节中我们来看看独立成分分析。ICA旨在解决盲源分离问题,其核心思想是从混合信号中恢复出统计上相互独立的源信号。

问题定义与动机

ICA通常用“鸡尾酒会问题”来形象化地解释。假设在一个房间里有多个说话者和多个麦克风。每个麦克风记录到的是所有说话者声音的混合。我们的目标是从这些混合录音中分离出每个说话者的独立声音信号。

数学模型如下:我们观测到的混合信号矩阵 X 可以表示为源信号矩阵 S 与混合矩阵 A 的乘积:
X = A S

我们的目标是在仅知道 X 的情况下,估计出 AS。这是一个病态问题,存在多种可能的解。ICA通过引入“源信号统计独立”的假设来约束解空间。

核心概念:统计独立性

统计独立性是ICA的基石。对于两个随机变量,独立性意味着它们的联合概率分布等于各自边缘概率分布的乘积:
P(x, y) = P(x) * P(y)

这与主成分分析中使用的“不相关”概念不同。不相关只要求协方差为零(二阶统计量),而独立性是更强、更根本的条件,涉及所有阶的统计量。对于高斯分布,不相关即意味着独立。但ICA要求源信号是非高斯的,因为高斯信号的混合无法仅通过二阶统计量进行分离。

算法思路

由于直接优化独立性比较困难,实际算法通常采用一些代理目标。以下是两种经典方法:

  • FastICA: 该方法基于非高斯性最大化。它利用高阶统计量(如峰度)来衡量信号的非高斯程度。算法通过寻找一个解混矩阵 W(使得 S = W X),使得输出信号 S 的各个分量尽可能非高斯,从而接近独立。
  • Infomax: 该方法基于信息最大化原理。目标是最大化输入 X 与输出 S 之间的互信息。可以证明,在输出信号通过一个有界函数(如Sigmoid)映射的情况下,最大化输出熵等价于最大化互信息,从而促使输出分量趋于统计独立。

非负矩阵分解

上一节我们介绍了基于统计独立性的矩阵分解。本节中我们来看看另一种带有约束的分解方法——非负矩阵分解。NMF要求分解出的所有矩阵元素均为非负值,这使得它特别适合处理由部分叠加构成的数据,如图像像素强度、基因表达谱等。

问题定义

给定一个非负数据矩阵 V(大小为 m x n),NMF旨在找到两个非负矩阵 W(大小为 m x r)和 H(大小为 r x n),使得它们的乘积近似于原始矩阵:
V ≈ W H
其中,r 是一个远小于 mn 的值,这实现了低秩近似。

乘性更新算法

NMF的优化目标是最小化重构误差,例如使用Frobenius范数:||V - WH||_F^2。一个巧妙且常用的优化算法是乘性更新规则。

以下是更新 HW 的规则:
H <- H .* (W^T V) ./ (W^T W H + epsilon)
W <- W .* (V H^T) ./ (W H H^T + epsilon)
其中 .*./ 表示逐元素乘法和除法,epsilon 是一个防止除零的小常数。

该算法的优势在于:

  1. 自动保持非负性:只要初始值为非负,迭代过程中所有元素保持非负。
  2. 无需设置学习率:更新规则是自适应的。
  3. 实现简单,通常能收敛到一个有意义的局部解。

应用示例

在人脸图像数据上,V 的每一列是一张人脸。NMF分解后,W 的每一列可以解释为一种“局部特征”,例如眼睛、鼻子或嘴巴的某种模式;H 的对应行则表示了每张人脸中这些特征的权重。通过只使用少数(r个)这样的特征进行线性组合(相加),就可以近似重构出原始人脸。

字典学习

上一节我们探讨了具有非负约束的低秩分解。本节中我们来看看字典学习,它追求的是信号的稀疏表示,并引入了“过完备”字典的概念。

核心思想

字典学习的目标是为数据寻找一组基向量(称为“原子”),构成字典 D,使得任何数据样本 x 都可以用字典中少数几个原子的线性组合来稀疏表示:
x ≈ D α
其中,系数向量 α 是稀疏的(即大部分元素为零)。

过完备字典

与PCA等使用正交、完备基(基向量个数等于数据维度)的方法不同,字典学习通常使用过完备字典,即字典中原子的数量远大于数据的原始维度。虽然这增加了表示的冗余度,但好处是可能用更少的非零系数(更高的稀疏度)来精确表示信号,从而实现更高效的数据压缩或更有意义的特征提取。

与NMF和PCA的比较

以下是几种矩阵分解方法在人脸数据上学习到的基向量的对比:

  • PCA: 得到的是“特征脸”,是全局的、平滑的,对应数据方差最大的方向。
  • NMF: 得到的是局部特征,如眼睛、嘴巴部分,具有部分可解释性。
  • 字典学习: 可以学习到过完备的基,这些基可能是更局部、更边缘化的特征,能够用更稀疏的方式重构图像,在压缩等任务上性能可能优于通用变换(如JPEG)。

与自编码器的联系

矩阵分解的思想与神经网络中的自编码器紧密相关。一个最简单的线性自编码器,其目标是学习一个编码矩阵 W 和解码矩阵 W^T,通过瓶颈层(低维表示)重构输入:
损失函数 = ||X - W^T (W X)||^2
可以证明,这种线性自编码器的最优解本质上就是主成分分析。

当我们在自编码器中引入非线性激活函数和更深的层数时,就得到了非线性深度自编码器。它们能够学习更复杂、更强大的数据表示,并且可以通过重构误差进行无监督预训练,这在深度学习发展史上具有重要意义。去噪自编码器通过向输入添加噪声并尝试重构干净信号,进一步提升了表示的鲁棒性,是当前自监督学习思想的先驱之一。

总结

本节课中我们一起学习了矩阵分解的几种核心方法。

  1. 独立成分分析 通过假设源信号统计独立,解决盲源分离问题,适用于信号解混等场景。
  2. 非负矩阵分解 通过施加非负约束,得到具有可加性和部分可解释性的局部特征,适用于图像分析、文本挖掘等。
  3. 字典学习 旨在学习一个过完备字典,以获得数据的稀疏表示,在压缩和特征学习方面有优势。

这些方法虽然形式不同,但核心都是将数据矩阵分解为有意义的因子,它们是无监督学习中的强大工具,也是理解许多现代深度学习模型(如自编码器)的基础。掌握这些经典方法有助于我们更深入地理解数据并选择合适的工具。

039:P39_随机梯度下降 🎯

在本节课中,我们将学习随机梯度下降(SGD)及其变体。我们将探讨其工作原理、与传统批量梯度下降的区别、各自的优缺点,以及如何通过引入动量、自适应学习率等高级技巧来优化SGD的性能,使其能够高效处理大规模数据集并逃离局部极小值。


梯度下降法回顾 📉

上一节我们介绍了各种机器学习模型及其估计方法。本节中,我们来看看参数优化的核心算法——梯度下降法。

梯度下降法是一种最小化目标函数 ( J(\theta) ) 的方法。其中,( \theta ) 是模型参数空间中的一个点。例如,在感知机模型中,参数是分离超平面的法向量 ( W );在神经网络中,参数是所有连接的权重。目标函数 ( J(\theta) ) 是我们希望最小化的损失函数,它是一个标量值。

更新公式如下:
[
\theta_{\text{new}} = \theta_{\text{old}} - \eta \cdot \nabla J(\theta)
]
其中,( \eta ) 是学习率,决定了参数更新的步长。( \nabla J(\theta) ) 是目标函数在参数 ( \theta ) 处的梯度。在局部最小值处,梯度为零,更新停止。


梯度下降的三种变体 🔄

梯度下降的不同变体在于计算梯度 ( \nabla J(\theta) ) 时所使用的数据量不同。目标函数 ( J(\theta) ) 及其梯度 ( \nabla J(\theta) ) 不仅是参数 ( \theta ) 的函数,也是数据 ( X ) 的函数。

以下是三种主要变体:

  • 批量梯度下降:使用全部数据集 ( X ) 来计算每一次参数更新时的梯度。
  • 随机梯度下降:每次更新只使用一个数据样本 ( x_i ) 来计算梯度。
  • 小批量梯度下降:每次更新使用一小批数据样本(例如,从 ( x_i ) 到 ( x_{i+\text{batch size}} ))来计算梯度。

关键区别在于,批量梯度下降始终在由全部数据定义的同一个“误差曲面”上移动。而随机梯度下降的每一步都在一个由单个样本定义的、完全不同的曲面上计算梯度。小批量梯度下降则介于两者之间,每一步在一个由小批量样本定义的曲面上移动。这种随机性使得SGD的收敛路径与批量梯度下降不同。


权衡:精度、速度与内存 ⚖️

不同的梯度下降变体在参数更新的精度、速度和内存消耗上存在权衡。

  • 批量梯度下降:更新最准确,但速度慢,内存消耗高,无法进行在线学习。
  • 随机梯度下降:更新快,内存消耗低,支持在线学习,但更新方差大,可能导致目标函数剧烈波动。
  • 小批量梯度下降:速度适中,内存消耗适中,支持在线学习,并通过平均梯度减小了更新方差。

在大数据时代,数据集可能达到TB级别,无法一次性装入内存。批量梯度下降因此变得不可行。随机梯度下降及其变体成为处理大规模数据的关键。


算法实现细节 💻

以下是三种梯度下降变体的简化伪代码描述。

批量梯度下降

批量梯度下降在每个迭代周期(epoch)中使用全部数据计算一次梯度,并进行一次参数更新。

for epoch in range(num_epochs):
    grad = compute_gradient(theta, entire_dataset)
    theta = theta - learning_rate * grad

随机梯度下降

随机梯度下降在每个epoch中随机打乱数据,并对每一个样本单独计算梯度并更新参数。

for epoch in range(num_epochs):
    shuffle(data)
    for x_i, y_i in data:
        grad = compute_gradient(theta, x_i, y_i)
        theta = theta - learning_rate * grad

小批量梯度下降

小批量梯度下降是折衷方案,它对每一小批数据计算平均梯度,然后更新参数。这能利用深度学习库的高度优化矩阵运算。

for epoch in range(num_epochs):
    shuffle(data)
    for batch in get_batches(data, batch_size):
        grad = compute_gradient(theta, batch)
        theta = theta - learning_rate * grad

优化SGD:动量与加速 🚀

随机梯度下降的波动性可能阻碍收敛,特别是在“峡谷”形误差曲面中,它可能会在谷壁间震荡,而非沿谷底快速下降。

为了解决这个问题,我们引入了动量的概念。其思想类似于让一个重球沿着误差曲面滚动。球具有惯性,能够平滑掉梯度方向上的高频噪声,并加速在平坦方向的移动。

动量更新公式如下:
[
\begin{aligned}
v_t &= \lambda v_{t-1} + \eta \nabla J(\theta_t) \
\theta_{t+1} &= \theta_t - v_t
\end{aligned}
]
其中,( v_t ) 是当前的速度(动量),( \lambda ) 是动量衰减系数(通常取0.9)。当前更新方向是历史梯度方向的加权平均。

Nesterov加速梯度是动量的一个改进版本。它先根据当前动量“展望”一步,在那个“展望”点计算梯度,然后结合这个梯度进行修正。这种方法通常能获得更快的收敛速度。


自适应学习率算法 🧠

另一个思路是为每个参数设置自适应的学习率,而不是使用全局统一的学习率。这对于稀疏数据(某些特征很少出现)尤其有用。

AdaGrad 为每个参数累积历史梯度的平方,并以此调整学习率:
[
\theta_{t+1, i} = \theta_{t, i} - \frac{\eta}{\sqrt{G_{t, ii} + \epsilon}} \cdot g_{t, i}
]
其中,( G_t ) 是一个对角矩阵,其元素 ( G_{t, ii} ) 是参数 ( \theta_i ) 历史梯度平方的累积和。问题在于,随着训练进行,累积和会变得极大,导致学习率过早衰减至零。

RMSProp 通过引入指数衰减平均解决了AdaGrad学习率衰减过快的问题:
[
\begin{aligned}
E[g^2]t &= \beta E[g^2] + (1-\beta) g_t^2 \
\theta_{t+1} &= \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \cdot g_t
\end{aligned}
]

Adam 结合了动量(一阶矩估计)和RMSProp(二阶矩估计)的思想,并进行了偏差校正,是目前最流行且通常效果很好的自适应优化算法。
[
\begin{aligned}
m_t &= \beta_1 m_{t-1} + (1-\beta_1) g_t \
v_t &= \beta_2 v_{t-1} + (1-\beta_2) g_t^2 \
\hat{m}_t &= \frac{m_t}{1 - \beta_1^t} \
\hat{v}t &= \frac{v_t}{1 - \beta_2^t} \
\theta
&= \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t
\end{aligned}
]


逃离鞍点与结论 🏁

在高维参数空间中(如大型神经网络),真正的局部极小值很少见,更常见的是鞍点。在鞍点处,梯度为零,但某些方向是上升的,某些方向是下降的。

自适应学习率方法(如Adam)通过为不同参数提供不同的更新幅度,有助于逃离鞍点。即使大多数参数的梯度为零,那些梯度非零的参数仍能获得有效的更新,从而推动模型继续优化。

实践证明,随机梯度下降及其高级变体(尤其是Adam)在大数据场景下不仅计算更快,而且通常能比批量梯度下降更快地收敛到良好的解。这使其成为现代深度学习和大规模机器学习任务中的默认优化器。


本节课中我们一起学习了随机梯度下降的核心原理、三种变体的区别与权衡,以及如何通过动量、Nesterov加速和自适应学习率(AdaGrad, RMSProp, Adam)等高级技术来提升其性能,使其能够高效、稳健地训练大规模机器学习模型。

040:高斯混合模型与聚类算法 🧮

在本节课中,我们将学习高斯混合模型及其相关的聚类算法。我们将从回顾最大似然估计开始,然后介绍高斯混合模型,并探讨聚类的基本概念。最后,我们将详细讲解K-Means算法及其变体——软聚类。

最大似然估计回顾 📊

上一节我们介绍了最大似然估计的基本概念。本节中,我们来看看在处理连续特征时,如何应用最大似然估计。

在第九讲关于最大似然估计的内容中,我们讨论了如何处理连续特征。起初可能觉得困难,但后来发现其实很简单。我们首先构建似然函数,然后最大化它。如果我们用高斯分布来建模似然函数,问题就变得相当容易。

在任何最大似然估计问题中,我们都需要找到能够最大化观测数据概率的参数。我们通过最大化似然函数来实现这一点。假设数据是独立抽取的,那么似然函数可以分解为每个样本独立似然的乘积。因为我们假设数据服从高斯分布,所以每个样本的似然是已知的。

高斯分布包含未知的均值参数和方差参数。由于样本是独立同分布的,我们可以将指数内的乘积合并,进而估计这个高斯分布的均值最大似然估计量。众所周知,它就是样本均值,即所有参数值之和除以N。

同时,方差的最大似然估计量是估计均值与样本值之间差值的平方和。

此外,我们了解到这个最大似然估计量是有偏的。其偏差主要源于我们使用的是均值的最大似然估计量,而非真实均值。如果我们使用真实均值,结果将是准确的。为了纠正最大似然估计量中的偏差,我们需要用n-1而不是n进行归一化。

当只有一个高斯分布,并且数据都从中采样时,上述过程简单明了。我们只需要估计该高斯分布的参数。但是,如果存在多个高斯分布呢?

高斯混合模型 🌀

上一节我们回顾了单一高斯分布的最大似然估计。本节中,我们将探讨当数据可能来自多个高斯分布时的情况,即高斯混合模型。

高斯混合模型是多个高斯分布的线性组合。每个高斯分布称为一个“成分”,并有其自身的均值和方差。此外,每个成分还有一个混合权重,表示该成分生成数据的概率。

在高斯混合模型中,我们假设每个数据点是由其中一个高斯成分生成的,但我们不知道具体是哪一个。这引入了“隐变量”的概念,即我们无法直接观测到的变量。在这种情况下,隐变量指示了每个数据点属于哪个高斯成分。

为了估计高斯混合模型的参数(各成分的均值、方差和混合权重),我们需要使用期望最大化算法。EM算法是一种迭代方法,用于在存在隐变量的情况下找到参数的最大似然估计。

EM算法分为两个步骤:期望步骤和最大化步骤。在期望步骤中,我们根据当前参数估计计算每个数据点属于每个成分的后验概率。在最大化步骤中,我们使用这些后验概率更新参数估计,以最大化期望似然。

通过反复迭代这两个步骤,EM算法会收敛到参数的局部最优解。这使得我们能够从数据中学习高斯混合模型,即使我们不知道每个数据点来自哪个成分。

聚类简介 🔍

上一节我们介绍了高斯混合模型,它本质上是一种软聚类方法。本节中,我们来看看聚类的一般概念及其意义。

聚类是一种无监督学习技术,旨在将数据点分组到不同的类别或“簇”中,使得同一簇内的数据点彼此相似,而不同簇的数据点则 dissimilar。聚类在许多领域都有应用,例如客户细分、图像分割和异常检测。

聚类的目标是根据数据点的特征发现数据中的内在结构。与分类不同,聚类不需要预先标记的数据。相反,它依赖于数据点之间的相似性度量。

以下是几种常见的聚类算法:

  • K-Means:一种基于质心的聚类算法,将数据划分为K个簇,每个簇由其质心表示。
  • 层次聚类:通过构建树状图(树状结构)来合并或分裂簇,形成聚类的层次结构。
  • DBSCAN:一种基于密度的聚类算法,可以发现任意形状的簇,并能识别噪声点。
  • 高斯混合模型:一种基于概率模型的软聚类方法,假设数据由多个高斯分布混合生成。

聚类在许多实际应用中都非常有用,例如市场分析、社交网络分析和生物信息学。通过将相似的数据点分组在一起,我们可以更好地理解数据并做出有根据的决策。

K-Means 算法 🎯

上一节我们概述了聚类的基本概念。本节中,我们将深入探讨一种特定的聚类算法——K-Means。

K-Means 是一种基于质心的聚类算法,旨在将数据点划分为K个簇。每个簇由其质心表示,质心是该簇中所有数据点的平均值。K-Means 的目标是最小化每个数据点到其所属簇质心的距离平方和。

K-Means 算法通过迭代以下两个步骤来实现这一目标:

  1. 分配步骤:将每个数据点分配到距离其最近的质心所属的簇。
  2. 更新步骤:根据当前分配到每个簇的所有数据点重新计算该簇的质心。

算法开始时随机初始化K个质心,然后重复执行分配和更新步骤,直到质心不再发生显著变化或达到预定的迭代次数。

K-Means 算法简单高效,适用于大规模数据集。然而,它也有一些局限性,例如需要预先指定簇的数量K,并且对初始质心的选择敏感。此外,K-Means 假设簇是凸形的且大小相似,这可能不适用于所有类型的数据。

软聚类与软K-Means 🤖

上一节我们介绍了标准的K-Means算法,它是一种硬聚类方法,即每个数据点只属于一个簇。本节中,我们来看看软聚类,特别是软K-Means。

软聚类,也称为模糊聚类,允许数据点以一定的概率属于多个簇。这与硬聚类不同,硬聚类中每个数据点只能完全属于一个簇。软聚类提供了更灵活的数据表示,能够捕捉数据点可能属于多个类别的情况。

软K-Means是K-Means的软聚类版本。在软K-Means中,每个数据点都有一个隶属度向量,表示它属于每个簇的概率。这些概率之和为1。算法的目标是最小化加权距离平方和,其中权重就是数据点属于各簇的隶属度。

软K-Means的迭代过程与标准K-Means类似,但包含软分配:

  1. 软分配步骤:计算每个数据点属于每个簇的概率(隶属度)。
  2. 更新步骤:根据当前隶属度加权平均重新计算每个簇的质心。

软K-Means通过引入隶属度的概念,提供了比硬K-Means更丰富的数据结构描述。它对于簇边界模糊或数据点可能具有多重身份的情况特别有用。软K-Means与高斯混合模型有密切的联系,实际上可以看作是高斯混合模型在特定假设下的一个特例。

总结 📝

本节课中我们一起学习了高斯混合模型及其相关的聚类算法。我们从最大似然估计的回顾开始,理解了如何估计单一高斯分布的参数。接着,我们探讨了高斯混合模型,它通过引入隐变量和EM算法来处理来自多个高斯分布的数据。

然后,我们介绍了聚类的基本概念,了解了其目标和应用场景。我们详细讲解了K-Means算法,这是一种基于质心的硬聚类方法。最后,我们探讨了软聚类的概念,特别是软K-Means,它允许数据点以概率形式属于多个簇,提供了更灵活的数据分组方式。

这些内容为我们理解无监督学习,特别是基于模型的聚类方法,奠定了坚实的基础。

041:高斯混合模型 (GMM) 🧮

在本节课中,我们将要学习高斯混合模型。这是一种用于密度估计和聚类的强大工具,它通过组合多个高斯分布来描述复杂的数据分布。

当数据由多个高斯分布表示时,我们称这种组合为高斯混合模型,其概率密度函数称为混合高斯密度。如果只有一个高斯分布,我们只需要知道其均值和协方差矩阵。但在多维情况下,如果我们有两个或k个高斯分布,它们的简单相加并不会构成一个概率分布。为了使其成为一个有效的概率分布,我们需要为每个高斯分量乘以一个权重,这些权重之和为1。这些权重可以看作是先验概率,我们称之为混合权重。本质上,这是高斯分布的一个凸组合。例如,如果均匀地选择左右两个高斯,只需将每个分量乘以0.5再相加,就能得到一个新的分布,这个分布就是高斯混合模型。

模型定义与动机

上一节我们介绍了高斯混合模型的基本概念,本节中我们来看看其正式定义和动机。

如果单一的高斯分布无法很好地拟合数据,我们就使用高斯混合模型。这是一种混合建模或分区算法。我们有一个数据集,以及由不同模型(分量)组成的混合模型,然后将数据集划分到属于不同模型(例如不同高斯分布)的子集中。虽然混合建模不限于高斯分布,但高斯分布因其数学上的便利性而被广泛使用。密度估计本身很重要,它帮助我们理解周围世界的概率,并且可以用于构建更好的分类器,例如在朴素贝叶斯中。

软分配与概率解释

理解了基本动机后,我们进一步探讨混合建模中的核心思想:软分配。

与将所有样本硬性分配到一个类别或一个高斯不同,我们考虑软分配的概念。即,一个样本 X_i 属于第 k 个高斯簇的概率。一个样本可能以一定的概率属于这个高斯簇,也以一定的概率属于另一个高斯簇。这个概率就是之前提到的混合权重 π_k。作为概率,它们是正的且总和为1。那么,观测到某个特定点 x 的概率,就是所有可能类别(高斯分量)下联合概率的加权和。用公式表示,观测到点 x 的概率为:
p(x) = Σ_{k=1}^{K} π_k * N(x | μ_k, Σ_k)
这实际上是对所有类别进行边缘化(积分)的结果。如果密度函数是高斯混合,那么在某一点的概率就是该点根据橙色簇、品红色簇、紫色簇等各个高斯分量的概率加权和。

生成过程与模型参数

现在,我们具体看看高斯混合模型的生成过程和参数。

在高斯混合模型中,分布将具有多个峰值(或称“分量”)。每个分量都有一个关联的均值 μ_k 和协方差矩阵 Σ_k。每个样本的生成过程如下:

  1. 首先,以概率 π_k 选择第 k 个分量。
  2. 然后,从被选中的高斯分布 N(x | μ_k, Σ_k) 中生成样本 x

需要指出的是,高斯混合模型是一种生成模型。生成模型不仅能描述数据或解决分类问题,还能生成与训练数据分布一致的新样本。例如,在估计完成后,可以从核密度估计器或高斯混合模型中采样新样本。

因此,对于K个高斯分布的混合,数据点 x 的似然函数是各个高斯似然的加权和:
p(x | θ) = Σ_{k=1}^{K} π_k * N(x | μ_k, Σ_k)
其中 θ 代表所有参数 {π_k, μ_k, Σ_k} 的集合。

与聚类的关系及决策边界

高斯混合模型可以看作是聚类的一种形式。为了简化,我们做一个假设。

假设所有高斯分量具有相同的协方差矩阵 Σ,并且是球形的(即 Σ = σ^2 I)。这意味着在所有方向上概率密度衰减相同。这些高斯分布的唯一区别在于它们具有不同的均值 μ_k。混合概率 π_k 是已知的。给定一个样本 x,我们需要判断它属于哪个簇(例如簇K还是簇Z)。我们可以基于后验概率的比例来做决策,使用贝叶斯公式。证据项会抵消,归一化常数也会抵消,最终我们会得到一个线性决策边界。特别是在这个球形协方差的例子中,这些线性模型非常接近(或等同于)空间的Voronoi划分。

决策边界一侧的所有点更接近某个均值,另一侧的点则更接近另一个均值。这基本上划定了空间的距离单元或区域,即Voronoi单元。

总结

本节课中我们一起学习了高斯混合模型。我们了解到,GMM通过多个高斯分布的凸组合来建模复杂数据分布,是一种强大的密度估计和聚类工具。它引入了软分配的概念,即每个数据点以一定概率属于各个分量。GMM是一个生成模型,可以描述数据的生成过程。在特定假设(如球形等协方差)下,其决策边界是线性的,并与Voronoi图相关。关于如何从数据中估计GMM的参数(如均值、协方差和混合权重),我们将在下一讲中深入探讨。

042:聚类

在本节课中,我们将要学习聚类分析。聚类是一种将数据分割成不同组别的无监督学习方法。我们将探讨其基本概念、形式化定义、面临的挑战以及它与监督学习的区别。

什么是聚类?🤔

上一节我们介绍了课程主题,本节中我们来看看聚类的核心定义。

聚类是一种分割数据的方法。它将一组对象划分到不同的群组中。我们实际上一直在进行聚类,例如当我们命名“树”时,就是在用一个名称标识一个类别。

这个名称意味着什么呢?它是否意味着这个类别中的所有事物都完全相同?答案是既肯定又否定。有些树比其他树更相似,但在我们称为“树”的类别中,确实存在巨大的多样性。聚类也是一种压缩机制。如果我们已经识别并认同了数据中的聚类,那么我们只需要说“树”,其含义就已经很明确了。在给出指示或交流时,我们无需讨论场景中的所有多样性和细节。

因此,聚类是一种发现数据中规律性的方法。你可以将其视为分类的第一步,因为分类在某种意义上就是将观测值分配到不同的类别中。唯一的决定性区别在于,聚类是无监督的。在本讲座中我们将看到,或者你可能已经在混合模型中看到,聚类实际上是混合建模的一种方式。

聚类的形式化定义 📝

上一节我们了解了聚类的直观概念,本节中我们来看看如何形式化地定义它。

其定义与混合模型非常相似:一个数据点 x 属于哪个成分?属于哪个簇?聚类是通过相似性将对象分组到簇中的过程。我们将相似的对象放入同一个簇。

以下是聚类的核心目标:

  • 我们希望簇内的相似性非常高。我们希望簇内的对象或样本彼此高度相似。
  • 我们希望不同簇之间或跨簇的样本是不相似的。

因此,聚类是最常见的无监督学习形式。不过,需要说明的是,我们讨论过的PCA、ICA、NMF、核密度估计等方法也是无监督方法,并且应用非常广泛,甚至在监督学习领域也有应用。当我们说机器学习可以分为监督学习和无监督学习时,这已经不是一个完全准确的描述了,但我们通常还是会这样粗略地划分。需要知道还有其他组成部分,但当我们说“无监督”时,通常指的是:如果监督学习是分类,那么无监督学习就一定是聚类。

聚类的主观性与挑战 🎯

上一节我们形式化地定义了聚类,本节中我们来看看聚类分析面临的主要挑战。

第一个挑战是聚类具有主观性。你可以用多种可能的方式对对象进行聚类,而这些方式在某种意义上都可能是正确的。

例如,让我们看看辛普森一家及其朋友们。我们可以提取多种分组方式。我们可以提取辛普森家族的分组、学校员工的分组、女性的分组或男性的分组。正如你在女性和学校员工的分组中所见,同一个人可以同时属于多个分组。

因此,你如何定义这些分组,或者你选择将对象划分到哪些分组中,是有些主观的。有些分组集合可能会产生相互冲突的分配。或者,你可以同样合理地将同一个辛普森角色分配到多个组中。哪个是正确的?这很难说,因为这取决于具体情况。

另一个挑战是:相似性是什么?我们希望同一簇内的对象高度相似,并希望不同簇中的对象不相似。但相似性很难定义。当然,我们看到时能认出来,但要精确地定义它却非常困难。

总结 📚

本节课中,我们一起学习了聚类分析。我们了解到聚类是一种无监督学习方法,旨在根据相似性将数据对象分组,使得组内对象相似度高,组间对象差异大。我们探讨了其形式化定义,并指出了聚类面临的两个主要挑战:其划分结果具有主观性,以及“相似性”这一核心概念本身难以精确定义。理解这些基础是后续学习具体聚类算法(如K-Means、层次聚类等)的关键。

043:硬K均值算法详解 🎯

在本节课中,我们将学习一种特定的聚类算法——硬K均值算法。我们将从问题定义开始,逐步讲解其工作原理、算法步骤、优缺点以及一些需要注意的细节。

概述

给定一组观测数据 X₁Xₙ,其中每个 Xᵢ 是一个 D 维的实数向量,即 Xᵢ ∈ ℝᴰ。这意味着数据存在于欧几里得空间中。

我们的目标是:将这 n 个观测值划分到 K 个簇中,其中 K ≤ n,以确保有足够的样本分配到各个簇。划分的目标是,使得簇内的平均欧几里得距离平方和最小。换句话说,我们希望每个簇中的点尽可能靠近其中心点(质心)。

然而,从组合数学的角度看,这是一个 NP-hard 问题,因为可能的划分方式数量巨大。因此,我们通常采用启发式算法来寻找近似解。本节课将重点介绍 K均值算法,下一讲则会讨论 高斯混合模型

算法工作原理演示

让我们通过一个模拟过程来理解K均值算法是如何工作的。

  1. 初始化:假设我们预设了簇的数量 K=3。算法开始时,随机猜测三个簇中心(质心)的位置。
  2. 分配步骤:计算每个数据点到所有质心的距离,并将其分配到距离最近的质心所在的簇。
  3. 更新步骤:根据上一步得到的簇分配结果,重新计算每个簇的质心(即计算该簇所有点的平均值)。
  4. 迭代:重复执行 分配更新 步骤,直到簇的分配不再发生变化,此时算法收敛。

这个过程可以形象地理解为:我们不断调整质心的位置,并重新划定每个簇的“势力范围”(Voronoi单元),直到系统达到稳定状态。每一次迭代,我们的目标函数(簇内距离平方和)都会减小,这保证了算法最终会收敛。

完整算法步骤

以下是硬K均值算法的规范化描述。

输入

  • 数据集
  • 期望的簇数量 K
  • 距离度量(通常使用欧几里得距离)

初始化:随机选择 K 个点作为初始簇中心。

迭代过程

  1. 分配步骤:决定每个数据点的簇归属,将其分配到最近的簇中心。
  2. 更新步骤:根据当前的簇分配,重新计算每个簇的中心(质心)。

终止条件:当没有数据点的簇归属在上一次迭代中发生改变时,算法终止。

算法核心步骤详解

为了更好地形式化算法并便于后续推广,我们引入“责任”(responsibility)的概念。

分配步骤的形式化

对于第 n 个样本点 xₙ,我们为其定义一个 K 维的责任向量 rₙ。这是一个 独热编码 向量,其中只有一个元素为1,其余为0。rₙᵏ = 1 表示点 xₙ 被分配给了第 k 个簇。

用公式表示分配规则为:
rₙᵏ = 1 如果 k = argminⱼ ||xₙ - μⱼ||²,否则为 0

将所有样本的责任向量排列起来,就得到一个 K × N 的二进制责任矩阵 R,它的每一列都只有一个非零元素。

注意:如果某个点恰好落在两个簇的决策边界上(距离相等),可以任意选择一个规则来处理,例如将其分配给索引较小的簇。

更新步骤的形式化

在获得所有样本的责任分配 R 后,我们重新计算每个簇的质心 μₖ。计算公式为:

μₖ = (Σₙ rₙᵏ * xₙ) / (Σₙ rₙᵏ)

这个公式的含义是:新的质心 μₖ 是分配给簇 k 的所有点的平均值。分母 Σₙ rₙᵏ 就是属于簇 k 的点的数量。

算法特性分析

上一节我们形式化地定义了算法的核心步骤,现在我们来分析它的一些重要特性。

计算复杂度

  • 分配步骤:计算每个点到 K 个质心的距离,复杂度为 O(K * N)
  • 更新步骤:对每个簇求平均值,每个点只参与一次计算,复杂度为 O(N)
    假设算法迭代 L 次收敛,总复杂度约为 O(L * K * N)。这是一个线性复杂度,对于大规模数据,即使线性也可能成为挑战,因此人们开发了各种最近邻搜索数据结构来加速。

收敛性保证

算法保证会终止。因为每一步(分配或更新)都会严格减小目标函数(簇内距离平方和)。由于目标函数有下界(≥0),因此算法必然收敛到一个局部最优解。

对初始值的依赖性

K均值算法的结果强烈依赖于初始质心的选择。不同的随机种子可能导致完全不同的聚类结果和收敛到不同的局部最优解。

解决方案:常见的做法是多次运行算法(使用不同的随机初始值),然后选择目标函数值最小的那次结果作为最终输出。

如何选择K值?

K均值算法有一个关键的超参数:簇的数量 K。这个值无法从数据中自动学习得到,必须预先指定。

一种常用的启发式方法是 “肘部法则”

  1. 尝试不同的 K 值(例如从1到10)。
  2. 对每个 K 运行K均值算法,并记录其目标函数值(簇内距离平方和)。
  3. 绘制 K 与目标函数值的曲线图。
  4. 寻找曲线上的“拐点”或“肘部”,即目标函数下降速度突然变缓的点,对应的 K 值通常是一个较好的选择。

然而,这种方法并非总是有效,尤其是当曲线平滑下降,没有明显的肘部时。

算法的局限性

尽管K均值简单有效,但它也存在一些固有的缺陷。

对簇形状的假设

K均值隐含地假设簇是凸形的各向同性的,并且大小相似。它使用欧氏距离,因此天然倾向于发现球形超球形的簇。

失败案例1:非球形簇
对于环形、流形或密度不均匀的簇结构,K均值可能无法正确识别。

失败案例2:不同大小的簇
当存在一个密集的小簇和一个稀疏的大簇时,K均值可能会将大簇边缘的噪声点错误地划分给小簇,因为它只关心距离,不关心数据分布的密度。

对噪声和边界点敏感

每个数据点,无论其是否处于簇的边界或可能是噪声点,在更新质心时都具有相同的权重。这可能导致质心被边界点或离群点“拉偏”,影响聚类效果。

总结

本节课我们一起学习了硬K均值聚类算法。我们首先定义了聚类问题,并指出其组合复杂性。然后,我们详细讲解了K均值算法的工作原理,它是一个通过交替执行 分配步骤更新步骤 来迭代优化的启发式方法。我们形式化地描述了这两个步骤,并引入了责任向量的概念。

我们分析了算法的计算复杂度、收敛性,并重点讨论了其对初始值敏感和需要预先指定K值的特点。最后,我们探讨了K均值算法的局限性,包括它对簇形状的假设以及对噪声的敏感性。

理解这些特性和局限,对于在实践中正确应用和解释K均值算法的结果至关重要。在接下来的课程中,我们将看到如何用高斯混合模型来克服K均值的一些缺点。

044:软K均值 🧮

在本节课中,我们将学习K均值聚类算法的一个改进版本——软K均值。我们将探讨硬K均值存在的问题,理解软K均值的核心思想,并学习其算法步骤。

上一节我们介绍了硬K均值算法,本节中我们来看看它的一个主要问题。硬K均值在处理靠近簇边界的点时,会将其与簇中心附近的点同等对待,强制将其硬性分配给一个簇。这种分配方式可能会影响质心的更新,即使只有少数几个边界点,也可能对最终聚类结果产生不利影响。

为了解决这个问题,研究者们提出了软K均值算法。其核心思想是放松“责任”的分配,使其从二元硬分配变为连续的软分配。

核心概念:从硬分配到软分配

在硬K均值中,每个数据点 x_n 的归属由一个二元向量表示,例如 [0, 1, 0] 表示它属于第二个簇。软K均值将其放松为一个连续的向量,例如 [0.1, 0.7, 0.2],表示它更可能属于第二个簇,但也有较小概率属于第一或第三个簇。

为了使这种分配有意义,我们要求每个数据点的责任向量之和为1,这保证了每个点至少被部分地分配给了某个簇。这让人联想到现代机器学习中的 Softmax 函数。

此外,软K均值引入了一个新的参数 β(beta),称为刚度参数,它控制着分配的“软硬”程度。

软K均值算法步骤 📝

软K均值的算法框架与硬K均值保持一致,主要区别在于责任计算和质心更新步骤。

以下是算法的具体步骤:

  1. 初始化:随机选择K个初始质心 μ_k
  2. 责任计算(E步):对于每一个数据点 x_n 和每一个质心 μ_k,计算其软责任 r_{nk}。公式如下:
    r_{nk} = exp(-β * ||x_n - μ_k||^2) / Σ_j exp(-β * ||x_n - μ_j||^2)
    这个公式正是 Softmax 函数,它确保了对于每个点 n,所有簇的责任之和为1:Σ_k r_{nk} = 1
  3. 质心更新(M步):利用计算出的软责任来更新每个簇的质心。更新公式为:
    μ_k = Σ_n r_{nk} * x_n / Σ_n r_{nk}
    可以看到,更新公式与硬K均值相似,但这里使用的是连续的权重 r_{nk},而不是二元的指示变量。每个数据点根据其属于簇 k 的责任大小,对所有质心的更新都做出贡献。
  4. 迭代:重复步骤2和步骤3,直到质心的变化小于某个阈值或达到最大迭代次数。

刚度参数 β 的影响 🔧

刚度参数 β 是软K均值的关键。我们可以定义长度尺度 σ = 1 / sqrt(β) 来帮助理解。

  • β 很小(σ 很大)时:所有数据点到所有质心的距离差异在指数函数中显得不那么重要,导致责任 r_{nk} 对所有簇都趋于相似。这相当于所有质心都收敛到数据的全局中心,无法形成有效的簇。
  • β 增大(σ 减小)时:距离差异被放大。距离质心近的点会被赋予更高的责任,距离远的点责任则很低。这使得质心能够更明确地捕捉数据中紧密的簇结构。
  • β → ∞ 时:软责任 r_{nk} 会退化为硬分配(最近簇的责任为1,其余为0),软K均值就变回了硬K均值。

通过逐渐增加 β(减小长度尺度),算法可以从一个模糊的全局状态逐步聚焦,最终分离出数据中存在的各个簇。

总结与展望 🎯

本节课中我们一起学习了软K均值算法。我们了解到,通过将硬分配松弛为基于Softmax的软分配,并引入刚度参数 β,软K均值能够更细腻地处理边界点,使质心更新更稳健。算法保持了期望最大化(EM)的框架,在E步计算软责任,在M步用加权平均更新质心。

软K均值为我们提供了一种更灵活的聚类视角。那么,K均值算法还有哪些可以改进的地方呢?这将是我们下一讲要讨论的主题。


本节课核心公式总结:

  • 软责任r_{nk} = exp(-β * ||x_n - μ_k||^2) / Σ_j exp(-β * ||x_n - μ_j||^2)
  • 质心更新μ_k = Σ_n r_{nk} * x_n / Σ_n r_{nk}

045:期望最大化算法 📈

在本节课中,我们将学习期望最大化(EM)算法。我们将回顾高斯混合模型,探讨其参数估计的难点,并最终介绍EM算法如何优雅地解决这些问题。本节课将融合逻辑回归、参数估计、聚类以及上节课提到的隐变量建模等概念。


高斯混合模型需要EM算法吗?🤔

上一节我们介绍了EM算法的背景,本节中我们来看看一个具体模型——高斯混合模型(GMM)——是否真的需要EM算法。

高斯混合模型的似然函数如下所示:

\[p(x) = \sum_{k=1}^{K} \pi_k \cdot \mathcal{N}(x | \mu_k, \Sigma_k) \]

其中:

  • \(K\) 是混合成分的数量。
  • \(\pi_k\) 是第 \(k\) 个高斯成分的先验概率,满足 \(\sum_{k=1}^{K} \pi_k = 1\)
  • \(\mu_k\)\(\Sigma_k\) 分别是第 \(k\) 个高斯成分的均值和协方差矩阵。

为了简化讨论,我们假设所有高斯成分的协方差矩阵都是对角的,且各维度方差相同(即球形协方差):

\[\Sigma_k = \sigma^2 I \]

这样,每个高斯分布就像空间中的一个“球体”,它们形状相同,只是中心位置(均值)不同。

那么,我们真的需要引入隐变量吗?回想K-Means算法,它先估计中心点(类似均值),再分配数据点所属类别(类似隐变量)。对于GMM,我们似乎也可以尝试直接优化参数。


最大似然估计的困难 😓

上一节我们看到了GMM的似然形式,本节中我们来分析直接对其进行最大似然估计(MLE)会遇到什么困难。

标准的做法是写出对数似然函数,然后分别对参数 \(\pi_k\)\(\mu_k\)\(\Sigma_k\) 求导,并令导数为零来求解。然而,这个过程非常困难。

原因在于指数族分布的性质。单个高斯分布属于指数族,其对数似然形式简洁,参数和数据可以很好地分离开,便于优化。但是,多个指数族分布的加权和(即混合模型)不再属于指数族。对于GMM,其对数似然函数为:

\[\log p(X) = \sum_{i=1}^{N} \log \left( \sum_{k=1}^{K} \pi_k \cdot \mathcal{N}(x_i | \mu_k, \Sigma_k) \right) \]

这个式子中,对数内部有一个求和运算。这使得整个表达式难以直接求导和优化,通常是一个复杂的非凸优化问题。


似然函数的奇点问题 💥

除了优化困难,直接进行MLE还会遇到一个理论上的问题——奇点。

考虑一个简单的两成分GMM。假设在优化过程中,某个高斯成分的均值 \(\mu_k\) 偶然与一个数据点 \(x_i\) 完全重合。此时,该高斯成分在该数据点处的概率密度值为:

\[\mathcal{N}(x_i | \mu_k = x_i, \sigma^2 I) = \frac{1}{(2\pi\sigma^2)^{D/2}} \]

当我们试图最大化整个数据集的似然时,对于这个特定的成分和数据点,存在一种策略:不断减小方差 \(\sigma^2\)。随着 \(\sigma^2 \to 0\),上式的值会趋向于无穷大。这会导致似然函数爆炸式增长,产生一个奇点。

在数值计算中,这意味着算法会崩溃。我们最终得到的不是一个有意义的概率分布,而是一个近似于狄拉克δ函数的尖峰,这对于模型来说是没有用的。这不仅是优化过程中的一个糟糕的局部极大值,更是一个导致计算失效的奇点。


总结 📝

本节课我们一起学习了为什么高斯混合模型不能直接使用最大似然估计进行参数优化。我们遇到了两个主要问题:

  1. 优化困难:由于对数内部存在求和,其对数似然函数非凸且难以直接求导优化。
  2. 奇点问题:当某个高斯成分的均值与数据点重合时,通过缩小方差可以使似然值趋向无穷大,导致计算失效和无效模型。

正因为存在这些挑战,我们需要一种更稳健的方法来估计GMM的参数,这就是我们下一节将要详细介绍的期望最大化(EM)算法。它将通过引入隐变量并交替进行期望(E)步和最大化(M)步,来系统性地解决这些问题。

046:一种粗略的GMM估计方法 🧮

在本节课中,我们将学习一种用于估计高斯混合模型的“技巧”方法。我们将从一个简化的双高斯混合模型开始,逐步推导其参数更新过程,并将其与K均值算法联系起来,最终引出期望最大化算法的核心思想。

上一节我们介绍了高斯混合模型的基本概念,本节中我们来看看一种具体的参数估计方法。

模型设定与假设

我们首先考虑一个由两个高斯分布组成的混合模型。其概率分布(似然函数)由参数决定,这些参数包括每个高斯分量的权重、均值(μ)和协方差(Σ)。

为了简化推导,我们做出以下假设:

  • 假设两个高斯分量出现的先验概率相等,即 π₁ = π₂ = 1/2
  • 考虑一维数据情况。
  • 假设两个高斯分量共享相同的、已知的协方差 Σ,但均值 μ₁ 和 μ₂ 未知。

我们将所有未知参数(μ₁, μ₂)合并为一个参数向量 θ。

已知参数下的后验概率

首先,假设所有参数(μ₁, μ₂, Σ)均已知。在这种情况下,给定一个数据点 x,它属于类别1(即第一个高斯分量)的后验概率可以推导出来。

以下是推导的关键步骤:

  • 根据贝叶斯定理,类别后验概率 P(class=k | x) 正比于先验概率与似然函数的乘积。
  • 在已知均值和方差、且先验概率相等的假设下,经过代数运算,可以得到 P(class=1 | x) 的表达式为 1 / (1 + exp(-z)),其中 zx 的线性函数。

这个表达式 1 / (1 + exp(-z)) 正是 Sigmoid函数 的形式。它描述了一个以 z=0 为决策边界的线性分类器,其输出在边界处为0.5,并向两侧分别趋近于0或1。这正是逻辑回归模型的核心。

在作业中,你将具体推导线性系数 w₁ 和偏置 w₀,并理解为何这个后验概率分布(作为 x 的函数)虽然形状像Sigmoid,但本身并不需要积分为1。

未知均值下的参数估计

现在回到我们的核心问题:均值 μ 是未知的,我们需要从数据中估计它们。我们再次写出整个数据集的似然函数。

对于包含 N 个独立同分布数据点的数据集 {xᵢ},其联合似然函数是每个数据点似然的乘积:
L(θ) = ∏ᵢ P(xᵢ | θ) = ∏ᵢ [∑ₖ πₖ N(xᵢ | μₖ, Σ)]

为了便于优化,我们通常处理其对数似然函数 ℓ(θ) = log L(θ)

在作业中,你将证明,对数似然函数关于均值 μₖ 的一阶导数具有以下形式:
∂ℓ/∂μₖ = (1/Σ) * ∑ᵢ [P(k | xᵢ, θ) * (xᵢ - μₖ)]

其中,P(k | xᵢ, θ) 正是在上一部分中推导出的、基于当前参数估计 θ 的类别后验概率

接着,你还会计算出关于 μₖ 的二阶导数(海森矩阵),在忽略后验概率对 μₖ 的依赖(这是一个简化或“技巧”)后,其形式非常简单:∂²ℓ/∂μₖ² ≈ - (1/Σ²) * ∑ᵢ P(k | xᵢ, θ)

牛顿-拉弗森更新与“技巧”更新公式

有了梯度和(近似的)海森矩阵,我们可以使用牛顿-拉弗森法来更新参数估计,寻找最大化对数似然函数的 μ。更新公式为:
μₖ_new = μₖ_old - (∂ℓ/∂μₖ) / (∂²ℓ/∂μₖ²)

将我们得到的一阶和二阶导数代入这个更新公式,并进行代数化简。在作业中,你将完成这一步推导,并得到以下简洁的更新规则:
μₖ_new = [∑ᵢ P(k | xᵢ, θ_old) * xᵢ] / [∑ᵢ P(k | xᵢ, θ_old)]

这个公式非常直观:新的均值估计是所有数据点的加权平均,权重正是每个数据点属于第 k 个分量的(当前估计的)后验概率 P(k | xᵢ, θ_old)

与K均值算法的联系

这个更新公式是否让你想起了什么?

是的,它和K均值算法的质心更新步骤在形式上完全一致。在K均值中:
μₖ_new = [∑_{i ∈ Cₖ} xᵢ] / |Cₖ|

其中 Cₖ 是被硬分配到第 k 个簇的数据点集合。我们可以将K均值中的“分配”看作是一种特殊的、硬性的“后验概率”:一个点要么完全属于一个簇(概率为1),要么完全不属于(概率为0)。而在我们的GMM推导中,使用的是软的、概率性的后验概率 P(k | xᵢ)

因此,K均值可以看作是高斯混合模型在假设各分量协方差相同且趋于零、并使用硬分配(最大后验概率)时的一个特例。两者的核心结构都是:基于当前参数计算数据点的归属(E步的雏形),然后根据这个归属重新估计参数(M步的雏形)。

期望最大化(EM)算法的雏形

我们现在所描述的迭代过程,正是期望最大化(EM)算法的核心思想。这个“技巧”方法揭示了一个通用框架:

  1. 初始化:随机设置模型参数 θ 的初始值。
  2. E步(期望步):基于当前的参数估计 θ_old,计算每个数据点属于各个隐变量(如高斯分量)的后验概率 P(k | xᵢ, θ_old)。这可以理解为计算数据点对各个分量的“责任”或“归属度”。
  3. M步(最大化步):将上一步得到的后验概率视为固定权重,重新计算能最大化(完整数据)对数似然函数期望值的参数 θ_new。对于高斯混合模型的均值,这恰好导致了我们推导出的加权平均公式。
  4. 迭代:用 θ_new 替换 θ_old,重复步骤2和3,直到参数收敛。

我们称其为“技巧”,是因为在推导M步的更新公式时,我们忽略了对数似然函数中后验概率对参数的依赖,从而得到了一个简洁的解析解。更严格的EM算法推导会通过引入一个辅助函数(Q函数)来保证每次迭代都能提升似然函数值,并确保算法收敛。

本节课中我们一起学习了高斯混合模型参数估计的一种启发式方法。我们从已知参数下的后验概率出发,推导了在未知均值情况下,通过迭代更新均值的公式。这个公式与K均值算法高度相似,并自然地引出了期望最大化算法的两个核心步骤:计算后验概率(E步)和更新参数(M步)。在下一节中,我们将正式介绍期望最大化算法,并深入探讨其收敛性等理论性质。

047:通过EM算法进行最大似然估计

在本节课中,我们将学习如何通过期望最大化算法来处理不完整数据的最大似然估计问题。我们将从理解算法所需的基础数学概念开始,逐步推导EM算法的核心思想,并解释其工作原理。

概述:从凸函数到期望最大化

为了理解期望最大化算法,我们首先需要掌握几个关键的数学概念,包括凸函数和詹森不等式。这些概念是推导EM算法下界的基础。

凸函数与詹森不等式

上一节我们介绍了课程的目标,本节中我们来看看理解EM算法所需的基础数学工具。

一个函数是凸的,如果对于定义域内的任意两点 x1x2,以及任意 λ ∈ [0, 1],都满足以下条件:
f(λx1 + (1-λ)x2) ≤ λf(x1) + (1-λ)f(x2)
这意味着连接函数图像上任意两点的线段都位于函数图像的上方或重合。

凸性有不同的“强度”。以下是几种类型:

  • 凸函数:满足上述不等式,允许等号成立。
  • 严格凸函数:不等式严格成立(<),不允许等号。
  • 强凸函数:存在唯一的最优解(最小值)。

一个实用的判定定理是:如果一个函数在区间 (a, b) 上二阶可导,并且其二阶导数在该区间上非负,则该函数在该区间上是凸的。例如,函数 -log(x) 在区间 (0, ∞) 上是严格凸的。

基于凸函数,我们引入詹森不等式。詹森不等式指出,对于凸函数 f,以及满足 ∑λ_i = 1λ_i ≥ 0 的权重,有:
f(∑ λ_i x_i) ≤ ∑ λ_i f(x_i)
这个不等式允许我们将函数“移入”求和的内部,但代价是将等式变为不等式(函数值变大)。特别地,对于对数函数(在正数域上是凹函数,其负值为凸函数),我们可以应用这个不等式。

期望最大化算法推导

在掌握了凸函数和詹森不等式之后,我们现在可以开始推导期望最大化算法的核心步骤了。

我们的目标是最大化观测数据 X 的对数似然函数 L(θ) = log P(X|θ)。假设在算法第 n 步,我们有一个参数估计值 θ_n。我们希望找到一个新参数 θ,使得似然值增加,即最大化差异:
Δ = L(θ) - L(θ_n)

直接优化这个差异很困难。因此,我们引入潜在变量 Z。观测数据的似然可以通过对潜在变量 Z 的联合分布进行边缘化得到:
P(X|θ) = ∫ P(X, Z|θ) dZ

将这个表达式代入我们要最大化的差异 Δ 中。关键的一步是,我们在积分表达式中乘以一个巧妙的“1”,即 Q(Z)/Q(Z),其中 Q(Z) 是某个关于 Z 的概率分布。经过代数重组,我们得到:
L(θ) - L(θ_n) ≥ ∫ Q(Z) log [ P(X, Z|θ) / (Q(Z) P(X|θ_n)) ] dZ
这里的“≥”来自于对 log 项应用詹森不等式。

我们定义不等式右侧为关于 θ 的一个下界函数。EM算法的核心思想就是通过交替优化来不断提升这个下界,从而提升原始似然函数。

以下是EM算法的两个核心步骤:

  • E步(期望步):在固定参数 θ_n 的情况下,计算潜在变量 Z 的后验分布 P(Z|X, θ_n),并将其作为 Q(Z)。这一步使下界紧贴当前的似然值(即不等式取等号)。
  • M步(最大化步):固定分布 Q(Z),通过优化下界函数来更新参数:
    θ_{n+1} = argmax_θ ∫ Q(Z) log P(X, Z|θ) dZ
    这通常比直接优化原始似然 P(X|θ) 更简单。

变分推断视角

上一节我们介绍了EM算法的标准推导,本节中我们从变分推断的视角来重新审视它,这能提供更深刻的理解。

我们可以将EM算法视为一个优化潜在变量分布 Q(Z) 和模型参数 θ 的交替过程。将对数似然进行如下分解:
L(θ) = ∫ Q(Z) log [ P(X, Z|θ) / Q(Z) ] dZ + ∫ Q(Z) log [ Q(Z) / P(Z|X, θ) ] dZ
其中,第一项被称为证据下界,第二项是 Q(Z) 与真实后验 P(Z|X, θ) 之间的KL散度,且KL散度总是非负的。

从这个视角看,EM算法的每一步可以解释为:

  1. E步:令 Q(Z) = P(Z|X, θ_n)。这使得KL散度变为0,此时证据下界等于当前的对数似然 L(θ_n)
  2. M步:固定 Q(Z),优化 θ 以最大化证据下界。由于 Q(Z) 是基于旧参数 θ_n 的,而 θ 在改变,这会导致KL散度再次大于0,但同时也提升了对数似然 L(θ)

这个过程不断迭代:E步将下界拉至当前似然值;M步提升下界(从而提升似然);新的E步又将下界拉至新的、更高的似然值。如此反复,直至收敛。

总结

本节课中我们一起学习了期望最大化算法。我们从凸函数和詹森不等式的基础知识开始,逐步推导了EM算法用于最大化包含潜在变量模型的似然函数。我们了解到,EM算法通过引入一个易于优化的下界,并交替执行E步(计算期望,即潜在变量的后验)和M步(最大化下界以更新参数)来迭代地提升似然函数。最后,我们还探讨了EM算法的变分推断视角,将其理解为交替优化证据下界和最小化KL散度的过程。EM算法是机器学习中一个非常强大且应用广泛的基础工具,适用于隐马尔可夫模型、混合模型等多种场景。

048:P48_自动微分简介 🧮

在本节课中,我们将学习自动微分(Algorithmic Differentiation,简称AD)的基本概念。这是一种用于高效、精确计算函数导数的技术,是现代深度学习框架(如PyTorch)的核心。我们将了解它与数值微分、符号微分的区别,并介绍其两种主要模式:前向模式与反向模式。


概述与历史 📜

上一节我们介绍了在优化模型(如梯度下降法)时,计算梯度是核心需求。本节中,我们来看看一种能高效、精确计算梯度值的方法——自动微分。

自动微分并非数值近似,也非符号推导,而是一种基于计算机程序结构、以机器精度计算导数的技术。它已存在超过50年。1964年,Robert Wengert在其博士论文中首次引入了前向累积模式的自动微分。随后,该领域不断发展,并在1980年由B. Speelpenning引入了反向累积模式,这实质上就是现代反向传播算法更原则化的实现。

以下是自动微分的三种理解视角:

  • AD类型1:一种基于方程组高效计算导数的微积分方法。
  • AD类型2:一种对实现数值函数的计算机程序进行转换,使其能同时高效计算某些导数的方法。
  • AD类型3:一种能自动将输入计算机程序(指定数值函数)转换为也能高效计算导数的程序的计算机程序。

自动微分不是什么 ❌

在深入自动微分之前,有必要澄清常见的误解,特别是它与数值微分和符号微分的区别。

数值微分的问题

数值微分通过有限差分来近似导数,例如使用中心差分公式:
f'(x) ≈ (f(x+h) - f(x-h)) / (2h)

这种方法同时违反了两条数值计算的基本原则:

  1. 不应将很小的数加到很大的数上(当 x 很大而 h 很小时)。
  2. 不应减去近似相等的数(当 h 很小时,f(x+h)f(x-h) 非常接近)。

这导致了两种误差:

  • 截断误差:由于使用有限项泰勒展开近似所致。
  • 舍入误差:由于计算机浮点数精度有限,在 h 极小时,减法会放大噪声。

因此,数值微分无法提供机器精度的导数。

符号微分的局限

符号微分使用代数规则对函数表达式进行精确求导。然而,对于复杂函数(如大型神经网络),它可能产生极其庞大且冗余的表达式,导致计算效率低下。

考虑一个简单例子:计算函数 f(x) = Πᵢ xᵢ(所有 xᵢ 的乘积)的梯度。其第 j 个分量的导数为 ∂f/∂xⱼ = Πᵢ₌₁, i≠ⱼⁿ xᵢ。符号微分会为每个分量独立生成这个表达式,导致大量重复计算(n 次计算,每次都是 n-1 个元素的乘积),效率低下。


自动微分是什么 ✅

自动微分通过将复杂函数分解为一系列基本运算(如加、乘、指数、对数等)的序列,并系统性地应用链式法则来计算导数。它计算的是在特定输入点的导数值,而非导函数表达式。

在优化问题中,例如梯度下降更新公式:
W_{t+1} = W_t - η * ∇_W L(W_t)
我们需要的正是在当前参数点 W_t 处的梯度值 ∇_W L(W_t)。自动微分能高效、精确地提供这个数值。


前向模式自动微分 ⏩

上一节我们明确了自动微分的目标。本节中,我们来看看其第一种实现方式:前向模式。

前向模式自动微分沿着计算图(即函数求值过程)从前向后传播导数。它同时计算函数值及其导数。对于函数 f: ℝⁿ → ℝᵐ,其雅可比矩阵 J 是一个 m × n 矩阵。前向模式一次计算 J 与一个向量 v 的乘积,即 J * v

考虑一个简单函数 y = f(x₁, x₂) = x₁ * x₂ + sin(x₁)。其计算过程可分解为:

v₁ = x₁
v₂ = x₂
v₃ = v₁ * v₂
v₄ = sin(v₁)
v₅ = v₃ + v₄
y = v₅

前向模式会为每个中间变量 vᵢ 同时维护其值 (vᵢ.val) 和其对某个输入变量的导数值 (vᵢ.dot)。如果我们想计算关于 x₁ 的导数(即令 v̇₁ = 1, v̇₂ = 0),则推导如下:

v̇₁ = 1
v̇₂ = 0
v̇₃ = v̇₁ * v₂.val + v₁.val * v̇₂ = 1 * x₂ + x₁ * 0 = x₂
v̇₄ = cos(v₁.val) * v̇₁ = cos(x₁) * 1
v̇₅ = v̇₃ + v̇₄ = x₂ + cos(x₁)

最终,ẏ = v̇₅ 即为 ∂f/∂x₁ 在点 (x₁, x₂) 处的值。


反向传播回顾 🔄

在介绍更强大的反向模式自动微分之前,我们先简要回顾熟悉的神经网络反向传播算法。

反向传播是反向模式自动微分在特定计算图(神经网络前向计算)上的一个应用。其核心步骤为:

  1. 前向传播:计算网络每一层的激活值,直至最终输出和损失函数值。
  2. 反向传播:从损失函数开始,利用链式法则,反向计算损失相对于每一层参数和输入的梯度。

关键点在于,它先完成整个函数的前向计算,保存所有中间结果,然后从输出向输入反向传播梯度。这避免了前向模式中为每个输入单独计算导数的开销。


反向模式自动微分 ⏪

上一节回顾的反向传播,实质是反向模式自动微分的一个特例。本节中,我们正式看看通用的反向模式。

反向模式自动微分先进行一次前向计算,记录所有中间变量和运算(构建计算图),然后从输出开始反向遍历计算图,应用链式法则计算梯度。对于函数 f: ℝⁿ → ℝ(输出为标量,如损失函数),反向模式能高效计算其梯度 ∇f(即雅可比矩阵的转置 Jᵀ 与一个标量的乘积)。

沿用前面的例子 y = x₁ * x₂ + sin(x₁)。反向模式需要为每个中间变量 vᵢ 维护一个伴随变量 v̄ᵢ = ∂y/∂vᵢ

  1. 前向计算:记录 v₁ = x₁, v₂ = x₂, v₃ = v₁*v₂, v₄ = sin(v₁), v₅ = v₃+v₄, y = v₅
  2. 反向传播(初始化 ȳ = ∂y/∂y = 1):
    • v̄₅ = ȳ = 1
    • v̄₄ = v̄₅ * ∂v₅/∂v₄ = 1 * 1 = 1
    • v̄₃ = v̄₅ * ∂v₅/∂v₃ = 1 * 1 = 1
    • v̄₁ += v̄₃ * ∂v₃/∂v₁ = 1 * v₂ (注意:v₁ 同时影响 v₃v₄,梯度需累加)
    • v̄₁ += v̄₄ * ∂v₄/∂v₁ = 1 * cos(v₁) = cos(x₁)
    • v̄₂ = v̄₃ * ∂v₃/∂v₂ = 1 * v₁ = x₁
  3. 最终,x̄₁ = v̄₁ = x₂ + cos(x₁)x̄₂ = v̄₂ = x₁,即得到了完整的梯度向量 [x₂+cos(x₁), x₁]

反向模式的优势在于,对于具有大量输入(参数)和少量输出(如损失函数)的场景,它只需一次前向和一次反向遍历,就能计算出所有输入参数的梯度,效率远高于前向模式。


总结 🎯

本节课中,我们一起学习了自动微分(AD)的核心概念。

  • 我们首先明确了自动微分不是数值微分(有误差)也不是符号微分(效率低),而是一种基于程序分解和链式法则、能提供机器精度导数值的技术。
  • 接着,我们介绍了前向模式自动微分,它沿着计算图向前传播,同时计算函数值和指定方向的导数。
  • 然后,我们回顾了反向传播,它是反向模式AD在神经网络中的特例。
  • 最后,我们深入探讨了反向模式自动微分,它先进行前向计算构建计算图,然后反向传播梯度,对于多输入、单输出的函数(如机器学习中的损失函数)能极其高效地计算完整梯度。

自动微分是现代深度学习框架的基石,它使得研究人员能够专注于模型设计,而无需手动推导和实现复杂的梯度计算。

049:P49_前向模式自动微分 🧮

在本节课中,我们将要学习自动微分(Automatic Differentiation, AD)中的前向模式。我们将了解它是什么,它如何工作,以及它与数值微分和符号微分的区别。通过具体的例子和计算图,我们将清晰地展示前向模式AD的计算过程。


什么是前向模式自动微分? 🤔

上一节我们介绍了自动微分的基本概念,本节中我们来看看其具体实现方式之一——前向模式。

自动微分既不是数值微分(通过有限差分近似),也不是符号微分(生成导数的解析表达式)。它是一种利用链式法则和已知基本函数的导数,在计算函数值的同时,精确计算其导数值的技术。其精度可以达到机器精度。

一个简单的动态系统例子 🔄

为了理解前向模式,让我们回到之前讨论过的一个简单动态系统(映射)。其定义如下:

  • L1 = x
  • L_{n+1} = 4 * L_n * (1 - L_n)

我们可以用循环来实现它,从 L1 开始迭代计算,最终得到 L4 的值。

自动微分(前向模式)的做法是:我们不是从单个值 v = x 开始,而是从一个元组(值,导数值)开始。我们知道 x 对其自身的导数是 1,所以我们从 (x, 1) 开始。

然后,我们一步步重复原始的计算过程,但每一步都同时计算函数值和导数值。具体来说,在每一步 i,我们:

  1. 使用上一步的函数值 v_{i-1} 计算当前函数值 v_i
  2. 使用上一步的导数值 dot{v}_{i-1} 和已知的局部导数规则,计算当前导数值 dot{v}_i

对于我们的映射 f(v) = 4v(1-v) = 4v - 4v^2,其关于 v 的导数是 4 - 8v。根据微分法则,df = (4 - 8v) * dv

因此,在每一步迭代中,我们同时进行以下计算:

  • v_i = 4 * v_{i-1} * (1 - v_{i-1})
  • dot{v}_i = (4 - 8 * v_{i-1}) * dot{v}_{i-1}

如果我们从 x = 2 开始,初始元组为 (2, 1)。迭代过程如下:

步骤 v (值) dot{v} (导数值) 计算说明
初始 2 1 (x, dx/dx)
1 4*2*(1-2) = -8 (4-8*2)*1 = -12 应用 f(v)df/dv
2 4*(-8)*(1-(-8)) = 288 (4-8*(-8))*(-12) = -816 继续迭代
3 4*288*(1-288) = -330624 (4-8*288)*(-816) = ... 继续迭代

最终,这个过程会同时返回函数 L4x=2 处的精确值及其导数的精确值(达到机器精度)。

自动微分的核心思想与比较 💡

自动微分转换了原始函数。它的接口(输入)相同,但输出改变了:它不仅返回函数值,还返回函数在该点的导数值。

  • 手动/符号微分:我们可以推导出 L4(x) 的解析表达式,然后对其求导得到 dL4/dx 的表达式,最后代入数值计算。这属于符号处理。
  • 数值微分(有限差分):使用公式 (f(x+h) - f(x)) / h 来近似导数。它简单,但存在截断误差和舍入误差,精度受 h 选择影响。
  • 自动微分(前向模式):通过跟踪计算过程和应用链式法则,在计算 f(x) 的同时计算出精确的 f'(x)。它返回的是机器精度的数值,而不是一个导函数。

关键点在于:对于优化求解器等应用,我们通常只需要在特定点计算梯度值,而不需要梯度函数本身。自动微分能高效、精确地提供这个值。

剖析前向模式:计算图视角 📊

让我们通过一个更具体的例子来深入理解。假设有一个函数:
y = f(x1, x2) = log(x1) + sin(x2) - x1*x2

其计算图可以如下构建:

计算过程可以看作是对一系列中间变量 v_i 的赋值:

  1. v_{-1} = x1
  2. v_{0} = x2
  3. v_1 = log(v_{-1})
  4. v_2 = v_{-1} * v_{0}
  5. v_3 = sin(v_{0})
  6. v_4 = v_1 + v_3
  7. v_5 = v_4 - v_2
  8. y = v_5

x1=2, x2=5,我们可以一步步计算出 y ≈ -8.65

现在,看看前向模式自动微分如何并行计算关于 x1 的偏导数(即梯度向量的第一个分量)。我们初始化“微分量”:

  • dot{v}_{-1} = dx1/dx1 = 1 (因为我们对 x1 求导)
  • dot{v}_{0} = dx2/dx1 = 0 (因为 x2 相对于 x1 是常数)

然后,我们与原始计算同步地计算每个中间变量的微分量 dot{v}_i

步骤 原始计算 (值 v_i) 微分计算 (微分量 dot{v}_i) 规则应用
1 v_{-1}=2 dot{v}_{-1}=1 输入
2 v_{0}=5 dot{v}_{0}=0 输入
3 v_1=log(2) dot{v}_1 = (1/v_{-1}) * dot{v}_{-1} = 1/2 * 1 = 0.5 d(log(u))/dx = (1/u)*du/dx
4 v_2=2*5=10 dot{v}_2 = v_{0}*dot{v}_{-1} + v_{-1}*dot{v}_{0} = 5*1 + 2*0 = 5 乘积法则
5 v_3=sin(5) dot{v}_3 = cos(v_{0}) * dot{v}_{0} = cos(5)*0 = 0 d(sin(u))/dx = cos(u)*du/dx
6 v_4=log(2)+sin(5) dot{v}_4 = dot{v}_1 + dot{v}_3 = 0.5 + 0 = 0.5 和的导数
7 v_5=v_4 - v_2 dot{v}_5 = dot{v}_4 - dot{v}_2 = 0.5 - 5 = -4.5 差的导数
8 y = v_5 ≈ -8.65 ∂y/∂x1 = dot{v}_5 = -4.5 输出

最终,我们得到了函数在点 (2,5) 处关于 x1 的精确偏导数值 -4.5

前向模式的本质:计算雅可比矩阵的一列 🧭

从更高视角看,函数 f: R^n -> R^m 的导数是其雅可比矩阵(Jacobian Matrix)J,一个 m x n 的矩阵。

前向模式自动微分所做的是:它通过单次前向计算,计算了雅可比矩阵与一个特定向量的乘积,即一个方向导数

方向导数公式为:∇_v f(x) = J(f) * v

在前面的例子中,我们想求关于 x1 的偏导数,相当于计算方向导数 J(f) * [1, 0]^T,结果正是雅可比矩阵的第一列。如果我们想求关于 x2 的偏导数,就需要设置种子向量为 [0, 1]^T 并重新运行一次前向模式。

这引出了前向模式的特点:

  • 优势:当函数输出维度 m 远大于输入维度 n 时(例如 f: R -> R^m),一次前向传播就能计算出整个雅可比矩阵(此时是 m x 1 的梯度向量)。
  • 劣势:当输入维度 n 很大,而输出维度 m 很小(尤其是 m=1,常见于损失函数)时,我们需要运行 n 次前向传播(每次计算一列)来获取完整的梯度,这效率很低。对于这种情况,我们将在下一讲介绍更高效的反向模式自动微分

数学背后的优雅:对偶数 📐

一个有趣的历史注记是,前向模式自动微分的理念与对偶数(Dual Numbers)密切相关。对偶数由 Clifford 在1873年提出,形式为 a + bε,其中 ε 是一个满足 ε^2 = 0ε ≠ 0 的量。

基于对偶数的运算规则能自动产生导数:

  • 加法: (a + bε) + (c + dε) = (a+c) + (b+d)ε (和的导数)
  • 乘法: (a + bε) * (c + dε) = ac + (ad + bc)ε (乘积法则,因为 ε^2 项为0)
  • 函数: f(a + bε) = f(a) + f'(a)*bε (链式法则)

这恰好对应了前向模式自动微分中同时传播值和导数的过程。对偶数为前向模式提供了一个优雅的数学框架。


总结 📝

本节课中我们一起学习了前向模式自动微分(Forward Mode AD)。

  • 我们明确了自动微分与数值微分、符号微分的区别。
  • 我们通过一个动态系统的例子,逐步演示了前向模式如何通过初始种子向量 (值, 导数值) = (x, 1),在计算函数值的同时,精确计算其导数值。
  • 我们引入计算图的概念,详细剖析了前向模式在计算所有中间变量时,如何同步计算它们的微分量,并最终得到目标偏导数。
  • 我们认识到前向模式的本质是计算雅可比矩阵与一个向量(种子向量)的乘积,即计算方向导数。因此,它非常适合输出维度高、输入维度低的场景。
  • 最后,我们简要介绍了对偶数的概念,揭示了前向模式背后优美的数学原理。

在下一讲中,我们将探讨更适合机器学习优化场景(输入维度高,输出常为单个标量损失)的反向模式自动微分。

050:关于反向传播的一分钟 🧠

在本节中,我们将快速回顾神经网络中一个核心且被广泛研究的算法——反向传播。你已经对它非常熟悉,并且见过多次。我们将通过一个简单的网络结构图,清晰地梳理其前向传播与反向传播的计算过程。

上一节我们介绍了反向传播的基本概念,本节中我们来看看其具体在一个简单网络中的计算流程。

前向传播与损失计算

我们来看一张来自论文的示意图。图中展示了一个简单的神经网络。

该网络包含两个隐藏神经元和一个输出神经元。输出位于此处。

在前向传播过程中,我们计算各层的值。然后,我们计算所谓的“损失”。当存在多个输出时,我们仍将它们合并为一个损失函数,并优化这个损失。

反向传播的核心机制

通过反向传播,或者称为反向模式自动微分,我们可以同时优化所有参数。但通常,反向传播会将所有计算归结为一个数值——即损失值,并优化这个单一数值。

因此,首先计算损失相对于目标的误差,然后反向传播这个误差。其根本目标是计算损失 L 相对于输入 x 的梯度。

计算从输出 y3 开始,即计算 ∂L/∂y3。然后,根据链式法则,计算 ∂L/∂y1,进而计算 ∂y1/∂x1。这些梯度又依赖于权重 W 等参数。

在反向传播的后向过程中,正是计算这些微小的梯度分量。

计算步骤简述

以下是反向传播中梯度计算的关键步骤:

  1. 计算输出层误差:首先计算损失 L 对网络输出 y3 的梯度,即 ∂L/∂y3
  2. 反向传播误差:利用链式法则,将误差从输出层向隐藏层传递。例如,计算 ∂L/∂y1 = (∂L/∂y3) * (∂y3/∂y1)
  3. 计算参数梯度:根据传播到各层的误差,计算损失相对于各参数(如权重 W、偏置 b)的梯度,例如 ∂L/∂W1 = (∂L/∂y1) * (∂y1/∂W1)
  4. 参数更新:使用计算得到的梯度,通过优化算法(如随机梯度下降)更新网络参数:W_new = W_old - η * (∂L/∂W),其中 η 是学习率。

总结

本节课中我们一起回顾了反向传播算法。我们通过一个简单网络图,明确了其前向计算损失、后向利用链式法则计算并传播梯度以更新参数的核心过程。反向传播是训练神经网络,优化其权重参数的基础。

051:反向模式自动微分 🧮

在本节课中,我们将学习自动微分(Automatic Differentiation, AD)中的反向模式。这是一种强大的技术,是反向传播算法的泛化。我们将了解其历史背景、核心思想,并通过一个具体例子来理解其工作原理。

概述 📖

反向模式自动微分,也称为反向累积模式或自动微分,是一种高效计算函数梯度的方法。它通过一次反向遍历计算所有输入的偏导数,特别适用于输出维度远小于输入维度的场景,例如在神经网络训练中计算损失函数相对于大量参数的梯度。

上一节我们介绍了前向模式自动微分,本节中我们来看看其反向模式。

历史背景 🕰️

反向模式自动微分有着悠久而有趣的历史。其发展历程大致可分为几个阶段。

以下是其发展的几个关键类型:

  • 类型1:天才的数学系统变革。早在1931年和1959年,像费曼这样的天才就发现了相关概念,涉及不动点等有趣内容。
  • 类型2:计算过程的手动转换。稍晚些时候,Bryson(1962年)、Werblus(1967年)和Leun(1985年)等人研究了手动转换计算过程的方法。随后,Rumelhart在1986年发现了如何为特定计算过程编写代码来实现微分。
  • 类型3:转换其他程序的计算机程序。真正的突破发生在1980年代,Barth、Speelpenning等人发表了首个能自动完成所需一切任务的系统。Licon和Leun在1988年的工作,以及其前身SN系统,都已内置了此功能。
  • 类型4:一等公民的AD算子。这是真正的可微分编程,AD算子是一等公民,拥有闭包等特性。例如Stalingrad、R6RS AD、Autograd、DeepSharp等工具。

核心人物与贡献 👨‍🔬

我们的主角是Barth Speelpenning。他在1980年实现了名为“Jake”的Fortran系统,致力于“编译由算法给出的函数的快速偏导数”。

他的主要研究成果是:“为编译快速梯度的问题找到了完整的解决方案;对于编译任意形状的雅可比矩阵的问题,找到了部分解决方案。”

他描述的方法及其实现能够产生算法,这些算法计算函数 F(x1, ..., xn) 梯度所需的时间相当于常数次函数求值,与 n 无关。同时,算法的空间需求是适中的,这一点很重要。

反向模式AD工作原理 ⚙️

让我们通过一个例子来理解反向模式AD。考虑一个比之前稍复杂的函数:y = log(sin(x^2))

前向计算图(原始轨迹)是从输入 x 到输出 y 的过程。而反向模式AD则沿着这个计算图反向传播导数。

我们有一个计算图:从 X 开始,应用平方运算,然后对结果应用正弦函数 sin,最后应用对数函数 log 得到输出 Y。这是一个没有分支的线性计算图,便于理解。

与前向模式一次计算一个雅可比矩阵元素不同,反向模式的目标是:对于给定的每个输出 Yi,一次性计算其相对于所有输入 X 的梯度向量

公式表示为:∇Yi = [∂Yi/∂X1, ∂Yi/∂X2, ..., ∂Yi/∂Xn]

计算方向是从输出(根节点)反向到输入(叶节点),因此称为“反向累积”。

具体计算示例 📝

我们定义中间变量以便追踪:

  • Z1 = X^2
  • Z2 = sin(Z1)
  • Y = log(Z2)

首先完成前向计算,得到所有中间变量和最终输出 Y 的值。注意:反向模式的一个缺点是需要存储所有中间变量的值,因为反向传播时需要它们。

现在开始反向计算。我们引入“伴随变量”(adjoint)的概念,变量 V 的伴随变量记为 \bar{V},其定义为输出 Y 对该变量的导数:\bar{V} = ∂Y/∂V

  1. 计算 Y 的伴随变量\bar{Y} = ∂Y/∂Y = 1
  2. 计算 Z2 的伴随变量\bar{Z2} = ∂Y/∂Z2 = ∂Y/∂Z3 * ∂Z3/∂Z2 (假设 Z3 = Y)。这里 ∂Y/∂Z3 = \bar{Y} = 1,而 ∂Z3/∂Z2 = ∂(log(Z2))/∂Z2 = 1/Z2。所以 \bar{Z2} = 1 * (1/Z2) = 1/Z2
  3. 计算 Z1 的伴随变量\bar{Z1} = ∂Y/∂Z1 = \bar{Z2} * ∂Z2/∂Z1。其中 ∂Z2/∂Z1 = ∂(sin(Z1))/∂Z1 = cos(Z1)。所以 \bar{Z1} = (1/Z2) * cos(Z1)
  4. 计算 X 的伴随变量(即梯度)\bar{X} = ∂Y/∂X = \bar{Z1} * ∂Z1/∂X。其中 ∂Z1/∂X = ∂(X^2)/∂X = 2X。所以最终梯度 \bar{X} = [(1/Z2) * cos(Z1)] * 2X

通过这次反向遍历,我们一次性计算出了 Y 相对于 X 的完整梯度。

意义与应用 💡

反向模式AD是可微分计算梦想的核心支撑。它的强大之处在于:

  • 自然支持控制流:无论前向计算中包含条件语句、循环还是分支,反向模式都能沿着实际执行过的路径(计算轨迹)正确计算导数。
  • 可用于手动微分:即使不依赖自动化工具,反向模式的思想也能极大简化复杂函数(尤其是矩阵函数)符号微分的手动推导过程,这对理论证明或代码实现都很有帮助。

需要理解的是,像PyTorch、TensorFlow等框架实现的反向传播,其本质就是反向模式自动微分。

总结 🎯

本节课我们一起学习了反向模式自动微分(AD)。我们回顾了其发展历史,认识了核心贡献者。最重要的是,我们通过 y = log(sin(x^2)) 的例子,逐步剖析了反向模式的工作原理:它通过一次反向遍历,利用链式法则和中间变量的伴随变量,高效地计算出输出相对于所有输入的梯度。

你需要掌握前向模式与反向模式AD的区别:前向模式沿计算图正向传播,计算的是方向导数;而反向模式沿计算图反向传播,一次性计算整个梯度。理解这一点对于深入学习机器学习和优化算法至关重要。希望这节课能激发你进一步探索自动微分这一强大而有趣的工具。

052:流形学习 📚

概述

在本节课中,我们将学习流形学习。流形学习是一种用于发现高维数据中隐藏的低维结构的技术。我们将探讨其动机、核心方法,并理解如何通过降维来可视化和理解复杂的数据集。


动机:为什么需要流形学习?🤔

上一节我们概述了课程内容,本节中我们来看看流形学习的核心动机。

数据本质上是低维的。在PCA课程中曾提到,数据的维度并不完全由我们的测量方式决定。我们可能从不同角度测量许多事物,但底层过程通常比实际测量的要简单得多,涉及的变量也更少。

这取决于我们观察的尺度。例如,我们不会同时分析原子尺度和驾驶汽车尺度的运动。我们分析的是原子构成的整体——一辆驶过的汽车。在特定尺度下,数据的内在维度通常很低。

以驾驶场景为例。一张彩色图片可能包含数百万像素,每个像素随时间变化的强度可以被视为一个维度。所有可能的像素值构成了一个极高维的空间。然而,我们真正关心的内在空间信息(如“这是一辆车”、“这是道路”)的维度却很低。我们并不关心道路上每个像素的具体值。

我们的大脑运作方式也类似。大脑接收来自视觉、听觉、嗅觉和触觉的百万级感官输入,这构成了一个百万维的输入空间。但当我们触摸某物时,真正发生的事件维度很低,并非每个传感器都传递独立信息。传感器之间是相关的。

更准确地说,我们认为数据所代表的过程,发生在一个比测量空间维度低得多的“薄层”或“曲面”上,这个曲面就是流形。我们假设这个流形在局部是线性的。

那么,我们如何提取信息并观察数据结构呢?我们使用探索性数据分析。本节课描述的方法就属于这一范畴。目标是发现数据中隐藏的低维结构,其低维表示通常用于可视化。

有一个著名的“看不见的大猩猩”实验。在数据分析中也有类似实验:两组学生拿到相同的包含X和Y坐标的数据集。一组被要求寻找有趣的东西,另一组被给予更具体的任务(如寻找X和Y的相关性)。如果将X对Y绘图,数据点会呈现一个大猩猩的图案。结果,没有特定任务的那组学生更常绘制散点图并发现了“大猩猩”,而有任务的学生则可能去拟合直线并报告回归系数。

这个故事的启示是:在处理任何数据时,在盲目应用算法之前,最好先从基本原理出发,观察你的数据。探索性数据分析提供了工具,帮助我们避免成为“聪明但愚蠢”的人——即懂得很多方法却不理解自己在做什么的人。


什么是流形?🌀

上一节我们讨论了流形学习的动机,本节我们来正式定义什么是流形。

我们相信数据存在于流形上。非正式地说,流形是在任何小尺度下都近乎平坦的对象。显然,直线或平面在所有尺度上都是平坦的,它们也是流形。我们可以用切线来近似圆或球面等光滑曲面。因此,一条曲线也是流形,因为在足够小的尺度下,总可以放置一条切线使其看起来是平坦的。

对于三维空间,流形可以是曲面。只要在小尺度下近乎平坦,就可以是流形。

流形学习的核心问题是:我们能否在数据中找到这些平坦的区域?想象我们的数据分布在一个流形上,我们能否将这些区域映射到一个二维空间进行可视化?(有时是三维,但超过三维则难以可视化理解。)


流形学习实例 🔍

上一节我们定义了流形,现在通过一个具体例子来看看流形学习在做什么。

观察这个三维的猛犸象骨架图。图中我用黑点标出的一个点,在三维模型和右侧的二维圆圈中都有对应。这里,三维模型通过某种算法被映射(或投影)到了二维空间。我们通常说的“投影”暗示线性变换,但这里的映射不一定是线性的。

我们可以调整一些参数,例如参与局部线性决策的“邻居”数量,即定义什么是“局部”并将其展平。如图所示,猛犸象脚趾和鼻子上的点在二维空间中被分开了。如果增加“最小距离”参数,你会得到不同的图像。通过这个过程,即使原始数据(左侧)是高维的,将其绘制在二维图中也能帮助你发现数据中隐藏的结构。

这是另一种绘图方式,对应点被映射到不同位置。这只是两种不同方法的对比。你可以调整参数,观察结果的敏感性和稳定性。这就是可视化的意义。

在实践中,这些方法都致力于实现相同的目标。上面的例子因为原始数据是三维的,所以不够震撼。但请看下面这个时尚和酵母数据集的可视化。每个点代表一个时尚单品(如衣服、包包),它们在高维空间(每张图片可视为一个高维向量)中的关系被映射到了三维空间。算法并没有进行聚类(它不知道哪个是裤子),它只是将数据在其原本的高维空间中的关系呈现出来。你可以清楚地看到相似物品自然地聚集在一起。


流形学习算法概览 📊

上一节我们看了实例,本节我们来简要了解有哪些流形学习算法。

存在许多流形学习算法:

  • PCA:最简单的一种,但它学习的是线性超平面。
  • 多维缩放:我们将讨论的方法之一。
  • 等距特征映射:与多维缩放相关。
  • 最大方差展开
  • 局部线性嵌入:一个吸引了大量关注该问题的方法。
  • 拉普拉斯特征映射
  • t-SNE:一个非常出色的方法。
  • 随机投影:一个简单但相关的方法。
  • 以及更多其他方法。

接下来,让我们深入了解其中一些方法,看看它们如何展开那些局部平坦但整体复杂的数据集。


总结 🎯

本节课我们一起学习了流形学习。我们从理解数据内在低维性的动机开始,介绍了流形的概念——即在小尺度下局部平坦的数据结构。我们通过实例看到了流形学习如何将高维数据映射到低维空间以进行可视化和探索,并列举了PCA、多维缩放、局部线性嵌入、t-SNE等一系列实现这一目标的算法。流形学习是探索性数据分析的强大工具,能帮助我们在应用复杂模型前,先直观地理解数据的底层结构。

053:项目报告 - 药物作用机制预测

概述

在本节课中,我们将学习“数据黑豹”团队在Kaggle药物作用机制预测竞赛中的完整项目流程。我们将从问题理解、数据探索、特征工程、模型构建与优化,到最终的教训总结,系统地回顾一个真实的多标签分类机器学习项目。

章节 1:项目介绍与问题定义

我们团队(数据黑豹)的成员包括 Abdul, Luwek, Shiam, Pra, Omar 和 Mesha。

我们将按照教授的要求,涵盖项目汇报的各个要点。

我们选择的项目是“药物作用机制”预测。在深入项目细节之前,我将简要介绍我们试图解决的问题。

过去,医药公司或医生开发药物时,通常采用试错法,这种方法缺乏针对性。如今,借助机器学习和计算机视觉等技术,我们应当改进药物发现方法,不再依赖试错法。

本次挑战的目标是根据疾病特征,预测药物的作用机制。

药物作用机制是医学领域的一个术语。每种疾病都有其对应的作用机制。例如,发烧可能与某种蛋白质有关。如果我们使用有针对性的机器学习算法来开发药物,我们可能会尝试减少体内这种蛋白质的含量,从而治疗发烧。这正是本项目试图实现的目标。

药物作用机制是一个全球通用的术语,它描述了药物如何与身体器官反应,决定了药物的效力(例如250毫克或500毫克)。

章节 2:数据概览与评估指标

Kaggle为本次竞赛提供的数据集包含24,000个训练样本和876个特征。其中有3个分类特征。测试数据集包含4,000个样本。标签数据集包含206个二元标签。

模型评估基于对数损失函数。我们将努力降低对数损失值,以获得更好的预测效果。这是我们用于评估所开发模型的核心指标。

章节 3:探索性数据分析

接下来,我将介绍我们进行的一些探索性数据分析。

数据中的三个分类特征是:CP类型、CP时间和CP剂量,分别代表样本处理方式、处理持续时间和剂量。下图显示了训练集和测试集中这些分类数据的数量分布。

可以看到,训练集和测试集在这些分类特征上的分布相当均匀。基于此,我们假设模型能够较好地泛化到测试集。

正如之前提到的,有多种方法可以确定药物的作用机制。数据集中包含772个基因表达特征和100个细胞活力特征。下图展示了一些随机选取的各类特征的分布情况。

基本上,它表明测试集和训练集在分布和密度上非常相似。

观察之后,我们还计算了不同特征之间的相关性矩阵。我们将其分解为仅包含基因表达特征的相关性矩阵、仅包含细胞活力特征的相关性矩阵以及两者结合的相关性矩阵。

从基因表达特征的相关性矩阵来看,在772个特征的平方组合中,只有约27,000对特征呈现高度正相关或高度负相关(相关系数绝对值大于0.5)。最高的正相关系数为0.9,最高的负相关系数为-0.82。

对于细胞活力特征,这些特征之间的相关性非常高。在10,000对相关性中,有9,228对特征的相关系数达到0.5或更高。最高相关系数为0.9,最低为0.6。

这是所有特征的相关性矩阵,总共约有760,000对相关性。其中,81,648对具有高度正相关或高度负相关的值。

接下来看训练数据集的标签。这是一个多标签分类问题,每个标签都是二元值(0或1)。在206个标签中,样本可能被识别为具有某种药物作用机制。标签组合可能全是0,也可能包含一个1、两个1等等。

具体来说,有9,367个样本的所有标签都是0。有12,500个样本在整个预测向量中只有一个1,依此类推。

左下角是最高频目标的频率图。右下角是每个标签中真实目标为1的数量。可以看出,标签之间存在很大的不平衡性,最大的约有732个正样本,最小的只有1个。

章节 4:特征工程与降维

为了减少特征数量,我们采用了主成分分析和方差膨胀因子。

方差膨胀因子用于衡量多个特征之间的多重共线性。其计算公式为 VIF = 1 / (1 - R²),其中R²来自相关性矩阵。通常,VIF得分为1表示无相关性,1到5之间表示中度相关,大于5表示高度相关。

我们参考了一些其他笔记,人们使用此方法时的阈值各不相同,有人用15,我们根据计算出的所有VIF分数分布,决定使用10作为阈值。选择阈值15时,我们只删除了30个特征;而选择阈值10时,我们删除了90个特征。

对于主成分分析,为了标准化数据集,我们最初使用了MinMaxScaler,但它没有减去均值。在查看其他笔记和讨论帖后,我们发现使用具有特定参数的QuantileTransformer能得到最佳结果。因此,我们也采用了QuantileTransformer。它可以将特征转换为服从均匀分布或正态分布。

左侧是列均值的原始分布,中间是使用MinMaxScaler后的分布,右侧是使用QuantileTransformer后的分布。

为了确定使用多少个主成分,我们首先计算了需要多少个成分来解释一定范围的累积方差,从85%到99%。最终,我们决定选择能够解释95%方差的成分数量,这最终给出了607个主成分。

因此,我们总共从数据中删除了177个特征。底部是碎石图,由于特征数量众多,图显得较小。解释方差最大的主成分约占总方差的12%。

章节 5:基线模型构建

在基线模型方面,我们尝试了K近邻、决策树和随机森林。我们还将尝试更多基线模型,但这需要更多解释。我们使用的核心基线模型是K近邻、决策树和随机森林。我们将数据保持为多标签格式,并进行了超参数搜索。

我们还在经过预处理(包含PCA等)的数据和原始数据上测试了这些基线模型。我们发现它们并没有给出最好的结果。

以下是这些实验的结果摘要。我们将数据按80/20的比例分割。我们的测试集有近一百万个预测点,其中真实目标为1的数量只有约3,428个。

以K近邻模型(在预处理数据上,未进行超参数搜索)为例,它预测了781个1。我们使用Kaggle指标(线下计算,未提交)得到的值为0.1。为了增加直观理解,我们还使用了Scikit-learn的对数损失函数,计算了准确率。

这里关于准确率需要注意的重要一点是:由于大多数样本的标签全为0,如果我们只预测全0,准确率可以达到38.57%。这意味着大约有38%到39%的样本标签全为0。因此,我们只能准确预测大约8%或9%的包含非零标签的样本。

我们还计算了汉明损失和零一损失。具体来说,有2554个单独的比特位被错误分类。对于其中一些模型,我们进行了交叉验证(由于计算时间和复杂性,没有使用嵌套交叉验证)。

我们还尝试了另一种方法,这是一个错误,也是一个学习曲线。开始时,我们没有充分理解评估指标,我们的理解是试图获得最好的准确率,即让预测标签与真实标签尽可能一致。

为此,我们使用了一种称为“标签幂集”的方法。它将多标签分类问题转化为多类别分类问题。这样做的问题是,我们不再预测某个标签为1或0的概率,而是直接预测一个具体的标签组合。当我们将结果提交到Kaggle,而他们使用平均列对数损失函数进行评估时,我们对预测结果过于自信,这导致了非常大的损失。

直到项目中期我们才意识到这个问题,但那时我们已经测试了K近邻、决策树、朴素贝叶斯、随机森林、多种神经网络,甚至在神经网络中尝试了随机欠采样、过采样以及SMOTE等平衡方法。我们尝试了不同的神经网络结构和超参数。

这里学到的教训是:确保你理解评分方法。不过,我们注意到关于标签幂集的一点是:如果评估模型的标准是基于准确率,即预测的标签数组是否与真实标签数组相同,那么标签幂集的表现要好得多。

章节 6:神经网络模型优化

当我们开始实验神经网络时,我们参考了竞赛中其他人和团队实现的一些不同方案。

基于这些,我们开始构建自己的网络。在这个阶段,我们进行了超参数搜索,但由于耗时过长,只进行了15次拟合。超参数搜索并没有带来很好的结果,下面列出了一些尝试过的参数。

后来,我们建立了多个笔记本来进行测试,团队成员之间保持了良好的沟通。根据得分,我们不断改进模型。我们通过尝试不同的参数值来开始实验。

尽管我们有很多不同版本的笔记本,但这里列出了我们向Kaggle正式提交的几个版本。最初,我们对预测结果进行了四舍五入,导致Kaggle得分有些偏差,与顶级团队的差距约为0.08。经过三四次提交后,我们意识到问题并尝试不进行四舍五入,这将差距缩小到了约0.02左右。

后来,我们一度只依赖准确率作为指标。再后来,我们使用了Scikit-learn的对数损失函数来比较我们的表现。在初始阶段,这很有效,我们尝试降低损失,并且这与Kaggle得分相关,我们不断提高了得分和排名。

但经过大量实验后,在某些时候,即使降低对数损失也没有帮助我们。高亮显示的那一行是我们的最佳提交。我们的Kaggle得分为0.0174,与顶级模型的差距约为0.0015。差距非常小,但在给定的时间框架内,我们尽力做到了最好。

章节 7:集成学习与最终模型

由于神经网络已经给出了不错的结果,我们决定继续探索。但正如我们在中期汇报中提到的,我们也会尝试使用XGBoost等模型。

因此,我们尝试了另一种提升技术——LightGBM,这是一个基于决策树的梯度提升框架,可以提高模型效率并减少内存使用。

在这个模型中,我们还使用了分层K折交叉验证。这是一种将数据打乱并分成N部分的技术。这个想法来自另一个处理多标签数据集的Kaggle竞赛。

基于我们的实验经验,我们得到的结果是:在私有排行榜上最佳得分为0.017990,在公开排行榜上为0.02063。

我们还进行了其他一些Kaggle提交。正如Abdul提到的基线模型,我们对标签幂集和标签幂集神经网络做了一些实验,但我们发现我们的神经网络表现相当好,最佳性能模型是神经网络。

以下是我们的一些Kaggle提交记录。

最终,我们在Kaggle上的排名是2862名。正如之前提到的,我们与Kaggle竞赛中的顶级表现模型仅差0.0015分。

章节 8:项目总结与经验教训

这是我们的工作流程。

这些是我们的Git提交记录。

我们的论文草稿尚未展示,我们认为截止日期是6号,但我们也在撰写草稿,并将很快提交。

我们的演示到此结束,我们总结以下几点:

正如教授在一节课中告诉我们的那样,机器学习没有固定的方法,我们必须不断探索不同的模型,并根据不同的指标检查性能。我们在这里探索了许多模型,发现我们应该很好地组织工作。

我们学到的另一个教训是:如果我们有机会重做,我们会首先花大量时间分析确切的目标是什么,然后制定工作计划,这样我们就可以节省花在探索上的时间。

以上就是我们的全部内容,如果大家有任何问题,我们很乐意回答。

总结
在本节课中,我们一起学习了“数据黑豹”团队完成Kaggle药物作用机制预测项目的全过程。我们从明确问题定义和评估指标开始,深入进行了数据探索与特征工程,尝试了包括KNN、决策树、随机森林、标签幂集、神经网络和LightGBM在内的多种基线模型与高级模型。关键教训包括:深刻理解评估指标的重要性、特征相关性处理、以及灵活调整技术路线。最终,通过一个精心调优的神经网络模型,团队取得了接近顶级排名的成绩。这个案例生动展示了在实际机器学习项目中,结合系统分析、持续实验和从错误中学习的重要性。

054:预测肺纤维化进展 🫁

概述

在本节课中,我们将学习一个利用机器学习预测特发性肺纤维化(IPF)患者肺功能下降严重程度的项目。我们将从项目动机、数据处理、基线模型构建,到更复杂的特征提取和卷积神经网络(CNN)方法,系统地了解整个流程。


项目动机与目标 🎯

特发性肺纤维化是一种病因不明的疾病,由肺部瘢痕形成引起。其诊断结果涵盖从稳定到快速恶化的范围,医生难以准确判断患者所处的阶段,也无法预测肺功能随时间的变化趋势。

现有方法大多难以有效解决这一挑战,尤其是在缺乏胸部CT扫描数据的情况下。因此,本项目的目标是:基于患者的肺部CT扫描,预测其肺功能(用力肺活量,FVC)下降的严重程度。我们使用机器学习技术进行预测,成功的预测将帮助患者了解其肺功能的未来变化。


数据来源与描述 📊

我们使用的数据集来源于开放源影像联盟(OSIC)数据库。OSIC是一个致力于对抗IPF及相关疾病的非营利性合作组织。

我们的数据集包含两种类型的数据:

  1. 影像数据:每位患者的DICOM格式CT扫描切片。
  2. 表格数据:记录每位患者每次就诊时的临床详细信息,如年龄、性别、吸烟状况、就诊周数及对应的FVC测量值等。

以下是数据集的统计摘要:

  • 患者数量:176名独特患者。
  • 记录总数:约1500条就诊记录(每位患者有6到10次就诊)。
  • CT扫描:每位患者有12到1018个不等的CT扫描切片,分辨率在512x512到1302x1302之间。
  • 关键预测目标:用力肺活量(FVC)。

表格数据中的“周数”列表示测量时间点,负值表示基线测量前的周数,正值表示基线测量后的周数。


数据预处理 ⚙️

为了成功进行实验,我们需要对原始数据进行预处理。

上一节我们介绍了数据来源,本节中我们来看看如何为模型准备数据。

表格数据处理

我们处理了表格数据中的异常值,并进行了数据标准化,以确保模型训练的稳定性。

CT扫描预处理

对于CT扫描图像,我们进行了以下步骤:

  1. 格式转换:将DICOM文件转换为Hounsfield单位(HU)测量值,以标准化像素强度。
  2. 图像分割:创建掩膜以聚焦肺部区域,消除其他不相关组织(如骨骼)的干扰。
  3. 尺寸统一:将所有图像缩放至统一分辨率(例如512x512),以创建一致的数据集。
  4. 采样统一:由于每位患者的切片数量不同,我们通过子采样或插值使每位患者的输入数据量匹配。

基线模型与评估指标 📈

在探索复杂模型之前,我们首先建立了一些基线模型作为性能比较的基准。

由于我们的任务是回归问题(预测连续的FVC值),我们无法使用分类任务中常见的ROC曲线、AUC等指标。我们采用了以下回归评估指标:

  1. R²分数:表示模型可解释的响应变量方差百分比。公式为:
    R² = 1 - (SS_res / SS_tot)
    其中 SS_res 是残差平方和,SS_tot 是总平方和。
  2. 平均绝对误差(MAE):预测值与真实值之间绝对差异的平均值。公式为:
    MAE = (1/n) * Σ|y_i - ŷ_i|
  3. 均方误差(MSE):预测值与真实值之间差异平方的平均值。公式为:
    MSE = (1/n) * Σ(y_i - ŷ_i)²

我们尝试了两种基线模型:

  • 支持向量回归(SVR):使用RBF核,参数C=1,degree=3。
  • 随机森林回归(Random Forest Regressor)

初步结果表明,SVR模型在给定数据集上具有更好的验证性能,因此我们将其作为后续比较的基线。


特征提取方法 🧠

我们面临的一个挑战是:不同患者的CT扫描数量不同。直接使用所有图像进行训练非常困难。

上一节我们介绍了基线模型,本节中我们探讨一种解决方案:从CT扫描中提取有意义的特征,然后用这些特征训练模型。这种方法比直接处理图像更高效。

以下是我们的特征提取流程:

  1. 图像统一:将所有CT扫描图像调整至512x512分辨率。
  2. 肺部掩膜:应用掩膜算法聚焦肺部区域。此步骤中有6名患者的掩膜生成失败,为确保数据一致性,我们在所有后续分析中移除了这些患者的记录。
  3. 特征计算:我们计算了以下两类特征:
    • 肺部体积:每位患者的总体积。
    • HU统计特征:如均值、标准差、偏度、峰度等。
    • 最大切片特征:我们假设最大的CT切片可能包含更多信息,因此也从中提取了上述特征。
  4. 模型训练:最终,我们得到了27个特征。我们使用这些特征重新训练了多种模型(包括随机森林、K近邻等),并与仅使用表格数据的模型性能进行对比。

结果:特征提取后,所有模型的性能均有显著提升,尤其是随机森林和KNN模型。这证明从CT图像中提取的特征对于预测FVC是有效的。

潜在改进方向

  • 使用更精确的肺部掩膜算法。
  • 在特征提取后进行特征选择,筛选出最重要的特征。
  • 尝试更复杂的模型。

基于卷积神经网络(CNN)的方法 🤖

除了特征提取,我们还尝试了更直接的深度学习方法,即使用卷积神经网络处理CT扫描图像本身。

我们构建了一个基于LeNet-5架构的2D CNN模型。模型结构包含卷积层、池化层和全连接层。

  • 输入:每位患者经过掩膜和重采样后的CT切片堆叠(约364张346x346的图像)。
  • 目标:预测一个包含138个FVC值的1D张量,对应模型需要估计的不同时间点的肺功能值。
  • 优化器与损失:使用Adam优化器(学习率0.001),以均方误差(MSE)作为损失函数。

面临的挑战

  1. 内存限制:数据集庞大(176名患者,每人数百张图像),在本地机器上训练面临内存压力。
  2. 目标向量稀疏:目标张量中大部分值为零(因为并非每个时间点都有测量),这可能导致模型训练不稳定,损失值居高不下。
  3. 时间建模:将不同时间点的预测压缩到一个固定长度的向量中,是一项复杂的任务。

目前,CNN模型的性能(MAE ≈ 183)尚未超越最佳的基线模型(随机森林)。未来可探索3D CNN(将CT切片视为3D体积数据)或结合图像特征与表格数据的混合模型,以期获得更好的性能。


项目协作与管理 👥

成功的项目离不开良好的团队协作。我们采用了以下工具和方法:

  • 版本控制:使用Git和GitHub进行代码管理和协作。
  • 项目管理:使用Asana和看板(Kanban)来跟踪任务进度、分配工作并管理项目时间线。
  • 沟通:使用Slack进行日常交流和快速决策。

这些实践确保了工作的有序进行和进度的透明化。


总结与未来展望 🔮

本节课中,我们一起学习了如何利用机器学习预测肺纤维化进展。

核心总结

  1. 特征提取有效:从CT图像中提取体积和纹理特征,能显著提升传统机器学习模型(如随机森林)的预测性能。
  2. 数据挑战:处理医学影像数据时,需应对分辨率不一、切片数量不同、内存消耗大等挑战。
  3. 模型对比:在本项目中,基于特征提取的随机森林模型表现优于我们目前实现的2D CNN模型。
  4. 严谨评估至关重要:需要注意数据拆分方式(如按患者而非按记录拆分),以避免过拟合和评估偏差。

未来工作方向

  • 探索3D CNN架构以更好地利用CT扫描的空间信息。
  • 构建多模态模型,将提取的影像特征与原始表格数据深度融合。
  • 优化数据预处理流程,特别是肺部分割的准确性。
  • 尝试更先进的序列或时间序列模型来直接建模肺功能随时间的变化。

通过这个项目,我们展示了机器学习在解决复杂医学预测问题上的潜力与挑战。

055:地震后建筑损伤预测项目演示

在本教程中,我们将学习一个高级机器学习项目的完整流程。该项目旨在预测地震后建筑物的损伤等级。我们将从项目动机开始,逐步介绍数据理解、特征处理、模型选择与实验,并最终总结关键发现。


项目动机 🏢

地震对建筑物造成的破坏程度评估至关重要。通过机器学习模型预测建筑的损伤可能性,可以为政府决策提供量化依据,例如评估建筑安全、指导灾后重建或拆除高危建筑。对于保险公司,准确的预测有助于制定更合理的保险费率。这项工作既能挽救生命,也具有经济价值。

数据描述 📊

我们使用的数据集包含约26万个数据点,每个数据点代表一栋建筑的信息,共有78个特征。数据集总大小约为32MB,属于相对较小的数据集。目标标签是损伤等级,分为1(低损伤)、2(中等损伤)和3(高损伤)三类。

特征主要分为三类:

  1. 数值特征:例如建筑年龄、高度、地理等级等。
  2. 分类特征:例如地基类型、地表条件等。
  3. 二元特征:取值为0或1的特征,例如是否具有某种结构。

数据存在高度不平衡的问题。中等损伤类别的样本约占57%,而低损伤和高损伤类别分别约占9%和34%。这意味着如果简单地将所有样本预测为中等损伤,准确率也能达到约57%,这给建模带来了挑战。

方法论与实验 🔬

上一节我们了解了数据的基本情况,本节中我们来看看具体的处理方法和模型实验。

我们首先尝试了多种机器学习模型,然后进行了特征选择,最后对选定的模型进行超参数调优。项目评估指标采用F1分数(F1 Score),而非简单的准确率,以更好地处理类别不平衡问题。

以下是我们在项目中尝试的主要模型及其简要分析:

  • K近邻(KNN):我们尝试了欧几里得距离、曼哈顿距离等不同距离度量。但由于特征重要性不同,且分类特征和二元特征的距离计算方式(通常为0或1)与数值特征的尺度差异巨大,导致模型性能不佳,未能显著超越基线模型。
  • 逻辑回归与神经网络:逻辑回归模型在本任务上完全失败。我们也尝试了一维卷积神经网络(1D CNN)和全连接神经网络。1D CNN的卷积核假设特征在空间顺序上存在相关性,但我们的特征之间几乎是独立的,因此该假设不成立。全连接神经网络则因为数据量较小、特征经过筛选后维度不高,难以训练收敛,结果甚至未达到70%的F1分数。
  • 随机森林(Random Forest):这是我们最终采用并取得最佳效果的模型。我们进行了大量的超参数调优,最终设定的关键参数包括:树的数量(n_estimators)为160,树的最大深度(max_depth)为20,每次分裂考虑的最大特征数(max_features)为16。

特征选择

在应用模型之前,特征选择是关键步骤。我们通过可视化和统计测试来筛选特征。

以下是我们的特征选择策略:

  1. 分类特征:我们使用卡方检验来评估每个分类特征与目标标签之间的统计显著性。根据检验结果,我们剔除了显著性最低的几个特征。
  2. 二元特征:我们采用了一个简单的过滤规则:如果一个特征中某一类(通常是0)的占比超过95%或低于5%,则认为该特征区分度太低,予以剔除。例如,某个特征超过98%的样本值为0,它对预测的贡献微乎其微,反而可能引入噪声。
  3. 基于模型的重要性:在训练随机森林后,我们查看了特征重要性排序。地理等级、面积百分比、建筑年龄等数值特征被模型认为是最重要的。

经过特征选择和超参数调优,我们的随机森林模型在交叉验证中取得了约73%的F1分数。

结果与总结 🎯

最终,我们的随机森林模型在测试集上取得了73%的F1分数。作为对比,Kaggle竞赛排行榜上目前的最佳成绩约为75.6%,而许多公开的研究(包括一些误用LSTM等时序模型的方法)成绩仅在60%左右。

通过本项目,我们总结了以下关键经验:

  1. 特征理解与选择至关重要:对于特征稀疏、不平衡且具有明确物理意义的数据集,深入理解特征含义并进行有效的筛选,比盲目使用复杂模型更重要。
  2. 模型选择需贴合数据特性:最先进的模型(如CNN、LSTM)并非万能。它们的设计基于特定假设(如空间局部性、时间依赖性),如果数据不满足这些假设,其性能可能还不如简单的传统模型(如随机森林)。
  3. 处理不平衡数据需用对指标:使用F1分数等更能反映模型在各类别上综合性能的指标,比单纯使用准确率更合理。
  4. 随机森林简介:随机森林是一种集成学习算法。它通过构建多棵决策树(例如我们用了160棵)并进行“投票”来做出最终预测。每棵树在训练时使用了数据的随机子集和特征的随机子集,这种随机性有助于降低过拟合风险,提高模型的泛化能力。

本节课中我们一起学习了如何为一个具体的预测问题(地震建筑损伤评估)构建机器学习解决方案。我们经历了从数据探索、特征工程、模型实验到结果分析的完整流程,并深刻认识到,在机器学习实践中,对数据和问题本质的深刻理解往往比模型本身的复杂度更为关键。

056:学习嗅觉 🧪👃

在本教程中,我们将学习如何构建一个机器学习模型,将化学分子结构与其对应的气味描述进行匹配。这是一个多标签分类问题,我们将探索多种方法,包括基于指纹的模型、随机森林和图神经网络。


数据准备与挑战

我们的数据集包含化学分子的SMILES字符串表示及其对应的气味描述。SMILES代表“简化分子线性输入系统”,它是一种用ASCII字符串描述化学结构的线性表示法。

以下是数据示例:

SMILES 字符串 气味描述
CCO 果味,花香
CC(=O)O 酸味,刺鼻

挑战:这是一个多标签分类问题。每个分子可能对应多个气味描述,这些描述以逗号分隔。训练数据包含约4360个分子和19种独特气味。

提交格式:模型需要为每个分子预测前5个最可能的气味,预测结果以分号分隔,每个气味描述内的词语以逗号分隔。


评估指标:谷本相似度指数

由于这是一个化学信息学预测问题,我们使用谷本相似度指数来评估模型性能。该指数用于比较由分子指纹表示的两个化学结构的相似性。

公式如下:
T(A, B) = |A ∩ B| / |A ∪ B|

其中:

  • AB 是两个分子的指纹集合。
  • |A ∩ B| 是交集的大小。
  • |A ∪ B| 是并集的大小。

对于每个分子,我们计算其预测的Top 5气味句子与真实气味句子之间的谷本相似度,并取最高分作为该分子的得分。最终的总分是测试集中所有分子得分的平均值。


数据探索

在开始建模前,我们先了解数据分布。

以下是数据集中最常见和最不常见的气味标签:

最常见的5种气味(出现约500次):

  • 果味
  • 花香
  • 木质香
  • 草药香
  • 青草香

最不常见的几种气味(出现少于10次):

  • 过度成熟味
  • 氨味
  • 酚味
  • 蓝莓味

数据存在明显的类别不平衡。我们还分析了气味之间的关联性,例如,“果味”与多种其他气味共同出现,而“氨味”与“酚味”有50%的概率同时出现。


方法一:基于Piper的多模型基线

上一节我们了解了数据和评估方式,本节我们来看看第一种建模方法。我们使用了Piper库,它集成了多种经典机器学习算法。

特征提取:我们使用Mordred描述符计算了超过1000种化学分子特征。这些特征直接从SMILES字符串转换的分子结构中计算得出,包括分子量、极性等物理化学属性。

标签处理:我们将气味标签进行独热编码。对于每个分子,我们将其与每个气味标签组合,创建多个“分子-单个气味”样本,以适配多分类模型。

模型与结果:我们在Piper中尝试了K近邻、朴素贝叶斯、逻辑回归、SVM和随机森林。其中,随机森林表现最佳。我们的基线模型在排行榜上取得了0.134的分数(当时最高分为0.473)。


方法二:优化的随机森林模型

基于基线实验,我们选择性能最好的随机森林进行深入优化。

流程

  1. 使用Mordred提取的1000多个特征。
  2. 对多标签进行特殊编码:为每个分子生成一个固定长度的向量,其中包含其所有气味的索引,不足部分用-1填充。
  3. 使用网格搜索寻找随机森林的最佳超参数。
  4. 训练完成后,模型会输出每个气味标签的概率。我们选择概率最高的前3个气味作为预测结果。

性能:通过五折交叉验证,该模型的平均谷本相似度得分约为 0.21 ± 0.01


方法三:图卷积神经网络

前两种方法基于手工特征,本节我们尝试一种能自动学习分子表示的深度学习方法——图卷积神经网络。图是表示分子的天然数据结构,原子是节点,化学键是边。

模型架构

  1. 原子特征(如原子类型、电荷)通过图注意力卷积层进行消息传递和学习。
  2. 分子级特征(如整体描述符)直接输入一个前馈神经网络。
  3. 将两部分学习到的表示向量连接起来。
  4. 最后通过一个前馈网络输出层,预测所有气味标签的概率。

损失函数:我们使用了适用于多标签分类的带Sigmoid的二元交叉熵损失,其代码实现核心如下:

# 数值稳定的Sigmoid交叉熵损失计算
def stable_sigmoid_cross_entropy(logits, labels):
    max_logits = tf.maximum(logits, 0)
    loss = logits - logits * labels + max_logits + tf.math.log(tf.exp(-max_logits) + tf.exp(-logits - max_logits))
    return tf.reduce_mean(loss)

训练挑战

  • 训练不稳定:模型容易陷入局部最优,对参数初始化敏感。
  • 计算成本高:训练速度慢,限制了超参数搜索和模型结构实验。
  • 特征有限:当前仅使用了5个分子特征和7个原子特征,而文献中成功的模型使用了上百个特征。

结果:我们最好的GNN模型得分约为0.13,低于随机森林。这表明在当前数据规模和计算资源下,简单模型配合精心设计的特征更具竞争力。


结果分析与总结

最终排行榜分析:有趣的是,排行榜上除社区贡献的基准代码外,第一名及并列第三名的队伍得分完全相同。这些高分模型大多是基于K近邻随机森林,并辅以更复杂的特征工程。我们的最佳结果也与此一致。

核心结论

  1. 特征工程至关重要:在当前任务中,Mordred等工具提取的化学描述符特征比我们实现的GNN自动学习到的特征更有效。
  2. 图神经网络训练难度大:GNN对初始化、超参数敏感,容易陷入局部最优,需要更成熟的框架(如PyTorch Geometric)、更强大的算力和更精细的训练策略。
  3. 经典模型表现稳健:随机森林和K近邻在这个小规模、多标签的数据集上表现出了良好的鲁棒性和竞争力。
  4. 改进方向:未来工作可以集中在更深入的特征工程、更广泛的超参数搜索,以及使用更成熟、更强大的GNN架构与训练技巧上。

本节课中,我们一起学习了如何将化学分子匹配到气味描述这一有趣而富有挑战性的任务。我们实践了从数据准备、特征工程到多种模型(传统机器学习与图神经网络)的构建与评估的全流程,并分析了不同方法的优缺点。希望本教程能帮助你理解处理此类多标签、跨模态匹配问题的基本思路。

057:偏差-方差权衡 📊

在本节课中,我们将要学习机器学习中的一个核心概念:偏差-方差权衡。我们将探讨它如何影响模型性能,以及如何通过理解它来避免过拟合和欠拟合。我们将从数学定义开始,通过图示直观理解,并讨论其在模型选择和复杂度控制中的应用。

偏差与方差的定义 📖

上一节我们介绍了偏差-方差权衡是模型选择中的一个关键概念。本节中,我们来看看其数学定义。

在核密度估计等任务中,我们的目标是最小化估计密度与真实密度之间的误差。为此,我们通常使用均方误差作为衡量标准。

均方误差定义为估计值与真实值之差的平方的期望。其公式如下:
MSE = E[(θ_hat - θ)^2]

我们可以对这个公式进行分解。通过展开平方项并利用期望的线性性质,我们可以在表达式中加上再减去估计值的期望的平方。经过整理后,均方误差可以分解为两个部分:

MSE(θ_hat) = [Bias(θ_hat)]^2 + Var(θ_hat)

其中:

  • 偏差 定义为估计值的期望与真实参数值之间的差异:Bias(θ_hat) = E[θ_hat] - θ
  • 方差 定义为估计值与其期望值之差的平方的期望:Var(θ_hat) = E[(θ_hat - E[θ_hat])^2]

这个分解清晰地表明,模型的总体误差来源于两个部分:偏差(系统性的预测错误)和方差(由于数据随机性导致的预测波动)。

偏差与方差的直观理解 🎯

理解了数学定义后,我们可以通过一个经典的比喻来直观感受偏差和方差。

想象一个射击靶子,我们的目标是击中靶心(真实值)。每次射击代表一次基于不同数据集的模型预测。

以下是四种典型情况:

  • 低偏差,低方差:射击点紧密地聚集在靶心周围。模型既准确又稳定。
  • 低偏差,高方差:射击点中心在靶心附近,但非常分散。模型平均来看是准确的,但预测结果很不稳定。
  • 高偏差,低方差:射击点紧密地聚集在一起,但偏离了靶心。模型稳定但系统地预测错误。
  • 高偏差,高方差:射击点既分散又偏离靶心。模型既不准确也不稳定。

核心要点:低方差意味着模型确定性高,但这并不等同于正确性(可能偏差很高)。我们的目标是同时降低偏差和方差,但这通常是一个需要权衡的过程。

模型复杂度与数据划分 🔧

在现实世界中,我们通常只有有限的数据。为了评估模型并选择最佳的那个,我们需要将数据划分为不同的部分。

如果我们只有一个模型,可以简单地将数据分为训练集测试集。我们在训练集上训练模型,在测试集上评估其性能。

然而,模型通常有超参数需要调整(例如,K近邻中的K值,或核函数的宽度)。我们不能用测试集来选择超参数,因为这会“窥探”测试集信息,导致对泛化性能的乐观估计(称为“双重 dipping”)。

为了解决这个问题,通常采用三部分划分

  1. 训练集:用于训练模型参数。
  2. 验证集:用于调整模型超参数,选择最佳模型。
  3. 测试集:作为最终评估的“保留集”,仅在模型完全确定后使用一次,以估计真实的泛化误差。

这种划分确保了评估的公正性。

泛化误差与过拟合/欠拟合 📈

现在,我们来看看模型复杂度如何通过偏差和方差影响泛化误差。

模型复杂度可以理解为模型参数的数量或容量(例如,多项式的阶数、神经网络的层数)。

以下是模型复杂度与误差的关系:

  • 训练误差:随着模型复杂度增加,模型能更好地拟合训练数据,因此训练误差持续下降。
  • 泛化误差:呈现一个U形曲线。
    • 低复杂度区:模型过于简单,无法捕捉数据中的基本模式,导致高偏差、低方差。此时模型欠拟合
    • 中等复杂度区:偏差和方差达到一个较好的平衡,泛化误差最小。这是理想区域。
    • 高复杂度区:模型过于复杂,开始完美拟合训练数据(包括噪声),导致低偏差、高方差。此时模型过拟合,在未见数据上表现变差。

为了避免过拟合,我们引入了归纳偏置正则化技术(如L1/L2正则化),目的是惩罚模型复杂度,防止其单纯记忆训练数据,从而提升泛化能力。

模型选择问题 🤔

当我们面对多个不同类型的模型时,如何选择泛化能力最好的那个?这就是模型选择问题

我们希望通过有限的数据(验证集)来估计模型在无限未来数据上的性能(真实泛化误差)。这里再次体现了偏差-方差权衡的重要性:

  • 一个低偏差、高方差的估计量(如复杂模型在验证集上的误差)虽然平均来看是无偏的,但具体到某一次验证集划分时,其估计值可能因方差过高而严重偏离真实值,导致我们做出错误的选择。
  • 一个有偏但低方差的估计量(如使用交叉验证得到的平均误差)虽然可能不是完全无偏的,但其估计结果更稳定可靠,通常能带来更好的模型选择效果。

因此,在模型选择中,我们不仅要关注估计的准确性(低偏差),也要关注其稳定性(低方差)。

现代视角:过参数化模型 🚀

传统的“金科玉律”是:选择参数较少的简约模型,避免过拟合。然而,现代深度学习研究发现了一个有趣的现象,被称为“双重下降”曲线。

在非常庞大的模型(如深度神经网络)中,当模型参数数量远超所需时(即过参数化区域),会出现与传统认知不同的情况:

  1. 随着复杂度增加,首先会经历经典的过拟合区域(测试误差上升)。
  2. 但如果继续增加模型容量,测试误差会再次下降,甚至可能低于传统最优复杂度模型所能达到的水平。

这表明,对于某些高度灵活的模型族,更大的模型容量有时反而能带来更好的泛化性能。这挑战了传统的偏差-方差权衡的简单解释,是当前研究的前沿领域。

总结 📝

本节课中我们一起学习了偏差-方差权衡这一核心概念。

  • 我们首先从数学上定义了偏差方差,并知道总误差(均方误差)是它们的和。
  • 我们通过图示理解了低/高偏差低/高方差的不同组合对模型预测的影响。
  • 我们讨论了为了可靠评估模型,需要将数据划分为训练集、验证集和测试集
  • 我们分析了模型复杂度如何影响偏差和方差,从而导致欠拟合过拟合
  • 我们探讨了在模型选择中,需要同时考虑估计量的偏差和方差。
  • 最后,我们了解了现代深度学习中的过参数化模型现象,它展示了偏差-方差权衡更复杂的一面。

理解偏差-方差权衡有助于我们诊断模型问题、选择合适模型复杂度,并最终构建泛化能力更强的机器学习系统。

058:没有免费午餐定理 🍽️

在本节课中,我们将要学习“没有免费午餐定理”。这个定理是机器学习理论中的一个核心概念,它深刻地阐述了为什么不存在一个适用于所有问题的“万能”学习算法。上一节我们讨论了偏差-方差权衡,它关注的是同一模型类别内不同复杂度的模型。本节中,我们来看看当面对完全不同的模型类别时,我们该如何选择。

概述:为什么需要这个定理?

机器学习课程有时会给人一种“算法清单”的感觉,仿佛我们只需要知道在哪种情况下应用哪种算法即可。这自然会引出一个问题:我们能否找到一个终极模型,一劳永逸地解决所有问题?这样就不需要数据科学家去反复选择和调整模型了。

然而,机器学习是一门实验科学。我们通常无法完全知晓数据背后的真实生成过程。例如,在构建医疗诊断模型时,如果我们确切知道某种疾病(如新冠肺炎)在所有情况下的CT影像特征,那么我们根本不需要训练模型,直接匹配规则即可。但现实是,我们不知道,因此必须通过实验来假设已见数据对未来未见数据的代表性。

没有免费午餐定理的核心思想

这个定理由大卫·沃尔伯特提出。为了理解它,让我们回顾计算学习理论中的概念:存在一个目标函数 F,它为每个样本 x 分配标签 y

F: x → y

如果这个目标函数 F 是完全任意的,或者说它是从所有可能的标签函数中均匀随机采样的,那么对于任意两个学习算法 AB,以下结论成立:

  • 存在许多目标函数,使得算法 A 的期望泛化误差低于算法 B
  • 同样,也存在许多目标函数,使得算法 B 的期望泛化误差低于算法 A

在优化或更高层面上,该定理可以表述为:对于任意两个算法,它们在一类问题上的性能优势,必然会在另一类问题上被抵消。

定理的启示与我们的选择

这个结论听起来有些令人沮丧,因为它意味着不存在一个在所有可能数据上都表现最好的通用算法。

但这正是机器学习作为实验科学的关键所在。没有免费午餐定理告诉我们,我们必须做出先验假设。我们必须假设未来会遇到什么样的数据(测试集),我们需要泛化到什么样的场景。

以下是该定理带来的核心启示:

  • 某些算法在特定类型的数据上会工作得更好。
  • 而其他算法则更适合其他类型的数据。
  • 因此,算法的选择取决于我们对问题领域和数据特性的先验知识。

总结

本节课中,我们一起学习了“没有免费午餐定理”。该定理表明,在没有任何关于问题领域的先验假设下,所有学习算法的平均性能是相同的。这解释了为什么机器学习需要实验和领域知识:我们必须根据对数据的理解来选择合适的模型和算法,因为没有单一的算法是免费的“午餐”——能在所有问题上都表现最佳。理解这一点,能帮助我们在实践中更明智地选择和设计解决方案。

059:使用准确率作为性能指标的问题 ⚠️

在本节课中,我们将探讨在机器学习中,尤其是在处理类别不平衡数据时,使用准确率作为性能评估指标所存在的问题。我们将通过一个具体的例子来理解其局限性,并讨论一种简单的解决方案及其潜在陷阱。

概述

评估分类器性能时,准确率是最常用的指标之一。准确率的定义是正确预测的数量除以预测总数。公式如下:

准确率 = 正确预测数 / 总预测数

然而,当数据集中不同类别的样本数量差异巨大时,仅依赖准确率可能会产生误导。

类别不平衡问题

上一节我们介绍了准确率的基本概念,本节中我们来看看它在特定场景下的问题。让我们设想一个二分类问题,类别为“1”和“0”。

假设我们有一个数据集,其中95%的样本属于类别“1”,只有5%的样本属于类别“0”。在这种情况下,一个非常“懒惰”的分类器可能会简单地将所有样本都预测为类别“1”

这个分类器的准确率会是多少呢?由于95%的样本确实是“1”,所以它的准确率将达到95%。这个数字看起来很高,但分类器实际上完全忽略了占少数的类别“0”。如果类别“0”代表某种关键事件(例如“患者患有疾病”),那么这种分类器将是完全无效且危险的。

一个简单的解决方案及其陷阱

认识到准确率在类别不平衡数据上的局限性后,一个直观的解决方案是手动平衡数据集。

以下是具体操作步骤:

  1. 确定原始数据集中少数类(例如“0”)的样本数量。
  2. 从多数类(例如“1”)中随机抽取相同数量的样本。
  3. 使用这个新构建的平衡数据集来训练和评估模型。

例如,如果原始数据有100万个样本(95万个“1”,5万个“0”),我们可以使用全部5万个“0”和随机抽取的5万个“1”,组成一个总共10万个样本的平衡数据集。

现在,我们在这个平衡数据集上比较两个分类器A和B的性能。假设它们的表现如下:

  • 分类器A:能100%正确分类“0”,但会将17%的“1”误分类为“0”。
  • 分类器B:能100%正确分类“1”,但会将20%的“0”误分类为“1”。

在平衡数据集上计算整体准确率:

  • 分类器A的准确率约为 (50,000 + 0.83*50,000) / 100,000 = 91.5%
  • 分类器B的准确率约为 (0.80*50,000 + 50,000) / 100,000 = 90.0%

根据准确率,我们会选择分类器A。

回到现实世界

然而,关键问题在于:我们最终要将模型部署到真实世界中,而真实世界的数据分布仍然是不平衡的(95%的“1”,5%的“0”)。

让我们计算两个分类器在原始不平衡数据分布下的真实表现:

  • 分类器A:对“0”的分类完全正确(5%的数据),但对“1”的分类只有83%正确(95%的数据)。其真实整体准确率5%*100% + 95%*83% ≈ 84%
  • 分类器B:对“1”的分类完全正确(95%的数据),但对“0”的分类只有80%正确(5%的数据)。其真实整体准确率95%*100% + 5%*80% = 99%

结果出现了反转!在平衡数据集上表现“更好”的分类器A,在真实场景下的准确率(84%)远低于分类器B(99%)。我们基于平衡数据做出的选择导致了次优的结果。

总结

本节课中我们一起学习了使用准确率作为评估指标的核心问题。当数据类别分布严重不平衡时,高准确率可能具有欺骗性,因为它可能仅仅反映了模型对多数类的预测能力,而完全忽略了对关键少数类的识别。简单地通过下采样来平衡数据集用于模型选择,也可能导致我们在真实的不平衡数据上选择到性能更差的模型。因此,在评估分类器,尤其是处理不平衡数据时,我们需要更细致的指标(如精确率、召回率、F1分数或ROC-AUC)来全面衡量模型性能。

高级机器学习:P60:混淆矩阵与性能评估 🎯

在本节课中,我们将学习一个评估分类模型性能的重要工具——混淆矩阵。我们将了解其结构,并学习如何从中提取关键性能指标,如准确率、召回率和精确率,以全面评估一个分类器的表现。


混淆矩阵的结构

在深入探讨如何划分数据或评估模型性能之前,我们需要一个非常方便的工具,即混淆矩阵。它以下列方式工作。

想象我们专注于一个二分类问题。我们有两种样本:正例和负例。混淆矩阵的顶部和左侧分别代表真实的标签和模型预测的标签。

  • 真正例:真实为正例的样本被预测为正例。
  • 假正例:真实为负例的样本被预测为正例。
  • 真负例:真实为负例的样本被预测为负例。
  • 假负例:真实为正例的样本被预测为负例。

这个结构被称为混淆矩阵。理想情况下,我们希望假正例和假负例的数量都为零。但由于理想情况很少出现,我们需要理解这些数字之间的权衡关系。


核心性能指标

为了更简洁地描述混淆矩阵,人们通常使用两组指标来衡量分类器的性能。

一组指标围绕敏感度特异度展开。另一组则围绕精确率召回率展开。

首先,敏感度和特异度更容易用混淆矩阵直观描述。

  • 敏感度:也称为召回率真正例率。计算公式为:
    敏感度 = 真正例 / (真正例 + 假负例)
    它衡量了模型找出所有正例样本的能力。
  • 特异度:也称为真负例率。计算公式为:
    特异度 = 真负例 / (真负例 + 假正例)
    它衡量了模型找出所有负例样本的能力。

另一方面,精确率略有不同。其计算公式为:
精确率 = 真正例 / (真正例 + 假正例)
它衡量了在所有被预测为正例的样本中,有多少是真正的正例。

请注意,召回率与敏感度是相同的概念,它们源自不同的应用领域。敏感度和特异度常用于评估分类器性能,而精确率和召回率则源于信息检索领域。


单一指标的局限性

正如你所见,我们只有少数几个指标,而一个分类器如果只优化其中一个指标,就可能“作弊”。

例如,如果一个模型只追求高召回率,它可以将所有样本都预测为正类。这样,它就能找出所有的正例,召回率会很高,但精确率会非常低。

如果一个模型只追求高特异度,它可以将所有样本都预测为负类。这样,真负例率会很高,但召回率会变为零。

同样,如果一个模型只追求高精确率,它可以设置极高的预测阈值,只对确信度极高的样本预测为正类。这样精确率会很高,但会漏掉很多正例,导致召回率很低。

因此,单独使用任何一个指标都不够全面。


综合评估指标

为了平衡这些指标,人们引入了综合性的评估指标。

平衡准确率是敏感度和特异度的算术平均值:
平衡准确率 = (敏感度 + 特异度) / 2

考虑一个极不平衡的数据集:有15个正例和10000个负例。一个分类器预测了10个真正例、5个假负例、5个假正例和10000个真负例。

  • 普通准确率高达约99.4%,但这具有误导性。
  • 敏感度约为33.3%,特异度约为99.5%。
  • 平衡准确率约为66.4%,这更能反映模型在两类上的平均表现。

如果一个分类器简单地将所有样本预测为负类,其平衡准确率将是 (0% + 100%) / 2 = 50%,这处于随机猜测的水平,表明该模型无效。

对于关注精确率和召回率的场景,常用的综合指标是 F1分数,它是精确率和召回率的调和平均数:
F1分数 = 2 * (精确率 * 召回率) / (精确率 + 召回率)

选择F1分数还是平衡准确率,取决于你所要解决的问题。信息检索任务更关注精确率和召回率,而分类器评估可能更关注敏感度和特异度。没有放之四海而皆准的“黄金指标”,必须根据具体问题谨慎选择。


多分类问题的混淆矩阵

混淆矩阵同样适用于多分类问题。以下是一个包含12个类别的真实案例混淆矩阵。

与二分类类似,行代表真实类别,列代表预测类别。通过观察矩阵,我们可以发现模型犯错的规律。

例如,图中标红的部分显示,模型持续地将某两个类别相互混淆,也将另外两个类别相互混淆。这个发现非常有价值。在该研究中,目标是寻找药物重用的机会(即用一种已批准治疗A疾病的药物治疗B疾病)。通过分析模型混淆了心血管类药物和神经系统类药物,研究人员可能发现某些药物具有治疗其他系统疾病的潜力,从而为药物重定位提供线索。


总结

本节课中,我们一起学习了混淆矩阵这一核心工具。我们了解了它的基本结构,学习了从中衍生出的关键性能指标:敏感度(召回率)、特异度、精确率,并认识了单一指标的局限性。最后,我们介绍了平衡准确率和F1分数这两种综合评估指标,并探讨了混淆矩阵在多分类问题中的应用价值。记住,选择合适的评估指标需要紧密结合实际问题的具体需求。

061:交叉验证与超参数优化 🎯

在本节课中,我们将学习如何评估机器学习模型的性能并选择最佳模型。核心内容包括交叉验证技术及其在模型选择和超参数优化中的应用。


概述

当我们拥有一些评估指标,如平衡准确率或F1分数时,面临的问题是:如何选择最佳模型?或者,如何为模型选择最佳的超参数?例如,模型的大小或某些未直接在训练数据上优化的系数设置,如神经网络中的层数或正则化参数。我们需要评估模型性能的变异性。交叉验证技术正是为了解决这些问题而设计的。

上一节我们讨论了模型评估指标,本节中我们来看看如何使用交叉验证来更稳健地评估和选择模型。


数据分割的局限性

回忆一下,我们最初将数据分割为训练集测试集。测试集被完全保留,除了最终检查外,不用于模型的任何操作。此外,还有一个验证集,它对于超参数优化和控制过拟合等非常有用。

然而,测试集上的最终性能数字只是一个单一数值。这个数值无法告诉我们结果的变异性。想象一下,即使从相同的数据中,我们也可以选择不同的测试集和训练集。如果我们随机选择另一部分数据作为测试集,性能可能会因偶然性而发生巨大变化。例如,在这个特定的测试集分割中,可能偶然包含了20%从未在训练数据中出现过的困难样本。

我们如何处理这种情况?如何知道这种情况是否发生?交叉验证技术就是为了帮助解决这些问题。


交叉验证的基本原理

我们的原始数据是完整的。交叉验证的做法是:首先,我们随机打乱数据。然后,将数据分割成所谓的“折”。我们将数据分割成K折。下图示例是5折交叉验证,但也可以是10折。经验法则是通常使用10折,但这实际上取决于数据量的大小。K可以是任意值。

K折交叉验证因此得名。在我们的具体案例中,是5折交叉验证。

将完整数据集分割后,我们的目标是:从两个模型中选择一个更好的模型。为了举例,假设模型一是逻辑回归,模型二是决策树。

以下是交叉验证的步骤:

  1. 我们有5折,相应地有5次分割(Split 1 到 Split 5)。
  2. 我们依次将其中一折作为保留折(即测试集),其余折作为训练集。
  3. 对于每一次分割,我们使用训练集训练两个模型(逻辑回归和决策树)。
  4. 然后,在保留折(测试集)上计算每个模型的性能指标(如平衡准确率或F1分数)。
  5. 对每一折重复此过程。

这样,每个模型都会得到K个性能分数。


模型选择与性能评估

完成上述过程后,我们可以查看结果。例如,在一个10折交叉验证的例子中,我们可能看到逻辑回归的平均性能为64,决策树的平均性能接近69,并且可以看到各自的性能变异性。

现在我们可以选择要使用的模型。但问题是:我们应该选择哪个模型?是选择在某一折上表现最好的那个模型吗?等等,那个模型并没有在完整数据集上训练过,它只在不包含某一折数据的子集上训练过。

因此,标准的模型选择流程如下:

  1. 进行K折交叉验证,比较不同模型的平均性能。
  2. 选择平均性能最佳的模型(例如决策树)。
  3. 使用完整的训练数据集重新训练这个获胜的模型。
  4. 最后,在独立的测试集上报告该最终模型的性能,以了解其在真实环境中的预期表现。

交叉验证是一个很好的技术,但并非完美无缺。它可能被“欺骗”,例如存在数据泄露或对交叉验证过程本身过拟合的风险。尽管如此,它远比仅在单一分割上进行训练和测试要好得多,因为后者无法提供关于模型稳定性的信息。


交叉验证用于超参数优化

交叉验证的另一个重要用途是超参数优化。例如,我们应该选择两层、一层还是三层的神经网络?每层应该使用10个还是100个隐藏单元?这些关于模型架构的选择都是超参数。

以下是超参数优化的核心方法:

网格搜索
这是一种传统方法。假设我们有两个超参数H1和H2。我们为每个超参数预先选择一组候选值(例如,H1有5个候选值,H2有5个候选值)。然后,我们需要为这两个超参数所有可能的组合(共5x5=25种)训练模型并进行评估。之所以称为“网格”搜索,是因为我们需要为超参数值网格中的每个交点运行模型。

在交叉验证框架下进行网格搜索的流程是:

  1. 对于每一次数据分割(例如5折中的每一折),在训练集上,使用网格中所有超参数组合训练模型。
  2. 在对应的验证折上评估这些模型的性能。
  3. 最终,对于每一种超参数组合,我们得到其K次验证的平均性能。
  4. 选择平均性能最高的那组超参数作为最佳设置。

嵌套交叉验证

当我们同时进行模型选择和超参数优化时,会出现一个问题:如果我们在用于模型比较的同一交叉验证循环内选择超参数,那么结果会过于乐观。

嵌套交叉验证是解决这个问题的推荐方法。其流程如下:

  1. 外层循环:进行K折交叉验证以比较不同模型(或同一模型的不同超参数配置)。
  2. 在内层循环中,对于外层每一折的训练集,再次进行交叉验证(例如L折),以优化该特定模型(如SVM)的超参数。
  3. 为外层每一折的训练集找到最佳超参数后,用这些超参数训练模型,并在外层该折的验证集上评估。
  4. 最终,根据外层K折的平均性能选择最佳模型或超参数配置。

嵌套交叉验证能提供更真实、更少乐观的性能估计。


超参数优化:网格搜索 vs. 随机搜索

网格搜索存在一个缺点:如果某个超参数对性能影响不大,而另一个影响巨大,那么均匀地对网格采样会浪费大量计算资源在不重要的维度上,并且可能错过重要维度上的最优值。

随机搜索是一种更高效的方法。它不从网格中均匀采样,而是在超参数空间中随机采样点。研究表明,随机采样有更高的几率找到性能最佳的超参数组合,尤其是在超参数重要性不均等的情况下。

此外,还有更高级的方法,如基于贝叶斯优化的超参数调优工具(例如 Hyperopt, Optuna),它们能更智能地探索超参数空间。


工具与计算考量

现在有许多工具可以简化交叉验证和超参数优化,例如Scikit-learn内置的交叉验证和网格搜索功能,以及专门的库如 HyperoptOptuna。这些工具通常只需几行代码即可实现复杂的优化流程。

需要注意的是,交叉验证,尤其是嵌套交叉验证和超参数搜索,计算量非常大。它需要对模型进行多次训练和评估。这种方法的普及得益于近年来相对充足的计算资源。


总结

本节课我们一起学习了交叉验证与超参数优化的核心内容:

  1. 交叉验证(尤其是K折交叉验证)是一种评估模型性能、选择模型并估计性能变异性的关键技术。
  2. 标准的模型选择流程包括:通过交叉验证比较模型,选择最佳模型后,在完整训练集上重新训练,最后在独立测试集上评估。
  3. 交叉验证是超参数优化的基础。网格搜索是系统遍历超参数组合的传统方法。
  4. 为了在模型选择中无偏地优化超参数,需要使用嵌套交叉验证
  5. 随机搜索通常比网格搜索更高效,特别是在超参数重要性不同的情况下。还有更高级的贝叶斯优化工具可供使用。
  6. 这些过程计算密集,但现代机器学习库提供了便捷的工具来实现它们。

掌握交叉验证和超参数优化对于构建可靠、高性能的机器学习模型至关重要。

062:期望值(利润)框架 📊

在本节课中,我们将学习如何超越简单的分类指标(如准确率),转而使用一个更贴合实际业务决策的框架——期望值(利润)框架。我们将探讨如何将模型的预测结果与实际决策的成本和收益结合起来,从而选择出能带来最大预期利润的模型。

概述:为何单一指标不够用? 🤔

上一节我们介绍了多种基于混淆矩阵的评估指标。然而,没有一个指标是“永远正确”的。不同的领域对同一概念有不同的称呼,例如,统计学中的“第一类错误”对应机器学习中的“假阳性”,而“第二类错误”对应“假阴性”。

混淆矩阵包含了所有信息,但难以用一个单一数字来比较模型。更重要的是,像准确率这样的指标存在缺陷,不仅因为它无法处理类别不平衡,更因为它没有考虑模型部署后所做决策的后果——即决策带来的成本和价值。

因此,我们需要一个能够纳入这些成本和价值的框架来辅助决策。答案就是期望值

期望值框架简介 💡

期望值是一个概率论概念。对于一个随机事件,其期望值等于所有可能结果的(或收益)乘以其发生概率的总和。

其核心公式如下:

期望值公式:
E[V] = Σ_i P(结果_i) * V(结果_i)

其中:

  • 结果_i 代表第 i 种可能的结果。
  • P(结果_i) 代表该结果发生的概率。
  • V(结果_i) 代表该结果带来的价值(收益或成本)。

接下来,我们通过一个实例来理解如何应用这个框架。

实例:目标营销决策 🎯

假设我们有一款产品,消费者购买价格为200美元,我们的产品成本(制造、运输等)为100美元。为了向一位消费者发送营销材料(如传单),我们需要花费1美元。

以下是两种可能的结果及其价值:

  • 消费者响应(购买):我们获得利润 200 - 100 - 1 = 99 美元。
  • 消费者未响应(不购买):我们损失了营销成本,即 -1 美元。

那么,我们是否应该向这位消费者发送营销材料?这取决于他/她响应的概率

根据期望值公式,发送材料的期望利润为:
E[发送] = P(响应) * 99 + P(不响应) * (-1)

只有当这个期望值大于0时,发送才是有利可图的。通过解不等式 P(响应) * 99 + (1 - P(响应)) * (-1) > 0,我们可以得到:
P(响应) > 0.01

这意味着,只要该消费者响应的概率超过1%,发送营销材料就能带来正的预期利润。这个例子展示了如何利用一个能预测“响应概率”的模型,结合业务成本与收益,来做出明智的决策。

从模型评估到期望利润计算 🔄

上一节我们看到了如何为单个决策使用期望值。现在,我们来看看如何利用这个框架来评估和比较不同的分类模型。

整个过程可以分为以下几个步骤:

  1. 训练模型并计算混淆矩阵:在测试集上评估模型,得到混淆矩阵。
  2. 计算联合概率分布:将混淆矩阵中的计数归一化,得到预测结果与真实标签的联合概率分布。
  3. 定义收益矩阵:为每一种预测-真实情况的组合(真阳性、假阳性等)赋予一个价值(收益或成本)。
  4. 计算期望利润:将联合概率矩阵与收益矩阵进行逐元素相乘,并对所有结果求和。

下图清晰地展示了这个流程:

步骤详解与计算

假设我们有一个在110个测试样本上得到的混淆矩阵:

预测为正 预测为负 合计
实际为正 56 5 61
实际为负 7 42 49
合计 63 47 110

步骤1:计算联合概率分布
将每个单元格除以总样本数110,得到联合概率:

预测为正 预测为负
实际为正 56/110 5/110
实际为负 7/110 42/110

步骤2:定义收益矩阵
沿用营销案例的数字:

  • 真阳性(TP):预测购买且实际购买,收益 = 99美元
  • 假阳性(FP):预测购买但实际未购买,收益 = -1美元
  • 真阴性(TN):预测不购买且实际未购买,收益 = 0美元(无成本也无收益)
  • 假阴性(FN):预测不购买但实际会购买,收益 = 0美元(错失机会,但未产生成本)

收益矩阵 B 如下:

预测为正 预测为负
实际为正 99 0
实际为负 -1 0

步骤3:计算期望利润
期望利润 E 是联合概率矩阵 P 与收益矩阵 B 逐元素相乘之和:
E = Σ_i Σ_j P(i,j) * B(i,j)

代入数字计算:
E = (56/110)*99 + (5/110)*0 + (7/110)*(-1) + (42/110)*0
E ≈ (5040 - 7) / 110
E ≈ 5033 / 110 ≈ 45.75

这意味着,使用这个模型来指导营销决策,平均从每个目标客户身上可以期望获得约45.75美元的利润。

利用概率分解深入理解

我们也可以利用概率的链式法则来分解期望值,这能让我们更清楚地看到各类别概率和分类器性能指标(如召回率、特异度)所起的作用。

期望值公式可以重写为:
E = P(实际为正) * [TPR * B_TP + FNR * B_FN] + P(实际为负) * [FPR * B_FP + TNR * B_TN]

其中:

  • P(实际为正) = 61/110 ≈ 0.555P(实际为负) = 49/110 ≈ 0.445
  • 真正例率(TPR) = 56/61 ≈ 0.918
  • 假正例率(FPR) = 7/49 ≈ 0.143
  • 假负例率(FNR) = 5/61 ≈ 0.082
  • 真负例率(TNR) = 42/49 ≈ 0.857

代入公式验证:
E = 0.555 * (0.918*99 + 0.082*0) + 0.445 * (0.143*(-1) + 0.857*0)
E ≈ 0.555 * 90.882 + 0.445 * (-0.143)
E ≈ 50.44 - 0.064 ≈ 50.38 (与之前计算因四舍五入有细微差别)

这个视角表明,期望利润是正负两类样本的期望收益的加权平均,权重就是它们的先验概率。

框架的局限性与挑战 ⚠️

虽然期望值框架非常强大,但在实际应用中面临一个主要挑战:

收益矩阵极难准确获取。

在现实的生产环境中,精确量化一次正确或错误预测所带来的金钱价值(或更广义的成本/收益)通常非常困难。这不仅需要猜测具体数字,有时连估计一个合理的范围都颇具挑战。

因此,成功应用此框架的关键在于:

  1. 与领域专家紧密合作,尽可能做出合理的估计。
  2. 进行敏感性分析,观察当收益/成本在一定范围内变动时,最优决策或模型是否保持稳定。
  3. 理解这更多是一个用于结构化思考和比较的框架,而非一个提供绝对精确答案的“食谱”。

总结 📝

本节课我们一起学习了期望值(利润)框架。

  • 核心思想:评估模型不应只看预测准确性,而应结合其决策带来的实际业务价值
  • 关键公式期望值 = Σ (结果概率 × 结果价值)
  • 应用流程:从混淆矩阵得到联合概率分布,定义收益/成本矩阵,计算期望利润。
  • 优势:将机器学习模型与商业目标直接挂钩,支持基于预期财务回报的模型选择。
  • 挑战:收益/成本矩阵的确定需要深入的领域知识,且往往是不精确的。

掌握这个框架能帮助你超越单纯的算法优化,从创造实际商业价值的角度来思考和设计机器学习解决方案。记住,没有放之四海而皆准的“最佳指标”,深入理解你的具体问题和业务背景才是关键。

063:模型性能可视化 📊

在本节课中,我们将学习如何超越单一数值指标,通过可视化方法来全面评估和比较机器学习模型的性能。我们将探讨为什么单一指标(如准确率)通常不足以描述模型,并介绍如何利用利润曲线准确率-覆盖率曲线来做出更明智的决策。

上一节我们讨论了使用单一数值(如期望收益)来衡量模型性能的局限性。本节中,我们将看看如何通过可视化来更全面地展示模型表现。

单一指标的局限性

通常不建议使用单一数字来代表模型性能的全部复杂性。更好的做法是尽可能多地展示我们对问题的理解,而模型性能的可视化图表会很有帮助。

此外,即使是对专家而言,如果只展示一个数字,他们也很难理解你的结果。一张图胜过千言万语。

决策边界与混淆矩阵

回想一下期望值的计算。我们从一个成本效益矩阵开始,这个矩阵可能来自销售部门的信息。在训练或分类模型后,我们会在测试集上计算混淆矩阵,其中包含真正例、假正例、假反例等。

这个过程是确定性的,那么“千个数字”从何而来呢?

考虑贝叶斯决策边界。假设我们有癌症患者(红色曲线)和非癌症患者(绿色曲线)的概率分布。最优的贝叶斯决策边界位于这两条概率密度函数(后验概率)相交的地方。

  • 决策边界左侧的红色区域样本将被预测为阴性(无癌症)。
  • 决策边界右侧的样本将被预测为阳性(有癌症)。

这样,总体风险被最小化。但假阳性和假阴性通常成本不同。例如,在癌症检测中,我们更不希望出现假阴性(漏诊癌症),因此我们宁愿多检查一些健康人,也不愿让一个癌症患者发展到晚期。

因此,我们可以移动决策边界。如果假阴性的成本更低,我们可以允许更多假阴性出现;如果假阳性的成本更高,我们可以将决策边界右移以减少假阳性。

随着决策边界的移动,我们的混淆矩阵也在变化。因此,期望成本或收益(通过成本效益矩阵与概率相乘得到)也会不同。这不仅取决于不同的模型或超参数设置,也取决于我们如何设置那个阈值

评分与概率

但并非所有模型都输出概率。例如,支持向量机(SVM)基于样本到决策边界的距离进行排序,这个距离是评分,而不是概率。即使我们通过归一化将其映射到[0,1]区间,它仍然不是概率,只是样本属于其类别的置信度得分。

即使是估计概率分布的模型(如使用核密度估计的朴素贝叶斯),也可能因为训练样本不足而无法得到真正有代表性的概率。

那么在这种情况下我们该怎么办?

排序分类器与阈值

一个分类器在给定测试集后,可以确定性地产生一个混淆矩阵。当阈值改变时,混淆矩阵也会改变,真正例和假正例的数量会发生变化。

对于一个排序分类器(即能输出样本得分的分类器),分类器加上一个阈值会产生一个单一的混淆矩阵。

以下是理解此过程的方法:

假设我们有一个测试集,包含若干样本实例,每个样本都有已知的真实类别(正类或负类)。对于一个给定的分类器(例如“分类器一”),我们将所有样本特征输入模型,模型为每个样本返回一个得分。

  1. 我们根据得分将所有测试样本从高到低排序。
  2. 然后我们在这个得分空间中选择一个阈值。
    • 如果阈值设为最高分(例如1.0),所有样本得分都低于阈值,则全部预测为负类。此时真正例和假正例都为0。
    • 如果将阈值略微降低到0.985,可能只有一个得分最高的样本被预测为正类。如果这个样本的真实类别恰好是正类,那么我们就有了一个真正例,假反例减少一个。
    • 继续降低阈值,更多样本被预测为正类。我们会开始遇到真实类别为负类但被预测为正类的样本,即产生假正例。同时,真正例数量增加,真反例数量减少。

因此,混淆矩阵几乎随着阈值的每一次移动而改变。

不同的分类器会对相同的样本产生不同的得分排序。这意味着,对于“分类器一”,样本有一个特定的排序;当我们应用另一个分类器并根据其得分排序时,样本的顺序会变得不同。

如何比较不同模型?

问题来了:我们如何比较不同的排序(即不同的模型)?如何判断哪个更好?如何选择合适的阈值?

答案是使用利润曲线

对于一个排序分类器,我们可以生成一个按得分降序排列的样本及其预测得分列表,然后测量选择列表中每个连续切分点(即阈值)所产生的期望利润

让我们通过一个营销案例来理解利润曲线。

假设我们发送营销材料的成本是每份5美元。每个响应者会支付9美元。因此,每个响应者为我们带来4美元的利润。

你可以暂停视频,尝试自己构建成本效益矩阵。

构建结果如下:

  • 真正例:带来4美元利润。
  • 假正例:带来-5美元“利润”(即损失5美元成本)。
  • (注:此例中假反例和真反例的利润为0,因为我们没有对其采取行动,也未产生成本)。

我们考虑三个分类器(分类器一、二、三)以及一个随机分类器(随机排序样本)。

观察利润曲线,我们可以发现:

  • 利润可能变为负值。这是因为如果我们向列表下方太多不会响应的人发送优惠,我们在优惠成本上的花费太多,无法收回投资。
  • 所有曲线起点(阈值为1,全预测为负)和终点(阈值为0,全预测为正)相同,因为测试集相同。
  • 曲线之间的差异在于,由于每个模型对样本的得分排序不同,在中间阈值点上的利润表现不同。

从图中我们可以观察到,最大利润出现在某个点(例如约240美元),这大约对应向50%的测试人群发送优惠。

现在我们可以说:通过叠加我的得分(置信度)轴,我可以找出产生最大利润的阈值。在生产中,我应该使用分类器二并配合这个特定阈值。

预算限制下的决策

想象另一种情况:你有10万名客户,但市场营销活动预算只有4万美元。你该怎么办?利润曲线也能帮助我们。

4万美元预算,每份材料5美元,意味着我们只能向8000名客户发送优惠。8000/100000 = 8% 的覆盖率。

现在,如果我们观察利润曲线在8%覆盖率处的表现,分类器一的利润更高。因此,如果预算有限只能覆盖前8%的客户,我们应该使用分类器一

关于这些曲线,一个重要点是:模型在不同置信度区间(即得分区间)的准确性不同。有些模型在高置信度时非常准确,有些则在中等置信度时更准确。这就是为什么曲线会以不同速率增长和下降。

准确率-覆盖率曲线

利润的概念可以转化为利益相关者更熟悉的指标,例如准确率。虽然作为研究者,我们知道准确率有很多问题,是一个不好的指标,但如果你的利益相关者已经在所有营销材料中使用准确率,并且这是他们理解和信服的方式,那么你可以用准确率向他们汇报。

我们可以绘制准确率-覆盖率曲线。这里的覆盖率与利润曲线中的概念完全相同。我们根据模型的得分对样本进行排序。

假设我们有三个分类器的准确率-覆盖率曲线:

  • 分类器A(红色):开始时准确率高,但覆盖率增加后准确率迅速下降。
  • 分类器B(蓝色):在整个覆盖率范围内保持相对稳定的中等准确率。
  • 分类器C(绿色):开始时准确率一般,但在某个覆盖率点后准确率急剧下降。

问题来了:哪个分类器更好?

这取决于利益相关者对最低可接受准确率的要求。

  • 如果要求是图中较低的虚线(例如70%准确率),那么绿色分类器能在更高的覆盖率下满足要求(点G),其次是红色(点R),蓝色(点B)的覆盖率最低。此时应选择绿色分类器。
  • 如果要求是图中较高的虚线(例如90%准确率),那么蓝色分类器可能成为最佳选择,因为它能在某个较小的覆盖率范围内达到这个准确率(点B‘),而红色和绿色分类器可能在任何覆盖率下都无法达到90%准确率。

关键在于,当你盲目地在整个测试集上计算一个单一的平均准确率数字时,你丢弃了大量丰富的信息和可能性。通过可视化曲线,你可以根据客户的具体要求(如最低准确率或预算限制),选择最合适的模型和阈值,从而自动化解决他们大部分的手动工作问题。

总结

本节课中,我们一起学习了:

  1. 单一数值指标(如准确率)的局限性,它无法全面反映模型性能。
  2. 决策边界阈值如何动态影响混淆矩阵和期望利润。
  3. 区分模型的概率输出置信度评分
  4. 如何利用利润曲线在考虑成本和收益的情况下,选择最优模型和阈值,特别是在有预算限制时。
  5. 如何绘制和解读准确率-覆盖率曲线,根据利益相关者对准确率的最低要求,选择能实现最大自动化的模型。

掌握这些可视化工具,能帮助你在实际业务中更有效地评估和部署机器学习模型,确保它们不仅“准确”,而且真正有用且符合业务目标。

064:P64 接收者操作特征曲线 📈

在本节课中,我们将学习一种重要的分类器性能可视化工具——接收者操作特征曲线,简称ROC曲线。我们将了解它的构成、如何解读,以及它与之前学习的利润曲线的区别。

从利润曲线到ROC曲线

上一节我们介绍了利润曲线,但利润曲线存在一些问题。为了使利润曲线有效,必须满足两个关键条件:已知的类别先验概率和已知的成本与收益。如果两者都已知,利润曲线是可视化分类器性能的一个好选择。

然而,在许多实际领域中,情况并非如此。这些条件可能不稳定或不确定。例如,欺诈交易的数量会因地点和月份而变化(类别先验概率波动);营销活动的预算不同,优惠的成本也不同(成本与收益多变)。这种不稳定性和多变性使得基于利润曲线做出的决策也可能不一致。

一个可能的解决方案是生成多条利润曲线,预先考虑各种条件并规划不同的曲线。但这会带来新的问题:需要存储多少条件和曲线?这些条件很快会变得难以管理、理解和向利益相关者解释。模型的可解释性非常重要,你需要能够解释为什么推荐这个模型,它的好处是什么,不使用其他模型的缺点是什么。

那么,我们能做什么呢?实际上,在第一次世界大战期间,为评估雷达探测敌机的准确性,工程师们开发了一种可视化技术,这就是接收者操作特征曲线。

理解ROC曲线

ROC曲线全称为接收者操作特征曲线。它的横轴是假正率,纵轴是真正率

为了理解这两个概念,让我们回顾一下混淆矩阵。混淆矩阵包含四个部分:真正例、真反例、假正例和假反例。

  • 真正率:在所有实际为正例的样本中,被正确预测为正例的比例。计算公式为:TPR = TP / (TP + FN)。它也被称为“命中率”。
  • 假正率:在所有实际为反例的样本中,被错误预测为正例的比例。计算公式为:FPR = FP / (FP + TN)。它也被称为“误报率”或“假警报率”。

ROC曲线描绘了当分类器的决策阈值变化时,真正率和假正率之间的权衡关系。

解读ROC空间

在ROC空间中,有几个关键点需要理解:

  • 点 (0, 0):表示分类器将所有样本都预测为反例。此时没有假警报,但也完全错过了所有正例。
  • 点 (1, 1):表示分类器将所有样本都预测为正例。此时抓住了所有正例,但所有反例也都成了误报。
  • 对角线 (从(0,0)到(1,1)):这条线代表一个随机分类器的性能。例如,一个抛公平硬币(50%概率预测为正)的分类器会落在点(0.5, 0.5)附近。一个以90%概率预测为正的随机分类器会落在点(0.9, 0.9)附近。
  • 点 (0, 1):这是理想点,代表完美分类器:所有正例都被正确识别,且没有任何误报。

一个分类器的ROC曲线越靠近左上角(即越接近点(0,1)),其性能越好。

保守型与激进型分类器

根据分类器在ROC空间中的位置,我们可以判断其“性格”:

  • 保守型分类器:通常位于ROC空间的左下部分。它设置很高的阈值,只有在非常确信时才预测为正例。因此,它的误报率很低,但代价是也会漏掉很多真正的正例(真正率也低)。
  • 激进型分类器:通常位于ROC空间的右上部分。它设置很低的阈值,只要有一点迹象就预测为正例。因此,它能抓住更多正例(真正率高),但也会产生更多误报(假正率高)。

选择保守型还是激进型分类器,取决于实际问题中假正例假反例的成本。哪个错误更严重,就决定了我们更倾向于避免哪种错误。

如何构建ROC曲线

ROC曲线通常由输出“置信度分数”或概率的分类器(如支持向量机、逻辑回归)生成。构建步骤如下:

  1. 获取模型对测试集中每个样本预测为正例的分数。
  2. 将所有样本按预测分数从高到低排序。
  3. 将分类阈值设置为最高(高于所有分数),此时所有样本都被预测为反例,对应点(0,0)。
  4. 依次将阈值降低到每个独特的预测分数值。
  5. 对于每个新阈值,将分数高于阈值的样本预测为正例,计算此时的真正率和假正率,在图上描点。
  6. 连接所有点,形成一条阶梯状的曲线(当样本量很大时,看起来是平滑的)。

这条曲线展示了该分类器在所有可能阈值下的所有性能表现。

曲线下面积:一个综合指标

为了更方便地比较不同分类器的整体性能,我们引入一个单一指标:曲线下面积

AUC是ROC曲线下方与坐标轴围成的面积。因为整个ROC空间的面积是1(1x1的正方形),所以AUC的值在0到1之间。

AUC有一个非常直观的概率解释:它等于随机选取的一个正例样本的预测分数,高于随机选取的一个反例样本的预测分数的概率。

  • AUC = 1.0:完美分类器。所有正例分数都高于所有反例分数。
  • AUC = 0.5:随机分类器,其性能与抛硬币无异。
  • AUC < 0.5:比随机还差,但将预测结果反转(正变反,反变正)就可以得到AUC > 0.5的分类器。

AUC是一个比准确率更稳健的指标,特别是在类别不平衡的数据集上。它衡量的是分类器的“排序能力”,而非绝对的分类正确率。

总结

本节课中,我们一起学习了接收者操作特征曲线。我们了解到,ROC曲线通过描绘真正率和假正率在不同决策阈值下的变化,全面展示了分类器的性能。它不依赖于特定的类别先验或误分类成本,因此比利润曲线更具通用性。通过观察曲线靠近左上角的程度,我们可以直观比较分类器优劣。最后,曲线下面积作为一个标量汇总指标,为我们提供了比较分类器整体排序能力的有效工具。掌握ROC曲线和AUC,对于评估和选择机器学习模型至关重要。

065:模型校准 📊

在本节课中,我们将要学习模型校准。模型校准是现代机器学习模型的一个重要特性,它确保模型输出的置信度分数能够真实反映其预测正确的概率。一个经过良好校准的模型,其声称的置信度与实际准确率是匹配的。这对于自动化决策至关重要,因为它能帮助我们判断何时可以信任模型的预测,何时需要将任务转交给人类处理。

为什么需要模型校准?🤔

上一节我们介绍了模型校准的基本概念,本节中我们来看看为什么它如此重要。

我们通常使用分类器和模式识别算法来自动化原本由人类完成的任务。人类并不完美,我们也不期望算法完美无缺。与其等待一个在所有输入情况下都表现完美的新方法,我们不如设定一个置信度阈值,只接受高于该阈值的预测。

然而,问题在于,模型输出的置信度分数并不总是与其预测正确的概率相符。这就是模型校准要解决的问题:让模型预测的概率估计能够代表其真实的正确可能性。

我们希望与预测类别标签相关联的概率能够反映其真实正确的可能性。如果模型经过良好校准,我们就知道何时可以信任模型,何时应该将任务转交给人类。回想上一讲的内容,关于哪个模型更适合自动化的问题,答案可能有些矛盾。由于不同的应用需求(例如,对持续准确性的合同要求),我们可能会选择一个在整体测试集上表现更差的模型。我们可能拥有平均准确率更高的模型,但如果这些模型对其预测过于自信,那么对于我们的特定应用场景来说,它们实际上可能更差。这就是我们需要良好校准模型的原因。

模型可解释性是另一个案例。我们希望能够明确指出哪些情况对模型来说更难,哪些更容易。例如,即使我们的模型只在80%的情况下预测正确,但在实际应用中,可能有20%的情况本身就是错误的或根本无法标记的。我们希望模型在这些错误的预测上不要返回高置信度,而是完全不自信(最好为零),这样我们就可以开始调查,找出问题所在(例如,打印机卡纸或某个数据收集站点发送了垃圾数据)。我们希望模型的置信度能够真实反映其准确率。

什么是完美校准?🎯

上一节我们讨论了校准的重要性,本节我们来定义什么是完美校准。

考虑一个有监督的分类问题。多维输入数据和多个类别的标签遵循联合数据-标签分布,该分布可以分解为先验证据和条件概率(即后验概率)。神经网络接收特征向量作为输入,返回类别预测 \(\hat{y}\) 和置信度 \(\hat{p}\)

对于一个完美校准的模型,我们需要在给定置信度下,预测结果正确的概率等于该置信度值。用公式表示如下:

\[P(\hat{Y} = Y \mid \hat{P} = p) = p, \quad \forall p \in [0,1] \]

如何评估模型校准?📈

上一节定义了完美校准,本节我们来看看如何评估一个模型是否校准良好。

为此,我们可以借助可靠性图(或称校准图)。可靠性图是模型校准情况的可视化表示。这些图表绘制了模型的“预期样本准确率”作为“模型返回的置信度”的函数。

如果模型完美校准,那么在给定置信度下,预测标签是真实标签的概率就等于该置信度。这意味着,可靠性图应该绘制恒等函数,即一条45度的对角线。任何与完美对角线的偏差都代表了错误校准。

以下是可靠性图的一个示例。对于完美校准的模型,这条45度对角线意味着,例如,当模型置信度为0.6时,其准确率也应为0.6;置信度为0.8时,准确率也应为0.8。

在Scikit-learn的帮助文件中,可以找到对逻辑回归、朴素贝叶斯分类器、支持向量机和随机森林的校准图比较。从图中可以看到,逻辑回归的校准曲线(蓝线)最接近完美校准。这并不奇怪,因为逻辑回归的设计目标就是建模训练数据中的概率分布。图中的偏差是因为我们在测试数据上绘图,这反映了逻辑回归的泛化误差。

图中还有频率图(直方图)。这个图告诉我们模型预测的置信度分布。例如,如果模型以0.9到1.0之间的置信度做出预测,我们就把这个预测计入对应的分箱中。对于逻辑回归,其置信度值的分布相对均匀。相比之下,支持向量机(绿线)倾向于在0.5附近(最不确定)做出很多预测。朴素贝叶斯分类器则呈现出双峰分布,对正负预测都表现得非常自信,但仍然会犯错,因此其校准曲线并不完美。

需要注意的是,这些校准图本身并不能告诉我们模型的绝对准确率有多高。它们只告诉我们模型的准确率与其声称的置信度有多接近。

现代深度学习模型的校准问题 🔍

上一节我们看了传统模型的校准情况,本节我们关注一个有趣的现象:现代高性能深度学习模型的校准问题。

一篇2017年的论文指出,性能最好的深度学习模型在置信度方面“欺骗”了我们。以LeNet(1998年,5层)和ResNet-110(2016年,110层)在CIFAR-100数据集上的表现为例。虽然ResNet-110的准确率高于LeNet,但其平均置信度远高于其实际准确率。观察可靠性图,LeNet的校准曲线更接近理想对角线,而ResNet的校准曲线则与对角线存在巨大差距。

这表明,模型变得更深、更宽可能降低分类错误率,但会对模型校准产生负面影响。此外,批量归一化等技术的引入虽然加快了训练速度并略微提高了准确率,但也增加了错误校准。训练时使用较小的权重衰减也会对校准产生负面影响。

那么,为什么一个模型预测性能更好、准确率更高,但校准却更差呢?这看起来像是过拟合在作祟。如果我们只关注测试错误率(红色曲线),它会随着训练周期增加而下降。但如果我们观察测试负对数似然,它会先下降到某一点,然后开始上升。这表明,网络在预测准确率方面没有过拟合,但在预测其自身准确率的概率或置信度方面发生了过拟合。这是一个非常有趣的观察。

量化校准误差:ECE与MCE 📊

上一节我们通过图表观察了校准问题,本节我们引入量化指标来评估校准程度。

首先定义两个核心概念:分箱内的预期准确率平均置信度
\(B_m\) 为第 \(m\) 个置信度分箱的样本索引集合。

  • 分箱 \(B_m\) 的预期准确率 是该分箱内正确预测的归一化计数:

    \[\text{acc}(B_m) = \frac{1}{|B_m|} \sum_{i \in B_m} \mathbf{1}(\hat{y}_i = y_i) \]

    其中 \(\mathbf{1}\) 是指示函数,预测正确为1,否则为0。\(|B_m|\) 是该分箱的样本数。

  • 分箱 \(B_m\) 的平均置信度 是该分箱内所有样本置信度的平均值:

    \[\text{conf}(B_m) = \frac{1}{|B_m|} \sum_{i \in B_m} \hat{p}_i \]

对于一个完美校准的模型,每个分箱都满足 \(\text{acc}(B_m) = \text{conf}(B_m)\)

为了用一个数字来概括模型的校准程度,我们定义预期校准误差

\[ECE = \sum_{m=1}^{M} \frac{|B_m|}{n} |\text{acc}(B_m) - \text{conf}(B_m)| \]

其中 \(n\) 是总样本数。ECE 是各分箱准确率与置信度之差的绝对值,按分箱大小加权后的总和。

对于一些高风险应用,我们可能希望最小化置信度与准确率之间的最坏情况偏差。为此,我们定义最大校准误差

\[MCE = \max_{m \in \{1,...,M\}} |\text{acc}(B_m) - \text{conf}(B_m)| \]

另一个常用的衡量概率模型质量的指标是负对数似然。给定一个概率模型 \(\pi(y|x)\)\(n\) 个样本,负对数似然定义为:

\[NLL = -\sum_{i=1}^{n} \log(\pi(y_i | x_i)) \]

理论上,当且仅当模型估计的条件分布恢复真实条件分布时,负对数似然的期望值才被最小化。

模型校准方法 🛠️

上一节我们学习了如何衡量校准误差,本节我们来看看如何对模型进行校准。

有多种校准方法可用于改善模型输出概率的可靠性,其中许多方法在深度学习兴起之前就已为经典机器学习模型开发。幸运的是,它们大多已在标准库(如Scikit-learn)中实现。

以下是几种主要的校准方法:

  • 直方图分箱:预先定义固定的分箱边界,将所有未校准的预测划分到互斥的分箱中。为每个分箱估计一个校准分数 \(\theta_m\)。使用时,若模型的置信度落在某个分箱内,则用该分箱的 \(\theta_m\) 替换原置信度。通过最小化平方误差可以求解出最优的 \(\theta_m\),结果恰好是每个分箱内正样本的平均比例。

  • 保序回归:与直方图分箱类似,但保序回归会同时估计分箱的数量、分箱边界以及每个分箱的校准参数。它不要求分箱大小相等,而是寻找一个最优的、单调非递减的分段常数函数来拟合数据。

  • 贝叶斯分箱:这种方法对所有可能的分箱方案进行贝叶斯平均。它设定一个先验分布来描述不同的分箱模式,然后对所有可能的分箱方案进行积分(或求和),从而得到最终的校准预测。这相当于考虑了所有可能的分箱不确定性。

  • Platt缩放:由John Platt提出,最初用于将支持向量机的输出距离转换为置信度。其思想是将模型的原始输出(对于SVM是到超平面的距离)通过一个Sigmoid函数进行变换。这个Sigmoid函数有两个参数(权重 \(A\) 和偏置 \(B\)),通过在保留的验证集上最小化负对数似然来优化。公式为:

    \[P(y=1|x) = \frac{1}{1 + \exp(A \cdot f(x) + B)} \]

    其中 \(f(x)\) 是模型的原始输出。

  • 矩阵与向量缩放(Platt缩放的推广):对于多分类问题,可以将Platt缩放推广。不再为每个类别独立应用Sigmoid,而是学习一个权重矩阵 \(W\) 和一个偏置向量 \(b\),对Softmax函数的输入(logits)进行线性变换:\(\hat{z} = W \hat{z} + b\),然后再应用Softmax。为了减少参数,通常限制 \(W\) 为对角矩阵。

  • 温度缩放:这是Platt缩放的一个更简单的特例,也是目前发现对深度神经网络最有效的校准方法之一。它只引入一个正的标量参数 \(T\)(温度),用于缩放Softmax函数的输入logits向量 \(z\)

    \[\hat{p}_i = \frac{\exp(z_i / T)}{\sum_{j=1}^{K} \exp(z_j / T)} \]

    \(T=1\) 时,恢复原始概率。当 \(T > 1\) 时,会“软化”概率分布,使输出更均匀,降低置信度;当 \(T < 1\) 时,会“锐化”分布。温度 \(T\) 通过在验证集上最小化负对数似然来优化。关键优势在于,温度缩放不改变模型预测的类别(因为argmax不变),因此不影响模型的准确率,只调整其置信度使其更符合实际准确率。

实验结果表明,对于各种深度网络(如ResNet, DenseNet, LeNet),简单的温度缩放方法在降低ECE和NLL方面,往往比更复杂的矩阵缩放或直方图分箱方法效果更好。经过温度缩放后,模型的可靠性图能显著更接近理想的对角线。

总结 📝

本节课中我们一起学习了模型校准。

  • 模型校准的核心是让模型输出的置信度分数能够真实反映其预测正确的概率。
  • 我们可以使用可靠性图来可视化模型的校准情况,完美校准对应一条45度对角线。
  • 可以使用预期校准误差最大校准误差等量化指标来评估校准程度。
  • 现代深度神经网络虽然准确率高,但常常存在过度自信校准不良的问题。
  • 有多种方法可以对模型进行事后校准,包括直方图分箱、保序回归、贝叶斯分箱、Platt缩放及其推广(矩阵/向量缩放),以及简单有效的温度缩放
  • 温度缩放因其简单性和有效性,成为校准深度神经网络置信度的首选方法之一,它能在不改变模型准确率的前提下,显著改善概率输出的可靠性。

通过校准模型,我们可以更可靠地利用其置信度分数来决定何时自动化处理任务,何时需要人工干预,从而在实际生产环境中安全、有效地部署机器学习系统。

066:卷积神经网络构建模块 🧱

在本节课中,我们将学习卷积神经网络的核心构建模块。我们将从卷积操作本身开始,逐步了解其工作原理、关键参数以及各种变体,如池化、上采样和空洞卷积。理解这些基础组件是掌握现代CNN架构及其应用的关键。

上一节我们回顾了CNN的发展历史。了解系统的演进过程有助于理解其完整功能,甚至发现其不足与改进方向。本节中,我们来看看构成卷积神经网络的基本工具。

卷积操作本身

卷积操作是CNN最核心的组件。我们有一个称为卷积核(或滤波器)的小矩阵,它会在输入数据(如图像或前一层的特征图)上滑动。

以下是卷积过程的示意图:

图中左侧展示了卷积核在输入 X 上滑动的过程,并生成输出通道。右侧以3D形式展示了同一过程,其中下层是第 i 层,上层是第 i+1 层。

让我们逐步分解这个过程:

  1. 步骤1-9:卷积核从输入左上角开始,每次向右移动一步(步长=1),最终扫描完整张图像。
  2. 计算过程:在每一步,卷积核覆盖的区域与核的权重进行逐元素相乘,然后将所有乘积结果求和。这个和经过一个激活函数(如ReLU)后,成为输出特征图上的一个像素值。
  3. 数学表示:输出像素值 O 的计算可以表示为:
    O = σ( Σ (W * I) + b )
    其中 W 是卷积核权重,I 是输入对应区域,b 是偏置项,σ 是激活函数。

在具体实现中,为了提高效率,卷积运算通常被转换为大型矩阵乘法,这能充分利用GPU的并行计算能力。

填充

在之前的例子中,卷积核从图像左上角开始对齐。但这是唯一或最优的方式吗?并非如此。

有时我们希望输出特征图的空间尺寸与输入保持一致,或者让边缘像素也能被卷积核中心充分处理。这时就需要使用填充

以下是两种常见的填充方式:


  1. same 填充:在输入周围填充零,使得卷积核中心能够对准输入图像的每一个像素(包括边缘)。这样,输出特征图的尺寸与输入相同。这在图像分割等需要像素级对齐的任务中非常有用。
  2. full 填充:进行更多的填充,使得卷积核每次只与输入的一个像素完全重叠,然后逐渐“进入”图像。这种填充方式使用较少。

same 填充的工作方式可以通过下图更直观地理解:

多通道卷积

理解了单通道卷积后,我们来看更常见的情况:处理具有多个通道的输入(如RGB彩色图像)。

对于多通道输入(例如3个通道:红、绿、蓝),每个卷积核也必须是三维的。假设卷积核尺寸是3x3,那么对于三通道输入,卷积核的深度也是3,其参数总数为 3 x 3 x 3 = 27

计算时,卷积核在每个通道上独立进行卷积操作,然后将所有通道的卷积结果相加,再加上偏置,最后通过激活函数,生成单个输出通道的一个像素值。


一个RGB图像输入到CNN第一层的示例。

第一层卷积后,我们会得到多个输出通道(特征图),每个通道由不同的卷积核生成,负责检测不同的特征(如边缘、纹理)。


第一层卷积后生成的16个特征图,每个对应一个不同的3x3滤波器。

随着网络加深,更高层的卷积会以所有前一层的特征图作为输入,融合更复杂和抽象的信息。



深层特征图关注更高级的特征(如眼睛、嘴巴等)。

池化层

卷积层之后,特征图中相邻区域的信息通常是高度相关的。为了降低数据维度、减少计算量并增强特征的空间不变性,我们会使用池化层

最常见的池化操作是最大池化

最大池化在一个局部区域(如2x2窗口)内选取最大值作为输出。它没有需要学习的参数,只有窗口尺寸和步长两个超参数。

工作原理

  • 将特征图划分为不重叠(或重叠)的池化窗口。
  • 对每个窗口,取其中所有值的最大值
  • 该最大值被传递到下一层。

反向传播:在反向传播时,梯度只传递给前向传播中被选为最大值的那个元素,其他元素的梯度为零。

另一种池化是平均池化,即取窗口内所有值的平均值。

平均池化是可微的线性操作,反向传播时梯度平均分配给窗口内的所有元素。

从卷积特征到分类预测

经过一系列卷积和池化后,我们得到了一个包含高级特征的多通道三维张量。为了进行图像分类等任务,需要将其转换为类别预测。

一种常见的方法是展平

  1. 展平:将最后一个卷积层输出的所有特征图“拉直”成一个长向量。
  2. 全连接层:将这个向量输入到一个或多个全连接层中。
  3. 输出层:最后通过一个输出层(如Softmax)得到最终的类别概率。

其他重要构建模块

除了上述基础模块,还有一些重要的变体。

1x1 卷积

  • 作用:虽然核大小为1x1,看似只进行标量乘法,但它作用于所有输入通道上。
  • 用途
    • 跨通道的信息整合与降维:可以灵活地增加或减少通道数,且计算量小。
    • 在展平操作前使用,可以智能地压缩通道信息,替代简单的展平。

转置卷积

  • 作用:也称为“上卷积”或“分数步长卷积”。它执行与常规卷积相反的操作,用于上采样,即增大特征图的空间尺寸。
  • 用途:在图像生成、语义分割等需要从低分辨率特征恢复到高分辨率输出的任务中至关重要。

空洞卷积

  • 作用:在卷积核的权重之间引入固定的间隔(空洞率)。一个3x3的核,空洞率为2,其感受野等效于一个5x5的核,但参数仍只有9个。
  • 优势
    • 快速扩大感受野:无需增加卷积层深度或核尺寸,就能让深层神经元看到更广阔的输入区域。
    • 多尺度信息:通过堆叠不同空洞率的卷积层,神经元可以在保持局部细节聚焦的同时,捕获更广泛的上下文信息,类似于人眼的“中心清晰,周边模糊”的感知方式。

本节课总结

本节课我们一起学习了卷积神经网络的核心构建模块。你需要熟悉并理解以下概念:

  • 卷积:核/滤波器如何工作,如何滑动扫描输入并产生输出通道。
  • 填充:为什么使用填充,same 填充和 full 填充的区别与用途。
  • 多通道处理:卷积核如何处理多通道输入,以及每个输出通道的含义。
  • 池化:最大池化和平均池化的作用,以及如何实现降维。
  • 从特征到预测:如何将卷积层的输出通过展平和全连接层转换为最终预测。
  • 高级模块
    • 1x1卷积:用于跨通道变换和降维。
    • 转置卷积:用于上采样和增大分辨率。
    • 空洞卷积:用于高效扩大感受野和捕获多尺度上下文信息。

掌握这些基础模块,是理解更复杂的CNN架构(如ResNet, U-Net等)并在各种视觉任务中应用它们的关键。

067:跳跃连接与残差网络 🧠

在本节课中,我们将学习深度神经网络训练中的一个关键挑战——梯度消失问题,以及如何通过“跳跃连接”这一创新技术来解决它。我们将从早期观察开始,逐步理解“高速公路网络”和“残差网络”的核心思想,并最终看到这些技术如何彻底改变了深度模型的训练方式。

背景:深度模型的训练困境

上一节我们介绍了反向传播算法。得益于反向模式自动微分,在前向传播之后,梯度沿着计算图中的路径反向传播。通常,图中的每条边都代表一个计算,例如一个线性变换后接一个非线性激活函数。

然而,在某些边上省略计算,仅使用恒等变换来代替,是有优势的。这个技巧虽然早已存在,但最近被重新发现,并被证明在训练非常深的模型时非常有效。

早期观察与“暗知识”

人们很早就推测,更深的模型应该比浅层模型更强大,但无论我们如何努力,都无法有效地训练它们。即使使用智能初始化参数的预训练方法,也只能在一定程度上有所帮助。训练深层网络的困难令人沮丧。

直到2013年,Rich Caruana观察到以下现象。他训练了一个在当时看来较深(可能3到5层)的模型,我们称之为“教师”网络。在训练完成后,他取教师网络在最终预测层(Softmax层)之前的输出层,并将其作为“学生”网络(一个浅层网络)的训练目标。学生网络的目标是,在相同的输入数据上,最小化其输出与教师网络该层输出之间的差异。

令人惊讶的是,这个学生网络的性能与当时的深层网络一样强大。Jeff Hinton(一些人称之为深度学习之父)对此提出了解释,他称之为“暗知识”。其核心观点是:网络不仅仅学会了预测输入的类别,还学会了训练数据中各类别之间的规律和关系(例如,“椅子”与“长凳”更相似,与“花”则相差甚远)。这些隐含的相似性知识被编码在了网络的中间层中。

从这个观察出发,我们评估模型的方式也发生了变化,开始关注“Top-K准确率”,即模型预测概率最高的前K个类别中是否包含正确标签。

高速公路网络:引入门控机制

基于Caruana的观察和Hinton的解释,Yoshua Bengio的团队利用“暗知识”来训练深层但较窄的网络,他们称之为“FitNets”。这个过程分为两步:先训练一个较宽但不特别深的“教师”网络,然后利用其输出作为目标,来训练一个更深、更窄的“学生”网络。

然而,这种两阶段的师生过程对一些人来说显得有点繁琐。

在2015年,Rupesh Kumar Srivastava、Klaus Greff和Jürgen Schmidhuber提出了一个更精巧的观察:如果我们在前馈神经网络的常规层中嵌入“传输门”和“携带门”,就能让梯度在非常深的网络中顺畅流动。

让我们看看他们是如何做到的。首先,我们重新定义一层网络。通常一层网络可以写作:
y = σ(W * x + b)
我们将其简写为 y = H(x; W_H),其中 H 代表线性变换加非线性激活。

然后,我们可以为这一层添加门控机制。新的输出 y 计算如下:
y = t(x) ⊙ H(x; W_H) + c(x) ⊙ x
这里:

  • t(x)传输门,它是一个Sigmoid函数:t(x) = σ(W_t * x + b_t)
  • c(x)携带门,同样是一个Sigmoid函数:c(x) = σ(W_c * x + b_c)
  • 表示逐元素相乘。

门控机制的工作原理如下:

  • 传输门 t(x) 控制有多少经过 H 变换的信息能传递到下一层。当 t(x) 接近1时,门“打开”,变换后的信息通过;接近0时,门“关闭”,变换后的信息被阻断。
  • 携带门 c(x) 控制有多少原始输入 x(未经变换)能直接“携带”到下一层。

如果所有传输门都打开(值为1),所有携带门都关闭(值为0),那么网络就退化为普通的层叠网络。如果携带门打开,原始输入 x 就能直接加到输出上,形成一条信息“高速公路”。

这种设计的巨大优势在于梯度传播。在反向传播时,梯度有两条路径可以回流:一条通过变换函数 H,另一条通过恒等连接(即 x 本身)。即使通过 H 的梯度因为层数过深而消失,通过恒等连接的梯度路径也几乎总是可用的(只要携带门没有完全关闭)。这确保了网络最深层的误差信号也能被传回最浅的层,从而更新其参数。

为了在训练初期确保梯度流动,论文建议将门的偏置初始化为较大的负值,这样Sigmoid门的初始输出接近0,携带门初始为“打开”状态,保证了梯度高速公路的畅通。

实验结果令人鼓舞。传统的“平面”网络随着深度增加(10, 20, 50, 100层),性能急剧下降。而高速公路网络虽然整体性能可能不如最浅的传统网络,但其性能随深度增加而恶化的程度要小得多。更重要的是,深度为100的高速公路网络,其性能与之前需要复杂师生训练的FitNets相当,而这里仅使用了随机初始化和门控技巧。

残差网络:简化的飞跃

大约在同一时期(高速公路网络论文在线半年后),微软的研究人员意识到:我们真的需要从头学习这些复杂的门吗?如果我们简单地将传输门 t(x) 和携带门 c(x) 都固定设置为1,会发生什么?

如果我们这样做,就得到了一个极其简单的结构:
y = H(x; W_H) + x
这个公式对应的图示如下:输入 x 一方面经过变换 H,另一方面通过一条“捷径”(跳跃连接)直接连接到输出点,与 H(x) 的结果相加。

这就是残差网络的核心单元——残差块。作者将其解释为:网络不再直接学习一个完整的映射 H(x),而是学习一个“残差” F(x) = H(x) - x。因此,原始映射被重写为 H(x) = F(x) + x。他们认为,学习残差 F(x) 比学习完整的映射 H(x) 更容易。

残差网络的主要优势和卖点有两点:

  1. 保留了梯度高速公路:和高速公路网络一样,恒等跳跃连接 (+ x) 为梯度回流提供了一条无阻碍的路径,有效缓解了梯度消失问题。
  2. 极其简单:它比高速公路网络更易于理解、实现和训练,没有需要学习的额外门控参数。

一个需要注意的细节是,为了使加法 H(x) + x 可行,H(x) 的输出维度必须与 x 的输入维度相同。在使用跳跃连接时,我们必须确保维度匹配。

残差网络的威力与影响

研究人员构建了一个34层的残差网络(ResNet-34)并与相同深度的普通平面网络进行对比。结果非常明显:

  • 平面网络:随着深度增加到34层,训练误差和测试误差都显著增大,模型难以优化。
  • 残差网络:随着深度增加,训练误差和测试误差持续下降,性能得到提升。

残差网络不仅训练更容易,其泛化性能也更好。这背后的一个直观解释是,跳跃连接平滑了神经网络的损失曲面。在超高维的参数空间中,梯度下降像是在一个崎岖的地形上寻找最低点。跳跃连接的加入使得这个地形变得更加平滑,梯度下降的路径更加顺畅,收敛也更容易。

一旦跳跃连接被证明有效,人们开始思考:为什么只跳过一层?于是出现了更密集的连接方式,例如DenseNet,其中每一层的输入都来自前面所有层的输出。这种密集连接进一步平滑了优化空间,使得训练更加稳定高效。

总结

本节课中,我们一起学习了深度神经网络训练中的关键创新——跳跃连接。

  • 我们从梯度消失问题和早期利用“暗知识”的师生训练法开始。
  • 然后深入探讨了高速公路网络,它通过可学习的传输门携带门,首次系统性地构建了梯度信息的高速公路。
  • 接着,我们看到了其简化版本——残差网络,它通过固定的恒等跳跃连接 (y = H(x) + x) 实现了同样的目标,并且因其简单高效而成为里程碑式的架构。
  • 最后,我们理解了跳跃连接的核心价值:为梯度回流提供捷径,平滑损失曲面,从而使得训练极深的神经网络成为可能。门控机制(在高速公路网络中)和维度匹配是理解与实现这些技术时需要注意的重要概念。

这些思想不仅应用于卷积神经网络(CNN),也深刻影响了如循环神经网络(RNN)等其他架构,是深度学习得以向“深度”发展的基石之一。

068:全卷积网络与语义分割 🧠

在本节课中,我们将学习卷积神经网络的一个重要变体——全卷积网络。我们将探讨其核心概念、工作原理,以及它在语义分割任务中的应用。


卷积网络的优势

卷积网络是一个富有成效的模型,带来了许多创新和成功。正如之前提到的,它们计算密集,但效率很高。这是因为它们能同时利用GPU的并行流水线。因此,卷积网络具有高度可并行化的特性。这使得它们的训练速度可以比循环神经网络等模型更快,遇到的瓶颈更少。


什么是全卷积网络?🤔

那么,什么是全卷积神经网络?当我们有一个CNN时,它不已经是全卷积的吗?或者它是半卷积的?当你听到“全卷积”这个术语时,到底发生了什么?通过本节简短的讨论,我希望你最终不会感到惊讶,而是能理解其本质。


语义分割任务

想象一下屏幕上的这个任务:你有一个环境或来自环境的图像/视频,图像的每个像素都有一个标签。例如,当一辆汽车行驶时,你的算法(神经网络、卷积神经网络)需要实时预测每个像素属于哪个物体:是树、汽车、道路、人还是自行车?这个任务被称为语义分割

在下图展示的例子中:

  • 左侧是真实标签
  • 真实标签是X(图像)和Y(标签)的组合。
  • Y是通过手动标注或其他方式获得的,为图像X上的每个像素提供一个标签。
  • 我们可以看到哪些像素属于自行车、边界、骑自行车的人以及背景。
  • 我们的目标是自动地从图像X构建一个如右图所示的掩码,或者能够实时分割图像。这就是语义分割任务。


为何需要全卷积网络?

以下是我们的传统模型。我们有几个卷积层(可能带有池化层,也可能没有),它们在中间步骤生成通道。卷积操作实际上发生在这些层之间。整个过程最终以一个全连接层(或称前馈神经网络)结束,该层从K个类别中做出预测。

那么,我们能否在没有全连接层的情况下做同样的事情?答案是肯定的。

还记得1x1卷积吗?使用1x1卷积(不是13x13或3x3,而是1x1),我们可以替换所有的全连接层。我们需要快速回顾一下这一点。

记住1x1卷积发生了什么。如果你有几层通道,你可以应用一个1x1卷积,它“穿透”所有层,并在下一层产生一个通道。但你不必只使用一个神经元(那会急剧减少维度)。你可以使用比前一层少的神经元,但仍然是多个1x1卷积层。然后,逐步地(不是一步到位,而是通过几个步骤),你可以创建单个输出层,并将其用于预测。

在分类任务中,输出层上的每个“像素”将对应我们想要做出的预测。


应用于语义分割

但对于语义分割任务,我们需要做什么?我们需要进行上采样。上采样是我们之前在某一讲中讨论过的反卷积(转置卷积)操作。

因此,我们从一个高度为H、宽度为W的图像开始,最终得到一个高度为H、宽度为W的图像。我们经过了一系列1x1卷积步骤,并在最后添加了上采样。这样,我们创建了一个相同尺寸的图像输出。这类似于分类任务,只是现在我们是在逐个像素地进行分类

一个值得注意的有趣点是:对于每张图像,如果是H x W分辨率(比如800万像素),我们就有800万个标签。所以现在,与输入是一个D维特征空间、输出是单个标签不同,我们有了多得多的标签,并且在单个样本、单个示例中有了多得多的梯度信号。因此,训练可以高效得多。我们可能不需要数百万个示例来训练网络,这是一个显著的成就。

这就是一个全卷积网络。我们可以称之为“朴素”全卷积网络。


网络结构与训练

完整的网络结构如下所示。我们输入带有真实分割标签的图像,网络输出像素级的预测,误差通过反向传播回传到输入层,并执行梯度下降。

这种方法在2014年被提出。其核心要点是:

当目标输出和输入具有相同维度时,在所有地方使用卷积可能更好。


总结

本节课中,我们一起学习了全卷积网络。我们了解到,通过用1x1卷积替换传统的全连接层,并引入上采样操作,CNN可以转变为处理像素级预测任务(如语义分割)的全卷积网络。这种架构不仅保持了卷积的参数共享和空间层次提取优势,还因为输出与输入同尺寸而获得了更丰富的梯度信号,从而可能提高训练效率。记住其核心思想:当输入输出尺寸相同时,全程使用卷积是更优选择。

069:带扭曲的语义分割 🧠

在本节课中,我们将学习语义分割,特别是两种重要的网络架构:全卷积网络(FCN)和U-Net。我们将探讨它们的工作原理、优缺点,并通过一个实际的脑图像分割案例,了解如何利用这些技术构建更高效、更强大的模型。


概述

语义分割的目标是为图像中的每一个像素分配一个类别标签。上一节我们介绍了卷积神经网络的基本构建模块。本节中,我们来看看如何将这些模块组合起来,构建用于像素级预测的专用网络。


全卷积网络(FCN) 🔄

全卷积网络是解决语义分割问题的一种早期且有效的方法。它的核心思想是使用卷积层处理整个图像,并最终通过上采样操作将特征图恢复到原始输入尺寸。

其结构可以概括为:

  1. 编码部分:一系列卷积和下采样(如最大池化)操作,逐步压缩图像尺寸,提取高级特征。
  2. 解码部分:使用上采样操作(如转置卷积),将压缩后的特征图逐步恢复到原始输入尺寸。

最终,网络输出一张与输入图像尺寸相同的特征图,每个像素位置对应一个类别预测。训练过程是有监督的,使用像素级的真实标签(如分割掩码)来计算损失。

注意:虽然FCN的结构(编码-解码)与自编码器相似,但它们的训练目标和用途不同。FCN用于有监督的分割任务,而自编码器通常用于无监督的特征学习或数据重建。


U-Net:引入跳跃连接 🧬

U-Net是对FCN架构的重要改进,因其形状像字母“U”而得名。它在医学图像分割领域取得了巨大成功。

U-Net的核心创新在于跳跃连接。在编码器部分进行下采样时,U-Net会保存中间层的特征图。在解码器部分进行上采样时,它会将对应层级的编码器特征图通过跳跃连接“拼接”过来。

以下是跳跃连接的作用:

  • 融合多尺度信息:解码器在恢复图像尺寸时,不仅依赖经过压缩的深层语义信息,还融合了来自编码器的浅层、高分辨率细节信息。
  • 改善细节恢复:这有助于网络更精确地定位物体边界,生成更精细的分割结果。

一个典型的U-Net模型可能拥有数千万参数,模型文件很大(例如2.5GB),这在某些应用场景中是一个挑战。


案例研究:轻量级3D脑图像分割 🧩

上一节我们介绍了U-Net的强大能力,但它的参数量大。本节中我们来看看如何构建一个更轻量的分割模型,应用于3D脑图像分割任务。

我们面临两个任务:

  1. 分割灰质和白质。
  2. 分割105个不同功能脑区。

由于获取大量人工标注数据困难,我们采用了一种“师生学习”策略:使用一个现有的、较慢但不完美的自动分割工具(“老师”)来生成训练标签,然后训练我们自己的深度学习模型(“学生”)。

MeshNet:使用膨胀卷积的网络

为了构建一个参数量少、效率高的模型,我们设计了MeshNet。其关键特点是广泛使用了膨胀卷积

膨胀卷积,有时被称为“带孔卷积”,通过在卷积核的元素之间插入空格(膨胀率)来扩大感受野,而不增加参数数量或进行下采样

在MeshNet中:

  • 所有层都使用相同尺寸的3x3x3卷积核。
  • 通过逐层增加膨胀率来扩大感受野,而不是通过池化来降低分辨率。
  • 因此,所有中间特征图保持与输入图像相同的空间尺寸。

结果对比

  • 参数量:U-Net约2300万参数(2.5GB),MeshNet仅约7.2万参数(600KB)。
  • 性能:MeshNet在保持甚至提升分割精度的同时,推理速度更快(从数小时缩短到不足一分钟)。
  • 权衡:由于特征图尺寸不变,MeshNet在训练时对GPU显存的需求更高(因为要存储大量激活值)。

处理大图像的技巧:子块采样与集成

由于整个3D大脑图像无法一次性放入内存,我们采用以下策略:

  1. 训练时,从大脑中心按高斯分布随机采样多个子图像块。
  2. 预测时,同样采样多个重叠的子块,分别预测,然后对每个像素的多个预测结果进行多数投票,得到最终分割结果。

关于噪声标签的重要见解

一个有趣的发现是,我们训练的“学生”模型有时在测试数据上的表现优于生成训练标签的“老师”工具。

这是因为深度学习模型是统计模型。如果训练标签中的错误是非系统性的(即随机噪声),并且有足够的数据,模型能够学会“平均掉”这些噪声,从而学到更本质的模式。只要错误不是系统性的,带有噪声的标签仍然可以用于训练出强大的模型。


多模态输入与超人类表现 🚀

深度学习模型的一个工程优势是能轻松处理多模态输入。在我们的案例中,可以同时输入T1、T1-IR和Flair三种不同模式的脑部MRI图像,让模型自动学习融合这些信息,从而免费提升准确率。

此外,在某些任务中,模型甚至表现出超人类的准确率。例如,在3D图像上,人类专家需要同时审视多个二维切片并在脑中重建三维结构,容易因疲劳或视角局限而犯错。而模型可以无缝地处理整个3D体积信息,避免这类错误。


总结

本节课中我们一起学习了语义分割的核心架构。我们从全卷积网络(FCN) 的基础开始,了解了其编码-解码结构。接着,我们深入探讨了U-Net如何通过跳跃连接融合多尺度信息,极大地提升了分割精度,尤其是在医学图像领域。

通过脑图像分割的案例,我们看到了如何利用膨胀卷积构建参数高效的MeshNet模型,并学习了处理大尺寸图像和噪声标签的实用技巧。最后,我们认识到深度学习模型在处理多模态数据和实现稳定、精细的3D分析方面的独特优势。

掌握这些基本模块——卷积、池化、上采样、跳跃连接、膨胀卷积——你将能够根据具体任务的需求,设计并构建属于自己的高效语义分割模型。

070:更多卷积操作 🧠

在本节课中,我们将探讨卷积神经网络中几个进阶但有趣的主题,包括掩码卷积、基于像素的生成模型以及可变形卷积。这些概念扩展了传统CNN的能力,使其能够处理更复杂的任务。

掩码卷积 🎭

上一节我们介绍了标准卷积操作,本节中我们来看看一种特殊的变体:掩码卷积。

掩码卷积的工作原理如下。回想一维卷积的情况,我们有一个输入图像(由像素网格表示)。第一层的神经元只能看到其感受野内的几个像素。第二层的神经元通过第一层的神经元,间接“看到”其下方更多的像素。

如果我们想屏蔽掉感受野中的某些像素呢?例如,对于第二层的某个特定神经元,我们只想让它看到一半的输入,而忽略另一半。我们可以通过应用一个掩码来实现。对于我们希望神经元“看到”的像素,掩码值为1;对于希望排除的像素,掩码值为0。

具体来说,我们为感受野内的每个输入像素应用一个掩码。假设我们想屏蔽掉某个顶层神经元感受野的三分之二。我们只需将相同的掩码应用于所有构成该顶层神经元感受野的底层神经元。这样,被屏蔽的底层神经元对顶层神经元的贡献就被消除了,从而实现了对顶层神经元感受野的精确控制。

这个过程可以自然地推广到二维情况。如果我们有一个二维的感受野,并且只希望顶层神经元看到图像的特定部分(例如左上角),我们可以将相同的二维掩码应用于所有相关的二维卷积核权重。

那么,掩码卷积有什么用呢?它在PixelCNN等模型中极其有用。

基于像素的生成模型 🖼️

在PixelCNN中,我们面临一个有趣的问题:如何逐个像素地生成一张图像?具体做法是,我们按从左到右、从上到下的顺序枚举所有像素。目标是自回归地生成每个像素,即根据之前所有已生成像素的条件概率分布来采样生成当前像素。

掩码卷积在这里至关重要,因为它能确保网络在预测第i个像素时,只能“看到”位置在i之前的像素,而无法看到未来的像素。这是通过应用一个特定的三角掩码来实现的,该掩码会屏蔽掉感受野中位于当前像素之后的所有像素。

以下是生成过程的核心步骤:

  1. 从第一个像素(或一个起始条件)开始。
  2. 网络基于当前可见的像素,输出一个概率分布(例如高斯分布,包含均值 mu 和方差 sigma)。
  3. 从这个分布中采样,得到下一个像素的值。
  4. 将新生成的像素加入输入,重复步骤2-3。
  5. 最终,逐个像素地生成整张图像。

这种方法可以用于图像修复(恢复被遮挡的部分)或无条件图像生成。令人惊讶的是,以这种方式生成的图像可以非常逼真。

从图像到音频:WaveNet 🔊

基于像素生成的思想同样可以应用于音频。音频通常以每秒数千个样本(如16kHz)的波形表示。WaveNet就是一个类似PixelCNN的卷积网络,它用于逐个样本地生成音频波形。

传统的语音合成方法包括参数化模型或拼接合成。WaveNet则不同,它基于之前的音频样本,通过卷积操作预测下一个样本的概率分布,并从中采样。

其效果非常出色,生成的语音听起来非常自然,甚至能模仿出呼吸声、唇齿音等细节。更有趣的是,当WaveNet不基于任何文本条件时,它仍然能生成波形,但输出的是无意义的“胡言乱语”,这证明了模型确实在学习声音的底层结构,而不仅仅是拼接预定义的单元。

可变形卷积 🔄

传统卷积核在规则的网格上扫描图像,这使其擅长检测平移不变的特征。但如果特征发生了旋转、缩放或非刚性形变,固定形状的卷积核可能就无法有效识别。

可变形卷积的提出就是为了解决这个问题。其核心思想是:为什么卷积核必须固定在规则网格上?我们可以引入一个并行的子网络(控制网络),来学习每个卷积核采样点的偏移量。

具体来说:

  • 对于标准卷积核中的每个采样位置,可变形卷积会为其预测一个二维的偏移量 (Δx, Δy)
  • 这个偏移量由控制网络根据输入特征图动态计算得出。
  • 然后,卷积操作在原始位置加上预测偏移量的新位置进行采样。

这样,卷积核的形状就变得可以动态调整。例如,它可以学习拉伸以匹配一个被拉长的眼睛,或者旋转以对准一个倾斜的物体。这使得网络能够更灵活地适应几何形变,显著提升了在复杂场景下的特征提取能力。

总结 📝

本节课我们一起学习了卷积神经网络的三个高级主题:

  1. 掩码卷积:通过屏蔽感受野中的部分连接,控制信息的流动,是实现自回归生成模型(如PixelCNN)的关键。
  2. 基于像素的生成:模型能够逐个像素(或样本)地生成图像和音频,展现了深度模型强大的序列建模能力。
  3. 可变形卷积:通过动态学习卷积核采样点的偏移,使CNN能够适应特征的几何形变,大大增强了模型的表达能力。

这些发展表明,卷积神经网络的结构仍在不断演进,通过引入更灵活的机制,它们能够解决越来越复杂和多样化的任务。

071:词嵌入介绍 🧠

在本节课中,我们将要学习词嵌入的基本概念。词嵌入是一种将词语表示为向量空间中的点的技术,其核心思想是:词语的含义由其上下文决定。我们将从如何表示数据开始,逐步探讨如何将这一思想应用于词语,并介绍构建词向量的初步方法。

从数据表示到词语表示

上一节我们介绍了将传感器数据表示为向量的自然方式。本节中我们来看看如何将类似的思想应用到词语上。

有时数据是从多个独立的传感器收集的。将每次测量或样本的传感器数据组合成一个数组或向量,是表示样本的自然方式。例如,身高、体重、肤色、眼睛颜色、头发颜色等许多关于人的测量值。我们将每个测量值视为一个维度,并可以在由这些测量值表示的所有人的空间中穿行。

通过独立地遍历这些维度,并从表示为向量的样本集合中,我们可以学习这些维度如何相互作用。例如,眼睛颜色和人的身高之间是否存在相关性?我们还可以应用变换,最终可能使我们能够在“人类空间”上构建预测模型,或者我们可以利用现有的强大机器学习模型。

反之亦然。如果我们有向量数据,我们可以将维度分配给卡通面孔的参数,并以一种对我们来说在语义上有意义的方式进行。切尔诺夫面孔就是一种语义化表示多元数据的方式。想象一个操作员控制核反应堆的状态,她不是观察数十个参数,而只是看一张卡通面孔。如果面孔变得不开心,她就进一步调查发生了什么。人类处理面孔大约需要100毫秒。如果能如此快速地评估一个复杂过程的状态,岂不是很棒?

但是,如果我们想根据含义将词语向量化到某种形式的语义空间中呢?

定义词语的含义

那么,一个词是什么意思?让我们问问人类。威廉·拉布在1973年设计了一个实验,绘制了相似但有时不同的物体图像,以尝试评估和区分“杯子”和“碗”这两个词的含义。

他们雇佣了人类受试者,要求他们将其右侧的物体标记为“碗”或“杯子”。在收集了所有回答后,他根据这些回答构建了一个定义。

有趣的问题是:杯子类别在哪里结束,碗类别从哪里开始?从图片中你可以看到,这取决于直径。直径越大,它越有可能被认为是碗。我们在这里只绘制了一个参数,但可能还有其他我们可以独立考虑的参数,或者可能存在多个参数。至少我们可以一起看三个。

如图所示,在没有其他信息、没有其他上下文的情况下,这些物体大多数被标记为杯子。但是让我们添加上下文。添加上下文,比如里面是否有食物。然后突然之间,根据上下文,这条分界线发生了戏剧性的移动。因此,对于杯子和碗,相同物体的语义含义之间的边界发生了移动,它们是上下文敏感的。

于是,威廉·拉布开始思考这个有趣的观察,并试图基于此给出杯子的定义。以下是其定义的简化表示:

定义公式cup 用于表示深度与宽度之比为 1 ± R 的容器,其中 R < R_B,且 R_B = Σ(α_i)α_i 在特征 i 存在时为正值,否则为0。

这些特征包括:有手柄、由不透明玻璃材料制成、用于消费食物、用于消费液体食物、用于消费热液体食物、带有碟子、横截面呈锥形圆形等。

杯子被可变地用于表示宽度与深度之比为 1 ± R 的此类容器,其中 R_B ≤ R ≤ R_L,其概率为 (R_L - R) / (R_L - R_B)。量 1 ± R_B 表示宽度与高度之比与模型值的距离。

杯子、碗,还有什么比这更简单的呢?我们却试图创建越来越深入细节的技术定义。现在,至少对人类来说,我们谈论的东西的含义或感觉已经丢失了,尽管我们试图精确地定义我们已经知道或对其有概念的东西。

维特根斯坦的语言哲学

基于类似的想法,语言哲学家路德维希·维特根斯坦在其晚年提倡研究日常语言。在他看来,如果我们误用词语,当它们失去意义时,可能会产生不一致。例如,一个人丢了他的狗,于是他在报纸上登了一则广告,广告上写着:“过来,孩子!”

维特根斯坦在他的《哲学研究》中,探讨了“游戏”这个词的定义或含义。他写道:什么是游戏?棋盘游戏、纸牌游戏、球类游戏、奥林匹克游戏等等。它们有什么共同点?不要说“一定有什么共同点,否则它们就不会被称为游戏”,而是去看一看是否所有游戏都有共同之处。例如,看看棋盘游戏,然后转到纸牌游戏,再转到球类游戏,你会发现很多共同点保留了下来,但也失去了很多。我们可以以同样的方式浏览许多其他类型的游戏,可以看到相似性如何出现和消失。没有比“家族相似性”更好的表达来描述这些相似性了。但如果有人想说所有这些构造都有某种共同点,即它们所有共同属性的析取,我会回答:现在你只是在玩弄词语。

那么,一个 radically 不同的方法如何?一个词的含义是它在语言中的使用。—— 路德维希·维特根斯坦。这就是他提出的建议:与其客观地试图定义一个词,不如看看它是如何被使用的。这同样是客观的,但它更像是观察性的而非规范性的。只需观察词语是如何使用的,这就定义了词语的含义,而不是某种关于它应该如何的外部规范性定义。

观察到一个有趣的语言学现象:大多数词典是规范性的,它们规定语言的使用方式。但也有更偏向经验观察的词典,它们不规定词语应该如何被使用,而只是观察词语是如何被使用的并报告出来。

因此,根据这种方法,词语是由它们的环境、由它们周围的词语来定义的。

分布假说与词语含义

泽利格·哈里斯在1954年说过:如果A和B有几乎相同的环境,我们说它们是同义词。以下是一个例子:“空心菜”是什么意思?

假设你看到这些句子:“用大蒜炒的空心菜很美味。”“加冰的空心菜很棒。”“空心菜叶配咸酱。”然后,在此之前你见过:“用大蒜炒的菠菜。”“加冰的瑞士甜菜叶很美味。”“羽衣甘蓝和其他咸味绿叶蔬菜。”那么,结论是:空心菜是一种像菠菜、瑞士甜菜或羽衣甘蓝一样的绿叶蔬菜。

(注:空心菜,即 water spinach,通菜/蕹菜)

词嵌入的目标

我在本讲座中的目标是向你们展示,将词语嵌入向量空间的各种方法,使得在语言使用或含义上相似的词语(我们或维特根斯坦这样定义它)在这个向量空间中靠在一起。

总结

本节课中我们一起学习了词嵌入的核心理念。我们从数据的向量表示出发,探讨了精确定义词语含义的困难,并引出了维特根斯坦“含义即使用”的哲学观点。这直接导向了自然语言处理中的分布假说:词语的含义由其上下文决定。基于此,我们可以通过分析词语在大量文本中的共现模式,将其表示为高维空间中的向量(即词向量),使得语义相似的词语在向量空间中的位置也相近。这就是词嵌入技术的起点。

072:P72 词嵌入与语义矩阵

在本节课中,我们将学习一种用于生成密集词向量表示的矩阵分解方法。我们将探讨如何构建一个语义矩阵,并通过矩阵分解技术从中提取出有意义的词向量。

概述

词嵌入的目标是将词汇表中的每个单词映射到一个低维、密集的向量空间中,使得语义相似的单词在向量空间中也彼此接近。本节课程将介绍一种基于矩阵分解的方法来实现这一目标。我们将从构建一个单词共现矩阵开始,然后探讨如何通过分解这个矩阵来获得词向量。

构建共现矩阵

为了使用矩阵分解方法,我们首先需要一个可以分解的矩阵。

假设我们有一个词汇表,包含从单词1到单词n的所有单词。词汇表的大小为V。

我们可以构建一个对称矩阵,其维度为V x V。这个矩阵中的每个单元格(i, j)记录了单词i和单词j在相同上下文中出现的次数。

这里的关键在于“上下文”的定义。如果我们进行文档分析,上下文可以是整个文档。那么我们就可以构建一个“单词-文档”矩阵,其中记录了每个单词在每个文档中出现的次数。这与我们之前学过的词袋模型表示法非常相似。

然而,我们也可以构建一个“单词-单词”矩阵。在一个文本语料库中,我们可以定义上下文为一个固定大小的滑动窗口(例如,窗口大小w=5)。然后,我们统计词汇表中每对单词在这个滑动窗口内共同出现的次数,并将这个计数填入矩阵的相应位置。

处理高频词与标准化

这种方法的一个问题是,像“the”、“and”这样的停用词会主导整个矩阵,因为它们在几乎所有上下文中都频繁出现,而这种共现并不具有语义意义。

一种解决方案是预先移除停用词。但有时我们无法预知哪些词是“无意义”的高频词。因此,更通用的方法是使用TF-IDF值来填充矩阵,或者使用点互信息。

点互信息用于衡量两个事件(在这里是单词)共同出现的概率是否高于它们独立出现的概率。其公式如下:

PMI(w, c) = log( P(w, c) / (P(w) * P(c)) )

其中,P(w, c)是单词w和上下文c共同出现的概率,P(w)和P(c)分别是它们各自出现的概率。

我们可以通过最大似然估计来计算这些概率:

  • P(w) = 单词w在语料库中出现的次数 / 语料库总词数
  • P(c) = 上下文c在语料库中出现的次数 / 语料库总词数
  • P(w, c) = 单词w和上下文c共同出现的次数 / 语料库总词数

将这些代入PMI公式,我们得到:

PMI(w, c) = log( (count(w, c) * N) / (count(w) * count(c)) )

这里N是语料库的总词数。

PMI的值域是从负无穷到正无穷。当两个单词独立时,PMI为0。负值表示它们共同出现的次数比随机预期要少,但这些负值估计通常不可靠。一个常见的技巧是将负的PMI值置零,从而得到正点互信息:

PPMI(w, c) = max(PMI(w, c), 0)

PPMI有效地归一化了高频词的影响,但也可能偏向于罕见事件。为了解决这个问题,可以使用加一平滑等技术。

矩阵分解与词向量

通过上述方法,我们得到了一个(经过PPMI或TF-IDF加权的)单词共现矩阵M。这个矩阵的维度是V x V,可能非常庞大且稀疏。

我们假设词语的语义存在于一个更低维的潜在空间中。也就是说,矩阵M具有低秩结构。因此,我们可以通过矩阵分解来近似这个矩阵:

M ≈ W * C^T

其中,W是一个V x K的矩阵,C是另一个V x K的矩阵,K是远小于V的维度(例如100)。这样,矩阵W中的每一行(一个K维向量)就成为了对应单词的密集向量表示。

在这种表示下,两个单词向量w_i和w_j的内积(w_i · w_j)近似于它们在原始矩阵M中的共现强度(例如PPMI值)。因此,向量之间的内积(或更常用的余弦相似度)编码了单词的语义相似性:语义越相似的单词,其向量夹角越小,内积越大。

奇异值分解方法

实现这种分解的一种具体方法是奇异值分解。SVD将矩阵M分解为三个矩阵的乘积:

M = U Σ V^T

其中U和V是正交矩阵,Σ是对角矩阵,其对角线上的元素是奇异值。

我们可以将词向量矩阵定义为U Σ(或取其前K个主要成分)。这样,每个单词同样被表示为一个K维的密集向量,并且向量空间的结构反映了单词之间的语义关系。

总结

本节课我们一起学习了基于矩阵分解的词嵌入方法。我们首先介绍了如何构建单词共现矩阵,并使用PPMI等技术对其进行标准化以更好地捕捉语义。接着,我们探讨了如何通过假设该矩阵具有低秩结构,并对其进行分解(如SVD),来得到每个单词的密集向量表示。最终,这些向量的内积或余弦相似度能够有效地编码单词之间的语义相似性。这种方法为将离散符号(单词)映射到连续向量空间提供了坚实的数学基础。

073:词嵌入与Word2Vec 🧠

在本节课中,我们将学习词嵌入的核心概念,特别是Word2Vec模型。我们将探讨如何将单词表示为密集向量,以及如何通过上下文共现信息来捕捉单词的语义。课程将涵盖两种主要的Word2Vec架构:连续词袋模型和跳字模型,并重点介绍用于高效训练的负采样技术。


概述:从语义到向量

上一节我们介绍了语义相似度的向量化表示。我们看到,遵循路德维希·维特根斯坦对词义的定义——即“意义即使用”,词嵌入可以通过单词在相同上下文中的共现来精确地表示有用信息。

这些嵌入向量可以是短向量,更重要的是,它们可以是密集向量。因为对于深度学习模型(以及其他机器学习模型),输入需要是密集的。神经网络中的矩阵乘法运算在处理密集输入时效果更好。

为了应对表示问题,并尝试用密集向量表示单词,出现了一种称为Word2Vec的方法,由Tomas Mikolov及其同事提出。

理论上,我们可以通过对单词-上下文相似度矩阵进行奇异值分解来获得词向量。但奇异值分解的复杂度在实践中是立方级的。对于一个非对称的M x N矩阵,截断的SVD复杂度是O(M * N2)量级。当M和N相等(即使用单词本身作为上下文)时,复杂度就是O(M3)。

那么,Tomas Mikolov及其同事提出了什么呢?让我们来看一个你可能熟悉(或不熟悉)的设置。


模型设置:从稀疏到密集的表示

我们首先设定模型的基本框架。我们将每个单词表示为一个独热编码向量

设词汇表大小为 V。每个单词 w_i 被表示为一个 V 维向量,其中除了在第 i 个位置为1外,其余位置均为0。这将是我们的输入。

我们有一个嵌入矩阵 W_E,其维度为 V x D,其中 D 是我们选择的嵌入空间的维度。当我们用独热编码向量 w_i 乘以这个矩阵的转置时,我们实际上只是选取了 W_E 矩阵中对应于单词 w_i 的那一行,从而得到一个 D 维的密集向量 φ_i

这个过程就像一个线性自编码器。我们从一个稀疏的高维空间(词汇表大小)投影到一个低维的密集空间(D 维),然后再尝试通过另一个矩阵 W_D(解码器)投影回原始空间。这类似于我们在主成分分析中见过的线性自编码器。


连续词袋模型

现在,让我们看看第一种替代方案是如何工作的。首先介绍连续词袋模型。

连续词袋模型的做法很简单。它观察一个目标单词周围的上下文窗口(例如,窗口大小为5)。模型的任务是:给定上下文中的其他单词(例如,目标单词前后的各两个单词),来预测中间的目标单词。

以下是其工作原理的步骤:

  1. 输入表示:将上下文窗口中的每个单词转换为独热编码向量。
  2. 获取嵌入:将这些独热向量乘以嵌入矩阵 W_E。由于独热向量只有一个1,这等价于取出 W_E 中对应行的向量。
  3. 组合上下文:CBOW模型不是单独处理每个上下文单词,而是将它们的嵌入向量求和(或平均),形成一个单一的 D 维上下文向量。
  4. 预测目标:将这个组合后的上下文向量乘以解码器矩阵 W_D(维度为 D x V),得到一个 V 维的分数向量。
  5. 应用Softmax:对这个分数向量应用Softmax函数,将其转换为一个概率分布,表示词汇表中每个单词是目标单词的概率。
  6. 计算损失:我们希望目标单词(真实的那个)的概率最大。因此,我们使用交叉熵损失来比较预测的概率分布和真实的独热编码目标向量。

用公式表示,对于目标单词 w_t 和上下文单词集合 C

  • 上下文向量: c = sum_{w in C}(W_E^T * w)
  • 原始分数: z = W_D^T * c
  • 预测概率: y_hat = softmax(z)
  • 损失: L = -log(y_hat[t]),其中 t 是目标单词的索引。

CBOW模型在概念上清晰,可以通过梯度下降进行训练。然而,它存在一个主要的计算瓶颈:每次前向传播都需要计算一个涉及整个词汇表(V 可能达到百万级)的Softmax,这非常耗时。

训练完成后,我们需要的词嵌入就是编码器矩阵 W_E行向量。每一行对应词汇表中的一个单词的 D 维密集表示。


跳字模型

上一节我们介绍了从上下文预测目标的CBOW模型。本节中我们来看看另一种思路:跳字模型。

跳字模型的做法与CBOW相反。它给定一个中心目标单词,试图预测其周围上下文窗口中的单词

以下是其工作原理:

  1. 输入表示:将目标单词 w_t 表示为独热编码向量。
  2. 获取目标嵌入:将 w_t 乘以嵌入矩阵 W_E,得到目标单词的 D 维嵌入向量 v_t
  3. 预测每个上下文单词:对于上下文窗口中的每一个单词 w_c,我们将 v_t 乘以解码器矩阵 W_D,得到一个 V 维分数向量。
  4. 应用Softmax:对每个分数向量应用Softmax,得到预测该上下文单词的概率分布。
  5. 计算损失:模型试图最大化所有上下文单词的预测概率。因此,损失是所有上下文单词的交叉熵损失之和

用公式表示,对于目标单词 w_t 和每个上下文单词 w_c

  • 目标嵌入: v_t = W_E^T * w_t
  • 对于每个 w_c 的原始分数: z_c = W_D^T * v_t
  • 预测概率: y_hat_c = softmax(z_c)
  • 总损失: L = -sum_{c in C} log(y_hat_c[c])

跳字模型在实践中通常比CBOW表现更好。然而,它同样面临计算Softmax时词汇表过大的问题,导致前向和反向传播的计算成本高昂。


负采样:高效的训练技巧

正如我们所见,跳字模型的计算复杂度对于大型词汇表来说难以处理。幸运的是,Mikolov等人提出了一种简化的训练方法,称为负采样

负采样是一种简化版的噪声对比估计。其核心思想是:我们不需要计算整个词汇表的Softmax来学习好的嵌入。相反,我们将问题转化为一系列二分类问题

对于每个(目标单词,上下文单词)的正样本对,我们同时采样 K负样本(即随机从词汇表中选取,通常按其频率加权,且不与目标单词共现的单词)。然后,我们训练模型来区分正样本对和负样本对。

具体操作如下:

  1. 对于正样本(目标 w_t, 上下文 w_c),我们希望模型输出高概率(接近1)。
  2. 对于每个负样本(目标 w_t, 负样本 w_n),我们希望模型输出低概率(接近0)。

我们使用逻辑函数(Sigmoid)将两个单词嵌入的内积转换为一个概率:
P(+ | w_t, w_c) = σ(v_t · u_c) = 1 / (1 + exp(-v_t · u_c))
其中 v_t 是目标单词的嵌入(来自 W_E),u_c 是上下文单词的嵌入(来自 W_D,注意这里 W_D 的每一列可以看作上下文单词的嵌入)。

模型的优化目标是最大化正样本的对数概率,同时最小化负样本的对数概率。损失函数如下:
L = -log σ(v_t · u_c) - sum_{i=1}^{K} log σ(-v_t · u_{n_i})

这个损失函数的关键优势在于:

  • 每次梯度更新只涉及 K+1 个单词(1个正样本,K个负样本),而不是整个词汇表 V
  • 我们只更新与这些样本相关的嵌入向量(W_EW_D 中的特定行/列)。
  • 这本质上是一种度量学习:拉近共现单词的嵌入,推开不共现单词的嵌入。

这种学习方式被称为自监督学习,因为我们没有使用人工标注的标签,而是利用文本数据本身的结构(单词共现模式)来构造监督信号。

跳字模型配合负采样非常高效,并且有多个实现(如原始Word2Vec C代码、Gensim、SpaCy等)。训练完成后,我们通常使用编码器矩阵 W_E 的行作为最终的词向量。


词向量的应用与特性

在获得了词向量之后,我们可以用它们做什么呢?答案是非常多。

有趣的是,词向量空间展现出丰富的代数结构和语义关系:

  • 类比推理:我们可以进行向量运算。例如, vec(“king”) - vec(“man”) + vec(“woman”) 的结果向量在空间中最接近 vec(“queen”)。同样, vec(“Paris”) - vec(“France”) + vec(“Italy”) 最接近 vec(“Rome”)
  • 语义方向:像 man -> womanuncle -> auntking -> queen 这样的向量差(关系)在空间中大致指向同一个方向,代表了“性别”这一语义概念。
  • 语法规律:比较级和最高级(如 slow, slower, sloweststrong, stronger, strongest)的向量也呈现出规律的模式。

这些特性都仅仅从单词的上下文共现信息中学习而来,印证了维特根斯坦的观点:语言的意义蕴含在其使用之中。

我们甚至可以利用词向量研究语言随时间的演变。例如,通过分析不同年代书籍中的词向量,可以追踪像“gay”、“broadcast”、“awful”等词语义的变迁。


总结与要点

本节课中,我们一起学习了词嵌入和Word2Vec模型的核心内容。

我们了解到:

  1. Word2Vec提供了一种简单高效的密集词向量表示方法。
  2. 主要架构包括连续词袋模型跳字模型,后者通常表现更佳。
  3. 负采样技术通过将问题转化为二分类,极大地提高了跳字模型的训练效率,是实际应用中的首选。
  4. 学习到的词向量空间具有丰富的语义和语法结构,支持向量运算和类比推理。
  5. 这种从无标签文本中自行构造监督信号的学习方式属于自监督学习

关键要点:如果你在项目中仍在使用词袋模型表示文本,你将错过词向量所蕴含的强大语义信息。使用预训练的词向量可以为你的模型(如情感分析、文本分类)提供一个高信息量的起点,让模型无需从零开始学习这些语言结构。

074:新闻分类挑战项目报告

在本节课中,我们将学习一个名为“新闻黑手党”的团队如何为“Mowali新闻分类挑战”构建一个文本分类模型。我们将了解从数据处理到建立基线模型的完整流程,并探讨处理低资源语言文本分类的挑战与策略。


项目背景与动机 🎯

我们的团队名称是“新闻黑手党”,我们正在参与Mowali新闻分类挑战。

我们选择这个项目,是因为存在大量文本数据中的低资源语言问题。例如,奇切瓦语是一种在非洲南部、东南部和东部国家使用的语言。这个项目的重要性在于,它能帮助我们更深入地理解机器学习算法如何恰当地对文本进行分类。

文本分类的应用在于,我们可以将新闻文章归类到正确的类别中以便使用。


核心实施步骤 🛠️

上一节我们介绍了项目的背景,本节中我们来看看实现任何语言模型都需要执行的一系列核心操作。

以下是实施语言模型的主要步骤:

  1. 数据处理:本质上是清理文本,使其适合模型使用。
  2. 模型训练:使用处理后的数据训练模型。
  3. 评估与微调:对模型进行评估并进一步优化。

数据预处理 📊

数据清洗和预处理是基于语言模型中最重要的工作之一。

以下是数据预处理的关键任务:

  • 移除无用字符:这些可能是标点符号、HTML标签等会影响模型质量的内容。
  • 统一大小写:将所有文本转换为统一的小写或大写以保持一致性。
  • 删除停用词:停用词是那些使用非常频繁但语义价值不高的词,例如“和”、“或”、“如果”。
  • 拆分粘连词:有时单词可能粘连在一起,这一步是将其分开。
  • 词干提取:本质上是去除词形变化,以保持文本的一致性并获得更好的词元。

我们的数据集包含1436篇新闻文章,每篇文章在训练集中都有一个标签。

在第一篇文章的示例中,我们进行了将所有文本转为小写、移除所有标点符号等预处理操作。

每篇新闻文章大约有15到16个不同的句子,因此我们总共有大约16,501个句子和20个类别标签。

在数据探索和预处理步骤中,我们还计算了每个句子的单词数量。

我们使用了分层K折交叉验证来保持数据分布的一致性。在建立基线模型时,我们遇到了类别不平衡问题。目前我们只是使用了分层K折,但随着我们向最终模型推进,可能会探索不同的方法来应对类别不平衡。


基线模型与初步结果 📈

上一节我们完成了数据预处理,本节中我们来看看建立的基线模型及其表现。

对于基线模型,我们实现了几个经典算法。

我们使用计数向量TF-IDF方法将语言转换为适合模型的数据,并实现了以下模型:

  • 朴素贝叶斯
  • 支持向量机
  • 随机森林

截至目前,我们得到的最佳结果来自朴素贝叶斯模型,准确率约为45%。在竞赛排行榜上,目前的最高结果约为66%。因此,作为一个基线模型,我们的结果差距并不算太大。


当前进展与后续计划 🔄

目前,我们已经理解并分析了初始数据,完成了一部分预处理工作,并建立了一个可工作的基线模型。

正如之前所说,它尚未达到最优状态,因此我们仍需改进。我们将尝试更多的文本处理技术,例如词袋模型、词向量和BERT。我们仍在探索和实验,以寻找更好的方法。

现阶段,我们正在对数据进行各种尝试,看看如何能使其变得更好。我们正在用准确率以外的其他指标来比较结果,以便进行最佳优化,并努力赢得比赛。


竞赛信息与团队协作 🤝

该竞赛由C Africa主办,这是一家旨在改善非洲生态系统的非洲社会企业。

竞赛链接已提供,截止日期是5月9日,这与学期结束日期大致重合,这也是我们选择它的部分原因。

为了协助项目推进,由于我们有六名成员,我们建立并维护了一个GitHub代码仓库。所有初始数据集和代码都存放在那里。

此外,我们使用Google的Jamboard进行协作,其功能类似于看板。这将帮助我们规划需要完成的任务、跟踪处理进度、分配任务和设置截止日期。一切均已就绪,确保我们对项目有全面的了解。


总结

本节课中,我们一起学习了“新闻黑手党”团队为Mowali新闻分类挑战构建文本分类模型的完整流程。我们从项目动机出发,逐步探讨了数据预处理的关键步骤(如清洗、归一化、去除停用词)、基线模型(如朴素贝叶斯、SVM)的建立与评估,以及团队在应对类别不平衡和探索更先进技术(如词向量、BERT)方面的计划。整个过程强调了在低资源语言场景下,系统性的数据处理和迭代实验对构建有效机器学习模型的重要性。

075:Spotify百万歌单挑战赛

概述

在本节课中,我们将学习“Spotify百万歌单挑战赛”的背景、目标与数据处理方法。我们将探讨如何利用机器学习模型为给定的歌单推荐后续歌曲,并了解相关的评估指标。


歌单推荐的意义 🎯

Spotify用户已创建并分享了超过40亿个歌单。人们创建歌单的原因多种多样,例如基于音乐流派、喜爱的艺术家、特定心情(如悲伤歌单)或特定目的(如健身歌单)。无论原因如何,每个歌单对创建者而言都具有内在的意义或目的。通过分析个人歌单的特性,Spotify能够在特定歌单的语境下,向听众推荐他们可能喜欢的其他曲目。这不仅能简化歌单创建过程,还能帮助用户发现更多喜爱的音乐。

挑战目标 🎯

本次挑战的目标是开发一个“自动歌单延续”系统。给定一组歌单特征(如艺术家、歌单标题等),系统应能接收这些信息,并生成一个包含500首推荐曲目的列表,以延续该歌单。用函数形式表达,输入是用户创建的歌单,输出是500首可添加到该歌单的推荐曲目。

为何重要?🤔

在线世界高度个性化。当你在搜索引擎中输入“感知机算法”时,若返回一堆水果图片,这显然不合理。我们的思维带有特定预期:无论使用谷歌、商店网站还是其他平台,输入关键词后,我们都期望获得个性化且准确的推荐。即使存在拼写错误或其他输入限制,我们仍期待准确性。未能满足这些期望不仅会导致用户不满,还可能错失向用户介绍相关新产品的机会。

这不仅对Spotify是一个排序问题,也影响着其他媒体平台,如YouTube、Netflix和Hulu的推荐算法。此外,它同样适用于谷歌搜索、新闻文章推荐、商店商品推荐等领域。因此,若能创建一个能准确预测Spotify用户偏好的算法,该算法也可应用于其他重要领域。

数据介绍 📊

本次挑战涉及两类数据。首先是训练数据,即Spotify的百万歌单数据集,大小约为5.4GB。该数据集包含约100万个歌单,涵盖20亿首曲目,来自约30万名艺术家。

以下是该数据集的基本特征:

  • 歌单名称
  • 歌单中的曲目
  • 曲目元数据(如曲目ID等)
  • 其他元字段(如最后编辑时间、编辑次数等)

每个歌单本身是一个JSON文件。例如,一个名为“musical”的歌单包含曲目数量、关注者数量等信息。在曲目列表中,每个位置对应一首歌曲及其相关信息(如艺术家、歌曲名)。我们认为该数据集较为干净,其中大部分信息对我们的机器学习算法有用。

测试数据 📝

另一类是测试数据,即挑战数据。该数据包含约10,000个歌单,其中包含0、1、2、5或100首“种子歌曲”。有些歌单甚至没有任何种子歌曲。

以挑战数据集中的歌单9992为例,其名称为“body like a backro”。该歌单原本有12首曲目,但Spotify隐藏了其中11首。目前我们只能看到一首名为“body like a backro”的曲目。我们的任务是基于歌单名称、部分元数据以及这首种子歌曲,为该歌单推荐500首歌曲以延续它。

基础模型探讨 🤖

这是一个基于推荐的挑战。通常,推荐模型使用两种过滤方法。

第一种是协同过滤。例如,假设用户A的歌单包含Michael Jackson和Coldplay的歌曲,而Spotify需要为用户B的歌单推荐歌曲,且用户B的歌单也包含这两首歌曲。系统会发现用户A和用户B在歌曲选择上的相似性,从而将用户A歌单中的其他歌曲推荐给用户B。这模拟了用户对用户的推荐。适用于此类协同过滤模型的机器学习方法包括K均值聚类,我们可以从此入手。

第二种是基于内容的过滤。例如,假设我今天在听Coldplay的悲伤歌曲。Spotify会注意到我偏好这些产品特征(如流派、艺术家),并基于这些特征推荐其他歌曲。这就是基于内容的过滤。我们可以尝试使用朴素贝叶斯分类器,但我们需要获取更多曲目元数据(如流派),我们认为这对于此类分类非常重要。

此外,我们还可以考虑使用感知机模型,将音乐的不同特征(如流派、歌单标题、艺术家等)作为输入。例如,假设一个歌单包含大量乡村音乐,那么“流派”特征对该歌单就非常重要,其权重会较高。相反,若一个歌单包含许多不同艺术家的歌曲,艺术家特征的权重可能较低。因此,对于特定用户的歌单,流派可能更重要。基于此,我们可以创建一个加权和,并根据得到的数值做出决策。

评估指标 📈

我们从曲目和艺术家两个层面评估性能。令集合 G 代表真实的曲目集合,R 代表我们将要推荐的曲目集合。

我们可以计算R精度,公式为:
R精度 = |G ∩ R| / |G|
这可以理解为正确推荐的比例。理想情况下,我们希望这个数值尽可能接近1。

我们还需要关注推荐歌曲点击次数,即用户在遇到相关歌曲前需要点击的次数。理想情况下,我们希望这个数值尽可能低,不希望用户需要多次点击才能找到相关歌曲。

后续步骤 🚀

接下来,我们需要从讨论的模型中选择一个,实际实现并训练我们的模型。然后,使用提供的测试数据集进行测试,并利用上一节提到的指标分析其性能。

竞赛现状 🏆

这是一个开放式的AI竞赛。我查看了其他人已实现的指标,目前最佳成绩是R精度约为0.22,遇到相关歌曲前的点击次数约为1.9(接近2次),这已经相当低了。但我们的目标是利用我们的模型,努力超越这些数字。

总结

本节课中,我们一起学习了Spotify百万歌单挑战赛的背景与目标,了解了训练与测试数据的结构,探讨了协同过滤与基于内容过滤等基础推荐模型,并介绍了R精度和点击次数等关键评估指标。最后,我们明确了实现并优化模型以提升推荐性能的后续方向。

076:P76 新闻黑手党最终项目演示 🎯

概述

在本节课中,我们将学习一个关于奇切瓦语新闻文章多标签分类的机器学习项目。该项目由“新闻黑手党”小组完成,旨在探索针对资源匮乏语言(如非洲的奇切瓦语)的文本分类技术。我们将从项目介绍开始,逐步深入到数据处理、模型构建、结果分析,并最终得出结论。


引言

我们的项目主题是马拉维新闻分类。这是一个针对奇切瓦语新闻文章的多标签分类任务。奇切瓦语属于班图语系,在非洲南部、东南部和东部广泛使用,是马拉维和赞比亚的官方语言。

我们的目标是预测来自马拉维新闻出版物的、用奇切瓦语撰写的文章主题。

项目动机

处理奇切瓦语这类资源匮乏的语言存在许多挑战。我们希望通过此项目,改进针对该语言的文本分类算法,从而为市场、文化和政治研究等领域开辟新的研究方向。

项目假设

在开始之前,我们为项目设定了几个基本假设:

  1. 所有文章中的文本均使用奇切瓦语撰写。
  2. 所有文章的主题都属于我们数据集中列出的类别,不存在其他主题。
  3. 所有类别(主题)是互斥的,即每篇文章只能属于一个主题。


数据探索、预处理与模型

上一节我们介绍了项目的背景和目标,本节中我们来看看具体使用的数据、预处理步骤以及尝试的模型。

数据概览

我们使用的数据来自一个马拉维新闻出版物。数据集被分为训练集和测试集。

  • 训练集:包含 41,436 篇新闻文章。每篇文章有ID、文本和对应的标签。整个数据集涵盖 20 个不同的类别(如政治、体育、娱乐等),并包含 551,137 个独特的奇切瓦语单词。
  • 测试集:包含 6,621 篇文章,格式与训练集类似,但不包含标签列。

以下是数据集的示例:

文章ID 文章内容
... (包含约15-16个句子的奇切瓦语文本)...

数据预处理

预处理的目的是将文本转化为更易于分析和预测的形式。我们进行了以下操作:

  1. 文本处理:将所有字母转换为小写,并删除标点符号。
  2. 数据重排:对文章句子和对应的标签进行随机重排,这有助于后续的随机批次训练。
  3. 标签编码:使用了两种编码技术将类别标签转换为模型可读的格式:
    • 标签编码 (Label Encoding)
    • 独热编码 (One-Hot Encoding)

模型构建

我们尝试了多种模型,并从失败的尝试中吸取经验,最终确定了一个表现最佳的模型。

以下是我们在项目中尝试的主要模型类型:

  • 经典机器学习模型:朴素贝叶斯、支持向量机、随机森林、逻辑回归、多层感知机。
  • 最终模型:一个自定义的卷积神经网络,它取得了最好的结果。

在文本编码方面,我们也尝试了不同技术:

  • 词频统计
  • 线性判别分析
  • TF-IDF
  • 自定义词嵌入(用于最终的CNN模型)

模型分析与结果

在尝试了多种模型后,本节我们将详细分析它们的结果,并了解为何卷积神经网络脱颖而出。

基于TF-IDF的经典分类器

TF-IDF用于评估单词对于整篇文章的重要性。使用此方法时,模型的平均准确率并不理想。

以下是基于TF-IDF的不同分类器的表现总结:

  • 平均准确率:35.06%
  • 最佳模型:逻辑回归分类器,准确率为 37.4%

由于准确率较低,我们需要寻找更好的方法。

基于LDA的经典分类器

线性判别分析是一种降维技术,能在保留数据关键信息的同时减少特征数量。此方法的表现优于TF-IDF。

以下是基于LDA的不同分类器的表现总结:

  • 平均准确率:49.5%
  • 最佳模型:多层感知机分类器,准确率达到 58.6%

卷积神经网络模型

我们自定义的卷积神经网络模型取得了最佳结果。该模型包含约20万个可训练参数,并使用了十折交叉验证和自定义词嵌入。

模型结构包含以下关键层:

  • Embedding:词嵌入层
  • Dropout:随机失活层,用于防止过拟合
  • Conv1D:一维卷积层
  • MaxPooling1D:最大池化层
  • Dense:全连接层
  • Activation:激活函数层(如ReLU, Softmax)

一个重要的发现是:最初在没有使用交叉验证时,模型在测试集上的准确率仅为20.4%。但在引入十折交叉验证后,准确率显著提升至 78.2%,远高于其他所有模型。


结论与未来展望

本节课我们一起学习了如何为奇切瓦语新闻构建分类模型。现在,我们来总结项目的成果并探讨未来的改进方向。

项目总结

我们成功构建了一个能够较为准确预测奇切瓦语文章主题的模型。在对比了TF-IDF、LDA等多种方法后,自定义的卷积神经网络模型结合十折交叉验证取得了最佳效果(78.2%的准确率)。

这个项目凸显了处理资源匮乏语言时的特殊挑战,例如无法直接使用针对英语等语言的常用预处理技术(如停用词过滤、词形还原等)。

未来工作

基于本次项目的经验,未来可以在以下几个方向进行探索:

  1. 开发更深的模型:尝试使用残差网络等更先进的架构。
  2. 识别停用词:为奇切瓦语乃至其他非洲语言构建停用词表,这将极大提升模型性能。
  3. 使用更多评估指标:除了准确率和F1分数,引入其他评估指标来更全面地衡量模型性能。

项目资源

项目的代码、看板和工作报告均可在GitHub仓库中找到。团队目前正在对代码进行最后调整,以提交至Kaggle竞赛。


感谢阅读! 希望本教程能帮助你理解针对特定语言的文本分类项目的完整流程。

077:室内定位与导航教程 🧭

概述

在本教程中,我们将学习如何利用智能手机传感器数据,通过机器学习模型实现室内的精确定位与导航。我们将从项目背景、数据处理、模型构建到未来改进方向,系统地介绍整个流程。


项目背景与目标 🎯

我们团队的项目专注于室内定位与导航。其重要性在于提升室内定位的准确性,并改善紧急服务的响应时间。

该项目的优势包括:帮助用户在商场内快速找到特定店铺(如阿迪达斯或丝芙兰),以及在博物馆导览或机场导航等场景中提供辅助。

上一节我们介绍了项目背景,本节中我们来看看项目的具体目标。

我们的目标是预测手机在建筑物内移动轨迹的时间序列,包括X和Y坐标以及楼层号。例如,当用户寻找店铺时,系统能精确找到店铺坐标并像室内GPS一样规划路径。

训练数据中提供了真实路径点(地面实况),我们需要预测的是代表路径的绿色点。


数据收集与挑战 📱

市面上已有一些软件可以辅助数据收集。例如,面向Android的AR Core应用和面向iPhone的AR Kit应用。AR Kit需要付费,而AR Core是免费的。另一款类似的应用是AR Plan 3D,同样需要付费,它可以测量房间尺寸。

这些应用(AR Core和AR Plan 3D)通过手机摄像头实时采集环境数据。

接下来,我们将深入了解数据本身,这被证明是本次竞赛中最大的挑战。

数据表面上很简单:它来自智能手机,几乎记录了所有传感器的读数。我们拥有一个约50GB的大型数据集,包含数百个不同地点(主要是商场)的数据。

关键在于,每个楼层都需要建立独立的模型,并拥有独立的数据集。

数据特征包括手机上的所有传感器:陀螺仪、旋转矢量、磁场、Wi-Fi、蓝牙和加速度计等。

我们最初假设在每个位置点,所有传感器都会有一组读数,从而构成一个整齐的特征向量;或者假设数据会以均匀的时间间隔(例如每秒)记录。但我们发现这两种情况都不成立。

在后续演示中你会看到,这些传感器似乎以近乎随机的时间间隔记录数据,且彼此从不对齐。因此,如何获取一致的特征,以及如何分割、平均或聚合这些数据,以得到一个能够输入机器学习库的平整特征向量,成为了巨大的挑战。

此外,我们找到了一些他人已标准化处理的数据集,但问题在于如何提交到Kaggle平台。因为Kaggle提交要求使用原始的不规则时间戳间隔和随机位置点。所以,即使我们获得了质量良好的规整数据,将其转换回可提交给Kaggle的格式也是一项真正的挑战。


基线模型与流程 🧱

在克服了初步的数据挑战后,我们开始构建基线模型。本节将介绍我们的基线模型以及后续的完整预测流程。

我们决定采用一个简单的基线方法:将所有数据输入一个神经网络。我们为每个楼层的X坐标、Y坐标和楼层号分别训练了独立的神经网络。

这个神经网络模型来自一本我阅读的书籍,它是从头开始实现的,因此我可以清楚地看到所有步骤。我们认为这是一个非常简洁的方案,并且得到了不错的分数。

左侧图表展示了分类器的训练方式:最上方是X坐标网络,中间是Y坐标网络,底部是楼层网络。我们基本上是把所有数据都扔了进去。

右侧是基线模型的结果对比。通过肉眼观察,可以看出楼层预测效果不佳,而X和Y坐标的预测虽不是最差,但正如Benjamin之前提到的,我们在这方面也遇到了困难。

(左侧是我们预测的结果,右侧是真实情况。)

一旦我们的基线模型达到了一定的准确度,我们就可以构建完整的预测流程来展示如何解决这个问题。

完整的预测流程如下:首先,一个楼层检测(或分类)算法会识别出当前楼层,并为该楼层选择相应的路径点检测网络。

我们使用聚类算法进行楼层检测,最初尝试了K-Means。

一旦楼层确定,用于每个楼层的路径点检测器是多层感知机。

但需要注意,使用普通前馈网络的一个缺点是,它没有考虑预测之间的序列关系。因为可以想象,你在商场中的位置,在某种程度上是你几秒钟前位置的函数。这类信息我们目前忽略了。


数据预处理与模型训练 🔧

上一节我们概述了预测流程,本节中我们将深入探讨数据预处理以及分类器和网络训练的具体细节。

以下是我们对数据进行的预处理步骤:

对于给定的每个建筑的每个楼层,我们仅选择Wi-Fi信号强度和磁力计读数作为特征。

这些特征是同步采样的,这意味着每次我们有Wi-Fi读数时,也会有一个磁力计读数。实际上,磁力计的采样频率是Wi-Fi的三倍,因此有时我们只有磁力计读数而没有Wi-Fi读数。

关于Wi-Fi读数:其结构是,假设一个楼层有上千个Wi-Fi接入点,手机会记录到每个接入点的信号强度。因此,特征是各个接入点,值是对应的信号强度。

我们丢弃了仅包含磁力计读数的数据行(因为磁力计采样频率是Wi-Fi的三倍),并将Wi-Fi信号强度中的NaN值填充为0。

接着,对于每个建筑,我们创建了一个包含该建筑所有楼层的统一数据集,并保留了所有楼层共有的接入点对应的列。这样做的思路是,如果某个接入点在第三层,而你在第一层,你接收到的信号强度可能远低于在第三层的人。

然后,我们训练了楼层检测器:针对每个建筑,我们基于所有楼层共有接入点的信号强度,训练了一个K-Means聚类楼层检测器。

对于路径点检测器,我们为每个建筑的每个楼层训练了多层感知机回归器。


模型效果与改进 🚀

楼层预测的分类效果在使用K-Means时并不理想。主要问题是它将同一个楼层分配给了许多不同的聚类,这使得我们很难判断哪个聚类应该对应哪个楼层(例如,哪个聚类是地下负一层)。因此,楼层预测效果很差,我们需要更好的方法。

然而,路径点预测的效果要好得多。使用我们的多层感知机回归器,左侧列显示预测值,中间列显示真实坐标,误差是均方误差。

可以看到,这些预测值相当接近,除少数例外,误差相对较低。平均而言,我们距离正确预测点差9.9个单位。这个结果实际上相当不错。

但我们需要解决楼层分类器的问题。

这个问题的答案非常令人惊讶。我们再次重申为此所做的数据处理:我们仅使用Wi-Fi作为特征,移除了磁力计读数等其他数据。

我们使用了K近邻模型来预测每个建筑的楼层。思路是,如果一个区域有三个相似的值,那将有助于提高分数。就像Dan所做的那样,我们根据模型为每个楼层设置了路径点检测。

我们尝试了基线中提到的神经网络,效果不是很好。我们也尝试了线性回归,其结果与从头实现的模型输出相似。然后我们再次使用了MLP回归器。

结果显示,K近邻模型在测试数据上完美地识别出了楼层,这令人惊讶。同时,MLP回归器的路径点预测结果也如前所述。


挑战与未来工作 💡

数据质量仍然是一个重大挑战。即使我们有了一个有效的模型,能够将结果提交回Kaggle也是一项真正的挑战,因为我们使用的是预先聚合的数据集。

我们严重依赖Kaggle社区的帮助,因为有很多人分享了关于如何预处理数据或解决这些问题的各种想法。

我们面临的是一个序列数据问题。因此,对于未来的工作,我们计划实现循环神经网络作为模型。

众所周知,RNN在处理序列数据上比传统神经网络表现更好。在RNN中,神经网络不同层的节点被压缩形成单层。RNN的工作原理是保存特定层的输出并将其反馈给输入,以预测该层的输出。这可能有助于解决我们的序列数据问题。

RNN面临的一些问题包括梯度衰减(可以通过LSTM解决)和梯度消失(可以通过使用ReLU等激活函数解决)。因此,使用循环神经网络可能有助于解决序列数据问题。

下一步,我们将使用加速度计和陀螺仪作为新特征,结合循环神经网络。图表显示了每一步的步态检测以及加速度计的特征。红点代表人的步伐。


总结

在本教程中,我们一起学习了室内定位与导航项目的完整流程。

我们从项目背景和目标出发,了解了利用智能手机传感器数据实现精准室内定位的价值。

我们深入探讨了数据收集的挑战,特别是多传感器数据在时间和空间上不对齐带来的巨大预处理困难。

我们构建了基线模型,采用了简单的神经网络方法,并建立了包含楼层分类和坐标回归的完整预测流程。

通过详细的数据预处理(包括特征选择、缺失值处理和数据集整合),我们训练了K-Means楼层分类器和多层感知机路径点回归器。

我们发现K近邻模型在楼层分类上表现惊人,而MLP在坐标预测上取得了不错的效果(平均误差9.9个单位)。

最后,我们总结了项目面临的主要挑战(数据稀疏性、格式转换),并展望了未来方向——引入循环神经网络来处理数据的时序特性,并融合加速度计等更多传感器特征。

这个项目深刻地表明,在机器学习应用中,数据准备和预处理往往占据了绝大部分精力,是模型成功的基础。

078:胸部X射线异常检测 🩻

概述

在本节课中,我们将学习一个基于深度学习的胸部X光片异常检测系统。该系统旨在自动定位和分类X光图像中的异常区域,以辅助放射科医生进行诊断。我们将从项目背景、数据处理、基线模型构建,到最终的深度学习解决方案,系统地介绍整个流程。


项目背景与问题定义 🎯

上一节我们介绍了课程的整体目标,本节中我们来看看项目的具体背景和需要解决的问题。

现有的医学影像诊断系统通常只能给出分类结果,而无法精确定位异常所在的位置。这在临床诊断中可能产生误导,因为病灶的位置信息对于判断病情至关重要。

我们计划构建一个基于深度学习目标检测模型的自动化系统。该系统能够对胸部X光扫描图像中的异常进行分类定位。这可以为放射科医生提供有价值的第二意见,并有助于减少误诊。

我们使用的数据集来自越南的两家医院,包含约18,000张DICOM格式的胸部X光图像。其中15,000张用于训练,3,000张用于测试。训练图像已由经验丰富的放射科医生小组进行了标注。

以下是数据集中目标类别的概述,共有15个不同的类别,每个类别对应一种特定的异常或“无发现”状态:

  • 0: Aortic enlargement
  • 1: Atelectasis
  • 2: Calcification
  • 3: Cardiomegaly
  • 4: Consolidation
  • 5: ILD
  • 6: Infiltration
  • 7: Lung Opacity
  • 8: Nodule/Mass
  • 9: Other lesion
  • 10: Pleural effusion
  • 11: Pleural thickening
  • 12: Pneumothorax
  • 13: Pulmonary fibrosis
  • 14: No finding

数据集中类别分布高度不平衡,其中“无发现”(类别14)的样本数量远多于其他异常类别。


基线模型与特征工程 ⚙️

在明确了问题和数据后,我们首先尝试了一些传统的机器学习方法作为基线模型。本节将介绍我们如何进行特征工程并评估不同分类器的性能。

我们的基线模型主要解决分类任务。基本流程包括:将图像缩放至统一尺寸(823x927),将像素展平为特征向量,应用降维技术,最后使用分类器进行预测。

我们尝试了以下分类算法:

  • 卷积神经网络
  • 逻辑回归
  • 支持向量机
  • 多层感知机
  • 随机森林

我们使用了三种降维技术来减少特征数量并尝试提升模型性能:

  1. 主成分分析:我们选择了20个主成分,因为在超过20个后,所解释的方差比例增长非常有限。
    • n_components = 20
  2. LASSO回归:通过引入L1惩罚项,可以将某些特征的系数压缩至恰好为零,从而实现特征选择。我们最终保留了1316个特征。
    • 目标函数:Min(Σ(y_i - ŷ_i)^2 + λ * Σ|β_j|)
  3. 岭回归:通过引入L2惩罚项,可以将特征的系数压缩至接近零。这种方法保留了更多的特征(远多于LASSO)。
    • 目标函数:Min(Σ(y_i - ŷ_i)^2 + λ * Σβ_j^2)

以下是不同降维方法与分类器组合得到的性能结果(以准确率为例),所有模型均采用70/30的划分进行训练和测试:

  • PCA + 多层感知机: ~59%
  • LASSO + 支持向量机: ~58%
  • 岭回归 + 随机森林: ~57%

基线模型的性能普遍不高,最高准确率也未超过60%,且没有一种方法在所有评估指标上明显胜出。这表明传统的机器学习方法在处理此类复杂的图像分类任务上存在局限。


基于深度学习的解决方案 🧠

由于基线模型效果有限,我们转向了更强大的深度学习模型。本节将详细介绍我们用于分类和目标检测的卷积神经网络架构。

我们采用基于CNN的架构。CNN通常包含用于特征提取的卷积层和用于最终分类的全连接层。

数据预处理

首先对数据进行预处理。原始标注由三位放射科医生完成,共计约67,000条记录。由于他们的标注共识度很高,我们进行了去重,最终使用15,000张独立图像。我们使用PyTorch的DataLoader来批量加载数据,并将所有图像缩放至256x256。同时,需要根据缩放比例调整边界框的坐标:

  • scale_x = new_width / old_width
  • scale_y = new_height / old_height
  • 新坐标:x_new = x_old * scale_x, y_new = y_old * scale_y

为了增强模型泛化能力,防止过拟合,我们应用了数据增强,包括水平翻转和随机亮度/对比度调整。

分类模型

我们首先尝试了不包含定位的纯分类任务。使用了ResNet-18架构,其跳跃连接有助于在反向传播时梯度平滑流动。
我们训练了20个周期,最终训练准确率达到75%,测试准确率达到77%。这表明模型具有良好的泛化能力。训练损失曲线显示模型在学习初期快速下降,随后趋于平缓。

目标检测模型

对于需要同时定位和分类的任务,我们采用了Faster R-CNN目标检测模型。我们使用了在COCO数据集上预训练的模型,并在此基础上进行微调。

为了确保评估的稳健性,我们采用了分层五折交叉验证,以保证每个折叠中各类别的样本比例与整体数据集一致。

Faster R-CNN的工作流程如下:

  1. 使用ResNet等卷积骨干网络提取图像特征图。
  2. 区域提议网络在特征图上滑动窗口,生成一系列可能包含目标的锚框。
  3. RPN输出每个锚框的类别得分和边界框坐标修正值。
  4. 最终网络对提议区域进行分类和边界框精修。

我们使用平均精度均值作为评估指标。其核心是交并比,用于衡量预测框与真实框的重合程度:

  • IoU = Area of Overlap / Area of Union
    我们设定IoU阈值为0.5。若预测框与真实框的IoU大于0.5,则视为真正例;否则为假正例。

实验结果显示,在五折交叉验证中,mAP值大约在0.5至0.7之间波动,平均mAP约为0.64

我们将模型在测试集上的预测结果(包含图像ID、类别标签、边界框坐标和置信度)提交至Kaggle竞赛平台,获得的得分为0.21


总结与未来工作 📝

本节课中我们一起学习了构建一个胸部X光异常检测系统的完整流程。

我们首先分析了任务背景和数据特点,然后建立了传统的机器学习基线模型。在基线模型效果不佳的情况下,我们转向了深度学习方案,使用ResNet-18进行图像分类,并使用Faster R-CNN进行目标检测。分类模型取得了约77%的测试准确率,目标检测模型获得了约0.64的mAP值。

总结如下:

  1. 分类任务结果较好,模型未出现过拟合。
  2. 目标检测的mAP有提升空间。类别不平衡问题可能影响了检测性能。
  3. 传统方法在复杂图像任务上存在局限,深度学习模型展现出更大潜力。

对于未来工作,可以从以下几个方面进行改进:

  • 超参数调优:进一步微调学习率、批次大小等超参数。
  • 探索其他模型:尝试YOLO、RetinaNet等其他先进的目标检测架构。
  • 改进激活函数与正则化:使用LeakyReLU等激活函数或不同的正则化策略。
  • 处理类别不平衡:在损失函数中引入类别权重,或使用过采样/欠采样技术。

通过本项目的学习,我们掌握了将深度学习技术应用于实际医学影像分析的基本方法,并对模型开发、训练、评估的全过程有了更深入的理解。

079:Spotify百万播放列表挑战赛 🎵

在本节课中,我们将学习如何为Spotify的“百万播放列表挑战赛”构建一个音乐推荐系统。我们将探讨三种不同的方法:基于词向量(Word2Vec)的协同过滤、K最近邻(KNN)算法,以及一个结合了协同过滤与内容过滤的混合模型。


概述:挑战与数据集

Spotify用户非常喜爱创建播放列表,目前已有超过40亿个播放列表。每个播放列表都承载着用户的特定意图或情感。为了深入研究如何基于播放列表推荐歌曲,Spotify发布了“百万播放列表”数据集。

我们的核心挑战是:为数据集中一百万个播放列表的每一个,推荐500首新歌曲。系统必须能处理各种情况,例如:只有标题没有歌曲的播放列表、歌曲数量很少的播放列表、没有标题的播放列表,以及元数据不完整的播放列表。一个额外的挑战是:如果每个播放列表中有部分歌曲被隐藏,我们能否在推荐的500首歌曲中包含这些被隐藏的歌曲?

简而言之,输入是一个用户创建的播放列表(包含标题、曲目信息等元数据),输出是一个按相关性排序的、包含500首候选推荐曲目的列表。

为什么这个挑战很重要?推荐算法不仅用于音乐服务,还广泛应用于搜索引擎、文档校对等日常自动化任务中。一个优秀的推荐算法经过调整,可以解决完全不同的任务,推动更多繁琐工作的自动化进程。

该数据集包含一百万个由Spotify用户创建的播放列表,总计约200万首曲目,涉及超过30万名艺术家。每个播放列表包含标题和曲目信息。数据集的特别之处在于,它包含了1万个信息不完整的播放列表(例如只有标题,或只有少量曲目),部分曲目还被特意隐藏,增加了挑战性。

数据清洗是必要的步骤,因为原始数据集大小为33GB,被分割成1033个JSON文件。为了方便模型训练和测试,我们创建了一个方法,将JSON播放列表文件转换为CSV格式。转换后的文件不仅包含基本的元数据信息,还包含了通过Spotify API获取的额外信息,如歌曲流派、节奏、能量值等。


方法一:基于Word2Vec的协同过滤 🎧

上一节我们介绍了挑战的整体背景和数据集。本节中,我们来看看第一种方法:基于Word2Vec的协同过滤模型。

协同过滤的基本思想是:如果用户A和用户B喜欢许多相同的歌曲,那么用户A可能也会喜欢用户B喜欢的其他歌曲。这种方法不依赖于歌曲本身的特征(内容),而是基于用户行为的相似性。

在我们的实现中,我们将每个播放列表视为一个“句子”,将每首歌曲的ID视为“单词”。这样,我们就可以使用Word2Vec技术为每首歌曲生成一个向量表示。

我们采用了连续词袋模型(CBOW)。在这个无监督学习中,我们设定了一个“伪目标”:给定一首歌曲的上下文(即播放列表中它前面和后面的歌曲),来预测这首歌曲本身。通过训练,我们得到了一个从输入层到隐藏层的权重矩阵,这个矩阵最终为我们提供了每首歌曲的向量表示。

有了歌曲向量,我们就可以进行数学计算,例如计算向量之间的余弦相似度。相似度越高,表示两首歌曲越相似。

以下是使用该模型为单个播放列表寻找相似歌曲的步骤:

  1. 将目标播放列表中的歌曲转换为向量。
  2. 计算播放列表中歌曲向量与整个歌曲库中所有歌曲向量的余弦相似度。
  3. 根据相似度得分,返回最相似的500首歌曲。

为了直观展示,我们使用PCA和t-SNE将256维的歌曲向量降维到2维并进行可视化,可以观察到不同流派的歌曲会形成不同的簇。

该模型的优缺点如下:

  • 优点:其原理与Spotify等平台的实际推荐逻辑相似,对于包含大量歌曲的播放列表效果良好。
  • 缺点:无法处理没有任何歌曲的播放列表(冷启动问题),因为无法为空的“句子”生成有意义的向量。

方法二:K最近邻算法 🎼

上一节我们介绍了基于Word2Vec的协同过滤模型。本节中,我们转向另一种经典方法:K最近邻算法。

KNN算法根据特征之间的相似度(距离)对新数据点进行分类。对于一首待推荐的歌曲,算法会计算它与已知播放列表中所有歌曲的特征距离,然后根据其“邻居”(最相似的歌曲)的类别来进行推荐。

我们最初的做法是仅使用数字特征参数(如能量值、节奏)来构建特征数组,并为这些参数分配权重。但性能不佳。于是我们改进了方法,加入了歌曲流派信息。

我们将文本类型的流派(如“摇滚”、“流行”)转换为有组织的数字参数。相似的流派被赋予相近的数字编码(例如,摇滚和流行数字接近,乡村音乐则距离较远)。这样处理之后,模型的性能得到了提升。

以下是KNN模型的工作流程:

  1. 数据准备:从原始数据集和Spotify API获取数据,构建CSV文件。
  2. 特征矩阵构建:基于曲目ID、元数据(数字特征)和编码后的流派信息,构建一个特征矩阵。例如,对于1000个播放列表,我们可能得到一个有5000行(歌曲)和31列(特征)的矩阵,这是一个稀疏矩阵。
  3. 模型运行:将目标播放列表(不完整的播放列表)输入KNN模型。
  4. 输出结果:模型输出一个为该播放列表推荐的曲目列表。

我们测试了在不同“保留比例”下的模型命中率(Hit Rate)。保留比例是指将播放列表中一定比例的歌曲隐藏起来,只用剩余部分来训练模型,然后看模型能否在推荐列表中找回被隐藏的歌曲。

  • 当只用25%的歌曲时,命中率约为20%。
  • 当使用50%的歌曲时,命中率提升到40%-50%。
  • 当使用75%的歌曲时,命中率增长放缓,甚至略有下降,这可能是因为信息过多导致推荐不够精确,产生了一定的过拟合。

该模型的优缺点如下:

  • 优点:模型简单直观,在此前的播放列表补全竞赛中也有应用。
  • 缺点:KNN是一种“懒惰学习”算法,需要存储所有训练数据,在应对大规模数据时非常耗费时间和存储空间。为了更高效,它需要与其他分类模型结合使用。

方法三:混合推荐模型 🤖

前面两节我们分别介绍了协同过滤和基于内容的KNN方法。本节中,我们来看一个结合两者优势的混合模型。

这个混合模型针对两种不同情况采取不同策略。

情况一:播放列表仅有标题
这种情况下,我们严格使用协同过滤。

  1. 关键词提取:从标题中提取连续的单词组合。例如,“我的超棒Eminem播放列表”会提取出“我的”、“超棒”、“Eminem”、“播放列表”、“我的超棒”、“超棒Eminem”、“Eminem播放列表”等。
  2. 关键词评估:用小样本用户播放列表测试每个关键词,根据歌曲在流派和艺术家上的接近程度,为每个关键词生成一个相关性数值。例如,“Eminem”和“Eminem播放列表”是强相关关键词,而“我的”、“超棒”则相关性较弱。
  3. 搜索与推荐:按照关键词的相关性顺序,搜索包含这些关键词的用户播放列表,提取其中的歌曲作为推荐候选,并记录相关艺术家的名字以扩展搜索。

情况二:播放列表既有标题又有歌曲
这种情况下,我们结合协同过滤和内容过滤。

  1. 协同过滤步骤:提取播放列表中所有艺术家的名字,搜索包含这些艺术家的用户播放列表,并记录其中出现的歌曲及其频率(存入collab_tracks字典),同时也记录这些歌曲的艺术家及其频率(存入collab_artists字典)。
  2. 内容过滤步骤:对每首候选歌曲进行评分,评分标准包括:
    • 流派/年份/艺术家:看该歌曲的流派/年份/艺术家在原始播放列表中的常见程度(频率)。
    • 音频特征(如节奏、能量值):为播放列表的每个音频特征中位数创建一个区间,检查候选歌曲的特征值是否落在区间内。
    • 协同过滤贡献:检查候选歌曲的艺术家是否在collab_artists中高频出现,歌曲本身是否在collab_tracks中高频出现。

该模型的目标是在流派、艺术家、音频特征等多个维度上“镜像”原始播放列表的特征分布。例如,对于一个播放列表,我们希望推荐的500首歌在各类流派上的比例与原始列表尽可能接近。

该模型的优缺点如下:

  • 优点:能够从多个维度综合模拟目标播放列表的特征,应对信息不完整的播放列表。
  • 缺点:在找回被隐藏歌曲的命中率上表现不稳定,有时很高,有时较低。此外,初始运行速度较慢。

模型比较与总结 🏆

现在,让我们比较一下上述模型在一个具体播放列表(ID为0)上的表现。该播放列表有53首歌,其中27.4%来自Jesse McCartney, Chris Brown, Beyoncé等艺术家。

我们比较了在不同数量歌曲被隐藏(保留比例不同)的情况下,KNN模型和混合模型的命中数:

  • 隐藏40首歌(用13首训练):KNN命中9首,混合模型命中6首。
  • 隐藏27首歌(用26首训练):KNN命中11首,混合模型命中12首。
  • 隐藏14首歌(用39首训练):KNN命中7首,混合模型命中5首。

可以看到,在数据量很少(25%保留率)时,KNN表现更好;但当数据量增多时,两者表现相近。我们使用R-precision(命中数/隐藏歌曲总数)作为评估指标。

最终,我们向竞赛提交了结果。虽然初次提交在30个参赛作品中排名第17位,但仍有提升空间。

总结与挑战
在本节课中,我们一起学习了为Spotify百万播放列表挑战构建推荐系统的三种方法。

  • 模型推荐:我们建议结合KNN或Word2Vec与混合模型,先进行粗筛,再用混合模型进行精细排序。
  • 遇到的挑战
    1. 数据集规模:33GB的数据处理对计算资源要求很高。
    2. 数据转换:将JSON文件转换为便于处理的CSV格式耗时较长。
  • 未来改进:如果重新设计,我们推荐采用两阶段架构:第一阶段用快速模型检索出少量候选歌曲;第二阶段用学习排序模型,专注于优化推荐歌曲在列表中的顺序。

通过这次挑战,我们不仅实践了推荐算法,也深刻体会到将机器学习应用于解决实际、大规模问题时所面临的挑战与乐趣。

080:P80_AI乐队的音乐目录多标签分类 🎵

在本节课中,我们将学习一个关于音乐目录多标签分类的实际项目。该项目旨在解决一个在线挑战:如何根据音乐曲目的特征,为其分配多个标签(如流派、情绪、乐器等)。我们将从项目背景、数据处理、多种模型尝试到最终优化策略,系统地回顾整个流程。


项目背景与动机 🎯

上一节我们介绍了项目的基本情况,本节中我们来看看项目的具体动机和目标。

我们的项目源于一个在线挑战,其目标是为制作音乐库中的曲目自动分配标签。这与上一个项目(为预定义的播放列表分配标签)恰好相反。

该项目的动机是,一家公司已经拥有一个神经网络,该网络能够为每首曲目生成一个独热编码向量,该向量关联着多个不同的类别(如流派、情绪、乐器等)。这本质上是一种对特定标签的模糊分配。

然而,公司需要能够根据神经网络的输出,以离散的方式精确决定为每首曲目分配哪些标签。他们尝试了最朴素的方法——直接对神经网络的输出进行阈值处理,但效果不佳。

他们提出,如果能够利用输入之间以及输出标签之间的相关性,或许可以获得更好的结果。因此,我们决定采用分类器来完成这项任务。

该挑战的目标是:定义一个分类器,将公司神经网络为每个标签生成的原始概率或模糊值,转换为关于是否分配该标签的实际决策。评估我们模型性能的指标是加权F1分数

我们尝试了大约五到六种不同的模型,进行了大量调优,试图找出最佳方案。


数据集概览 📊

上一节我们明确了项目目标,本节中我们来看看所使用的数据集。

数据看起来是这样的:它包含大约90到100种乐器和流派,以及其他一些类别,总共约250个标签。输入特征的数量几乎与输出标签一样多。

输入数据实际上被分成了几大类。它并非网络随机选择的特征,而是由公司神经网络提取的、与标签对应的特征。每一列对应一个标签。

输出同样是为每首曲目分配多个标签,因此这成为一个多标签分类问题。从动机角度看,这类问题在许多其他场景中也很有用,例如图像分类、分割和检测算法。一旦一个音频文件中有多个不同物体发出声音,或者任何类似情况,就会变成多标签检测问题。这类问题的准确率往往略低于二分类问题。

以下是数据的具体结构:

  • 数据以CSV文件形式提供。
  • 每一列代表一个标签或类别的特征。
  • 神经网络为每个标签的输出是一个介于0和1之间的值。

因此,几乎不需要进行数据预处理或清洗。我们只需将其加载到NumPy或scikit-learn中即可。

输出变量是类似的,但它们是二进制的(经过阈值处理)。有趣的是,测试集的输出对我们来说是隐藏的。我们拥有训练集的输出,但必须将测试集输入数据的结果提交到网站,才能获得测试集的F1分数。正如我们稍后将看到的,即使是留K折交叉验证的训练分数与实际测试分数之间也存在显著差异。

我们的数据集在标签分布上相对平衡,没有某个标签占据绝大部分空间的情况。当然,加权F1分数本身就有处理标签不平衡的内在方法。


基线模型与初步尝试 🔬

上一节我们了解了数据集,本节中我们来看看最初尝试的几种模型。

我们使用的基线模型非常简单:二元“一对多”分类器。我们也尝试了其他模型,但这是我们能想到的最简单、最好的基线。

具体做法是:我们采用逻辑回归(一种二分类器),并将其应用于每个标签,将该标签作为正类,所有其他标签作为负类。这是处理多标签分类最朴素的标准方法,称为一对多

这种方法需要为每个标签创建一个分类器,速度较慢,并且没有利用已分配标签之间的任何相关性。因此,其加权F1分数可能相当低。在实际测试数据上,它的分数约为0.37。


方法一:转换为多类分类问题

以下是第一种尝试的方法:

  • 我们将多标签分类问题转换为多类分类问题。
  • 具体做法是寻找标签的唯一组合,并将其视为一个单独的类别。
  • 这种方法非常朴素,因为标签组合的数量可能非常庞大。在我们的案例中,有998,537种唯一的标签组合。
  • 训练模型耗时极长,且获得的F1分数仅为0.233,甚至低于我们的基线模型。因此,我们甚至没有将此模型提交到网站。

方法二:改进的“一对多”分类器

我们继续采用“一对多”方法,尝试使用更多模型来改进基线。

  • 我们使用了类似的二元“一对多”分类器,为每个标签单独训练整个数据集。
  • 我们使用了高斯朴素贝叶斯和逻辑回归分类器,并分别进行了超参数调优。
  • 在提供的测试数据上,我们获得的最佳结果是0.528。
  • 当我们将模型提交到网站时,得到了0.397的分数,这比之前实现的逻辑回归分类器有了一些改进。

方法三:链式分类器

第三种方法是作为对“二元关联”方法的改进而尝试的。“二元关联”方法没有考虑标签之间的相关性。

  • 我们决定使用链式分类器方法,其中不同的分类器按链式顺序训练,同时考虑标签之间的相关性。
  • 第一个分类器仅使用数据集训练来预测标签Y1。
  • 第二个分类器则将标签Y1作为特征,与数据集一起用于预测标签Y2,以此类推。
  • 这种方法旨在保持标签之间的相关性。
  • 我们再次使用了逻辑回归和高斯朴素贝叶斯分类器,其中高斯朴素贝叶斯获得了最佳结果。
  • 测试加权F1分数为0.358,但提交后得到的分数较低,为0.3。

列式分类与神经网络尝试 🧠

上一节我们尝试了几种基于标签相关性的方法,本节中我们来看看从不同角度处理问题的方法。

在尝试了多种多类分类方法后,我们思考是否可以换一个完全不同的角度来看待数据。既然前三种方法都没有给出相当好的结果,我们决定尝试列式分类

第一种列式分类方法是:我们只考虑音乐标签和交叉标签,为每个音乐标签独立构建一个分类器,而不考虑其他标签,以观察这种方法的得分情况。

我们尝试了逻辑回归和高斯朴素贝叶斯。首先,我们尝试了正则化参数为1.0的逻辑回归(所有分类器的默认值),这相当于构建了249个分类器,准确率为0.36。经过超参数调优后,高斯朴素贝叶斯得到0.35,逻辑回归得到0.37。这是列式分类的第一种方法,结果略有提升。

我们继续采用“二元关联”方法,但这次没有使用所有输入特征,而是只尝试预测与输出标签对应的那41个特征。训练集中有290个特征,标签有249个。网站为我们提供了41个额外的训练数据列。我们尝试将这41个特征与对应的输入一起使用,为每个标签构建分类器。不幸的是,分数仍然下降了。逻辑回归的最高准确率为0.135,高斯朴素贝叶斯为0.134。

于是,我们转向尝试神经网络。


神经网络实验

基于之前的逻辑回归等工作,我们尝试了神经网络,使用二元交叉熵损失进行优化,并关注F1分数。

我们进行了大量实验。由于输入数据是公司神经网络生成的一些结果,我们尝试了以下方案:

  1. 使用全部289个输入特征:零隐藏层(本质上就是逻辑回归)确实能获得更好的性能,但使用一个隐藏层效果不佳。
  2. 仅使用前248个标签相关特征:我们认为最后41列可能是某种类别信息,而非确切的输入标签。仅使用前248个特征作为输入,预测对应的248个标签,通过逻辑回归获得了0.41的提交F1分数。
  3. 单特征列式预测:考虑到输入和输出数据有重叠,且0和1的均值和方差非常相似,仅使用单一特征难以区分。因此,我们增加了输入维度,构建了非常简单的神经网络:一个包含三个神经元的隐藏层。我们为248个标签分别训练了这样的微型网络,由于参数很少,训练速度很快,最终提交获得了0.44的F1分数。
  4. 按类别分组预测:考虑到音乐可以同时具有多种情绪(如快乐和自信),我们将94种流派、112种乐器和46种情绪分别分组进行预测。这种方法获得了更好的F1分数:0.45。

随机森林模型与优化 🌲

上一节我们探索了神经网络,本节中我们来看看另一个强大的模型——随机森林。

随机森林分类器是一种集成模型,由大量决策树组成。它准确、稳健,且不易过拟合。该模型的工作原理分为四个步骤:

  1. 从给定数据集中随机选择样本。
  2. 为每个样本构建一棵决策树。
  3. 每棵决策树产生一个结果。
  4. 模型选择得票最多的预测结果(多数投票)。

我们将此方法应用于项目,初始结果为0.3632。


优化技巧一:列式阈值处理

分类器的输出是0到1之间的概率值。我们需要将这些概率转换为二进制的0或1,以便计算F1分数。默认阈值是0.5,但这可能不是最佳选择。

我们采用了列式阈值搜索策略来提升性能:

  • 为每个标签单独搜索最佳阈值。
  • 首先以步长0.1在0到1之间搜索,得到一个初始阈值。
  • 然后以步长0.01在初始阈值附近进行精细搜索,以减少误差。
  • 将此方法与随机森林分类器结合后,F1分数提升至0.4565。

优化技巧二:超参数调优

scikit-learn提供了大量超参数。这个过程非常耗时,因此我们无法调整所有参数。我们选择了几个重要参数进行调优:bootstrapmax_depthmax_featuresn_estimators

我们获得了最佳参数设置:bootstrap=Truemax_depth=50max_features='sqrt'n_estimators=300。应用此模型后,加权F1分数达到0.4650。


关键发现与总结 🏆

基于以上所有模型,我们总结出以下关键发现:

  1. 情绪标签的影响:在流派、乐器和情绪三个类别中,我们发现情绪标签(约46个)包含的噪声在一定程度上降低了模型准确性。这部分标签来自网站公司的模型,其信息可能不够准确。
  2. 列式/标签式处理的有效性:我们使用了10种不同的模型和策略分析数据,发现列式或标签式处理可以提高准确率或F1分数。
  3. 阈值处理的重要性:合适的阈值处理对于获得高F1分数至关重要。
  4. 最佳模型:结合了列式阈值处理和超参数调优的随机森林模型表现最佳,在公开排行榜上获得了0.45的F1分数,位列第二。

从这个项目中,我们可以学习到如何选择模型、如何优化参数,以及面对多标签分类问题时,列式处理有时会大有帮助。在未来的项目中,如果遇到类似数据,我们可以考虑如何使用列式处理和阈值技术。


团队贡献与材料

团队成员的贡献基本均等。我们使用了协作看板,分配了超过50项任务,每个人都完成了自己的任务。代码托管在GitHub上,每个人都有自己的分支并上传了模型。

在挑战数据的公开排行榜上,我们的最佳成绩是第二名。我们还提交了其他一些模型,也取得了不错的分数。我们还将提交一份项目报告。团队通过Discord群组进行了大量交流,尝试了超过1000次聊天,举行了5次视频会议和超过20次模型讨论,真正实现了资料共享和信息记录。


本节课中,我们一起学习了一个完整的多标签分类项目实战。我们从理解业务背景和数据处理开始,逐步尝试了从简单的逻辑回归、链式分类器到神经网络和随机森林等多种模型,并深入探讨了列式处理、阈值优化和超参数调优等关键技巧。通过团队协作和不断迭代,我们最终取得了显著的成果,并总结了宝贵的实践经验。希望本教程能帮助你理解多标签分类问题的解决思路与方法。

081:宠物寻找器项目演示

在本教程中,我们将学习一个名为“宠物寻找器”的机器学习项目。该项目旨在通过分析宠物照片的吸引力,帮助提高动物收容所中宠物的领养率。我们将从项目动机开始,逐步介绍数据处理、模型构建、结果分析以及面临的挑战。

动机与问题定义

每年,美国有超过90万只宠物(包括猫和狗)因无人领养而被安乐死。PetFinder 是一个在线领养平台,用户可以通过浏览宠物照片来寻找领养对象。平台目前使用一个基础模型为上传的宠物照片评分,该分数被称为“流行度”或吸引力分数。

我们的核心问题是:如何让宠物照片更具吸引力,从而提高其被领养的可能性? 更具体地说,我们需要构建一个模型,能够根据输入的宠物图像预测其吸引力分数(一个介于1到100之间的值),并以R²分数作为主要评估指标。

数据探索

我们获得了两种类型的数据:图像数据和元数据。

元数据:一个包含9000多条记录的表格,每条记录对应一张图像,描述了图像的特征。这些特征大多是二进制的(0或1),例如:

  • subject_focus: 宠物是否对焦清晰。
  • eyes: 眼睛是否清晰可见。
  • face: 面部是否清晰。
  • near: 宠物是否离镜头近。
  • action: 宠物是否在活动。
  • accessory: 是否有配饰。
  • group: 是否有多只宠物。
  • collage: 是否是拼贴画。
  • human: 是否有人类出现。
  • blur: 图像是否模糊。
  • popularity: 目标变量,吸引力分数。

图像数据:超过9000张原始的宠物照片。

以下是数据的关键观察结果:

  • 吸引力分数(popularity)的分布集中在20-40分之间,少数图像分数接近100。
  • 通过相关性分析发现,目标变量popularity与各个特征之间的相关性非常弱。然而,特征之间本身存在一些相关性,例如face(面部)和eyes(眼睛)呈正相关。
  • 数据没有缺失值和明显的异常值。

上一节我们了解了数据的概况,接下来我们看看如何为模型训练准备这些数据。

数据预处理与增强

对于元数据,由于已是规整的数值数据且无缺失,我们直接将其用于模型输入。

对于图像数据,我们进行了标准化预处理,包括调整图像尺寸和像素值归一化。

数据增强是提升模型泛化能力的关键步骤。然而,由于我们的元数据包含了对图像内容的具体描述(如是否模糊、是否靠近镜头),我们不能使用会改变这些语义信息的增强方式。

以下是我们可以安全使用的图像增强技术列表:

  • 随机旋转:将图像旋转一个随机角度。
  • 水平/垂直翻转:沿轴线翻转图像。
  • 色彩调整:微调图像的对比度、亮度和饱和度。

这些变换不会实质性地改变“模糊”、“靠近”等元数据标签所描述的状态。例如,对一张“清晰”的图片进行小幅旋转,它仍然是一张“清晰”的图片。

模型构建与实验

我们尝试了多种模型,从基线模型开始,逐步过渡到更复杂的架构。

基线模型:基于元数据的回归

首先,我们仅使用元数据训练模型,将其视为一个回归问题。我们尝试了多种经典机器学习模型:

  • 线性回归
  • Lasso回归
  • 随机森林回归
  • 支持向量回归(SVR)

这些模型的表现都不理想,测试集R²分数大约在0.20到0.21之间。随机森林表现稍好,但预测值倾向于集中在平均值附近,说明元数据本身对吸引力分数的预测能力有限。

我们还尝试了一个简单的人工神经网络(ANN),结果类似(R²约0.203),未能显著提升。

图像模型:卷积神经网络

鉴于元数据效果不佳,我们转向图像数据本身。我们首先构建了一个基础的卷积神经网络(CNN),但效果甚至比元数据模型更差。

于是,我们采用了预训练的深度学习模型,利用它们在大型图像数据集上学到的通用特征。

  • ResNet-50:一个包含50层残差块的经典CNN模型。公式上,残差块实现了恒等映射:H(x) = F(x) + x,这有助于缓解深层网络的梯度消失问题。
  • EfficientNet-B0:通过复合缩放(Compound Scaling)统一优化网络深度、宽度和分辨率的高效模型。其设计原则可以概括为寻找最优的复合系数φ:Depth: d = α^φ, Width: w = β^φ, Resolution: r = γ^φ,其中α, β, γ是通过网格搜索确定的常数。

使用5折交叉验证进行评估,ResNet-50取得了显著更好的效果,平均验证R²分数约为0.193,远高于基线模型。

集成模型:结合元数据与图像

为了充分利用所有可用信息,我们构建了集成模型,将元数据模型(ANN)和图像模型(ResNet-50或EfficientNet)的输出进行融合。

集成模型的架构如下:

  1. 元数据分支:输入元数据,经过L2正则化和多个全连接层(Dense Layers)处理。
  2. 图像分支:输入增强后的图像,通过预训练的CNN(如ResNet-50)提取特征,接全局平均池化层和全连接层。
  3. 融合层:将两个分支的输出向量拼接(Concatenate)起来。
  4. 预测层:在拼接后的向量上添加额外的全连接层,最终输出预测的吸引力分数。

这种架构允许模型同时从图像视觉内容和结构化元数据中学习信息。

探索性模型:视觉Transformer(ViT)

我们还探索了前沿的视觉Transformer模型。与CNN主要关注局部特征和纹理不同,Transformer模型通过自注意力(Self-Attention)机制能够捕捉图像中所有区域(包括背景)之间的全局依赖关系。

简要原理:

  1. 将输入图像分割成一系列不重叠的图像块(Patches)。
  2. 将每个图像块线性投影为一个向量,并加上位置编码。
  3. 将得到的向量序列输入标准的Transformer编码器。编码器核心是多头自注意力层,其计算可表示为:Attention(Q, K, V) = softmax(QK^T / √d_k)V,其中Q(查询)、K(键)、V(值)均来自输入序列本身。
  4. 在序列前添加一个可学习的分类标记([CLS] token),其最终状态用于回归预测。

结果与挑战

结果总结

下表总结了不同模型在验证集上的平均R²分数(基于交叉验证):

模型 平均验证R²分数 说明
随机森林(仅元数据) ~0.204 基线模型
ResNet-50(仅图像) ~0.193 最佳单图像模型
EfficientNet-B0(仅图像) ~0.094 表现一般
集成模型(ResNet-50 + ANN) ~0.188 我们获得的最佳结果
集成模型(EfficientNet + ANN) ~0.142 次于ResNet集成

集成模型(ResNet-50 + ANN)取得了我们最好的成绩,在Kaggle竞赛私有排行榜上获得了约0.188的R²分数。视觉Transformer模型仍在实验和调优中。

面临的主要挑战

在项目过程中,我们遇到了以下挑战:

  1. Kaggle环境配置:在Kaggle Notebook中协调代码、依赖和GPU资源时遇到了不少技术问题。
  2. 团队协作:作为忙碌的学生,我们利用Kanban板进行任务管理和每周同步会议,以保持项目进度。
  3. 从分类到回归的思维转换:初期不熟悉如何将常用于分类的神经网络(如使用Softmax输出)适配用于回归任务。
  4. 探索新架构:理解和实现EfficientNet、视觉Transformer等相对新颖的模型需要投入大量学习时间。

未来工作与总结

未来工作方向

尽管取得了一定进展,仍有改进空间:

  • 处理类别不平衡:吸引力分数的分布不均匀(低分样本多)。未来可以尝试为不同分数区间的样本赋予不同的权重(样本权重),让模型更关注稀有高分样本。
  • 探索更先进的Transformer:如Swin Transformer,它在多项视觉任务中展现了卓越性能,可能带来精度提升。
  • 进一步调优:对现有最佳集成模型进行更细致的超参数优化和训练技巧调整。

课程总结

在本节课中,我们一起学习了“宠物寻找器”项目的完整流程。我们从实际问题出发,进行了数据探索与分析,并系统性地尝试了从传统回归模型、卷积神经网络到集成模型乃至视觉Transformer等多种机器学习方法。结果表明,结合了预训练图像特征和元数据的集成模型效果最佳。这个过程不仅锻炼了我们的建模能力,也深刻体现了处理真实数据、团队协作和探索新技术的挑战与乐趣。

082:脑肿瘤分类与MGMT启动子甲基化预测 🧠

在本教程中,我们将学习如何利用机器学习,特别是深度学习模型,通过脑部核磁共振(MRI)图像来预测胶质母细胞瘤中MGMT启动子的甲基化状态。这是一个关键的生物标志物,能帮助判断患者对化疗的敏感性,从而指导个性化治疗。

背景与问题定义

大脑是人体最复杂的器官,负责感知、思维等多种功能。有时,大脑细胞会因基因突变而失控生长,形成肿瘤。脑肿瘤可分为良性或恶性,也可根据起源分为原发性(始于大脑)或继发性(从身体其他部位扩散而来)。存在超过150种脑肿瘤,本教程重点关注胶质母细胞瘤

胶质母细胞瘤是一种侵袭性很强的恶性肿瘤,在成年人中最为常见。其治疗方法包括手术、放疗和化疗。本项目的核心是预测MGMT启动子甲基化状态。MGMT是一种DNA修复酶,如果肿瘤细胞的MGMT启动子被甲基化(即“沉默”),则其对化疗药物替莫唑胺更敏感。因此,预测MGMT状态是评估治疗效果和预后的独立有利因素。

传统上,这需要通过手术获取肿瘤组织进行活检分析,过程具有侵入性且耗时。我们的目标是开发一个模型,仅通过患者的MRI扫描图像就能预测MGMT状态,从而实现更快速、非侵入性的诊断。

数据集介绍

我们使用的数据集来自一项回顾性研究,收集自多家机构。由于成像协议不同,数据存在异质性。根据竞赛要求,数据分为三个队列:

  • 训练集:用于训练模型。
  • 验证集:用于调整模型。
  • 测试集:由竞赛主办方私有持有,用于最终评估模型。

每个病例包含四种不同类型的MRI序列图像:

  1. FLAIR
  2. T1w(平扫)
  3. T1wCE(对比增强,注射钆造影剂后)
  4. T2w

这些序列从不同物理特性(如弛豫时间)突出显示脑组织,有助于识别肿瘤的不同特征(如水肿、增强区域)。

对于每位患者,每种序列都提供了一系列2D切片图像。初始和末尾的切片可能为空白,因此我们通常从中间选取连续的切片进行处理。基于此数据集,我们可以执行两类任务:

  • 自动肿瘤亚区分割:识别并分割肿瘤的不同子区域。
  • MGMT启动子甲基化状态分类:本项目的主要任务,即预测MGMT是“甲基化”还是“非甲基化”。

方法概述:从经典机器学习到深度学习

为了完成分类任务,我们尝试了多种方法。首先,我们建立了一些经典的机器学习模型作为基础。随后,为了追求更高的性能,我们转向了更先进的深度学习模型。

经典机器学习流程

以下是我们在经典机器学习方法中遵循的标准流程。

数据预处理与特征工程
首先,我们对原始数据进行了清洗和准备。我们发现有三名患者的图像数据不完整,因此将其从训练集中移除,最终剩下582个样本。预处理步骤包括:

  • 将图像转换为数值数组。
  • 从每种序列的中间选取固定数量(如20张)的切片。
  • 将所有图像缩放至统一尺寸(如256x256像素)。

经过预处理,每个样本的特征维度非常高(例如约37万个特征)。为了应对“维数灾难”,我们采用了主成分分析(PCA)进行降维。我们从每种图像类型的特征中提取前100个主成分,然后将它们合并,最终得到一个维度为 (样本数, 400) 的特征矩阵。

模型训练与比较
在降维后的特征上,我们训练并比较了七种经典的分类算法:

  1. 逻辑回归
  2. 决策树
  3. 支持向量机(SVM)
  4. K近邻(KNN)
  5. 随机森林
  6. 梯度提升
  7. 多层感知机(MLP)

我们使用ROC曲线下面积(AUC)、准确率、精确率和召回率等指标来评估这些模型的性能。

深度学习模型:卷积神经网络(CNN)基线

在探讨了经典方法后,我们引入深度学习模型。首先,我们建立一个简单的卷积神经网络作为性能基线,用以判断后续更复杂模型是否带来了实质提升。

卷积神经网络是处理图像数据的标准选择,因为它能有效提取图像的局部空间特征。其核心操作是卷积,使用一个小的滤波器(kernel)在图像上滑动,计算局部区域的加权和,从而生成特征图。公式可以简化为:
输出特征图 = 卷积(输入图像, 滤波器) + 偏置

我们使用PyTorch库实现了一个简单的CNN基线模型。该模型包含3个卷积层,使用ReLU激活函数和最大池化层。为了保持基线模型的简单性,我们没有进行复杂的超参数调优。优化器选择了Adam。

先进的深度学习架构

基线CNN模型的结果并不理想,这促使我们尝试更强大、更高效的现代网络架构。然而,由于计算资源有限,我们选择了两个在ImageNet数据集上预训练的优秀模型进行迁移学习。

EfficientNet
EfficientNet通过一种复合缩放方法,均衡地调整网络的深度、宽度和分辨率,在计算效率和准确率之间取得了良好平衡。我们将其作为特征提取器。

ResNet50
ResNet50引入了残差连接,允许梯度直接流过网络,有效缓解了深度网络中的梯度消失问题,使得训练非常深的网络成为可能。

我们的实现方案

  1. 输入处理:对于每位患者,我们从四种MRI序列中各取中间20张切片,分别处理。每张图像被缩放至224x224像素。
  2. 模型调整:我们移除了预训练模型顶部的分类层,将其输出连接到一个自定义的小型分类网络(通常包含全连接层和Dropout层)。
  3. 训练:我们冻结了预训练模型的大部分底层参数,只训练顶部的自定义层和模型最后几层,以适应我们的脑肿瘤MRI数据。

结果与分析

现在,让我们来看看不同方法所得到的结果。

经典机器学习结果
在经典机器学习模型中,支持向量机(SVM)取得了相对最好的性能,AUC约为59%,准确率、精确率和召回率均在0.6左右。这表明经典方法有一定的预测能力,但性能有限。

CNN基线模型结果
我们实现的简单CNN基线模型,其表现并不比随机猜测(抛硬币)好。这可能是由于模型过于简单、缺乏调优,或者输入数据处理方式(如使用单张切片而非3D体积)未能充分利用数据信息。

EfficientNet与ResNet结果
我们绘制了不同MRI序列(T1w, T1wCE, T2w, FLAIR)上使用EfficientNet训练时的损失曲线和AUC曲线。

  • 在部分序列上,训练损失和验证损失曲线接近,AUC曲线也有重叠,表明模型有一定学习能力。
  • 但在另一些序列上,验证损失远低于训练损失,或AUC曲线出现抖动且不重叠,这可能是过拟合的迹象,即模型过度记忆了训练数据中的噪声,而未能很好地泛化到新数据。
    最终,我们获得的分类准确率最高约为57%,未能显著超越经典SVM模型,也低于该竞赛中优胜队伍约66%的准确率。

讨论与未来方向

我们的项目结果表明,直接将在自然图像(如ImageNet)上预训练的模型应用于医学影像(MRI)存在挑战。医学影像在纹理、对比度和关键特征尺度上与自然图像差异很大。此外,我们的实现可能存在以下局限:

  1. 数据利用不足:仅使用中间20张2D切片并简单堆叠成3D输入,可能丢失了重要的三维空间上下文信息。
  2. 模型与数据不匹配:预训练模型的特征提取器可能不完全适用于MRI图像的独特模式。
  3. 计算限制:由于资源有限,我们无法对大型模型进行充分的从头训练或精细调优。

未来改进方向

  • 使用3D CNN:直接处理整个3D MRI体积数据,以更好地捕捉空间关系。
  • 领域自适应:采用更先进的迁移学习或领域自适应技术,让模型更好地适应医学影像域。
  • 多序列融合:设计更有效的架构来融合四种MRI序列的信息,而不是单独处理。
  • 数据增强:使用针对医学影像的数据增强策略来增加训练数据的多样性。
  • 尝试时序模型:如将切片序列视为时间序列,使用RNN或Transformer模型进行处理。

总结

在本教程中,我们一起学习了如何利用机器学习进行脑肿瘤生物标志物(MGMT启动子甲基化状态)的分类预测。我们从问题背景和临床意义出发,介绍了所使用的多序列MRI数据集。随后,我们详细讲解了从经典机器学习(包括PCA降维和SVM等分类器)到深度学习(包括简单的CNN基线、EfficientNet和ResNet50)的完整技术流程。通过分析结果,我们认识到将通用计算机视觉模型应用于专业医学影像领域所面临的挑战,并探讨了可能的解决方案和未来方向。尽管我们的模型性能有待提高,但这个过程清晰地展示了AI辅助医疗诊断的潜力和实际工作中需要考虑的关键因素。

083:NFL健康与安全-头盔分配项目教程 🏈

在本教程中,我们将学习如何构建一个自动化系统,用于检测美式橄榄球比赛视频中的球员头盔,并识别潜在的碰撞事件。我们将涵盖从数据处理、模型选择、训练评估到最终集成的完整流程。


项目动机与数据概述

上一节我们介绍了项目的背景,本节中我们来看看我们使用的具体数据。

NFL(国家橄榄球联盟)自1920年成立以来,已成为全球最成功和受欢迎的体育联盟之一。多年来,联盟一直致力于提升比赛安全性,因为存在大量运动相关损伤。NFL与亚马逊云服务(AWS)合作,希望解决一个工程挑战:自动化其目前手动标注球员并分配ID的流程。这是一个非常耗时的过程。我们的目标是能够正确分配球员头盔,并准确识别它们何时发生碰撞。

我们被提供了MP4格式的视频数据。这些视频是时间同步的,包含两个视角:一个来自边线区域,一个来自端区区域。视频以每秒40帧录制。此外,还提供了一个辅助数据集用于更好的检测,该数据集包含带有头盔标注框的图像,总计近10,000张图像,其中约8,000张用于训练,近2,000张用于测试。

数据还提供了详细的球员追踪信息。以下是追踪数据包含的核心信息:

  • 球员位置(X, Y坐标)
  • 球员移动方向
  • 球员旋转/朝向
  • 端区和边线视角
  • 总计超过53,000条追踪数据记录

下图展示了边线和端区的视角图像示例。

模型将在5个未公开的视频上进行评估。一个棘手之处是,官方提供的测试集是我们训练集的一个子集,因此我们需要确保我们的方法不会在测试集上过拟合。


探索性数据分析与预处理

在深入模型之前,我们需要对数据进行理解和清洗。以下是我们在探索性数据分析(EDA)中关注的关键点:

  • 游戏起始点(开球):视频在开球前就开始录制。我们裁剪掉开球前的帧,以去除无关信息。
  • 场上与场外人员:在边线视角中,镜头外可能包含替补队员、教练等。我们只关心每队上场的11名球员。
  • 球员数量一致性:在某些帧中,可能看不到全部22名球员,因为镜头可能只聚焦在持球区域。我们需要确保模型能处理这种情况。
  • 头盔尺寸变化:由于镜头缩放,头盔在图像中覆盖的像素面积变化很大,最大约5928像素,最小仅9像素,大多数在150像素左右。

为了进行球员追踪,我们从每个视频中提取帧。我们使用FFmpeg工具来高效提取帧,避免一次性加载所有数据到内存。通过分析球员的X, Y坐标(如下图所示),我们可以追踪每个球员在连续帧中的移动,这对于后续的碰撞判断至关重要。


模型架构与组件

我们的目标不仅仅是检测物体(头盔),还要在视频序列中追踪它们并判断碰撞。因此,我们采用了多模型协作的管道(Pipeline)。整个流程如下图所示,接下来我们将分解其中的关键组件。

1. 基线模型:YOLO(You Only Look Once)

对于目标检测任务,我们选择了YOLO模型。YOLO是一种强大且高效的单次目标检测算法,能够快速在图像中定位和分类物体。

在YOLO中,图像被划分为S×S的网格。每个网格单元负责预测B个边界框(Bounding Box)。每个边界框包含以下信息:

  • 中心坐标(bx, by)
  • 宽度和高度(bw, bh)
  • 该框包含物体的置信度(pc)
  • 物体类别概率(c1, c2, ..., ck)

公式:边界框预测
每个网格单元的预测输出是一个长度为 B * (5 + C) 的张量,其中5代表(pc, bx, by, bw, bh),C是类别数量。

2. 追踪组件:Deep SORT

由于我们的数据是视频,我们需要追踪帧与帧之间的同一球员。我们使用了Deep SORT算法,它结合了:

  • 卡尔曼滤波(Kalman Filter):用于预测球员在下一帧中的位置,即使球员被短暂遮挡。
  • 匈牙利算法(Hungarian Algorithm):用于关联上一帧的检测框和当前帧的预测框,完成ID匹配。
  • 卷积神经网络(CNN):用于提取外观特征,辅助关联。

卡尔曼滤波通过结合物体的位置、速度和加速度信息,来估计其下一个状态。其状态方程和观测方程可以简化为:
代码/公式:卡尔曼滤波预测与更新

# 预测步骤
x_pred = F * x_est  # 状态预测
P_pred = F * P_est * F.T + Q  # 误差协方差预测

# 更新步骤
y = z - H * x_pred  # 测量残差
S = H * P_pred * H.T + R  # 残差协方差
K = P_pred * H.T * np.linalg.inv(S)  # 卡尔曼增益
x_est = x_pred + K * y  # 状态更新
P_est = (I - K * H) * P_pred  # 协方差更新

(其中x是状态向量,P是误差协方差,F是状态转移矩阵,H是观测矩阵,Q和R是过程噪声和观测噪声协方差,z是实际测量值)

3. 碰撞判断:边界框交并比与运动方向

仅仅检测到两个头盔的边界框相交(高IoU)并不足以判定为有风险的碰撞,因为可能是视角重叠。我们引入了运动方向(角度)作为关键判断依据。

公式:交并比(IoU)
IoU = Area of Intersection / Area of Union

如果两个球员的边界框IoU超过阈值并且他们的运动方向是朝向彼此的(即速度向量的夹角接近180度),我们才将其标记为潜在的碰撞事件。这大大减少了误报。


训练、测试与集成策略

我们使用了三个独立的模型,每个负责一个特定任务,然后将它们集成到最终的管道中。

数据增强与训练

为了增加数据多样性,我们利用了端区视角的图像,并通过翻转等操作进行增强。我们避免使用边线视角数据,因为它包含了太多场外无关人员(如观众),可能干扰模型。

我们使用提供的CSV追踪数据,为视频的每一帧生成带有球员ID的边界框标注,用于训练YOLO模型。由于训练多个模型对计算资源要求高,我们采用分阶段策略:

  1. 在一个独立的笔记本中训练YOLO模型,并保存检查点(Checkpoint)。
  2. 在另一个笔记本中加载YOLO检查点,然后与Deep SORT等追踪模块结合进行视频序列的训练和测试。

超参数调优

我们调整了多个超参数以优化性能:

  • 置信度阈值:设置为0.4,忽略置信度低于此值的预测框,以平衡精度和召回率。
  • 非极大值抑制(NMS):用于去除重叠的冗余检测框。
  • 卡尔曼滤波参数:调整过程噪声和测量噪声协方差(Q, R),以更好地匹配球员的运动模式。

模型集成与提交

最终的管道工作流程如下:

  1. YOLO模型:接收视频帧,输出头盔的边界框和置信度。
  2. Deep SORT:接收YOLO的输出,跨帧追踪每个头盔(球员),分配唯一ID。
  3. 碰撞判断模块:分析被追踪头盔的轨迹,计算边界框IoU和运动方向,触发碰撞事件。
    我们将所有模块的输出汇总,生成最终的比赛分析结果用于提交。

模型评估与结果分析

我们使用多种指标来评估模型的性能。

模型选择:YOLO vs. Detectron2

我们对比了YOLO和Facebook的Detectron2框架。虽然Detectron2在精度上可能略有优势,特别是在小物体检测上,但它的模型更复杂,训练和推理速度更慢。考虑到我们需要处理大量视频帧并追求实时性,YOLO在速度和精度之间提供了更好的平衡。YOLO也更容易理解和实现。

评估指标

官方使用加权F1分数进行评估,同时考虑:

  • 碰撞(Impact):实际发生接触并可能造成伤害的事件。
  • 非碰撞接触(Non-Impact):球员非常接近但未发生实质性接触的事件。
    我们使用Weights & Biases(W&B)工具来跟踪训练过程。主要监控三种损失:
  • 边界框损失(Box Loss):预测框与真实框之间的回归误差。
  • 物体性损失(Object Loss):判断网格内是否有物体的置信度误差。
  • 分类损失(Class Loss):物体类别预测的误差。

性能结果

通过调整置信度阈值和IoU阈值,我们的模型性能得到了显著提升。最终,我们在测试集上取得了0.713的加权F1分数,这在参赛队伍中排名约第32-33位(共约500队)。混淆矩阵显示,模型对清晰可见的头盔检测效果很好,但对部分遮挡或尺寸很小的头盔检测仍有提升空间。


项目协作与总结

团队协作

我们使用GitHub进行版本控制和项目管理。我们为不同的任务(数据预处理、模型选择、训练、评估)创建了分支和Pull Request(PR),确保所有代码在合并前都经过团队成员的审查。我们也定期在在线看板上同步进度。

经验总结与未来工作

在本项目中,我们一起学习了如何构建一个复杂的视频分析管道,涉及目标检测、多目标追踪和事件判断。

总结关键点

  1. 问题拆解:将复杂的“检测头盔碰撞”任务分解为目标检测、目标追踪和事件判断三个子任务。
  2. 模型选型:根据问题需求(速度 vs. 精度)选择合适的模型,我们选择了YOLO和Deep SORT的组合。
  3. 数据是关键:充分的数据探索、清洗和增强对模型性能至关重要。
  4. 迭代优化:通过超参数调优和集成策略逐步提升模型分数。

未来可以改进的方向

  • 尝试更先进的检测器:如YOLOv8或DETR,并采用模型集成(如加权框融合, WBF)技术。
  • 利用更多时序信息:像顶级方案那样,使用更长的帧序列(历史信息)来提升追踪和碰撞预测的稳定性。
  • 融合更多数据源:更有效地结合边线视角和端区视角的信息,以及原始的球员追踪坐标数据。

通过这个项目,我们不仅应用了机器学习技术,也深刻体会到从研究到实现一个完整、可用系统的全过程。

084:Passion Fruit 健康状态检测项目教程

概述

在本教程中,我们将学习如何构建一个机器学习模型,用于检测和分类乌干达百香果的疾病。我们将从理解问题背景开始,逐步介绍数据处理、模型选择、架构实现以及性能优化的完整流程。本项目旨在解决小农户因缺乏可靠诊断工具而面临的作物减产问题。

项目背景与动机

乌干达的许多植物病虫害导致作物减产,并降低了整个农业部门的投资意愿。当地农民多为小农户,收入较低,缺乏足够手段来应对农场中的病虫害挑战。由于无法获取作物健康状况的必要知识,他们难以进行干预以避免灾难性的损失。整体产量的下降和该领域投资的减少可能导致粮食短缺。

麦克马斯特大学的MSML实验室承担了解决百香果疾病缺乏可靠、及时诊断平台的责任。他们正尝试使用Lab5开发一种低成本手持设备,并将此任务作为在线竞赛发布在Zindi平台上,旨在构建一个用于检测百香果健康状况的ML模型。

数据集介绍与预处理

以下是数据集的初步介绍和处理步骤。

数据集构成

我们获得的数据集包含以下部分:

  • 训练CSV文件:包含696行和6列。每个图像可以有多个对象,这对应着多个边界框。本项目涉及三个类别:果实褐斑病、健康果实和枯萎病。
  • 测试CSV文件:包含97行和1列。
  • 图像数据:我们从3000张图像中获得了2902个边界框。一些图像只有一个边界框,而其他图像可能有多个。

数据预处理步骤

为了准备模型训练,我们执行了以下关键的数据预处理步骤:

  1. 删除重复数据:首先移除数据集中的重复条目。
  2. 标签编码:将类别从文本字符串编码为数值格式,以便模型处理。
  3. 提取几何信息:根据项目要求,我们从数据中提取了边界框的宽度和高度信息。

经过这些步骤,我们得到了编码后的类别标签以及图像的几何特征,为后续建模奠定了基础。

问题定义与挑战分析

上一节我们介绍了数据的基本情况,本节中我们来看看这个任务背后的核心问题与挑战。

最初,我们以为这是一个简单的图像分类问题,但深入分析后发现了其复杂性:

  1. 可变数量的对象:一张图像中可能包含1到4个百香果,每个对象都需要被识别。
  2. 对象尺寸不一:图像中的每个百香果大小可能不同。
  3. 联合任务:模型不仅需要检测出对象(定位),还需要对每个检测到的对象进行分类。

因此,这是一个目标检测问题,它结合了定位(找到边界框坐标)和分类(判断每个框内的果实状态)的任务。

传统的解决方案(如滑动窗口法)需要为不同位置和尺寸生成特征,计算复杂且耗时。深度学习改变了计算机视觉问题的解决范式。

模型架构探索:从R-CNN到Faster R-CNN

理解了问题本质后,我们开始探索解决方案。我们首先回顾了经典方法,然后聚焦于更高效的深度学习模型。

经典方法及其局限

我们研究了一些经典的目标检测方法:

  • DPM(可变形部件模型):使用HOG特征,非常复杂且耗时。
  • HOG(方向梯度直方图):结合SVM分类器和多尺度滑动窗口进行检测,速度较慢。

这些方法由于效率问题,不适用于我们的场景。

深度学习解决方案演进

深度学习提供了更优的解决方案,其演进过程如下:

  • R-CNN:首代方案,使用区域提议方法生成候选框,对每个区域用CNN提取特征,再用SVM分类。缺点是每个提议都要单独计算特征,非常昂贵。
  • Fast R-CNN:引入选择性搜索来生成对象提议,提高了效率,但在推理时仍受限于选择性搜索的速度。
  • Faster R-CNN:这是我们最终采用的核心架构。它引入了区域提议网络(RPN),与特征提取网络共享计算,极大地提升了速度和性能。

Faster R-CNN 工作流程

以下是Faster R-CNN的简化工作流程:

  1. 特征提取:输入图像通过一个卷积神经网络(如ResNet50或VGG16)生成特征图。
    # 伪代码示例:使用预训练CNN提取特征
    base_model = VGG16(weights='imagenet', include_top=False)
    feature_map = base_model.predict(input_image)
    
  2. 区域提议:特征图被送入RPN。RPN生成一系列边界框提议,并为每个提议分配一个“对象性”分数,用于判断框内是背景还是感兴趣对象。
  3. 兴趣区域池化:对RPN提出的边界框进行池化操作,将它们调整为固定尺寸。
  4. 分类与回归:池化后的特征被送入全连接层,同时执行两个任务:
    • 分类:判断边界框内的对象属于哪个类别(如健康、褐斑病)。
    • 边界框回归:微调边界框的位置,使其更精确地包围对象。

整个流程实现了端到端的对象检测与分类。

备选模型:VGG16 架构

除了Faster R-CNN,我们也探索了VGG16作为基准模型。VGG16是一个深度卷积神经网络,在ImageNet数据集上进行了预训练。

VGG16 工作原理

VGG16的输入是固定尺寸 (224, 224, 3) 的图像。图像经过一系列卷积和池化层:

  • 浅层学习边缘等基础特征。
  • 深层学习更复杂的特征组合。
    最终,图像被压缩成一个一维特征向量,并通过全连接层进行分类。特征图虽然空间尺寸变小,但深度增加,保留了图像的关键信息。

模型的调整

由于VGG16原本用于单标签图像分类,而我们需要输出多个边界框及其类别,因此必须对其进行修改。我们调整了网络输出层,使其能同时预测边界框坐标和多个对象的类别标签。

数据增强策略

我们的训练数据量相对较少,为了提升模型的泛化能力,防止过拟合,我们广泛使用了数据增强技术。数据增强可以人工扩展训练数据集。

我们使用了 albumentations 库,这是一个高效的数据增强工具。以下是我们在项目中应用的一系列增强操作:

  • 水平与垂直翻转
  • 随机旋转(如90度或其他随机角度)
  • 亮度调整
  • 对比度调整
  • 随机亮度对比度联合调整
  • 图像缩放(先下采样再上采样以模拟质量变化)
  • 图像平移

这些操作通过代码库灵活应用,显著增加了数据的多样性,帮助模型学习到更鲁棒的特征。

实验过程与结果分析

现在,我们将所有部分结合起来,回顾实验过程并分析结果。

性能提升历程

我们的模型性能经历了多次迭代提升:

  1. 基线模型:初始尝试准确率很低。
  2. Faster R-CNN:转向Faster R-CNN后,准确率提升至71%,我们将其作为主要模型。
  3. 引入数据增强:应用前述数据增强技术后,性能得到进一步改善。
  4. 资源优化:我们遇到了计算资源瓶颈。最初使用CPU训练速度很慢,后来转为使用Google Colab的GPU,训练效率大幅提升。
  5. 最终成绩:经过一系列优化,我们在后期达到了约81%的准确率。如果在竞赛截止前提交,这个成绩大约可以排在25名左右(共约700支队伍),相比最初的114名有显著进步。

遇到的挑战与错误

在项目过程中,我们遇到并纠正了一些关键错误:

  • 提交格式错误:最初,我们错误地只对每张图像预测一个边界框,而忽略了可能存在多个对象的情况,这导致得分异常低(仅24%)。
  • 坐标理解错误:我们曾混淆边界框坐标 (x_min, y_min, x_max, y_max) 的顺序,在修正后得分恢复正常。
  • 问题理解偏差:最大的挑战在于最初未能正确理解这是一个目标检测问题,而非简单的图像分类问题。这导致我们浪费了时间在错误的路径上。

模型比较与反思

我们曾训练VGG16模型,在验证集上获得了很高的准确率(如95%)。然而,我们当时没有及时在测试集上验证其泛化性能,就因其在验证集上的过拟合迹象而转向了Faster R-CNN。事后反思,我们应该更系统地使用交叉验证或保留测试集来评估模型真实性能,而不是依赖单一的验证集结果或直接提交到竞赛平台测试。

项目协作与管理

有效的协作对于项目成功至关重要。我们采用了以下工具和方法:

  • 代码管理:使用Git进行版本控制,主要仓库托管在GitHub上。由于大部分开发在Google Colab进行,我们也利用了Colab自带的版本历史功能。
  • 任务管理:尝试使用Trello看板来跟踪任务和进度,但在学生团队中完全贯彻有一定挑战。主要的日常协调仍通过WhatsApp和短信进行。
  • 文档与演示:使用Google Docs和Slides进行方案设计和报告撰写。

总结与核心挑战

在本教程中,我们一起学习了构建一个百香果病害检测系统的完整流程。

核心学习点

我们从项目动机出发,经历了数据预处理、问题定义(目标检测)、模型选型(Faster R-CNN)、数据增强、实验迭代和错误分析等多个阶段。关键步骤包括:

  1. 精确定义问题:区分分类、检测、分割任务。
  2. 选择合适的架构:Faster R-CNN适合可变数量对象的检测与分类。
  3. 利用数据增强:在小数据集上提升模型鲁棒性。
  4. 系统化评估:避免过拟合,严谨评估模型真实性能。

最大的挑战

本项目最大的挑战在于最初对问题的正确理解。将问题误判为图像分类导致方向性错误。这提醒我们,在开始建模前,必须投入足够时间深入分析问题本质、数据结构和任务要求。一旦正确理解了这是需要定位分类目标检测问题,后续的模型选择和优化路径就变得清晰起来。

通过这个项目,我们不仅实践了高级机器学习技术,更深刻体会到了问题定义在机器学习项目中的决定性作用。

085:不可知PAC学习 🧠

在本节课中,我们将深入探讨机器学习理论中的一个核心概念——不可知PAC学习。我们将从回顾PAC学习框架开始,逐步放宽其假设,最终得到一个更通用、更贴近现实的学习理论模型。


概述

在之前的课程中,我们定义了“概率近似正确”学习,它基于一个关键假设:存在一个完美的目标假设。本节我们将移除这个“可实现性”假设,进入更一般的“不可知”学习场景。我们将学习如何定义在这种更现实设定下的学习能力,并引入广义损失函数来统一处理分类和回归等问题。

上一节我们介绍了在可实现性假设下的PAC学习理论,本节中我们来看看当这个假设不成立时,学习理论该如何构建。


回顾:PAC学习与样本复杂度

在上一讲的回顾中,我们定义了在训练集上获得一个会导致真实损失失败的最优假设的概率。这个概率就是δ,它恰好是获得一个坏训练样本的概率。

我们之前已经对δ进行了上界估计。获得坏样本的概率小于等于假设集的大小乘以 e 的负精度参数乘以样本数量次方。

让我们对不等式两边同时除以δ。然后,对不等式两边取对数。由于对数函数是单调递增函数,不等式符号不变。我们最终得到右边项,它非负,大于等于零。

由此,我们可以重新排列,得到这个不等式。它表明精度参数ε与样本数量m成反比。这里的含义是:如果你固定ε,那么给定其他参数,你需要更多的样本来达到那个ε。你需要增加样本数量。

另一个问题是:对于一个固定的δ和ε,我们应该取多少个样本?为了达到获得坏训练样本的给定概率,我们应该取至少这么多样本。至少取这么多样本,你将能保证δ和ε。更高的样本数量将导致增加成功概率(1-δ)的更好机会。

由此可以得出:给定一个有限的假设类、一个固定的δ(在开区间0到1之间)和一个正的ε,对于任何标记函数和数据生成分布,只要可实现性假设成立,那么对于大小为M的训练集中任意经验风险最小化假设h_S,其真实损失小于等于ε(即成功)的概率至少为1-δ。


定义PAC可学习性

从上述结论,我们可以定义PAC可学习性。一个假设类H是PAC可学习的,如果存在一个关于该类别的函数M_H。M_H是一个映射。它接受ε和δ的值,并返回一个自然数。

具体来说,H是PAC可学习的,如果存在这样一个函数M_H和一个具有以下性质的学习算法:对于所有在单位区间内的ε和δ,对于定义在域X上的所有数据生成分布D,以及对于所有将样本映射到{0,1}的标记函数f,当可实现性假设成立时,在运行于m ≥ M_H(ε, δ)个IID样本上时,学习算法返回一个假设h,使得成功(即损失L_D(h) ≤ ε)的概率大于等于1-δ。

这个定义由Leslie Valiant在1984年给出。它定义了一个假设类的可学习性。在我们之前的第二讲中,我们确定它应该是一个有限的类。为了使其成为有限类,我们必须以某种方式构造它。例如,在我们的二维例子中,假设类可以是网格上矩形的类,以使其有限。


样本复杂度

计算机科学是关于算法复杂性的。我们有运行时间复杂性,空间复杂性。我们将算法组织成不同的复杂性类别,如多项式类、非确定性多项式类、P空间类等,这是一个完整的计算复杂性类层次结构。

但当我们开始谈论机器学习时,有另一个复杂性的概念。当我们想谈论从数据中学习时,我们需要定义样本复杂性的概念。这意味着:为了生成能在特定问题上表现良好的分类器(来自特定类别的特定分类器),需要多少个样本?

样本复杂度是ε和δ的函数,即M_H。它告诉我们保证一个概率近似正确的解决方案需要多少样本。用通俗的话说,就是我之前那句话所说的:我们需要多少样本才能正确学习?但“正确学习”意味着什么?这是未定义的。所以,为了定义一切,我们可以使用PAC学习:我们需要多少样本才能获得通过PAC可学习性定义的“概率近似正确”的解决方案?

许多函数满足这个定义。为了指定唯一一个函数,我们添加一个最小化条件。样本复杂度是满足以精度ε和置信度δ进行PAC学习要求的最小整数。这个定义如何?


有限假设类的样本复杂度

有限假设类的样本复杂度是多少?回想一下我们之前的一个结论,我们已经建立了这个不等式。一旦我们有了这个不等式,我们就可以建立以下不等式。我们对δ进行了界定,并且能够为有限类推导出m的下界。

对于无限类则不然。显然是有限性决定了可学习性。但对于有限类,我们可以计算|H|,即假设类中可能的假设数量。我们需要一个有限的类。基本上,通过取这个比率的上限,我们可以确定所需的最小样本数量,以满足我们获得好样本的机会是1-δ。样本越多,这个概率就越好。


超越二元分类:移除可实现性假设

二元分类并不是我们感兴趣的唯一学习问题。我们需要做其他事情,或者以某种方式超越二元分类,进入其他问题,并且仍然对实现给定精度或给定不失败概率(或不获得坏样本的概率)所需的样本复杂性有良好的把握。例如,回归就是其中一个问题。

为了更通用,我们需要移除可实现性假设。可实现性假设告诉我们:存在一个标记器或假设h*,它将在所有样本上返回真实标签。但在所有样本上返回真实标签,在某种程度上假设了每个样本首先可以有一个明确的标签。这并不总是可能的。

假设我们想要训练一个分类器,根据人的轮廓来预测其生理性别变量。生理性别变量可以根据DNA分配给每个人。如果一个人有Y染色体,那么他们的生理性别是男性。在这个情境中,我们实际上可以有一个函数f。但问题是,我们无法访问所有可能的特征,或者我们不知道哪些特征与这种唯一分配相关。所以我们处理的是轮廓,你能从轮廓预测性别吗?正如这张图片所示,我们甚至无法预测它是否是人类、动物或生物。所以,可实现性假设是棘手的。

如果我们想放宽这个假设,即放宽存在这样一个h*的假设,使得我们的函数返回的标签等于真实标记函数的概率为1。那么,我们现在需要摆脱目标标记函数,因为我们不能假设存在一个能正确标记一切的函数。取而代之的是,我们引入数据和标签的联合生成分布。


引入联合分布与贝叶斯视角

现在我们有一个数据和标签的联合分布,它是我们的条件分布。给定一个x,它以某种概率生成一个y,以及数据上的先验分布。现在,我们进入了贝叶斯世界。我们处理的是联合分布、条件分布和边缘分布。

我们如何得到它?我们有一个分布P(X,Y),它是联合分布。如果我们固定一个x的值,那意味着我们取了这个分布的一个切片。当我们说固定那个x值时,我们得到的是y的分布。但为了从函数形式得到正确的分布,我们需要将其归一化使其和为1。为了归一化使其和为1,我们需要取联合分布P(X,Y),对y的所有可能值积分,我们知道这就是边缘分布P(X)。如果我们对y做同样的事情,我们可以很容易地得出贝叶斯定理,但我们将在课程后面进行。

我想说的是,当我们真正用条件概率分布D(Y|X)替换目标标记函数f时,那么我们的真实损失(真实风险)就需要重新定义。以前,真实损失是相对于数据生成分布的概率,即我们的假设返回的标签不等于真实标记函数将返回的标签。但现在我们如何处理呢?让我们重新定义真实损失L_D(h)为相对于联合分布P(X,Y)的概率,即h(x) ≠ y。等价地,它是集合{(x, y): h(x) ≠ y}的概率质量。

在我们的学习过程中,我们想要找到一个预测器h,以最小化新的真实损失。这个愿望的问题是:学习者不知道数据生成分布。在现实世界中,我们很少知道数据生成分布。因此,经验风险的定义保持不变,即训练集中错误分类样本的数量除以训练集中的样本总数。现在,我们的目标是找到一个假设,使其概率近似地最小化真实损失。


贝叶斯最优预测器及其局限性

如果我们思考一下,答案将是贝叶斯最优预测器。对于数据生成分布(即定义在我们的域与标签集{0,1}的笛卡尔积上的联合分布),最佳预测器如下:一旦我们得到x,如果条件概率P(Y=1|X=x)大于等于1/2,我们返回1;否则返回0。

但这个问题在于:贝叶斯最优预测器是我们没有希望找到的h。贝叶斯误差是最优的,我们无法找到误差更小的h。至少渐近地看是这样。但我们的误差定义为所有数据上的真实损失,所以这个陈述在没有对数据分布D的假设下是严格成立的。然而,我们不知道D,我们不知道数据生成分布,因此我们无法利用贝叶斯最优预测器,因为我们不知道给定数据时标签的条件概率。

相反,我们要做或将要做的,是寻找一个误差不比最佳可能误差大太多的预测器。贝叶斯误差是最佳可能误差,所以我们不希望误差大太多,我们不希望找到一个偏离它太多的预测器。


定义不可知PAC学习

有了这个基础,我们现在可以定义不可知PAC学习。一个假设类H是不可知PAC可学习的,如果存在一个样本复杂度函数M_H和一个具有以下性质的学习算法:对于所有ε和δ,以及所有数据和标签的联合分布,当我们在m ≥ M_H(ε, δ)个IID样本上运行该算法时,该算法返回一个假设h,使得其真实损失L_D(h)小于等于在假设类H中可达到的最小可能损失(即inf_{h' in H} L_D(h'))加上ε,并且这个事件的概率大于等于1-δ。

这就是不可知PAC学习。我们摆脱了一个强大而严格的假设——可实现性假设,即一切都可以被某个我们未知的真实标记函数正确标记。我们进入了具有分布的贝叶斯世界,现在我们不需要真实标记函数的概念了。


扩展到多分类与回归问题

但还有其他任务,例如多分类。我们想将文档分类到不同的类别中,或者我们想用脑电图实现脑机接口来制作思维阅读器或思维打字机。我们想将脑电波(作为x)映射到整个字母表加数字,而不仅仅是两个类别。另一个多分类的例子是预测下一个单词。除了多分类,还有一个完全不同的问题——回归问题。

回归问题是拟合数据的问题,是寻找数据之间函数关系的问题。通常,回归问题是指我们想找到x和y之间的函数关系,其中我们的标签y不是二元标签,而是某个因变量或属性。例如,我们想预测年龄(一个连续的有界数字),或者我们想预测温度或任何其他连续数字。

在这个任务中,我们想找到将x映射到y的函数,找到函数依赖关系。回归问题是一个有趣的问题。基本上,当你测量大量数字时,你甚至可能有多个x(x1, x2)。但这个y变量是x1和x2的函数。也许我们测量这个变量时有噪声。但我们需要拟合一条曲线,或者在简单线性回归的情况下,拟合一条具有最小误差并能通过滤除噪声来解释底层过程的直线。

回归是由卡尔·弗里德里希·高斯和阿德里安-马里·勒让德同时发明的。他们都发现了拟合曲线或直线的方法,而不仅仅是回归的一般形式,还有最小二乘法。一个有趣的观察是:从我的描述中你可以看到,他们都发现了一种拟合方法,然而我们称之为“回归”。“回归”这个术语是由弗朗西斯·高尔顿在19世纪创造的,用来描述一种生物现象,即高个子祖先的后代身高倾向于向正常平均值“回归”,也称为“均值回归”。但不知何故,这个名字被用于使用最小二乘法的拟合方法。

这里有不同的例子,展示了将不同模型拟合到同一数据集。你可以使用相同的方法,但模型不同。例如,这里我们使用最小二乘法拟合一条具有截距和斜率的直线方程。这里你从函数中移除斜率,你仍然在最小二乘意义上得到最佳可能的拟合。


广义损失函数

那么回归的损失是什么?最小二乘损失。回归的损失是真实标签y与我们的假设h(x)输出之间平方差的期望值。由于很难计算期望平方差(记住,我们很少知道分布D),我们使用均方误差,它只是预测值与测量值之间的平均平方误差。

对于任何假设类H和域Z,广义损失函数是一个从假设集与域Z的笛卡尔积映射到非负实数的函数。对于预测任务,Z只不过是定义数据和标签联合分布的域。但我们想更通用,我们希望Z是任何样本域,例如,在无监督学习任务中,Z不能是实例域和标签域的乘积,因为我们没有标签。

我们称这样的函数为损失函数(小写l),它们映射到非负实数。使用广义损失函数l,我们可以重新定义风险函数。我们的真实风险L_D(h)定义为,由数据分布生成的Z的期望损失。同样,经验风险R_S(h)只是平均损失。

我们可以使用这种方法定义0-1损失。我们有样本和标签的对(x, y)。如果h正确预测了x的标签,我们定义损失为0;如果h错误预测了x的标签,则定义损失为1。注意,对于一个二元随机变量,期望损失将等于该变量为1的概率。我们也可以定义平方损失,它只是我们的假设输出与训练集中真实值之间的平方差。这个损失对回归问题很有用。


基于广义损失的不可知PAC学习

稍微重新表述和重新定义我们基于广义损失函数的不可知PAC学习。一个假设类H关于域Z和广义损失函数l是不可知PAC可学习的,如果存在一个样本复杂度函数M_H和一个具有以下性质的学习算法:对于所有ε和δ,以及Z上的所有数据分布,当我们在m ≥ M_H(ε, δ)个IID样本上运行该算法时,该算法产生一个假设h,使得使用该假设的真实损失L_D(h)小于等于在该假设类中可达到的最小可能损失加上某个允许的精度参数ε,并且这个概率大于1-δ。

δ和之前一样,是获得我们无法从中学习的样本的概率。我们的损失现在定义为广义损失的期望值。


总结

本节课中,我们一起学习了机器学习理论的核心进阶内容。我们从经典的PAC学习框架出发,回顾了其定义和样本复杂度的推导。接着,我们探讨了其关键限制——可实现性假设,并学习了如何通过引入数据和标签的联合分布来移除该假设,从而定义了更通用的不可知PAC学习

我们了解到,不可知PAC学习的目标不再是寻找零误差假设,而是寻找一个误差不差于假设类中最佳可能假设太多的预测器,即满足:
L_D(h) ≤ inf_{h' in H} L_D(h') + ε
且概率至少为 1-δ

最后,我们将框架进一步推广,使用广义损失函数 l(h, z) 统一了分类(0-1损失)和回归(平方损失)等问题,给出了最终最一般化的不可知PAC学习定义。这为我们分析更广泛的学习任务奠定了理论基础。

posted @ 2026-03-26 12:32  布客飞龙IV  阅读(93)  评论(0)    收藏  举报