动手学深度学习v2学习篇预备知识二

43 阅读4分钟

cover_image

《动手学深度学习》v2学习篇--预备知识(二)

原创 Bob新视界 Bob的AI视界


大家好,我是Bob。

一个想和大家一起慢慢变富的AI程序员

热爱分享AI前瞻思考、项目经验、面试技巧。

欢迎关注我,一起探索,一起破圈!

前言

嘿!这里是笔者的《动手学深度学习》v2学习篇,最近一段时间由于工作需要,目前在深度学习“深度学习” ![](res.wx.qq.com/t/wx_fed/we… emoji/res/v1.3.10/assets/newemoji/2_06.png) ,以下皆为学习笔记与思考的分享。欢迎指正与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(54)


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(54)  
B = A.clone()  # 通过分配新内存,将A的一个副本分配给B  
AA + 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(43)  
torch.mm(AB)


tensor([[ 6.,  6.,  6.],  
        [22., 22., 22.],  
        [38., 38., 38.],  
        [54., 54., 54.],  
        [70., 70., 70.]])

范数

非正式地说,向量的 范数 是表示一个向量有多大。 这里考虑的 大小 (size)概念不涉及维度,而是分量的大小。 比如:

L2:

L1: