dynet的一个基本介绍(1):动态神经网络工具包Dynet

2024-03-17 11:48

本文主要是介绍dynet的一个基本介绍(1):动态神经网络工具包Dynet,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:企鹅号

基于诸如 TensorFlow 等几种流行工具包的编程模型使用的是静态声明方法,这些工具包将网络架构的声明和执行进行了分离。

静态声明优点众多。在定义了计算图后,我们可以通过多种方式对其进行优化,以便尽可能快地完成后续的重复执行计算。而且,以在 TensorFlow 中的应用为例,静态声明也简化了跨多个设备的计算分布。但即便如此,静态声明在以下几种情况下依旧有不便之处。

可变大小的输入

可变结构的输入

非默认的推理算法

可变结构的输出

当然,如果计算图可以表示在声明时间内大小未指定的对象,那么静态声明也可以处理可变大小输入。流程控制操作(如条件执行和迭代)能够被添加到计算图所支持的操作清单中。比如说,要运行可变序列长度的 RNN,Theano 提供扫描操作,TensorFlow 提供动态 RNN 操作。

虽然从理论上来看,可以用静态声明来处理可变结构,但在实际应用中依然存在一些难点:

难以表达复杂的流程控制逻辑

计算图实现的复杂性

调试困难

这些难点直接关乎一些严重的软件工程风险。作为一种替代方案,DyNet 提出了一个新的编程模型:计算图的动态声明。PDF 链接如下:

https://arxiv.org/pdf/1701.03980.pdf

DyNet 有何创新之处?

DyNet 旨在最小化图构造的计算成本,从而实现高效的动态计算。通过这种方式,DyNet 不仅移除了快速原型设计的障碍(rapid prototyping),也实现了在静态计算范例中不易实现的更复杂的神经网络应用。

用 C++ 编写的 DyNet 后端,经过优化可消除计算图构造的开销,并支持在 CPU 或 GPU 上的高效执行。由于处理可变大小输入的流程控制和工具仍留在宿主语言中(而不是静态声明所要求的计算图中),计算图需支持更少的操作类型,并且这些操作类型倾向于更具体的指定(例如,张量的大小应该是已知的,而不是执行时推断的)。

DyNet 程序

DyNet 程序遵循以下模板:

创建模型(Model)

向模型里增加必要的参数(Parameters)和查找表参数(LookupParameters)。创建一个训练器(Trainer)对象,并使之与模型(Model)相关联。

对每个样本(example):

(a) 创建一个新的计算图(ComputationGraph),并且建立一个表达式(Expression)来填充该计算图,该表达式用来表示针对这个样本想要进行的计算。

(b) 通过调用最终表达式(Expression)的 value() 或者 npvalue() 函数,计算整个图前向计算的结果。

(c) 如果训练的话,计算损失函数的表达式(Expression),并使用它的 backward() 函数来进行反向传播。

(d) 使用训练器对模型(Model)的参数进行更新。

与像 TensorFlow 这样的静态声明库对比可以发现,DyNet 中创建一个图的步骤落在每一个循环里。这有利于用户为每个实例(instance)灵活地创建新的图结构,并使用他们掌握的编程语言中的流控句法(flow control syntax,比如迭代(iteration))来做这些。

示例程序如下:

这个程序显示了为一个简单分类器进行最大似然训练的过程,这个分类器为每个需要它预测的类计算一个向量分数,然后返回这个得分最高的类 ID 以及这个最高分。我们可以注意到,在第 14 行做了符号图的动态定义,在第 15 行,前向传递执行,在第 16 行,反向传递自动差异执行。在第 19 行,训练结束后,推理完成。考虑到推理中的动态输入 / 图,图将会针对每一个服务输入做重构。

如何使 DyNet 变成分布式?

目前,DyNet 是集中式的。而且,为了提高计算效率它还支持自动微型批处理(automatic mini-batching),为想要在模型中实现微型批处理的用户减轻负担。对于不支持微型批处理的更复杂的模型,DyNet 支持数据并行(data-parallel)多线程处理(multi-processing),这样的话,异步参数的更新可以在多个线程中执行,这也使在训练时间内并行化任何模型(在单个机器中)变得简单些。

Petuum Inc. 正在致力于通过使用 Poseidon 机器学习通信框架将这种并行性从单机处理扩展到多机数据并行处理。

查看英文原文:

http://muratbuffalo.blogspot.jp/2017/11/paper-summary-dynet-dynamic-neural.htm

这篇关于dynet的一个基本介绍(1):动态神经网络工具包Dynet的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

Java Instrumentation从概念到基本用法详解

《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

Kotlin 协程之Channel的概念和基本使用详解

《Kotlin协程之Channel的概念和基本使用详解》文章介绍协程在复杂场景中使用Channel进行数据传递与控制,涵盖创建参数、缓冲策略、操作方式及异常处理,适用于持续数据流、多协程协作等,需注... 目录前言launch / async 适合的场景Channel 的概念和基本使用概念Channel 的

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has