您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > theano-lstm源码算法分析v1.0
theano_LSTM源码算法分析一、网络参数本文档分析的源码来自于theano官网的一份LSTM源码(),用LSTM网络分析一条电影影评是赞赏还是批判。dim_proj128词向量维度lrate0.0001学习率n_Words10000词库单词数maxlen100最大句子长度batch_size16SGD的batch大小node128LSTM节点数二、网络结构一个LSTM网络(dim_proj=128个LSTM节点)的结构如上图,计算公式和参数如下:xdim_proj=128维向量输入Wdim_proj=128维向量,4组权重o数值输出门Udim_proj=128维向量,4组权重c数值细胞状态b数值,4组偏置f数值遗忘门h数值隐藏层输出i数值输入门it=𝑠𝑖𝑖𝑔𝑚𝑜𝑖𝑑(𝑊𝑖𝑥𝑡+𝑈𝑖ℎ𝑡−1⃗⃗⃗⃗⃗⃗⃗⃗+𝑏𝑖)𝐶𝑡̃=tanh(Wc𝑥𝑡+𝑈𝑐ℎ𝑡−1⃗⃗⃗⃗⃗⃗⃗⃗+𝑏𝑐)ft=𝑠𝑖𝑔𝑚𝑜𝑑(𝑊𝑓𝑥𝑡+𝑈𝑓ℎ𝑡−1⃗⃗⃗⃗⃗⃗⃗⃗+𝑏𝑓)Ct=𝑖𝑡∗𝐶𝑡̃+𝑓𝑡∗𝐶𝑡−1ot=𝑠𝑖𝑔𝑜𝑚𝑜𝑖𝑑(𝑊𝑜𝑥𝑡+𝑈𝑜ℎ𝑡−1⃗⃗⃗⃗⃗⃗⃗⃗+𝑏0)ht=𝑜𝑡∗tanh(𝐶𝑡)该结构图是时间轴上的展开图,图中的所有LSTM网络其实是一个,输入xt为词向量,dim_proj=128维,n为句子的长度(即多少个单词),LSTM内部共有node=128个LSTM节点(节点数量必须与词向量维度相同,因为每个节点输出一个ht数值,所有节点组成的ht⃗⃗⃗的维度要与xt保持一致),当一个句子计算完成后将每一step的ht⃗⃗⃗取平均值,再经过softmax分类器得到最终的判断结果,计算公式如下:ℎ⃗dim_proj=128维向量输入b数值偏置U[dim_proj=128,2]维矩阵权重z2维向量输出z=𝑈ℎ⃗+𝑏三、源码数据流分析1、数据准备原始数据集文件中封装了train_set和test_set两个集合,train_set[0]为二重list,train_set[0][n]是第n个句子,每个句子存为list[词索引1,词索引2,……]的形式,注意这只是索引而不是词向量,train_set[1]为一重list,存放n个句子的情感标签,以0/1表示批判/赞扬,test_set的格式和train_set相同。经load_data函数读出数据集,送入get_minibatches_idx函数,将数据集切成batch_size大小的若干个块,每次同时处理一个batch_size数量的句子。用prepare_data函数处理一个batch_size=16的句子集,标签转化为16维的y向量,同时生成mask矩阵,mask矩阵和x矩阵大小相同,在x矩阵有单词存在的地方为1,不存在的地方为0,如果有超过maxlen的句子,超过的部分会被舍弃,注意x矩阵每一个元素是一个单词的索引值。这二我师……为他三和哥……什妈三他不……么就0谈要……五很0笑玩……一尴0风消……只尬0生消……放了00乐……三000了……天0000……假step=min(maxlen,最长的句子长度)batch_sizex1111……11111……11111……11011……11011……11011……11011……11001……10001……10000……1step=min(maxlen,最长的句子长度)batch_sizemaskbatch_sizey0110……0Init_params和param_init_LSTM函数进行各项权值初始化,LSTM层的参数用了鬼畜的正交矩阵方法初始化,其他参数用的是普通随机数。参数中的Wemb存放词向量集,词向量用随机数初始化,随着每次训练更新,即这里的语言模型是训练得到的。WiWi……WiWiWi……Wi……………………WiWi……WiWfWf……WfWfWf……Wf……………………WfWf……WfWoWo……WoWoWo……Wo……………………WoWo……WoWcWc……WcWcWc……Wc……………………WcWc……Wclstm_Wdim_projnodenodenodenodelstm_UnodeUiUi……UiUiUi……Ui……………………UiUi……UiUfUf……UfUfUf……Uf……………………UfUf……UfUoUo……UoUoUo……Uo……………………UoUo……UoUcUc……UcUcUc……Uc……………………UcUc……Ucnodenodenodenodelstm_bnodenodenodenodebibi……bibobo……bobcbc……bcbfbf……bfWembn_wordsdim_proj词向量词向量词向量……词向量Unode2UUUUUUUU…………UUb2bbbUild_model函数建立各种计算公式,按照x中的词索引在Wemb中寻找对应的词向量,生成三维矩阵emb,注意我画的那么长就是为了说明这里是词向量而不是词索引值了。embdim_proj他三和哥……什这二我师……为0000……假batch_sizedim_projdim_proj0000……假他三和哥……什这二我师……为stepf_pred_prob函数计算输出的2维概率向量,调用了最核心的lstm_layer函数完成lstm层的计算:①由于每个step间Wx的操作是完全无关的,可以并行处理,第一步计算emb=emb*lstm_W,这里是一个3维矩阵和2维矩阵的乘法,即emb的每一个step对应的二维矩阵都做一次和W的乘法emb*W他三和哥……什这二我师……为0000……假WiWi……WiWiWi……Wi……………………WiWi……WiWfWf……WfWfWf……Wf……………………WfWf……WfWoWo……WoWoWo……Wo……………………WoWo……WoWcWc……WcWcWc……Wc……………………WcWc……WcWiWi……WiWiWi……Wi……………………WiWi……WiWfWf……WfWfWf……Wf……………………WfWf……WfWoWo……WoWoWo……Wo……………………WoWo……WoWcWc……WcWcWc……Wc……………………WcWc……WcWiWi……WiWiWi……Wi……………………WiWi……WiWfWf……WfWfWf……Wf……………………WfWf……WfWoWo……WoWoWo……Wo……………………WoWo……WoWcWc……WcWcWc……Wc……………………WcWc……Wc×××===WxWx……WxWxWx……Wx……………………WxWx……WxWxWx……WxWxWx……Wx……………………WxWx……WxWxWx……WxWxWx……Wx……………………WxWx……Wx4*nodebatch_sizeWxWx……WxWxWx……Wx……………………WxWx……WxWxWx……WxWxWx……Wx……………………WxWx……WxWxWx……WxWxWx……Wx……………………WxWx……Wxstepstep②h、c先初始化为[batch_size,node]的零矩阵③在每个step内,i、f、c’、o都需要计算Uht-1,这之间也是完全并行的h*U×=hUhU……hUhUhU……hU……………………hUhU……hU4*nodebatch_sizehh……hhh……h……………………hh……hUiUi……UiUiUi……Ui……………………UiUi……UiUfUf……UfUfUf……Uf……………………UfUf……UfUoUo……UoUoUo……Uo……………………UoUo……UoUcUc……UcUcUc……Uc……………………UcUc……Ucbatch_sizenode④根据公式,计算出i、f、c’、o,这之间也是完全并行的i、f、o、chUhU……hUhUhU……hU……………………hUhU……hUnodeWxWx……WxWxWx……Wx……………………WxWx……Wxbibfbobc++++++++ii……iii……i……………………ii……iff……fff……f……………………ff……foo……ooo……o……………………oo……oc'c'……c'c'c'……c'……………………c'c'……c'sigmoidsigmoidsigmoidtanhbatch_size4*nodect-1ct-1……ct-1ct-1ct-1……ct-1……………………ct-1ct-1……ct-1ii……iii……i……………………ii……iff……fff……f……………………ff……fc'c'……c'c'c'……c'……………………c'c'……c'+**ctct……ctctct……ct……………………ctct……ct⑤计算c、h,注意这里的乘不是矩阵乘法,而是矩阵对应位置的两个元素相乘,其中还应用到mask矩阵来解决batch内每个句子长度不同的问题,用mask矩阵中相应的元素做如下的计算:ct=mask*c+(1-mask)ct-1,如果句子已经结束,对应的mask矩阵值为0,ct=ct-1,反之,ct=c,细胞状态更新,h同理⑥迭代③~⑤step次1111……11111……11111……11011……11011……11011……11011……11001……10001……10000……11011……11111……10000……01111……11111……1………………………………1111……1nodebatch_sizectct……ctctct……ct……………………ctct……ct0000……01111……10000……00000……0………………………………0123……5oo……ooo……o……………………oo……o取反ct-1ct-1……ct-1ct-1ct-1……ct-1……………………ct-1ct-1……ct-1+**ctct……ctctct……ct……………………ctct……ct*tanhtanhtanh……tanhtanhtanh……tanh……………………tanhtanh……tanhhtht……hththt……ht……………………htht……ht1111……10000……01111……11111……1………………………………1111……10000……01111……10000……00000……0………………………………0123……5ht-1ht-1……ht-1ht-1ht-1……ht-1……………………ht-1ht-1……ht-1+**htht……hththt……ht……………………htht……htbatch_sizebatch_sizenodeh、cnode⑦迭代完成后,将每个step对应的ht⃗⃗⃗取平均值,这里要注意batch内每个句子的长度都不一样,因此取平均值除数也不同1111……11111……11111……11011……11011……11011……11011……11001……10001……10000……1按列求和8379……10*stepnodebatch_sizebatch_sizenodehnhn……hnhnhn……hnhnhn……hn……………………hnhn……hnsteph2h2……h2h2h2……h2h2h2……h2……………………h2h2……h2h1h1……h1h1h1……h1h1h1……h1……………………h1h1……h1batch_sizenode00……000……000……0……………………hnhn……hnsteph2h2……h2h2h2……h2h2h2……h2……………………h2h2……h2h1h1……h1h1h1……h1h1h1……h1……………………h1h1……h1sumsum……sumsumsum……s
本文标题:theano-lstm源码算法分析v1.0
链接地址:https://www.777doc.com/doc-4499780 .html