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

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

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

前言

我将看过的增量学习论文建了一个github库,方便各位阅读,地址

主要工作

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

  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的样本选择算法,结果如下:
在这里插入图片描述

2020-04-03 22:48:26 ShenggengLin 阅读数 30
  • MongoDB实战之---初级篇

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

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

1. 摘要

    深度神经网络的成功部分归功于大规模标记良好的训练数据。然而,随着现代数据集规模的不断增长,标签信息的获取变得极为困难。该论文提出了一种基于生成式对抗网络的半监督深度学习增量自标记方法,该方法通过不断地将未标记的数据分配虚拟标签来促进训练过程。具体来说,在分配虚拟标签的过程中,该论文引入了一种基于时间的自标记方法。然后,为了在训练过程中动态地向数据分配更多的虚拟标签,该论文采用了分阶段的增量标签筛选和更新方法。最后,该论文进一步引入了平衡因子项(balance factor Term, BT),平衡训练过程中样本的信息损失。

2. 简介

    对于使用生成式对抗网络(GANs)的半监督分类,大多数网络都是通过修改常规的GAN鉴别器来产生k个输出对应于k个类。为了进一步利用未标记的数据进行训练,通常由生成器生成一个额外的第(k + 1)个类,以增强鉴别器的鉴别能力。后者能提取更多的信息特征,用于区分真实数据和虚假数据。

    该论文致力于探索一种增量式自标记方法(ISL -GAN),并将其嵌入到稳健的SSL(SSL)框架中,以提高GAN在分类领域的性能。

3. 方法

    首先,在标签预测的正确性上面,大部分的训练数据,包括标记数据和未标记数据,在训练过程中都得到了正确的预测。为了进一步检验模型对噪声标记的鲁棒性,该论文在模型训练中加入了一些错误标记的样本,发现一定比例的标签错误确实会影响最终测试的准确性。

    下面介绍该论文提出的模型。如图1所示,所提出的模型由两部分组成:第一部分是基于一致性的半监督GAN模型。第二部分负责给未标记数据分配虚拟标签,每隔一定的epoch间隔,对可信度高的数据分配一个虚拟标签来更新已标记的训练数据集。

在这里插入图片描述

图1. 增量式自标记GAN (isli -GAN)的研究进展。灰色和橙色表示模型的两个部分。不同的形状表示不同标签的输入数据,蓝色表示已标记的数据,灰色表示未标记的数据

    已知对于网络不同训练阶段输出稳定的样本,误分类的概率较低,容易误分类的样本往往出现在分类边缘附近,这必然会导致样本输出的不稳定性。考虑到这一点,为了保持每个训练样本相对稳定和安全的虚拟标签,该论文选择计算多个历史输出的平均来保证稳定性。

    考虑到通过半监督方式学习样本最终的数据标签预测正确率很高,该论文使用该方法并且通过设置未标记数据的虚拟标签来更新训练数据集。如果一个未标记的样本多次被分到了同一个类别标签,那么就把这个类别标签作为该样本的虚拟标签。在训练过程中,对一个未标记样本分配一个虚拟标签,可以有效地增加SSL中标记样本的数量,从而增加分类准确率。

    在这里,我们需要为分配了虚拟标签的样本设置一个可信度的阈值。这个阈值不可以过低,也不能过高。如果设置的过高,比如说是100%的可信度,将会导致:当我们用这一部分数据更新模型的时候算出来的损失值为0,无法进一步更新模型。过低则导致这一部分数据不可信,这和我们拿它当作训练数据的思想是违背的。因此,为了增加已拟合低损耗模型的虚拟标记样本的贡献,该论文将平衡因子项(BT) exp(pin)引入到原交叉熵损耗CE中,最终的监督损耗可由下面公式表示(详细的模型损失函数请见原论文,这里只给出了引入了平衡因子项的公式以供参考):
在这里插入图片描述
pi表示了样本属于第i类的概率,yi代表第i类的one-hot编码值。超参数n是控制损失权重的平衡因子,默认为2.0。

4. 结论

    实验结果表明,该方法可以得到MNIST、CIFAR-10和SVHN数据集的最新SSL结果。特别地,该论文的模型在样本标记较少条件下表现良好。对于只有1000个标记为CIFAR-10的图像的数据集,可以实现11.2%的测试误差,对于500和1000个标记为SVHN的数据集,可以实现几乎相同的性能,测试误差为3.5%。
在这里插入图片描述

更多有趣资讯扫码关注 BBIT
2019-11-02 16:36:17 dhaiuda 阅读数 321
  • MongoDB实战之---初级篇

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

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

前言

我将看过的增量学习论文建了一个github库,方便各位阅读地址

主要工作

论文提出了一种算法,以解决增量学习中的灾难性遗忘问题,与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,相当于进一步抵抗增量学习下类别不平衡的导致的分类器偏好问题,由此取得模型性能的提升。

2018-04-16 16:42:47 b876144622 阅读数 4696
  • MongoDB实战之---初级篇

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

    9788 人正在学习 去看看 杨庆麟
在很多机器学习的问题上,都会涉及到如果在线更新模型,离线训练好的数据,需要利用线上的数据补充更新模型,使得模型能够更好地适应各种情况。
那么在神经网络中如何在线更新模型呢?

常见的就是retrain和fine tune
retrain其实差不多就是用新的数据继续训练模型,虽然可以比较快的收敛,但也需要用所有的数据,也是比较慢的
fine tune只是微调最后一层,可能会快一些,但可能不能很好的适配新的数据。

可以这两个策略综合使用,那么就会有fine tune、 retrain、 trian三种。

但是这里都基本上是需要用所有数据的,有没有办法只用新增的数据更新模型呢?
2019-10-13 23:03:40 zhenyu_an 阅读数 198
  • MongoDB实战之---初级篇

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

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

这是ECCV2018的一个工作,提出了端到端的增量学习。

  1. 动机:目前深度学习在处理增量学习问题时面临着“灾难遗忘”的问题,作者认为其主要原因是对新类别数据训练师,无法使用旧数据。为此,作者提出端到端增量学习,其思路是,选出一部分具有代表性的旧数据,与新类别数据组成训练集对模型进行更新训练。训练的损失函数包括两部分,对旧类别数据的蒸馏交叉损失,对新数据的交叉熵损失。
  2. 作者的认识:一个真正的增量深度学习分类方法应具备以下特点:(1)可以对流数据以及任何顺序、任何时间出现的类别数据进行训练;(2)对新旧数据表现都好;(3)模型的参数和内存消耗在一定范围内;(4)特征表示和分类器是端到端的。基于这四点认识,作者认为包括LwF在内的方法均没有达到这四点要求,而LwF的问题,就在于训练新数据时完全舍弃了旧数据。
  3. 作者思路:
图1 End-to-end增量学习思路

端到端增量学习的框架建立在深度网络基础上,损失函数是一个交叉熵蒸馏损失函数。网络包括一个分类层和一个分类损失函数,分类层利用特征提取器产生一系列logits集(基于softmax生成的类别概率值)。可以看出,损失函数的设计形式与前文中LwF接近。但不同于LwF,作者挑选了一部分旧数据参与训练,为了使模型更好利用这部分数据,开辟一个专有存储空间存储这部分数据。同时为了使样本数目均衡,采用增广扩充方法生成一部分数据。具体步骤包括:

  • 开辟专有存储空间:开辟专有存储空间是为了将新类别中最具代表性的样本挑选出来,不断扩充旧样本库集合。一般而言,可以有两种存储分配方式。第一种,设定样本量上限为K个。随着类别c的增多,每个类别能够存储的样本数量减少。第二种思路是固定每个类别的样本个数,即设定单个类别的样本数上限,不设定样本总数上限。
  • 专有存储空间的操作主要包括两种,样本选择及加入和剩余样本剔除。样本选择及加入采用herding selection,即对类别中所有样本与均值点的距离进行排序,选择距离最小的n个样本作为代表性样本。剩余样本剔除即剔除代表性样本之外的所有样本。
  • 网络结构设计:如图1所示,网络结构包括两部分,特征提取器和分类输出层。特征提取器由一系列卷积层组成,分类层也就是全连接层,输出与类别数目相同。因此,可以说end-to-end的增量学习框架与LwF存在很多的相似点。不同之处在于下式中损失函数的计算。其中Lc表示常规的交叉熵损失,但是样本是由专有存储空间的样本提供的,包括新类别数据与旧数据。LD则为蒸馏的交叉损失函数,仅计算旧类别数据。

4. 最后总结一下end-to-end增量学习的步骤:

共四个步骤,组成训练集,训练模型,基于训练数据子集的微调,更新内存空间。

(1)训练集的组成如开辟专有空间步骤所述,包含了新类别的全部数据与旧类别中代表性样本。采用经典的双损失函数设计,即正常的交叉熵损失和蒸馏交叉熵损失。前者的数据是新类别和旧类别中代表性样本,采用真值的one-hot编码;后者则采用旧类别样本中的蒸馏标签。如第一张图所示,模型包含三个分类节点,其中两个灰色框表示处理旧数据,一个绿色框处理新数据。对灰色框采用蒸馏损失(黄色箭头),蓝色箭头采用交叉熵损失。可以这么简单总结,新样本只用于构建常规的交叉熵损失,旧样本则用于同时构建常规交叉熵损失和蒸馏损失。

(2)训练过程:对数据做增广扩充处理,训练时不冻结特征层和分类层,所有参数均更新。

(3)平衡微调:解决挑选的旧样本过少问题,具体操作就是丢弃部分新数据,使得训练子集中每类样本数量个数相同或接近。

(4)更新内存空间:平衡微调后,需要通过加入新类别样本更新代表性内存。

总结而言,本文的所谓端到端增量学习主要包括以下几点:1)挑选特定旧数据参与增量训练;2)双损失函数的设计;3)增量训练时样本增广扩充、样本平衡微调的细节处理。

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