`
bewithme
  • 浏览: 430653 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Arbiter/概述

    博客分类:
  • dl4j
阅读更多

超参数优化

      机器学习有一个参数集合,必须在任何训练开始之前选择。 这些参数就是所谓 的超参数。  一些超参数的例子是K邻近值算法的“K”和支持向量机中的正则化参数。  神经网络,比较特别,有很多的超参数。它们中的一些定义了神经网络的结构,像层的数量和它们的大小。其它一些定义了学习过程比如说学习率和正则化传统上,这些选择是根据现有的经验法则做出的,或者经过大量的试验和错误后做出的,这两者都不太理想。 无疑的这些参数选择会在学习取得的结果上有重要影响。 超参数优化尝试使用应用搜索策略的软件自动化该过程。

 

Arbiter(阿比特)

     阿比特是企业机器学习/深度学习工具的DL4J套件之一. 它专用于dl4j神经网络的创建和导入时的参数优化 . 它允许用户为超参数设置搜索空间,并运行网 格搜索或随机搜索来在基于给定的评分指标上选择最好的配置. 什么时候用阿比特? 阿比特可以用作寻找表现好的模型,潜在的为你节约调优模型超参数的时间,但是牺牲了更大的计算时间. 注意到阿比特不会完全自动化神经网络调优的过程,用户仍需要指定搜索空间. 这个搜索空间定义了每个超参数可用的值的范围(例如:学习率允许的最大值和最小值).  如果这个搜索空间先择过于小,阿比特可能不能找到任何好的模型.添加以下到你的pom.xml来在你的工程中引用阿比特,${arbiter.version}是最新的发布版本 .

<!-- Arbiter - used for hyperparameter optimization (grid/random search) -->
<dependency>
    <groupId>org.deeplearning4j</groupId>
    <artifactId>arbiter-deeplearning4j</artifactId>
    <version>1.0.0-beta2</version>
</dependency>
<dependency>
    <groupId>org.deeplearning4j</groupId>
    <artifactId>arbiter-ui_2.11</artifactId>
    <version>1.0.0-beta2</version>
</dependency>

阿比特还提供方便的用户界面来帮助把优化的结果可视化.使用阿比特的先决条件是用户应熟悉DL4j中的神经网络配置,多层神经网络配置和计算图配配置类.

 

使用

     本节将概述使用阿比特所必需的重要组成。接下来的章节将深入细节。在最高级别,设置超参数优化涉及设置一个优化配置和通过IOptimizationRunner来运行它。如下是一些演示在优化配置中建造者模式的代码:

OptimizationConfiguration configuration = new OptimizationConfiguration.Builder()
    .candidateGenerator(candidateGenerator)
    .dataSource(dataSourceClass,dataSourceProperties)
    .modelSaver(modelSaver)
    .scoreFunction(scoreFunction)
    .terminationConditions(terminationConditions)
    .build();

如上所述,设置优化配置需要:

候选生成器: 为评估提出候选 (i.e., 超参数配置) . 候选基于一些策略创建. 目前支持随机搜索和网格搜索.有效的候选配置取决于与候选生成器相关连的超参数空间. 数据源: 数据源在后台使用,用于为生成的候选提供训练和测试数据。 模型保存器: 指定每个超参数优化器运行的结果将如何保存.  例如,是否保存到本地磁盘,数据库,HDFS系统,或只是简单的保存在内存. 评分函数:  一个单数字度量值,用于寻找最小化或最大化来决定最好的候选 .  如模型损失或分类精确度。终止条件:  决定超参数优化在什么时候停止. 如一定数量的候选已被评估,已过了一定量的计算时间.

然后将优化配置连同任务创建者一起传递给优化运行程序.

如果创建的候选是多层网络,这个设置如下:

IOptimizationRunner runner = new LocalOptimizationRunner(configuration, new MultiLayerNetworkTaskCreator());

作为可选项,如果创建的候选为计算图,这个设置如下:

IOptimizationRunner runner = new LocalOptimizationRunner(configuration, new ComputationGraphTaskCreator());

目前为止运行器惟一可用的选项为LocalOptimizationRunner,用于在单台机器上执行学习(在当前JAVA虚拟机上).原则上,其它执行方法(如,在spark或云计算机器)可以被实现.

这里总结了建立超参数优化运行的步骤 :

  1. 指定超参数的搜索空间
  2. 为超参数搜索空间指定一个候选生成器
  3. 接下来的步骤可以按任意的顺序执行:
  4. 指定一个数据源
  5. 指定一个模型保存器
  6. 指定一个评分函数
  7. 指定终止条件
  8. 以下步骤必须按顺序执行:
  9. 使用如上的2-6来构建一个优化配置
  10. 和优化运行器一起运行.

 超参数的搜索空间

     阿比特的ParameterSpace<T>  类定义了一个给定的超参数可能使用可接受的值的范围。参数空间可以是一个简单的,如参数空间定义一个双精度值的连续范围(学习率) 或是复杂的,如多个嵌套参数空间,与多层空间(为MultilayerConfiguration定义搜索空间)情况类似。

 

多层空间和计算图空间

多层空间和计算图空间是阿比特对于dl4j的多层配置和计算图配置的副本。它们用于在多层配置和计算图配置中为可用的超参数设置超参数空间。除此之外,这些用户也可以设置训练次数或是一个早停配置来指示在每个候选神经网络训练时什么候应该停止。如果一个早停配置和训练次数都被指定,早停会优先使用。

如果用户熟悉整数,连续和离散参数空间,和层空间和更新器空间,那么设置多层空间和计算图空间是非常容易直接的。惟一需要注意的警告是虽然设置权重约束是可能的,但是作为神经网络配置一部份的l1Bias 和 l2Bias 必须在多层空间中的每层/层空间基础上设置。通常所有可通过建造器使用的属性/超参数将采用固定值或该类型的参数空间。这意味着几乎多层配置的每一个层面都会被扫描用于对各种结构和初始化值进行彻底测试。

 

这里是一个多层空间的简单例子:

ParameterSpace<Boolean> biasSpace = new DiscreteParameterSpace<>(new Boolean[]{true, false});
ParameterSpace<Integer> firstLayerSize = new IntegerParameterSpace(10,30);
ParameterSpace<Integer> secondLayerSize = new MathOp<>(firstLayerSize, Op.MUL, 3);
ParameterSpace<Double> firstLayerLR = new ContinuousParameterSpace(0.01, 0.1);
ParameterSpace<Double> secondLayerLR = new MathOp<>(firstLayerLR, Op.ADD, 0.2);

MultiLayerSpace mls =
    new MultiLayerSpace.Builder().seed(12345)
            .hasBias(biasSpace)
            .layer(new DenseLayerSpace.Builder().nOut(firstLayerSize)
                    .updater(new AdamSpace(firstLayerLR))
                    .build())
            .layer(new OutputLayerSpace.Builder().nOut(secondLayerSize)
                    .updater(new AdamSpace(secondLayerLR))
                    .build())
            .setInputType(InputType.feedForward(10))
  .numEpochs(20).build(); //Data will be fit for a fixed number of epochs

 

需要特别注意的是阿比特在多层空间中改变层数量的能力。下面是一个简单的示例,演示了如何为加权损失函数设置参数搜索空间:

ILossFunction[] weightedLossFns = new ILossFunction[]{
    new LossMCXENT(Nd4j.create(new double[]{1, 0.1})),
        new LossMCXENT(Nd4j.create(new double[]{1, 0.05})),
            new LossMCXENT(Nd4j.create(new double[]{1, 0.01}))};

DiscreteParameterSpace<ILossFunction> weightLossFn = new DiscreteParameterSpace<>(weightedLossFns);
MultiLayerSpace mls =
    new MultiLayerSpace.Builder().seed(12345)
        .addLayer(new DenseLayerSpace.Builder().nIn(10).nOut(10).build(),
            new IntegerParameterSpace(2, 5)) //2 to 5 identical layers
        .addLayer(new OutputLayerSpace.Builder()
            .iLossFunction(weightLossFn)
            .nIn(10).nOut(2).build())
        .backprop(true).pretrain(false).build();

 

上面创建的两到五层将是相同的(堆叠)。目前为止阿比特不支持创建独立层,最后,也可以创建固定数量的相同层,如下面的示例所示:

DiscreteParameterSpace<Activation> activationSpace = new DiscreteParameterSpace(new Activation[]{Activation.IDENTITY, Activation.ELU, Activation.RELU});
MultiLayerSpace mls = new MultiLayerSpace.Builder().updater(new Sgd(0.005))
    .addLayer(new DenseLayerSpace.Builder().activation(activationSpace).nIn(10).nOut(10).build(),
        new FixedValue<Integer>(3))
    .addLayer(new OutputLayerSpace.Builder().iLossFunction(new LossMCXENT()).nIn(10).nOut(2).build())
    .backprop(true).build();

 

在这个例子中,网格搜索将创建三个独立的体系结构。它们将在每一个方面都相同,但是在非输出层中被选择的激活函数中是不同的。另外,要注意的是,在每个体系结构中创建的层是相同的(堆叠)。创建计算图形空间与多层空间非常相似。然而,目前只支持固定的图形结构。下面是一个简单的例子,演示了设置计算图空间:

ComputationGraphSpace cgs = new ComputationGraphSpace.Builder()
                .updater(new SgdSpace(new ContinuousParameterSpace(0.0001, 0.1)))
                .l2(new ContinuousParameterSpace(0.2, 0.5))
                .addInputs("in")
                .addLayer("0",new  DenseLayerSpace.Builder().nIn(10).nOut(10).activation(
            new DiscreteParameterSpace<>(Activation.RELU,Activation.TANH).build(),"in")           

        .addLayer("1", new OutputLayerSpace.Builder().nIn(10).nOut(10)
                             .activation(Activation.SOFTMAX).build(), "0")
        .setOutputs("1").setInputTypes(InputType.feedForward(10)).build();

JSON 系列化.

 

多层空间,计算图空间和优化配置有toJson方法也有fromJson方法。你可以存储JSON表示以供进一步使用。指定一个前面提到过的候选生成器,阿比特当前支持网格搜索和随机搜索。设置一个随机搜索是很简单的,如下所示 :MultiLayerSpace mls; … CandidateGenerator candidateGenerator = new RandomSearchGenerator(mls);设置一个网格搜索同样简单。通过网格搜索,用户还可以指定离散化计数和模式。离散化计数决定连续参数有多少值被包含在其中。例如,一个在[0,1]区间的连续参数,在离散化计数为3时被转化为[0.0,0.5,1.0]该模式决定了生成候选的方式。候选可以按顺序创建或随机创建。按照顺序,第一超参数变化最快,因此最后一个超参数变化最慢。请注意,这两种模式将导致在相同的一组候选,只是顺序不同。

这里是一个网格搜索如何用一个离散化计数为4的按顺序被设置一个例子。

CandidateGenerator candidateGenerator = new GridSearchCandidateGenerator(mls, 4,
 GridSearchCandidateGenerator.Mode.Sequential);

指定一个数据源

      数据源接口定义了用于训练不同候选的数据来源。实现起来非常简单。注意到需要定义一个没有参数的构造器。取决于用户的需要,数据源可以通过配置实现,就像小批理的大小。一个使用MNIST数据集的数据源的简单实现在repo例子中可以使用,它将在后面的指引中涉及。需要注意的是很重要的是训练次数(早停配置也是一样)可以通过多层空间和计算图构建器被设置。

 

指定一个模型/结果 保存器

     阿比特目前支持 内存保存到磁盘(文件模型保存器)来保存模型或在内存存储结果(内存结果保存器)

对于大模型来说内存结果保存器很明显是不推荐的。设置它们是很简单的。文件模型保存器构造器使用一个字符路径。它保存配置,参数和分数到:baseDir/0/, baseDir/1/, 等,它们的索引由OptimizationResult.getIndex()方法提供,内存结果保存器不需要参数。

指定一个评分函数这里有三个主要的类用于评分函数:EvaluationScoreFunction,ROCScoreFunction和 RegressionScoreFunction。

EvaluationScoreFunction使用一个dl4j评估指标,可用的指标是ACCURACY, F1, PRECISION, RECALL, GMEASURE, MCC。这里有一个使用accuracy的简单例子: ScoreFunction scoreFunction = new EvaluationScoreFunction(Evaluation.Metric.ACCURACY);

ROCScoreFunction 在测试数据集上计算AUC(曲线面积)或AUPRC(精度/召回曲线面积) 。支持不同的曲线面积类型(ROC, ROCBinary 和 ROCMultiClass)。这里是一个简单的使用AUC的例子:ScoreFunction sf = new ROCScoreFunction(ROCScoreFunction.ROCType.BINARY, ROCScoreFunction.Metric.AUC));

RegressionScoreFunction 用于回归和支持所有dl4j的回归指标(MSE, MAE, RMSE, RSE, PC, R2)这里是一个简单的例子:ScoreFunction sf = new RegressionScoreFunction(RegressionEvaluation.Metric.MSE);

 

 

指定一个终止条件

 

     阿比特目前仅支持两种终止条件-最大时间条件最大候选条件。最大时间条件是为超参数优化指定一个停止时间。最大候选条件为超参数优化停止前指定一个候选的最大数量。终止条件可以指定为一个列表。如果任何一个条件满足超参数优化将停止。这里是一个简单的例子,运行将会在15分中后停止或在训练了10个候选之后,取决于哪个条件先到。

TerminationCondition[] terminationConditions = { 
	new MaxTimeCondition(15, TimeUnit.MINUTES),
    new MaxCandidatesCondition(10)
};

运行在MNIST数据集的例子

 

      DL4J的例子中包括一个在MNIST数据集上的BasicHyperparameterOptimizationExample例子。用户可以在这里浏览这个简单的例子。这个例子也通过设置阿比特的界面来实现。阿比特使用与DL4j界面相同的存储和持久化方法。更多的有关界面的文档可以在这里找到。界面可以通过http://localhost:9000/arbiter 访问。 

 

超参数调优提示

请参阅斯坦福大学CS231N类的超参数优化的优秀章节。这些技术的总结如下: 

  • 在网格搜索和随机搜索中优先使用随机搜索。要比较随机和网格搜索方法,请参阅用于超参数优化的随机搜索(Bergstra和Bengio,2012)。
  • 从粗略到精细运行搜索(以粗略的参数开始搜索一个或两个训练次数,挑最好的候选来做精细搜索,用更多的训练次数,迭代  )
  • 为某些超参数(如学习率、L2等)使用对数均匀分布
  • 注意接近参数搜索空间边界的值。

 

有任何问题请联系微信 

如果您觉得我的文章给了您帮助,请为我买一杯饮料吧!以下是我的支付宝,意思一下我将非常感激!
  
分享到:
评论

相关推荐

    NOI评测系统Atbiter单机版使用介绍.pdf

    1. Arbiter系统概述 Arbiter系统是NOI(全国青少年信息学奥林匹克竞赛)信息学竞赛中唯一指定的评测工具,它包括网络版和单机版两个版本。网络版支持分布式评测,而单机版适合单个用户使用。 2. Arbiter系统特征 ...

    什么是计算机的输入/输出系统概述

    总线仲裁器(bus arbiter)用于解决多个设备竞争总线使用权的问题,它决定了哪个设备可以获得总线的控制权。数据传输控制,即总线通信控制,涉及到同步和异步通信两种方式。同步通信中,通信双方使用同一时钟信号...

    Performance Verification of a Complex Bus Arbiter

    #### 二、设计单元概述 **2.1 内存子系统** 在本研究中,内存子系统是设计的重要组成部分之一。它包含了一个或多个内存控制器以及通过总线连接到这些控制器的多个主设备。内存子系统的架构设计决定了系统的整体...

    mongodb多实例副本集群详细搭建

    #### 一、概述 MongoDB是一种非常流行的NoSQL数据库系统,它提供了高性能、高可用性和易于扩展性等特点。在实际应用中,为了提高系统的可靠性和性能,我们通常会搭建MongoDB的副本集。本文将详细介绍如何在四台...

    mongodb集群配置文档

    #### 一、MongoDB集群与分片概述 MongoDB是一种非常流行的非关系型数据库系统,以其灵活的数据模型、高性能和可扩展性而受到广泛欢迎。随着数据量的增长,单一MongoDB实例可能无法满足高可用性和性能需求,因此需要...

    MT7688 datasheet

    - **Arbiter**:仲裁器,用于管理不同组件对总线的访问权限。 - **DRAM Controller**:动态随机存取内存控制器,负责管理外部DRAM。 - **RBUS(SYS_CLK)**:RBUS系统时钟,为系统提供时钟信号。 - **SPI**:串行外设...

    mongdb集群部署pdf

    #### 一、MongoDB集群概述 MongoDB是一种流行的NoSQL数据库系统,以其灵活性和高性能而著称。在处理大量数据和高并发访问时,MongoDB通过集群技术提供了强大的支持。MongoDB集群主要包括三个组成部分:**数据分片...

    MT7621 Programming

    #### 一、MT7621 SoC概述 MT7621是一款高性能系统级芯片(SoC),由联发科技(MediaTek)开发,专为实现一系列高性价比的IEEE 802.11n/ac应用而设计,特别适用于搭载MediaTek (Ralink) Wi-Fi客户端卡的设备。 **核心...

    微机原理第六章可编程接口芯片及其应用(共47张PPT).pptx

    6.1 I/O接口概述 I/O接口是微机系统中的一种基本组件,负责数据的输入和输出。I/O接口可以分为两类:并行接口和串行接口。并行接口可以同时传输多位数据,而串行接口则是一位一位地传输数据。 6.2 简单接口 简单...

    MT7620 PROGRAMMING GUIDE

    2. **OCP Bridge/OCP_IF Arbiter**:用于管理各个组件之间的通信,并通过OCP总线接口进行数据传输。 3. **DRAM 控制器**:支持SDRAM/DDR1/DDR2内存类型,位于高性能低延迟的Rbus上。它采用高级内存调度器来处理来自...

    第四十二章:MongoDB复制集管理1

    复制集由多个MongoDB实例组成,包括一个Primary节点和多个Secondary节点,有时还会有Arbiter节点。这一章节主要探讨了复制集的概述、原理以及如何在实际场景中搭建和管理复制集。 一、复制集概述 MongoDB的复制集...

    ingenic jz4770 datasheet

    ### 一、概述 #### 1.1 块图 JZ4770采用高度集成的设计,其块图展示了处理器内部的主要组成部分及其相互连接方式。通过这个块图,可以了解到各个组件的位置和它们之间的信号传递路径,这对于理解和设计基于JZ4770的...

    mongodb的大型分布式部署

    #### 一、MongoDB大型分布式部署概述 MongoDB是一种非常流行的NoSQL数据库系统,尤其适用于需要处理大量非结构化数据的应用场景。随着业务的增长和技术的发展,单机部署往往无法满足日益增长的数据存储和访问需求。...

    MT7620_ProgrammingGuide_E1_20120522.pdf

    ### MT7620概述 MT7620是一款片上系统(System on Chip, SoC),内置了600MHz MIPS 24KEc CPU核心和USB主控制器/PHY。该芯片设计用于支持多种高性能、成本效益高的IEEE 802.11n应用,如MediaTek (Ralink)客户端卡等...

    AHB总线规范读书笔记

    #### 一、概述 AHB(Advanced High-performance Bus)总线规范作为AMBA(Advanced Microcontroller Bus Architecture)总线规范的一个重要组成部分,由ARM公司开发并广泛应用于SoC(System on Chip)设计中。AMBA...

    AHB总线规范读书笔记.pdf

    #### 一、概述 - **AHB总线规范**:作为AMBA总线规范的重要组成部分,AHB(Advanced High-performance Bus)是一种高性能的总线标准,主要用于高速数据传输场景,例如连接高性能处理器内核(如ARM核)与系统内的...

    基于DSP的EDMA技术

    DMAC再向系统总线仲裁器(Bus Arbiter, BA)发出总线请求信号。根据预设的优先级或共享模式,BA响应总线请求信号并向DMAC发出总线确认信号。DMAC接管总线后,向外部设备发出DMA请求响应信号,并根据预先设置的地址和...

    AMBA2.0总线规范.doc

    - **总线仲裁器(Bus Arbiter)**:决定哪个主设备可以访问总线的逻辑。 - **事务(Transaction)**:在总线上完成的一系列操作,如读写操作。 - **突发传输( Burst Transfer)**:连续的、地址连续的数据传输。 #...

    基于序列密码的强PUF抗机器学习攻击方法.docx

    本文概述了一种基于序列密码的强PUF抗机器学习攻击方法,以解决物理不可克隆函数(Physical Unclonable Function, PUF)在面临机器学习攻击时的安全性问题。PUF是一种特殊的“芯片指纹”提取技术,通过捕获IC制造...

Global site tag (gtag.js) - Google Analytics