LSTM(Long Short-TermMemory)是一个RNN(循环神经网络)架构,被设计用来解决卷积RNN的梯度消失和爆炸问题。
传统的LSTM在循环隐藏层包含名叫memory blocks的特殊单元。
memory blocks包含具有self-connections的memory cell,self-connections用来存储记忆网络的时间状态,以及名叫gates的特殊乘法单元以控制信息流。
每个memory block都包含一个input gate,控制进入memorycell的输入激活流,和一个output gate,控制进入到网络其余部分的单元激活流。
forget gate在输入之前,衡量单元的内部状态,然后适应性地忘记或者重置单元的记忆。用f表示。
另外,还有一个peepholeconnections连接内部单元到gate以学习输出。
标准的LSTM网络包括输入层,循环LSTM层和输出层。另外,我们还加了projection和recurrent以解决计算太复杂的问题。
一个LSTM网络通过下列公式来计算从输入序列到输出序列的映射,t=1~T。
其中W表示权重矩阵(比如wix是input gate到输入的权重矩阵),b表示误差向量,σ表示logistic函数,这些都和输出层的激活向量m大小相同。⊙是向量的逐元素乘积,g和h都是激活函数,通常选择tanh。i表示input gate,f表示forget gate,o表示output gate,c表示cell激活向量。
任务 6: LSTMs
训练一个一个长短期记忆网络预测字符串
问题1
LSTM的cell包括4个矩阵乘积,使用单个矩阵乘法简化该表达。
源代码忽略了w*c这一项。看到LSTM的Input gate、Forget gate、Memory cell和Output gate的计算方法一样,因此设置一个gate_count,把四组参数分别合并,一次计算,再分别取出。
问题2
我们想要让LSTM学习二元词,而可能的二元词“ab”等的数量很大,直接使用1-hot向量表示他们并把他们输入LSTM可能会导致非常大的稀疏度,浪费计算量。
a) 使用词向量表示输入,把词向量输入LSTM单元。
b) 基于上述的LSTM,写一个二元词的LSTM。
c) 使用dropout,具体详见。
a,b 用词向量表示输入,写一个二元词的LSTM
对于单个单词,单词量是27(包括空格),二元词的单词量设为bi_voc: 27*27=729,设单个词向量大小为embeddings_size,则需要729个这样的词向量。
获取数据:BatchGenerator不再生成one-hot-encoding的向量作为输入,而是直接生成二元词对应的index列表,index列表的取值范围为[0,729)。获取的数据形状为(num_rollings+1, batch_size),int型,其中前num_unrollings个输入数据,后num_unrollings个是输出数据。
输入数据input:转化大小为(num_unrollings,batch_size, embedding_size)的矩阵,通过lstm_cell,输出一个矩阵outputs,大小为(batch_size, num_nodes),其中num_nodes是节点数。通过tf.nn.xw_plus_b(tf.concat(0,outputs),w, b)得到logits,大小为(batch_size*num_unrollings, bi_voc)。
已知的输出数据label:因为要将logits和输出数据进行交叉熵和softmax计算损失的运算,因此要将label转化为和logits大小一致的矩阵。不需要将label转化为词向量。bigramonehot是一个bi_voc*bi_voc的单位矩阵。通过tf.gather函数,将label转化为one-hot编码。
取样验证:只有一个batch,不需要unrolling。在对验证数据做转换时,主要依赖one_hot_voc函数
另外:
1. tf.concat(concat_dim,values,name='concat')
concat_dim:值范围是[0,rank(values)-1]。等于0,表示沿着第一维连接tensor;等于1,表示沿着第二维度连接tensor,……。
values:tensor值列表
文档中写错了。
2. tf.reduce_mean中出现loss为0的现象???????????
3. dropout略吧
参考资料:
1. LONG SHORT-TERM MEMORY BASEDRECURRENT NEURAL NETWORK
ARCHITECTURES FOR LARGE VOCABULARY SPEECHRECOGNITION
2.
3.