[深度学习论文笔记][AAAI 18]Accelerated Training for Massive Classification via Dynamic Class Selection

本文主要是介绍[深度学习论文笔记][AAAI 18]Accelerated Training for Massive Classification via Dynamic Class Selection,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[AAAI 18] Accelerated Training for Massive Classification via Dynamic Class Selection

Xingcheng Zhang, Lei Yang, Junjie Yan, Dahua Lin

from CUHK & SenseTime

paper link

Motivation

这篇文章研究当分类器分类个数非常大的时候,如何高效训练分类器的问题。在网络的输出层,Softmax分类器会对每一个类产生一个输出。因此输出层的参数量、占用的空间和计算量是和分类个数呈正相关的。当在某些实际应用场景下,如人脸识别、自然语言处理等,其分类个数(如人的身份数量、单词种类数)会非常大,以至于使网络的输出层的参数多到无法存储在显卡中,而且无法承受如此量级的计算。这篇文章针对这个问题提出一点观察结果和一个解决该问题的方案。其分析和观察的结果是:

  1. 对于一个输入样本,其输出概率只集中在少量的类别中,可以称这些类别为活跃类(active class);
  2. 在同一迭代过程中,回传梯度主要受这些活跃类影响,其他类别的贡献很小。

因此一个解决方案便是前向和反向过程中只计算和这些活跃类相关的东西。本文提出的解决方案便是如何动态搜索得到这些活跃类到底是哪些。下面就详细介绍这篇文章的分析和观察的细节,以及解决方案的内容。

An Empirical Study of Softmax

作者通过实验来验证其关于Softmax概率分布的分析结论。为此提出了两个新的概念,

  1. top K累积概率:将输出的概率向量里最大的K个值相加(k=1,100,1000),其结果往往接近于1;
  2. 归一化的top K梯度累积能量:虽然名字很拗口,但是其实质是输出层所有梯度与top K类产生的梯度的余弦相似度,用来衡量top K类产生的梯度占所有梯度的比例。

作者在MS-Celeb-1M数据库上训练人脸识别网络,下图为统计结果。可见活跃类确实在产生的概率(图中(a))和回传的梯度(图中(b))上都占主导作用。

这里写图片描述

Selective Softmax

在上个图中,即便K=1000,其top K类仍占总类别数很小的比例(如MS-Celeb-1M中只占1.5%)。因此在训练过程中能针对不同的样本找到对应的活跃类是降低计算和存储代价的关键。

对一个输入特征x,输出层的权重矩阵为W。寻找top K类即是找到W中和这些活跃类关联的k个列向量。因为每个活跃类的概率由 wix w i x 得到,且最终的结果都很大,因此搜索活跃类过程可以转化为对W的列项量 wi w i 进行聚类。最终选取可以使 wix w i x 结果最大的那一类。

Hashing Forest

为了快速实现聚类,作者使用了构建哈希树的方法,即不停将各个列向量二分类,构建两个叶子节点。之后在叶子节点上递归二分类,继续二分叶子节点,直至每个叶子节点的向量个数小于某个值。

每次对W的列向量二分类的操作如下:

  1. 随机抽取两个列向量 wi,wj w i , w j ,求两个向量的平均作为分类基准 h=wi+wj2 h = w i + w j 2
  2. 将每个向量同该分类基准向量作点积 wTih w i T h ,依据点积结果大于0与否将其放到左、右子节点中;
  3. 当待操作的叶子节点向量个数小于某个值的时候,停止操作。

因为构建每个哈希树存在随机因素,实际使用中可以并行构建多个哈希树,组成森林以提高可靠性。

当给定输入特征x,查找top K类对应的权重向量时,搜索过程从哈希树的根节点开始。每次搜索的时候,x都会和分类基准向量作点积,同样根据结果大于0与否决定选择左节点还是右节点。该过程直到搜索抵达某个叶子节点位置。

Adaptive Allocation

在训练过程中,所搜活跃类的过程中有三个变量需要进行控制:

  1. 每次搜索活跃类的个数M;
  2. 构建哈希树的个数L;
  3. 重新构建哈希森林的间隔迭代次数T。

其中M和L决定了搜索活跃类的可靠性,T的存在是因为权重W在训练过程中也在不停变化。三个变量的选取也决定了算法的速度。作者认为随着网络迭代,模型逐渐趋稳,因此当迭代次数增加时:

  1. M要满足top M类的概率和大于一个门槛,该门槛线性增加;
  2. T线性减少;
  3. L线性增加。

对于一个训练batch,其选取的活跃类是各个输入选取得到的活跃类的集成。

Experiment

作者在几个不同的大型人脸数据集上进行了训练,来验证本文提出方案的有效性。
同时也展示了几个重要参数的敏感性。举其中一例,作者在MS-Celeb-1M和Megaface合并的数据集上训练ResNet-101模型进行人脸识别,总类别数达到了75万。其对比结果如下图所示,本文提出的方法较传统训练方法和随机选取“伪”活跃类的方法相比都很大优势:

这里写图片描述

这篇关于[深度学习论文笔记][AAAI 18]Accelerated Training for Massive Classification via Dynamic Class Selection的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/967413

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Java抽象类Abstract Class示例代码详解

《Java抽象类AbstractClass示例代码详解》Java中的抽象类(AbstractClass)是面向对象编程中的重要概念,它通过abstract关键字声明,用于定义一组相关类的公共行为和属... 目录一、抽象类的定义1. 语法格式2. 核心特征二、抽象类的核心用途1. 定义公共接口2. 提供默认实

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”