我在网上没找到《 Learning and Memorization 》这篇paper的详解,所以下面基本都是我个人的理解,不对的地方请多多指教。
Memorization: Ability to remember training data, poor classification on testing data.
Generation: Ability to remember training data, good classification on testing data.
1 摘要
首先,摘要部分提出三个观点:
(1)增加网络深度可以提高网络性能
(2)随机数据可以被 memorized,而真实数据可以被 generalized
(3)一般来说,对于随机数据的 memorization 是要难于真实数据的
2 一个简单的 lookup table
左图:B={0,1} 对应的 Bk ( k=3 ) 时有7种模式;
中间图:lookup table。y0 与 y1 分别代表 output 为 0 和为 1 ,下面的值为 pattern p输出为 0 或 1 的次数;
右图:经过函数后生成的 truth table,具体函数如下图所示。“*”表示在 0 ~ 1 间随机选取的数。
结果表明,左图中只有第一个和第六个的值是对应不上的。
cp1 表示对应该 pattern p,output 为 1 出现的次数。
cp0 表示对应该 pattern p,output 为 0 出现的次数。
简单的 LUT 示意图( k=2 ):
3 网络型 LUT
数据集:MNIST
“0” 分类:数字 “0~4” ; “1” 分类:数字“5~9”
函数f:B28*28–> B
网络具体架构:
输入层:228*28
网络共有 d 层,前 d-1 为隐藏层,最后一层为输出层,每层都有 k 个输入。
在 1 <= l <= d 层,每层都有 nl 个lookup table,nd = 1
令 k=2,d=2,即 n1=2,n2=1,示意图如下。
在 n1 层,经过函数 f,分别得到 f10 和 f11 .
在 n2 层,经过函数 f,得到 f20 .
结果表明,左图中只有第一个和第七个值与网络预测的值是对应不上的。
该网络的优点:
(1)效率高,只需要计数和对 LUT 的查找,且不涉及浮点型数字。
(2)所有的 LUT 都是独立且并行的。
4 Experiment
4.1 Experiment 1
网络结构:
k=8,nd=1
隐藏层:d-1=5,nl=1024
第 0 层不对应 luts,对应的是输入:28*28
结论:
(1)随着网络层数的加深,accuracy 也随之增加
(2)隐藏层每一层的输入都是前一层的输出,输出的 accuracy 高于输入
对于网络的具体设计,作者有备注说:
在第 5 层,只需要 8 个 luts;在第 4 层,只需要 64 个 luts,但作者还未对其进行优化。
4.2 Experiment 2 & Experiment 3
网络结构:
k是变量,nd=1
隐藏层:d-1=5,nl=1024
有人提出 k=28*28 ,但其实 k 不用那么大,模型就已经训练得很好了。
真实数据(前三列):
在 k=2 时,模型的 accuracy 较低,memorization效果差。
随着 k 值的增加,模型的 accuracy 越来越高,且训练数据与测试数据间 accuracy 的差值也越来越小。
当 k>12时,测试数据的 accuracy越来越低,差值也越来越大,说明 k=12 时,模型效果最优。
k不是越大越好,而且 12 << 28*28。
随机数据(后两列):
随着 k 值不断地增大,训练数据的 accuracy 越来越大。
不管 k 值如何改变,测试数据的 accuracy 始终维持在 0.5 附近徘徊,偏差 < 0.05.
真实数据与随机数据的比较:
accuracy :真实数据( k=4 ) ≈ 随机数据( k=12 )
当 k=12 时,网络可以很好地 memorize 随机数据( 0.82 ),也可以很好地 generalize 真实数据( 0.99 )。
4.3 Experiment 4
与其它流行的算法进行比较。
从上述图中可以观察到,LENET卷积网络( 2 Convs, max-pooling, 3 FCs, 6 epochs, SGD )的性能最好。但 memorization 比其它算法,其 accuracy 是高出不少的。
4.4 Experiment 5
这个 experiment 用到了 Pairwise,我在网上找了个例子来解释 :
有一个数组 [7,9,11,13,15],按照最佳组合值为 20 来计算,只有 7+13 和 9+11 两种组合。而 7 在数组的索引为 0,13 在数组的索引为 3,9 在数组的索引为 1,11 在数组的索引为 2。
所以我们说函数:pairwise([7,9,11,13,15],20) 的返回值应该是 0+3+1+2 的和,即 6。
对于一个 10 分类的数据集,对其进行两两分类,可得到 ( 10 * 9 ) / 2 = 45 个分类。
在 experiment 2 中,当训练数据的 accuracy = 1 时,其测试数据的 accuracy 是减小的。
而在本实验中,当训练数据的 accuracy = 1 时,45 个分类中有 31 个 accuracy 达到 0.98 ,而最差的(难以区分 ”4“ 跟 ”9”)的 accuracy 也达到了 0.95。
此时, k=6 and k=8.
4.5 Experiment 6
改变网络深度。
在 experiment 5中,当 k=2 时,网络的区分度很低。为了加强网络性能,可以适当增加网络深度。
保持 k=2, 增加隐藏层个数从 20 --> 25。从图中可以观察到当 隐藏层个数 = 16 或 32 时,网络已具有良好的性能。
此时,luts 的结构非常的小,其训练数据和测试数据间 accuracy 的差值也越来越小。
4.6 Experiment 7
改变数据集。
数据集:CIFAR-10, 5000张
“0” 分类:数字 “0~4” ; “1” 分类:数字“5~9”
函数f:B3*32*32–> B
网络结构:
k=8,nd=1
隐藏层:d-1=5,nl=1024
对于这个数据集,memorization也保持良好的稳定性( train:0.79, test:0.63 )。
对于其它算法,表现得却不太稳定。在 MNIST 数据集性能好的,在 CIFAR-10 数据集性能变差;或在MNIST 数据集性能不好的,在CIFAR-10 数据集性能变好。
LENET网络性能一如既往得好,但是在 CIFAR-10 数据集需要 40 epochs。
4.7 Experiment 8
用到了 “Pairwise"。
得到最高的分类 accuracy ( CAT v/s DOG) 为 0.95,最低的分类 accuracy ( FROG v/s SHIP ) 为0.61,平均分类 accuracy 为 0.76。
4.8 Experiment 9
设置区域 [−2, 2] × [−2, 2] ∈ R2,以 x2 + y2≤ 1.6 为边界把数据分成两类。
用 10 位定点数来表示每一个点,所以函数 f :B20 --> B
隐藏层:d-1=32, nl =2048
当 k = 6 时,网络的性能表现得最好。
5 Conclusion
(1)在对 MNIST 与 CIFAR-10 这两个数据集进行分类时,Memorize的性能已不弱于一些传统算法。
(2)该网络的性能随深度的提升而提升。
(3)该网络可以 memorize 随机数据,而不能 generalize 随机数据。
(4)memorize 随机数据难于 memorize 真实数据。