多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

NYU-DLSP20 第10周实战指南:自监督学习(SSL)、对比学习与 Truck Backer-Upper 实践

NYU-DLSP20 第10周实战指南:自监督学习(SSL)、对比学习与 Truck Backer-Upper 实践 示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载导读本文围绕 NYU-DLSP20NYU Deep Learning Spring 2020课程第 10 周内容展开系统讲解自监督学习Self-Supervised Learning, SSL的动机、经典 pretext task前置任务、ClusterFit 聚类方法与 PIRL 对比学习框架并带你复现本周实践项目——Truck Backer-Upper 卡车倒车入库控制器。读完本文你将掌握自监督表征学习的设计思路、对比学习损失与 memory bank 的工作原理并能在 PyTorch 中亲手训练一个仿真器 控制器两阶段神经网络系统。本文对应的原始讲义为 docs/es/week10/10.md以及英文原版 docs/en/week10/10.md详细展开见 10-1、10-2、10-3 三篇小节文档。一、Lecture Part A自监督学习与 Pretext Tasks1.1 监督预训练的成功与瓶颈过去十年计算机视觉领域最成功的配方之一就是用 ImageNet 分类做监督预训练再把学到的表征或模型权重作为初始化迁移到标注数据不足的下游任务上。但 ImageNet 级别的标注成本极其高昂1400 万张图片的标注大约耗费了22 个人年。因此社区开始寻找替代标注途径例如社交图片的 hashtag、GPS 位置以及标签是数据样本自身属性的自监督方案。在寻找替代标注前一个关键问题是我们到底能拿到多少有标注的数据若要求物体级类别 边界框标注大约只有 100 万张图片放宽边界框约束后约 1400 万张若把互联网上所有图片都算上数据量会跳升 5 个数量级此外还有图像之外、需要其他感官输入才能理解的数据。由此可知把 ImageNet 级别的标注扩展到全网图片完全不可行这直接催生了自监督学习。稀有概念问题长尾问题互联网图片的标签分布呈长尾状——大部分图片只对应极少数标签而大量标签只有很少的图片样本。因此为长尾末端的类别收集标注样本需要标注海量数据。跨域问题当下游任务图片属于完全不同领域如医学影像时ImageNet 预训练 微调的套路会失效——为每个领域都收集 ImageNet 量级的预训练数据是不现实的。1.2 什么是自监督学习自监督学习有两种定义方式基于监督学习的定义网络遵循监督学习流程但标签以半自动方式获得无需人工介入预测问题定义数据的一部分被隐藏、其余可见目标是预测被隐藏的部分或预测隐藏部分的某种属性。它与监督/无监督学习的区别在于监督学习有预定义通常人工提供的标签无监督学习只有数据样本没有任何监督、标签或正确输出自监督学习则从数据样本的共现模态co-occurring modality或样本自身的共现部分中派生标签。为什么需要自监督学习仅通过观察数据不同部分如何交互就能学习数据的表征免去海量人工标注的需求还能利用单个数据样本关联的多种模态。1.3 NLP 中的自监督学习Word2Vec给定一个输入句子任务是从句子中预测一个特意挖掉的缺失词这就是 pretext task。标签集合就是词表中所有可能的词正确标签就是被省略的那个词。网络即可用常规梯度方法训练出词级表征。1.4 视觉中的自监督学习与 Pretext Tasks视觉自监督流程通常包含两个任务pretext task前置任务和真实下游任务。下游任务可以是分类、检测等标注样本往往不足pretext task 是为了学习视觉表征而求解的自监督任务学到的表征或权重用于下游任务。Pretext task 可用图像、视频、或视频声音来构造每个任务中都有部分可见、部分隐藏的数据任务目标就是预测隐藏数据或其属性。典型图像 Pretext Tasks1) 预测图像块相对位置输入为两个图像块anchor 块与 query 块网络需预测 query 块相对于 anchor 块的位置。由于给定 anchor 后 query 有 8 个可能位置可建模为8 路分类问题标签可自动生成直接以两者相对位置为标签。评估表征质量的一个方法是最邻近检索nearest neighbours先计算数据集中所有图片的 CNN 特征作为检索池再计算目标图像块的特征从池中找出特征最接近的邻居。相对位置任务学到的表征能让视觉上相似的图像块在表征空间中也彼此靠近同时对物体颜色等因素保持一定不变性。2) 预测图像旋转这是最流行的 pretext task 之一对图像施加 0°、90°、180°、270° 旋转送入网络做4 路分类预测施加了哪种旋转。旋转预测本身没有语义意义它只是作为学习下游可用特征的代理任务。它有效的经验性直觉是要预测旋转模型必须理解图像的粗略边界与结构如区分天空与水面、沙子与海水、知道树是向上长的。3) 着色Colourisation给灰度图预测颜色。任务要求网络理解有意义的信息树是绿的、天是蓝的。需要注意着色映射不是确定性的存在多个合法解对于有多种可能颜色的物体网络会倾向于输出灰色所有可能解的平均。近期也有工作用 VAE 和隐变量实现多样化着色。4) 填空Fill in the blanks隐藏图像的一部分从周围可见部分预测被隐藏区域。有效的原因是网络会学到数据的隐式结构如车在路上跑、建筑由门窗构成。1.5 视频 Pretext Tasks视频由帧序列组成这种序列性是自监督的天然信号可构造预测帧顺序、填空、物体跟踪等任务。Shuffle Learn从一组长帧中抽出三帧顺序正确标注为正样本、打乱则标注为负样本从而变成二分类问题——给定起点与终点判断中间帧是否是二者的合法插值。实现上使用三元组孪生网络triplet Siamese network三帧独立前向传播将生成的特征拼接后做二分类。用最邻近检索观察所学表征时可以发现ImageNet 监督特征擅长坍缩整体语义能识别出是健身房场景、户外草地场景随机初始化的特征则过分关注背景颜色而 Shuffle Learn 学到的是人物姿态——因为要判断帧顺序是否正确网络必须关注场景中什么在移动这里是人。这一结论还通过微调到人体关键点估计任务得到定量验证FLIC 与 MPII 数据集上表现良好。1.6 视频声音的多模态 Pretext Task视频与声音是两种模态的感官输入任务是判断给定的视频片段是否与音频片段对应。构造方法取打鼓视频的帧与对应音频为正样本集取打鼓音频与吉他视频帧为负样本集训练二分类网络。架构上视频帧送入视觉子网络、音频送入音频子网络各自得到 128 维特征/嵌入融合后做二分类。直觉是若听到吉他声网络需要大致理解吉他的样子对鼓同理。该任务可用于预测画面中是什么在发声。1.7 理解 Pretext Task 究竟学到了什么Pretext task 应互补例如同时训练相对位置 着色两个任务可以提升性能ResNet101 上联合训练优于单独训练。单一 pretext task 未必能学好自监督表征。不同 pretext task 的难度差异很大相对位置是简单分类容易掩码填空难得多但能学到更好的表征**对比方法contrastive methods**甚至能产生比 pretext task 更多的信息。如何训练多个 pre-training 任务网络的最后一层全连接层可以根据批次类型切换——例如给一批黑白图时输出彩色图切换后给一批 patch 时预测相对位置。应该训练多久经验法则rule of thumb是选一个足够难的 pretext task 以提升下游任务实践中通常只训一次不反复重训在开发阶段则作为整条流水线的一部分训练。1.8 规模化自监督学习Jigsaw 拼图将图像分成多个瓦片后打乱模型任务是把瓦片恢复成原始布局Noorozi Favaro, 2016即预测输入被施加的置换。实现上让每个瓦片独立通过共享参数的 n-way ConvNet把卷积输出拼接后预测置换。实现要点只使用置换的子集9! 种置换中取 100 种n-way ConvNet 使用共享参数问题复杂度取决于子集大小——即你预测的信息量。Jigsaw 有时在下游任务上甚至超过监督方法因为网络学到了输入的一些几何概念。但它也有不足少样本学习受限自监督表征的样本效率不高。1.9 评估方式微调 vs 线性分类器这是一种迁移学习评估微调Fine-tuning把预训练网络整体作为下游任务新网络的初始化更新所有权重线性分类器Linear Classifier在 pretext 网络顶端训练一个小线性分类器做下游任务其余网络保持不变。一个好的表征应该只需很少训练即可迁移。评估时应跨多种不同任务把网络不同层提取的表征作为固定特征评估其在不同任务上的可用性用mAPMean Average Precision衡量。任务示例包括目标检测用微调和表面法线估计见 NYU-v2 数据集。每层学到了什么一般而言层越深其表征在下游任务的 mAP 越高但最后一层会因过度特化specialized而出现 mAP 骤降——这与监督网络mAP 随层深单调上升形成鲜明对比说明 pretext task 与下游任务并未很好对齐。二、Lecture Part BClusterFit 与 PIRL2.1 Pretext Task 缺什么泛化的希望Pretext task 的流程一般是自监督预训练 → 迁移任务分类/检测。我们希望预训练任务与迁移任务对齐——即解决 pretext task 能很好地帮助解决迁移任务。但为何非语义任务能产生好特征并不清楚比如解 Jigsaw 凭什么学到语义预测图片 hashtag 凭什么帮助下游分类一个评估办法是逐层看表征如果最后一层表征与迁移任务不对齐那么该预训练任务可能不是正确选择。下图VOC07 上基于 Jigsaw 预训练、各层线性分类器的 mAP清楚显示最后一层高度特化于 Jigsaw 问题。2.2 我们对预训练特征的两点期望表征图像彼此之间的关系relatedness——对应ClusterFitImproving Generalization of Visual Representations对干扰因素nuisance factors鲁棒即不变性——例如物体的精确位置、光照、精确颜色——对应PIRLSelf-supervised learning of Pre-text Invariant Representations。实现这两点的两大途径是聚类Clustering与对比学习Contrastive Learning二者目前的表现已明显超过此前设计的各种 pretext task。2.3 ClusterFit两步法提升视觉表征泛化对特征空间做聚类是观察图像关联性的一种方式。ClusterFit 分两步Step 1 —— Cluster特征聚类取一个预训练网络任意类型皆可从一组图像中提取大量特征然后做K-means 聚类每个图像属于一个簇该簇成为其伪标签。Step 2 —— Fit预测簇分配在聚类得到的伪标签上从零训练一个新网络让其预测这些伪标签。完整流程对比标准流程是先预训练再在下游任务评估ClusterFit 先在数据集 $D_{cf}$ 上预训练得到 $N_{pre}$用 $N_{pre}$ 在 $D_{cf}$ 上生成聚类再从零学习新网络 $N_{cf}$最后用 $N_{cf}$ 做所有下游任务。为什么 ClusterFit 有效因为在聚类步骤中只保留关键信息、丢弃伪影artefacts使第二个网络学到更通用的东西。论文用控制实验验证向 ImageNet-1K 添加不同程度的标签噪声在 ImageNet-9K 上评估迁移性能——粉色线预训练网络随标签噪声增加性能下降蓝色线模型蒸馏表现通常优于预训练网络绿色线ClusterFit始终优于前两者验证了假设。与蒸馏的区别蒸馏用预训练网络以更软的方式生成标签例如给出类别分布并用该分布训练第二个网络软分布能强化初始类别ClusterFit 则不关心标签空间。性能把 ClusterFit 用于自监督——用 Jigsaw 得到预训练网络 $N_{pre}$各数据集上的迁移性能相比其他自监督方法有可观提升。ClusterFit 对任意预训练网络都有效无需额外数据、标签或架构改动即可带来收益可视为一种自监督微调步骤。2.4 对比学习Contrastive Learning对比学习是一个通用框架学习一个特征空间把相关的样本拉近、把不相关的样本推远。相关/不相关的点图中的蓝、绿、紫通过共享网络孪生网络提取特征再用对比损失最小化蓝点之间的间距、同时确保蓝点与绿/紫点的距离更大——相关样本的嵌入空间应比不相关样本近得多。Yann LeCun 是最早提出此方法的学者之一如今自监督 SOTA 方法大多基于对比学习。如何定义相关/不相关监督学习中很清楚所有狗图相关非狗图不相关自监督中则需要构造。另一个关键区别对比学习一次性考虑多个数据点损失函数总涉及多张图而 Jigsaw、旋转等 pretext task 总是一次只考虑单张图。相似的思路可迁移到时序数据CPCContrastive Predictive Coding认为时域上邻近的帧相关、相距较远的帧不相关视频与其对应音频相关、不同视频的音画不相关——这构成了该领域大量自监督方法的基础。早期工作——物体跟踪在视频上运行目标跟踪器得到移动 patch被跟踪到的 patch 与原始 patch 相关、不同视频的 patch 不相关。网络由此自动学到物体的不同姿态例如从不同视角/姿态归组同一只狗。邻近 patch vs 远处 patchCPC v1/v2 利用了这一性质——图像中邻近的 patch 为正样本、相距远的为负样本据此最小化对比损失。单图 patch vs 其他图像 patch更主流、效果更好的做法是从一张图中随机取两个 patch可重叠、可包含、可分离施加数据增强如颜色抖动、去色后定义为正样本对再从另一张图取随机 patch 作为负样本。实例判别instance discrimination、MoCo、PIRL、SimCLR 等方法均基于此思想。2.5 Pretext Task 的底层原理与协变-不变之争Pretext task 总是单图推理对图像施加变换如 Jigsaw 置换→ 送入 ConvNet → 预测变换的属性置换、旋转、去色类型。这意味着最后一层表征必须随变换剧烈变化covariant本质是在捕捉信号的低层属性如旋转角度——但任务真正期望的却是不变性invariance无论猫是正立还是旋转 90°都应该识别出它是猫。两者方向恰好相反。当然也存在例外某些 3D 任务确实希望预测相机变换同一物体的两个视角。但对大多数语义任务而言我们更希望表征对输入变换不变。不变性有多重要不变性一直是特征学习的核心词汇SIFT 这类手工特征具有平移不变性监督训练如 AlexNet通过数据增强训练网络对裁剪、旋转不变而不是让网络预测施加了什么变换。2.6 PIRLPretext-Invariant RepresentationsPIRL 的核心思想让表征对输入变换不变即尽可能少地携带变换信息。将原始图像 $I$ 与其任何 pretext 变换版本 $I^t$ 视为相关样本其他任何图像为不相关样本把两者都送入 ConvNet 得到表征并鼓励两个表征彼此相似。由于采用对比学习原始特征 $v_I$ 与变换特征 $v_{I^t}$ 被拉近。论文考察了两种 SOTA pretext 变换Jigsaw 与旋转。这有点像多任务学习但目标不是同时预测旋转与 Jigsaw而是对二者保持不变。2.7 大量负样本与 Memory Bank对比学习成功的关键之一是使用大量负样本。2018 年的实例判别论文引入了memory bank记忆库概念为数据集中每张图像在内存中存一个特征向量对比学习时直接从内存取用任意其他图像的负样本特征而无需把大量负样本同时前向传播——后者需要极大的 batch size受限于 GPU 内存。Memory Bank 如何工作不加 memory bank 时要同时前向传播大量负图像就需要超大 batch。改用 memory bank 后原始图像特征 $f(v_I)$ 与变换图像特征 $g(v_{I^t})$ 都向内存中存储的对应特征 $m_I$ 拉近两个对比项。由于传递性$f$ 与 $g$ 也彼此拉近。作者特意把目标拆成两项而非直接做 $f$ 与 $g$ 的对比学习是为了稳定训练——直接训练不收敛。PIRL 预训练采用标准预训练评估设定——在无标签图像上预训练典型做法是取 ImageNet、扔掉标签当作无监督。2.8 PIRL 的评估结果评估方式包括全网络微调初始化评估与线性分类器特征评估。鲁棒性测试使用分布外图像从 Flickr 随机取 100 万张图YFCC 数据集预训练再迁移到不同数据集。目标检测VOC0712 / VOC07PIRL 在标准指标乃至更严格的 $AP^{all}$ 指标上均超过 ImageNet 监督预训练网络半监督学习ImageNetPIRL 优于 Jigsaw——两者的唯一差别在于 PIRL 是不变版本、Jigsaw 是协变版本线性分类ImageNetPIRL 发布时与 CPCv2 相当后续 SimCLR 等可达到约 69–70 的 Top-1 准确率而 PIRL 约 63YFCC 非精标图像即使数据集比 Jigsaw 小100 倍PIRL 仍表现更好说明在 pretext task 中考虑不变性而非仅仅预测任务本身的价值。逐层语义特征从conv1到res5PIRL 与 Jigsaw 的 Top-1 准确率都随层加深而上升但 Jigsaw 在第 5 层下降PIRL 则持续上升——表征越来越语义化。可扩展性PIRL 从不预测置换数量只是把置换当输入因此可以轻松扩展到 9 个 patch 的全部362,880 种置换而 Jigsaw 因为要预测置换受限于输出空间大小。论文还展示 PIRL 可轻松扩展到 Jigsaw、旋转等任务及其组合如 JigsawRotation。不变性 vs 性能一般而言PIRL 的不变性 聚类 pretext task性能排序同样如此——更大的不变性可以带来更好的性能。局限性shortcomings哪些数据变换真正起作用尚不清楚Jigsaw 有效但原因不明在模型规模与数据规模上存在饱和哪些不变性重要仍需探索可作为未来工作。总结应尽量预测更多信息同时尽量保持不变。2.9 课堂问答精选关于 batch norm 与对比网络问对比网络若用 batch norm信息会在样本间传递网络会不会只学到平凡的分类方式答PIRL 中未观察到该现象使用普通 batch norm 即可。问对比网络都可以用 batch norm 吗答一般可以。SimCLR 使用了 batch norm 的变体来模拟大 batch size稍加改造的 batch norm 可让训练更稳定。问PIRL 中 batch norm 有效是否只是因为 memory bank表征并非同时取答是的。PIRL 中同一 batch 不包含所有表征这可能是 batch norm 有效的原因其他 batch 内表征高度相关的任务则未必。问除 memory bank 外n-pair loss 还有什么办法答视频帧高度相关batch norm 在存在相关性时性能会退化。可用不依赖 batch size 的group norm等 batch norm 变体。关于 PIRL 的损失函数问为什么用 NCE噪声对比估计而非直接最小化 $h(v_{I},v_{I^{t}})$ 的负对数概率答两者都可用。选 NCE 更多是延续 memory bank 论文的设置有 $k1$ 个负样本时等价于求解 $k1$ 个二分类问题另一种做法是对 $k1$ 类做 softmax 并最小化负对数似然。自监督项目起步建议从简单的 pretext task 入手旋转是最容易实现的可移动部件的数量通常是实现难度的良好指标若复现已有方法需仔细看作者给出的细节确切学习率、batch norm 用法等这些细节越多实现越难数据增强至关重要先跑通基本流程再加更多增强。生成模型与对比网络结合一般认为是好主意但实现棘手、训练不易整合方法更难实现可能是未来方向。关于蒸馏one-hot 训练会让模型过度自信label smoothing 是蒸馏的简单版本预测 0.97 并把 0.01 均摊给其余类别蒸馏是用预训练网络做更有信息量的平滑。软分布更易训练、收敛更快在预训练方法中非常有用。三、PrácticaTruck Backer-Upper 卡车倒车入库本周实践探索 Nguyen Widrow1990的Truck Backer-Upper问题如何用神经网络求解一个非线性控制问题。我们学习卡车运动学模型并通过该学到的模型优化控制器发现控制器仅凭纯观测数据就能学会复杂行为。完整代码见仓库根目录的 14-truck_backer_upper.ipynb笔记中还包含卡车-拖车结构图res/car-trailer-w.png另有反色版本res/car-trainer-k.png。3.1 问题设定目标是构建一个自学习控制器控制卡车从任意初始位置倒车到装卸码头只允许倒车。卡车状态由 6 个参数表示$\Theta_{\mathrm{cab}}$卡车车头角度$x_{\mathrm{cab}}, y_{\mathrm{cab}}$挂接点车头/拖车前部的笛卡尔坐标$\Theta_{\mathrm{trailer}}$拖车角度$x_{\mathrm{trailer}}, y_{\mathrm{trailer}}$拖车尾部的笛卡尔坐标。控制器在每个时间步 $k$ 选择转向角 $\phi$随后卡车倒行一小段固定距离。成功取决于两条标准拖车尾部与码头墙面平行即 $\Theta_{\mathrm{trailer}} 0$拖车尾部 $(x_{\mathrm{trailer}}, y_{\mathrm{trailer}})$ 尽可能靠近码头点 $(x_{dock}, y_{dock})$。3.2 运动学参数与方程给定车长 $L$、车与拖车间距 $d_1$、拖车长度 $d_2$ 等参数角度与位置的变化可由以下方程计算$$ \begin{aligned} \dot{\theta_0} \frac{s}{L}\tan(\phi)\ \dot{\theta_1} \frac{s}{d_1}\sin(\theta_1 - \theta_0)\ \dot{x} s\cos(\theta_0)\ \dot{y} s\sin(\theta_0) \end{aligned} $$其中 $s$ 为带符号速度$\phi$ 为负转向角。由于长度参数已知且 $x_{\mathrm{trailer}}, y_{\mathrm{trailer}}$ 由 $x_{\mathrm{cab}}, y_{\mathrm{cab}}, d_1, \theta_1$ 决定状态实际只需 4 个参数$x_{\mathrm{cab}}, y_{\mathrm{cab}}, \theta_0, \theta_1$。仓库中的 14-truck_backer_upper.ipynb 定义了Truck类W1仅用于绘制的车身宽度、L1*W车长、d4*L$d_1$、s-0.1速度、边界框box[0, 40, -10, 10]reset()随机初始化状态$\theta_0 \in [0, 2\pi)$$\theta_1 - \theta_0 \in [-\pi/4, \pi/4)$坐标在边界框内随机不合法则递归重置。每个时间步 $k$ 喂入的转向信号范围是 $-\frac{\pi}{4}$ 到 $\frac{\pi}{4}$。序列可能以三种方式终止折刀jackknifing卡车开进自己撞到拖车出界开出边界框到达码头成功入库。3.3 两阶段训练流程训练分两个阶段1训练一个神经网络作为卡车与拖车运动学的仿真器emulator2训练一个神经网络控制器controller来控制卡车。在每个时间步 $k$仿真器输入 6 维状态向量与控制器生成的转向信号输出 $k1$ 时刻的新 6 维状态。3.4 训练仿真器Emulator仿真器输入当前状态 $(\Theta_{\mathrm{cab}}^t, x_{\mathrm{cab}}^t, y_{\mathrm{cab}}^t, \Theta_{\mathrm{trailer}}^t, x_{\mathrm{trailer}}^t, y_{\mathrm{trailer}}^t)$ 加转向方向 $\phi^t$输出下一时刻状态。结构为线性隐藏层 ReLU 线性输出层用MSE 损失 SGD训练。虽然本例中仿真器能直接给出下一位置不需要神经网络仿真器但在更复杂的系统中我们往往没有底层运动学方程的闭合形式没有宇宙定律的可用形式只有记录转向信号与对应路径的观测数据。此时就需要训练神经网络来仿真复杂系统的动力学——这正是本例要传达的核心思想。训练仿真器需要Truck类的两个关键方法。首先是step给出计算后的输出状态def step(self, ϕ0, dt1): # Check for illegal conditions if self.is_jackknifed(): print(The truck is jackknifed!) return if self.is_offscreen(): print(The car or trailer is off screen) return self.ϕ ϕ x, y, W, L, d, s, θ0, θ1, ϕ self._get_atributes() # Perform state update self.x s * cos(θ0) * dt self.y s * sin(θ0) * dt self.θ0 s / L * tan(ϕ) * dt self.θ1 s / d * sin(θ0 - θ1) * dt其次是state给出卡车当前状态def state(self): return (self.x, self.y, self.θ0, *self._traler_xy(), self.θ1)数据生成构建两个列表——输入列表追加随机生成的转向角ϕ与truck.state()得到的初始状态输出列表追加truck.step(ϕ)算出的输出状态。注意仓库笔记的默认参数episodes 10仅用于快速演示构造正式数据集需取消注释、使用episodes 10_000。仿真器训练代码见 14-truck_backer_upper.ipynb 第 15 个 cellcnt 0 for i in torch.randperm(len(train_inputs)): ϕ_state train_inputs[i] next_state_prediction emulator(ϕ_state) next_state train_outputs[i] loss criterion(next_state_prediction, next_state) optimiser_e.zero_grad() loss.backward() optimiser_e.step() if cnt 0 or (cnt 1) % 1000 0: print(f{cnt 1:4d} / {len(train_inputs)}, {loss.item():.10f}) cnt 1torch.randperm(len(train_inputs))生成 0 到样本数-1 的随机排列每次按索引i取输入ϕ_state与对应的真实下一状态next_state用 MSE 计算损失。仿真器定义为emulator nn.Sequential( nn.Linear(steering_size state_size, hidden_units_e), nn.ReLU(), nn.Linear(hidden_units_e, state_size) )数据预处理细节笔记第 12–13 个 cell对输入与输出分别做均值/标准差标准化mean tensor_inputs.mean(0)、std tensor_inputs.std(0)输入输出都减均值除标准差并按80:20划分训练/测试集test_size int(len(tensor_inputs) * 0.8)。训练后用torch.no_grad()在测试集上统计平均测试损失。3.5 训练控制器Controller控制器 $\mathbf{C}$ 输入当前状态、输出转向角仿真器 $\mathbf{T}$ 接收状态与角度、产出下一状态。训练时从随机初始状态出发反复执行 $\mathbf{C}$ 与 $\mathbf{T}$ 直到拖车与码头平行将拖车位置与码头位置的差距作为误差用反向传播求梯度、SGD 更新控制器参数。详细模型结构6 维状态向量乘以可调权重矩阵得到 25 个隐藏单元再过一层可调权重向量得到输出转向信号仿真器则把 7 维向量6 维状态 角度 $\phi$经两层网络映射到下一时刻状态。仿真器的精确实现参数为state_size 6 steering_size 1 hidden_units_e 45 emulator nn.Sequential( nn.Linear(steering_size state_size, hidden_units_e), nn.ReLU(), nn.Linear(hidden_units_e, state_size) ) optimiser_e SGD(emulator.parameters(), lr0.005) criterion nn.MSELoss()关于控制器训练笔记第 17 个 cell 明确留下一段注释# Here you need to insert the code for training the controller by using the emulator for backpropagation需要读者借助仿真器做反向传播自己补全控制器训练代码若成功还可以向仓库提交 PR——这是本周实践最有挑战性的环节。不同初始状态下的运动示例每个 episode 的时间步数各不相同见原讲义 10-3 的 Fig. 7。3.6 实践环境准备参照仓库 README.md 与环境配置 environment.yml先安装 MinicondaPython ≥ 3.7克隆仓库后用conda env create -f environment.yml创建名为NYU-DL的隔离环境包含 python、matplotlib、jupyterlab、ipympl、pytorch、torchvision、torchtext、opencv、librosa、torchviz再source activate NYU-DL激活最后jupyter lab或jupyter notebook启动即可运行本仓库全部练习。小结本周内容构成一条清晰主线标注成本 → 自监督学习 → pretext task → 聚类与对比学习 → 不变性表征PIRL→ 用学到的仿真器训练控制器。核心要点可归纳为Pretext task 通过隐藏部分数据并预测它来学习表征但最后一层往往过度特化、与下游任务不对齐ClusterFit 用 K-means 聚类生成伪标签再重训网络可丢弃伪影、提升泛化且不关心标签空间对比学习把相关样本拉近、不相关样本推远配合 memory bank 可在有限 GPU 内存下使用海量负样本PIRL 的关键是让表征对 Jigsaw、旋转等变换不变在检测、半监督、线性分类、YFCC 等场景中均优于对应协变版本Truck Backer-Upper 实践展示了学习环境动力学仿真器 通过仿真器训练控制器的非线性控制范式可直接在 14-truck_backer_upper.ipynb 中复现。想深入了解原文细节可继续阅读 docs/en/week10/10-1.md、docs/en/week10/10-2.md 与 docs/en/week10/10-3.md以及西班牙语版 docs/es/week10/10.md 及对应小节。赞分享示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载相关推荐NYU-DLSP20 第 10 周精讲自监督学习Pretext Tasks、ClusterFit 与 PIRL与 Truck Backer-Upper 神经网络控制实践NYU DLSP20 第 10 周精讲自监督学习Pretext Tasks、ClusterFit 与 PIRL与 Truck Backer Upper 神示例工程NYU-DLSP20 Truck Backer-Upper 实战用自学习神经网络控制器实现卡车倒车入库NYU DLSP20 Truck Backer Upper 实战用自学习神经网络控制器实现卡车倒车入库 本篇技术指南以 NYU DLSP20NYU Deep示例工程NYU-DLSP20 卡车倒车入库Truck Backer-Upper用神经模拟器训练自学习转向控制器NYU DLSP20 卡车倒车入库Truck Backer Upper用神经模拟器训练自学习转向控制器 本篇技术指南围绕 NYU Deep Learnin示例工程上一篇DORA 实时调优实战指南从 --rt 标志到内核级抖动优化下一篇MinerU PDF 转换实战3 个场景跑通文档解析全流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表