RNN
文章目录
sequence representation
出现原因
他们都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列;当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。
文本信息的表达方式
【文字或者是单词的数量,数据编码的方式】
编码方式
one-hot编码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DpADTVWp-1599999032853)(C:%5CUsers%5CJason%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200911105656472.png)]
但是当文字或者是单词数量变多的时候,该编码方式比较稀疏,维度较高
,成本较大
semantic similarity语义相关性
根据一些单词语义的相关性以及相反性来进行连接
添加了batch的表达方式:
【word_num, b , word_vec】
【b , word_num, word_vec】
例子
表达 i hate this boring movie
每个单词的表示方法:【100】(假设一共有100个单词)
然后这个句子的表示方法:【5,100】
通过提取每个单词的语义特【2】之后汇总【5,2】来表示这个语义。
缺点:
-
在生活中的小说、一段文字中单词较多,w、b的参数较多
-
没有上下文的语义联系,通过一个单词一个单词进行分析是不高效、不智能的,所以需要存储一个
语境信息
weight sharing
将w、b参数不分为若干个,而是使用一个统一的参数来对整个句子进行分析提取语义特征——weight sharing
来解决过多的参数问题
consistent memory
在进行下一个单元的提取的时候,不但要输入这个单元的数据,还要输入上一个单元的语义信息
,这样的话就相当于有一个单元一直提供之前的语义信息(在这样的传递下前面的语义信息是在积累的),通过这一次的输入以及上一次的语义信息来进行网络的更新。
folded model
(其中的 X t X_t Xt表示本次的数据特征, h 0 h_0 h0表示最开始的初始化特征,而 h t h_t ht表示前一次的语义信息)
unfolded model
其中的 h t h_t ht可以只是上一次的语义信息,也可以是全部的语义信息的汇总,也可以是中间的语义信息,比较灵活。
nn.RNN
input_size:是word embedding的维度
hidden_size:是memory的size
forward函数:是一步到位的,例如【5,3,100】5个单词不是将数据喂5次,而是一次到位
out,ht = forward(x,h0)
其中h0表示【layer层数,batch,feature数(hidden_size)】
ht表示最后的一个时间语义输出【layer层数,batch数,feature数】
out表示所有的语义输出
【单词数,batch数,feature数】
例子:
import torch
rnn = torch.nn.RNN(input_size=100,hidden_size=20,num_layers=1)
print(rnn)
x = torch.randn(10,3,100)#可以理解为一句话10个单词,一共3句话
out,h = rnn(x,torch.zeros(1,3,20))
print(out.shape,h.shape)
RNN(100, 20)
torch.Size([10, 3, 20]) torch.Size(