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

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

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

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

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

r t = σ ( W r ∗ [ h t − 1 , x t ] ) r_t = \sigma (W_r * [h_{t-1}, x_t]) rt=σ(Wr[ht1,xt])

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

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

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

z t = σ ( W z ∗ [ h t − 1 , x t ] ) z_t = \sigma (W_z * [h_{t-1}, x_t]) zt=σ(Wz[ht1,xt])

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

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

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

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

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

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

你可能感兴趣的:(元学习)