神经网络实践经验(1)
前言
本系列是本人记录在自己实践中遇到的很多读死书无法学习到的经验,不完全脱离理论,甚至说是超过理论之外的东西。
本人水平很差(深度学习之耻),有些说的简陋的东西也当是献丑了。
1. 神经网络的输入最好有一定相关性,否则很容易产生过拟合的效果
所谓的过拟合,就是模型学习到本应该学习到的特征之外的特征。
图一如图,本来模型只应该学习到x,x2 和常数项的特征,但是由于模型的容量(capacity)太大,模型学习到了x3 和x4的特征。所以造成最后模型的扭曲。
过拟合的问题大家肯定都懂,模型在testing数据集和training数据集的差异会非常大,在training集上表现非常好的数据在testing集上会非常差。
图二在神经网络中最常用的正则化方法是Dropout。
同时我们应该去了解一下神经网络中的全连接层。全连接层在数据于数据之中找关系,提取输入数据的浅层特征与深层特征并且将这些特征映射到类别中(此处我只说的是多分类,其他的工作暂时不讲)。也就是说在全连接层中它寻找的输入每个神经元与神经元之间的联系。
从某种意义上来说,神经网络就是个高超的特征工程器。
在某些时候,我们为了去做多分类,会去试着去找无关(前置知识)的特征然后作为输入扔给神经网络。甚至是两个相互无关(前置知识)的向量拼接之后扔给神经网络。
不得不说,这是非常蠢的想法。
我们迫使神经网络去找到已知无关的数据的联系特征,这本身就可能然神经网络产生过拟合。
就比如,我现在用多层感知机(MLP)做推荐系统,有user向量u也有item向量i ,user和item没有直接关联,我们将u与i拼接并直接扔给MLP。MLP学习到了user的特征还有item的特征,还有user中某个神经元和item某个神经元的联系。
单单用脑子想想就知道,我们会学习到很多在推荐系统中一点用都没有的,在由user的输入神经元与item的输入神经元构成的特征,相当于神经网络瞎做特征工程,然后过拟合了,即时加了Dropout也没用。
为什么使用神经网络去处理图像的效果好?因为本身图像就是一个上下文相关的数据,很多像素点的集合不叫有意义的图像,像素点与像素点连接所构成的有意义的数据才能叫有意义的图像。但是图像本身是局部相关,我左下角的像素点可能和右上角的像素点一点关系都没有,但是左下角的像素点只与它周围一圈的像素点有关,所以CNN较MLP更适合Computer Vision。
NLP同理(虽然我不懂XD)。
这个时候我们应该做什么呢?
本人认为,应该试着使用CNN这种局部特征网络。并且可以试着在u和i拼接处加上少许的0(数量大概是filter的大小减一),这样可以减少两个向量无用的特征。
或者你试着做一下特征工程,虽然对于end-to-end模型来说特征工程比较少见。而且这个特种工程可以做的人头大。如果你非要做特征工程,你为什么不试试传统机器学习呢?
当然你说你数据量大你头铁那我也没办法,毕竟在深度学习中数据量大是可以为所欲为的。
图片来源:
图一:https://blog.csdn.net/willduan1/article/details/53070777
图二:图书 deep learning
网友评论