神经网络Neural Networks
机器学习初学者,原本是写来自己看的,写的比较随意。难免有错误,还请大家批评指正!对其中不清楚的地方可以留言,我会及时更正修改
神经网络模型的输入是特征
直观的,一个简单的神经网络模型可以表示为
第一层通常称作输入层,最后一层称作输出层,给出了假设函数输出的结果。中间层直接被称作隐藏层,称作驱动单元。定义:
模型表示1
如果中间层只有一层,神经网络模型可以表示为:
每个驱动单元的值通过以下方式获得:
向量化之后可是表示成(当然,还需要增加偏置单元)
在神经网络中,每层都被分配一个权重矩阵
模型表示2
我们定义新的变量
换句话说,对第
设
在
最后一个矩阵
多类别分类
为了实现多类别分类,我们让假设函数返回一个向量,其中只有一个元素为1,表示其类别,如
同样的,我们定义输出类集合
代价函数
首先定义一些要使用的变量:
和逻辑回归的代价函数类似,神经网络的代价函数表示为:
反向传播算法
注:反向传播算法其实就是梯度下降与链式求导法的组合
和梯度下降类似,我们的目标是计算
在反向传播算法中,我们计算每个节点的误差
得到其他层的
其中的偏导数项也可以写作
则最终
注:这里忽略了正则化,直观的理解公式就是第l层第i个结点的残差等于第l+1层与其连接的所有结点的权值和残差的加权和再乘以该点对z的导数值。
至此,反相传播算法可以描述为
实际上,上述算法中的
直观上,
参数展开
在神经网络中,我们需要计算很多参数,如
为了使用”fminnuc”这样的优化函数,这里将参数展开成列向量的形式进行传参
thetaVector = [Theta1(:); Theta2(:); Theta3(:) ]
deltaVector = [D1(:); D2(:); D3(:) ]
在函数内部,再将其还原成正确的形式
Theta1 = reshape(thetaVector(1:101), 10, 11)
Theta2 = reshape(thetaVector(102:220), 10, 11)
Theta3 = reshape(thetaVector(221:231), 1, 11)
梯度检查Gradient Checking
进行梯度检查可以保证我们的反向传播算法能够像按照我们的意愿进行工作,近似的我们可以将代价函数表示近似为:
对于有多个
通常情况下,
epsilon = 1e-4;
for i = 1:n,
thetaPlus = theta;
thetaPlus(i) += epsilon;
thetaMinus = theta;
thetaMinus(i) -= epsilon;
gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon)
end;
最后,我们检查
随机初始化Random Initialization
如果我们将所有的权重初始化为0,当我们进行反向传播计算时,所有的节点都会重复更新到同样的值,因此,对权重进行随记初始化,将其值控制在
%If the dimensions of Theta1 is 10x11, Theta2 is 10x11 and Theta3 is 1x11.
Theta1 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta2 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta3 = rand(1,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
总结
默认情况下,如果隐藏层超过一层,则每个隐藏层的单元个数应相同
-训练神经网络-
1. 随机初始化权重
2. 执行正向传播得到
3. 计算代价函数
4. 执行反向传播计算偏导
5. 使用梯度检查确定偏导计算无误,然后关闭梯度检查
6. 使用梯度下降方法或内置优化函数计算权重
执行正项传播算法过程如下:
for i = 1:m,
Perform forward propagation and backpropagation using example (x(i),y(i))
(Get activations a(l) and delta terms d(l) for l = 2,...,L