【论文阅读笔记】GAN Memory with No Forgetting

2023-05-16

Hello大家好,今天带大家来看Nips2020的最新文章《GAN Memory with No Forgetting》。关于Nips2020所有关于终生学习的文章可见传送门

总览

本文是杜克大学(Duke University)ECE的一篇关于终身学习(Lifelong learning or continual learning)的问题的文章,关于这个问题我会再开一篇文章介绍。本文提出了一种没有遗忘的GAN模型并对其进行了压缩,文中对于模型各个参数进行了全面的分析,值得一看。

论文、附录和代码都是开源的,目前在我提交issue后已经上传了模型压缩的算法,但是没有提供最终的模型。

启发

本文主要是在GAN的框架下研究终身学习的问题,众所周知GAN是由一个 G G G(generator)和 D D D(discriminator)组成。本文主要是借鉴了风格迁移(Style-transfer)的技巧,并对提出的模型做了全面的分析。

  • 隐变量的FiLM:
    FiLM(Feature-wise Linear Modulation)是风格迁移中基础且常用的一种模型。它对神经网络的隐变量做简单的线性变化,在许多领域展现出了强大的迁移能力。
    给定网络某一层输出的一个 d d d维的特征向量 h ∈ R d \boldsymbol{h} \in \mathbb{R}^{d} hRd做如下变换:
    h ^ = γ ⊙ h + β , \hat{\boldsymbol{h}}=\boldsymbol{\gamma} \odot \boldsymbol{h}+\boldsymbol{\beta}, h^=γh+β,
    那么其中的 h ^ \hat{\boldsymbol{h}} h^就是下一层网络的输入,其中 ⊙ \odot 表示元素两两之间点乘,缩放 γ ∈ R d \boldsymbol{\gamma}\in \mathbb{R}^{d} γRd和位移 β ∈ R d \boldsymbol{\beta} \in \mathbb{R}^{d} βRd可以受到其他信息的约束。
  • 卷积层的AdaFM:
    AdaFM(adaptive filter modulation)是通过对于卷积核的变换来达到风格迁移的效果。给定一个卷积核 W ∈ R C out × C in × K 1 × K 2 \mathbf{W} \in \mathbb{R}^{{C_{\text {out}}} \times C_{\text {in}} \times K_{1} \times K_{2}} WRCout×Cin×K1×K2,其中 C in C_{\text {in}} Cin C out C_{\text {out}} Cout分别代表输入和输出的channel数量,那么AdaFM的变换就是
    W ^ = Γ ⊙ W + B \hat{\mathbf{W}}=\mathbf{\Gamma} \odot \mathbf{W}+\mathbf{B} W^=ΓW+B
    那么其中的 h ^ \hat{\boldsymbol{h}} h^就是下一层网络的输入,其中 ⊙ \odot 表示元素两两之间点乘,缩放 Γ ∈ R C out × C in \mathbf{\Gamma}\in \mathbb{R}^{C_{\text {out}}\times C_{\text {in}} } ΓRCout×Cin和位移 β ∈ R C out × C in \boldsymbol{\beta} \in \mathbb{R}^{C_{\text {out}}\times C_{\text {in}}} βRCout×Cin

提出的方法

假设GAN会遇到一系列的问题 { D 1 , D 2 , ⋯   } \left\{\mathcal{D}_{1}, \mathcal{D}_{2}, \cdots\right\} {D1,D2,},当,他们采用了分别对FC层和卷积层采用了modified FiLM (mFiLM)和modified AdaFM (mAdaFM)

  • 全链接层(FCs)
    给定一个全链接层 h source  = W z + b \boldsymbol{h}^{\text {source }}=\mathbf{W} \boldsymbol{z}+\boldsymbol{b} hsource =Wz+b,其中权重为 W ∈ R d o u t × d i n \mathbf{W}\in \mathbb{R}^{d_{out}\times d_{in}} WRdout×din,偏差 b ∈ R d o u t \boldsymbol{b}\in \mathbb{R}^{d_{out}} bRdout和输入 z ∈ R d i n \boldsymbol{z}\in\mathbb{R}^{d_{in}} zRdin
    W ^ = γ ⊙ W − μ σ + β , b ^ = b + b F C \hat{\mathbf{W}}=\gamma \odot \frac{\mathbf{W}-\boldsymbol{\mu}}{\boldsymbol{\sigma}}+\boldsymbol{\beta}, \quad \hat{\boldsymbol{b}}=\boldsymbol{b}+\boldsymbol{b}_{\mathrm{FC}} W^=γσWμ+β,b^=b+bFC

其中 μ \boldsymbol{\mu} μ σ \boldsymbol{\sigma} σ中的 μ i \boldsymbol{\mu}_i μi σ i \boldsymbol{\sigma}_i σi表示 W i , : \mathbf{W}_{i,:} Wi,:的均值和方差。

  • 卷积层(Conv layers)
    给定一个卷积层 H source  = W ∗ H ′ + b \mathbf{H}^{\text {source }}=\mathbf{W} * \mathbf{H}^{\prime}+\boldsymbol{b} Hsource =WH+b,对于卷积核做如下变换:

W ^ = Γ ⊙ W − M S + B , b ^ = b + b C o n v \hat{\mathbf{W}}=\mathbf{\Gamma} \odot \frac{\mathbf{W}-\mathbf{M}}{\mathbf{S}}+\mathbf{B}, \quad \hat{\boldsymbol{b}}=\boldsymbol{b}+\boldsymbol{b}_{\mathrm{Conv}} W^=ΓSWM+B,b^=b+bConv

这样使得对于每个问题来说下图的红色部分都是可学习的参数,而绿色部分是被冻结的参数。
网络模型

实验效果

对比fine-tuning

首先可以看出与Fine-tuning比较,文章提出的方法在问题迁移训练时收敛更快且收敛后的效果更好。

风格参数主要可以分为三类:缩放变量 { γ , Γ } \{\boldsymbol{\gamma} ,\boldsymbol{\Gamma}\} {γ,Γ},位移变量 { β , B } \{\boldsymbol{\beta} ,\boldsymbol{\Beta}\} {β,B}以及偏差 { b F C , b C o n v } \left\{\boldsymbol{b}_{\mathrm{FC}}, \boldsymbol{b}_{\mathrm{Conv}}\right\} {bFC,bConv},从下图中可以看出 { γ , Γ } \{\boldsymbol{\gamma} ,\boldsymbol{\Gamma}\} {γ,Γ}主要影响结构信息, { β , B } \{\boldsymbol{\beta} ,\boldsymbol{\Beta}\} {β,B}主要学习了低频彩色信息。
不同变量的影响
从下图可以看出 { b F C , b C o n v } \left\{\boldsymbol{b}_{\mathrm{FC}}, \boldsymbol{b}_{\mathrm{Conv}}\right\} {bFC,bConv}主要影响细节的构造,例如肿瘤或组织细节。
此外下图展示了不同层(FC到B6)的风格变量对于模型输出的影响。从头开始看,FC改变了整体的亮度和对比度,B0-B3主要将人的面部变为花朵,之后B4-B6再对生成图片的细节进行更改。
不同变量的影响
在下图的(a)中展示的是做归一化是非常有用的,图(b)表示的是GAN的模型可以平滑地从生成一朵花变为生成一只猫,这个图是通过改变权重得到的:
在这里插入图片描述
图©是一个重现结果。

仿真实验的结果:
仿真实验

额外压缩

!在笔者的要求下作者已经上传了压缩模型的代码了!
笔者个人认为额外压缩是本文的一大亮点,不过在原文中许多对于额外压缩的介绍被放在Supplemental中。

原文作者分析了每次新任务增加的参数 Γ \mathbf{\Gamma} Γ B \mathbf{B} B的奇异值(singular values)的情况。奇异值可以理解为特征值在一般矩阵上的推广。
在这里插入图片描述
他们发现几乎所有的网络的奇异值都下降的非常快,也就是说有非常多的奇异值其实接近于0,他们尝试将矩阵做奇异值分解了以后将那些小的奇异值设置为0后研究了模型的性能,发现在保持80%的power下。
在这里插入图片描述

因此他们提出了新的压缩算法:
新的压缩算法

在这里插入图片描述
可以看出每次需要额外保存的信息为 λ t \lambda_t λt s t s_t st U t U_t Ut V ^ t \hat{V}_t V^t。那么随着学习的问题越来越多, E t E_t Et压缩后的维度也越来越小,因此模型需要保存的参数也越来越少。

下表给出了压缩的参数数量结果(原本的网络参数数量为52.2M)。可以看出压缩后的参数数量大大减少压缩后的参数量

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【论文阅读笔记】GAN Memory with No Forgetting 的相关文章

  • Linux Slab 分配器和缓存性能

    来自指南理解Linux内核第三版 第 8 2 10 章 板坯着色 从第 2 章我们知道 同一个硬件缓存行映射许多不同的 RAM 块 在这个 在本章中 我们还看到相同大小的对象最终存储在缓存中的相同偏移量处 不同板内具有相同偏移量的对象将以相
  • Linux 内核线程没有地址空间

    为什么Linux内核线程没有地址空间 对于任何要执行的任务 它都应该有一个内存区域 对吗 内核线程的文本和数据去了哪里 内核线程确实有一个地址空间 只是他们都有同一个 这并不妨碍它们各自拥有不同的堆栈 文本和数据放置在内核地址空间 由所有线
  • 设置最大 CUDA 资源

    我想知道是否可以设置 CUDA 应用程序的最大 GPU 资源 例如 如果我有一个 4GB GPU 但希望给定的应用程序只能访问 2GB 如果它尝试分配更多 就会失败 理想情况下 这可以在进程级别或 CUDA 上下文级别上设置 不 目前没有允
  • 无论如何,为什么要处置一个肯定很快就会被处置的物体呢?

    假设我有一个程序 例如单击按钮 我创建了一个 Graphics 对象 显然我应该处理掉它 例如 using Graphics gr this CreateGraphics 或通过调用 Dispose in the finallytry ca
  • 查找 Java 中的内存使用情况

    以下是我需要解决的场景 我想出了两种解决方案 我需要维护从数据库获取的数据的缓存 以便在 Swing GUI 上显示 每当我的 JVM 内存超过其分配内存的 70 时 我需要警告用户有关过度使用的情况 一旦 JVM 内存使用率超过 80 那
  • 这个对象的内存会是什么样子?

    我想知道这个类 它的对象 的内存布局是什么样的 class MyClass string myString int myInt public MyClass string str int i myString str myInt i MyC
  • 如何在java中定期刷新ZipOutputStream

    我正在尝试以 zip 格式存档文件列表 然后即时为用户下载 我在下载 1GB 大小的 zip 时遇到内存不足问题 请帮助我如何在不增加 jvm 堆大小的情况下解决此问题 我想定期冲洗流 我正在尝试定期冲洗 但这对我不起作用 请在下面找到我的
  • 如何将非托管内存数组复制到同一个非托管内存中

    我保留了内存10项128字节 IntPtr dst Marshal AllocHGlobal 10 128 IntPtr src1 Marshal AllocHGlobal 128 init scr1 from DLL IntPtr src
  • DbConnection 不带 Db,使用内存中的 DataSet(或类似的)作为源

    我正在尝试对一些 NET 类进行单元测试 这些类 出于良好的设计原因 需要 DbConnections 来完成其工作 对于这些测试 我在内存中有某些数据可以作为这些类的输入 内存中的数据可以很容易地表示为 DataTable 或包含该 Da
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • C语言中变量名是如何存储在内存中的?

    在 C 中 假设你有一个名为variable name 假设它位于0xaaaaaaaa 在该内存地址处 您有整数 123 换句话说 variable name包含 123 个 我正在寻找有关措辞的澄清 variable name位于0xaa
  • 如何避免 OrderBy - 内存使用问题

    假设我们有一个很大的点列表List
  • 演员邮箱溢出。斯卡拉

    我目前正在与 scala 的两位演员合作 一 producer 产生一些数据并将其发送到parcer 生产者发送一个HashMap String HashMap Object List Int 通过消息 以及this标记发件人 parcer
  • WPF 窗口关闭后不会释放内存

    我创建了一个测试代码 private void Application Startup 1 object sender StartupEventArgs e ShutdownMode System Windows ShutdownMode
  • JVM内存段分配

    好吧 我有一个关于 JVM 内存段的问题 我知道每个 JVM 都会选择稍微不同地实现这一点 但这是一个总体概念 在所有 JVM 中应该保持相同 一个在运行时不使用虚拟机执行的标准C C 程序在运行时有四个内存段 代码 堆栈 堆 数据 所有这
  • 如何防止字符串被截留

    我的理解 可能是错误的 是 在 C 中 当你创建一个字符串时 它会被实习到 实习生池 中 这保留了对字符串的引用 以便多个相同的字符串可以共享操作内存 但是 我正在处理很多很可能是唯一的字符串 一旦完成每个字符串 我需要将它们从操作内存中完
  • PHP 对象创建和内存使用

    一个基本的虚拟类 class foo var bar 0 function foo function boo echo memory get usage echo n foo new foo echo memory get usage ec
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • 在 python 中将变量设置为“None”是否更节省内存?

    这是一个简单的问题 但由于我没有找到任何答案 我认为答案是否定的 但是 为了确保这一点 我要问 将变量设置为是否会使Python代码更有效None当我们在函数中使用完它们之后 举个例子 def foo fname temp 1 temp 2
  • Objective-C 使用字符串池吗?

    我知道Java https stackoverflow com questions 3801343 what is string pool in java and C http msdn microsoft com en us librar

随机推荐

  • vins-mobile代码解析3:drawAR

    AR功能主要流程是 xff1a 先检测平面 xff0c 然后计算AR物体 xff08 box xff09 的各个顶点3d位置 xff0c 然后写程序把每个顶点投影到相平面 xff0c 用cv的多边形填充功能来绘制到照片上面 先求一个相机朝向
  • Error:ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol

    MySQL 8 0 33 安装完成 xff0c 使用时候报错 xff1a Error xff1a ER NOT SUPPORTED AUTH MODE Client does not support authentication proto
  • 卡尔曼滤波器和优化的本质理解

    非线性最小二乘优化中 xff0c 最重要的是那个雅克比矩阵 每一行对应一个观察两 xff0c 里面的值代表要减少这个观察量的误差 xff0c 其他被优化的量需要做的改变 而每一列就是这个观察量需要怎么变才能减少不同的观察量 对于一个优化量
  • G2o,GTSAM,Ceres,Tensorflow优化器的方法比较

    首先是一些背景知识 xff1a 最速梯度下降法 xff08 GD xff09 和牛顿法可以用来优化所有种类的函数 牛顿高斯和基于牛顿高斯的LM法只能用来优化非线性最小二乘 SGD是最速梯度下降法的改进 xff0c 也就是每次迭代随即选取一些
  • MSCKF算法研究

    目的 xff1a 找一个能把imu和视觉融合起来的算法 细节 xff1a 网上搜索了下 xff0c 17年初的时候基本VIO算法就是MSCKF最完备 github上面有一个非官方的实现 xff0c 就下下来研究 但是跑kitti的数据都效果
  • SLAM中全局优化初值设置的经验谈

    情况分析 xff1a 有两段轨迹 xff0c 段内的重投影误差很小 xff0c 但是两段轨迹的相对位置有点错位 我们找到了这两段轨迹overlap的一些共视关系 这个时候如果我们直接把两段轨迹放一起做BA xff0c 其实是不能减少这两段轨
  • 视觉建图融合gps的合并工具测试

    描述 xff1a 把两个bag的数据分别计算自己的轨迹后 xff0c 和gps做刚体对齐找两个轨迹的共視关系通过两个轨迹的点云匹配后得到两个轨迹的相似变换 xff0c 把第二个轨迹变换到第一个轨迹的坐标系下加入gps边的pose graph
  • Android.mk for your own module

    这里我们向Android中添加自己的模块 xff0c 只涉及到 so a elf source的编译 xff0c 以及如何将prebuilt file添加进工程 对于APK以及jar的source暂时没有仔细研究 xff0c 要添加进去的话
  • 基于 Distcc 的android分布式编译环境的搭建

    关于Ditscc分布式编译环境的搭建 xff0c 网上也有不少文章 xff0c 但是基本上都过时了 所以看了很多文章 xff0c 走了不少弯路 xff0c 最后总算梳理清楚了一条正确的环境搭建的步骤 xff0c 而且可以实现zeroconf
  • opencv 删除二值化图像中面积较小的连通域

    对于上图的二值化图像 xff0c 要去除左下角和右上角的噪点 xff0c 方法 xff1a 使用opencv去掉黑色面积较小的连通域 代码 CvSeq contour 61 NULL double minarea 61 100 0 doub
  • c++中冒号(:)和双冒号(::)的用法

    转载于 xff1a http fengqing888 blog 163 com blog static 3301141620100623933512 1 冒号 xff08 xff09 用法 xff08 1 xff09 表示机构内位域的定义
  • linux下c语言写的简单的贪吃蛇

    基本算是第一次在linux下写程序 xff0c 果然各种不习惯 用的是emacs xff0c 都说是IDE中的神器 xff0c 但是我还没用习惯 xff0c gdb调试也不怎么熟悉 xff0c linux下的c程序设计也只是看了个皮毛 xf
  • 树莓派无需显示屏的VNC Viewer方式的远程连接

    一 配置wifi连接 方法非常简单 xff0c 首先在SD卡的根目录下添加一个名为 wpa supplicant conf的文件 xff0c 然后在该文件内添加以下的内容 xff1a ctrl interface 61 DIR 61 var
  • 由三点确定一个圆(圆心,半径)

    参考论文 一种改进的随机圆检测算法 光电工程 数据结构 圆信息 struct CircleInfo CvPoint circlecentre 圆心 double raduis 半径 点信息 struct CvPoint int x int
  • Qt Creator+MinGW+OpenCV2.3.1 开发环境搭建(windows 7 系统)

    折腾了一个下午 43 晚上 xff0c 总算弄好了 xff0c 下面说下步骤 1 必备软件 xff1a Qt SDK for Open Source C 43 43 development on Windows xff1a http qt
  • void fun() const{}; const void fun(){}; 和void const fun(){}; 的区别?

    const void fun 和void const fun 两个相同 如果采用 34 按址传递方式 34 的函数返回值加const 修饰 xff0c 那么函数返回值 xff08 即地址 xff09 的内容不能被修改 xff0c 该返回值只
  • strcpy()、memcpy()、memmove()、memset()的实现

    strcpy memcpy memmove memset 的实现 strcpy 字符串拷贝 char strcpy char strDest const char strSrc assert strDest 61 NULL amp amp
  • 多重继承的构造函数和析构函数的执行顺序(包含虚基类)

    下面示例就是说明多重继承析构函数和构造函数的执行顺序 xff1a span class token macro property span class token directive hash span span class token d
  • 阿里云服务器 配置frp实现Ubuntu台式机电脑内网穿透

    起因 实验室一台Ubuntu20 04的台式机电脑 xff0c 我想用我的Win10笔记本远程连接它 xff0c 用它的高性能 xff0c 在Ubuntu的环境下来跑代码 xff0c 这样比较方便 编程环境即可具有便携 性能 两者兼得 xf
  • 【论文阅读笔记】GAN Memory with No Forgetting

    Hello大家好 xff0c 今天带大家来看Nips2020的最新文章 GAN Memory with No Forgetting 关于Nips2020所有关于终生学习的文章可见传送门 总览 本文是杜克大学 xff08 Duke Unive