矩阵和标量、向量相加
在线性代数中,只有相同维数的矩阵可以相加,相同维数的向量可以相加,而没有定义矩阵与标量、向量的加法。
在深度学习中,我们允许矩阵与标量、向量相加,产生另一个矩阵。
矩阵与标量相加
C = A + b , C i , j = A i , j + b \bold{C} = \bold{A} + b, \quad C_{i,j} = A_{i,j} + b C=A+b,Ci,j=Ai,j+b
即,将标量加到矩阵的每个元素上。
在numpy
中有如下输入输出:
# [in]
a = np.ones((3, 3))
b = 1
a + b
# [out]
array([[2., 2., 2.],
[2., 2., 2.],
[2., 2., 2.]])
矩阵与向量相加
C = A + b \bold{C} = \bold{A} + \bold{b} C=A+b
一般情况下,我们所称的向量为列向量,即
b
=
[
b
1
⋮
b
n
]
\bold{b} = \begin{bmatrix} b_1 \\ \vdots \\ b_n \end{bmatrix}
b=⎣⎢⎡b1⋮bn⎦⎥⎤
为了便于排版,一般将其写成
b
=
[
b
1
,
…
,
b
n
]
T
\bold{b} = [b_1, \dots, b_n]^{T}
b=[b1,…,bn]T的形式。一般我们称
d
=
[
d
1
,
…
,
d
n
]
\bold{d} = [d_1, \dots, d_n]
d=[d1,…,dn]形式的向量为行向量。矩阵与向量相加时,需要区分是与列向量相加还是与行向量相加。
矩阵与列向量相加
C
=
A
+
b
,
C
i
,
j
=
A
i
,
j
+
b
i
\bold{C} = \bold{A} + \bold{b}, \quad C_{i,j} = A_{i,j} + b_i
C=A+b,Ci,j=Ai,j+bi
即,将列向量加到矩阵每一列上。
在numpy
中有如下输入输出:
# [in]
a = np.ones((3, 3))
b = np.array([1, 2, 3]).reshape(-1, 1)
a + b
# [out]
array([[2., 2., 2.],
[3., 3., 3.],
[4., 4., 4.]])
矩阵与行向量相加
C
=
A
+
b
,
C
i
,
j
=
A
i
,
j
+
b
j
\bold{C} = \bold{A} + \bold{b}, \quad C_{i,j} = A_{i,j} + b_j
C=A+b,Ci,j=Ai,j+bj
即,将行向量加到矩阵每一行上。
在numpy
中有如下输入输出:
# [in]
a = np.ones((3, 3))
b = np.array([1, 2, 3]).reshape(1, -1)
a + b
# [out]
array([[2., 3., 4.],
[2., 3., 4.],
[2., 3., 4.]])
这种隐式地复制标量或向量到很多位置的方式,被称为广播(broadcasting)。