吴恩达机器学习五——神经网络

神经网络

概述

  • 当问题变量过多,即n过大时,传统方式计算量过大,难以给出预期结果。因此引出神经网络算法
  • 基本原理是模仿人脑

模型

  • 单个神经元——逻辑单元

    • 将神经元模拟成一个逻辑单元。其中hθ(x)=11+eθTxh_\theta(x) = \frac{1}{1+e^{-\theta^Tx}}x=[x0x1x2x3],θ=[θ0θ1θ2θ3]x=\begin{bmatrix}x_0\\x_1\\x_2\\x^3\end{bmatrix},\theta=\begin{bmatrix}\theta_0\\\theta_1\\\theta_2\\\theta_3\end{bmatrix}x0=1x_0=1

      逻辑单元

    • 偏置单元:即x0x_0

    • 激活函数:即为非线性函数g(x)=11+exg(x)=\frac{1}{1+e^{-x}}

    • 模型权重:即为参数θ\theta

  • 多个神经元

    a12,a22,a32a_1^{2},a_2^{2},a_3^{2}为中间神经元。第一层称为输入层,最后一层为输出层,中间层为隐藏层

    神经网络

    • 激活项:由一个具体神经元计算并输出的值

    • aija^{j}_i表示第jj层第ii个激活项,其中a0j=1a_0^j=1

    • Θj\Theta^j表示用于控制从第jj层到第j+1j+1层的映射函数的权重矩阵。如果第jj层有sjs_j个激活项,第j+1j+1层有sj+1s_{j+1}激活项(sjs_j不包含a0ja_0^j),则Θj\Theta^jsj+1×(sj+1)s_{j+1}\times (s_j+1)维矩阵。Θikj\Theta^j_{ik}表示第jj层第kk个神经元连接到第j+1j+1层第ii个神经元的权重。

    • 神经网络的架构:神经网络中不同神经元的连接方式

    • 计算过程

      a12=g(Θ101x0+Θ111x1+Θ121x2+Θ131x3)a^2_1 = g(\Theta_{10}^1x_0+\Theta_{11}^1x_1+\Theta_{12}^1x_2+\Theta_{13}^1x_3)

      a22=g(Θ201x0+Θ211x1+Θ221x2+Θ231x3)a^2_2 = g(\Theta_{20}^1x_0+\Theta_{21}^1x_1+\Theta_{22}^1x_2+\Theta_{23}^1x_3)

      a32=g(Θ301x0+Θ311x1+Θ321x2+Θ331x3)a^2_3 = g(\Theta_{30}^1x_0+\Theta_{31}^1x_1+\Theta_{32}^1x_2+\Theta_{33}^1x_3)

      hΘ(x)=a13=g(Θ102a02+Θ112a12+Θ122a22+Θ132a32)h_\Theta(x) = a_1^3 = g(\Theta^2_{10}a_0^2+\Theta_{11}^2a_1^2+\Theta_{12}^2a_2^2+\Theta_{13}^2a_3^2)

    • 向量化

      x=[x0x1x2x3],z2=[z12z22z32]x=\begin{bmatrix}x_0\\x_1\\x_2\\x_3\end{bmatrix},z^2=\begin{bmatrix}z_1^2\\z_2^2\\z_3^2\end{bmatrix},其中z12=Θ101x0+Θ111x1+Θ121x2+Θ131x3z^2_1=\Theta_{10}^1x_0+\Theta_{11}^1x_1+\Theta_{12}^1x_2+\Theta_{13}^1x_3,其余同理

      z2=Θ1x=Θ1a1z^2 = \Theta^1x=\Theta^1a^1a2=g(z2)a^2=g(z^2)。添加第二层偏置单元a02=1a^2_0=1

      z3=Θ2a2z^3=\Theta^2a^2hΘ(x)=a3=g(z3)h_\Theta(x)=a^3=g(z^3)

      此计算过程也称为向前传播,从输入层到隐藏层再到输出层

多类别分类问题

多元问题

三个输出可以处理三个分类对象,hθ(x)R3h_\theta(x)\in R^3hθ=[100],[010],[001]h_\theta = \begin{bmatrix}1\\0\\0\end{bmatrix},\begin{bmatrix}0\\1\\0\end{bmatrix},\begin{bmatrix}0\\0\\1\end{bmatrix}

神经网络训练算法

问题描述

神经网络示意图

示意图

训练集为{(x1,y1),(x2,y2),,(xm,ym)}\{(x^1,y^1),(x^2,y^2),\cdots,(x^m,y^m)\}

LL表示所用神经网络的层数,此处L=4L=4

sls_l表示第ll层的单元数,不包含偏置单元

代价函数

逻辑回归代价函数:J(θ)=1mi=1m[yilog(hθ(xi))+(1yi)log(1hθ(xi))]+λ2mj=1nθj2J(\theta) = -\frac{1}{m}\overset{m}{\mathop{\sum}\limits_{i=1}}[y^ilog(h_\theta(x^i))+(1-y^i)log(1-h_\theta(x^i))]+\frac{\lambda}{2m}\overset{n}{\mathop{\sum}\limits_{j=1}}\theta_j^2

神经网络代价函数:hθ(x)RK  (hΘ(x))i=ithoutputh_\theta(x)\in R^K \space\space(h_\Theta(x))_i=i^{th}output,其中KK为类别个数

J(Θ)=1mi=1mk=1K[yilog(hΘ(xi))k+(1yki)log(1(hΘ(xi))k)]+λ2ml=1L1i=1slj=1sl+1(Θjil)2J(\Theta)= -\frac{1}{m}\overset{m}{\mathop{\sum}\limits_{i=1}}\overset{K}{\mathop{\sum}\limits_{k=1}}[y^ilog(h_\Theta(x^i))_k+(1-y^i_k)log(1-(h_\Theta(x^i))_k)] +\frac{\lambda}{2m}\overset{L-1}{\mathop{\sum}\limits_{l=1}}\overset{s_l}{\mathop{\sum}\limits_{i=1}}\overset{s_l+1}{\mathop{\sum}\limits_{j=1}}(\Theta^l_{ji})^2

反向传播算法

目的:求使得J(Θ)J(\Theta)最小的Θ\Theta

需要计算的项:J(Θ)J(\Theta),\frac{\part}{\part\Theta^l_{ij}}J(\Theta)

相关参数计算:

  • δjl\delta^l_j表示第ll层第jj个节点的误差,\delta^l_j=\frac{\part J(\Theta)}{\part z^l_j}

  • 输出层δj4=aj4yj\delta_j^4=a^4_j-y_j,向量化δ4=a4y\delta^4 = a^4-y

    隐藏层δ3=(Θ3)Tδ4.g(z3)g(z3)=a3.(1a3)δ2=(Θ2)Tδ3.g(z2)g(z2)=a2.(1a2)\delta^3=(\Theta^3)^T\delta^4.*g'(z^3),g'(z^3)=a^3.*(1-a^3)\\\delta^2 = (\Theta^2)^T\delta^3.*g'(z^2),g'(z^2)=a^2.*(1-a^2)..*表示MATLABMATLAB中两个向量的乘法

    输入层没有误差,所以没有δ1\delta^1

算法具体过程:

  • 训练集:{(x1,y1),(x2,y2),,(xm,ym)}\{(x^1,y^1),(x^2,y^2),\cdots,(x^m,y^m)\}

  • 设置对于任意的l,i,jl,i,jΔijl=0\Delta^l_{ij}=0

  • For i=1i=1 to m

    • a1=xia^1=x^i
    • 正向计算al,l=2,3,,La^l,l=2,3,\dots,L
    • 使用yiy^i计算δL=aLyi\delta^L=a^L-y^i
    • 反向计算δL1,δL2,,δ2\delta^{L-1},\delta^{L-2},\cdots,\delta^2
    • Δijl:=Δijl+ajlδil+1\Delta^l_{ij}:=\Delta^l_{ij}+a^l_j\delta^{l+1}_i,向量形式Δl:=Δl+δl+1(al)T\Delta^l:=\Delta^l+\delta^{l+1}(a^l)^T

    Dijl:=1mΔijl+λΘijlD^l_{ij}:=\frac{1}{m}\Delta^l_{ij}+\lambda\Theta^l_{ij}j0j\neq0

    Dijl:=1mΔijlD^l_{ij}:=\frac{1}{m}\Delta^l_{ij}j=0j=0

  • \frac{\part}{\part\Theta^l_{ij}}J(\Theta)=D^l_{ij},然后即可使用梯度下降算法或者别的优化算法

理解算法:

反向传播算法

梯度检测

考虑以上函数图像,我们可以使用J(θ+ϵ)J(θϵ)2ϵ\frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{2\epsilon}来近似dJ(θ)dθ\frac{d J(\theta)}{d\theta}的值,通常取ϵ=104\epsilon=10^{-4}

θ=[θ1θ2θn]\theta = \begin{bmatrix}\theta_1\\\theta_2\\\vdots\\\theta_n\end{bmatrix}时,我们可以使用类似的思想来估计素有的偏导数项:

\frac{\part J(\theta)}{\part\theta_1}\approx\frac{J(\theta_1+\epsilon,\theta_2,\theta_3,\dots,\theta_n)-J(\theta_1-\epsilon,\theta_2,\theta_3,\dots,\theta_n)}{2\epsilon},其余同理。

通过上述方式估算导数之后,与我们从反向传播算法中得到的导数相比较,相差较小,则说明反向传播算法是正确的。当检验确定反向传播算法实现正确之后,在进行实际学习时,不要进行梯度检验,因为梯度检验算法速度很慢,浪费计算资源。

随机初始化

初始化每个Θijl\Theta^l_{ij}[ϵ,ϵ][-\epsilon,\epsilon]内的随机值,ϵ\epsilon和梯度检测无关,ϵ\epsilon接近0

训练神经网络的过程

  • 选择一个合适的神经网络架构
  • 随机初始化权重
  • 使用前向传播算法
  • 计算代价函数
  • 使用反向传播算法计算偏导数
  • 使用梯度检测检查反向传播算法的结果
  • 使用最优化方法和反向传播算法结合来最小化

参考资料