深度学习毫无疑问会是以后的热门技术了,虽然不可能转行AI了,不过了解下其内部的基本原理也是很不错的,这篇是《深度学习的数学》第一章的读书笔记;
了解深度学习,需要先了解神经网络,了解神经网络,要先了解生物学的神经元
人脑具有思考、归纳,推演、学习等各种能力,深度学习会参考模拟人脑的神经系统,以期望计算机也有人脑类似的能力,所以先从最简单的神经元开始
生物学上的神经元是初中的内容,估计不少人都没什么印象了,先看下神经元的图片
主要是细胞体,轴突,树突。有多个树突从其他神经元接收信号,然后通过轴突发送给其他神经元,神经元的工作模式如下:
当一个神经元从其他多个神经元接收了输入信号,这时如果所接收的信号之和没有超过这个神经元固有的边界值(称为阈值),这个神经元的细胞体就会忽略接收到的信号;
不过,如果输入信号之和超过神经元固有的边界值,细胞体就会做出反应,向与轴突连接的其他神经元传递信号,这个称为点火
这里可以看到,每个神经元对于接收到的信号多有自己的处理的; 我们用数学式来表示神经元的工作,比如上图的神经元有三个输入,
,
,
,神经元对每个输入都有不同的响应权重
,
,
,阀值用θ表示,可以得出如下的公式 无信号输出(y=0):
+
+
< θ 有信号输出(y=1):
+
+
>= θ
是这样的一个函数
这个是单位越阶函数,用u(z)来表示,那么,点火函数可以用如下的式子来表示
=
(
+
+
- θ)
代表这个神经元接收到所有信号处理后,往下个神经元传递的信号量,这里的θ是生物学上神经元的阀值,不过在数学上,更习惯用加号书写,我们把-θ替换为
=
(
+
+
+
)
上面这个是抽象化后,去除生物这个条件后一般化的式子,关于这个式子要说明几个重要概念
是建模者定义的函数,称为激活函数,
,
,
是模型允许的任意数值,
叫做偏置
把上面的式子,可以拆分成两个函数,这样会更好的理解
=
+
+
+
这里的
代表加权输入,神经元通过加权输入配合激活函数,得出输出
为了与生物学神经元的区别开,我们把做个叫神经单元,当多个神经单元连接在一起,就形成了神经网络
大脑是由神经元构成的网络,那我们模拟大脑,用多个神经单元组成网络,就形成了神经网络了
神经网络一共有三个层,如下图所示
输入层负责读取给予神经网络的信息; 隐藏层执行前面说讲的处理操作,就是针对输入层的入参,每个隐藏层的节点根据函数
=
(
+
+
- θ)来执行计算; 输出层跟隐藏层一样,也是执行处理操作,输出层显示的结果,就是整个神经网络的输出
这里最复杂的隐藏层的设计,包括层级数量,每个层级的节点数量,每个节点的权重
和激活函数设定;下面以一个具体的例子来说明,方便直观的理解
例题:建立一个神经网络,用来识别通过 4×3 像素的图像读取的手写数字 0 和1。学习数据是 64 张图像,其中像素是单色二值。
针对上面的例子,我们有如下示范图
输入层一共有4×3 = 12个像素信息,每个输入层节点的值可以用
,
...
表示,如果格子是深色值为1,是浅色值为0
输出层由两个神经单元构成,这是因为我们的题目是识别两种手写数字 0 和 1,需要一个在读取手写数字 0 时输出较大值(即反应较大)的神经单元,以及一个在读取手写数字 1 时输出较大值的神经单元。
不同的模型的激活函数是不同的,比如这个例子,我们要用Sigmoid函数作为激活函数,函数式如下
结果是介于0~1的平滑曲线
对于这个神经网络,理想的结果应该是,读取数字 0 的图像时,输出层上方的神经单元的输出值比下方的神经单元的输出值大;而读取数字 1的图像时,输出层下方的神经单元的输出值比上方的神经单元的输出值大,如下图所示
上面讲了输入层和输出层,对于最重要的隐藏层,要如何设计呢,这里还要知道,输入的图像有各种样式,比如0有多种写法
计算机要如何识别这个是0而不是1呢,关键就在于隐藏层的设计
在这里例子里,因为是最简单的一个例子,我们把隐藏层只有一层就可以了,并且隐藏层只有三个节点,把这三个节点想象成三只恶魔,每个恶魔的激活函数是一样的,但是对每个输入点的权重不一样,就是
不同
输入层有12条数据,如果是深色就传1,白色就传0,所有输入都会完整的传递给三个恶魔,每个恶魔的偏好不同,偏好如下图
可以发现,恶魔A对输入4和7的性情相投,代表更高的权重,其他的位置的权重低,也就是
、
的值比较大,其他
的值为比较低
同理,恶魔B对输入5和8的性情相投,恶魔C对6、9性情相投,也就是相关位置的权重
的值高;这样的话,隐藏层的每个恶魔的激活函数和权重都明确好了
对于输出层的0跟1节点,我们也叫做恶魔0和恶魔1,他们的输入层其实就是隐藏层,也就是一共有三个输入,每个输入有不同的权重
、
、
,其中恶魔0的
、
的权重比较高,
的权重低,恶魔1的
的权重高,其他位置为权重低,图示如下
这样的话,整个神经网络就设置好了,激活函数都是SIGMOID函数,隐藏层跟输出层的每个节点的对应的输入端的权重
也都确定下来了
然后我们开始读取数字0
作为输入端的4、7、6、9位置变得兴奋,读取的结果是1,其他位置是0 2跟11的读取结果也是1,不过由于隐藏层对这两个位置的权重都很低,影响忽略
当输入层传给隐藏层的时候,由于恶魔A对4、7位置的权重高,刚好4、7位置的输入结果值是1,所以恶魔A变的兴奋了,也就是恶魔A会输出更大的结果给到下一层;
同理恶魔C对6、9位置的权重高,所以恶魔C也变得兴奋起来; 恶魔B对应权重较高的是5、8位置,由于这两个位置的输入是0,故恶魔B没有兴奋起来
然后再往下传递给输出层,因为输出层0对隐藏层的A和C权重高,刚好恶魔A跟恶魔C变兴奋,输出更大的值,于是输出层0也变得兴奋起来了
由于输出层0的兴奋度大于输出层1,于是就推导出结果是0这个答案,同理,如果输入是一张1的图片,那对应的输出层1的兴奋度会大于输出层0,图示如下
上面这个神经网络,输入不同的图像的时候,在输出层0跟输出层1都会得出不同的兴奋度的结果值,然后依据结果值来判断输入是0还是1; 于是这个神经网络,具备了一个非常简单的“智能”,判断输入图是0,还是1
由于这个例子是非常简单的例子,如果是实际中复杂的场景,需要隐藏层也会更多,每个隐藏层的恶魔数量也更多,而且激活函数也都会不同,权重也更是复杂,虽然这个例子很简单,但是对于理解神经网络基本原理是足够的
之前的讲解中事先假定了每个节点权重的大小,也就是假定了各层恶魔之间的关系。那么,这个权重的大小(恶魔的关系)是如何确定的呢?神经网络中比较重要的一点就是利用网络自学习算法来确定权重大小。
为了确定神经网络的权重和偏置,事先给予标记好的学习数据。根据给定的学习数据确定权重和偏置,称为学习。
给神经网络传递一批批标注好的数值,计算神经网络得出的预测值与正解的误差,确定使得误差总和达到最小的权重和偏置。当误差不能再缩小了,就得到最终的权重和偏置的值
具体的学习过程,依赖数学基础,待我恶补下导数,偏导数,梯度下降法等高数基础(想想大学真的没学到什么,大学四年还不如高中一年掌握的知识多),再来更新一篇