深度学习 3.线性代数

Author:baiyucraft

BLog: baiyucraft’s Home

原文:《动手学深度学习》


  在深度学习 1.PyTorch入门中,我们了解了看起来最基本tensor间的加减乘除运算,但是对于一个拥有多维的数据以及拥有数学线代知识的我们来说,更想的是对tensor进行转置、点积等运算。

1.tensor降维

  一般来说,直观上,行为第0维,列为第1维。

  我们可以对任意张量进行的一个有用的操作是计算其元素的和。在数学表示法中,我们使用 ∑ \sum 符号表示求和。为了表示长度为d的向量中元素的总和,可以记为 ∑ i = 1 d x i \sum ^{d}_{i=1}x_{i} i=1dxi。在代码中,我们可以调用计算求和的函数sum()

  sum():tensor所有元素相加为一个值;

  sum(axis=?): 默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个数值,即标量。当然我们可以调用函数时指定axis来得到在哪个维度上的和,即在形状中丢失了这一维。

X = torch.arange(24).reshape(2, 3, 4)
print('\n======X======\n', X)
print('\n======X.shape======\n', X.shape)

# 所有元素求和
print('\n======X.sum()======\n', X.sum())
# 求和第0维(丢失第0维)
X_sum_axis0 = X.sum(axis=0)
print('\n======X.sum(axis=0)======\n', X_sum_axis0)
print('\n======X_sum_axis0.shape======\n', X_sum_axis0.shape)
# 求和第0、1维(丢失第0、1维)
X_sum_axis01 = X.sum(axis=[0, 1])
print('\n======X.sum(axis=[0, 1])======\n', X_sum_axis01)
print('\n======X_sum_axis01.shape======\n', X_sum_axis01.shape)

运行结果:

  一个与求和相关的量是平均值(mean或average)。我们通过将总和除以元素总数来计算平均值。

  mean(): 计算任意形状tensor的平均值;

  mean(axis=?): 沿指定轴降低张量的维度计算平均值。

# 平均值
print('\n======X.mean()======\n', X.mean())
# 第0维平均值
print('\n======X.mean(axis=0)======\n', X.mean(axis=0))

运行结果:

2.非降维求和

  有时在调用函数来计算总和或均值时保持轴数不变会很有用。这就需要用到keepdims参数。

  由于X在对每行进行求和后仍保持两个轴,我们可以通过广播机制将X除以X_sum_axis1_keep 得到每个元素关于第0维的平均值。

  如果我们想沿某个轴计算 A 元素的累积总和,比如axis=0(按行计算),我们可以调用cumsum()函数。此函数不会沿任何轴降低输入张量的维度。

# 非降维
X_sum_axis1_keep = X.sum(axis=1, keepdims=True)
print('\n======X.sum(axis=1, keepdims=True)======\n', X_sum_axis1_keep)
print('\n======X / X_sum_axis1_keep======\n', X / X_sum_axis1_keep)
# cumsum
print('\n======X.cumsum(axis=0)======\n', X.cumsum(axis=0))

运行结果:

3.点积、向量积和矩阵乘法

  dot(): 两向量之间的点积

  mv(): 矩阵与向量的向量积

  mm(): 矩阵乘法

# 点积、向量积、乘法
x = torch.arange(4, dtype=torch.float32)
y = torch.ones(4)
A = torch.arange(16, dtype=torch.float32).reshape(4, 4)
B = torch.tensor([[0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], dtype=torch.float32)
print('\n======x======\n', x)
print('\n======y======\n', y)
print('\n======A======\n', A)
print('\n======B======\n', B)
print('\n======x、y点积======\n', torch.dot(x, y))
print('\n======A、x向量积======\n', torch.mv(A, x))
print('\n======A、B矩阵乘法======\n', torch.mm(A, B))

运行结果:

4.范数

  norm(): 向量或矩阵的L2范数

x = torch.arange(4, dtype=torch.float32)
A = torch.arange(16, dtype=torch.float32).reshape(4, 4)
print('\n======x======\n', x)
print('\n======A======\n', A)
print('\n======x的L2范数======\n', torch.norm(x))
print('\n======A的L2范数======\n', torch.norm(A))

运行结果:

5.其他

  线性代数还有很多,其中很多数学对于机器学习非常有用。例如,矩阵可以分解为因子,这些分解可以显示真实世界数据集中的低维结构。机器学习的整个子领域都侧重于使用矩阵分解及其向高阶张量的泛化来发现数据集中的结构并解决预测问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值