深度学习中的常用线性代数知识汇总——第二篇:行列式、逆矩阵、特征值与特征向量

文章目录

      • [0. 前言](#0. 前言)
      • [1. 行列式](#1. 行列式)
        • [1.1 行列式的定义](#1.1 行列式的定义)
        • [1.2 行列式的计算方法](#1.2 行列式的计算方法)
        • [1.3 行列式的性质](#1.3 行列式的性质)
        • [1.4 行列式在深度学习中的应用](#1.4 行列式在深度学习中的应用)
      • [2. 逆矩阵](#2. 逆矩阵)
        • [2.1 逆矩阵的定义](#2.1 逆矩阵的定义)
        • [2.2 逆矩阵的计算方法](#2.2 逆矩阵的计算方法)
        • [2.3 逆矩阵的性质](#2.3 逆矩阵的性质)
        • [2.4 逆矩阵在深度学习中的应用](#2.4 逆矩阵在深度学习中的应用)
      • [3. 特征值与特征向量](#3. 特征值与特征向量)
        • [3.1 特征值与特征向量的定义](#3.1 特征值与特征向量的定义)
        • [3.2 特征值和特征向量的计算方法](#3.2 特征值和特征向量的计算方法)
        • [3.3 特征值和特征向量的性质](#3.3 特征值和特征向量的性质)
        • [3.4 特征值和特征向量在深度学习中的应用](#3.4 特征值和特征向量在深度学习中的应用)

0. 前言

按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

本系列文章用于介绍深度学习中必须要掌握的线性代数基础知识,并结合了PyTorch代码实例。这是本系列文章的第二篇,相关文章链接如下:

1. 行列式

矩阵的行列式(Determinant)是线性代数中的一个重要概念,它在矩阵理论和线性变换中扮演着关键角色。行列式提供了一种量化矩阵性质的方法,特别是在解决线性方程组、计算体积变化判断矩阵可逆性等方面具有重要意义。下面详细介绍矩阵的行列式的定义、性质及其在深度学习中的应用。

推荐一个关联视频:https://www.bilibili.com/video/BV1Hy4y1a7wm/?spm_id_from=333.999.0.0&vd_source=b1f7ee1f8eac76793f6cadd56716bfbf

1.1 行列式的定义

对于一个 n × n n \times n n×n 的方阵 A A A,其行列式 det ⁡ ( A ) \det(A) det(A)或记作 ∣ A ∣ |A| ∣A∣是一个标量值,它由矩阵的元素通过特定的方式计算得出。

1.2 行列式的计算方法
  1. 2x2 矩阵

    对于一个 2 × 2 2 \times 2 2×2 的矩阵 A A A:
    A = ( a b c d ) A = \begin{pmatrix} a & b \\ c & d \end{pmatrix} A=(acbd)

    其行列式为:
    det ⁡ ( A ) = a d − b c \det(A) = ad - bc det(A)=ad−bc

  2. 3x3 矩阵

    对于一个 3 × 3 3 \times 3 3×3的矩阵 A A A:
    A = ( a b c d e f g h i ) A = \begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix} A= adgbehcfi

    其行列式为:
    det ⁡ ( A ) = a ( e i − f h ) − b ( d i − f g ) + c ( d h − e g ) \det(A) = a(ei - fh) - b(di - fg) + c(dh - eg) det(A)=a(ei−fh)−b(di−fg)+c(dh−eg)

  3. 一般 n × n n \times n n×n 矩阵

    对于 n × n n \times n n×n的矩阵,可以通过递归展开的方式来计算行列式。通常选择第一行(或第一列)来进行展开。具体步骤如下:

    ①选择一行(或一列):通常选择第一行或第一列,因为这样可以简化计算。

    ②计算辅因子:对于该行(或列)的每个元素 a i j a_{ij} aij,计算其对应的辅因子(cofactor),记作 A i j A_{ij} Aij。辅因子 A i j A_{ij} Aij 是去掉第 i i i 行和第 j j j列后剩余子矩阵的行列式乘以 ( − 1 ) i + j (-1)^{i+j} (−1)i+j。

    ③ 求和:将该一行(或列)的每个元素与其对应的辅因子相乘,然后求和。

PyTorch中的linalg.det()方法可以用来计算行列式,示例代码如下:

python 复制代码
import torch

# 定义一个 3x3 的矩阵 A
A = torch.tensor([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 10]],dtype=torch.float32)

# 计算行列式
det_A = torch.linalg.det(A)

print("Matrix A:")
print(A)
print("Determinant of A:")
print(det_A)

输出为:

python 复制代码
Matrix A:
tensor([[ 1.,  2.,  3.],
        [ 4.,  5.,  6.],
        [ 7.,  8., 10.]])
Determinant of A:
tensor(-3.0000)
1.3 行列式的性质

行列式有许多重要的性质,这些性质使得它在理论和应用中都非常有用。

  • 线性性 :如果矩阵的某一行(或列)乘以一个标量 k k k,那么行列式也乘以 k k k。
  • 反对称性:交换任意两行(或列)的位置,行列式的值变号。
  • 零行(列):如果矩阵有一行(或一列)全是零,则行列式为零。
  • 单位矩阵 :单位矩阵 I I I 的行列式为 1。
  • 对角矩阵:对角矩阵的行列式等于对角线上元素的乘积。
  • 三角矩阵:上三角矩阵或下三角矩阵的行列式等于对角线上元素的乘积。
  • 可逆性 :当且仅当 det ⁡ ( A ) ≠ 0 \det(A) \neq 0 det(A)=0矩阵 A A A 可逆。
  • 相似矩阵:相似矩阵具有相同的行列式。
  • 矩阵乘法 :如果 A A A 和 B B B是两个 n × n n \times n n×n 的矩阵,则 det ⁡ ( A B ) = det ⁡ ( A ) det ⁡ ( B ) \det(AB) = \det(A) \det(B) det(AB)=det(A)det(B)。
1.4 行列式在深度学习中的应用

在深度学习中,行列式主要应用于以下几个方面:

  1. 判断矩阵可逆性:行列式不为零的矩阵是可逆的。这在深度学习中很重要,特别是在计算矩阵的逆时,确保矩阵是可逆的是必要的。

  2. 梯度流的稳定性:行列式可以用来估计矩阵的条件数(回忆一下上一篇文章的奇异值介绍部分),从而判断矩阵的稳定性。条件数大意味着矩阵接近奇异,可能导致数值不稳定,影响梯度流。

  3. 模型诊断:通过计算权重矩阵的行列式,可以诊断模型训练过程中是否存在数值不稳定或梯度消失等问题。如果行列式接近零,可能表明矩阵接近奇异,需要调整模型或优化算法。

  4. 数据变换:行列式可以用来衡量线性变换对体积的影响。在深度学习中,某些变换(如卷积层中的滤波器应用)可能会影响输入数据的空间分布,行列式可以用来量化这种影响。

2. 逆矩阵

对于一个方阵而言,如果存在另一个矩阵,使得这两个矩阵相乘的结果为单位矩阵,那么这个矩阵称为原矩阵的逆矩阵。逆矩阵在解决线性方程组、矩阵求解、数据拟合、图像处理等领域都有广泛应用。下面详细介绍逆矩阵的概念、计算方法及其应用。

2.1 逆矩阵的定义

对于一个 n × n n \times n n×n 的方阵 A A A,如果存在另一个 n × n n \times n n×n 的方阵 B B B,使得:
A B = B A = I AB = BA = I AB=BA=I

其中 I I I 是单位矩阵,那么矩阵 B B B称为矩阵 A A A的逆矩阵,记作 A − 1 A^{-1} A−1。换句话说,如果矩阵 A A A与矩阵 B B B相乘的结果为单位矩阵,那么 B B B 就是 A A A的逆矩阵。

2.2 逆矩阵的计算方法

逆矩阵的计算有以下方法:

  1. 伴随矩阵法(比较复杂的方法)

    对于一个 n × n n \times n n×n 的矩阵 A A A,其伴随矩阵 A ∗ A^* A∗ 的定义为:
    A ∗ = adj ( A ) A^* = \text{adj}(A) A∗=adj(A)

    其中, adj ( A ) \text{adj}(A) adj(A) 是 A A A的伴随矩阵 ,其元素为 A A A的代数余子式的转置矩阵 。逆矩阵可以用伴随矩阵和行列式来表示:
    A − 1 = 1 det ⁡ ( A ) A ∗ A^{-1} = \frac{1}{\det(A)} A^* A−1=det(A)1A∗

    矩阵中第 i i i 行和第 j j j列元素对应的代数余子式是将矩阵中第 i i i 行和第 j j j列删除后剩下的 ( n − 1 ) × ( n − 1 ) (n-1) \times (n-1) (n−1)×(n−1) 子矩阵的行列式,乘以 ( − 1 ) i + j (-1)^{i+j} (−1)i+j。

  2. 行列变换法(高斯消元法)

    通过行列变换将矩阵 A A A转换为单位矩阵,同时对单位矩阵 I I I进行相同的变换,最终得到的矩阵即为 A − 1 A^{-1} A−1。

  3. 矩阵分解法(LU 分解)

    如果矩阵 A A A 可以分解为一个下三角矩阵 L L L和一个上三角矩阵 U U U的乘积,即 A = L ⋅ U A = L · U A=L⋅U,那么可以通过求解 L L L和 U U U 的逆矩阵来间接求得 A − 1 A^{-1} A−1。

PyTorch中的torch.linalg.inv()方法可以用来计算逆矩阵,实例如下:

python 复制代码
import torch

# 定义一个 3x3 的矩阵 A
A = torch.tensor([[1, 2, 3],
                        [4, 5, 6],
                        [7, 8, 10]],dtype=torch.float32)

#计算逆矩阵
inv_A = torch.linalg.inv(A)

print('inverse of A:\n', inv_A)
print('validation:\n',torch.mm(A, inv_A))

输出为:

python 复制代码
inverse of A:
 tensor([[-0.6667, -1.3333,  1.0000],
        [-0.6667,  3.6667, -2.0000],
        [ 1.0000, -2.0000,  1.0000]])
validation:
 tensor([[ 1.0000e+00,  0.0000e+00,  2.3842e-07],
        [ 0.0000e+00,  1.0000e+00,  4.7684e-07],
        [-9.5367e-07,  1.9073e-06,  1.0000e+00]])
2.3 逆矩阵的性质
  1. 唯一性 :如果矩阵 A A A存在逆矩阵,那么逆矩阵是唯一的。
  2. 存在性 :只有当矩阵 A A A的行列式 det ⁡ ( A ) ≠ 0 \det(A) \neq 0 det(A)=0时,矩阵 A A A 才存在逆矩阵。
  3. 单位矩阵的逆 :单位矩阵 I I I的逆矩阵仍然是 I I I。
  4. 逆的逆 :如果矩阵 A A A 可逆,则 ( A − 1 ) − 1 = A (A^{-1})^{-1} = A (A−1)−1=A。
  5. 转置矩阵的逆 :如果矩阵 A A A可逆,则 ( A T ) − 1 = ( A − 1 ) T (A^T)^{-1} = (A^{-1})^T (AT)−1=(A−1)T。
  6. 乘积的逆 :如果矩阵 A A A 和 B B B 都可逆,则 ( A B ) − 1 = B − 1 A − 1 (AB)^{-1} = B^{-1}A^{-1} (AB)−1=B−1A−1。
2.4 逆矩阵在深度学习中的应用

直接计算逆矩阵在深度学习中并不是常见的操作,因为计算逆矩阵的时间复杂度较高,而且在数值上可能是不稳定的(看看上面PyTorch的示例,验算的结果并不是严格的单位矩阵)。

但是在一些特殊的神经网络架构中,如正交初始化或者在某些循环神经网络(RNNs)变种中,保持权重矩阵的可逆性有助于避免梯度消失或爆炸问题。此时,逆矩阵的概念会被间接应用。

3. 特征值与特征向量

3.1 特征值与特征向量的定义

给定一个 n × n n \times n n×n的方阵 A A A,如果存在一个非零向量 v \mathbf{v} v和一个标量 λ \lambda λ,使得:
A v = λ v A\mathbf{v} = \lambda\mathbf{v} Av=λv

则称 λ \lambda λ是矩阵 A A A的一个特征值,而 v \mathbf{v} v 是对应于 λ \lambda λ的特征向量。

3.2 特征值和特征向量的计算方法

为了找到特征值,我们可以将上述方程重写为:
( A − λ I ) v = 0 (A - \lambda I)\mathbf{v} = \mathbf{0} (A−λI)v=0

其中 I I I是单位矩阵。为了使上述方程有非零解,系数矩阵 A − λ I A - \lambda I A−λI必须是奇异的(即行列式等于0,即不是满秩矩阵)。因此,我们需要求解行列式:

det ⁡ ( A − λ I ) = 0 \det(A - \lambda I) = 0 det(A−λI)=0

这个行列式方程即为矩阵 A A A的特征方程。解这个多项式方程就可以得到矩阵 A A A的所有特征值。

PyTorch中的torch.linalg.eigh()可以用来计算特征值和特征向量,实例如下:

python 复制代码
import torch

# 假设A是对称矩阵
A = torch.tensor([[1., 2.],
                        [2., 1.]], dtype=torch.float)

# 计算矩阵A的特征值和特征向量
eigenvalues_sym, eigenvectors_sym = torch.linalg.eigh(A)

# 输出特征值
print("Eigenvalues (Symmetric Matrix):\n", eigenvalues_sym)

# 输出特征向量
print("Eigenvectors (Symmetric Matrix):\n", eigenvectors_sym)

#进行验算
print("Validation:\n",A @ eigenvectors_sym[0] == eigenvalues_sym[0] * eigenvectors_sym[0])

输出为:

python 复制代码
Eigenvalues (Symmetric Matrix):
 tensor([-1.,  3.])
Eigenvectors (Symmetric Matrix):
 tensor([[-0.7071,  0.7071],
        [ 0.7071,  0.7071]])
Validation:
 tensor([True, True])
3.3 特征值和特征向量的性质
  1. 特征值的性质

    • 特征值的和 :所有特征值的和等于矩阵的迹(trace),即对角线元素的和。
    • 特征值的乘积 :所有特征值的乘积等于矩阵的行列式(determinant)。
  2. 特征向量的性质

    • 线性无关性:不同特征值对应的特征向量是线性无关的。
    • :对于 n × n n \times n n×n矩阵,如果存在 n n n个线性无关的特征向量,那么这些向量可以构成 n n n 维空间的一个基。
3.4 特征值和特征向量在深度学习中的应用

在深度学习中,特征值和特征向量主要用于以下几个方面:

  1. 主成分分析(PCA):通过 PCA 技术,可以找到数据的主要成分(特征向量),并将其投影到低维空间中,从而实现数据降维。
  2. 正则化:通过惩罚权重矩阵的特征值(即核范数),可以控制模型的复杂度,防止过拟合。
  3. 模型诊断:通过计算矩阵的特征值,可以估计矩阵的条件数(最大特征值与最小特征值的比值),从而判断矩阵的数值稳定性。(这点与奇异值类似)
相关推荐
水木流年追梦7 分钟前
【python因果推断库16】使用 PyMC 模型进行回归拐点设计
开发语言·python·回归
scdifsn10 分钟前
动手学深度学习8.5. 循环神经网络的从零开始实现-笔记&练习(PyTorch)
pytorch·笔记·rnn·深度学习·梯度剪裁
akhfuiigabv24 分钟前
使用LangChain创建简单的语言模型应用程序【快速入门指南】
java·python·语言模型·langchain
西猫雷婶40 分钟前
python画图|中秋到了,尝试画个月亮(球体画法)
开发语言·python
Point__Nemo1 小时前
深度学习Day-33:Semi-Supervised GAN理论与实战
人工智能·深度学习
William数据分析1 小时前
[Python可视化]数据可视化在医疗领域应用:提高诊断准确性和治疗效果
python·信息可视化·数据分析
测试杂货铺1 小时前
selenium元素定位:元素点击交互异常解决方法
自动化测试·软件测试·python·selenium·测试工具·职场和发展·单元测试
aWty_1 小时前
机器学习--线性回归
python·算法·机器学习·线性回归
白如意i1 小时前
在CentOS 7上安装Python 3并设置本地编程环境的方法
linux·python·centos
肥猪猪爸2 小时前
“xi” 和 “dbscan” 在OPTICS聚类中是什么意思
python·机器学习·支持向量机·聚类