GRU是什么?RNN、LSTM分别是什么? | 您所在的位置:网站首页 › 海康威视全称是什么名字 › GRU是什么?RNN、LSTM分别是什么? |
前言
最近在学习图神经网络(GNN)的过程中,遇到很多不懂的地方,深度学习的基础没有掌握好。最早的GNN网络(详情见GNN)可以被用于处理有环图、有向图或无向图。然而,GNN网络本身必须使整个网络达到不动点之后才可以进行计算。针对这一问题,通过将GRU引入到网络结构中,进一步提出了GGNN网络(详情见GGNN)。那么,现在就介绍一下GRU是什么东西。 GRU中的G不是Graph,而是Gate,全称是Gate Recurrent Unit(门循环单元),它是循环神经网络(Recurrent Neural Network, RNN)的一种。和LSTM(Long-Short Term Memory)一样,也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。在R-NET: MACHINE READING COMPREHENSION WITH SELF-MATCHING NETWORKS(2017)文章中提出 译:我们在我们的实验中选择GRU是因为它的实验效果与LSTM相似,但是更易于计算。 相比LSTM,使用GRU能够达到相当的效果,并且相比之下更容易进行训练,能够很大程度上提高训练效率,因此很多时候会更倾向于使用GRU。在介绍GRU之前,先介绍一下RNN和LSTM。 RNN循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络。相比一般的神经网络来说,它能够处理序列变化的数据。比如某个单词的意思会受上文提到的内容的影响,RNN就能够很好地解决这类问题。 其主要形式如下图所示(台大李宏毅教授的PPT):
这里:
第一个激活函数通常用tanh,第二个激活函数用softmax。 前向传播时:记忆体内存储的状态信息 通过序列形式的输入,我们能够得到如下形式的RNN: 上图中一共有三个循环核(循环计算层) 在TensorFlow中,对于RNN输入必须是三个维度,分别是样本的总数,循环核时间展开步数(循环核个数),每个时间步输入的特征个数。如上图所示。 下面给出一个例子: input_word = "abcde" w_to_id = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4} # 单词映射到数值id的词典 id_to_onehot = {0: [1., 0., 0., 0., 0.], 1: [0., 1., 0., 0., 0.], 2: [0., 0., 1., 0., 0.], 3: [0., 0., 0., 1., 0.], 4: [0., 0., 0., 0., 1.]} # id编码为one-hot x_train = [id_to_onehot[w_to_id['a']], id_to_onehot[w_to_id['b']], id_to_onehot[w_to_id['c']], id_to_onehot[w_to_id['d']], id_to_onehot[w_to_id['e']]] y_train = [w_to_id['b'], w_to_id['c'], w_to_id['d'], w_to_id['e'], w_to_id['a']] # 使x_train符合SimpleRNN输入要求:[送入样本数, 循环核时间展开步数, 每个时间步输入特征个数]。 # 此处整个数据集送入,送入样本数为len(x_train);输入1个字母出结果,循环核时间展开步数为1; 表示为独热码有5个输入特征,每个时间步输入特征个数为5 x_train = np.reshape(x_train, (len(x_train), 1, 5)) y_train = np.array(y_train) # 模型 循环核时间展开步数为1 model = tf.keras.Sequential([ SimpleRNN(3), Dense(5, activation='softmax') ])LSTM 长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。 传统的循环神经网络RNN可以通过记忆体实现短期记忆进行连续数据的预测,但是当连续数据的序列变长时,会使展开时间步过长,在反向传播更新参数时,梯度要按照时间步连续相乘,很容易导致梯度消失,所以LSTM就出现了。 LSTM结构(图右)和普通RNN的主要输入输出区别如下所示: 相比RNN只有一个传递状态 下面具体对LSTM的内部结构来进行剖析: 首先使用LSTM的当前输入 其中,
而
LSTM内部主要有三个阶段: 1. 遗忘门。这个阶段主要是对上一个节点传进来的输入进行选择性遗忘。简单来说就是会 “忘记不重要的,记住重要的”。 具体来说是通过计算得到的 2. 输入门。这个阶段将这个阶段的输入有选择性地进行“记忆”。主要是会对输入 ![]() 3. 输出门。这个阶段将决定哪些将会被当成当前状态的输出。主要是通过 与普通RNN类似,输出 以上,就是LSTM的内部结构。通过门控状态来控制传输状态,记住需要长时间记忆的,忘记不重要的信息;而不像普通的RNN那样只能够“呆萌”地仅有一种记忆叠加方式。对很多需要“长期记忆”的任务来说,尤其好用。但也因为引入了很多内容,导致参数变多,也使得训练难度加大了很多。因此很多时候我们往往会使用效果和LSTM相当但参数更少的GRU来构建大训练量的模型。 思考:加入这么多门控信息,真的会起作用吗???这些门控机制都是通过反向传播学习的,真的会学到吗??? 例子: # 测试集变array并reshape为符合RNN输入要求:[送入样本数, 循环核时间展开步数, 每个时间步输入特征个数] x_test, y_test = np.array(x_test), np.array(y_test) x_test = np.reshape(x_test, (x_test.shape[0], 60, 1)) model = tf.keras.Sequential([ LSTM(80, return_sequences=True), # 每个时间步都输出h_t Dropout(0.2), LSTM(100), # 只在最后时间步输出h_t Dropout(0.2), Dense(1) ]) GRUGRU的输入输出结构与普通的RNN是一样的,它的提出是为了解决LSTM计算过于复杂的问题。有一个当前的输入 那么,GRU到底有什么特别之处呢?下面来对它的内部结构进行分析! 首先,我们先通过上一个传输下来的状态 Tips: 与LSTM分明的层次结构不同,得到门控信号之后,首先使用重置门控来得到“重置”之后的数据 再将 这里的
最后介绍GRU最关键的一个步骤,我们可以称之为”更新记忆“阶段。在这个阶段,我们同时进行了遗忘和记忆两个步骤。我们使用了先前得到的更新门控 更新表达式: 首先再次强调一下,门控信号(这里的 GRU很聪明的一点就在于,使用了同一个门控 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() GRU是在2014年提出来的,而LSTM是1997年。他们的提出都是为了解决相似的问题,那么GRU难免会参考LSTM的内部结构。那么他们之间的关系大概是怎么样的呢?这里简单介绍一下。大家看到 GRU输入输出的结构与普通的RNN相似,其中的内部思想与LSTM相似。与LSTM相比,GRU内部少了一个”门控“,参数比LSTM少,但是却也能够达到与LSTM相当的功能。考虑到硬件的计算能力和时间成本,因而很多时候我们也就会选择更加“实用”的GRU啦。 RNN 【翻译】理解 LSTM 网络 |
CopyRight 2018-2019 实验室设备网 版权所有 |