纽约大学深度学习PyTorch课程笔记Week4
Week4
4.1 线性代数与卷积
线性代数回顾
这部分将在神经网络的背景下对基础线性代数进行一个简单回顾。我们首先介绍一个简单的隐藏层 h : h = f ( z ) \boldsymbol{h}: \boldsymbol{h} = f(\boldsymbol{z}) h:h=f(z)
其输出为一个非线性函数 f f f作用到一个向量 z z z上。这里 z z z是一个仿射变换 A ∈ R m × n \boldsymbol{A} \in\mathbb{R^{m\times n}} A∈Rm×n作用到输入向量 x ∈ R n \boldsymbol{x} \in\mathbb{R^n} x∈Rn上的输出:
z = A x \boldsymbol{z} = \boldsymbol{A} \boldsymbol{x} z=Ax
考虑到简洁性,bias在这里被忽略。线性方程可扩展为:
A x = ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n ) ( x 1 ⋮ x n ) = ( — a ( 1 ) — — a ( 2 ) — ⋮ — a ( m ) — ) ∣ x ∣ = ( a ( 1 ) x a ( 2 ) x ⋮ a ( m ) x ) m × 1 \boldsymbol{A}\boldsymbol{x} = \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n}\\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{pmatrix} \begin{pmatrix} x_1 \\ \vdots \\x_n \end{pmatrix} = \begin{pmatrix} \text{---} \; \boldsymbol{a}^{(1)} \; \text{---} \\ \text{---} \; \boldsymbol{a}^{(2)} \; \text{---} \\ \vdots \\ \text{---} \; \boldsymbol{a}^{(m)} \; \text{---} \\ \end{pmatrix} \begin{matrix} \rvert \\ \boldsymbol{x} \\ \rvert \end{matrix} = \begin{pmatrix} {\boldsymbol{a}}^{(1)} \boldsymbol{x} \\ {\boldsymbol{a}}^{(2)} \boldsymbol{x} \\ \vdots \\ {\boldsymbol{a}}^{(m)} \boldsymbol{x} \end{pmatrix}_{m \times 1} Ax=⎝ ⎛a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn⎠ ⎞⎝ ⎛x1⋮xn⎠ ⎞=⎝ ⎛—a(1)——a(2)—⋮—a(m)—⎠ ⎞∣x∣=⎝ ⎛a(1)xa(2)x⋮a(m)x⎠ ⎞m×1
其中 a ( i ) \boldsymbol{a}^{(i)} a(i)是矩阵 A \boldsymbol{A} A的第 i i i行。
为了理解这个变换的含义,让我们分析一下 z \boldsymbol{z} z的一个分量,比如 a ( 1 ) x a^{(1)}\boldsymbol{x} a(1)x。假设 n = 2 n=2 n=2,那么 a = ( a 1 , a 2 ) \boldsymbol{a} = (a_1,a_2) a=(a1,a2)并且 x = ( x 1 , x 2 ) \boldsymbol{x} = (x_1,x_2) x=(x1,x2)。
a \boldsymbol{a} a和 x \boldsymbol{x} x在二维坐标轴上可以被画成向量。现在,如果 a \boldsymbol{a} a和 ı ^ \hat{\boldsymbol{\imath}} ^之间的角度是 α \alpha α, x \boldsymbol{x} x 和 ı ^ \hat{\boldsymbol{\imath}} ^之间的角度是 ξ \xi ξ,那么利用三角公式, a ⊤ x a^\top\boldsymbol{x} a⊤x(在这里 a ⊤ a^\top a⊤被假设成是一个行向量)可以被展开为:
a
⊤
x
=
a
1
x
1
+
a
2
x
2
=
∥
a
∥
cos
(
α
)
∥
x
∥
cos
(
ξ
)
+
∥
a
∥
sin
(
α
)
∥
x
∥
sin
(
ξ
)
=
∥
a
∥
∥
x
∥
(
cos
(
α
)
cos
(
ξ
)
+
sin
(
α
)
sin
(
ξ
)
)
=
∥
a
∥
∥
x
∥
cos
(
ξ
−
α
)
\begin {aligned} \boldsymbol{a}^\top\boldsymbol{x} &= a_1x_1+a_2x_2\\ &=\lVert \boldsymbol{a} \rVert \cos(\alpha)\lVert \boldsymbol{x} \rVert \cos(\xi) + \lVert \boldsymbol{a} \rVert \sin(\alpha)\lVert \boldsymbol{x} \rVert \sin(\xi)\\ &=\lVert \boldsymbol{a} \rVert \lVert \boldsymbol{x} \rVert \big(\cos(\alpha)\cos(\xi)+\sin(\alpha)\sin(\xi)\big)\\ &=\lVert \boldsymbol{a} \rVert \lVert \boldsymbol{x} \rVert \cos(\xi-\alpha) \end {aligned}
a⊤x=a1x1+a2x2=∥a∥cos(α)∥x∥cos(ξ)+∥a∥sin(α)∥x∥sin(ξ)=∥a∥∥x∥(cos(α)cos(ξ)+sin(α)sin(ξ))=∥a∥∥x∥cos(ξ−α)
这个输出度量了输入对矩阵 A \boldsymbol{A} A的特定行的对齐情况。这可以通过观察两个向量 ξ − α \xi-\alpha ξ−α之间的角度来理解。当 ξ = α \xi = \alpha ξ=α时,这两个向量完美对齐,输出达到最大。如果 ξ − α = π \xi - \alpha = \pi ξ−α=π,那么 a ⊤ x \boldsymbol{a}^\top\boldsymbol{x} a⊤x达到最小并且两个向量指向相反方向。本质上来看,线性变换允许我们将一个输入对于各个方向的投影看作定义的 A A A。这个直觉的想法同样可以扩展到高维情况。
另一个理解线性变换的方式是理解到 z \boldsymbol{z} z也可以被扩展为:
A x = ( ∣ ∣ ∣ a 1 a 2 ⋯ a n ∣ ∣ ∣ ) ∣ x ∣ = x 1 ∣ a 1 ∣ + x 2 ∣ a 2 ∣ + ⋯ + x n ∣ a n ∣ + \boldsymbol{A}\boldsymbol{x} = \begin{pmatrix} \vert & \vert & & \vert \\ \boldsymbol{a}_1 & \boldsymbol{a}_2 & \cdots & \boldsymbol{a}_n \\ \vert & \vert & & \vert \\ \end{pmatrix} \begin{matrix} \rvert \\ \boldsymbol{x} \\ \rvert \end{matrix} = x_1 \begin{matrix} \rvert \\ \boldsymbol{a}_1 \\ \rvert \end{matrix} + x_2 \begin{matrix} \rvert \\ \boldsymbol{a}_2 \\ \rvert \end{matrix} + \cdots + x_n \begin{matrix} \rvert \\ \boldsymbol{a}_n \\ \rvert \end{matrix} + Ax=⎝ ⎛∣a1∣∣a2∣⋯∣an∣⎠ ⎞∣x∣=x1∣a1∣+x2∣a2∣+⋯+xn∣an∣+
而输出则是矩阵 A \boldsymbol{A} A的列的权重和。因此,信号就只是输入的组合而已。
扩展线性代数至卷积
现在,我们通过音频数据分析的例子,将线性代数扩展至卷积。首先,我们将一个全连接层表达为矩阵乘法的形式:
[ w 11 w 12 w 13 w 21 w 22 w 23 w 31 w 32 w 33 w 41 w 42 w 43 ] [ x 1 x 2 x 3 ] = [ y 1 y 2 y 3 y 4 ] \begin{bmatrix} w_{11} & w_{12} & w_{13}\\ w_{21} & w_{22} & w_{23}\\ w_{31} & w_{32} & w_{33}\\ w_{41} & w_{42} & w_{43} \end{bmatrix} \begin{bmatrix} x_1\\ x_2\\ x_3 \end{bmatrix} = \begin{bmatrix} y_1\\ y_2\\ y_3\\ y_4 \end{bmatrix} ⎣ ⎡w11w21w31w41w12w22w32w42w13w23w33w43⎦ ⎤⎣ ⎡x1x2x3⎦ ⎤=⎣ ⎡y1y2y3y4⎦ ⎤
在这里例子中,权重矩阵的大小是 4 × 3 4 \times 3 4×3,输入向量的大小是 3 × 1 3×1 3×1,输出向量的大小是 4 × 1 4 \times 1 4×1。
但是对于音频数据,数据会变得更长(不再是3个样本的长度)。音频数据中的样本数量等于音频持续长度(比如3秒钟)乘以采样率(比如22.05 kHz)。如下所示,输入向量 x \boldsymbol{x} x将会非常长。相应的,权重矩阵将变得很“宽”。
[
w
11
w
12
w
13
w
14
⋯
w
1
k
⋯
w
1
n
w
21
w
22
w
23
w
24
⋯
w
2
k
⋯
w
2
n
w
31
w
32
w
33
w
34
⋯
w
3
k
⋯
w
3
n
w
41
w
42
w
43
w
44
⋯
w
4
k
⋯
w
4
n
]
[
x
1
x
2
x
3
x
4
⋮
x
k
⋮
x
n
]
=
[
y
1
y
2
y
3
y
4
]
\begin{bmatrix} w_{11} & w_{12} & w_{13} & w_{14} & \cdots &w_{1k}& \cdots &w_{1n}\\ w_{21} & w_{22} & w_{23}& w_{24} & \cdots & w_{2k}&\cdots &w_{2n}\\ w_{31} & w_{32} & w_{33}& w_{34} & \cdots & w_{3k}&\cdots &w_{3n}\\ w_{41} & w_{42} & w_{43}& w_{44} & \cdots & w_{4k}&\cdots &w_{4n} \end{bmatrix} \begin{bmatrix} x_1\\ x_2\\ x_3\\ x_4\\ \vdots\\ x_k\\ \vdots\\ x_n \end{bmatrix} = \begin{bmatrix} y_1\\ y_2\\ y_3\\ y_4 \end{bmatrix}
⎣
⎡w11w21w31w41w12w22w32w42w13w23w33w43w14w24w34w44⋯⋯⋯⋯w1kw2kw3kw4k⋯⋯⋯⋯w1nw2nw3nw4n⎦
⎤⎣
⎡x1x2x3x4⋮xk⋮xn⎦
⎤=⎣
⎡y1y2y3y4⎦
⎤
上面的式子将会非常难以训练。幸运的是,有很多方法可以进行简化。
性质:局部性
根据数据的局部性(即:我们不考虑较远的数据点),当 k k k相对较大的时候,来自权重矩阵的 w 1 k w_{1k} w1k 可以被填充为0。因此,矩阵的第一行就成为了一个大小为3的卷积核。让我们将这个大小为3的卷积核表示为 a ( 1 ) = [ a 1 ( 1 ) a 2 ( 1 ) a 3 ( 1 ) ] \boldsymbol{a}^{(1)} = \begin{bmatrix} a_1^{(1)} & a_2^{(1)} & a_3^{(1)} \end{bmatrix} a(1)=[a1(1)a2(1)a3(1)]。
[
a
1
(
1
)
a
2
(
1
)
a
3
(
1
)
0
⋯
0
⋯
0
w
21
w
22
w
23
w
24
⋯
w
2
k
⋯
w
2
n
w
31
w
32
w
33
w
34
⋯
w
3
k
⋯
w
3
n
w
41
w
42
w
43
w
44
⋯
w
4
k
⋯
w
4
n
]
[
x
1
x
2
x
3
x
4
⋮
x
k
⋮
x
n
]
=
[
y
1
y
2
y
3
y
4
]
\begin{bmatrix} a_1^{(1)} & a_2^{(1)} & a_3^{(1)} & 0 & \cdots &0& \cdots &0\\ w_{21} & w_{22} & w_{23}& w_{24} & \cdots & w_{2k}&\cdots &w_{2n}\\ w_{31} & w_{32} & w_{33}& w_{34} & \cdots & w_{3k}&\cdots &w_{3n}\\ w_{41} & w_{42} & w_{43}& w_{44} & \cdots & w_{4k}&\cdots &w_{4n} \end{bmatrix} \begin{bmatrix} x_1\\ x_2\\ x_3\\ x_4\\ \vdots\\ x_k\\ \vdots\\ x_n \end{bmatrix} = \begin{bmatrix} y_1\\ y_2\\ y_3\\ y_4 \end{bmatrix}
⎣
⎡a1(1)w21w31w41a2(1)w22w32w42a3(1)w23w33w430w24w34w44⋯⋯⋯⋯0w2kw3kw4k⋯⋯⋯⋯0w2nw3nw4n⎦
⎤⎣
⎡x1x2x3x4⋮xk⋮xn⎦
⎤=⎣
⎡y1y2y3y4⎦
⎤
性质:平稳性
自然数据信号具有平稳性(即:某些模式会不停重复)的性质。这可以帮助我们复用之前定义的卷积核 a ( 1 ) \mathbf{a}^{(1)} a(1) 。我们在使用这个卷积核的时候,每次移动一步(即步长为1),结果如下:
[ a 1 ( 1 ) a 2 ( 1 ) a 3 ( 1 ) 0 0 0 0 ⋯ 0 0 a 1 ( 1 ) a 2 ( 1 ) a 3 ( 1 ) 0 0 0 ⋯ 0 0 0 a 1 ( 1 ) a 2 ( 1 ) a 3 ( 1 ) 0 0 ⋯ 0 0 0 0 a 1 ( 1 ) a 2 ( 1 ) a 3 ( 1 ) 0 ⋯ 0 0 0 0 0 a 1 ( 1 ) a 2 ( 1 ) a 3 ( 1 ) ⋯ 0 ⋮ ⋮ ⋮ ⋮ ⋮ ] [ x 1 x 2 x 3 x 4 ⋮ x k ⋮ x n ] \begin{bmatrix} a_1^{(1)} & a_2^{(1)} & a_3^{(1)} & 0 & 0 & 0 & 0&\cdots &0\\ 0 & a_1^{(1)} & a_2^{(1)} & a_3^{(1)} & 0&0&0&\cdots &0\\ 0 & 0 & a_1^{(1)} & a_2^{(1)} & a_3^{(1)} & 0&0&\cdots &0\\ 0 & 0 & 0& a_1^{(1)} & a_2^{(1)} &a_3^{(1)} &0&\cdots &0\\ 0 & 0 & 0& 0 & a_1^{(1)} &a_2^{(1)} &a_3^{(1)} &\cdots &0\\ \vdots&&\vdots&&\vdots&&\vdots&&\vdots \end{bmatrix} \begin{bmatrix} x_1\\ x_2\\ x_3\\ x_4\\ \vdots\\ x_k\\ \vdots\\ x_n \end{bmatrix} ⎣ ⎡a1(1)0000⋮a2(1)a1(1)000a3(1)a2(1)a1(1)00⋮0a3(1)a2(1)a1(1)000a3(1)a2(1)a1(1)⋮000a3(1)a2(1)0000a3(1)⋮⋯⋯⋯⋯⋯00000⋮⎦ ⎤⎣ ⎡x1x2x3x4⋮xk⋮xn⎦ ⎤
由于局部性,矩阵的右上角和左下角均被置0,这就导致了稀疏性。不断复用某个卷积核,就称作权重共享。
Toeplitz matrix的多层结构
经过这些改变,剩下的参数数量为3(即: a 1 , a 2 , a 3 a_1,a_2,a_3 a1,a2,a3)。与之前有着12个参数(即: w 11 , w 12 , ⋯ , w 43 w_{11},w_{12},\cdots,w_{43} w11,w12,⋯,w43 )的权重矩阵进行比较,现在的参数数量过于受限,我们希望进行扩展。
前面的矩阵可以被认为是带着卷积核 a ( 1 ) \boldsymbol{a}^{(1)} a(1) 的一层(即一个卷积层)。那么我们可以使用不同的卷积核 a ( 2 ) \boldsymbol{a}^{(2)} a(2) , a ( 3 ) \boldsymbol{a}^{(3)} a(3) , 等进行多层构建,从而增加参数数量。
每层都有一个包含着一个多次重复的卷积核的矩阵。这类矩阵被称之为Toeplitz矩阵。在每一个Toeplitz矩阵中,每个从左至右的降对角线是常数。而且这里使用的Toeplitz矩阵也是稀疏矩阵。
给定第一个卷积核 a ( 1 ) \boldsymbol{a}^{(1)} a(1) 和输入向量 x \boldsymbol{x} x,该层给出的输出的第一项是: a 1 ( 1 ) x 1 + a 2 ( 1 ) x 2 + a 3 ( 1 ) x 3 a_1^{(1)} x_1 + a_2^{(1)} x_2 + a_3^{(1)}x_3 a1(1)x1+a2(1)x2+a3(1)x3 。因此整个输出向量如下:
[ a ( 1 ) x [ 1 : 3 ] a ( 1 ) x [ 2 : 4 ] a ( 1 ) x [ 3 : 5 ] ⋮ ] \begin{bmatrix} \mathbf{a}^{(1)}x[1:3]\\ \mathbf{a}^{(1)}x[2:4]\\ \mathbf{a}^{(1)}x[3:5]\\ \vdots \end{bmatrix} ⎣ ⎡a(1)x[1:3]a(1)x[2:4]a(1)x[3:5]⋮⎦ ⎤
同样的矩阵相乘方法可以被用于后续带有其它卷积核(比如 a ( 2 ) \boldsymbol{a}^{(2)} a(2) 和 a ( 3 ) \boldsymbol{a}^{(3)} a(3))的卷积层并得到类似的结果。
4.1.2 听见卷积 - Jupyter Notebook
对应的Jupyter Notebook可以在这里获得。
在这个notebook中,我们将卷积看做“运行的标量积”的形式对它进行探索。
librosa库让我们能够加载音频片段\boldsymbol{x}x及它的采样率。在这个例子中,我们有70641个样本,采样率为22.05kHz,片段总长度为3.2秒。导入的音频信号是波动的(见图1),并且我们能够通过yy轴的振幅猜测它大概是听上去是怎么样的。这个音频信号x(t)x(t)其实就是Windows系统的关机音(见图2)。
我们需要从波形分离出音符。为了实现这件事情,如果我们使用傅里叶变换,所有的音符会一起出现,那么找出每个音高的精确时间和位置就变得非常困难。因此,我们需要使用局部傅里叶变换(也被称作声谱图)。正如在声谱图(图三)中观察到的那样,不同的音高在不同频率下的达到峰值(比如第一音高的峰值是1600)。在各自的频率下连接四个音高,我们就获得了原信号的音高版本。
输入信号和所有音高(比如钢琴上的所有键)的卷积能够帮助提取输入片段中的所有音符(即:当音频匹配特定卷积核的时候的激发)。原信号的声谱图和连接的音高的信号如图4所示。原信号的频率和四个音高的图像如图5所示。输入信号(原信号)和四个卷积核的卷积如图6所示。图6中卷积的音频片段证明了卷积对于提取音符的有效性。
4.1.3 不同数据集的维度
最后一个部分,我们将额外讨论一下维度的不同表示以及这个问题的一些例子。我们假设输入集 X X X由定义域 Ω \Omega Ω映射到通道 c c c的函数组成。
举例
- 音频数据:定义域是1维、时间索引的离散信号;通道数量 c c c可以是1 (单声道), 2 (立体声do), 5+1 (杜比 5.1), 等。
- 图像数据:定义域是2维(像素)(下图中的 × \times ×表示的是笛卡尔积); c c c可以是1(灰度图片), 3(彩色图片), 20(高光谱), 等。
- 狭义相对论:定义域是 R 4 × R 4 \mathbb{R^4} \times \mathbb{R^4} R4×R4(时空 × \times × 四维动量),当 c = 1 c = 1 c=1时,这就是哈密顿量。