深度学习之循环神经网络(2)循环神经网络原理

深度学习之循环神经网络(2)循环神经网络原理


 现在我们来考虑如何吃力序列信号,以文本序列为例,考虑一个句子:

“I dislike this boring movie”


通过Embedding层,可以将它转换为shape为 [ b , s , n ] [b,s,n] [b,s,n]的张量, b b b为句子数量, s s s为句子长度,n为向量长度。上述句子可以表示为shape为 [ 1 , 5 , 10 ] [1,5,10] [1,5,10]的张量,其中5代表句子单词长度,10表示词向量长度。

 接下来逐步探索能够处理序列信号的网络模型,为了便于表达,我们以情感分类任务为例,如下图所示。情感分类任务通过分析给出的文本序列,提炼出文本数据表达的整体语义特征,从而预测输入文本的感情类型: 正面评价或者负面评价。从分类角度来看,情感分类问题就是一个简单的二分类问题,与图片分类不一样的是,由于输入是文本序列,传统的卷积神经网络并不能取得很好的效果。那么什么类型的网络擅长处理序列数据呢?

在这里插入图片描述

情感分类任务

1. 全连接层

 首先我们想到的是,对于每个词向量,分别使用一个全连接层网络
o = σ ( W t x t + b t ) \boldsymbol o=σ(\boldsymbol W_t \boldsymbol x_t+\boldsymbol b_t) o=σ(Wtxt+bt)
提取语义特征,如下图所示,各个单词的词向量通过 s s s个全连接层分类网络1提取每个单词的特征,所有单词的特征合并,并通过分类网络2输出序列的类别概率分布,对于长度为 s s s的句子来说,至少需要 s s s个全网络层。

在这里插入图片描述

全连接神经网络方案


这种方案的缺点有:

  • 网络参数量是相当可观的,内存占用和计算代价较高,同时由于每个序列的长度 s s s并不相同,网络结构是动态变化的;
  • 每个全连接层子网络 W i \boldsymbol W_i Wi b i \boldsymbol b_i bi只能感受当前词向量的输入,并不能感知之前和之后的语境信息,导致句子整体语义的缺失,每个子网络只能根据自己的输入来提取高层特征,有如管中窥豹。

2. 共享权值

 在介绍卷积神经网络时,我们就比较过,卷积神经网络之所以在处理局部相关数据时优于全连接网络,是因为它充分利用了权值共享的思想,大大减少了网络的参数量,使得网络训练起来更加高效。那么,我们在处理序列信号的问题上,能否借鉴权值共享的思想呢?

 如下图方案所示, s s s个全连接层的网络并没有实现权值共享。我们尝试将这s个网络层参数共享,这样其实相当于使用一个全连接网络来提取所有单词的特征信息,如下图所示:

在这里插入图片描述

共享权值神经网络方案


 通过权值共享后,参数量大大减少,网络训练变得更加稳定高效。但是。这种网络结构并没有考虑序列之间的先后顺序,将词向量打乱次序仍然能获得相同的输出,无法获取有效的全局语义信息。

3. 全局语义

 如何赋予网络提取整体语义特征的能力呢?或者说,如何能够让网络能够按序提取词向量的语义信息,并积累成整个句子的全局语义信息呢?我们想到了内存(Memory)机制。如果网络能够提供一个单独的内存变量,每次提取词向量的特征并刷新内存变量,直至最后一个输入完成,此时的内存变量即存储了所有序列的语义特征,并且由于输入序列之间的先后顺序,使得内存变量内容与序列顺序紧密关联。

在这里插入图片描述

循环神经网络(未添加偏置)


 我们将上述Memory机制实现为一个状态张量 h \boldsymbol h h,如上图所示,除了原来的 W x h \boldsymbol W_{xh} Wxh参数共享外,这里额外增加了一个 W h h \boldsymbol W_{hh} Whh参数,每个时间戳t上状态张量 h \boldsymbol h h刷新机制为:
h t = σ ( W x h x t + W h h h t − 1 + b ) \boldsymbol h_t=σ(\boldsymbol W_{xh} \boldsymbol x_t+\boldsymbol W_{hh} \boldsymbol h_{t-1}+\boldsymbol b) ht=σ(Wxhxt+Whhht1+b)
其中状态张量 h 0 \boldsymbol h_0 h0为初始的内存状态,可以初始化为全0,经过 s s s个词向量的输入后得到网络最终的状态张量 h s \boldsymbol h_s hs h s \boldsymbol h_s hs较好地代表了句子的全局语义信息,基于 h s \boldsymbol h_s hs通过某个全连接层分类器即可完成情感分类任务。


4. 循环神经网络

 通过一步步地探索,我们最终提出了一种“新型”的网络结构,如下图所示,在每个时间戳 t t t,网络层接受当前时间戳的输入 x t \boldsymbol x_t xt和上一个时间戳的网络状态向量 h t − 1 \boldsymbol h_{t-1} ht1,经过
h t = f θ ( h t − 1 , x t ) \boldsymbol h_t=f_θ (\boldsymbol h_{t-1},\boldsymbol x_t) ht=fθ(ht1,xt)
变换后得到当前时间戳的新状态向量 h t \boldsymbol h_t ht,并写入内存状态中,其中 f θ f_θ fθ代表了网络的运算逻辑, θ θ θ为网络参数集。在每个时间戳上,网络层均有输出产生 o t \boldsymbol o_t ot o t = g ø ( h t ) \boldsymbol o_t=g_\text{\o} (\boldsymbol h_t) ot=gø(ht),即将网络的状态向量变换后输出。

在这里插入图片描述

展开的RNN模型


 上述网络结构在时间戳上折叠,如下图所示,网络循环接受序列的每个特征向量 x t \boldsymbol x_t xt,并刷新内部状态向量 h t \boldsymbol h_t ht,同时形成输出 o t \boldsymbol o_t ot。对于这种网络结构,我们把它叫做循环神经网络(Recurrent Neural Network,简称RNN)

在这里插入图片描述

折叠的RNN模型


 更特别地,如果使用张量 W x h \boldsymbol W_{xh} Wxh W h h \boldsymbol W_{hh} Whh和偏置 b \boldsymbol b b来参数化 f θ f_θ fθ网络,并按照
h t = σ ( W x h x t + W h h h t − 1 + b ) \boldsymbol h_t=σ(\boldsymbol W_{xh} \boldsymbol x_t+\boldsymbol W_{hh} \boldsymbol h_{t-1}+\boldsymbol b) ht=σ(Wxhxt+Whhht1+b)
方式更新内存状态,我们把这种网络叫做基本的循环神经网络,如无特殊说明,一般说的循环神经网络即指这种实现。在循环神经网络中,激活函数更多地采用 tanh \text{tanh} tanh函数,并且可以选择不使用偏置b来进一步减少参数量。状态向量 h t \boldsymbol h_t ht可以直接用作输出,即 o t = h t \boldsymbol o_t=\boldsymbol h_t ot=ht,也可以对 h t \boldsymbol h_t ht做一个简单的线性变换 o t = W h o h t \boldsymbol o_t=\boldsymbol W_{ho} \boldsymbol h_t ot=Whoht后得到每个时间戳上的网络输出 o t \boldsymbol o_t ot

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RNN是一种循环神经网络,它在自然语言处理和序列数据处理中非常常见。虽然我们可以从头开始实现RNN,但建议使用现有的库和包来简化代码,并且提高效率。以下是一种使用Python中的tensorflow库实现RNN的示例: 首先,我们需要导入所需的库和模块: import tensorflow as tf 然后,定义RNN的参数: num_units = 128 input_size = 10 batch_size = 32 time_steps = 20 num_classes = 2 接下来,我们创建输入和输出的占位符: inputs = tf.placeholder(tf.float32, [None, time_steps, input_size]) outputs = tf.placeholder(tf.float32, [None, num_classes]) 然后,我们使用tf.keras.layers中的SimpleRNN层来创建RNNrnn_layer = tf.keras.layers.SimpleRNN(units=num_units) rnn_output = rnn_layer(inputs) 接下来,我们使用全连接层,并应用softmax激活函数来得到最终的输出: fc_layer = tf.keras.layers.Dense(num_classes, activation='softmax') outputs_pred = fc_layer(rnn_output) 接下来,我们定义损失函数和优化器: loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=outputs_pred, labels=outputs)) optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss) 然后,我们可以设置会话,并进行训练: sess = tf.Session() sess.run(tf.global_variables_initializer()) for epoch in range(100): batch_inputs, batch_outputs = get_batch_data() feed_dict = {inputs: batch_inputs, outputs: batch_outputs} sess.run(optimizer, feed_dict=feed_dict) 最后,我们可以使用训练好的模型来进行预测: test_inputs, _ = get_batch_data() feed_dict = {inputs: test_inputs} predictions = sess.run(outputs_pred, feed_dict=feed_dict) 这是一个简单的RNN实现的例子。使用现有的库和包可以帮助我们快速地构建和训练RNN模型,并简化了我们的代码。当然,我们可以根据具体需要调整参数和网络结构来优化模型。 ### 回答2: RNN循环神经网络)是一种能够处理序列数据的神经网络模型。在实际应用中,我们可以使用现有的深度学习库中提供的循环神经网络调包来实现RNN模型。 首先,我们需要选择一个适用的深度学习框架,如TensorFlow、PyTorch或Keras。这些框架都提供了对RNN模型的支持,并且具有相应的调包可以导入和使用。 接下来,我们需要导入所选框架中的RNN模型相关的调包。通常,这些调包包含了模型结构定义、数据预处理和模型训练的功能。 在导入调包之后,我们需要定义RNN模型的结构。这一步通常涉及选择RNN层的类型(如SimpleRNN、LSTM或GRU)、隐藏层的大小、输入序列的长度等。根据框架的不同,具体的代码实现方式会有所差异。 接下来,我们可以使用导入的调包进行数据预处理。这可能包括文本向量化、标签编码或者对序列数据进行填充等操作。循环神经网络的输入通常是一个序列,我们需要确保输入的形状与模型的要求相匹配。 最后,我们可以使用导入的调包训练RNN模型。这一步包括设置模型的优化器、损失函数和评估指标,然后使用训练数据进行模型训练。具体的训练过程可以通过调用框架提供的训练函数来完成。 总之,通过调用现有深度学习框架中提供的RNN调包,我们可以方便地实现循环神经网络模型。这些调包提供了RNN模型的结构定义、数据预处理和模型训练等功能,使得我们可以更加专注于模型的应用和优化。 ### 回答3: RNN(Recurrent Neural Network,循环神经网络)是一种常用于处理序列数据的深度学习模型。为了简化RNN的实现过程,我们可以使用一些流行的深度学习库中提供的RNN调包,例如TensorFlow或PyTorch。 以TensorFlow为例,实现一个基本的RNN模型可以分为以下几个步骤: 1.导入必要的库以及数据集。首先,需要导入TensorFlow库,然后准备好要训练和测试的数据集。 2.数据预处理。在输入数据进入RNN之前,通常需要进行一些预处理操作,例如标准化、序列填充等。 3.定义RNN模型。使用TensorFlow提供的调包,我们可以很方便地定义一个RNN模型。可以选择不同类型的循环神经网络单元(例如LSTM或GRU),定义隐藏层的大小以及输入输出的维度等。 4.设置优化器和损失函数。选择合适的优化器(如Adam或SGD)和适当的损失函数(如交叉熵)来最小化模型的误差。 5.训练模型。使用数据集进行模型训练,通过反向传播和优化器来更新模型的权重和偏差。 6.模型评估。使用测试集来评估模型的性能,比如计算准确率、损失值等。 7.模型应用。训练好的RNN模型可以用于实际应用中,如生成文本、机器翻译、语音识别等。 总结来说,调包可以极大地简化RNN模型的实现过程。我们只需要了解RNN原理和基本步骤,然后使用调包提供的API进行模型的搭建、训练和评估等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值