问题动机、线性代数与视觉化

$$\gdef \sam #1 {\mathrm{softargmax}(#1)}$$ $$\gdef \vect #1 {\boldsymbol{#1}} $$ $$\gdef \matr #1 {\boldsymbol{#1}} $$ $$\gdef \E {\mathbb{E}} $$ $$\gdef \V {\mathbb{V}} $$ $$\gdef \R {\mathbb{R}} $$ $$\gdef \N {\mathbb{N}} $$ $$\gdef \relu #1 {\texttt{ReLU}(#1)} $$ $$\gdef \D {\,\mathrm{d}} $$ $$\gdef \deriv #1 #2 {\frac{\D #1}{\D #2}}$$ $$\gdef \pd #1 #2 {\frac{\partial #1}{\partial #2}}$$ $$\gdef \set #1 {\left\lbrace #1 \right\rbrace} $$ % My colours $$\gdef \aqua #1 {\textcolor{8dd3c7}{#1}} $$ $$\gdef \yellow #1 {\textcolor{ffffb3}{#1}} $$ $$\gdef \lavender #1 {\textcolor{bebada}{#1}} $$ $$\gdef \red #1 {\textcolor{fb8072}{#1}} $$ $$\gdef \blue #1 {\textcolor{80b1d3}{#1}} $$ $$\gdef \orange #1 {\textcolor{fdb462}{#1}} $$ $$\gdef \green #1 {\textcolor{b3de69}{#1}} $$ $$\gdef \pink #1 {\textcolor{fccde5}{#1}} $$ $$\gdef \vgrey #1 {\textcolor{d9d9d9}{#1}} $$ $$\gdef \violet #1 {\textcolor{bc80bd}{#1}} $$ $$\gdef \unka #1 {\textcolor{ccebc5}{#1}} $$ $$\gdef \unkb #1 {\textcolor{ffed6f}{#1}} $$ % Vectors $$\gdef \vx {\pink{\vect{x }}} $$ $$\gdef \vy {\blue{\vect{y }}} $$ $$\gdef \vb {\vect{b}} $$ $$\gdef \vz {\orange{\vect{z }}} $$ $$\gdef \vtheta {\vect{\theta }} $$ $$\gdef \vh {\green{\vect{h }}} $$ $$\gdef \vq {\aqua{\vect{q }}} $$ $$\gdef \vk {\yellow{\vect{k }}} $$ $$\gdef \vv {\green{\vect{v }}} $$ $$\gdef \vytilde {\violet{\tilde{\vect{y}}}} $$ $$\gdef \vyhat {\red{\hat{\vect{y}}}} $$ $$\gdef \vycheck {\blue{\check{\vect{y}}}} $$ $$\gdef \vzcheck {\blue{\check{\vect{z}}}} $$ $$\gdef \vztilde {\green{\tilde{\vect{z}}}} $$ $$\gdef \vmu {\green{\vect{\mu}}} $$ $$\gdef \vu {\orange{\vect{u}}} $$ % Matrices $$\gdef \mW {\matr{W}} $$ $$\gdef \mA {\matr{A}} $$ $$\gdef \mX {\pink{\matr{X}}} $$ $$\gdef \mY {\blue{\matr{Y}}} $$ $$\gdef \mQ {\aqua{\matr{Q }}} $$ $$\gdef \mK {\yellow{\matr{K }}} $$ $$\gdef \mV {\lavender{\matr{V }}} $$ $$\gdef \mH {\green{\matr{H }}} $$ % Coloured math $$\gdef \cx {\pink{x}} $$ $$\gdef \ctheta {\orange{\theta}} $$ $$\gdef \cz {\orange{z}} $$ $$\gdef \Enc {\lavender{\text{Enc}}} $$ $$\gdef \Dec {\aqua{\text{Dec}}}$$

资源

在推特上跟随 Alfredo Canziani @alfcnz。影片、讲述线性代数与奇异值分解(SVD)相关细节的课本都可以在 Alfredo 的推特上找到,比如在搜索栏输入linear algebra (from:alfcnz)

变换与其动机

让我们看看一个图像分类的例子。比方我们用一个一百万像素的相机拍一张照片,这张图片铅直、水平各有约 1000 个像素,而每个像素会有红绿蓝三个色彩的维度。每个图像因此就可以当作三百万维空间中的一点。在这样大的维度中,许多我们想分类的有趣图像——像是狗对上猫——必然会在空间中的相同区域中。

为了有效分离这谢图像,我们考虑对资料进行一些变换以移动这些资料点。请回想一下,在二维空间中,一个线性变换等同于矩阵乘法。例如下列这些线性变换:

  • 旋转(当矩阵为正交矩阵)
  • 缩放(当矩阵为对角矩阵)
  • 反射(当行列式为负值)
  • 错切

值得注意的是,平移不是一个线性变换,因为原点不会保留在原处,但它是仿射变换。再回到我们的图像例子,我们可以先平移使各点移动到 0 的周遭,再用对角矩阵缩放来放大那个区域,最后,我们就能寻找能分割空间将各点分到各自的类别的直线。亦即,藉由线性与非线性的转换,将资料点映射到一个使他们线性可分的空间。下个部份我们会更具体的说明这个想法。

资料视觉化 - 通过神经网路将不同颜色的点分离

我们的视觉化展现的是由五个股组成的螺旋,每个股对应不同颜色。这些点在一个二维平面中,可以用元组来代表;这些颜色代表第三个维度,或者当作是各点的类别。接着我们可以用一个网路来分开不同颜色的点。

(a) 输入各点,通过网路前 (b) 输出各点,通过网路后
图 1: 五色的螺旋

这个网路会拉伸空间以使各点能被分离. 当收敛时,网路会把每种颜色分开至最终流形中的不同子空间。也就是说,新的空间中的每个颜色,对于一对全的回归都是线性可分的。图中的这些向量可以用一个 5 x 2 的矩阵表示;这个矩阵乘上每个点产出属于五种不同颜色的分数,于是每个点可以再以它们的分数分为不同颜色。这里输出维度是五,每个颜色有一个;输入维度则是二,对应 x 与 y 坐标。总之,这个网路对空间进行变换,而这种变换可参数化为数个矩阵与非线性变换。

网路结构


图 2: 网路结构

第一个矩阵将 2 维的输入映射到 100 维的隐藏层。接着加上一个非线性层:ReLU,即 Rectified Linear Unit,就是一个输出输入大于零部分的函数$(\cdot)^+$。接下来,为了用图片的方式显示图像,我们用一个嵌入层来将 100 维的隐藏层映射到 2 维的输出。最后,嵌入层被投影到 5 维的最后一层,每个维度代表各个颜色的分数。

随机投影 - Jupyter Notebook

你可以在这里找到这个 Jupyter Notebook。如果要运行这个 notebook,请先依照README.md指明地方法安装pDL环境。

PyTorch device

PyTorch 可以在 CPU 以及 GPU 上运行。CPU 擅长处理序列型的工作,GPU 则善于平行运行的工作。在想要的装置上执行前,我们要先把张量和模型转移到那个装置的记忆体中。下面两行的代码可以完成这个工作:

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
X = torch.randn(n_points, 2).to(device)

第一行创造一个名叫device的变数,并且如果有可用的 GPU 就置入其中;否则就使用 CPU。下一行中,我们建立了一个张量并且放入装置的记忆体中,藉由呼叫.to(device)

Jupyter Notebook 小技巧

Shift + Tab.以在 notebook cell 中查看函式的文件。

将线性变换视觉化

回想一下,一个线性变换可以用矩阵来表示。藉由奇异值分解,我们可以把这个矩阵分解成三个成分矩阵(component matrix),每个都代表一个不同的线性变换。

\[W = U\begin{bmatrix}s_1 & 0 \\ 0 & s_2 \end{bmatrix} V^\top\]

在等式 (1), 矩阵 $U$ 和 $V^\top$ 是正交的,表示旋转和镜射变换。中间的矩阵则是一个对角的缩放矩阵。

在图 3 中,我们视觉化数个随机矩阵进行的线性变换。请注意奇异值对于它对应的变换的影响。

这里我们用 Numpy 来产生这些矩阵;但我们也可以用 PyTorch 的nn.Linear 类别(设定bias = False)来建立线性变换。

(a) 原来的点 (b) $s_1$ = 1.540, $s_2$ = 0.304 (c) $s_1$ = 0.464, $s_2$ = 0.017
图 3: 随机矩阵所代表的线性变换

非线性变换

接下来我们要视觉化这个变换: \(f(\vx) = \tanh\bigg(\begin{bmatrix} s & 0 \\ 0 & s \end{bmatrix} \vx \bigg)\) 请回忆 $\tanh(\cdot)$ 的图形(参考图 4)


图 4:非线性函数--hyperbolic tangent

这个非线性的功能是将各点限制在 $-1$ 和 $+1$ 之间,形成一个方形。当方程式 (2) 中 $s$ 的值增加,愈来愈多的点会被推到方形的边上,我们可以在图 5 看到。藉由把更多的点推到边缘,我们把这些点更加的扩展开,能够接着来分类它们。

(a) $s=1$ 时的非线性 (b) $s=5$ 时的非线性
图 5: 非线性变换

随机的神经网路

最后,就让我们来视觉化一个单纯、未训练的神经网路所进行的变换。这个网路包含一个线性层--进行仿射变换--一个 tanh 的非线性,以及另一个线性层。仔细看看图 6 中的变换,我们发现它不同于先前看见的线性和非线性变换。之后我们会看到如何让神经网路所进行的变换完成分类的目标。


图 6: 未训练的神经网路所进行的变换


Titus Tzeng
28 Jan 2020