📒
Notes
  • 个人笔记
  • Machine Learning
    • Tensorflow
      • Text
        • Keras构建RNN
        • 字词嵌入
        • 字词嵌入示例程序
      • Data processing
        • tf.data数据加载
      • Tensorflow Tricks
    • 循环神经网络概览
    • Pix2Pix
  • Assembly Language
    • DOS中的Debug模式
    • LOOP指令
    • 8086CPU
    • 标志位寄存器
    • 汇编指令
    • 汇编语言源程序格式
  • Linux System
    • Systemctl 服务脚本
    • Linux端口占用
    • Btrfs文件系统
    • C Socket网络编程细节问题
  • Hexo
    • Hexo下的Tag/Categories栏
    • Git备份博客
    • Hexo博客基本部署
  • Kernel
    • C语言中消息队列实现
    • Linux内核的进程调度函数
    • Linux内核模块的编译
    • Linux Kernel概述
  • Linux Software
    • Linux软件安装与配置
  • Docker
    • OVS+Docker网络构建
    • Docker分层垃圾清理
  • C
    • CMakeList语法
Powered by GitBook
On this page
  • 计算图展开
  • 动态系统模型展开
  • 信息损失
  • 循环神经网络
  • 参数更新公式
  • 时序模型结构
  • 导师驱动过程
  • 参考

Was this helpful?

  1. Machine Learning

循环神经网络概览

PreviousTensorflow TricksNextPix2Pix

Last updated 5 years ago

Was this helpful?

计算图展开

动态系统模型展开

动态系统的经典形式:

s(t)=f(s(t−1);θ)s^{(t)}=f(s^{(t-1)};\theta)s(t)=f(s(t−1);θ)

$s$ 代表了某一个时序下的状态变量, $\theta$ 代表函数的参数。

这一个函数表达的系统的状态变更不受外部输入影响。在这个基础上添加外部输入$x^{(t)}$,使每一次的状态变更受外部变量的影响:

s(t)=f(s(t−1),x(t);θ)s^{(t)}=f(s^{(t-1)},x^{(t)};\theta)s(t)=f(s(t−1),x(t);θ)

将其展开成计算图的形式后可以得到如下的表达(式中 $x^{(t)}$ 换做 $h^{(t)}$ 表示以代表隐藏层):

每一个循环都是根据上一个状态 $h^{(t)}$ 、输入 $x^{(t)}$ ,经过函数 $f$ 及其内部的参数 $\theta$ ,最终生成下一个状态 $h^{(t+1)}$ 。这个展开还没有包括输出,通常RNN还需要根据状态 $h^{(t)}$ 来生成一系列的输出。 这样展开之后,同时还有利于反向传播算法的应用,称为通过时间反向传播(back-propagation through time, BPTT)。

信息损失

通常来说这一个过程一定是有损的,因为我们将一个任意长度的序列 $(x^{(t)},x^{(t-1)}, x^{(t-2)},\dots,x^{(2)}, x^{(1)})$ 映射到了一个固定长度对的向量 $h^{(t)}$ 。 所以,我们希望状态中只记录下有利于我们最终产生输出的信息,而忽略掉一些没必要的部分。

展开上面的一个循环迭代的过程的意义在于: 1. 这样一个模型中,整一个输入序列的长度是可变的,而每一个时序的输入还是定长的,实现了对于不定长输入的处理。 2. 每一个时间步都使用相同的状态转移函数 $f$ ,即我们可以应用单一的深度学习模型去解决这个问题。

循环神经网络

在上面的铺垫之后,基于上面重要的参数共享思想,就更容易理解循环神经网络。参数共享和图展开使得模型能处理不定长输入,同时减少了参数量,训练难度更低。 一个典型的循环神经网络的结构如下:

$o^{(t)}$ 为模型产生的输出值, $L^{(t)}$ 代表了损失,根据输出结果和标签 $y^{(t)}$ 产生。 $U$ , $W$ , $V$ 均为转化计算时采用的权重参数。

参数更新公式

对于这样子的一个循环神经网络,一个可供参考的参数更新公式如下:

a(t)=b+Wh(t−1)+Ux(t)h(t)=tanh⁡(a(t))o(t)=c+h(t)y^(t)=softmax(o(t))\begin{aligned} & a^{(t)} = b + W h^{(t-1)} + U x^{(t)}\\ & h^{(t)} = \tanh(a^{(t)} )\\ & o^{(t)} = c + h^{(t)}\\ & \hat y^{(t)} = \text{softmax}(o^{(t)}) \end{aligned}​a(t)=b+Wh(t−1)+Ux(t)h(t)=tanh(a(t))o(t)=c+h(t)y^​(t)=softmax(o(t))​

时序模型结构

时序模型还有其他的一些结构,一般有下列几种:

  1. 每一步都有输出,连接建立在隐藏单元之间。(即上面图中的模型)

  2. 每一步都有输出,连接建立在上一步的结果和当前的隐藏单元之间,

  3. 只有在模型的最后有一个输出,连接建立在隐藏单元之间(也只能这样,因为中间没输出了)。

所有模型的结构如下:

模型1

模型2

模型3

上面给出的模型。

和之前的连接建立在上一次的输出值上,显然能够保留的信息会更少,没有上一个模型强大,但是训练更容易。

只在结束时产生一个输出。

导师驱动过程

对于模型2,我们可以应用一种名为导师驱动过程的训练方式:由于理想的输出结果 $y^{(t)}$ 是已知的,所以在时刻 $t+1$ 就可以接受 $y^{(t)}$ 作为输入。 这样的做法可以使得时间步之间解耦,BPTT由于每一步不再依赖于上一步的输出,所以被打断了。由于不再有前后计算的依赖,所以这样的训练可以并行。

导师驱动过程的示意图。它是一种训练技术,应用在输出和下一步的隐藏状态存在连接的RNN模型。

参考

《深度学习》(花书)
deeplearningbook-chinese (花书的开源GitHub库)
rnn-model-a
rnn-model-c
rnn-model-b