参数和神经元个数的计算
A代表LSTM cell,同一个LSTM但是timestep不同,由左图可知一个timestep中有四个前馈神经元(黄色的,3个sigmoid和一个tanh),图中还有一个红色的tanh,这只是对Ct做了一个tanh的转换然后和经过最后的sigmoid的结果做点乘作为输出;
图中长方形的代表神经元,一个lstm中有四个神经元,一共是timestep * 4个神经元(但这里是同一个lstm不同的timestamp,参数共享,那是否应该就只有4个神经元呢?)
参数计算通用公式:((num_units(也可叫hidden_size) + emb_dim)* emb_dim + num_units) * 4
输入x:[words_len, emb_dim],words_len:词数量,emb_dim:词向量维度或one-hot维度
梯度消失与梯度爆炸
对sigmoid和tanh函数:导数分别在(0, 0.25] 和 (0, 1],都是不大于1 的值,连乘时梯度不断变小
tanh函数相对于sigmoid函数梯度较大,收敛速度更快,引起梯度消失更慢。
Sigmoid函数输出不是零中心对称,sigmoid的输出均大于0,使得输出不是 0 均值,称为偏移现象,这将导致后一层的神经元将上一层输出的非0均值的信号作为输入。关于原点对称的输入和中心对称的输出,网络会收敛地更好。
对于Relu激活函数:左侧导数为0,右侧导数恒为1,避免了“梯度消失“,但容易导致“梯度爆炸“。
timestep 的理解
keras或tensorflow中的LSTM参数一般是(samples, timestep, input_dim),
samples是batch_size,timestep代表一句话中的单词数量,input_dim是一个词的维度。
time_step是神经网络参数,网络建好后不会改变;samples是训练参数,可根据效果调整。
tensorflow 的 RNN 单元中有三个可训练的参数W , U , B 及两个输入变量input 和 h0。
每个样本含 timestep个时刻输入shape [batchsize,timestep,n]或
[timestep,batchsize,n]
基本的LSTM单元中有4个可训练的参数
每个样本timestep
个时刻输入shape为[batch_size,timestep,n] 或
[timestep,batch_size,n]
以mnist数据为例,每个样本的shape为28 * 28,使用LSTM处理,样本展开后必须有前后序列关系。 可直接展开成784个LSTM单元;也可按行或者按列来分割成28行(列),将这28个部分看成是序列。
如果batch_size 设为 4表示一次输入网络4张图片;
timestep为28指将每一张图片都分割成28个时刻,分别输入每一个LSTM单元 。
Pytorch中的LSTM
torch.nn.LSTM(*args, **kwargs):
input_size:x 的特征维度,数据立方体中的F,NLP中为一个词的向量长度;
hidden_size:隐藏层的特征维度,非双向LSTM的输出维度等于隐藏层的特征维度。num_layers:lstm隐层的层数,默认为1。
bias:False时bias=0,default=True
batch_first:True则输入输出的数据格式为 (batch, seq, feature)
dropout:除最后一层,每一层的输出都进行dropout,默认为: 0
bidirectional:True则为双向lstm,默认为False,双向LSTM的输出维度是隐含层特征数*2,H,C的维度是时间轴长度*2。
参考:
(1条消息) 【NLP实践-Task8 循环神经网络】LSTM详解 & Text-RNN文本分类 & RCNN原理_lstm text_y430的博客-CSDN博客
(1条消息) lstm 的timestep_如何理解lstm的输入输出_网易玩家工作室的博客-CSDN博客(timestep)
lstm原理+timesteps理解+实操+时间序列多变量_jiekclek的博客-CSDN博客(timestep)
RNN和LSTM中batchsize和timestep的区别是什么?_lstm的batch_size_空字符(公众号:月来客栈)的博客-CSDN博客(LSTM 输入输出维度,timestep)
对LSTM中间变量形状shape的理解, 附keras中LSTM的各个变量的shape理解_五四三两幺-发射!的博客-CSDN博客(LSTM 输入输出维度,timestep)