序列建模之循环和递归网络 - 外显记忆篇

2024-08-24 07:52

本文主要是介绍序列建模之循环和递归网络 - 外显记忆篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

序言

在序列建模的广阔领域中,循环神经网络( RNN \text{RNN} RNN)及其变体,如长短期记忆网络( LSTM \text{LSTM} LSTM)和门控循环单元( GRU \text{GRU} GRU),扮演着至关重要的角色。然而,这些网络虽然在处理序列数据方面展现出强大的能力,却常面临长期依赖问题的挑战,如梯度消失与梯度爆炸。此外,传统 RNN \text{RNN} RNN及其变体在记忆具体事实方面存在局限性,难以像人类一样明确保存和操作相关信息片段。因此,外显记忆的概念应运而生,旨在通过引入额外的记忆组件来增强神经网络对序列信息的处理能力。

外显记忆

  • 智能需要知识并且可以通过学习获取知识,这已促使大型深度架构的发展。然而,存在不同种类的知识。

    • 有些知识是隐含的、潜意识的并且难以用语言表达——比如怎么行走或狗与猫的样子有什么不同。
    • 其他知识可以是明确的、可陈述的以及可以相对简单地使用词语表达——每天常识性的知识,如 ‘‘猫是一种动物’’,或者为实现自己当前目标所需知道的非常具体的事实,如 ‘‘与销售团队会议在 141 室于下午 3:00 开始 ‘‘。
  • 神经网络擅长存储隐性知识,但是他们很难记住事实。

    • 被存储在神经网络参数中之前,随机梯度下降需要多次提供相同的输入,即使如此,该输入也不会被特别精确地存储。
    • Graves et al. (2014) \text{Graves et al. (2014)} Graves et al. (2014) 推测这是因为神经网络缺乏工作存储 ( working memory \text{working memory} working memory) 系统,即类似人类为实现一些目标而明确保存和操作相关信息片段的系统。
    • 这种外显记忆组件将使我们的系统不仅能够快速 ‘‘故意’’ 地存储和检索具体的事实,也能利用他们循序推论。
    • 神经网络处理序列信息的需要,改变了每个步骤向网络注入输入的方式,长期以来推理能力被认为是重要的,而不是对输入做出自动的、直观的反应 ( Hinton, 1990 \text{Hinton, 1990} Hinton, 1990) 。
  • 为了解决这一难题, ( Weston et al., 2014 \text{Weston et al., 2014} Weston et al., 2014) 引入了记忆网络 ( memory network \text{memory network} memory network),其中包括一组可以通过寻址机制来访问的记忆单元。

    • 记忆网络原本需要监督信号指示他们如何使用自己的记忆单元。
    • ( Graves et al., 2014 \text{Graves et al., 2014} Graves et al., 2014) 引入的神经网络图灵机 ( neural Turing machine \text{neural Turing machine} neural Turing machine),不需要明确的监督指示采取哪些行动而能学习从记忆单元读写任意内容,并通过使用基于内容的软注意机制(见 ( Bahdanau et al., 2015 \text{Bahdanau et al., 2015} Bahdanau et al., 2015)和后续篇章:深度学习应用 - 自然语言处理篇 - 使用注意机制并对齐数据片段),允许端到端的训练。
    • 这种软寻址机制已成为其他允许基于梯度优化的模拟算法机制的相关架构的标准:
      • Sukhbaatar et al., 2015 \textbf{Sukhbaatar et al., 2015} Sukhbaatar et al., 2015;
      • Joulin and Mikolov, 2015 \textbf{Joulin and Mikolov, 2015} Joulin and Mikolov, 2015;
      • Kumar et al., 2015a \textbf{Kumar et al., 2015a} Kumar et al., 2015a;
      • Vinyals et al., 2015a \textbf{Vinyals et al., 2015a} Vinyals et al., 2015a;
      • Grefenstette et al., 2015 \textbf{Grefenstette et al., 2015} Grefenstette et al., 2015
  • 每个记忆单元可以被认为是 LSTM \text{LSTM} LSTM GRU \text{GRU} GRU 中记忆单元的扩展。不同的是,网络输出一个内部状态来选择从哪个单元读取或写入,正如数字计算机读取或写入到特定地址的内存访问。

  • 产生确切整数地址的函数很难优化。

    • 为了缓解这一问题, NTM \text{NTM} NTM实际同时从多个记忆单元写入或读取。
    • 读取时,它们采取许多单元的加权平均值。
    • 写入时,他们对多个单元修改不同的数值。
    • 用于这些操作的系数被选择为集中在一个小数目的单元,如通过 softmax \text{softmax} softmax函数产生它们。
    • 使用这些具有非零导数的权重允许函数控制访问存储器,从而能使用梯度下降法优化。
    • 关于这些系数的梯度指示着其中每个参数是应该增加还是减少,但梯度通常只在接收大系数的存储器地址上变大。
  • 这些记忆单元通常扩充为包含向量,而不是由 LSTM \text{LSTM} LSTM GRU \text{GRU} GRU 存储单元所存储的单个标量。增加记忆单元大小的原因有两个。

    • 原因之一是,我们已经增加了访问记忆单元的成本。我们为产生用于许多单元的系数付出计算成本,但我们预期这些系数聚集在周围小数目的单元。通过读取向量值,而不是一个标量,我们可以抵消部分成本。
    • 使用向量值的记忆单元的另一个原因是,它们允许基于内容的寻址( content-based addressing \text{content-based addressing} content-based addressing),其中从一个单元读或写的权重是该单元的函数。如果我们能够生产符合某些但并非所有元素的模式,向量值单元允许我们检索一个完整向量值的记忆。这类似于人们能够通过几个歌词回忆起一首歌曲的方式。我们可以认为基于内容的读取指令是说, ‘‘检索一首副歌歌词中带有’ 我们都住在黄色潜水艇’ 的歌’’。当我们要检索的对象很大时,基于内容的寻址更为有用——如果歌曲的每一个字母被存储在单独的记忆单元中,我们将无法通过这种方式找到他们。通过比较,基于位置的寻址 ( location-based addressing \text{location-based addressing} location-based addressing) 不允许引用存储器的内容。我们可以认为基于位置的读取指令是说 ‘‘检索 347 档的歌的歌词’’。即使当存储单元很小时,基于位置的寻址通常也是完全合理的机制。
  • 如果一个存储单元的内容在大多数时间步上会被复制(不被忘记),则它包含的信息可以在时间上向前传播,随时间向后传播的梯度也不会消失或爆炸。

  • 外显记忆的方法图例1说明,其中我们可以看到与存储器耦接的 ‘‘任务神经网络’’。

    • 虽然这一任务神经网络可以是前馈或循环的,但整个系统是一个循环网络。
    • 任务网络可以选择读取或写入的特定内存地址。
    • 外显记忆似乎允许模型学习普通 RNN \text{RNN} RNN LSTM RNN \text{LSTM RNN} LSTM RNN不能学习的任务。
    • 这种优点的一个原因可能是因为信息和梯度可以在非常长的持续时间内传播(分别在时间上向前或向后)。
  • 作为存储器单元的加权平均值反向传播的替代,我们可以将存储器寻址系数解释为概率,并随机从一个单元读取 ( Zaremba and Sutskever, 2015 \text{Zaremba and Sutskever, 2015} Zaremba and Sutskever, 2015)。优化离散决策的模型需要专门的优化算法,将在后续篇章:深度生成模型 - 通过随机操作的反向传播篇 - 通过离散随机操作的反向传播中描述。目前为止,训练这些做离散决策的随机架构,仍比训练进行软判决的确定性算法更难。

  • 无论是软(允许反向传播)或随机硬性的,用于选择一个地址的机制与先前在机器翻译的背景下引入的注意机制形式相同 ( Bahdanau et al., 2015 \text{Bahdanau et al., 2015} Bahdanau et al., 2015),这在后续篇章:深度学习应用 - 自然语言处理篇 - 使用注意机制并对齐数据片段中也有讨论。甚至更早之前, 注意机制的想法就被引入了神经网络,在手写生成的情况下 ( Graves, 2013 \text{Graves, 2013} Graves, 2013),有一个被约束为通过序列只向前移动的注意机制。在机器翻译和记忆网络的情况下,每个步骤中关注的焦点可以移动到一个完全不同的地方 (相比之前的步骤)。

  • 循环神经网络提供了将深度学习扩展到序列数据的一种方法。他们是我们的深度学习工具箱中最后一个主要的工具。现在我们的讨论将转移到如何选择和使用这些工具,以及如何在真实世界的任务中应用。


  • 图例1:具有外显记忆网络的示意图,具备神经网络图灵机的一些关键设计元素。

  • 具有外显记忆网络的示意图,具备神经网络图灵机的一些关键设计元素。
    在这里插入图片描述

  • 说明:

    • 在此图中,我们将模型( ‘‘任务网络’’,这里是底部的循环网络)的 “表示’’ 部分与存储事实的模型(单元格集合)的 ‘‘存储器’’ 部分区分开。
    • 任务网络学习 ‘‘控制’’ 存储器,决定从哪读取以及在哪写入(通过读取和写入机制,由指向读取和写入地址的粗箭头指示)。

总结

  • 外显记忆是序列建模领域的一项重要进展,它通过为神经网络添加类似于人类工作记忆的系统,使模型能够更好地存储和检索具体事实,并据此进行推理。这种记忆组件不仅提升了模型在处理复杂序列任务时的性能,还促进了更高效的梯度传播,有助于解决长期依赖问题。记忆网络的提出为外显记忆的实现提供了初步框架,而神经网络图灵机等更高级的模型则进一步推动了该领域的发展。
  • 未来,随着外显记忆技术的不断成熟,我们有理由相信,序列建模的能力将得到显著提升,为自然语言处理、语音识别、机器翻译等领域带来更加智能和高效的解决方案。

敬请期待后续内容

深度生成模型 - 通过随机操作的反向传播篇
深度学习应用 - 自然语言处理篇

这篇关于序列建模之循环和递归网络 - 外显记忆篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五