之前看Autoencoder的时候,做了一下这里的练习:http://ufldl.stanford.edu/wiki/index.php/Exercise:Sparse_Autoencoder 。其实 从1月份就开始做了,当时没有调试通过,后来又加班太多,一直没有接着做。直到上上周末抽空调了一天,终于顺利完成了,又拖到这周末才开始把实验结果整理成文。看来,做事还得趁热打铁,一气呵成。时间一久,积极性就没了。
最初按照练习中的建议,先实现了一个基本的代价函数,没有加入权值惩罚项和稀疏约束项,梯度检查都过了,跑出来的cost看起来也很收敛,可是权值的可视化结果就是不对,见图1 。为了验证代码的正确性,还利用AE代码实现了一个8维输入的BC编码器,结果也是很理想;又怀疑训练样本采样策略不够随机,从网上找了个代码换了下,结果还是不行。反复看了代码也没发现问题,想到加上权值惩罚项和稀疏约束项,还是不对,这下疯了。后来又折腾好久,终于OK了,原来加上权值惩罚项和稀疏约束项就能解决,只不过之前,修改的文件,不是MATLAB真正运行的文件。。。
AE的原理就不说了,现成代码在网上也可以找到,把几个实验结果贴一下,供参考。图1a是没有加稀疏项的可视化权值,图 1b是没有加权值惩罚项的结果,看起来都是无规律的。图1加了权值惩罚项和稀疏约束项,得到了符合预期的权值结果,根据材料中的解释就是图像的边缘。对于简单的BC编码,这两个约束项似乎没有影响。但通常来说,权值惩罚项是为了约束W的取值以防止过拟合。而稀疏项的存在则是为了更好的表示特征。
a b
c
图1
AE实验最初来至于对人类视觉的研究,所以取的训练图像都是一些自然风景图片。按照《Natural Image Statistics》这本书的说法,之所以选取自然图像,是因为这些自然图像促进了人类视觉的进化,也就说人类视觉是在适应自然图像的过程中得到进化的,对自然图像中的结构特征是敏感的。而像建筑,汽车这些包含现代物体的图像,则没有起到类似的作用。
虽然这么说没错,但人类毕竟还是能识别汽车这些物体的,于是我做了个实验验证了一下:拿包含汽车,地铁2号线,东方明珠的一些图像训练同样的AE,结果见图2。
图2
和拿风景图像做出来的结果并没有太大不同,虽然看起来稍有不同,但即使同一训练集中选出的不同样样本得到的结果也是不同的,所以可以认为是一样的吧。可见图像内容的影响并没有那本书中说得那么玄乎(实践,才是检验真理的唯一标准啊)。尝试解释一下,虽然人类视觉是为了自然环境而进化的,但显然其适应能力只受限于物理层面的因素,如光波强度,频率等,至于内容是一辆车,还是一头牛,其图像形成的低层物理特征并没有统计上的区别,因此对于视觉低层处理是一样的(或许对高层级的处理有影响)。再发散一下,对于完全人造的图像,如屏幕截图,网页页面截图等,是否应该具有不同于普通光影图像的特征?是否无法训练出像图1c那样的边缘来?我还没尝试,有兴趣的同志可以验证一下。
无聊又验证了一下样本数对于训练结果的影响。图3a,图3b,图3c分别是100个样本,10 0000个样本和100 0000个样本训练的结果。看来,100个样本对于成功抽取特征显然是不够的。貌似图c比图b更清晰?
a b
c
图3
AutoEncoder的一些实验结果和思考