Author: Cao Shengming
Email: caoshengming@trio.ai
Company: Trio 北京(三角兽)科技有限公司
0.关于Neural Network 的复杂度
NN 模型的复杂度一般可以从两个方面来刻画:
时间复杂度:
时间复杂度与硬件执行息息相关,但是一般表示模型时间复杂度的方法,可以是某一层、或者产生某个结果所需要的操作(operation)数、所需要处理的元素(elements)个数或者完成某个操作所需要经历的路径长度(path length)。
空间复杂度:
空间复杂度与模型容量是息息相关的,这里我们可以将空间复杂度简单理解为模型的参数数量,也就是说 parameters per layer 就可以认为是该层的模型复杂度。
(Note: 下边如果不做特殊说明,我们将先讲述空间复杂度的状况。)
1.CNN 模型复杂度
常见的 CNN 模型一般包含以下集中类型的层,卷积层、池化层和全连接层。假设卷积核大小为 H*W,input channel 为 I,out channel 为 O。
输入层和输出层暂时先不考虑,输入层没有参数,而输出层一般是全连接层,就不做单独分析。
- Convolutional Layer:
该层 filter 数量总数为 H*W*I,而每个将被映射到64个新的通道,加上每个filter 的计算要有一个 bias,所以总的参数数量为(H*W*I+1)*O。 - Pooling Layer:
一般的池化层属于固定操作,没有权重系数。 - Fully Connected Layer:
全连接层也好理解,前后要是 n,m 维的输入输出,所以其参数数量为(n+1)*m。
2.LSTM 模型复杂度
如图所示LSTM将一共维护4套参数,分别对应输入门、输出门、遗忘门和候选态。所以总的参数数量如下所示:
Number_of_weight = 4 * Hidden_size * (Input_size + Bias + Output_size)
其中当不做 project 的时候,Output_size 和 Hidden_size 实际上是一致的。
其中 Input_size + Output_size 实际上就是 concat[
h
t
−
1
h_{t-1}
ht−1, x] 。假设只有一个 hidden unit 那么参数数量为num(
h
t
−
1
h_{t-1}
ht−1) + num(x) + num(bias),所以所有的 hidden unit 加起来只需要在前边乘以 hidden_size 就可以。
但我们还可以整体来理解,LSTM 中的参数我们可以简化为 U ,V 两个矩阵,其分别对输入和输出做映射,U 的维度为 hidden*Input,V 的维度是 hidden*hidden。所以这样分开理解也可以,网络在学习的就是这两个矩阵,所以总的数量为 4(hidden*Input + hidden*hidden + hidden) 这也就是我们常看到的 4(nm+ n 2 n^2 n2 +n),其中 n 为 hidden_size,m 为 input_size。
3.References
- https://datascience.stackexchange.com/questions/10615/number-of-parameters-in-an-lstm-model
- https://stackoverflow.com/questions/38080035/how-to-calculate-the-number-of-parameters-of-an-lstm-network
- http://wap.sciencenet.cn/blog-578676-1019567.html
- http://colah.github.io/posts/2015-08-Understanding-LSTMs/