
一、网络参数
本文档分析的源码来自于theano官网的一份LSTM源码(http://deeplearning.net/tUtorial/LSTM.html), 用LSTM网络分析一条电影影评是赞赏还是批判。
二、网络结构
一个LSTM网络(dim_proj=128个LSTM节点)的结构如上图,计算公式和参数如下:
该结构图是时间轴上的展开图,图中的所有LSTM网络其实是一个,输入x t为词向量,dim_proj=128维,n为句子的长度(即多少个单词),LSTM内部共有node=128个LSTM节点(节点数量必须与词向量维度相同,因为每个节点输出一个h t数值,所有节点组成的的维度要与x t保持一致),当一个句子计算完成后将每一step的取平均值,再经过softmax分类器得到最终的判断结果,计算公式如下:
三、源码数据流分析
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矩阵每一个元素是一个单词的索引值。
step=min(m axlen,最长的
句子长度)batch_size
x
step=min(m axlen,最长的
句子长度)
batch_size
mask
batch_size
y
Init_params 和param_init_LSTM 函数进行各项权值初始化,LSTM 层的参数用了鬼畜的正交矩阵方法初始化,其他参数用的是普通随机数。参数中的Wemb 存
放词向量集,词向量用随机数初始化,随着每次训练更新,即这里的语言模型是训练得到的。
lstm_W
dim_proj
node node
lstm_U
node
node node
lstm_b
node node
Wemb
dim_proj
U
node
b
bUild_model 函数建立各种计算公式,按照x中的词索引在Wemb中寻找对应的词向量,生成三维矩阵emb,注意我画的那么长就是为了说明这里是词向量而不是词索引值了。
emb
f_pred_prob 函数计算输出的2维概率向量,调用了最核心的lstm_layer 函数完成lstm 层的计算:
①由于每个step 间Wx 的操作是完全无关的,可以并行处理,第一步计算emb=emb*lstm_W ,这里是一个3维矩阵和2维矩阵的乘法,即emb 的每一个step 对应的二维矩阵都做一次和W 的乘法
emb*W
×
×
×
=
=
=
4*node
batch_size
step
②h 、c 先初始化为[batch_size,node]的零矩阵
③在每个step 内,i 、f 、c’、o 都需要计算Uh t-1,这之间也是完全并行的
h*U
×
=
4*node
batch_size
batch_size
node
④根据公式,计算出i 、f 、c ’、o ,这之间也是完全并行的
i 、f 、o 、c
node
batch_size
*
*
⑤计算c 、h ,注意这里的乘不是矩阵乘法,而是矩阵对应位置的两个元素相乘,其中还应用到mask 矩阵来解决batch 内每个句子长度不同的问题,用mask 矩阵中相应的元素做如下的计算:c t =mask*c+(1-mask)c t-1,如果句子已经结束,对应的mask 矩阵值为0,c t = c t-1,反之,c t =c ,细胞状态更新,h 同理
1011 (1)
1011 (1)
batch_size
*
*
*
tanh
+
*
*
batch_size
h、c
⑦迭代完成后,将每个step 对应的取平均值,这里要注意batch 内每个句子的长度都不一样,因此取平均值除数也不同
1111......11111......11111......11011......11011......11011 (11)
011 (11001)
(1)
000
1 (10)
……
1
按列求和
8
3
7
9 (10)
*
step
node
……
batch_size
batch_size
node
h n h n ……h n
h n
h n ……h n
h n h n ……h n
……………………
h n h n ……h n
step
h 2h 2……
h 2h 2h 2……
h 2h 2h 2……
h 2…………
……h 2h 2……h 21h 1……h 11h 1……h 1h 1h 1……h 1
………………
h 1h 1……h
1
batch_size
node
00……
0
00 0
……………………
h n h n ……h
n
step
h 2h 2……h 2h 2h 2……
h 2h 2h 2……
h 2…………
…………h 2h 2……h
21h 1……h 11h 1……h 1h 1h 1h 1
………………
h 1h 1……h 1
sumsum ……sum sumsum ……sum sumsum ……sum ……………………sumsum ……sum
所有step 的和
88 (83)
3......377 (79)
9 (9)
........................1011 (13)
node
÷
batch_size
h h ……h h h ……h h
h
……
h
……………………h
h
……
h
node
乘mask
⑧计算2维概率向量z
×=+2
batch_size z
f_pred 计算预测响应,即取2维概率向量中较大的那个,输出判断结果,再根据softmax 计算batch 内所有句子的误差函数,取平均值
最后对各权值求导,使用SGD 调整权值,然而theano 使用的是自动求导函数,求导公式不得而知 这踏马就很尴尬了
四、并行度措施分析
2、一次性计算所有step的Wx
