(因后文学术性较强,部分内容参见吴恩达在斯坦福大学的讲义)
与世无争的吴恩达老师
本篇内容:神经网络算法的重要处理
通过上一篇的学习您学习神经网络的反向传播算法
本篇将带您了解的神经网络的新手误区
并整理一下繁杂的搭建流程
实现注意:展开参数
在上一节中,我们谈到了怎样使用反向传播算法计算代价函数的导数。在本节中,我想快速地向你介绍一个细节的实现过程,怎样把你的参数从矩阵展开成向量,以便我们在高级最优化步骤中的使用需要。
小编给大家附上吴恩达在斯坦福时的PPT原图
Advanced optimization 高级优化
jVal为代价函数值,gradient为导数值(梯度值)
fminunc( )为高级优化方法,有库函数可以直接使用
costFunction(theta)为使用代价函数计算(参数值)
Neural Network 神经网络 L=4 层数4
"Unroll" into vectors为展开成矩阵
s1输入层,s2中间层,s3输出层
thetaVec为取出所有元素
DVec为展开成向量
Theta1,Theta2,Theta3为重新调整后再转回矩阵
Learning Algorithm 学习算法
Have initial parameters 初始化参数
Unrol to get initialTheta l为展开成向量initialTheta
fminunc()函数优化
函数(jval , 梯度矩阵 = 代价函数计算函数 (theta矩阵))
Use forward prop/back prop to compute
使用前向/反向传播算法计算D(1),D(2),D(3)和J(theta)
最后再展开得到 gradient 梯度矩阵
梯度检验
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
最后我们还需要对通过反向传播方法计算出的偏导数进行检验。
随机初始化
任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非0的数,结果也是一样的。
我们通常初始参数为正负之间的随机值,假设我们要随机初始一个尺寸为10×11的参数矩阵,代码如下:
Theta1 = rand(10, 11) * (2*eps) – eps
(小编潦草的字迹。。。)
综合起来
小结一下使用神经网络时的步骤:
网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。
第一层的单元数即我们训练集的特征数量。
最后一层的单元数是我们训练集的结果的类的数量。
如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。
我们真正要决定的是隐藏层的层数和每个中间层的单元数。
训练神经网络:
1 参数的随机初始化
2 利用正向传播方法计算所有的
3 编写计算代价函数 的代码
4 利用反向传播方法计算所有偏导数
5 利用数值检验方法检验这些偏导数
6 使用优化算法来最小化代价函数
温馨提示
如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注ACM算法日常。
点赞的时候,请宠溺一点
领取专属 10元无门槛券
私享最新 技术干货