透过cs224n课程提供的课件:A Primer on Neural Network Models for Natural Language Processinghttp://u.cs.biu.ac.il/~yogo/nnlp.pdf
成都创新互联公司是由多位在大型网络公司、广告设计公司的优秀设计人员和策划人员组成的一个具有丰富经验的团队,其中包括网站策划、网页美工、网站程序员、网页设计师、平面广告设计师、网络营销人员及形象策划。承接:成都网站制作、做网站、网站改版、网页设计制作、网站建设与维护、网络推广、数据库开发,以高性价比制作企业网站、行业门户平台等全方位的服务。中的RNN部分的Page52-Figure10:
可以对RNN结构得到一个比较清晰的认识。
RNN公式一般定义为:
在Pytorch中,公式存在两组bias:
该公式来源于Pytorch截图,
其相关设置如下https://pytorch.org/docs/stable/generated/torch.nn.RNN.html#rnn
Tensorflow2-Docs中未明确公式,使用的是RNN公式的计算方式
其相关设置如下https://pytorch.org/docs/stable/generated/torch.nn.RNN.html#rnn
对Pytorch而言,根据公式和后续代码,基本可知:
(1)假设此时刻是中间某个时刻t,正在计算h_t,计算时接收两个输入,分别是当前时刻对应的输入x_t,上一时刻计算得到的隐藏状态h_t-1。
(2)假设此时刻是初始时刻,正在计算h_1,计算时同样接收两个输入,分别是当前时刻对应的网络输入x_0,初始时刻的隐藏状态,需要注意的是按照torch.nn.RNN源码中的计算方式,如果初始h0不存在也即为None,则网络将自动生成一个尺度为(n_layers * n_directions,max_batch_size, hidden_size)的3维零矩阵初始隐藏状态。其源码如下:
(3)假如此时刻是中间某个时刻,并且此RNN是多层RNN,计算过程将是层层递进的,计算中间层时,也需要输入一个x_hat,只是这时候的x_hat是上层计算的output,因此每一层都会出现一个h_hat_i,直到最后一层产生一个y_t的时候,暂且算作同时计算得到了一个h_t。
(4)无论是中间层计算还是时刻t计算他们在pytorch中都遵循上面的公式
(5)pytorch计算的具体实现通过Github项目aTen作为底层实现的
PyTorch公式中只包含了4组参数,分别是W_ih、b_ih、W_hh、b_hh,有时人们总会赋予字母以不同的寓意,这里的i并非序列号“第i个”或“第i层”的意思,而是“input”的意思,表示这里的i是对当前层的输入做的矩阵运算,也即x_t,h则表示“hidden”的意思。因此该4组分别对应于:计算当前RNN部分输入门“结果”的W_ih、b_ih以及计算隐藏层状态的W_hh、b_hh。这里的计算注意表述的是一组完整的RNN模块按时间步的计算,而不是多层RNN中某时间步内层与层之间的计算。
然后在pytorch有关RNNbase的module部分包含对上面4组参数的定义:
w_ih = Parameter(torch.empty((gate_size, layer_input_size), **factory_kwargs))
w_hh = Parameter(torch.empty((gate_size, real_hidden_size), **factory_kwargs))
b_ih = Parameter(torch.empty(gate_size, **factory_kwargs))
b_hh = Parameter(torch.empty(gate_size, **factory_kwargs))
实际查看时可按图索骥找到gate_size的选择由当前“mode”类型和“hidden_size”参数决定。至此可得:Pytorch中,一层RNN有4组参数变量矩阵,两层RNN有2*4=8组参数变量矩阵,N层的RNN有N*4=4N组参数变量矩阵。
从Tensroflow2的角度来看,参数方面主要区别在于tf2的bias参数只有一个,其他基本相同。另外,Tensorflow2中由于完全支持了keras,因此这里按照tf.keras.layers.RNN(...)https://www.tensorflow.org/api_docs/python/tf/keras/layers/RNN和keras中的循环神经网络(RNN)https://www.tensorflow.org/guide/keras/rnn来叙述:
Tensorflow2的Keras包含两种建模方式:Sequential()、Model(),Sequential即搭建一个容器,容器中只包含一列格子,每个格子存放一层计算结构,建模后训练时串行计算每个格子的结果。Model()则是不创建容器,一层一层声明计算方式,结构可以存在分支结构。从任务实现上来说Model()的存在是必要的,这方便网络拓宽,网络存在多输入、多输出结构等情况下任务的实现。
无论是PyTorch还是Tensorflow,RNN的作用是相同的,不同的是两个框架的细节实现和计算方式。
RNN计算过程推导
基于Pytorch搭建RNN网络并实现任务
# 基于Pytorch1搭建的单向单层RNN(SimpleRNN)、双向单层RNN(BiRNN)、单向多层RNN(StackedRNN)、双向多层RNN(StackedBiRNN)
# building
基于Tensorflow2搭建RNN网络并实现任务
# 基于Tensorflow2搭建的单向单层RNN(SimpleRNN)、双向单层RNN(BiRNN)、单向多层RNN(StackedRNN)、双向多层RNN(StackedBiRNN)
# building
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧