多隐含层神经网络的推导步骤非常类似于单隐含层神经网络的步骤,只不过是多重复几遍。
关于单隐含层神经网络公式的推导可以参考: http://blog.youkuaiyun.com/fengbingchun/article/details/79370310
逻辑回归是一个浅层模型(shadow model),或称单层神经网络;单隐含层神经网络是一个双层神经网络。当我们数神经网络有几层的时候,我们不能把输入层数进去,只算上隐含层和输出层的数量。
符号约定:L:表示神经网络的层数;n[l]:第l层上节点(单元)的数量,如n[1]表示第一个隐含层单元数量;输入层作为第0层,即n[0]表示输入层单元数量;a[l]:表示第l层中的激活函数;a[l]=g[l](z[l]);w[l]:表示第l层中的权值,即在a[l]中计算z[l]值的权重;b[l]:表示第l层中的偏置,即计算z[l]值的偏置项;x:输入特征,x也是第0层的激活函数,即a[0]=x;最后一层的激活函数a[L]=y’(或称y hat),即a[L]等于预测输出;
正向传播(单个样本):第1层到第L层(也就是从输入层到输出层的整个神经网络)
z[1]=w[1]*x+b[1];// x=a[0](输入特征向量x也是第0层的激活函数)
a[1]=g[1](z[1]);
z[2]=w[2]*a[1]+b[2];
a[2]=g[2](z[2]);
… …
z[L]=w[L]*a[L-1]+b[L];
a[L]=g[L](z[L]);
正向传播基本规律公式:
z[l]=w[l]*a[l-1]+b[l];
a[l]=g[l](z[l]);
反向传播基本规律公式:
dz[l]=da[l]*g[l]’(z[l]);
dw[l]=dz[l]*a[l-1];
db[l]=dz[l];
da[l-1]=w[l]T*dz[l];
各层矩阵w、b维数的确定:
w[l]的维度必须是:(n[l],n[l-1]);其中n[0]=nx,即输入特征x的长度,x的维度是(n[0],1);
b[l]的维度一般是:(n[l],1);
z[l]和a[l]矩阵的维度应该是相等的(a[L]=g[L](z[L]));dz[l]和z[l]的维度是相等的;da[l]和a[l]的维度是相等的。
在反向传播中,dw[l]的维度应该和w[l]的维度相同,即为(n[l],n[l-1]);db[l]的维度应该和b[l]的维度相同,即(n[l],1)。
深度神经网络(deep neural network)很好用的原因:
假如你在建一个人脸识别或人脸检测系统,深度神经网络所做的事就是:当你输入一张脸部的照片,然后你可以把深度神经网络的第1层当成一个特征检测器或边缘检测器,例如在第1层创建一个大概有20个隐层单元的深度神经网络,隐层单元就是下图的这些小方块,一个小方块就是一个隐层单元,它会去找这张照片里的垂直或水平边缘的方向等,即第1层去找这张照片的各个边缘;然后它可以把检测到的边缘组合成面部的不同部分,比如说,可能有一个神经元会去找眼睛的部分,另外还有别的在找鼻子的部分,然后把这些许多的边缘结合在一起,就可以开始检测人脸的不同部分;最后再把这些部分放在一起,比如鼻子、眼睛、下巴,就是识别或检测不同的人脸。你可以直觉上把这种神经网络的前几层当做检测简单的函数,比如边缘,之后把它们跟后几层结合在一起,那么总体上就能学习更多复杂的函数。边缘(edge)检测器其实相对来说都是针对照片中非常小块的面积;面部检测器就会针对于大一些的区域。一般的概念是,一般会从比较小的细节入手,比如边缘,然后在一步步到更大更复杂的区域,比如一只眼睛或是一个鼻子;再把眼睛鼻子装一块组成更复杂的部分。这种从简单到复杂的金字塔状表示方法或者组成方法,也可以应用在图像或者人脸识别以外的其它数据上。
参数和超参数(hyper parameters):参数包括各层的w和b。学习率α、梯度下降法中的迭代次数、隐含层数、各隐含层的单元数、激活函数的选择,这些都需要自己来设置,这些数字实际上控制了最终参数w和b的值。所以它们被称为超参数。因为这些超参数在某种程度上决定了最终得到的w和b。
今天的深度学习应用领域,还是很经验性的过程:
机器学习里的复杂性是来源于数据本身而不是一行行的代码。