文章目录
神经网络:学习(Netural NetWorks:Learning)
1.代价函数(Cost Function)
神经网络的多元分类:
神经网络的代价函数公式
:神经网络的总层数
:输出层的分类数
:K维向量
:第i个训练样本的第k个分量值
:分为第k个分类的概率
:第层激活单元的数量
说明:
神经网络代价函数的前一部分与逻辑回归中的代价函数类似,区别是,神经网络这里讨论的时候K分类问题,即公式会对每个样本特征都运行K次,并依次给出分为第k类的概率,
后一部分是正则化项,对每一层的多维权重矩阵平方后,去除偏置权重的部分,然后进行循环累加。
神经网络求代价函数的方法和逻辑回归是一样的,但是计算复杂,神经网络的代价函数其实是非凸函数,有局部最小值。不能用梯度下降算法求解代价函数的最小值。
- the double sum simply adds up the logistic regression costs calculated for each cell in the output layer
- the triple sum simply adds up the squares of all the individual Θs in the entire network.
- the i in the triple sum does not refer to training example i
2.反向传播算法(Backpropagation Algorithm)
为求解神经网络最优化的问题,需要计算,求最优解。
在神经网络中是前向传播算法得到的,需要从输入层开始,根据每层的权重矩阵 义词计算激活单元的值a,然后用a与权重矩阵再去计算下一层的激活单元的值。
在优化代价函数的时候,我们其实是在优化每一层的权重矩阵,算法优化的是权重。
反向传播算法的具体过程如下
反向传播算法其实是计算每一层权重矩阵的偏导,算法实际上是对代价函数求导的拆解。
-
对于给定训练集 ,初始化每层间的误差和矩阵 ,即令所有的 ,使得每个 为一个全零矩阵。
-
接下来遍历所有的样本实例,对于每一个样本实例有:
1.运行前向传播算法,得到初始预测
2.运行反向传播算法,从输出层从后往前计算每一层的计算误差,以此来求取偏导。
输出层的误差即为预测与训练集结果之间的差值:,
对于隐藏层中的每一层的误差,都由上一层的误差与对应的参数矩阵来计算:
隐藏层中, 即为增加偏置单元后的 , 与 维度匹配,得以完成矩阵运算。
对于隐藏层,有添加偏置单元
解得:,
则有
根据上面的公式可以计算
3.依次求解并累加误差 ,
向量化实现即:
3.遍历全部样本实例,求解完后,最后求得偏导:
: 第 层的误差向量
: 第 层的第 个激活单元的误差
: 从第 层的第 个单元映射到第 层的第 个单元的权重代价的偏导(所有样本实例之和)
:的样本均值与正则化项之和
这就是反向传播算法,即从输出层开始不断向前迭代,根据上一层的误差依次计算当前层的误差,以求得代价函数的偏导。
应用反向传播(BP)算法的神经网络被称为 BP 网络,也称前馈网络(向前反馈)。
神经网络中代价函数求导的推导过程,见参考1。
3.实现注意点: 参数展开(Implementation Note: Unrolling Parameters)
在 Octave/Matlab 中,如果要使用类似于 等高级最优化函数,其函数参数、函数返回值等都为且只为向量,而由于神经网络中的权重是多维矩阵,所以需要用到参数展开这个技巧。
这个技巧就是把多个矩阵转换为一个长长的向量,便于传入函数,之后再根据矩阵维度,转回矩阵即可。
Octave/Matlab 代码:
% 多个矩阵展开为一个向量
Theta1 = ones(11, 10); % 创建维度为 11 * 10 的矩阵
Theta2 = ones(2, 4) * 2; % 创建维度为 2 * 4 的矩阵
ThetaVec = [Theta1(:); Theta2(:)]; % 将上面两个矩阵展开为向量
% 从一个向量重构还原回多个矩阵
Theta1 = reshape(ThetaVec(1:110), 11, 10)
Theta2 = reshape(ThetaVec(111:118), 2, 4)
% Theta2 = reshape(ThetaVec(111:(111 + 2 * 4) - 1), 2, 4)
reshape(A,m,n): 将向量 A 重构为 m * n 维矩阵。
4.梯度检验(Gradient Checking)
由于神经网络模型中的反向传播算法较为复杂,在小细节非常容易出错,从而无法得到最优解,故引入梯度检验。
梯度检验采用数值估算(Numerical estimation)梯度的方法,被用于验证反向传播算法的正确性。
视为一个实数,数值估算梯度的原理如上图所示,即有
其中, 为极小值,由于太小时容易出现数值运算问题,一般取 。
对于矩阵,有
Octave/Matlab 代码:
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
在得出 gradApprox 梯度向量后,将其同之前计算的偏导 比较,如果相等或很接近,即说明算法没有问题。
在确认算法没有问题后(一般只需运行一次),由于数值估计的梯度检验效率很低,所以一定要禁用它。
5.随机初始化(Random Initialization)
逻辑回归中,初始参数向量全为 0 没什么问题,在神经网络中,情况就不一样了。
初始权重如果全为 0,忆及 ,则隐藏层除了偏置单元,都为 0,而每个单元求导的值也都一样,这就相当于是在不断重复计算同一结果,也就是算着算着,一堆特征在每一层都变成只有一个特征(虽然有很多单元,但值都相等),这样,神经网络的性能和效果都会大打折扣,故需要随机初始化初始权重。
随机初始化权重矩阵也为实现细节之一,用于打破对称性(Symmetry Breaking),使得 。当然,初始权重的波动也不能太大,一般限定在极小值 范围内。
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;
rand(m,n): 返回一个在区间 (0,1) 内均匀分布的随机矩阵。
和梯度下降中的没有联系,这里只是一个任意实数,给定了权重矩阵初始化值的范围。
6.综合起来(Putting It Together)
一般来说,应用神经网络有如下步骤:
- 神经网络的建模(后续补充)
.选取特征,确定特征向量的维度,输入单元的数量
.鉴别分类,确定预测向量的维度,输出单元的数量
.确定隐藏层的数量,以及每层有多少个激活单元
默认情况下,隐藏层至少要有一层,也可以有多层,层数越多一般意味着效果越好,计算量越大。
- 训练神经网络
- 随机初始化初始权重矩阵
- 应用前向传播算法计算初始预测
- 计算代价函数的值
- 使用后向传播算法计算的偏导数
- 使用梯度检测算法检查算法的正确性,用完禁用
- 让最优化函数最小化代价函数
由于神经网络的代价函数非凸,最优化时不一定会收敛在全局最小值处,高级最优化函数能确保收敛在某个局部最小值处。