RNN计算过程

RNNcell的具体计算过程





任务:seq2seq(把hello单词转化成ohlol)

具体过程:

参数:
完整代码见链接:
RNN、RNNcell代码基础篇
注意想不通的一点是cross-entropy的两个输入(预测的向量,真实的y值)
二者的维度不同!
下图中的标注部分是一个token的one-hot预测向量、和其对应的真实y值,这样就直接cross-entropy了,有什么不明白的(笨!)

!!!!!注意RNN和RNNcell的cross-entropy的区别,在于

多了两个地方的修改

1、embedding的作用,就是把高维的、稀疏的one-hot的张量进行压缩处理,让其变成低纬的密集的矩阵(数据降维)(就是把input_size映射到embedding_size)
embedding层其实就是一个矩阵,它的两个输入为:
1. num_embeddings:就是input的size(矩阵的长)
2. embedding_dim:就是output的size(矩阵的宽)
2、线性层的作用
有时候hidden_size = output_size,但是有时候hidden_size不等于output_size,此时我们用线性层把RNN输出的hidden_size映射到output_size
具体代码链接:RNN、RNNcell代码基础篇
注意点:
idx2char = ['e','l','h','o']
x_data = [[2,0,1,1,3]] #(batch, seq_len) list
y_data = [3,2,1,3,1] # #(batch * seq_len)
方法1:手动敲一份LSTM的模型出来
具体原理也可以看这里的链接
手写LSTM模型的实践代码
方法2:直接用LSTM的接口,LSTM的参数说明
LSTM使用的官方文档
parameter参数部分和RNN几乎一模一样
不同的是input和output
LSTM的输入有3个(input,(h0,c0))
输出也有3个(output,(hn,cn))
修改的过程就是在原有的RNN+embedding基础上修改两个地方:

修改完成的代码链接:
具体代码链接:LSTM训练链接
原理+参数说明见官方文档:
GRU说明
具体到使用上来,只要把RNN+embedding那个版本的代码的RNN模型改成GRU即可
(GRU的原理很像LSTM,但是调用方式很像RNN。没有像LSTM一样的c0向量,输出也没有c0)
具体代码链接:GRU训练链接