很明显,这个典型的结构分为四个大层次
- 输入图像I。为了减小复杂度,一般使用灰度图像。当然,也可以使用RGB彩色图像,此时输入图像有三张,分别为RGB分量。输入图像一般需要归一化,如果使用sigmoid激活函数,则归一化到[0, 1],如果使用tanh激活函数,则归一化到[-1, 1]。
- 多个卷积(C)-下采样(S)层。将上一层的输出与本层权重W做卷积得到各个C层,然后下采样得到各个S层。怎么做以及为什么,下面会具体分析。这些层的输出称为Feature Map。
- 光栅化(X)。是为了与传统的多层感知器全连接。即将上一层的所有Feature Map的每个像素依次展开,排成一列。
- 传统的多层感知器(N&O)。最后的分类器一般使用Softmax,如果是二分类,当然也可以使用LR。
接下来,就开始深入探索这个结构吧!
从多层感知器(MLP)说起
卷积神经网络来源于普通的神经元网络。要了解个中渊源,就要先了解神经元网络的机制以及缺点。典型的神经元网络就是多层感知器。
摘要:本节主要内容为多层感知器(MLP,Multi-Layer Perceptron)的原理、权重更新公式的推导。熟悉这一部分的童鞋可以直接跳过了~但是,一定一定要注意,本节难度比较大,所以不熟悉的童鞋一定一定要认真看看!如果对推导过程没兴趣,可直接在本节最后看结论。
感知器
感知器(Perceptron)是建立模型
f(x)=act(θTx+b)f(x)=act(θTx+b)
其中激活函数act可以使用{sign, sigmoid, tanh}之一。
- 激活函数使用符号函数sign,可求解损失函数最小化问题,通过梯度下降确定参数
- 激活函数使用sigmoid(或者tanh),则分类器事实上成为Logistic Regression(个人理解,请指正),可通过梯度上升极大化似然函数,或者梯度下降极小化损失函数,来确定参数
- 如果需要多分类,则事实上成为Softmax Regression
- 如要需要分离超平面恰好位于正例和负例的正中央,则成为支持向量机(SVM)。
感知器比较简单,资料也比较多,就不再详述。
多层感知器
感知器存在的问题是,对线性可分数据工作良好,如果设定迭代次数上限,则也能一定程度上处理近似线性可分数据。但是对于非线性可分的数据,比如最简单的异或问题,感知器就无能为力了。这时候就需要引入多层感知器这个大杀器。
多层感知器的思路是,尽管原始数据是非线性可分的,但是可以通过某种方法将其映射到一个线性可分的高维空间中,从而使用线性分类器完成分类。图1中,从X到O这几层,正展示了多层感知器的一个典型结构,即输入层-隐层-输出层。
输入层-隐层
是一个全连接的网络,即每个输入节点都连接到所有的隐层节点上。更详细地说,可以把输入层视为一个向量xx,而隐层节点jj有一个权值向量θjθj以及偏置bjbj,激活函数使用sigmoid或tanh,那么这个隐层节点的输出应该是
fj(x)=act(θTjx+bj)fj(x)=act(θjTx+bj)
也就是每个隐层节点都相当于一个感知器。每个隐层节点产生一个输出,那么隐层所有节点的输出就成为一个向量,即
f(x)=act(Θx+b)f(x)=act(Θx+b)
若输入层有mm个节点,隐层有nn个节点,那么Θ=[θT]Θ=[θT]为n×mn×m的矩阵,xx为长为mm的向量,bb为长为nn的向量,激活函数作用在向量的每个分量上,f(x)f(x)返回一个向量。
隐层-输出层
可以视为级联在隐层上的一个感知器。若为二分类,则常用Logistic Regression;若为多分类,则常用Softmax Regression。
Back Propagation
搞清楚了模型的结构,接下来就需要通过某种方法来估计参数了。对于一般的问题,可以通过求解损失函数极小化问题来进行参数估计。但是对于多层感知器中的隐层,因为无法直接得到其输出值,当然不能够直接使用到其损失了。这时,就需要将损失从顶层反向传播(Back Propagate)到隐层,来完成参数估计的目标。
首先,约定标量为普通小写字母,向量为加粗小写字母,矩阵为加粗大写字母;再约定以下记号:
- 输入样本为xx,其标签为tt
- 对某个层QQ,其输出为oQoQ,其第jj个节点的输出为o(j)QoQ(j),其每个节点的输入均为上一层PP的输出oPoP;层QQ的权重为矩阵ΘQΘQ,连接层PP的第ii个节点与层QQ的第jj个节点的权重为θ(ji)QθQ(ji)
- 对输出层YY,设其输出为oYoY, 其第yy个节点的输出为o(y)YoY(y)
现在可以定义损失函数
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪Eo(j)Qn(j)Q=12∑y∈Y(t(y)−o(y)Y)2=ϕ(n(j)Q)=∑i∈Pθ(ji)Qo(i)P+b(j)Q{E=12∑y∈Y(t(y)−oY(y))2oQ(j)=ϕ(nQ(j))nQ(j)=∑i∈PθQ(ji)oP(i)+bQ(j)
其中,ϕϕ为激活函数。我们依旧通过极小化损失函数的方法,尝试进行推导。则
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪∂E∂θ(ji)Q∂E∂b(j)Q=∂E∂o(j)Q∂o(j)Q∂n(j)Q∂n(j)Q∂θ(ji)Q=∂E∂o(j)Q∂o(j)Q∂n(j)Q∂n(j)Q∂b(j)Q{∂E∂θQ(ji)=∂E∂oQ(j)∂oQ(j)∂nQ(j)∂nQ(j)∂θQ(ji)∂E∂bQ(j)=∂E∂oQ(j)∂oQ(j)∂nQ(j)∂nQ(j)∂bQ(j)
上边两个式子的等号右边部有三个导数比较容易确定
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪∂o(j)Q∂n(j)Q∂n(j)Q∂θ(ji)Q∂n(j)Q∂b(j)Q=ϕ′(n(j)Q)=o(i)P=1{∂oQ(j)∂nQ(j)=ϕ′(nQ(j))∂nQ(j)∂θQ(ji)=oP(i)∂nQ(j)∂bQ(j)=1
然后再看剩下的比较复杂的一个偏导数。考虑层QQ的下一层RR,其节点kk的输入为层QQ中每个节点的输出,也就是为o(j)QoQ(j)的函数,考虑逆函数,可视o(j)QoQ(j)为o(k)RoR(k)的函数,也为n(k)RnR(k)的函数。则对每个隐层
∂E∂o(j)Q=∂E(n(1)R,n(2)R,...,n(k)R,...,n(K)R)∂o(j)Q=∑k∈R∂E∂n(k)R∂n(k)R∂o(j)Q=∑k∈R∂E∂o(k)R∂o(k)R∂n(k)R∂n(k)R∂o(j)Q=∑k∈R∂E∂o(k)R∂o(k)R∂n(k)Rθ(kj)R∂E∂oQ(j)=∂E(nR(1),nR(2),...,nR(k),...,nR(K))∂oQ(j)=∑k∈R∂E∂nR(k)∂nR(k)∂oQ(j)=∑k∈R∂E∂oR(k)∂oR(k)∂nR(k)∂nR(k)∂oQ(j)=∑k∈R∂E∂oR(k)∂oR(k)∂nR(k)θR(kj)
令δ(j)Q=∂E∂o(j)Q∂o(j)Q∂n(j)QδQ(j)=∂E∂oQ(j)∂oQ(j)∂nQ(j)
则对每个隐层
∂E∂o(j)Q=∑k∈R∂E∂o(k)R∂o(k)R∂n(k)Rθ(kj)R=∑k∈Rδ(k)Rθ(kj)R∂E∂oQ(j)=∑k∈R∂E∂oR(k)∂oR(k)∂nR(k)θR(kj)=∑k∈RδR(k)θR(kj)
考虑到输出层,有
∂E∂o(j)Q=⎧⎩⎨⎪⎪∑k∈Rδ(k)Rθ(kj)R,o(j)Y−t(j),k has input node jj is an output node, i.e. Q=Y∂E∂oQ(j)={∑k∈RδR(k)θR(kj),khasinputnodejoY(j)−t(j),jisanoutputnode,i.e.Q=Y
故有
δ(j)Q=∂E∂o(j)Q∂o(j)Q∂n(j)Q=∂E∂o(j)Qϕ′(n(j)Q)=⎧⎩⎨⎪⎪(∑k∈Rδ(k)Rθ(kj)R)ϕ′(n(j)Q),(o(j)Y−t(j))ϕ′(n(j)Y),k has input node jj is an output node, i.e. Q=YδQ(j)=∂E∂oQ(j)∂oQ(j)∂nQ(j)=∂E∂oQ(j)ϕ′(nQ(j))={(∑k∈RδR(k)θR(kj))ϕ′(nQ(j)),khasinputnodej(oY(j)−t(j))ϕ′(nY(j)),jisanoutputnode,i.e.Q=Y
综合以上各式,有梯度结果
∂E∂θ(ji)Q∂E∂b(j)Q=∂E∂o(j)Q∂o(j)Q∂n(j)Q∂n(j)Q∂θ(ji)Q=δ(j)Qo(i)P=∂E∂o(j)Q∂o(j)Q∂n(j)Q∂n(j)Q∂b(j)Q=δ(j)Q∂E∂θQ(ji)=∂E∂oQ(j)∂oQ(j)∂nQ(j)∂nQ(j)∂θQ(ji)=δQ(j)oP(i)∂E∂bQ(j)=∂E∂oQ(j)∂oQ(j)∂nQ(j)∂nQ(j)∂bQ(j)=δQ(j)
本来到这里应该就结束了,不过同正向的时候一样,为了计算方便,我们依然希望能够以矩阵或者向量的方式来表达。结论在这里:
假设有层P,Q,RP,Q,R,分别有l,m,nl,m,n个节点,依序前者输出全连接到后者作为输入。层QQ有权重矩阵[ΘQ]m×l[ΘQ]m×l,偏置向量[bQ]m×1[bQ]m×1,层RR有权重矩阵[ΘR]n×m[ΘR]n×m,偏置向量[bR]n×1[bR]n×1。那么
∂E∂ΘQ∂E∂bQδQ=δQoTP=δQ={(ΘTRδR)∘ϕ′(nQ),(oY−t)∘ϕ′(nY),Q is a hidden layerQ=Y is the output layer∂E∂ΘQ=δQoPT∂E∂bQ=δQδQ={(ΘRTδR)∘ϕ′(nQ),Qisahiddenlayer(oY−t)∘ϕ′(nY),Q=Yistheoutputlayer
其中,运算w=u∘vw=u∘v表示wi=uiviwi=uivi。函数作用在向量或者矩阵上,表示作用在其每个分量上。
最后,补充几个常用的激活函数的导数结果,推导很简单,从略。
ϕ′(x)ϕ′(x)ϕ′(x)=sigmoid′(x)=sigmoid(x)(1−sigmoid(x))=oQ(1−oQ)=tanh′(x)=1−tanh2(x)=1−o2Q=softmax′(x)=softmax(x)−softmax2(x)=oQ−o2Qϕ′(x)=sigmoid′(x)=sigmoid(x)(1−sigmoid(x))=oQ(1−oQ)ϕ′(x)=tanh′(x)=1−tanh2(x)=1−oQ2ϕ′(x)=softmax′(x)=softmax(x)−softmax2(x)=oQ−oQ2
存在的问题
多层感知器存在的最大的问题就是,它是一个全连接的网络,因此在输入比较大的时候,权值会特别多。比如一个有1000个节点的隐层,连接到一个1000×1000的图像上,那么就需要 10^9 个权值参数(外加1000个偏置参数)!这个问题,一方面限制了每层能够容纳的最大神经元数目,另一方面也限制了多层感知器的层数即深度。
多层感知器的另一个问题是梯度发散。(这个问题的具体原因还没有完全弄清楚,求指教!)一般情况下,我们需要把输入归一化,而每个神经元的输出在激活函数的作用下也是归一化的;另外,有效的参数其绝对值也一般是小于1的;这样,在BP过程中,多个小于1的数连乘,得到的会是更小的值。也就是说,在深度增加的情况下,从后传播到前边的残差会越来越小,甚至对更新权值起不到帮助,从而失去训练效果,使得前边层的参数趋于随机化(补充一下,其实随机参数也是能一定程度上捕捉到图像边缘的)。
感谢shwley提供的帮助~
因为这些问题,神经元网络在很长一段时间内都被冷落了。
从MLP到CNN
卷积神经网络的名字怪吓人,实际理解起来也挺吓人的。哈哈,其实只要看明白了多层感知器的推导过程,理解卷积神经网络就差不多可以信手拈来了。
摘要:首先解释卷积神经网络为什么会“长”成现在这般模样。然后详细推导了卷积神经网络的预测过程和参数估计方法。
CNN的前世今生
既然多层感知器存在问题,那么卷积神经网络的出现,就是为了解决它的问题。卷积神经网络的核心出发点有三个。
- 局部感受野。形象地说,就是模仿你的眼睛,想想看,你在看东西的时候,目光是聚焦在一个相对很小的局部的吧?严格一些说,普通的多层感知器中,隐层节点会全连接到一个图像的每个像素点上,而在卷积神经网络中,每个隐层节点只连接到图像某个足够小局部的像素点上,从而大大减少需要训练的权值参数。举个栗子,依旧是1000×1000的图像,使用10×10的感受野,那么每个神经元只需要100个权值参数;不幸的是,由于需要将输入图像扫描一遍,共需要991×991个神经元!参数数目减少了一个数量级,不过还是太多。
- 权值共享。形象地说,就如同你的某个神经中枢中的神经细胞,它们的结构、功能是相同的,甚至是可以互相替代的。也就是,在卷积神经网中,同一个卷积核内,所有的神经元的权值是相同的,从而大大减少需要训练的参数。继续上一个栗子,虽然需要991×991个神经元,但是它们的权值是共享的呀,所以还是只需要100个权值参数,以及1个偏置参数。从MLP的 10^9 到这里的100,就是这么狠!作为补充,在CNN中的每个隐藏,一般会有多个卷积核。
- 池化。形象地说,你先随便看向远方,然后闭上眼睛,你仍然记得看到了些什么,但是你能完全回忆起你刚刚看到的每一个细节吗?同样,在卷积神经网络中,没有必要一定就要对原图像做处理,而是可以使用某种“压缩”方法,这就是池化,也就是每次将原图像卷积后,都通过一个下采样的过程,来减小图像的规模。以最大池化(Max Pooling)为例,1000×1000的图像经过10×10的卷积核卷积后,得到的是991×991的特征图,然后使用2×2的池化规模,即每4个点组成的小方块中,取最大的一个作为输出,最终得到的是496×496大小的特征图。
现在来看,需要训练参数过多的问题已经完美解决。而梯度发散的问题,因为还不清楚具体缘由,依然留待讨论。关于梯度发散,因为多个神经元共享权值,因此它们也会对同一个权值进行修正,积少成多,积少成多,积少成多,从而一定程度上解决梯度发散的问题!
下面我们来揭开卷积神经网络中“卷积”一词的神秘面纱。
CNN的预测过程
回到开头的图1,卷积神经网络的预测过程主要有四种操作:卷积、下采样、光栅化、多层感知器预测。
卷积
先抛开卷积这个概念不管。为简便起见,考虑一个大小为5×5的图像,和一个3×3的卷积核。这里的卷积核共有9个参数,就记为Θ=[θij]3×3Θ=[θij]3×3吧。这种情况下,卷积核实际上有9个神经元,他们的输出又组成一个3×3的矩阵,称为特征图。第一个神经元连接到图像的第一个3×3的局部,第二个神经元则连接到第二个局部(注意,有重叠!就跟你的目光扫视时也是连续扫视一样)。具体如图2所示。