循环神经网络在文本分类中的应用:以I hate this boring movie为例
相关列(这里已添加圆圈卡,请至今日头条客户端查看)。
为什么需要身体的递归神经网络
?
现在有这样一句话:我讨厌这部电影,我们想确定它是一个正面还是负面的例子,因此我们可以通过对每个单词进行矢量化并将其馈送到一个完全连接的神经网络来做到这一点
也就是说,我们用全连接神经网络来提取每个词的特征向量(如果特征向量的维度是 10),然后把这些词的特征向量组合起来,形成这个句子的特征向量(本例中的维度是 (5, 10)),然后对运算进行分类,得到这个句子是正例还是反例。
这样就完成了我讨厌这部电影的分类任务,但是这种方法会有一些问题,比如参数太多,每个单词都需要一个参数 w 和 b,第二个问题是无法考虑单词之间的联系,缺少它们之间联系的上下文信息。
指标共享
为了解决第一个问题,我们可以以以下方式共享权重:
全部具有相同的参数 w 和 b
时序模型
为了解决第二个问题,我们需要一起计算前一刻的信息状态 h 和下一刻的输入,以便当前的计算包含单词之间的关系
如图所示,不仅输入 x 而且前一刻的内存 h 都输入到 RNN 模块中,两者结合完成 RNN 的计算
集成
现在我们集成这个模型,它就变成了当前的模型效果:
这是 RNN、t-1 的输出 ht-1 和 t 时间的输入,以完成计算操作
尺寸信息:
如果有 5 个样本,每个样本有 3 个字,现在向量化,每个字的维度为 100,那么这 5 个样本的维度为 (3,5,100),这意味着 RNN 需要 3 个时间步,那么每个时间步输入的维度为 (5,100),即每个时间步需要同时处理 5 个样本中的一个 word
扩大
RNN 在中文中被称为循环神经网络,如果我们扩展 RNN,它的效果是这样的:
根据问题的不同,我们将应用不同的输出 y,有时我们会应用所有时间步长的输出 y,有时我们会使用最后一刻的输出 y
以这种方式看待它会很清楚,然后我们就可以看看每个时刻计算的时间步长到底是什么?
某个时间点 RNN 的维度信息:
假设有 3 个句子,每个句子 10 个单词,每个单词的维度是 100,那么这个单词的维度是 (10,3,100),这个输入到 RNN 中,每个时间步的 Xt 的维度信息都是 (3,100)
如果隐藏层数为 30,则 Wxh 的尺寸信息为 (30,100)。
那么 ht 的维度信息为 (batch, 隐藏层数),所以在这个例子中,ht 的维度信息为 (5,20),Wh 的维度信息为 (隐藏层,隐藏层),其维度为 (20,20),计算图如下:
例:
当我们创建 RNN 时,我们需要指定三个参数,一个是 len,一个是 len,最后一个是 num
WXH 的维度信息为 (,),而 WHH 的维度信息为 (,)。
net=RNN(100,30,2) 表示 len=100,然后 len=30,层数为 2
其中 值中的 ht 表示最后一刻的输出,如果有多个层,则每一层都会有最后一刻的输出
out 表示所有的输出,如果有多个层,则表示顶层所有的输出
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>import torch
from torch import nn
rnn=nn.RNN(100,20,1)
x=torch.randn(10,3,100)
out,h=rnn(x,torch.zeros(1,3,20))
print(out.shape)
print(h.shape)</code></pre></p>
这是一个单层 RNN 结构,如果它是一个多层 RNN 结构,那么计算是这样的
炬
来自火炬 nn
rnn=nn. rnn(100,20,=4)
x=torch.randn(10,3,100)
out,h=rnn(x,torch.zeros(4,3,20))
打印(out.shape)
打印(H.Shape)
页:
[1]