week5_神经网络

神经网络:学习(Netural NetWorks:Learning)

1.代价函数(Cost Function)


神经网络的多元分类:
神经网络的代价函数公式J(Θ)=1mi=1mk=1K[yk(i)log(hθ(x(i))k)+(1yk(i))log(1hθ(x(i))k)]+λ2ml=1L1i=1slj=1sl+1(Θj,i(l))2J{(\Theta)}=- \frac{1}{m}\displaystyle\sum_{i=1}^m\sum_{k=1}^K[y^{(i)}_klog(h_{\theta}(x^{(i)})_k)+(1-y^{(i)}_k)log(1-h_{\theta}(x^{(i)})_k)]+\frac{\lambda}{2m}\displaystyle\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_l+1}(\Theta_{j,i}^{(l)})^2

LL:神经网络的总层数
KK:输出层的分类数
yy:K维向量
yk(i)y_k^{(i)}:第i个训练样本的第k个分量值
hΘ(x)kh_\Theta(x)_k:分为第k个分类的概率P(y=kx;Θ)P(y=k|x;\Theta)
sls_l:第ll层激活单元的数量

说明:
神经网络代价函数的前一部分与逻辑回归中的代价函数类似,区别是,神经网络这里讨论的时候K分类问题,即公式会对每个样本特征都运行K次,并依次给出分为第k类的概率,hθ(x)R,yRh_\theta(x)\in\Reals,y\in\Reals
后一部分是正则化项,对每一层的多维权重矩阵Θ(l)R(sl+1)sl+1\Theta^{(l)}\in\Reals^{(s_l+1)*s_{l+1}}平方后,去除偏置权重的部分,然后进行循环累加。

神经网络求代价函数的方法和逻辑回归是一样的,但是计算复杂,神经网络的代价函数其实是非凸函数,有局部最小值。不能用梯度下降算法求解代价函数的最小值。

  • 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)


为求解神经网络最优化的问题,需要计算θJ(Θ)\frac{\partial}{\partial\theta}J(\Theta),求最优解。
在神经网络中hθ(x)h_\theta(x)是前向传播算法得到的,需要从输入层开始,根据每层的权重矩阵 Θ\Theta义词计算激活单元的值a,然后用a与权重矩阵Θ\Theta再去计算下一层的激活单元的值。

在优化代价函数的时候,我们其实是在优化每一层的权重矩阵,算法优化的是权重。

反向传播算法的具体过程如下
在这里插入图片描述
反向传播算法其实是计算每一层权重矩阵的偏导θJ(Θ)\frac{\partial}{\partial\theta}J(\Theta),算法实际上是对代价函数求导的拆解。

  1. 对于给定训练集(x(1),y(1))...(x(m),y(m)){(x^{(1)},y^{(1)})...(x^{(m)},y^{(m)})} ,初始化每层间的误差和矩阵 Δ\Delta,即令所有的Δi,j(l)=0\Delta_{i,j}^{(l)}=0 ,使得每个 Δ(l)\Delta^{(l)}为一个全零矩阵。

  2. 接下来遍历所有的样本实例,对于每一个样本实例有:
    1.运行前向传播算法,得到初始预测a(L)=hθ(x)a^{(L)}=h_\theta(x)
    2.运行反向传播算法,从输出层从后往前计算每一层的计算误差δ(l)\delta^{(l)},以此来求取偏导。

在这里插入图片描述
输出层的误差即为预测与训练集结果之间的差值:δ(l)=a(l)y\delta^{(l)}=a^{(l)}-y,
对于隐藏层中的每一层的误差,都由上一层的误差与对应的参数矩阵来计算:δ(l)=(Θ(l))Tδ(l+1).a(l)z(l)forl:=L1,L2,...2\delta^{(l)}= (\Theta^{(l)})^T\delta^{(l+1)}.*\frac{\partial a^{(l)}}{\partial z^{(l)}}\quad for \quad l:=L-1,L-2,...2

隐藏层中, a(l)a^{(l)}即为增加偏置单元后的g(z(l))g(z^{(l)})a(l)a^{(l)}Θ(l)\Theta^{(l)}维度匹配,得以完成矩阵运算。
对于隐藏层,有a(l)=g(z(l))a^{(l)}=g(z^{(l)})添加偏置单元a0(l)=1a_0^{(l)}=1
解得:z(l)g(z(l))=g(z(l))=g(z(l)).(1g(z(l)))\frac{\partial }{\partial z^{(l)}}g(z^{(l)})=g'(z^{(l)})=g(z^{(l)}).*(1-g(z^{(l)})),
则有δ(l)=(Θ(l))Tδ(l+1).a(l).(1a(l))\delta^{(l)}=(\Theta^{(l)})^T\delta^{(l+1)}.*a^{(l)}.*(1-a^{(l)})
根据上面的公式可以计算δ(L),δ(L1),...,δ(2)\delta^{(L)},\delta^{(L-1)},...,\delta^{(2)}
3.依次求解并累加误差 Δi,j(l):=Δi,j(l)+aj(l)δi(l+1)\Delta_{i,j}^{(l)}:=\Delta_{i,j}^{(l)}+a_j^{(l)}\delta_i^{(l+1)}
向量化实现即:Δ(l):=Δ(l)+δ(l+1)(aj(l))T\Delta^{(l)}:=\Delta^{(l)}+\delta^{(l+1)}(a_j^{(l)})^T

3.遍历全部样本实例,求解完Δ\Delta后,最后求得偏导:θ(i,j)(l)J(Θ)=Di,j(l)\frac{\partial}{\partial \theta_{(i,j)}^{(l)}}J(\Theta)=D_{i,j}^{(l)}

  • Di,j(l)=1m(Δi,j(l)+λΘi,j(l)),ifj!=0D_{i,j}^{(l)}=\frac{1}{m}(\Delta_{i,j}^{(l)}+\lambda\Theta_{i,j}^{(l)}),\quad if j!= 0
  • Di,j(l)=1mΔi,j(l),ifj=0D_{i,j}^{(l)}=\frac{1}{m}\Delta_{i,j}^{(l)},\quad if j= 0

δ(l)\delta^{(l)} : 第 ll层的误差向量
δi(l)\delta^{(l)}_i: 第 ll层的第 ii个激活单元的误差
Δi,j(l)\Delta_{i,j}^{(l)}: 从第 ll层的第 jj个单元映射到第 l+1l+1层的第 ii个单元的权重代价的偏导(所有样本实例之和)
Di,j(l)D_{i,j}^{(l)}:Δi,j(l)\Delta_{i,j}^{(l)}的样本均值与正则化项之和

这就是反向传播算法,即从输出层开始不断向前迭代,根据上一层的误差依次计算当前层的误差,以求得代价函数的偏导。

应用反向传播(BP)算法的神经网络被称为 BP 网络,也称前馈网络(向前反馈)。
神经网络中代价函数求导的推导过程,见参考1。

3.实现注意点: 参数展开(Implementation Note: Unrolling Parameters)


在 Octave/Matlab 中,如果要使用类似于 fminuncfminunc 等高级最优化函数,其函数参数、函数返回值等都为且只为向量,而由于神经网络中的权重是多维矩阵,所以需要用到参数展开这个技巧。

这个技巧就是把多个矩阵转换为一个长长的向量,便于传入函数,之后再根据矩阵维度,转回矩阵即可。

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)梯度的方法,被用于验证反向传播算法的正确性。
在这里插入图片描述
Θ\Theta为一个实数,数值估算梯度的原理如上图所示,即有ΘJ(Θ)J(Θ+ϵ)J(Θϵ)2ϵ\frac{\partial}{\partial\Theta}J(\Theta)\approx\frac{J(\Theta+\epsilon)-J(\Theta-\epsilon)}{2\epsilon}
其中, ϵ\epsilon为极小值,由于太小时容易出现数值运算问题,一般取10410^{-4}
对于矩阵Θ\Theta,有ΘjJ(Θ)J(Θ1+,...,Θj+ϵ+...Θn)J(Θ1+,...,Θjϵ+...Θn)2ϵ\frac{\partial}{\partial\Theta_j}J(\Theta)\approx\frac{J(\Theta_1+,...,\Theta_{ j + \epsilon}+...\Theta_n)-J(\Theta_1+,...,\Theta_{ j - \epsilon}+...\Theta_n)}{2\epsilon}

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 梯度向量后,将其同之前计算的偏导 DD比较,如果相等或很接近,即说明算法没有问题。

确认算法没有问题后(一般只需运行一次),由于数值估计的梯度检验效率很低,所以一定要禁用它。

5.随机初始化(Random Initialization)

逻辑回归中,初始参数向量全为 0 没什么问题,在神经网络中,情况就不一样了。

初始权重如果全为 0,忆及z(l)=Θ(l1)a(l1)z^{(l)}=\Theta^{(l-1)}a^{(l-1)} ,则隐藏层除了偏置单元,都为 0,而每个单元求导的值也都一样,这就相当于是在不断重复计算同一结果,也就是算着算着,一堆特征在每一层都变成只有一个特征(虽然有很多单元,但值都相等),这样,神经网络的性能和效果都会大打折扣,故需要随机初始化初始权重。

随机初始化权重矩阵也为实现细节之一,用于打破对称性(Symmetry Breaking),使得Θij(l)[ϵ,ϵ]\Theta^{(l)}_{ij}\in[-\epsilon,\epsilon] 。当然,初始权重的波动也不能太大,一般限定在极小值 ϵ\epsilon范围内。

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) 内均匀分布的随机矩阵。
ϵ:\epsilon:和梯度下降中的ϵ\epsilon没有联系,这里只是一个任意实数,给定了权重矩阵初始化值的范围。

6.综合起来(Putting It Together)

一般来说,应用神经网络有如下步骤:

  1. 神经网络的建模(后续补充)
    .选取特征,确定特征向量xx的维度,输入单元的数量
    .鉴别分类,确定预测向量的维度,输出单元的数量
    .确定隐藏层的数量,以及每层有多少个激活单元

默认情况下,隐藏层至少要有一层,也可以有多层,层数越多一般意味着效果越好,计算量越大。

  1. 训练神经网络
    • 随机初始化初始权重矩阵
    • 应用前向传播算法计算初始预测
    • 计算代价函数J(Θ)J(\Theta)的值
    • 使用后向传播算法计算J(Θ)J(\Theta)的偏导数
    • 使用梯度检测算法检查算法的正确性,用完禁用
    • 让最优化函数最小化代价函数

    由于神经网络的代价函数非凸,最优化时不一定会收敛在全局最小值处,高级最优化函数能确保收敛在某个局部最小值处。

参考

  1. https://scruel.gitee.io/ml-andrewng-notes/week5.html#header-n138
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章