CMU-11-755-机器学习信号处理笔记-全-

CMU 11-755 机器学习信号处理笔记(全)

001:独立成分分析

在本节课中,我们将要学习独立成分分析。首先,我们需要快速回顾一下上一节课中关于变量相关性的概念。

相关与不相关变量

上一节我们介绍了相关变量的含义。如果两个变量 xy 相关,那么知道 x 的值会影响我们对 y 值的预期。例如,在汉堡消费量与企鹅数量的散点图中,当汉堡消费量为 B1 时,企鹅数量的期望值不同于消费量为 B2 时的期望值。因此,给定 xy 的条件期望 E[y|x] 会随 x 变化。

如果变量不相关,那么知道 x 的值并不会改变我们对 y 平均值的预期。在散点图中,无论 xB1 还是 B2y 的期望值 E[y] 都相同。

以下是关于不相关性的几个关键性质:

  • 对于两个变量 x1x2,给定 x1x2 的条件期望总是等于 x2 的无条件期望:E[x2|x1] = E[x2]
  • 作为推论,x1x2 乘积的期望等于它们各自期望的乘积:E[x1 * x2] = E[x1] * E[x2]
  • 如果数据是零均值的(即 E[x1] = E[x2] = 0),那么 E[x1 * x2] = 0

向量表示与相关矩阵

当我们处理多维数据时,可以将变量表示为列向量 x = [x1, x2]^T。我们可以定义相关矩阵为数据向量与其转置的外积的期望值:

R = E[x * x^T] = E[ [x1^2, x1x2; x2x1, x2^2] ]

如果变量不相关且均值为零,那么非对角线项 E[x1*x2]E[x2*x1] 将为零,相关矩阵 R 将是一个对角矩阵。

这个期望性质同样适用于样本平均。如果我们有一个包含大量数据向量 x_i 的数据矩阵 X,那么 X * X^T 近似于相关矩阵。如果数据向量的各个分量不相关,这个矩阵也将是对角矩阵。

去相关化与主成分分析

上一节我们介绍了如何将一对相关的变量变为不相关。如果 x1x2 的散点图呈某种趋势,我们可以通过一个变换 T 将它们转换为新的变量 x1‘x2’,使得新变量的散点图呈轴向对齐,且 E[x2‘|x1’] 独立于 x1‘ 的值。

具体来说,如果 X 是相关数据向量组成的矩阵,我们希望找到一个变换 T,使得变换后的数据 Y = T * X 是不相关的。这意味着 Y * Y^T 是一个对角矩阵。

代入 Y = T * X,我们得到:
Y * Y^T = (T * X) * (T * X)^T = T * (X * X^T) * T^T

其中,X * X^T 正比于数据 X 的协方差矩阵。我们希望 T * (协方差矩阵) * T^T 是对角矩阵。

我们之前学过,主成分分析正是完成这个操作。协方差矩阵可以通过特征分解表示为:
协方差矩阵 = E * Λ * E^T
其中,E 是特征向量矩阵,Λ 是对角特征值矩阵。对于对称的协方差矩阵,其特征向量是正交的,即 E^T * E = I(单位矩阵)。

如果我们选择变换矩阵 T = E^T,那么:
T * (协方差矩阵) * T^T = E^T * (E * Λ * E^T) * E = (E^T * E) * Λ * (E^T * E) = I * Λ * I = Λ

Λ 是一个对角矩阵。因此,T = E^T 这个变换成功地将数据投影到了协方差矩阵的特征向量上,实现了数据的去相关化。这正是主成分分析的核心:通过对数据协方差矩阵进行特征分解,并用特征向量的转置变换数据,得到一组不相关的主成分。

本节课中我们一起学习了变量相关与不相关的概念,回顾了如何用向量和矩阵表示相关性,并深入理解了主成分分析如何通过特征分解实现数据的去相关化,为接下来学习独立成分分析奠定了基础。

002:聚类

概述

在本节课中,我们将要学习量化与聚类。我们将探讨如何通过构建一个有限的字典来近似表示数据,并理解这与矩阵分解之间的联系。

从矩阵分解到聚类

上一节我们介绍了矩阵分解算法,其目标是将数据矩阵分解为一组基向量及其对应的权重。这样做的核心思想是,如果基向量学习得当,权重就能有效地表示数据。

那么,聚类与矩阵分解有什么关系呢?让我们来看一下。

我们之前的问题是:给定一组数据点,目标是找到一组基向量 P,使得每个向量都能表示为这些基向量的加权组合。这种分解可以是精确的,但当不精确时,我们希望两者之间的误差尽可能小。

为什么这很重要?因为有了正确的基向量集,权重就能更有效地表示数据。例如,在分解音乐频谱图时,如果发现的基向量是音符,那么这些权重就能告诉我们音符是如何演奏的。同样,在分析人脸数据时,如果基向量能给出关键的面部结构,那么它们的组合方式就非常有意义。此外,如果通信双方就使用的基向量达成一致,那么只需传输权重信息,接收方就能结合基向量重建出相当接近原始数据的版本。

最精确的数据表示方法

给定上述背景,表示数据最精确的方法是什么?如果我希望有一种表示方法,既能保证传输最少的信息量(最小的数字集合),又能让你非常精确地重建一切,那么最精确的方法就是拥有一个包含所有可能数据的字典。

用代数术语来思考:我会有一个面部字典,这些 D 就是我的字典条目。你将数据重建为字典条目的加权和,但权重对于所有字典条目都为零,除了目标人脸对应的条目,其权重为1。因此,权重向量 W 是一个稀疏向量,它只有一个值为1的条目,其余均为0。实际上,它是一个独热向量,因为那个非零条目正好是1。

理想方法的局限性

这种方法有什么问题?首先,你不可能收集到数据的所有实例。例如,对于人脸,你无法拥有所有可能人脸的集合。构建一个包含所有可能数据实例的字典是不可行的,因为需要无限多的条目。其次,这并不高效,因为如果我的字典有无限条目,那么索引就需要无限比特来表示。再者,即使训练数据是有限的,你仍然需要存储整个训练数据。而且,如果需要表示一个训练集之外的人脸,你将无法表示它。所以,这种方法行不通。

可行的解决方案:有限字典与近似

那么,我们能有解决方案吗?与其存储一切,我们是否可以构建一个更小的、有限的字典?这样一来,所有数据不再被精确重建为字典条目的加权和,而是被近似重建。

基本框架仍然相同:我仍然将人脸重建为字典条目的加权和,权重仍然是独热的,即除了一个条目为1,其余均为0。改变的是,我们不再说这张脸就是字典中的第七张脸,而是说我要传达给你的这张脸看起来非常像字典中的第七张脸。

当我发送给你一个在第七个位置为1的权重向量时,我只是在告诉你,我试图传达的这张脸与字典中的第七张脸极其相似

定义“相似”与构建字典

那么,“看起来非常像”或“极其相似”是什么意思?我们如何构建这个字典,使得近似误差最小化?让我们来探讨这两个问题。

首先,我们如何定义“相似”?这意味着我们需要量化误差。我们得到某个近似值,有原始人脸,我们希望最小化两者之间的差异。我们可以选择不同的误差度量来量化两者之间的差异。

让我通用地将这个误差度量表示为 d(·, ·),意为散度。我的重建人脸 可以写成 D 乘以 w,其中 D 是包含所有这些面孔的字典,w 是一个独热向量。

表示独热向量的方式等同于说 w 的零范数 ||w||₀ 为1(即 w 中只有一个非零条目),并且 w 的条目之和也为1。这两个条件共同指定了权重向量除了一个值为1的条目外,其余全为0。

所以我的近似值 f̂ = D w,其中 w 满足这些约束。我的误差将是实际人脸与此近似值之间的散度。

一个非常常见的散度选择是平方欧几里得距离:

d(f, f̂) = ||f - f̂||²

总结

本节课中,我们一起学习了从精确的矩阵分解到通过聚类进行近似表示的思路演变。我们了解到,最理想的表示方法(拥有所有数据的完整字典)在实践中不可行。因此,我们转向构建一个有限的字典,通过独热编码的权重向量来近似表示数据,其核心是找到与原始数据“最相似”的字典条目,并最小化重建误差。这为理解聚类问题奠定了基础。

003:非负矩阵分解 (NMF) 🧩

在本节课中,我们将学习一种新的矩阵分解方法——非负矩阵分解。我们将探讨其核心思想、与之前方法的区别,以及它如何解决语义表示的问题。


回顾:寻找数据基底的动机

上一节我们介绍了通过特征分解(如卡亨南-洛伊夫变换)来寻找数据基底的方法。本节中我们来看看另一种分解方法。

寻找基底的核心问题有两个:

  1. 找到一组基底 B
  2. 确定每个数据点如何由这些基底组合而成,即找到组合系数。

我们为何要寻找这样的基底?主要有三个原因:

  • 更好的语义表示:合适的基底能为数据提供有意义的解释。例如,以音符为基底,音乐可以表示为乐谱;以面部部件为基底,可以描述一张脸。
  • 降维:通过少数几个最重要的基底来近似表示高维数据,减少存储和计算开销。公式表示为:数据 ≈ 基底矩阵 × 系数矩阵
  • 去噪:重要的信号能量通常集中在少数几个基底上,而噪声则分散在后面的基底中,通过舍弃后者可以达到去噪效果。

我们之前学习的特征向量基底(如特征脸)具有良好的能量集中特性,但在语义表示上存在缺陷。


特征基底的局限性:负值问题

特征基底(如特征脸)由数学上的正交性定义。一个数学规则是:在一组正交向量中,最多只能有一个向量是全正或全负的,其他向量必须同时包含正负分量。

以下是这种局限性的表现:

  • 在图像中,基底出现负像素值。负像素在物理意义上难以解释。
  • 在声音频谱中,基底出现负能量。负能量在物理上同样没有意义。

因此,虽然特征基底能有效压缩能量,但它们缺乏语义直观性。我们需要的是一种能产生全非负基底的分解方法,这就是非负矩阵分解。


引入非负矩阵分解 (NMF)

非负矩阵分解的核心思想是:给定一个非负的数据矩阵 V,我们试图找到两个同样非负的矩阵 W(基底矩阵)和 H(系数矩阵),使得它们的乘积近似等于原数据。

其数学模型可以表示为:
V ≈ W × H

其中:

  • V 是原始数据矩阵(例如,每列是一个数据样本)。
  • W 是基底矩阵(字典),每一列代表一个基底。
  • H 是系数矩阵(编码),每一列代表对应样本在基底上的组合权重。

NMF的关键约束是:矩阵 VWH 中的所有元素都必须大于或等于零。这个约束迫使分解结果具有直观的“部分构成整体”的语义。


本节课总结

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

  1. 回顾了为数据寻找合适基底的三大目标:语义表示、降维和去噪。
  2. 指出了基于正交特征向量的方法(如KL变换)在语义解释上的主要缺陷:其基底分量可正可负,缺乏物理直观性。
  3. 引入了非负矩阵分解 作为解决方案,其核心是将非负数据矩阵分解为两个非负矩阵(基底和系数)的乘积,从而获得更具解释性的语义表示。

下一节,我们将深入探讨NMF的具体算法和实际应用。

004:确定性表示

概述

在本节课中,我们将学习如何表示信号。我们将探讨基于基的表示方法,包括基、过完备基,以及用于声音和图像的谱图和离散余弦变换。最后,我们会简要提及高斯和拉普拉斯金字塔,但不会深入讲解。


信号表示的挑战

当我们开始表示信号时,我们的处境类似于六个盲人描述大象。根据我们的视角和对信号的理解,我们会得出截然不同的描述。

以下是一些图片,你如何描述它们?

有人看到人脸,有人看到树木。当你试图描述这些图像时,你是在尝试给出基于内容的、语义层面的描述。显然,这种描述方式在面对大量不同类别的图像时是不可行的,它无法扩展。

同时,存在另一种完全无损的描述方式:即传达每个像素的具体数值。例如,像素1是0.25,像素2是3。然而,这种描述方式完全不具信息性,它没有告诉你数据中的任何内容。

声音信号也是如此。一段声音信号只是一串数字序列,绘制出来像一团斑点。如果我让你描述一段音乐,你开始告诉我“36, 42, 68”这些采样值,这根本无法传达音乐给人的印象。

因此,我们面临表示的问题。表示即描述。我们需要紧凑的表示,但必须描述数据最显著的特征。


数值表示与内容信息

以下是两幅图像,它们相同吗?

它们都代表同一个概念——字母“A”。但如果你逐个像素地比较它们,它们相距多远?如果一幅图像中的白色像素在另一幅中是黑色像素,那么它们可能相距甚远。

因此,表示必须是数值化的,但同时又必须传达一些关于内容的信息。它们必须允许识别、比较、存储和重建等操作。一个良好的表示需要同时满足所有这些要求,这是一个挑战。


寻找最显著特征

让我们回到第一组图像。如果不看幻灯片,这些图像最共同的特征是什么?

是黑色像素吗?还是矩形?实际上,所有这些图像最显著、最共同的特征是背景。几乎你拍摄的每张照片,大部分区域都是背景。而背景是什么?背景就是某种颜色的均匀色调。

一个均匀色调只是一系列相同的值。因此,描述这种图像最紧凑的方式是将其表示为常数乘以一幅全1的图像。

在向量空间中,这个均匀色调、这个全1的集合,本质上是一个向量。当我仅用这个“全1向量”来描述图像最显著的特征时,我实际上在做什么?我是在将图像投影到这个“全1向量”上。


投影与基向量

我们可以用公式来描述这个过程。设图像为向量 I,我们选择的基向量(代表均匀色调)为 B(一个全1向量)。我们试图用这个基向量的缩放版本来近似图像:

IB × w

其中 w 是一个标量权重。

给定 IB,如何计算 w?根据我们上节课的知识,w 可以通过以下公式计算:

w = (B^T B)^(-1) B^T I

由于 B 是向量,(B^T B) 是一个标量,其逆就是倒数。因此,近似图像为:

Î = B × w = B ( (B^T B)^(-1) B^T I )

我们可以将 P = B ( (B^T B)^(-1) B^T ) 视为投影矩阵,它将图像 I 投影到基向量 B 上。


投影结果的局限性

现在,我尝试用这个“最显著特征”(均匀背景)来描述两幅不同的图像:一幅是望远镜,另一幅是人脸。在这两种情况下,图像的大部分区域确实是均匀色调的背景。

然而,当我把它们投影到这个最显著的特征上时,得到的结果如下:

这看起来像望远镜吗?这看起来像人脸吗?虽然我们捕捉到了最重要的显著特征(背景),但我们缺失了关键信息。

我们缺失了什么?我们缺失了图像中除均匀背景之外的所有细节——即前景的主体内容(望远镜或人脸)。单一的基向量 B(全1向量)只能表示图像的直流分量或平均亮度,无法表示任何变化或结构。


总结

本节课中,我们一起学习了信号表示的基本挑战。我们认识到:

  1. 纯粹的语义描述难以扩展。
  2. 纯粹的无损数值描述(如像素值)缺乏信息性。
  3. 良好的表示需要在紧凑性和信息量之间取得平衡。
  4. 我们引入了使用基向量进行表示的思想,并通过将图像投影到代表“均匀背景”的基向量上进行了演示。
  5. 我们发现,仅使用一个基向量只能捕捉信号中最显著但最不具区分性的特征(如平均亮度),而丢失了定义信号内容的关键细节。

这引出了一个问题:如何选择一组基向量,使其能够更有效、更全面地表示信号的各种特征?这将是后续课程中探索不同基(如傅里叶基、DCT基)和过完备表示的起点。

005:数据驱动的表示

在本节课中,我们将学习数据驱动的表示方法。我们将回顾投影的概念,并将其与之前学习的确定性表示方法进行对比,从而理解数据如何影响我们构建信号表示的基础。


回顾:投影与确定性表示

上一节我们介绍了确定性表示。其核心在于,无论使用什么数据集,只要按照特定方式定义,表示的基础单元(基)总是相同的。因此,其中并不涉及真正的“学习”过程。我们定义这些基的原则是:每个基必须捕获数据中其他基未能捕获的某些方面,并且最好能按重要性排序。在实际数据中,按频率排序时,低频分量通常能量最高,这是因为在现实世界中,无论跨越空间还是时间,大多数时候“无事发生”。

本节中,我们来看看数据驱动的表示。但在开始之前,我们先简要回顾一下投影的概念。

如果我有两个向量 xy 的内积,并且 y 是单位长度(即 ||y|| = 1),那么 x^T y 是什么?

x^T yxy 方向上投影的长度。这个投影本身是一个向量,其计算公式为:
投影向量 = (x^T y) * y

现在,考虑一个向量 x 和一组向量 y1, y2, y3, ...。为简化,我们将这些向量组成一个矩阵 Y = [y1, y2, y3, ...]。那么,将 x 投影到 Y 上是什么意思?

这意味着我们将 x 投影到由向量 y1, y2, y3, ... 张成的空间(即它们所有线性组合构成的空间)上。例如,想象一张纸,纸上的任意两条不共线的线就足以定义这张纸所在的平面。如果你将一束垂直于纸面的光照射在一支粉笔上,粉笔在纸上的“影子”就是粉笔在这个平面上的投影。


从投影到数据驱动表示

理解了投影后,我们可以思考数据驱动表示的核心思想。在确定性表示中,基是预先定义好的(如傅里叶基、小波基)。而在数据驱动表示中,我们希望从数据本身学习出最合适的基(或称为“字典”)。

其目标是找到一组基向量,使得我们能用这些基向量的线性组合来高效地表示数据,同时满足某些约束条件(例如稀疏性)。这通常通过解决一个优化问题来完成。

以下是数据驱动表示的一个基本思路框架:

  1. 目标:给定一组数据向量,找到一组基向量(字典),使得每个数据向量都能用字典中少量基向量的线性组合来近似表示。
  2. 数学模型:这可以表述为以下优化问题。设数据矩阵为 X,字典矩阵为 D,系数矩阵为 A。我们希望最小化重构误差,同时约束系数 A 是稀疏的(即大部分元素为零)。
    最小化 ||X - D A||^2_F + λ * Sparsity(A)
    其中 ||.||_F 是弗罗贝尼乌斯范数,λ 是控制稀疏性权重的参数。
  3. 学习过程:通过交替优化来学习 DA。例如,先固定 D,优化 A(稀疏编码);然后固定 A,优化 D(字典更新)。

总结

本节课中我们一起学习了数据驱动的表示方法。我们首先回顾了向量投影的概念,这是理解线性表示的基础。接着,我们对比了确定性表示与数据驱动表示的关键区别:前者使用固定、预先定义的基,而后者从数据中学习适应性的基。数据驱动表示的核心是找到一个字典,使得数据能用该字典下稀疏的系数向量来有效表示,这通常通过求解一个联合优化问题来实现。这种方法让表示能够更好地捕捉特定数据集的固有结构。

006:分类与元分类器

在本节课中,我们将学习如何利用上一讲中介绍的“特征脸”概念,在图像中进行人脸检测。我们将从简单的滑动窗口匹配方法开始,探讨其原理、优势与局限性,并最终引出更高效、更强大的现代检测方法。

上一节我们介绍了如何使用主成分分析(PCA)和特征脸来描述人脸。本节中我们来看看如何利用这些“典型”人脸在图像中定位真实的人脸。

一个简单的解决方案是:既然我们知道典型人脸的样子,就可以在图像中扫描寻找它。例如,对于一张400x200像素的图像,我们首先将其转换为灰度图。我们还有一个从数据中构建的、同样为灰度的典型人脸模板。我们需要确保图像中的人脸尺寸大致与模板匹配。

然后,我们可以开始尝试将典型人脸模板放置在图像的每一个可能位置上进行匹配,直到找到匹配度高的区域。这样我们就能得到图像中人脸可能出现的位置。

以下是扫描匹配的过程:

  • 在图像的每个候选位置,将典型人脸模板覆盖在对应的图像区域上。
  • 计算模板与该图像区域之间的匹配度。这通过计算两个向量(图像块向量和模板向量)的内积来实现。
  • 内积公式为:match_score = sum(image_patch[i] * template[i]),对所有像素i求和。
  • 当图像块与模板越相似时,这个内积值就越大。

最终,我们会得到一个热力图,其中高亮区域表示检测到的人脸。然而,这种方法存在误报(将非人脸区域检测为人脸)的问题。误报发生的原因是,一个看起来完全不像人脸的图像块,其与模板的点积也可能很大。

但滑动窗口方法只解决了定位问题。如果图像中的人脸尺寸不同呢?例如一张海报上有五个大小不一的人脸。为了解决尺度问题,我们需要将典型人脸模板缩放到不同大小,或者将图像缩放到不同尺度,然后分别进行扫描。但这仍然不能捕捉所有变化,比如头部的倾斜和旋转。为了全面检测,我们可能需要考虑模板所有可能的朝向和尺寸,计算量会变得非常庞大。

因此,在图像中寻找人脸曾是一个极具挑战性的任务。在20世纪90年代末和21世纪初,卡内基梅隆大学拥有世界上最先进的人脸检测系统。这些系统虽然准确,但存在一个主要问题:计算耗时极长,处理一张图片可能需要数天甚至更长时间。

随后,一项突破性的进展发生了。Paul Viola和Michael Jones提出了一种革命性的方法,极大地提升了检测速度,使得实时人脸检测成为可能。他们的工作标志着人脸检测技术进入了一个新时代。

本节课中我们一起学习了如何利用特征脸进行基础的人脸检测,了解了滑动窗口匹配法的原理及其在尺度和旋转变化上的局限性,并简要回顾了人脸检测技术从计算密集型方法到实时高效算法的演进历程。

007:人脸检测

在本节课中,我们将学习人脸检测的基本概念。人脸检测是计算机视觉中的一个重要任务,旨在从图像或视频中定位和识别出人脸区域。我们将探讨其核心思想、常用方法以及一个简单的实现示例。

上一节我们介绍了图像处理的基础,本节中我们来看看如何将这些知识应用于具体的人脸检测任务。

核心概念

人脸检测的核心是区分图像中的人脸区域与非人脸区域。这通常通过分析图像的局部特征来实现。

一个经典的方法是使用Haar级联分类器。其基本思想是利用矩形特征(Haar-like features)来描述图像的局部纹理模式。分类器通过计算这些特征的加权和来做出决策。

公式表示一个弱分类器 $ h_j(x) $ 可能如下:

\[h_j(x) = \begin{cases} 1 & \text{if } \sum_{i} w_i \cdot \text{feature}_i(x) < \theta_j \\ 0 & \text{otherwise} \end{cases} \]

其中,$ x $ 是图像子窗口,$ w_i $ 是权重,$ \theta_j $ 是阈值。

多个弱分类器组合成一个强分类器,最终用于判断一个区域是否包含人脸。

实现步骤

以下是实现一个简单人脸检测流程的关键步骤。

  1. 数据准备:收集包含人脸和不包含人脸的图像样本,用于训练分类器。
  2. 特征提取:对每个图像样本计算Haar-like特征。这些特征反映了图像中明暗区域的变化。
  3. 训练分类器:使用AdaBoost等算法训练一个级联分类器。该过程会筛选出最能区分人脸与非人脸的少数关键特征。
  4. 滑动窗口检测:在待检测图像上使用不同大小的窗口进行滑动,对每个窗口应用训练好的分类器进行判断。
  5. 非极大值抑制:合并重叠的检测窗口,得到最终的人脸位置。

代码示例

以下是一个使用OpenCV库中预训练Haar级联模型进行人脸检测的Python代码示例。

import cv2

# 加载预训练的人脸检测器(Haar级联模型)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 读取图像
img = cv2.imread('test_image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 进行人脸检测
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

# 在图像上绘制检测框
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)

# 显示结果
cv2.imshow('Detected Faces', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这段代码中:

  • detectMultiScale 函数负责多尺度检测。
  • scaleFactor 参数控制图像金字塔的缩放比例。
  • minNeighbors 参数指定每个候选矩形应保留的邻居数量,用于过滤假阳性结果。
  • minSize 参数指定人脸的最小可能尺寸。

总结

本节课中我们一起学习了人脸检测的基础知识。我们了解了其核心任务是定位图像中的人脸区域,并介绍了基于Haar特征的级联分类器这一经典方法。通过一个简单的代码示例,我们看到了如何利用现有工具快速实现基本的人脸检测功能。理解这些基本原理是进一步学习更复杂人脸识别技术的基础。

008:优化

概述

在本节课中,我们将学习优化的基本概念。优化是寻找函数最佳值(如最小值或最大值)的过程,这在机器学习中至关重要。我们将从优化问题本身开始,回顾导数与极值点的关系,然后介绍几种核心的优化方法,包括梯度下降法、牛顿法,并简要提及约束优化与正则化。


优化问题简介

在之前的课程中,我们已经无意中接触过优化问题。例如,当我们尝试将音乐信号投影到一组音符构成的基上时,我们使用了投影矩阵。这个投影矩阵有一个特定属性:它由音符本身构成。我们的目标是找到一个投影矩阵 P,使得原始音乐矩阵 M 与投影后的音乐 PM 之间的平方误差最小,同时满足 P 由音符组合构成的约束。这本质上就是一个约束优化问题

因此,优化的一般问题是:对于一个函数 f(x),寻找能使该函数值达到最小(或最大)的 x 值。x 可以是标量,也可以是向量(多变量函数)。


导数与极值点

几乎所有人在学校都接触过如何寻找函数的最小值。一个关键性质是:函数的极值点(最小值或最大值)通常是驻点(Turning Point)。在驻点处,函数的变化方向发生改变。对于最小值点,函数值先下降,到达该点后开始上升。

那么,如何找到驻点呢?这需要用到导数的概念。

导数的定义

对于一个标量函数 y = f(x),其导数 f'(x) 衡量了当自变量 x 发生微小变化 Δx 时,函数值 y 的变化量 Δy。其核心关系可以表示为:

Δy ≈ f'(x) * Δx

Δx 足够小时,这个近似是准确的。导数 f'(x) 本身是 x 的函数,它代表了函数在 x 点处的瞬时变化率或斜率。

利用导数寻找极值

导数为我们提供了寻找极值点的工具。考虑函数在某个点 x 的情况:

  • 如果 f'(x) > 0,意味着函数在 x 点处正在上升。
  • 如果 f'(x) < 0,意味着函数在 x 点处正在下降。
  • 如果 f'(x) = 0,则 x 是一个临界点(Critical Point),它可能是极小值点、极大值点或鞍点。

因此,寻找函数最小值的一个经典方法是:找到所有满足 f'(x) = 0x,然后判断哪个是真正的极小值点。


优化方法

对于简单函数,我们可以直接求解方程 f'(x) = 0。但对于复杂的、尤其是多变量的函数,我们需要迭代的数值方法。以下是几种核心方法:

梯度下降法

对于多变量函数 f(x),其中 x 是一个向量,我们使用梯度(Gradient)来代替导数。梯度 ∇f(x) 是一个向量,其每个分量是函数对该分量的偏导数,它指向函数在该点处上升最快的方向。

梯度下降法的思想很简单:既然梯度指向上升最快的方向,那么它的反方向 -∇f(x) 就指向下降最快的方向。我们沿着这个方向前进一小步,就能降低函数值。其更新公式为:

x_new = x_old - η * ∇f(x_old)

其中 η 是一个正数,称为学习率(Learning Rate),它控制着每一步的步长。

以下是梯度下降法的步骤:

  1. 初始化参数 x 和学习率 η
  2. 计算当前点 x 的梯度 ∇f(x)
  3. 按照公式 x := x - η∇f(x) 更新参数。
  4. 重复步骤2和3,直到梯度接近零或达到预设的迭代次数。

牛顿法

梯度下降法只使用了一阶导数(梯度)信息。牛顿法则进一步利用了二阶导数(海森矩阵,Hessian)的信息,它通过构造函数的二次局部近似来更直接地找到临界点。

对于寻找 f(x) 的根(即 f'(x)=0 的点),牛顿法的更新公式为:

x_new = x_old - f'(x_old) / f''(x_old)

对于多变量情况,公式推广为:

x_new = x_old - [Hf(x_old)]^{-1} * ∇f(x_old)

其中 Hf(x) 是海森矩阵(二阶偏导数矩阵)。牛顿法通常收敛更快,但计算海森矩阵及其逆矩阵的代价很高。

其他优化方法

除了上述两种基础方法,优化领域还有许多重要分支:

  • 在线优化:适用于数据流持续到达的场景,模型需要随着新数据的到来而持续更新。
  • 约束优化:在优化过程中,参数 x 必须满足某些约束条件(例如我们开头的音乐投影例子)。
  • 正则化:在优化目标函数中加入一个惩罚项,以防止模型过拟合,例如L1正则化(Lasso)和L2正则化(Ridge Regression)。
  • 凸优化:当目标函数是凸函数时,任何局部极小值都是全局极小值,这大大简化了优化问题。拉格朗日对偶是处理约束凸优化问题的有力工具。

由于时间关系,凸优化及拉格朗日对偶等内容将不在此详细展开,但课程幻灯片中包含了这些主题,欢迎在课程论坛上提问。


总结

本节课我们一起学习了优化的核心概念。我们首先回顾了优化问题的定义,并通过一个投影的例子说明了其实际应用。接着,我们解释了导数(对于多变量是梯度)如何指示函数的变化方向,并用于寻找极值点。然后,我们重点介绍了两种基本的迭代优化算法:梯度下降法(沿负梯度方向更新)和牛顿法(利用二阶导数信息更快收敛)。最后,我们简要列举了在线优化、约束优化、正则化及凸优化等重要方向,为后续更深入的学习奠定了基础。优化是机器学习模型训练的引擎,理解这些基本原理至关重要。

009:线性代数基础-I

概述

在本节课中,我们将学习线性代数的基础知识。线性代数是机器学习和信号处理的核心数学工具,它帮助我们简化复杂的计算,并为我们提供理解数据的直观方式。我们将从向量和矩阵的基本定义开始,逐步介绍相关的运算和性质。


向量与矩阵基础

上一节我们概述了线性代数的重要性,本节中我们来看看其最基本的构成元素:向量和矩阵。

什么是向量?

向量是一个有序的数字集合。它可以被视为多维空间中的一个点或一个方向。在数学表示上,向量通常写作列的形式。

公式
一个 n 维列向量 v 可以表示为:

v = [v1, v2, ..., vn]^T

其中 ^T 表示转置,v1, v2, ..., vn 是向量的元素。

什么是矩阵?

矩阵是一个二维的数字阵列,由行和列组成。它可以被视为多个向量的集合(列向量或行向量),或者是一个将向量映射到另一个向量的线性变换。

公式
一个 m 行 n 列的矩阵 A 可以表示为:

A = [ a11  a12  ...  a1n ]
    [ a21  a22  ...  a2n ]
    [ ...  ...  ...  ... ]
    [ am1  am2  ...  amn ]

基本矩阵与向量运算

理解了向量和矩阵是什么之后,我们来看看可以对它们进行哪些基本运算。

以下是几种核心的线性代数运算:

  1. 向量加法:两个相同维度的向量对应元素相加。
    代码(Python示例):

    import numpy as np
    v1 = np.array([1, 2, 3])
    v2 = np.array([4, 5, 6])
    result = v1 + v2  # 结果为 [5, 7, 9]
    
  2. 标量乘法:一个向量中的每个元素都乘以一个标量(单个数字)。
    公式:对于标量 c 和向量 vc * v = [c*v1, c*v2, ..., c*vn]^T

  3. 点积(内积):两个相同维度向量的点积是一个标量,由对应元素相乘后求和得到。
    公式:对于向量 uvu · v = u1*v1 + u2*v2 + ... + un*vn
    这正是将复杂的双重求和 Σ_j y_j Σ_i x_i a_ij 简化为 x^T A y 的基础。

  4. 矩阵乘法:矩阵 A (m×n) 与矩阵 B (n×p) 相乘得到新矩阵 C (m×p)。C 的第 i 行第 j 列元素是 A 的第 i 行与 B 的第 j 列的点积。
    代码(Python示例):

    A = np.array([[1, 2], [3, 4]])
    B = np.array([[5, 6], [7, 8]])
    C = np.dot(A, B)  # 或使用 A @ B
    

线性代数的应用与直觉

学习了基本运算,我们再来探讨线性代数为何如此强大。它的魅力不仅在于简化符号,更在于提供深刻的直觉。

例如,计算机图形学中的物体旋转、缩放、投影等复杂变换,都可以通过矩阵乘法优雅地实现。在信号处理中,一段音乐(如巴赫G小调赋格曲的一个小节)可以通过线性代数技术(如谱图分析和矩阵分解)分解为几个基本的音符构件,而无需任何先验的音乐知识。这展示了线性代数从数据中提取结构和信息的强大能力。


总结

本节课中我们一起学习了线性代数的基石。我们定义了向量和矩阵,介绍了向量加法、标量乘法、点积和矩阵乘法等基本运算。更重要的是,我们理解了线性代数通过简化 notation 和提供强大直觉,成为处理机器学习和信号处理中高维数据不可或缺的工具。在接下来的课程中,我们将在此基础上,探讨如何求解线性方程组、理解投影概念,以及学习特征分解和奇异值分解等更高级的主题。

010:1 - 引言

在本节课中,我们将学习信号处理与机器学习的基本概念,了解什么是信号,并探讨信号处理与机器学习结合的意义。


什么是信号?

上一节我们介绍了课程的基本信息,本节中我们来看看信号的定义。信号是传递信息的机制。根据定义,信号是有序的数字集合,用于传递信息。信号通常描述现实世界的现象,从源头发送到目的地。有时,源和目的地可能是同一个人,例如将信息存储在磁盘上供未来使用。

以下是信号的一些关键特征:

  • 信号是有序的数字集合
  • 信号传递信息
  • 信号通常描述现实世界的现象

信号的例子

理解了信号的基本定义后,我们来看看一些具体的信号例子。这些例子将帮助我们更直观地理解信号在现实世界中的表现形式。

以下是几种常见的信号类型:

  1. 音频信号:音频信号是表示可感知声音的时间序列。如果将其绘制出来,它会像左侧的图形。放大来看,它只是一系列有序的数字。改变这些数字的顺序,将无法表示相同的声音。
  2. 图像:图像是数字的矩形排列。对于黑白图像,每个像素是一个二进制数(0或1)。对于灰度图像,每个像素是一个介于0到1或0到255之间的连续值。对于彩色图像,每个像素由三个这样的数字组成(分别代表红、绿、蓝)。改变排列方式,将得到完全不同的图像。
  3. 医学影像(如MRI):磁共振成像(MRI)数据是在变换域中获取的有序数字集合,可以从这些数据中导出图像。这种有序的数字集合也是一种信号。
  4. 生理信号(如EEG、ECG):脑电图(EEG)、心电图(ECG)、光学相干断层扫描、超声心动图等,这些都是表示身体读数的信号。
  5. 金融数据:股票价格或指数价值等金融数据也是信号。它们是表示市场趋势的有序数字排列。用于处理信号的技术经常被应用于这类金融数据。

信号处理与机器学习

我们已经看到了多种信号示例,接下来探讨本课程的核心:信号处理与机器学习的结合。本课程标题“Machine Learning for Signal Processing”包含三个部分:机器学习、信号和处理。

信号处理涉及对信号进行操作以提取信息或转换信号。机器学习则为分析和处理这些信号提供了强大的工具和算法。两者的结合,使得我们能够从复杂的信号数据中自动发现模式、进行预测和做出决策。


本节课中我们一起学习了信号的基本定义,它是有序的数字集合,用于传递信息。我们列举了音频、图像、医学和金融数据等多种信号实例。最后,我们介绍了本课程将机器学习技术应用于信号处理这一核心主题。在后续课程中,我们将深入探讨处理这些信号的具体方法。

机器学习与信号处理:P11:线性代数 2

在本节课中,我们将继续学习线性代数,重点探讨矩阵的逆、投影、特征值分解以及奇异值分解等核心概念。这些工具对于理解数据变换和降维至关重要。


上一节我们回顾了向量、基、矩阵作为数据容器和空间变换器的概念。本节中,我们来看看矩阵的逆运算。

矩阵的逆

一个矩阵可以将一个N维对象变换为另一个N维对象。例如,它可以将一个球体变换为一个椭球体。矩阵的逆则执行相反的变换。如果矩阵 T 将球体变为椭球体,那么 T⁻¹ 会将椭球体变回球体。

连续执行变换及其逆变换,结果应为恒等变换。因此,矩阵与其逆矩阵的乘积是单位矩阵 I

公式T * T⁻¹ = T⁻¹ * T = I

并非所有矩阵都存在逆矩阵。只有方阵(行数与列数相等)且行列式不为零(即满秩)的矩阵才是可逆的。


理解了逆变换后,我们来看一个重要的应用:投影。

投影

投影是将一个向量映射到另一个向量或子空间上的操作。以下是投影的关键点:

  • 正交投影:向量 x 在向量 v 上的投影,结果是 v 方向的一个标量倍数。
  • 投影矩阵:可以将投影操作表示为一个矩阵 P。对任意向量 xPx 就是 x 在目标子空间上的投影。
  • 性质:投影矩阵是幂等的,即 P² = P。应用两次投影与应用一次效果相同。

投影帮助我们理解向量在特定方向上的分量。接下来,我们探讨一种揭示矩阵内在结构的强大工具:特征分解。

特征值与特征向量

对于一个方阵 A,如果存在一个非零向量 v 和一个标量 λ,使得 Av = λv,那么 v 称为 A 的特征向量,λ 称为对应的特征值。

公式A v = λ v

这意味着,矩阵 A 对特征向量 v 的变换,仅仅是缩放(乘以 λ),而不改变其方向。

  • 几何意义:特征向量指示了矩阵变换后方向保持不变的轴,特征值则表示沿这些轴的缩放因子。
  • 特征分解:如果方阵 A 有 n 个线性无关的特征向量,它可以分解为 A = V Λ V⁻¹,其中 V 的列是特征向量,Λ 是对角矩阵,其对角线元素是特征值。

特征分解局限于方阵。对于更一般的矩形矩阵,我们需要一个更通用的工具:奇异值分解。

奇异值分解

奇异值分解是线性代数中一个极其重要的概念。任何矩阵 A(m×n)都可以分解为三个矩阵的乘积:

公式A = U Σ Vᵀ

以下是各组成部分的含义:

  • U:一个 m×m 的正交矩阵,其列向量称为左奇异向量。
  • Σ:一个 m×n 的对角矩阵(非方阵),其对角线上的非负元素称为奇异值,通常按降序排列。
  • Vᵀ:一个 n×n 的正交矩阵 V 的转置,V 的列向量称为右奇异向量。

SVD的解读

  1. 基变换Vᵀ 代表输入空间(ℝⁿ)中的旋转/反射。
  2. 缩放Σ 对坐标进行缩放(奇异值),可能还会降低维度(如果 m≠n)。
  3. 基变换U 代表输出空间(ℝᵐ)中的旋转/反射。

核心洞察:SVD 揭示了矩阵 A 的作用是将输入空间的正交基(V 的列)映射到输出空间的正交基(U 的列),并沿每个方向进行由奇异值指定的缩放。


总结

本节课我们一起学习了:

  1. 矩阵的逆:作为反向变换,满足 A * A⁻¹ = I
  2. 投影:将向量映射到子空间,可用幂等矩阵表示。
  3. 特征分解:对方阵 A,分解为 A = V Λ V⁻¹,揭示其固有的缩放方向(特征向量和特征值)。
  4. 奇异值分解:对任意矩阵 A,分解为 A = U Σ Vᵀ,这是理解矩阵几何本质和数据降维(如主成分分析的基础)的关键工具。

这些概念为后续学习机器学习中的维度约减、数据压缩和特征提取奠定了坚实的数学基础。

posted @ 2026-03-26 01:39  绝不原创的飞龙  阅读(2)  评论(0)    收藏  举报