美文网首页
神经网络

神经网络

作者: 疯了个魔 | 来源:发表于2018-12-07 10:59 被阅读0次

    神经网络的表示

    机器学习领域所说的神经网络指的是一种模仿生物神经网络的结构和功能而建立的数学或计算模型,用于对函数进行估计或近似。

    神经网络的表示

    两层神经网络

    如图所示的神经网络中,前面为输入层,中间为隐藏层 ,最后为输出层
    中间层被称为隐藏层的原因是因为在训练过程中,将看到输入的样本有哪些,输出的结果是什么,中间层中的神经节点产生的真实值无法被观察到。所以中间层被称为隐藏层,只是因为你不会在训练集中看到它。
    图中的这个神经网络也被称为两层神经网络,原因是计算神经网络的层数时,通常不考虑输入层。所以这个神经网络中,隐藏层是第一层,输出层是第二层,而输入层为第零层。

    符号约定

    输入特征:a^{[0]},上标“[ ]”括号中的数字表示神经网络中的第几层,a代表着激活(Activation),指的是不同层次的神经网络传递给后续层次的值。
    将输入集传递给隐藏层后,隐藏层随之产生激活表示为a^{[1]},而隐藏层的第一节点生成的激活表示为a^{[1]}_1,第二个节点产生的激活为a^{[1]}_2以此类推,则:
    { a^{[1]} = \begin{bmatrix} a^{[1]}_1 \\ a^{[1]}_2 \\ a^{[1]}_3 \\ a^{[1]}_4 \end{bmatrix}\quad}
    最后,输出层输出的值表示为a^{[2]},则\hat{y} = a^{[2]}
    图中的隐藏层中,将存在参数w和b,它们将分别表示为w^{[1]}b^{[1]}将会是个4×3矩阵,w^{[1]}将会是个4×1矩阵。输出层中,也会存在参数w^{[2]}b^{[2]}w^{[2]}是个1×4矩阵,b^{[2]}是个1×1矩阵。

    计算神经网络的输出

    神经网络计算过程
    tanh函数
    tanh函数其实是sigmoid函数的移位版本。对于隐藏单元,选用tanh函数作为激活函数的话,效果总比sigmoid函数好,因为tanh函数的值在-1到1之间,最后输出的结果的平均值更趋近于0,而不是采用sigmoid函数时的0.5,这实际上可以使得下一层的学习变得更加轻松。
    但是对于二分类问题,为确保输出在0到1之间,将仍然采用sigmiod函数作为输出的激活函数。
    然而sigmoid函数和tanh函数都具有的缺点之一是,在z接近无穷大或无穷小时,这两个函数的导数也就是梯度变得非常小,此时梯度下降的速度也会变得非常慢。

    ReLU函数

    ReLU函数也称为线性修正单元也是机器学习中常用到的激活函数之一,它的表达式为:
    g(z) = max(0,z) =\begin{cases} 0, & \text{($z$ $\le$ 0)} \\ z, & \text{($z$ $\gt$ 0)} \end{cases}
    函数图像为:

    ReLU函数
    当z大于0时是,ReLU函数的导数一直为1,所以采用ReLU函数作为激活函数时,随机梯度下降的收敛速度会比sigmoid及tanh快得多,但负数轴的数据都丢失了。

    Leaky-ReLU函数

    Leaky-ReLU函数是ReLU函数的修正版本,其表达式为:
    g(z) = max(0,z) =\begin{cases} \alpha z, & \text{($z$ $\le$ 0)} \\ z, & \text{($z$ $\gt$ 0)} \end{cases}
    函数图像为:

    Leaky-ReLU函数
    其中α是一个很小的常数,用来保留一部非负数轴的值。
    可以发现,以上所述的几种激活函数都是非线性的,原因在于使用线性的激活函数时,输出结果将是输入的线性组合,这样的话使用神经网络与直接使用线性模型的效果相当,此时神经网络就类似于一个简单的逻辑回归模型,失去了其本身的优势和价值。

    激活函数的导数

    sigmoid函数的导数

    sigmoid函数:
    g(z) = \frac{1}{{1 + {e^{ - z}}}}
    导数:
    \frac{d}{{dz}}g(z) = \frac{1}{{1 + {e^{ - z}}}}(1 - \frac{1}{{1 + {e^{ - z}}}}) = g(z)(1 - g(z))
    当z=10或者z=-10的时:
    \frac{d}{{dz}}g(z) \approx 0
    当z=0时:
    \frac{d}{{dz}}g(z) = g(z)(1 - g(z)) = \frac{1}{4}

    tanh函数的导数

    tanh函数:
    g(z) = \tanh (z) = \frac{{{e^z} - {e^{ - z}}}}{{{e^z} + {e^{ - z}}}}
    导数:
    \frac{d}{{dz}}g(z) = 1 - {(\tanh (z))^2}
    当z=10或者z=-10的时:
    \frac{d}{{dz}}g(z) \approx 0
    当z=0时:
    \frac{d}{{dz}}g(z) = 1 - (0) = 1

    ReLU函数的导数

    ReLU函数:
    g(z) = \max (0,z)
    导数:
    \frac{d}{{dz}}g(z) = \left\{ \begin{array}{l} 0\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;if\;\;z\; < 0\;\\ 1\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;if\;\;z\; > 0\;\\ undefined\;\;\;if\;\;z\; = \;0 \end{array} \right.

    Leaky Relu函数的导数

    Leaky Relu函数:
    g(z) = \max (0.01z,z)
    导数:
    \frac{d}{{dz}}g(z) = \left\{ \begin{array}{l} 0.01\;\;\;\;\;\;\;\;\;\;\;\;\;if\;\;z\; < 0\;\\ 1\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;if\;\;z\; > 0\;\\ undefined\;\;\;if\;\;z\; = \;0 \end{array} \right.

    前向传播与反向传播

    前向传播

    前向传播

    通过输入样本x及参数w^{[1]}b^{[1]}到隐藏层,求得z^{[1]},进而求得a^{[1]};
    再将参数w^{[2]}b^{[2]}a^{[1]}一起输入输出层求得z^{[2]},进而求得a^{[2]};
    最后得到损失函数:\mathcal{L}(a^{[2]},y),这样一个从前往后递进传播的过程,就称为前向传播(Forward Propagation)
    前向传播过程中:
    z^{[1]} = w^{[1]T}X + b^{[1]}
    a^{[1]} = g(z^{[1]})
    z^{[2]} = w^{[2]T}a^{[1]} + b^{[2]}
    a^{[2]} = σ(z^{[2]}) = sigmoid(z^{[2]})
    {\mathcal{L}(a^{[2]}, y)=-(ylog\ a^{[2]} + (1-y)log(1-a^{[2]}))}
    在训练过程中,经过前向传播后得到的最终结果跟训练样本的真实值总是存在一定误差,这个误差便是损失函数。想要减小这个误差,当前应用最广的一个算法便是梯度下降,于是用损失函数,从后往前,依次求各个参数的偏导,这就是所谓的反向传播(Back Propagation),一般简称这种算法为BP算法。

    反向传播

    反向传播
    sigmoid函数的导数为:
    深层神经网络

    如图,例如利用神经网络建立一个人脸识别系统,输入一张人脸照片,深度神经网络的第一层可以是一个特征探测器,它负责寻找照片里的边缘方向,深层神经网络的第二层可以去探测照片中组成面部的各个特征部分,之后一层可以根据前面获得的特征识别不同的脸型的等等。这样就可以将这个深层神经网络的前几层当做几个简单的探测函数,之后将这几层结合在一起,组成更为复杂的学习函数。从小的细节入手,一步步建立更大更复杂的模型,就需要建立深层神经网络来实现。
    在深度学习中:
    samll:指的是隐藏单元的数量少
    deep:指的是隐藏层的数目多
    深层的网络隐藏单元数量相对较少,隐藏层数目较多,如果浅层的网络想要达到同样的计算结果则需要指数级增长的单元数量才能达到。

    相关文章

      网友评论

          本文标题:神经网络

          本文链接:https://www.haomeiwen.com/subject/ymazcqtx.html