文章目录
-
-
- [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)是线性代数中的一个重要概念,它在矩阵理论和线性变换中扮演着关键角色。行列式提供了一种量化矩阵性质的方法,特别是在解决线性方程组、计算体积变化 、判断矩阵可逆性等方面具有重要意义。下面详细介绍矩阵的行列式的定义、性质及其在深度学习中的应用。
1.1 行列式的定义
对于一个 n × n n \times n n×n 的方阵 A A A,其行列式 det ( A ) \det(A) det(A)或记作 ∣ A ∣ |A| ∣A∣是一个标量值,它由矩阵的元素通过特定的方式计算得出。
1.2 行列式的计算方法
-
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 -
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) -
一般 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 行列式在深度学习中的应用
在深度学习中,行列式主要应用于以下几个方面:
-
判断矩阵可逆性:行列式不为零的矩阵是可逆的。这在深度学习中很重要,特别是在计算矩阵的逆时,确保矩阵是可逆的是必要的。
-
梯度流的稳定性:行列式可以用来估计矩阵的条件数(回忆一下上一篇文章的奇异值介绍部分),从而判断矩阵的稳定性。条件数大意味着矩阵接近奇异,可能导致数值不稳定,影响梯度流。
-
模型诊断:通过计算权重矩阵的行列式,可以诊断模型训练过程中是否存在数值不稳定或梯度消失等问题。如果行列式接近零,可能表明矩阵接近奇异,需要调整模型或优化算法。
-
数据变换:行列式可以用来衡量线性变换对体积的影响。在深度学习中,某些变换(如卷积层中的滤波器应用)可能会影响输入数据的空间分布,行列式可以用来量化这种影响。
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 逆矩阵的计算方法
逆矩阵的计算有以下方法:
-
伴随矩阵法(比较复杂的方法)
对于一个 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。
-
行列变换法(高斯消元法)
通过行列变换将矩阵 A A A转换为单位矩阵,同时对单位矩阵 I I I进行相同的变换,最终得到的矩阵即为 A − 1 A^{-1} A−1。
-
矩阵分解法(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 逆矩阵的性质
- 唯一性 :如果矩阵 A A A存在逆矩阵,那么逆矩阵是唯一的。
- 存在性 :只有当矩阵 A A A的行列式 det ( A ) ≠ 0 \det(A) \neq 0 det(A)=0时,矩阵 A A A 才存在逆矩阵。
- 单位矩阵的逆 :单位矩阵 I I I的逆矩阵仍然是 I I I。
- 逆的逆 :如果矩阵 A A A 可逆,则 ( A − 1 ) − 1 = A (A^{-1})^{-1} = A (A−1)−1=A。
- 转置矩阵的逆 :如果矩阵 A A A可逆,则 ( A T ) − 1 = ( A − 1 ) T (A^T)^{-1} = (A^{-1})^T (AT)−1=(A−1)T。
- 乘积的逆 :如果矩阵 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 特征值和特征向量的性质
-
特征值的性质
- 特征值的和 :所有特征值的和等于矩阵的迹(trace),即对角线元素的和。
- 特征值的乘积 :所有特征值的乘积等于矩阵的行列式(determinant)。
-
特征向量的性质
- 线性无关性:不同特征值对应的特征向量是线性无关的。
- 基 :对于 n × n n \times n n×n矩阵,如果存在 n n n个线性无关的特征向量,那么这些向量可以构成 n n n 维空间的一个基。
3.4 特征值和特征向量在深度学习中的应用
在深度学习中,特征值和特征向量主要用于以下几个方面:
- 主成分分析(PCA):通过 PCA 技术,可以找到数据的主要成分(特征向量),并将其投影到低维空间中,从而实现数据降维。
- 正则化:通过惩罚权重矩阵的特征值(即核范数),可以控制模型的复杂度,防止过拟合。
- 模型诊断:通过计算矩阵的特征值,可以估计矩阵的条件数(最大特征值与最小特征值的比值),从而判断矩阵的数值稳定性。(这点与奇异值类似)