深度学习入门(二):神经网络的前向传播

本文为《深度学习入门 基于Python的理论与实现》的部分读书笔记
代码以及图片均参考此书

复习感知机

  • 之前介绍的朴素感知机:
    在这里插入图片描述
  • 现在明确地写出朴素感知机中的激活函数h(x)(阶跃函数)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 阶跃函数的实现
def step_function(x):
    return np.array(x > 0, dtype=np.int)

激活函数(activation function)

一般而言,“朴素感知机”是指单层网络,指的是激活函数使用了阶跃函数的模型。“多层感知机”是指神经网络,即使用sigmoid函数等平滑的激活函数的多层网络。

神经网络的激活函数必须使用非线性函数。因为线性函数的问题在于,不管如何加深层数,总是存在与之等效的“无隐藏层的神经网络”。使用线性函数的话,加深神经网络的层数就没有意义了。因此,为了发挥叠加层所带来的优势,激活函数必须使用非线性函数。

sigmoid函数

在这里插入图片描述

  • sigmoid函数的实现:
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

在这里插入图片描述

  • sigmoid函数的优点:sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化。而阶跃函数以0为界,输出发生急剧性的变化。sigmoid 函数的平滑性对神经网络的学习具有重要意义
  • sigmoid函数的缺点:计算量较大且容易出现梯度消失。sigmoid函数两侧的特征导数接近于0,这将导致在梯度反向传播时损失的误差难以传递到前面的网络层

tanh函数

在这里插入图片描述

  • tanhx = 2sigmoid(2x) - 1
  • tanh函数的实现:
def tanh(x):
    return 1 - 2 / (np.exp(2 * x) + 1)

在这里插入图片描述

ReLU(Rectified Linear Unit)函数

在这里插入图片描述

  • relu函数的实现:
def relu(x):
    return np.maximum(0, x)

在这里插入图片描述

  • relu函数可以缓减梯度消失现象

神经网络的前向传播

  • 下面将简单实现三层神经网络的前向传播
    下图的网络一共由4层神经元构成,但实质上只有3层神经元有权重,因此将其称为“3 层网络”。第0层对应输入层,第1,2层对应中间层,第3层对应输出层
    在这里插入图片描述

通过矩阵点积运算打包神经网络的运算

在这里插入图片描述
在这里插入图片描述

引入符号

在这里插入图片描述

各层间信号传递的实现

在这里插入图片描述
在这里插入图片描述
如果使用矩阵的乘法运算,则上式可表示为:
在这里插入图片描述
矩阵W的形状:(上一层的神经元个数, 下一层的神经元个数)
在这里插入图片描述
在这里插入图片描述

输出层的激活函数不同于隐藏层的激活函数,一般:

  • 回归问题用恒等函数
  • 二元分类问题用sigmoid函数
  • 多元分类问题用softmax函数

上述前向传播的过程可以总结为以下代码(完整的代码实现放在后面):
在这里插入图片描述

输出层的设计

softmax函数

在这里插入图片描述
在这里插入图片描述

  • 溢出问题
    softmax 函数的实现中要进行指数函数的运算,但是此时指数函数的值很容易变得非常大。比如,e10 的值会超过20000,e100 会变成一个后面有40 多个0 的超大值,e1000 的结果会返回一个表示无穷大的inf。如果在这些超大值之间进行除法运算,结果会出现“不确定”的情况。
    在这里插入图片描述
    式(3.11)说明,在进行softmax 的指数函数的运算时,加上(或者减去)某个常数并不会改变运算的结果。这里的C’可以使用任何值,但是为了防止溢出,一般会使用输入信号中的最大值。

  • softmax函数实现:

def softmax(x):
    x = x - np.max(x) # 溢出对策
    return np.exp(x) / np.sum(np.exp(x))
  • 输出层的各个神经元都受到所有输入信号的影响
  • softmax函数的输出是0.0 到1.0之间的实数。并且,softmax函数的输出值的总和是1。因此可以把softmax 函数的输出解释为结果属于某个类别的“概率”。
  • 即便使用softmax 函数,各个元素之间的大小关系也不会改变。求解机器学习问题的步骤可以分为“学习”和“推理”两个阶段。在实际的问题中,由于指数函数的运算需要一定的计算机运算量,因此推理阶段一般会省略输出层的softmax 函数。在输出层使用softmax 函数是因为它和神经网络的学习有关系。

输出层的神经元数量

  • 对于分类问题,输出层的神经元数量一般设定为类别的数量。比如,对于某个输入图像,预测
    是图中的数字0 到9 中的哪一个的问题(10 类别分类问题),可以像图3-23 这样,将输出层的神经元设定为10 个。
    在这里插入图片描述

批处理

  • 以图像大小为28*28=784的Mnist数据集为例,构建三层神经网络,两个隐藏层,第一层50个神经元,第二层100个神经元,输出为图像属于10个类别的概率。单个图像输入时数组形状的变化如下:
    在这里插入图片描述
  • 下面考虑打包输入100张图像的情况:
    在这里插入图片描述
    可以看出输入的100张图像的结果被一次性输出了,这种打包式的输入数据称为批(batch)

批处理对计算机的运算大有利处,可以大幅缩短每张图像的处理时间。那么为什么批处理可以缩短处理时间呢?这是因为大多数处理数值计算的库都进行了能够高效处理大型数组运算的最优化。并且,
在神经网络的运算中,当数据传送成为瓶颈时,批处理可以减轻数据总线的负荷(严格地讲,相对于数据读入,可以将更多的时间用在计算上)。也就是说,批处理一次性计算大型数组要比分开逐步计算
各个小型数组速度更快。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章