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

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d