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

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

相关文章

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解