【论文阅读笔记】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 的相关文章

  • Node.js 进程内存不足错误

    FATAL ERROR CALL AND RETRY 2 Allocation Failed process out of memory 我看到这个错误 但不太确定它来自哪里 我正在从事的项目有以下基本工作流程 从其他来源接收 XML 帖子
  • 将数组复制到动态分配的内存

    我的代码可以正常工作 但我觉得好像有一种更快的方法可以做到这一点 特别是在我的函数副本中 这是我的代码 这能再快一点吗 顺便说一句 这是 C 语言 另外 当我从函数返回 cpy 时 它是否会删除动态内存 因为它超出了范围 我不想发生内存泄漏
  • 用eclipse测试java程序的内存消耗[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 32位进程在64位操作系统上可以访问多少内存?

    在 Windows 上 正常情况下 32 位进程只能访问 2GB RAM 或通过 boot ini 文件中的特殊开关访问 3GB 在 64 位操作系统上运行 32 位进程时 有多少可用内存 是否有任何特殊的开关或设置可以改变这种情况 默认
  • 如何解决内存分段并强制FastMM释放内存给OS?

    注意 32 位应用程序不计划迁移到 64 位 我正在使用一个非常消耗内存的应用程序 并且几乎优化了与内存分配 取消分配相关的所有相关路径 应用程序本身没有内存泄漏 没有句柄泄漏 没有任何其他类型的泄漏 据我所知并经过测试 我无法触及的第 3
  • 抛出错误的分配

    我在尝试使用升压托管共享内存时收到 bad alloc 我从他们的快速指南中复制了升压示例 以供不耐烦的人使用 并结合了我自己的更改 我的代码如下 我注释掉了示例内容并在下面编写了自己的代码 我还进行了一些调试和测试 有人有什么想法吗 任何
  • 我要恢复我的记忆!我怎样才能真正处理一个控件?

    我正在制作一个应用程序 它创建大量的窗口控件 按钮和标签等 它们都是通过函数动态生成的 我遇到的问题是 当我删除控件并处置它们时 它们不会从内存中删除 void loadALoadOfStuff while tabControlToClea
  • iOS游戏大小问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我开发了一款 iOS 通用游戏 我想
  • 为什么要在堆而不是堆栈上分配内存? [复制]

    这个问题在这里已经有答案了 可能的重复 什么时候最好使用堆栈而不是堆 反之亦然 https stackoverflow com questions 102009 when is it best to use a stack instead
  • Java BigDecimal 内存使用情况?

    是否有一个指南来估计一个程序消耗的内存量BigDecimal 寻找与这些类似的东西指导方针 http www javamex com tutorials memory string memory usage shtml用于估计String内
  • new 运算符(以及 malloc)无法分配约 450 MB 的内存 [重复]

    这个问题在这里已经有答案了 我正在开发一个程序 该程序在内存中存储大约 2 2 亿个短值的数组 该数据块的分配方式如下 short arrayName new short SIZE OF ARRAY 然后将文件的内容读入内存 在团队中的另一
  • 为什么连接终止

    我正在尝试使用随机森林分类模型H2OR 内部的库 训练集有 7000 万行和 25 个数字特征 总文件大小为 5 6 GB 验证文件的大小为 1 GB 我的系统有 16 GB RAM 和 8 核 CPU 系统成功读取 H2O 对象中的两个文
  • 找出Linux上一个进程使用了​​多少内存页

    我需要找出进程分配了多少内存页 每个页面是 4096 进程内存使用情况我在查找正确值时遇到一些问题 当我查看 gome system monitor 时 内存映射下有几个值可供选择 Thanks 这样做的目的是将内存使用量除以页数并验证页大
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 为什么 CUDA 内存复制速度会这样,有一些恒定的驱动程序开销?

    在我的旧 GeForce 8800GT 上使用 CUDA 内存时 我总是会遇到奇怪的 0 04 毫秒开销 我需要将 1 2K 传输到设备的常量内存中 处理其中的数据并从设备中仅获取一个浮点值 我有一个使用 GPU 计算的典型代码 alloc
  • 尝试了解 ARM 二进制映像中的加载内存地址 (LMA) 和二进制文件偏移量

    我在一家ARM 皮质 M4 STM32F4xxxx 我试图了解二进制文件 elf and bin 在内存中构建并闪存 特别是关于内存位置 具体来说 我不明白的是LMA从实际的二进制文件偏移量进行 翻译 让我用一个例子来解释一下 我有一个 e
  • 如果 free() 知道我的数组的长度,为什么我不能在自己的代码中请求它?

    我知道将动态分配的数组的长度传递给操作它们的函数是一个常见的约定 void initializeAndFree int anArray size t length int main size t arrayLength 0 scanf d
  • 动态二维数组非连续内存C++

    假设我将二维数组的地址及其二维数组的行和列传递给函数 该函数会将二维数组的地址视为一维数组 例如 int Matrix 如果我执行下面的代码 int arr arr new int row for int i 0 i lt row i ar
  • 如何获取可用系统内存的大小?

    C NET 中是否可以获取系统可用内存的大小 如果是的话怎么办 Use Microsoft VisualBasic Devices ComputerInfo TotalPhysicalMemory http msdn microsoft c

随机推荐

  • 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