动手学深度学习4 线性代数

动手学深度学习4 线性代数

  • [1. 线性代数--数学意义](#1. 线性代数--数学意义)
    • [1. 标量的简单计算及长度](#1. 标量的简单计算及长度)
      • [1. 简单操作 一些简单的数学公式。](#1. 简单操作 一些简单的数学公式。)
      • [2. 标量的长度](#2. 标量的长度)
    • [2. 向量的简单计算及长度](#2. 向量的简单计算及长度)
      • [1. 简单操作](#1. 简单操作)
      • [2. 向量的长度:向量每个元素的平方求和再开根号](#2. 向量的长度:向量每个元素的平方求和再开根号)
      • [3. 向量点乘 正交](#3. 向量点乘 正交)
    • [3. 矩阵](#3. 矩阵)
      • [1. 简单操作](#1. 简单操作)
      • [2. 矩阵乘法 矩阵乘以向量](#2. 矩阵乘法 矩阵乘以向量)
      • [3. 矩阵乘法 矩阵乘以矩阵](#3. 矩阵乘法 矩阵乘以矩阵)
      • [4. 范数--矩阵的长度](#4. 范数--矩阵的长度)
      • [5. 特殊矩阵](#5. 特殊矩阵)
      • [6. 特征向量](#6. 特征向量)
      • [7. 补充学习线性代数知识](#7. 补充学习线性代数知识)
  • [2. 线性代数的pytorch实现](#2. 线性代数的pytorch实现)
    • [1. 标量](#1. 标量)
    • [2. 向量](#2. 向量)
    • [3. 矩阵](#3. 矩阵)
      • [1. 矩阵转置](#1. 矩阵转置)
      • [2. 对称矩阵](#2. 对称矩阵)
    • [4. 张量](#4. 张量)
      • [1. 按元素加法](#1. 按元素加法)
      • [2. 按元素乘法 哈达玛积](#2. 按元素乘法 哈达玛积)
      • [3. 降维求和](#3. 降维求和)
        • [1. 求所有元素和--降维到标量 .sum()](#1. 求所有元素和--降维到标量 .sum())
        • [2. 按维度-轴求和--降一维或多维 .sum(axis=0)](#2. 按维度-轴求和--降一维或多维 .sum(axis=0))
        • [3. 除了求和 还可以求平均值 .mean() .mean(axis=0)](#3. 除了求和 还可以求平均值 .mean() .mean(axis=0))
      • [4. 非降维求和](#4. 非降维求和)
      • [5. 点积](#5. 点积)
      • [6. 矩阵向量积](#6. 矩阵向量积)
      • [7. 矩阵-矩阵乘法](#7. 矩阵-矩阵乘法)
  • [3. 按特定轴求和](#3. 按特定轴求和)
  • [4. 线性代数QA](#4. 线性代数QA)

1. 线性代数--数学意义

视频https://www.bilibili.com/video/BV1eK4y1U7Qy/?spm_id_from=autoNext&vd_source=eb04c9a33e87ceba9c9a2e5f09752ef8
课件https://courses.d2l.ai/zh-v2/assets/pdfs/part-0_5.pdf

本节主要是介绍线性代数中 向量 矩阵的一些定义及计算规则。

1. 标量的简单计算及长度

1. 简单操作 一些简单的数学公式。

c = a + b

c = a · b

c = sin a

2. 标量的长度

|a| =(a ifa > 0 −a otherwise)

|a + b| ≤ |a| + |b|

|a · b| = |a|·|b|

2. 向量的简单计算及长度

1. 简单操作

c = a + b where ci = ai + bi

c = α · b where ci = αbi

c = sin a where ci = sin ai

2. 向量的长度:向量每个元素的平方求和再开根号

∥ a ∥ = ∑ i = 1 n a i 2 \| \mathbf{a} \| = \sqrt{\sum_{i=1}^{n} a_i^2} ∥a∥=∑i=1nai2
∥ a ∥ = [ ∑ i = 1 n a i 2 ] 1 2 \| \mathbf{a} \| = [{\sum_{i=1}^{n} a_i^2}]^{\frac{1}{2}} ∥a∥=[∑i=1nai2]21
∥ a ∥ = [ ∑ i = 1 n a i 2 ] 1 2 \| \mathbf{a} \| = \left[ \sum_{i=1}^{n} a_i^2 \right]^{\frac{1}{2}} ∥a∥=[∑i=1nai2]21

||a|| >= 0 for all a
∣ ∣ a + b ∣ ∣ < = ∣ ∣ a ∣ ∣ + ∣ ∣ b ∣ ∣ ||a+b|| <= ||a|| + ||b|| ∣∣a+b∣∣<=∣∣a∣∣+∣∣b∣∣
∣ ∣ a ⋅ b ∣ ∣ = ∣ a ∣ ⋅ ∣ ∣ b ∣ ∣ ||a \cdot b|| = |a| \cdot ||b|| ∣∣a⋅b∣∣=∣a∣⋅∣∣b∣∣ 如果a是一个标量

sh 复制代码
上面三种数学公式的markdown语法
$\| \mathbf{a} \| = \sqrt{\sum_{i=1}^{n} a_i^2}$
$\| \mathbf{a} \| = [{\sum_{i=1}^{n} a_i^2}]^{\frac{1}{2}}$
$\| \mathbf{a} \| = \left[ \sum_{i=1}^{n} a_i^2 \right]^{\frac{1}{2}}$
$||a+b|| <= ||a|| + ||b||$
$||a \cdot b|| = |a| \cdot ||b||$

3. 向量点乘 正交

正交向量【互为90°垂直】的点乘为0.

3. 矩阵

1. 简单操作

C = A + B where Cij = Aij + Bij 对应位置元素相加

C = α · B where Cij = αBij 对每个元素都做标量相乘

C = sin A where Cij = sin Aij 对每个元素都做取sin

2. 矩阵乘法 矩阵乘以向量

矩阵乘法,是对空间的扭曲

3. 矩阵乘法 矩阵乘以矩阵

第一个矩阵第一行和第二个矩阵的每一列,对应位置元素做乘法再求和,是结果矩阵的第一行的元素的值。

4. 范数--矩阵的长度

一般用F范数表示,矩阵范数算起来比较麻烦一般不算。

5. 特殊矩阵

在矩阵对角画一条线,如图第二个矩阵,在线的两边值是一样的【图上标的颜色块一样】,是对称矩阵。

在线的两边值是正好是负的【图上标的颜色块和边框颜色一样】,是反对称矩阵,如图第三个矩阵。

正定矩阵是说它如果是正定的,则乘以任意一个列向量或者行向量都是大于等于0的,深度学习不会用到太多这个矩阵。

6. 特征向量

矩阵,把一个空间进行扭曲,而被矩阵作用后不改变方向的向量叫特征向量,大小改变没关系只需要方向没变就行。不是每个矩阵都能有特征向量。

7. 补充学习线性代数知识

线性代数课程https://www.bilibili.com/video/BV1ys411472E/?p=1&vd_source=eb04c9a33e87ceba9c9a2e5f09752ef8

2. 线性代数的pytorch实现

视频https://www.bilibili.com/video/BV1eK4y1U7Qy/?p=2&spm_id_from=pageDriver&vd_source=eb04c9a33e87ceba9c9a2e5f09752ef8
课件: https://zh-v2.d2l.ai/chapter_preliminaries/linear-algebra.html

1. 标量

数值计算

py 复制代码
import torch
x = torch.tensor(2.0)
y = torch.tensor(3.0)
x, y, x+y, x-y, x*y, x/y, x**y, x*x, y*y
(tensor(2.),
 tensor(3.),
 tensor(5.),
 tensor(-1.),
 tensor(6.),
 tensor(0.6667),
 tensor(8.),
 tensor(4.),
 tensor(9.))

2. 向量

向量可以被视为标量值组成的列表。
人们通过一维张量表示向量。一般来说,张量可以具有任意长度,取决于机器的内存限制。
向量的长度通常称为向量的维度(dimension)
向量或轴的维度被用来表示向量或轴的长度,即向量或轴的元素数量。 然而,张量的维度用来表示张量具有的轴数。 在这个意义上,张量的某个轴的维数就是这个轴的长度。

定义一个向量,索引切片访问向量元素, 向量也可以查看shape, shape列表只有一个元素值,是向量的长度大小

py 复制代码
x = torch.arange(12)
x, x[3], x.shape, len(x)
(tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]),
 tensor(3),
 torch.Size([12]),
 12)

3. 矩阵

1. 矩阵转置

矩阵的转置,将列变成行【将行变成列】的一个翻转

py 复制代码
X = torch.arange(20).reshape(5,4)
X, X.T
(tensor([[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15],
         [16, 17, 18, 19]]),
 tensor([[ 0,  4,  8, 12, 16],
         [ 1,  5,  9, 13, 17],
         [ 2,  6, 10, 14, 18],
         [ 3,  7, 11, 15, 19]]))

2. 对称矩阵

方阵的一种特殊类型,对称矩阵(symmetric matrix)A等于其转置: A = A T A = A^T A=AT

沿对角线两边的元素值是一样的,对角线的元素值不关心。

py 复制代码
A = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
A, A.T, A==A.T
(tensor([[1, 2, 3],
         [2, 0, 4],
         [3, 4, 5]]),
 tensor([[1, 2, 3],
         [2, 0, 4],
         [3, 4, 5]]),
 tensor([[True, True, True],
         [True, True, True],
         [True, True, True]]))

from 课件:

矩阵是有用的数据结构:它们允许我们组织具有不同模式的数据。 例如,我们矩阵中的行可能对应于不同的房屋(数据样本),而列可能对应于不同的属性。 曾经使用过电子表格软件或已阅读过 2.2节的人,应该对此很熟悉。 因此,尽管单个向量的默认方向是列向量,但在表示表格数据集的矩阵中, 将每个数据样本作为矩阵中的行向量更为常见。 后面的章节将讲到这点,这种约定将支持常见的深度学习实践。 例如,沿着张量的最外轴,我们可以访问或遍历小批量的数据样本。

4. 张量

1. 按元素加法

就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构。

py 复制代码
A = torch.arange(24).reshape(2, 3, 4)
B = A.clone()  # 通过分配新内存,将A的一个副本分配给B  B=A不会重新分配内存只是重新指定索引
A, A+B

从中括号的外层,层层递进剥开,确定张量的维度。

(tensor([[[ 0,  1,  2,  3],
          [ 4,  5,  6,  7],
          [ 8,  9, 10, 11]],
 
         [[12, 13, 14, 15],
          [16, 17, 18, 19],
          [20, 21, 22, 23]]]),
 tensor([[[ 0,  2,  4,  6],
          [ 8, 10, 12, 14],
          [16, 18, 20, 22]],
 
         [[24, 26, 28, 30],
          [32, 34, 36, 38],
          [40, 42, 44, 46]]]))

2. 按元素乘法 哈达玛积

两个矩阵的按元素乘法称为Hadamard积(Hadamard product)("⊕"和"⊕"都表示Hadamard积的符号 ⊙ 。)⊕ ⊕

sh 复制代码
&oplus;  # ⊕
&#8853;  # ⊕
py 复制代码
A * B
tensor([[[  0,   1,   4,   9],
         [ 16,  25,  36,  49],
         [ 64,  81, 100, 121]],

        [[144, 169, 196, 225],
         [256, 289, 324, 361],
         [400, 441, 484, 529]]])

将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。

py 复制代码
a = 2
A, a+A, a*A, (a*A).shape
(tensor([[[ 0,  1,  2,  3],
          [ 4,  5,  6,  7],
          [ 8,  9, 10, 11]],
 
         [[12, 13, 14, 15],
          [16, 17, 18, 19],
          [20, 21, 22, 23]]]),
 tensor([[[ 2,  3,  4,  5],
          [ 6,  7,  8,  9],
          [10, 11, 12, 13]],
 
         [[14, 15, 16, 17],
          [18, 19, 20, 21],
          [22, 23, 24, 25]]]),
 tensor([[[ 0,  2,  4,  6],
          [ 8, 10, 12, 14],
          [16, 18, 20, 22]],
 
         [[24, 26, 28, 30],
          [32, 34, 36, 38],
          [40, 42, 44, 46]]]),
 torch.Size([2, 3, 4]))

3. 降维求和

1. 求所有元素和--降维到标量 .sum()

X.sum() 是降维求和,会将高维张量变为低维张量甚至标量,不指定从哪个维度求和,求出来的是标量。

py 复制代码
import torch
x = torch.arange(4, dtype=torch.float32)
print(x, x.sum())
A = torch.arange(20, dtype=torch.float32).reshape((5,4))
A, A.shape, A.sum()
tensor([0., 1., 2., 3.]) tensor(6.)
(tensor([[ 0.,  1.,  2.,  3.],
         [ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.],
         [12., 13., 14., 15.],
         [16., 17., 18., 19.]]),
 torch.Size([5, 4]),
 tensor(190.))
2. 按维度-轴求和--降一维或多维 .sum(axis=0)
py 复制代码
A_axis0_sum = A.sum(axis=0)  # A 5行4列矩阵  矩阵沿0轴降维 第0维形状消失 按行元素相加求和
print(A_axis0_sum, A_axis0_sum.shape)

A_axis1_sum = A.sum(axis=1)   # 同上  按列元素相加求和
print(A_axis1_sum, A_axis1_sum.shape)

A_axis01_sum = A.sum(axis=[0,1])   # 同上  按行求和后再按列求和 所有元素求和  同A.sum()
print(A_axis01_sum, A_axis01_sum.shape)
tensor([40., 45., 50., 55.]) torch.Size([4])   
tensor([ 6., 22., 38., 54., 70.]) torch.Size([5])
tensor(190.) torch.Size([])
3. 除了求和 还可以求平均值 .mean() .mean(axis=0)
py 复制代码
print(A.sum(), A.numel(), A.sum()/A.numel(), A.mean())
A.mean(axis=0), A.mean(axis=1), A.mean(axis=[0,1])
tensor(190.) 20 tensor(9.5000) tensor(9.5000)
(tensor([ 8.,  9., 10., 11.]),
 tensor([ 1.5000,  5.5000,  9.5000, 13.5000, 17.5000]),
 tensor(9.5000))

4. 非降维求和

在求和函数的基础上,使用keepdims=True参数。可以理解把求和后的标量值,加上一层中括号,虽然只有一个元素但是也是一个维度。

py 复制代码
复制代码

能做广播,维度需要保持一致。

py 复制代码
复制代码

5. 点积

6. 矩阵向量积

7. 矩阵-矩阵乘法

3. 按特定轴求和

4. 线性代数QA

明天再更新

相关推荐
Trouvaille ~6 分钟前
【机器学习】从流动到恒常,无穷中归一:积分的数学诗意
人工智能·python·机器学习·ai·数据分析·matplotlib·微积分
dundunmm14 分钟前
论文阅读:Deep Fusion Clustering Network With Reliable Structure Preservation
论文阅读·人工智能·数据挖掘·聚类·深度聚类·图聚类
szxinmai主板定制专家23 分钟前
【国产NI替代】基于FPGA的4通道电压 250M采样终端边缘计算采集板卡,主控支持龙芯/飞腾
人工智能·边缘计算
是十一月末23 分钟前
Opencv实现图像的腐蚀、膨胀及开、闭运算
人工智能·python·opencv·计算机视觉
云空30 分钟前
《探索PyTorch计算机视觉:原理、应用与实践》
人工智能·pytorch·python·深度学习·计算机视觉
杭杭爸爸32 分钟前
无人直播源码
人工智能·语音识别
Ainnle2 小时前
微软 CEO 萨提亚・纳德拉:回顾过去十年,展望 AI 时代的战略布局
人工智能·microsoft
长风清留扬2 小时前
基于OpenAI Whisper AI模型自动生成视频字幕:全面解析与实战指南
人工智能·神经网络·opencv·计算机视觉·自然语言处理·数据挖掘·whisper
灰太狼不爱写代码4 小时前
CUDA11.4版本的Pytorch下载
人工智能·pytorch·笔记·python·学习
volcanical6 小时前
Dataset Distillation with Attention Labels for Fine-tuning BERT
人工智能·深度学习·bert