2019-11-03 09:43:16 dhaiuda 阅读数 240
  • MongoDB实战之---初级篇

    本课程环境:MongoDB 3.4.x CentOS 7.x 本课程为初级课程,围绕高阶聚合函数的使用、索引的介绍及原理解析、索引优化、性能优化、副本集搭建及分布式分片集群的搭建和原理解析来对MongoDB进行更深入的学习。 本课程对于DBA、开发、BI来说是非常友善的,从是安装集群到使用集群,再到集群的优化,生产上可能遇到的情况都将在本课程中依次出现。如何优化索引,提升查询效率更是老生常谈的问题。分布式集群如何有效利用空间来换取时间上的增量,达到百万并发。 学习完本课程后,同学们将对MongoDB有一个系统的认识,并且对如何应用MongoDB开发也会形成一套系统框架,深入学习本课程后,将掌握MongoDB的大多使用场景。

    9631 人正在学习 去看看 杨庆麟

主要工作

在大型数据集上,现有的增量学习方法的准确率都不高,归结于两个原因

  1. 在大型数据集上利用examplarexamplar进行增量学习,类别不平衡的问题会随着增量学习次数的增加而变得愈加严重。
  2. 大型数据集上存在许多相似的类别,类别不平衡下很难区分相似类别。

论文发现类别不平衡会导致全连接层分类器出现分类偏好,由此在全连接层后引入一个偏置纠正层,来尽可能抵消偏好现象,该方法称为BiC算法,在ImageNet100与ImageNet1000上的表现惊人。


算法介绍

总体流程

在这里插入图片描述
数据分为旧类别数据与新类别数据,旧类别数据远少于新类别数据,旧类别数据分为两部分trainoldvaloldtrain_{old}、val_{old},新类别数据也分为两部分trainnewvalnewtrain_{new}、val_{new}

总体分为两个阶段
阶段一:使用trainoldtrainnewtrain_{old}、train_{new}训练CNN模型
阶段二:使用valoldvalnewval_{old}、val_{new}训练偏置纠正层


步骤一:训练CNN模型

按国际惯例,这部分会介绍训练CNN模型的loss函数,还是一如既往的知识蒸馏loss,配方没变

首先是训练数据的整合,用Xn^\hat{X^n}表示examplarexamplar中的nn类旧类别数据集合,XmX^m表示mm类新类别的数据集合


loss函数介绍

在这里插入图片描述
on+m(x)o^{n+m}(x)o^n(x)\hat o^{n}(x)函数表示新旧模型的输出,按国际惯例,classification loss采用交叉熵,如下:
在这里插入图片描述

distillation loss的定义如下:
在这里插入图片描述

都是按照国际惯例使用的loss函数,在此不多做介绍,需注意,新类别数据的旧类别输出也会用于distillation loss的计算

最终的loss函数如下:
在这里插入图片描述
λ=nn+m=11+mn\lambda=\frac{n}{n+m}=\frac{1}{1+\frac{m}{n}},n表示旧类别数目,m表示新类别数目,随着增量学习步骤的增加(m固定,n增加),λ\lambda的值逐渐变大,模型越来越倾向于保留已有知识



阶段二:训练偏置纠正层

实验:分类器是否出现分类偏好

猜测

增量学习中,类别不平衡问题明显,会使分类器偏向于数据多的类别

实验

数据集:CIFAR-100
模型:使用上述loss训练的CNN模型
训练方式:利用examplar+20类新类别数据构成训练数据,实现增量学习

实验一
训练的模型准确率下降趋势明显,并且在最后一次增量学习后,从模型的混淆矩阵可以看出模型偏向于预测最后一次学习的20类,如下:
在这里插入图片描述

实验二
在实验一的基础上,冻结特征提取器,用旧类别(不是examplar)与新类别的所有数据训练模型,即对全连接层分类器进行训练,与实验一相比,准确率得到提升。

结论
本节实验的准确率结果如下图:
在这里插入图片描述
实验一的分类器使用类别不平衡的数据训练,实验二的分类器使用类别平衡的数据进行训练,实验一二模型的不同之处在于分类器。

实验一的模型出现分类偏好,实验二的模型准确率大幅提升,加之实验一的混淆矩阵,足以说明使用distillation loss训练的模型仍然会出现分类偏好,出现分类偏好的原因在于分类器

比较有趣的是,为什么实验二的模型准确率比不上“Train all layers using all data”的模型?也许是特征提取器的差异,即使用全部数据训练的特征提取器能提取更具有分类意义的特征


引入Bias Correction Layer

基于上述分析,为了矫正全连接层分类器的分类偏好,论文引入了偏置纠正层,其实就是一个线性回归层,该层的输出如下:
在这里插入图片描述
由于分类器偏向于新类别,即新类别的输出普遍比旧类别要大,因此,偏置纠正层主要对新类别分支输出进行矫正,所以对新类别分支引入了αβ\alpha、\beta两个可学习参数。

由于线性回归只有两个参数,训练速度快,并且最终效果不错,因此论文选用线性回归作为偏置矫正层

在阶段二,全连接层分类器以及特征提取器的参数被冻结,用valoldvalnewval_{old}、val_{new}训练上述线性回归模型,按国际惯例,采用的loss函数为极大似然估计推出的交叉熵:
在这里插入图片描述

实验

数据集:CIFAR-100、ImageNet-1000、Celeb-10000
baselineEEILiCaRL、LwF
其他:运用了数据增强


在大型数据集上的实验
论文题目是Large Scale,因此论文主要关注BiC在大型数据集上的表现,在ImageNet-1000与Celeb-10000上的表现如下:
在这里插入图片描述
表现非常的亮眼,比baseline多出十多个百分点


不同规模数据集下的比较
在这里插入图片描述
可看出BiC更适合大规模数据集下的增量学习(点题)


在小规模数据集CIFAR100上的比较
在这里插入图片描述
在小规模数据集上的表现不尽人意,提升并不明显,但是仍然具有一定的竞争力,这也说明BiC更适合大规模数据集下的增量学习(点题)


Ablation Study

论文首先比对了BiC各部分对于准确率提升的作用,在CIFAR100上的结果如下:
在这里插入图片描述

在这里插入图片描述


阶段一与阶段二的训练数据比为多少合适呢?结果如下:
在这里插入图片描述


论文还比对了构建examplar的样本选择算法,结果如下:
在这里插入图片描述

2019-11-02 16:36:17 dhaiuda 阅读数 154
  • MongoDB实战之---初级篇

    本课程环境:MongoDB 3.4.x CentOS 7.x 本课程为初级课程,围绕高阶聚合函数的使用、索引的介绍及原理解析、索引优化、性能优化、副本集搭建及分布式分片集群的搭建和原理解析来对MongoDB进行更深入的学习。 本课程对于DBA、开发、BI来说是非常友善的,从是安装集群到使用集群,再到集群的优化,生产上可能遇到的情况都将在本课程中依次出现。如何优化索引,提升查询效率更是老生常谈的问题。分布式集群如何有效利用空间来换取时间上的增量,达到百万并发。 学习完本课程后,同学们将对MongoDB有一个系统的认识,并且对如何应用MongoDB开发也会形成一套系统框架,深入学习本课程后,将掌握MongoDB的大多使用场景。

    9631 人正在学习 去看看 杨庆麟

主要工作

论文提出了一种算法,以解决增量学习中的灾难性遗忘问题,与iCaRL将特征提取器的学习与分类器分开不同,本论文提出的算法通过引入新定义的loss以及finetuning过程,在有效抵抗灾难性遗忘的前提下,允许特征提取器与分类器同时学习。

本论文提出的方法需要examplarexamplar


算法介绍


总体流程

在这里插入图片描述
总体分为四个流程

  1. 构建训练数据
  2. 模型训练
  3. finetuning
  4. 管理 examplarexamplar

步骤一:构建训练数据

训练数据由新类别数据与examplar构成。

设有nn个旧类别,mm个新类别,每个训练数据都有两个标签,第ii个训练数据的标签为

  1. 使用onehot编码的1(m+n)1*(m+n)的向量pip_i
  2. 设旧模型为Ft1F_{t-1},训练数据为xxqi=Ft1(x)q_i=F_{t-1}(x)qiq_i为一个1n1*n维的向量

步骤二:模型训练

模型可以选用常见的CNN网络,例如ResNet32等,按照国际惯例,这一节会介绍distillation loss,作为一篇被顶会接收的论文,自然不能免俗


loss函数介绍

符号约定

符号名 含义
NN NN个训练数据
pip_i 含义查看上一节
qiq_i 含义查看上一节
q^i\hat q_i 新模型旧类别分支的输出,为一个1n1*n的向量
nn 旧类别分支
mm 新类别分支
oio_i 新模型对于第ii个数据的输出,为一个(n+m)1(n+m)*1的向量

Classification loss即交叉熵,如下:

LC(w)=1Ni=1Nj=1n+mpijsoftmax(oij)L_C(w)=-\frac{1}{N}\sum_{i=1}^N\sum_{j=1}^{n+m}p_{ij}*softmax(o_{ij})

其中
softmax(oij)=eoijj=1n+meoijsoftmax(o_{ij})=\frac{e^{o_{ij}}}{\sum_{j=1}^{n+m}e^{o_{ij}}}


distillation loss的形式如下

LD(w)=1Ni=1Nj=1npdistijqdistijL_D(w)=-\frac{1}{N}\sum_{i=1}^{N}\sum_{j=1}^{n}pdist_{ij}qdist_{ij}

其中
pdistij=eq^ijtj=1neq^ijtqdistij=eqijtj=1neqijt pdist_{ij}=\frac{e^{\frac{\hat q_{ij}}{t}}}{\sum_{j=1}^{n}e^{\frac{\hat q_{ij}}{t}}}\\ qdist_{ij}=\frac{e^{\frac{q_{ij}}{t}}}{\sum_{j=1}^{n}e^{\frac{q_{ij}}{t}}}

LD(w)L_D(w)即让模型尽可能的记住旧类别的输出分布。t是一个超参数,在本论文中,t=2t=2


个人疑问

distillation loss的作用是让模型记住以往学习到的规律,相当于侧面引入了旧数据集,从而抵抗类别遗忘。

直觉上来说,distillation loss应该只对旧类别数据进行计算,但是新类别数据的旧类别分支输出仍用于计算distillation loss,论文对此给出的解释是“To reinforce the old knowledge”

我认为这种做法的出发点为:旧模型对于新类别数据的输出(经softmax处理),也是一种旧知识,也需要防止遗忘,因此,新模型对于新类别数据的旧类别输出(经softmax处理),与旧模型对于新类别数据的输出(经softmax处理)也要尽可能一致


步骤三:finetuning

使用herding selection算法,从新类别数据中抽取部分数据,构成与旧类别examplar大小相等的数据集,此时各类别数据之间类别平衡,利用该数据集,在小学习率下对模型进行微调,选用的loss函数应该是交叉熵。

步骤二使用类别不平衡的数据训练模型,会导致分类器出现分类偏好,finetuning可以在一定程度上矫正分类器的分类偏好


步骤四:管理examplarexamplar

论文给出了两类方法

  1. Fixed number of samples:没有内存上限,每个类别都有MM个数据
  2. Fixed memory size:内存上限为KK

使用herding selection算法选择新类别数据,构成新类别的examplarexamplar


实验

论文训练模型使用了数据增强,具体方式如下:
在这里插入图片描述
每个实验都进行了五次训练,取平均准确率
实验过程没有太多有趣的地方,在此不做过多说明

Fixed memory size

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


Fixed number of samples

在CIFAR100上的结果如下
在这里插入图片描述
img/cls表示每个examplar中图片的个数


Ablation studies

首先是选择数据构建examplar的方法,论文比对了三类方法

  1. herding selection:平均准确率63.6%
  2. random selection:平均准确率63.1%
  3. histogram selection:平均准确率59.1%

上述三个选择方法的解释如下:
在这里插入图片描述
接下来论文比对了算法各部分对准确率提升的贡献
在这里插入图片描述
上述模型的解释如下
在这里插入图片描述

个人理解

灾难性遗忘的本质是类别不平衡,模型在学习旧类别时,所使用的数据是充分的,引入知识蒸馏loss,就是尽可能保留旧数据上学习到的规律,在训练时,相当于侧面引入了旧数据。

论文在distillation loss的基础上又引入了类别平衡条件下的finetuning,相当于进一步抵抗增量学习下类别不平衡的导致的分类器偏好问题,由此取得模型性能的提升。

2019-10-22 21:28:42 u012925804 阅读数 94
  • MongoDB实战之---初级篇

    本课程环境:MongoDB 3.4.x CentOS 7.x 本课程为初级课程,围绕高阶聚合函数的使用、索引的介绍及原理解析、索引优化、性能优化、副本集搭建及分布式分片集群的搭建和原理解析来对MongoDB进行更深入的学习。 本课程对于DBA、开发、BI来说是非常友善的,从是安装集群到使用集群,再到集群的优化,生产上可能遇到的情况都将在本课程中依次出现。如何优化索引,提升查询效率更是老生常谈的问题。分布式集群如何有效利用空间来换取时间上的增量,达到百万并发。 学习完本课程后,同学们将对MongoDB有一个系统的认识,并且对如何应用MongoDB开发也会形成一套系统框架,深入学习本课程后,将掌握MongoDB的大多使用场景。

    9631 人正在学习 去看看 杨庆麟

又是一种深度学习的学习策略。

自然学习(Natural learning)系统本质上是渐进的,新知识是随着时间的推移而不断学习的,而现有的知识是保持不变的。现实世界中的许多计算机视觉应用程序都需要增量学习能力。例如,人脸识别系统应该能够在不忘记已学过的面孔的情况下添加新面孔。然而,大多数深度学习方法都存在灾难性的遗忘——当无法获得过去的数据时,性能会显著下降。

旧类数据的缺失带来了两个挑战:(a)维护旧类的分类性能; (b)平衡旧类和新类。知识蒸馏已被用来有效地解决前一个挑战。最近的研究也表明,从旧的类中选择几个样本(抽样) 可以缓解不平衡问题。这些方法在小数据集上运行良好。然而,当类的数量变得很大(例如,成千上万个类)时,它们的性能会显著下降。图1显示了以非增量分类器为参考的这些最先进算法的性能退化情况。当类的数量从100增加到1000时,iCaRL和EEIL都有更多的精度下降。

为什么处理大量的类进行增量学习更具挑战性? 我们认为这是由于两个因素的耦合。首先,训练数据不平衡。其次,随着类数量的增加,在不同的增量步骤中更可能出现类似的类(例如ImageNet中的多个dog类)。在数据不平衡的增量约束下,视觉上相似的类数量的增加尤其具有挑战性,因为类之间边界的小边界对数据不平衡过于敏感。边界被推到支持具有更多示例的类。

引用

  • Large Scale Incremental Learning
2019-10-12 21:32:27 zhenyu_an 阅读数 107
  • MongoDB实战之---初级篇

    本课程环境:MongoDB 3.4.x CentOS 7.x 本课程为初级课程,围绕高阶聚合函数的使用、索引的介绍及原理解析、索引优化、性能优化、副本集搭建及分布式分片集群的搭建和原理解析来对MongoDB进行更深入的学习。 本课程对于DBA、开发、BI来说是非常友善的,从是安装集群到使用集群,再到集群的优化,生产上可能遇到的情况都将在本课程中依次出现。如何优化索引,提升查询效率更是老生常谈的问题。分布式集群如何有效利用空间来换取时间上的增量,达到百万并发。 学习完本课程后,同学们将对MongoDB有一个系统的认识,并且对如何应用MongoDB开发也会形成一套系统框架,深入学习本课程后,将掌握MongoDB的大多使用场景。

    9631 人正在学习 去看看 杨庆麟

本博客重点解析《Learning without forgetting》

     Learning without forgetting(LwF)方法是比较早期(2017年PAMI的论文,说起来也不算早)将Knowledge Distillation与深度学习结合起来解决增量学习的工作,在该方法中,深度网络完全舍弃旧数据,而在新数据上进行训练。

       作者将可能具有增量学习性能的方法分类如下:

不同增量式学习的框架

(a)图介绍了一个基础网络,\theta _{\rm{S}}\theta _O分别代表卷积层和输出层,以AlexNet为例,\theta _O代表最后一个全连接层,\theta _{\rm{S}}代表前面所有的卷积层和后两个全连接层。作为一个基础网络,(a)的输出包括旧类别从1到m的训练任务。

(b)图代表一种朴素的基于微调的增量学习思路,即训练好AlexNet后,固定原类别1到m的输出层参数,微调卷积层\theta _{\rm{S}}和新类别new task的输出层参数。

(c)图思路是把卷积层\theta _{\rm{S}}作为特征提取的手段,参数不变,\theta _O参数也不变,只训练新类别的输出层参数。

(d)图思路是联合训练,即把新旧类别数据全部送进网络,参数全部微调,效果最好。

(e)图思路即本文的LwF,微调全部参数,但是不使用旧类别数据。具体训练过程如下所示:

这里,\theta _{\rm{n}}代表适用于新类别的输出层参数,具体训练过程如下:

初始化:

1)、将训练好的CNN网络在新数据Xn上跑一边,得到输出YO

2)、将\theta _{\rm{n}}参数随机初始化

训练:

定义旧任务输出YO',输入数据为Xn,微调\theta _{\rm{S}}\theta _O

定义新任务输出Yn',输入数据为Xn,微调\theta _{\rm{S}}\theta _{\rm{n}}

其中,设计损失函数如下:

Lold设计为YO‘与YO之间的差异,采用蒸馏的交叉熵损失

Lnew设计为Yn与Yn‘之间的差异,采用常规的交叉熵损失

这样,就完成了不需任何旧任务数据的增量训练,LwF也成为增量学习的一个算法标杆。

 

下章博客将介绍End-to-End Incremental Learning

 

 

2019-11-14 15:58:23 PerfeyCui 阅读数 111
  • MongoDB实战之---初级篇

    本课程环境:MongoDB 3.4.x CentOS 7.x 本课程为初级课程,围绕高阶聚合函数的使用、索引的介绍及原理解析、索引优化、性能优化、副本集搭建及分布式分片集群的搭建和原理解析来对MongoDB进行更深入的学习。 本课程对于DBA、开发、BI来说是非常友善的,从是安装集群到使用集群,再到集群的优化,生产上可能遇到的情况都将在本课程中依次出现。如何优化索引,提升查询效率更是老生常谈的问题。分布式集群如何有效利用空间来换取时间上的增量,达到百万并发。 学习完本课程后,同学们将对MongoDB有一个系统的认识,并且对如何应用MongoDB开发也会形成一套系统框架,深入学习本课程后,将掌握MongoDB的大多使用场景。

    9631 人正在学习 去看看 杨庆麟

需求

  1. 流式数据:如果数据不是收集好的一整块,而是流式(非批量数据),我又确实需要一点点学习,而不是数据准备齐全了再学
  2. 优化模型:不想耗时的重头训练,或只想针对别的模型做的差的再挑出来学习一遍(典型的基于SVM的增量学习,先挑出SVM学不好的边界点,再次学习提升)
  3. 现实需求:用户增加、用户删减,不适合数百、数万的用户都重来一遍。运营中修正
  4. 模拟人类:人是渐进式学习的,一天天课堂、业余式时间。模式是一个个知识点,效果未必比学个大纲,整本吃下要差

做法

典型的方式:

Created with Raphaël 2.2.0开始取得既有的模型(结构、参数表等等)构建新模型,训练,测试,存储达到要求或截止门槛?结束yesno

实例

借花献佛:有个可以跑通的一个例子,分三个; 代码可跑
note: line29,config.read(trainning_task_file, encoding = ‘UTF-8’)
原文的未指定编码,用gbk出错,强制为utf-8可借;

 1 模型配置:
link:配置表
 2 模型首次跑动
link:TF首次跑起来
 3 模型再次取得网络结构、权重值,再次训练
link:再次取得神经网络和参数表ckpt并再次训练

核心操作就一个:
line:85-88,原本加图后,init改为 保存点加载模型和参数表后 restore恢复TF-NN神经网络

sess = tf.Session(graph=graph)
sess.run(init)          # Very important

Changed to:

sess = tf.Session(graph=graph)
check_point_path = 'saved_model/' # 保存好模型的文件路径
ckpt = tf.train.get_checkpoint_state(checkpoint_dir=check_point_path)
saver.restore(sess,ckpt.model_checkpoint_path)

说白了,这里所谓“增量学习”还是很粗浅的,就是将一次完整训练打断,中间saver保存现场,下次有了新数据再重新启动训练。
这里并没有涉及到,新小量数据的灌入、训练不好的地方的查漏补缺的“人的智能”的实现的。机器还是比较傻的,需要我辈更努力去改进。

没有更多推荐了,返回首页