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

相关文章

zookeeper端口说明及介绍

《zookeeper端口说明及介绍》:本文主要介绍zookeeper端口说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、zookeeper有三个端口(可以修改)aVNMqvZ二、3个端口的作用三、部署时注意总China编程结一、zookeeper有三个端口(可以

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁