元学习系列(五):GRU模型

时间:2024-03-15 07:47:36

之前提到的孪生网络那类模型,简单来说他们都是把训练集作为先验知识进行建模,而像LSTM、GRU、神经图灵机这一类模型则提供了另一个新思路,那就是引入外部记忆,在训练过程中通过训练集对外部记忆进行修改,从而在测试的时候利用外部记忆作为先验知识。

LSTM和RNN相比,引入了长期记忆和门结构,缓解了长期依赖问题。所谓的门结构,就是sigmoid函数,通过sigmoid函数分析应该遗忘什么、记忆什么和输入什么。在GRU中,则进一步简化了LSTM,只保留了更新门和重置门两种门操作:

元学习系列(五):GRU模型
其实说到底,不论是LSTM还是GRU,重点都在于我们应该如何利用长期记忆这一点,在LSTM中长期记忆会影响到某一时刻的模型输出,而GRU则直接把某一时刻的长期记忆作为输出,一边修改长期记忆一边进行输出,所以这使得GRU比LSTM具有更少的输入(LSTM有三个输入,GRU只有两个)和更简单的结构,运算量也相对减少。

接下来看看GRU是如何利用和修改记忆的,首先模型会分析在当前时刻,根据当前的输入我们需要用到记忆中的哪些部分:

rt=σ(Wr[ht1,xt])r_t = \sigma (W_r * [h_{t-1}, x_t])

用这个rt乘以上一时刻的记忆就得到这一时刻可以利用的记忆,然后和当前时刻拼接在一起输入到神经网络:

h~t=tanh(W[rtht1,xt])\widetilde h_t = tanh(W * [r_t * h_{t-1}, x_t])

其实我觉得这个输出完全可以作为模型在当前时刻的输出,只是因为模型目前想要利用更新了的记忆作为最终输出,所以个人觉得,接下来的步骤可以理解成,如何通过当前时刻的输出去更新记忆。首先依然是先确定权重:

zt=σ(Wz[ht1,xt])z_t = \sigma (W_z * [h_{t-1}, x_t])

然后再利用这个权重,对上一时刻的记忆和当前的输出进行加权结合得到当前时刻的记忆:

ht=(1zt)ht1+zth~th_t = (1-z_t)*h_{t-1} + z_t * \widetilde h_t

从GRU经过简化也能得到较好的效果可以看出,或许对这类模型而言,选择什么作为输出、具体的遗忘记忆机制是什么或许并不重要,真正重要的是这类模型中具有记忆这个结构,同时模型能够根据当前输入对记忆进行修改,并最终结合记忆和当前输入进行输出,这些才是LSTM和GRU能够取得成功的根本所在。

在github写的自然语言处理入门教程,持续更新:NLPBeginner

在github写的机器学习入门教程,持续更新:MachineLearningModels

想浏览更多关于数学、机器学习、深度学习的内容,可浏览本人博客