空间拉伸实战:用线性代数、SVD 与神经网络变换理解深度学习(NYU-DLSP20 第一周实践课) 示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载本篇技术指南以 NYU Deep Learning Spring 2020NYU-DLSP20仓库pytorch-Deep-Learning第一周实践课 docs/it/week01/01-3.md 为核心系统讲解为何要通过变换把数据变得线性可分这一深度学习核心思想并配套开源仓库中的 Jupyter Notebook 02-space_stretching.ipynb 给出可复现的 PyTorch 实验。读完本文你将掌握线性变换与仿射变换的本质、SVD 分解如何拆解任意线性映射、tanh等非线性如何把点云压成可分类的形状以及如何用nn.Linear构造并可视化随机神经网络的空间变换——这些正是后续课程中一切分类器与表征学习的基础。动机高维空间里的图像分类难题课程以一个非常直观的例子引出话题假设用一台 1 百万像素1 megapixel的相机拍摄一张照片该图像大约有 1000×1000 个像素每个像素又有红、绿、蓝RGB三个颜色通道。于是一张图像就可以被看作 300 万维空间中的一个点。问题随之而来在如此巨大的维度下我们想分类的许多有趣的图像——例如一只狗 vs. 一只猫——在原始像素空间中几乎落在同一个区域彼此重叠、难以区分。因此分类的关键不在于直接观察原始空间而在于对数据进行变换把点移动到新的位置使不同类别的点在新空间中彼此分离。一句话概括课程的核心思想利用线性变换和非线性变换把数据点映射到一个新空间使它们变得线性可分linearly separable。线性变换二维空间中的矩阵乘法回忆线性代数的基础在 2 维空间中线性变换等价于矩阵乘法。以下是几类典型的线性变换及其矩阵特征旋转Rotation当变换矩阵是正交矩阵orthonormal时缩放Scaling当变换矩阵是对角矩阵时反射Reflection当变换矩阵的行列式为负时剪切Shearing一般性的线性变换形态。需要注意仅平移translation不是线性变换因为线性变换要求把原点 0 仍映射到 0而平移做不到这一点平移属于仿射变换affine transformation。回到图像分类的例子我们可以分两步处理数据先通过平移把数据点聚集到 0 附近再用对角矩阵缩放相当于对该区域进行放大zoom in。最后通过在空间中寻找分隔直线把不同类别的点划分到各自的类别。用矩阵语言表述就是变换平移 缩放 旋转……把点搬到可分的位置再做线性分类。在 PyTorch 中最常用的线性层nn.Linear(in, out, biasTrue)执行的正是仿射变换y x Wᵀ b。当设置biasFalse时它就退化为纯粹的线性变换矩阵乘法这也是后续实验中构造纯线性映射的关键开关。数据可视化用网络把五色螺旋拉伸开为了直观展示变换使数据可分课程使用了一个经典数据集五色螺旋five-colour spiral。螺旋共有五个分支每个分支对应一种不同颜色。数据点生活在二维平面中可以用二元组x, y 坐标表示而颜色则代表第三个维度可理解为每个点所属的类别。我们的目标就是训练一个网络把每个点按颜色分离开来。输入点网络之前输出点网络之后图 1五色螺旋。左为网络输入前的原始点云右为网络处理后的输出点云。可以看到网络的作用本质上是**拉伸空间这块布料space fabric训练收敛后五种颜色被网络分别映射到最终流形manifold的不同子空间中每个颜色在新空间中都变成线性可分**的——可以使用一对多one vs. all回归将其区分开。从矩阵角度看图中的向量可以用一个5×2 矩阵表示将该矩阵与每个点相乘就能为五种颜色各返回一个分数score每个点再根据分数归属到得分最高的颜色类别。这里输出维度是 5对应五种颜色输入维度是 2对应每个点的 x、y 坐标。用一句话总结这个网络把输入空间布料拿过来执行了由若干矩阵与非线性函数参数化的空间变换。网络架构2 → 100 → 2 → 5课程给出了用于该可视化的具体网络结构这是一个带有嵌入层的浅层全连接网络图 2网络架构各层职责如下第一个矩阵nn.Linear(2, 100)把 2 维输入映射到一个 100 维的中间隐藏层非线性层 ReLU即取正部分函数 $( \cdot )^$Rectified Linear Unit为网络注入非线性表达能力嵌入层embedding layer把 100 维隐藏层映射到 2 维输出目的是在二维平面上可视化变换后的点云最终投影层nn.Linear(2, 5)把 2 维嵌入投影到 5 维输出层每一维对应一种颜色的得分。这套编码到高维 → 压回低维可视化 → 再投影到类别得分的架构与第二周 04-spiral_classification.ipynb 中的螺旋分类实验D2, C3, H100即 2 维输入、3 类、100 个隐藏单元一脉相承可对照学习。实战随机投影与空间拉伸 Jupyter Notebook本小节对应的可运行实验是仓库根目录下的 02-space_stretching.ipynb。该 Notebook 从零生成随机点云依次演示线性变换、SVD 分解、tanh非线性变换以及未训练的随机神经网络对空间的扭曲是理解本讲全部概念的最佳动手材料。环境准备原文档提到运行 Notebook 需要预先安装课程环境。以仓库实际内容为准环境定义见 environment.yml其中声明了环境名NYU-DL依赖包括pytorch、torchvision、torchtext、matplotlib、jupyterlab、ipympl、opencv、librosa以及 pip 安装的torchviz等完整安装步骤见 README.md先安装 MinicondaPython ≥ 3.7克隆仓库后在仓库根目录执行conda env create -f environment.yml并激活环境随后启动jupyter lab或jupyter notebook即可。注意原文档中写作 pDL 环境但仓库实际的 environment.yml 与环境安装文档 README.md 均使用环境名NYU-DL请以仓库实际内容为准。Notebook 开头部分的关键设置代码如下from res.plot_lib import set_default, show_scatterplot, plot_bases %matplotlib inline set_default() torch.manual_seed(0)其中set_default()来自 res/plot_lib.py会将绘图风格统一为暗色背景dark_backgroundbmh并设置黑色坐标轴与图像底色torch.manual_seed(0)用于固定随机种子保证实验可复现。PyTorchdevice把张量搬到 CPU 或 GPUPyTorch 既可以运行在 CPU 上也可以运行在 GPU 上。CPU 适合处理顺序型任务而 GPU 擅长大规模并行计算。在执行计算之前必须先把张量tensor和模型显式转移到目标设备的内存中只需两行代码device torch.device(cuda:0 if torch.cuda.is_available() else cpu) X torch.randn(n_points, 2).to(device)第一行创建名为device的变量如果检测到可用 GPU 则赋值为cuda:0否则默认回退到cpu第二行创建形状为(n_points, 2)的随机张量并通过.to(device)将其发送到设备内存。在 Notebook 中n_points 1_000即生成 1000 个 2 维随机点其分布来自标准正态分布torch.randn。之后模型的构建也要记得调用model.to(device)确保权重与输入位于同一设备。课程其余所有实验如 04-spiral_classification.ipynb都沿用了这个统一的设备管理写法。Jupyter Notebook 小技巧在 Notebook 单元格中把光标放到某个函数名上按下Shift Tab即可弹出该函数的文档签名docstring是快速查阅 PyTorch API 的高效方式建议全程配合使用。可视化线性变换SVD 分解拆解矩阵线性变换可以表示为一个矩阵。利用奇异值分解Singular Value Decomposition, SVD可以把任意矩阵分解为三个组成部分每一部分对应一种不同的线性变换$$ W U\begin{bmatrix}s_1 0 \ 0 s_2 \end{bmatrix} V^\top $$矩阵 $U$ 和 $V^\top$ 是正交矩阵代表旋转与反射变换中间的对角矩阵代表缩放变换其对角线上的元素 $s_1$、$s_2$ 就是奇异值。奇异值的大小直接决定变换的脾气较大的奇异值把点拉开stretch较小的奇异值把点挤在一起squeeze。Notebook 中通过torch.svd(W)计算随机矩阵的奇异值并用Y X W.t()完成变换注意 PyTorch 的矩阵乘方向权重需转置。课程实际展示的一组随机矩阵变换结果如下原始点$s_1 1.540, s_2 0.304$$s_1 0.464, s_2 0.017$图 3随机矩阵的线性变换。可以观察到奇异值对点云拉伸/压缩程度的直接影响。Notebook 中该部分使用 Numpy/PyTorch 随机生成矩阵不过课程指出也可以直接使用 PyTorch 的nn.Linear类并设置bias False来创建线性变换model nn.Sequential(nn.Linear(2, 2, biasFalse)) model.to(device) with torch.no_grad(): Y model(X)在 res/plot_lib.py 中plot_bases(OI)会用红色/绿色箭头绘制单位基向量帮助我们直观看到矩阵如何旋转、反射坐标轴。非线性变换用tanh把点云压成正方形线性变换可以旋转、反射、拉伸和压缩但无法让空间弯曲——要弯出可分性必须引入非线性。课程演示的变换如下$$ f(\vx) \tanh\Bigg(\begin{bmatrix} s 0 \ 0 s \end{bmatrix} \vx \Bigg) $$即先用一个对角缩放矩阵对角元都是 $s$把点向外拉伸再用双曲正切hyperbolic tangent将结果压回 $(-1, 1)$ 区间。回顾 $\tanh(\cdot)$ 的函数图像它在 0 附近近似线性、两端饱和于 ±1。图 4双曲正切非线性这个非线性的效果是把点约束在 -1 与 1 之间从而形成一个近似正方形。随着缩放系数 $s$ 增大越来越多的点被推向正方形的边缘——点被摊开得更远也就更容易被分类器分开。$s1$ 时的非线性变换$s5$ 时的非线性变换图 5非线性变换。对比 $s1$ 与 $s5$可见缩放因子把更多点推到边界。对应的 Notebook 实现非常值得细读它用nn.Sequential(nn.Linear(2, 2, biasFalse), nn.Tanh())构建缩放 非线性的组合然后通过model[0].weight.data.copy_(W)直接把线性层权重设为s * torch.eye(2)缩放对角矩阵再对s 1..5循环绘制变换结果。这一写法展示了如何用数据拷贝copy_精确控制网络权重是深入理解权重即矩阵的绝佳示范。未训练的随机神经网络线性 非线性 线性的复合扭曲最后课程可视化了一个简单且未训练的神经网络所执行的变换。网络结构为nn.Linear(2, n_hidden) → nn.Tanh() → nn.Linear(n_hidden, 2)即一个执行仿射变换的线性层紧跟一个双曲正切非线性最后再接一个线性层。Notebook 中n_hidden 5并随机生成 5 个这样的网络分别可视化。图 6未训练神经网络的变换结果观察图 6 可以发现经过线性层 → 非线性 → 线性层的复合作用变换结果明显不同于前面看到的纯线性变换或单层tanh变换——空间被折叠、拉伸出现了更复杂的结构。这正是多层网络表达力的直观体现。Notebook 中还提供了一个更深版本5 个nn.Linear(2, 5)nn.ReLU()交替的 4 隐层网络并借助%matplotlib widget与interpolate()函数在输入与输出点云之间做 150 步的平滑插值动画直观展示空间布料被逐层扭曲的整个过程。从源码结构看本实验刻意使用随机未训练权重说明哪怕不做任何学习只要堆叠线性与非线性层网络就能产生复杂的空间变换而要让这种变换服务于分类则需要后续课程中的损失函数与梯度下降来驯服这些变换。这一思路与 04-spiral_classification.ipynb 中训练后螺旋被线性分离的实验形成完整闭环。可视化工具链res/plot_lib.py的支撑作用上述所有可视化都离不开仓库中的绘图工具模块 res/plot_lib.py。它为本讲提供了三个核心函数set_default()统一切换暗色绘图风格dark_backgroundbmh并设置坐标轴与画布为黑色保证 Notebook 中的图形在深色主题下清晰可读show_scatterplot(X, colors, title)绘制点云散点图。其实现会通过plt.imread(res/ziegler.png)读取一张调色板图像把每个点的colors值映射为对应像素颜色从而渲染出五色螺旋等彩色点云plot_bases(OI)用红色、绿色箭头绘制单位基向量帮助观察矩阵变换对坐标系的影响。该模块同时被 04-spiral_classification.ipynb提供plot_data、plot_model等分类可视化工具等后续实验复用是整个课程 Notebook 家族的公共可视化基础设施。小结与延伸本文围绕 NYU-DLSP20 第一周实践课 docs/it/week01/01-3.md 完成了从理论到代码的完整梳理动机高维如 300 万维图像空间中同类数据纠缠在一起必须依靠变换实现线性可分线性变换旋转、缩放、反射、剪切分别对应正交矩阵、对角矩阵、负行列式等矩阵性质平移属于仿射变换网络拉伸空间2 → 100ReLU→ 2嵌入可视化→ 5类别得分的浅层网络即可把五色螺旋按类别分开SVD 视角任意矩阵可分解为旋转/反射 × 缩放 × 旋转/反射奇异值决定点云的拉伸与压缩非线性必要tanh把点压进 $(-1, 1)$ 正方形增大缩放系数 $s$ 使点推向边缘、更易分类随机网络线性 非线性 线性的复合即可产生复杂空间扭曲为后续训练出有用变换埋下伏笔。如果你想把概念落到键盘上直接运行仓库根目录的 02-space_stretching.ipynb按 README.md 中的说明用 environment.yml 创建NYU-DL环境即可复现全部实验想进一步验证训练后线性可分的完整流程可继续学习第二周的 04-spiral_classification.ipynb。赞分享示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载相关推荐NYU-DLSP20 周课笔记 01-3线性代数、空间变换与可视化——从 SVD 到神经网络空间拉伸NYU DLSP20 周课笔记 01 3线性代数、空间变换与可视化——从 SVD 到神经网络空间拉伸 导读 本文对应 NYU Deep Learning示例工程NYU-DLSP20 第 1 周动手实践用数据变换、SVD 与可视化理解神经网络的空间拉伸NYU DLSP20 第 1 周动手实践用数据变换、SVD 与可视化理解神经网络的空间拉伸 本篇指南基于 NYU Deep Learning Spring示例工程NYU-DLSP20 深度学习课程把神经网络当作“空间变换”——基于 SVD 与 PyTorch 的线性/非线性变换可视化实战NYU DLSP20 深度学习课程把神经网络当作“空间变换”——基于 SVD 与 PyTorch 的线性/非线性变换可视化实战 本文基于 NYU DLSP20示例工程上一篇Reflex 项目结构完全指南从 reflex init 生成的每个文件说起下一篇Chalice持续部署指南generate-pipeline一键生成CodePipeline流水线创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考