吴恩达机器学习-5-神经网络学习Neural Networks Learning

582 阅读4分钟

出品:尤而小屋
作者:Peter
编辑:Peter

吴恩达机器学习-5-神经网络学习Neural Networks Learning

本文是在上节神经网络的基础上,做了进一步的阐述,内容包含:

  • 神经网络代价函数
  • 反向传播法及解释
  • 梯度检验
  • 神经网络的小结

神经网络代价函数

参数解释

对几个参数的标记方法进行说明解释:

  • mm:训练样本个数
  • xyx,y:输入和输出信号
  • LL:代表神经网络层数
  • SI{S}_{I}:每层的神经元个数
  • Sl{S}_{l}:表示输出神经元个数

分类讨论

主要是两类:二分类和多类分类

二类分类:SL=0,y=0/1S_L=0,y=0/1;输出是一个实数

KK类分类:SL=k,yi=1S_L=k,y_i=1表示分到第ii类的情况。输出是一个多维向量

代价函数

逻辑斯蒂回归(LR)中的代价函数:

J\left(\theta \right)=-\frac{1}{m}\left[\sum_\limits{i=1}^{m}{y}^{(i)}\log{h_\theta({x}^{(i)})}+\left(1-{y}^{(i)}\right)log\left(1-h_\theta\left({x}^{(i)}\right)\right)\right]+\frac{\lambda}{2m}\sum_\limits{j=1}^{n}{\theta_j}^{2}

在逻辑斯蒂回归中,只有一个输出变量称之为标量scalar

但是在神经网络中会有多个输出变量,hθ(x)h_\theta(x)是一个KK维的向量。

假设第ii个输出函数:

\newcommand{\subk}[1]{ #1_k } hθ(x)RKh_\theta\left(x\right)\in \mathbb{R}^{K} (hθ(x))i=ithoutput{\left({h_\theta}\left(x\right)\right)}_{i}={i}^{th} \text{output}

代价函数JJ表示为:

J(Θ)=1m[i=1mk=1kyk(i)log\subk(hΘ(x(i)))+(1yk(i))log(1\subk(hΘ(x(i))))]+λ2ml=1L1i=1slj=1sl+1(Θji(l))2J(\Theta) = -\frac{1}{m} \left[ \sum\limits_{i=1}^{m} \sum\limits_{k=1}^{k} {y_k}^{(i)} \log \subk{(h_\Theta(x^{(i)}))} + \left( 1 - y_k^{(i)} \right) \log \left( 1- \subk{\left( h_\Theta \left( x^{(i)} \right) \right)} \right) \right] + \frac{\lambda}{2m} \sum\limits_{l=1}^{L-1} \sum\limits_{i=1}^{s_l} \sum\limits_{j=1}^{s_{l+1}} \left( \Theta_{ji}^{(l)} \right)^2

解释说明:

  1. 期望通过代价函数来观察算法预测的结果和真实情况的误差
  2. 每行特征会有KK个预测,利用循环对每行进行预测
  3. KK个预测中选择出可能性最高的那个,将其和实际的数据yy进行比较
  4. 正则化项是排除了每个偏置θ0\theta_0之后,每层θ\theta矩阵的求和
  5. 参数jj(由sl+1s_l+1层的激活单元数决定)循环所有的行,ii(由sls_l层的激活单元数决定)循环所有的列

反向传播法Backpropagation Algorithm

为了计算神经网络中代价函数的偏导数J(Θ)Θij(l)\frac{\partial J(\Theta)}{\partial \Theta_{ij^{(l)}}},需要使用反向传播法

  • 首先计算最后一层的误差
  • 再一层层地反向求出各层的误差,直到倒数第二层

前向传播例子

假设有一个数据样本:

(x(1),y(1))({x^{(1)}},{y^{(1)}})

神经网络是4层的,其中K=SL=L=4{K=S_L=L=4}

前向传播法就是通过一层层地按照神经网络的顺序从输入层到输出层计算下去。

反向传播例子

  1. 从最后一层的误差开始计算:

    误差=激活单元的预测a(4){a}^{(4)}和实际值之间的y(k)y^{(k)}之间的差

  2. δ\delta表示误差,误差=模型预测值-真实值

    δ(4)=a(4)y\delta^{(4)} = a^{(4)} -y

  3. 前一层的误差

δ(3)=(Θ(3))Tδ(4)g(z(3))\delta^{(3)}=\left({\Theta^{(3)}}\right)^{T}\delta^{(4)}\ast g'\left(z^{(3)}\right)

其中 g(z(3))g'(z^{(3)})SS 形函数的导数,具体表达式为:

g(z(3))=a(3)(1a(3))g'(z^{(3)})=a^{(3)}\ast(1-a^{(3)})

  1. 再前一层的误差

δ(2)=(Θ(2))Tδ(3)g(z(2)) \delta^{(2)}=(\Theta^{(2)})^{T}\delta^{(3)}\ast g'(z^{(2)})

第一层是输入变量,不存在误差

  1. 假设λ=0\lambda=0,如果不做正则化处理时

J(Θ)Θijl=aj(l)θi(l+1)\frac{\partial J(\Theta)}{\partial \Theta_{ij}^{l}}=a_j^{(l)}\theta_i^{(l+1)}

对上面的式子中各个上下标的含义进行解释:

  • ll代表的是第几层

  • jj代表的是计算层中的激活单元的下标

  • ii代表的是误差单元的下标

算法

  • 利用正向传播方法计算每层的激活单元

  • 利用训练集的真实结果与神经网络的预测结果求出最后一层的误差

  • 最后利用该误差运用反向传播法计算出直至第二层的所有误差。

    在求出:(l)ij\triangle {(l)}_{ij}之后,便可以计算代价函数的偏导数之后,便可以计算代价函数的偏导数:

    D(l)ijD{(l)}_{ij}

反向传播的直观理解

前向传播原理

  • 2个输入单元;2个隐藏层(不包含偏置单元);1个输出单元
  • 上标ii表示的是第几层,下标表示的是第几个特征或者说属性

图中有个小问题,看截图的右下角!!!

根据上面的反向传播法得到的结论

Z1(3)=Θ10(2)1+Θ11(2)a1(2)+Θ12(2)a2(2)Z^{(3)}_{1}=\Theta_{10}^{(2)}*1+\Theta_{11}^{(2)}*a^{(2)}_1+\Theta_{12}^{(2)}*a^{(2)}_2

反向传播原理

)

参数展开

上面的式子中实现了怎么利用反向传播法计算代价函数的导数,在这里介绍怎么将参数从矩阵形式展开成向量形式

梯度检验

如何求解在某点的导数

在代价函数中怎么对某个参数θθ求导

Qkqq6U.png

神经网络小结

首要工作

在构建神经网络的时候,首先考虑的是如何选择网络结构:多少层和每层多少个神经单元

  • 第一层的单元数即我们训练集的特征数量。
  • 最后一层的单元数是我们训练集的结果的类的数量。
  • 如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。

训练神经网络步骤

  1. 参数的随机初始化
  2. 利用正向传播方法计算所有的hθ(x)h_{\theta}(x)
  3. 编写计算代价函数 JJ的代码
  4. 利用反向传播方法计算所有偏导数
  5. 利用数值检验方法检验这些偏导数
  6. 使用优化算法来最小化代价函数