以下内容来自于对吴恩达深度学习的个人总结,有兴趣的小伙伴可自行前往学习该课程。
神经网络分两篇,第一篇是原理介绍,第二篇是python实现神经网络。
1. 相关知识点:深度学习的兴起、sigmoid函数、梯度下降
在此文中,由于神经网络涉及到激活函数和梯度下降,我只在这里做一个简单介绍。如想了解更多信息,请自行查阅相关文章。
由下图可以看出,规模驱动着深度学习的发展:
(1)随着训练数据的增加,神经网络比传统的机器学习表现出更优异的性能;
(2)随着神经网络规模的增加,性能也会得到很大提升。
接下来,我们介绍激活函数 - sigmoid函数。除了sigmoid函数,激活函数还有tanh函数、ReLu函数。
在神经元网络中,每个神经元都通过激活函数将线性假设变成非线性假设。
最后,我们在介绍梯度下降。在神经网络中,我们通过梯度下降算法来求解网络中的各参数。
梯度下降算法的核心思想:只要沿着梯度(斜率)的方向一直走,就能走到局部的最低点,在凸函数中为全局最优解。
2.神经元网络的结构
一个神经网络的典型结构分为以下三层:输入层、隐藏层和输出层。隐藏层的层数可以为1层、2层.....,它决定了神经网络的大小和规模。其中输入层的x1、x2、x3表示一个训练数据的三个特征。
下图中的每一个圆圈表示一个神经元,我们要牢记它执行了以下两步的操作:
(1)线性计算:z=wx+b
(2)非线性计算:对z使用激活函数,a=σ(z)
大家可以思考一个问题,为什么要使用激活函数。如果不使用激活函数,那么无论有多少层神经网络,输出都是各输入特征的线性函数。即z=wX+b,a=wz+b=w(wx+b)+b. (因为两个线性函数的组合本身就是线性函数)
3.神经网络的计算
下图中,先求z,再求a。最后计算出隐藏层四个神经单元a的值。(有兴趣的小伙伴可以自行测试。)为了便于理解,我这边也简单写了一个,同样的计算,for循环花费时间36秒,而向量矩阵运算仅需要0.05秒。怎么样,是不是被惊呆了。
在python中,for循环计算的时间远远大于向量矩阵的计算时间。
所以我们的目标是将下图中每个公式转换为向量矩阵计算。
故转换为以下表达,在这里为了简单表达,每一个向量其实对应的是上图中的这三个值:
、
、
上图中的均为一个输入样本的计算,在实际训练中,我们通常有很多个训练样本,接下来我们就看看在m个训练样本中的神经网络计算。我们先注意每一个标记符号的意义:
(1)[ ]表示第几层神经网络
(2)( )表示第几个训练样本
所以m个训练样本中的神经网络就是一个训练样本神经网络的横向延展。
输入层原本为3*1维矩阵(1个样本具有3个特征),转变维3*m维矩阵(m个样本,每个样本具有3个特征)
隐藏层的神经元原本为4*1维矩阵,转变成4*m维矩阵。小z也变成了大Z,小a也变成了大A。
最后总结一下,每个参数的矩阵维数,这样子也更容易去理解神经网络。
4.神经网络的正向传播和反向传播
正向传播:已知输入,求输出预测值。
反向传播:通过正向传播求得的预测值与真实值比较,再反向传播调整各参数值,只到输出的预测值越来越逼近于真实值。
最后通过梯度下降求解出来的结果如下图所示:过程太复杂,就不进行推算了,只需记得该结果即可。