数据操作
广播机制
在上面的部分中,我们看到了如何在相同形状的两个张量上执行按元素操作。
在某些情况下,即使形状不同,我们仍然可以通过调用广播机制(broadcasting mechanism)来执行按元素操作。
这种机制的工作方式如下:
- 通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;
- 对生成的数组执行按元素操作。
在大多数情况下,我们将沿着数组中长度为 1 的轴进行广播,如下例子:
1 | a = torch.arrange(3).reshape((3,1)) |
由于 a
和 b
分别是
我们将两个矩阵广播为一个更大的 a
将复制列,矩阵 b
将复制行,然后再按元素相加。
索引和切片
就像在任何其他 Python 数组中一样,张量中的元素可以通过索引访问。
与任何 Python 数组一样:第一个元素的索引是 0,最后一个元素索引是-1;
可以指定范围以包含第一个元素和最后一个之前的元素。
如下所示,我们可以用 [-1]
选择最后一个元素,可以用 [1:3]
选择第二个和第三个元素,注意第一个元素的索引是 0
数据预处理
1 | import pandas as pd |
线性代数
张量
张量(本小节中的“张量”指代数对象)是描述具有任意数量轴的
例如,向量是一阶张量,矩阵是二阶张量。
张量用特殊字体的大写字母表示(例如,
它们的索引机制(例如
当我们开始处理图像时,张量将变得更加重要,图像以
其中 3 个轴对应于高度、宽度,以及一个通道(channel)轴,
用于表示颜色通道(红色、绿色和蓝色)。
现在先将高阶张量暂放一边,而是专注学习其基础知识。
1 | x = torch.arrange(24).reshape((2,3,4)) |
1 | tensor([[[ 0, 1, 2, 3], |
降维
默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。
我们还可以指定张量沿哪一个轴来通过求和降低维度。
以矩阵为例,为了通过求和所有行的元素来降维(轴0),可以在调用函数时指定 axis=0
。列同理,指定 axis=1
由于输入矩阵沿 0 轴降维以生成输出向量,因此输入轴 0 的维数在输出形状中消失。
1 | A_sum_axis0 = A.sum(axis=0) |
1 | (tensor([40., 45., 50., 55.]), torch.Size([4])) |
同样,求平均值 A.mean()
也可以指定沿某一轴进行。
此外,通过 keepdims=True
可以选择不降低维度。
点积
我们已经学习了按元素操作、求和及平均值。另一个最基本的操作之一是点积。
给定两个向量
点积是相同位置的按元素乘积的和
矩阵乘法
1 | torch.mm(A,B) # 矩阵乘 |
范数
线性代数中最有用的一些运算符是范数(norm)。非正式地说,向量的范数是表示一个向量有多大。这里考虑的大小(size)概念不涉及维度,而是分量的大小。
在线性代数中,向量范数是将向量映射到标量的函数
给定任意向量
第一个性质是:如果我们按常数因子
第二个性质是熟悉的三角不等式:
第三个性质简单地说范数必须是非负的:
这是有道理的。因为在大多数情况下,任何东西的最小的大小是 0。
最后一个性质要求范数最小为 0,当且仅当向量全由 0 组成。
范数听起来很像距离的度量。
欧几里得距离和毕达哥拉斯定理中的非负性概念和三角不等式可能会给出一些启发。事实上,欧几里得距离是一个
假设
$$|\mathbf{x}|2 = \sqrt{\sum{i=1}^n x_i^2},$$
其中,在
在代码中,我们可以按如下方式计算向量的
1 | u = torch.tensor([3.0, -4.0]) |
$$|\mathbf{x}|p = \left(\sum{i=1}^n \left|x_i \right|^p \right)^{1/p}.$$
类似于向量的
$$|\mathbf{X}|F = \sqrt{\sum{i=1}^m \sum_{j=1}^n x_{ij}^2}.$$
Frobenius 范数满足向量范数的所有性质,它就像是矩阵形向量的
自动求导 autograd
深度学习框架可以自动计算导数:我们首先将梯度附加到想要对其计算偏导数的变量上,然后记录目标值的计算,执行它的反向传播函数,并访问得到的梯度。
概率
机器学习就是做出预测
贝叶斯定理
使用条件概率的定义,我们可以得出统计学中最有用的方程之一:
Bayes 定理(Bayes’ theorem)。
根据乘法法则(multiplication rule )可得到
根据对称性,可得到
假设
请注意,这里我们使用紧凑的表示法:
其中
这种分布可以在给定值
应用
我们实战演练一下!
假设一个医生对患者进行艾滋病病毒(HIV)测试。
这个测试是相当准确的,如果患者健康但测试显示他患病,这个概率只有 1%;
如果患者真正感染 HIV,它永远不会检测不出。
我们使用
条件概率 | ||
---|---|---|
1 | 0.01 | |
0 | 0.99 |
请注意,每列的加和都是 1(但每行的加和不是),因为条件概率需要总和为 1,就像概率一样。
让我们计算如果测试出来呈阳性,患者感染 HIV 的概率,即
显然,这将取决于疾病有多常见,因为它会影响错误警报的数量。
假设人口总体是相当健康的,例如,
为了应用贝叶斯定理,我们需要运用边际化和乘法法则来确定
因此,我们得到
换句话说,尽管使用了非常准确的测试,患者实际上患有艾滋病的几率只有 13.06%。
正如我们所看到的,概率可能是违反直觉的。
患者在收到这样可怕的消息后应该怎么办?
很可能,患者会要求医生进行另一次测试来确定病情。
第二个测试具有不同的特性,它不如第一个测试那么精确,
条件概率 | ||
---|---|---|
0.98 | 0.03 | |
0.02 | 0.97 |
不幸的是,第二次测试也显示阳性。让我们通过假设条件独立性来计算出应用 Bayes 定理的必要概率:
现在我们可以应用边际化和乘法规则:
最后,鉴于存在两次阳性检测,患者患有艾滋病的概率为
也就是说,第二次测试使我们能够对患病的情况获得更高的信心。
尽管第二次检验比第一次检验的准确性要低得多,但它仍然显著提高我们的预测概率。