搭积木
第一次看到类比神经网络为乐高积木,是在《Neural Network for Natural Language Processing (自然语言处理中的神经网络)》里面,当时真的有种醍醐灌顶,恍然大悟的感觉。
之前的一些实践经验,隐隐约约感觉用框架搭建网络有点像某种东西,但是却说不出,一下子被点破,立刻有一种畅快感。
是的,就目前用深度学习来进行研究或开发,完全可以把深度学习中的各种模块,当做是乐高积木中的一块块积木。你要做的就是根据任务要求,把这些基本模块拼起来,只要孔对好了,整个拼出来的结构合理,模型就能够跑。
现在各种深度学习框架的出现,使得这个特征更加明显。基本上每个框架都把一些基本的网络架构给模块化了,直接拿出来用就行了。
军火库
如果具体一点的话,可以拿深度学习中主要的三种网络模块来举例,这三种分别是MLP(多层感知机,也有很多其他叫法)、CNN(卷积神经网络)、RNN(循环神经网络)。
现在就可以把这三种网络模块,当做是三种不同的积木,比如说MLP是梯形积木,CNN是方块形积木,RNN是条形积木。
如果还要再细分的话,这些大的模块下面又有小的变种,如典型的RNN中就有LSTM和GRU这两个小兄弟。
这些模块也都各自有着自己的特性,我们需要了解其特性,然后把他们从军火库中拿出来,放到合适的位置上去,组装起来就可以得到自己的架构和模型。
连接
既然有了这些积木,那么这些积木与积木之间当然也得有孔洞才能够互相连接。那么什么是孔洞呢?
就是各个模块的输入与输出的形状,只要前一个模块的输出和后一个模块的输入吻合,整个架构就可以跑起来,结果好不好先不说。
往往刚学习搭建网络时,最常碰上的问题就是,相邻的模块之间的输入与输出形状不吻合(not match)。所以我建议可以在旁边加注释,现在的输入输出形状怎么样了,是否吻合,很有帮助的。
连接好了之后呢,虽然有了一个模型,但还没有训练,这样没训练的模型也并没有什么用。那是不是需要自己把这个模型的运算方程写出来,然后再分别求偏导,之后利用反向传播更新呢?
如果是这样子的话,那么可能就只会有数学狂人才会来研究深度学习了。
所幸的是,因为有了计算图(Computational Graph)这项伟大的技术,所以现在反向传播训练非常便利,基本上已经全自动化了,直接把模型和数据丢给它们去训练就好了。
搭积木的例子
来举实际的例子。
比如任务是物体检测的话,我们怎么搭建模型呢。粗暴点说就是,在前面使劲堆CNN型积木,最后再加上MLP型积木,然后整个模型就好了。
还有现在挺火的VQA(视觉问答),看它的基线模型的话就是,对于图片用CNN型积木先堆成一块提取特征,然后对于文本的问题就用RNN型积木提取特征,之后两个提取的特征用叫做融合模块的积木连接一下,最后加上MLP,就完成了。我们可以给新模型取名叫做VQA基线模型。
当然实际上还有很多对各个模块的细调和小技巧,才能够使得整个大模型获得很好的性能。但这里就不累述了。
拿来主义
好玩的是,如果你用小模块搭成了一个大模型,别人可以直接把你这个大模型拿过去,这边卸掉一块,那边装上一块,再稍微调一调就有了自己的新模型。
深度学习研究者
对于一些上层直接应用的研究人员,如自然语言处理,还有计算机视觉来说,确实可以把这些模块当成是积木块来用。
那么那些研究这些模块的研究者们呢,可以把他们当做是积木创造者。他们对这些模块里面的小部件进行调节测试,创造出新的模块,还有如何训练,以及各种理论分析。往往很多进展都得从他们那儿得到启示。
还有一点就是,可能大家也有疑问为什么现在大概只有MLP、CNN以及RNN三大模块,不多发明几种模块呢,最好像乐高积木一样,各种各样的。
事实上,这也是深度学习领域的研究人员在不断探索着的。因为目前这三个模块大家已经进行了很多研究,它们在有些问题上遇到一些困难,现在尚不能解决。
于是人们开始期望新的模型来进一步解决问题,所以就有最近自然语言处理的一些Recursive Neural Network的树状网络的探索,还有更进一步Hinton这样的想要推出完全不同的模块Capsule的。
还有一点要提的是,因为一直以来大家对这些模块的内部具体的工作原理并不是很理解,所以如何把这个黑箱打开也是现在研究的重点之一。
网友评论