激活函数与前向传播----「深度学习#1」
numPy基础
数组的维数通过np.dim()函数获得,数组的形状通过实例变量.shape获得。
二维数组通常称为矩阵,数组的横向排列称为行,纵向排列称为列。

矩阵乘法(乘积)

在矩阵的乘积运算中,对应维度的元素个数要保持一致。



感知机(朴素神经元)
数学公式
感知机作为神经网络(深度学习)的起源的算法,也被称为“人工神经元”或“朴素感知机”。

感知机的多个输入信号都有各自固有的权重,这些权重发挥着控制各个 信号的重要性的作用。也就是说,权重越大,对应该权重的信号的重要性就 越高。

实现
导入权重和偏置概念,并通过numpy数组改造上述算法。
感知机的与门、非门和或门
通过与门、非门和或门实现异或门
输出:

激活函数

上面这段公式是带有偏置和权重的感知机数学公式,b称为偏置,用于控制神经元被激活的容易程度;w1和w2成为各个输入信号的权重,用于控制各个信号的重要性。下图是被明确表示了偏置b地位的网络图。

接下来引入新的函数y=h(x),表达式将被改写成:
输入信号的总和会被函数h(x)转换,这个h(x)函数一般就被称为激活函数,其作用在于决定如何来激活输入信号的总和。下图是被明确表示了激活函数计算过程的网络图。

激活函数是连接感知机和神经网络的桥梁。
阶跃函数和sigmoid函数
感知机通常使用阶跃函数作为激活函数,而sigmoid函数是神经网络经常使用的函数。
感知机一词,并没有严格同意它所指的算法,一般“朴素感知机”是指单层网络,指的是激活函数使用了阶跃函数的模型。“多层感知机”是指神经网络,即使用sigmoid函数等平滑的激活函数的多层网络。
平滑性不同。sigmoid是依靠平滑的曲线,输出随着输入发生连续性变化;而阶跃函数以0为界,输出发生急剧性变化。
输出的二元性。阶跃函数只能返回0或者1,输出的是二元信号,而神经元中流动的是连续的实数值信号。
如果把这两个函数与水联系起来,则阶跃函数可以比作“竹筒敲石”A, sigmoid 函数可以比作“水车”。阶跃函数就像竹筒敲石一样,只做是否传送 水(0 或 1)两个动作,而 sigmoid 函数就像水车一样,根据流过来的水量相应 地调整传送出去的水量。
他们俩的共同特征是宏观形状相似,且均为非线性函数。通常的,神经网络的激活函数必须使用非线性函数,否则加深神经网络的层数就毫无意义了。

阶跃函数的实现
当输入超过0时,输出1,否则输出0
通过使用numPy广播的技巧,阶跃函数的代码实现如下。

sigmoid函数的实现

代码实现

ReLU函数
目前为止,介绍了两种激活函数(阶跃函数和sigmoid函数)。在神经网络发展史上,sigmoid函数很早就开始被使用了,而近几年则主要使用ReLU(Rectified Linear Unit)函数。
ReLU函数在输入大于0时,直接输出该值;在输入小于等于0时,输出0.
ReLU函数的数学表达式:

ReLU函数的图形:

ReLU函数的代码实现:

前向传播(forward propagation)
输入层(2个神经元)
第1个隐藏层(3个神经元)
第2个隐藏层(2个神经元)
输出层(2个神经元)

从输入层到第1隐藏层的信号传递

从第1隐藏层到第2隐藏层的信号传递

从第2隐藏层到输出层的信号传递

这里,输出层的激活函数使用了恒等函数,也就是上一隐藏层直接传递给输出层。
一般输出层用到的激活函数,根据求解问题的性质决定。一般地,回归问题可以使用恒等函数,二元分类问题可以使用sigmoid函数,多元分类问题可以使用softmax函数。
完整代码
输出层的设计
一般的,回归问题用恒等函数,分类问题用softmax函数。
分类问题是指数据属于哪一个类别的问题,比如区分图像中的人是男性还是女性。
回归问题是根据某个输入预测一个(连续的数值)的问题。比如,根据一个人的图像预测这个人的体重的问题(类似“57.4kg”这样的预测)。
softmax函数

softmax函数有一个特征,就是它的输出是0.0到1.0之间的实数。并且函数的输出值的总和是1。因此softmax函数的输出还可以解释为“概率”。
一般而言,神经网络只是把输出值最大的神经元所对应的类别作为识别结果。且即使使用了softmax函数,输出值最大的神经元的位置也不会变。
因此,神经网络在进行分类问题时,输出层的softmax函数可以省略。
求解机器学习问题的步骤分为学习和推理两个阶段。推理阶段一般会省略输出层的softmax函数。在输出层使用softmax函数是因为它和神经网络的学习有关。
输出层的神经元数量
输出层的神经元数量根据待解决的问题来决定。对于分类问题,其数量一般设定为类别的数量。比如手写数字识别,需要预测图中的数字是0-9中的哪一个的问题,将输出层的神经元设定为10个。


