矢量化基础是线性运算,这里先简单复习一下。线性基本运算基本没什么,大量使用的有点乘和叉乘。
基本例子
1. 矩阵的基本概念
- 矩阵可以看作是一个块或者二维数组,这是对矩阵的一个在计算机计算的直观描述。
2. 向量的点积(内积)
-
例子:以向量
和向量
为例
-
计算过程
- 总结:
对于向量和向量
,
假设,
,
它们的点积的计算方式是
,也就是将对应元素相乘后再把所有乘积相加。
- 等价表示:
向量通常可以用列向量表示,通过取
的转置(即将列向量变为行向量,记为
),可以得到点积的另一种等价表示形式。
例如,若是一2x1的列向量,转置后
是一个1×2的行向量。此时,
和
为2×1列向量)的点积就等于
乘以
,即
。这种表示方式在理解矩阵乘法时非常有用,因为它将向量的点积与矩阵乘法联系了起来。
3. 向量与矩阵的乘法
- 设定向量和矩阵:
设向量
设矩阵W是一个的矩阵,
。
- 计算乘积矩阵的元素:
这里,
,我们来计算
:
结果矩阵的第一个元素:用向量与矩阵W的第一列向量做点积,即
;
结果矩阵的第二个元素:用向量与矩阵W的第二列向量做点积,即
。
所以,。
-
python点乘例子
import numpy as np
定义向量 A
A = np.array([[2, 3, 4]])
定义矩阵 W
W = np.array([[5, 6],
[7, 8],
[9, 10]])计算向量与矩阵的乘积
result = np.dot(A, W)
print("向量与矩阵的乘积结果:", result)
4. 矩阵与矩阵的乘法
设矩阵,这是一个
的矩阵;矩阵
,这是一个
的矩阵。
根据矩阵乘法的规则,因为A的列数(3列)等于B的行数(3行),所以A和B可以相乘,结果矩阵的行数等于A的行数(2行),列数等于B的列数(2列),即C是一个
的矩阵。
接下来计算C中各个元素的值:
(C的第一行第一列元素): A的第一行元素与B的第一列元素对应相乘再相加,即
。
(C的第一行第二列元素): A的第一行元素与B的第二列元素对应相乘再相加,即
。
(C的第二行第一列元素): A的第二行元素与B的第一列元素对应相乘再相加,即
。
(C的第二行第二列元素): A的第二行元素与B的第二列元素对应相乘再相加,即
。
所以,矩阵。
NumPy 库来验证:
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[7, 8],
[9, 10],
[11, 12]])
C = np.dot(A, B)
print(C)
转向矩阵通用例子
设向量为
的列向量
,矩阵W为
的矩阵
。
根据向量与矩阵乘法规则(用向量转置后的行向量与矩阵相乘),得到的结果是一个
的矩阵(行向量)。
计算过程如下:
=
=
- 笔者注:
无论是向量与矩阵相乘,还是矩阵与矩阵相乘,本质上都涉及到很多向量之间的点积运算,并且是按照一定的顺序来构建结果矩阵(如)的元素,一次计算一个元素。其实是规则的嵌套,函数的函数。
矢量化展开的原理和例子
1.简介
-
以矩阵
,说明其转置
表示,即把
的列变为行。在NumPy中,除了常规的转置理解方式外,还可以使用
这样的函数来计算转置,该函数会将矩阵的列横向排列。
-
给出矩阵
,通过
(np指NumPy库)这样的代码计算矩阵
。python在一些代码中可能会看到
这种写法,这也是计算矩阵乘法的另一种方式,使用np.dot更清晰。
2.矢量化原理
假设输入特征值为 [2, 17]
,我们将其看作矩阵 A
的转置 ,这是一个
1x2
的矩阵。
设权重矩阵 W
是一个 2x3
的矩阵,偏置矩阵 B
是一个 1x3
的矩阵,具体数值如下:
A_T = [2, 17]
W = [[1, 2, 3],
[4, 5, 6]]
B = [[10, 20, 30]]
计算
- 计算
:
的第一个元素:
的第二个元素:
的第三个元素:
- 所以
- 再加上偏置矩阵 B:
- Z 的第一个元素:
- Z 的第二个元素:
- Z 的第三个元素:
- 所以
- Z 的第一个元素:
应用激活函数 g
假设激活函数 g 是 sigmoid 函数,其公式为。
所以最终的输出矩阵
3.代码例子
python
import numpy as np
# 定义 sigmoid 激活函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 输入特征值矩阵 A 的转置
A_T = np.array([[2, 17]])
# 权重矩阵 W
W = np.array([[1, 2, 3],
[4, 5, 6]])
# 偏置矩阵 B
B = np.array([[10, 20, 30]])
# 计算 Z = A^T W + B
Z = np.dot(A_T, W) + B
# 应用激活函数 g 得到输出矩阵 a
a = sigmoid(Z)
print("Z 的值:", Z)
print("a 的值:", a)
4.矢量化实现的优势
只需要几行代码就能在神经网络中实现一个问题,并且能获得巨大的速度提升。原因是现代计算机擅长高效地实现矩阵乘法(如`np.dot`对应的操作),利用快速硬件可以非常有效地完成大规模矩阵乘法运算。
笔者注:用纯cpu集群训练理论是可以的,但是是不现实的。