《动手学深度学习》v2学习篇--预备知识(二)
原创 Bob新视界 Bob的AI视界
大家好,我是Bob。
一个想和大家一起慢慢变富的AI程序员
热爱分享AI前瞻思考、项目经验、面试技巧。
欢迎关注我,一起探索,一起破圈!
前言
嘿!这里是笔者的《动手学深度学习》v2学习篇,最近一段时间由于工作需要,目前在深度学习“深度学习”  ,以下皆为学习笔记与思考的分享。欢迎指正与follow。
线性代数中的基本数学对象
标量
严格来说,仅包含一个数值被称为标量,零维数据
import torch
x = torch.tensor(3.0)
y = torch.tensor(2.0)
x + y, x * y, x / y, x**y
(tensor(5.), tensor(6.), tensor(1.5000), tensor(9.))
向量
向量可以被视为标量值组成的列表,这些标量值被称为向量的 元素 或 分量。
但是向量是一维数据,长度不限。
x = x 1 x 2 ⋮ x n ,
x = torch.arange(4)
tensor([0, 1, 2, 3])
矩阵
正如向量将标量从零阶推广到一阶,矩阵将向量从一阶推广到二阶。
A = a 11 a 21 ⋮ a m 1 a 12 a 22 ⋮ a m 2 ⋯ ⋯ ⋱ ⋯ a 1 n a 2 n ⋮ a mn .
torch.arange(20).reshape(5, 4)
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
张量
就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构。张量是描述具有任意N数量轴的 维数组的通用方法
张量可以表示多维的数据。
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone() # 通过分配新内存,将A的一个副本分配给B
A, A + B
(tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.],
[16., 17., 18., 19.]]),
tensor([[ 0., 2., 4., 6.],
[ 8., 10., 12., 14.],
[16., 18., 20., 22.],
[24., 26., 28., 30.],
[32., 34., 36., 38.]]))
A * B
tensor([[ 0., 1., 4., 9.],
[ 16., 25., 36., 49.],
[ 64., 81., 100., 121.],
[144., 169., 196., 225.],
[256., 289., 324., 361.]])
基本张量算法
降维
我们可以对任意张量进行的一个有用的操作是 计算其元素的和 。 数学表示法使用sum符号表示求和。 为了表示长度为d的向量中元素的总和,可以记为 ∑ i = 1 d x i 。 在代码中可以调用计算求和的函数:
A = torch.arange(12, dtype=torch.float32).reshape(3,4)
A,A.sum()
(tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]]),
tensor(66.))
其中sum中有axis、keepdims参数(不配置就默认求所有元素的和)
axis所指的维度回进行sum,消除。
keepdims为true时会使当前axis所指维度不消除,而变为1.
原数据的shape为(3,4) ,axis=0会导致shape变为4:
A_sum_axis0 = A.sum(axis=0)
A_sum_axis0, A_sum_axis0.shape
(tensor([12., 15., 18., 21.]), torch.Size([4]))
axis=1会导致shape变为3:
A_sum_axis1 = A.sum(axis=1)
A_sum_axis1, A_sum_axis1.shape
(tensor([ 6., 22., 38.]), torch.Size([3]))
设置keepdims=True:
这个参数比较常见,因为在计算总和或均值时需要保持轴数不变(维度保持一致,可利用广播机制求值)
sum_A = A.sum(axis=1, keepdims=True)
sum_A
(tensor([[ 6.],
[22.],
[38.]]),
torch.Size([3, 1]))
A / sum_A
tensor([[0.0000, 0.1667, 0.3333, 0.5000],
[0.1818, 0.2273, 0.2727, 0.3182],
[0.2105, 0.2368, 0.2632, 0.2895]])
点积(Dot Product)
点积在很多场合都很有用。
将两个向量规范化得到单位长度后,点积表示它们夹角的余弦,也就是夹角,或者说相似度。
y = torch.ones(4, dtype = torch.float32)
x, y, torch.dot(x, y)
torch.sum(x * y)
矩阵-向量积
在代码中使用张量表示矩阵-向量积,我们使用 mv
函数。 当我们为矩阵 A
和向量 x
调用 torch.mv(A, x)
时,会执行矩阵-向量积。 注意, A
的列维数(沿轴1的长度)必须与 x
的维数(其长度)相同。
A.shape, x.shape, torch.mv(A, x)
(torch.Size([5, 4]), torch.Size([4]), tensor([ 14., 38., 62., 86., 110.]))
矩阵-矩阵乘法
可以将矩阵-矩阵乘法 看作简单地执行n次矩阵-向量积,并将结果拼接在一起,形成一个 矩阵。
在下面的代码中,在A和B上执行矩阵乘法。 这里的A是一个5行4列的矩阵,B是一个4行3列的矩阵。 两者相乘后,我们得到了一个5行3列的矩阵。使用 torch.mm(A, B)
函数
B = torch.ones(4, 3)
torch.mm(A, B)
tensor([[ 6., 6., 6.],
[22., 22., 22.],
[38., 38., 38.],
[54., 54., 54.],
[70., 70., 70.]])
范数
非正式地说,向量的 范数 是表示一个向量有多大。 这里考虑的 大小 (size)概念不涉及维度,而是分量的大小。 比如:
L2:
L1: