文章目录
1.感知机
1.1 基本介绍
神经网络的发展,最早可以追溯到感知机模型,我们不妨理解为当前的神经网络模型,都是从感知机进化而来的,因此,在正式学习神经网络之前,认识一下它的“祖先”还是很有必要的。
上图就是对感知机的完整诠释,这个名字有点误导,因为它根本上就是做决策用的。
举个例子:
你正在考虑今天要不要出去看电影,你主要考虑的有三个因素p1 、p2和p3。其中p1是你女朋友想不想去,p2是电影好不好看,p3是今天工作多不多,每一个因素对应于一个权重wi,有的人看重女朋友,有的人看重电影的质量…
你把每一项pi和对应的wi相乘,然后累加求和得到一个结果,如果这个值大于设定的阈值,那么你就决定去看电影,如果小于等于设定的阈值,那么就不去看,这就是感知机做决策的例子。
1.2 感知机模型
根据上面的叙述,我们大概知道,感知机的决策过程主要分两步,一是计算输入乘以权重的累加和,二是判断累加和与阈值之间的大小关系。我们可以把两个步骤合并在一起,把阈值b与累加和相加,再用 s i g n ( x ) sign(x) sign(x)函数得到输入结果。
我们先计算累加和与bias项的和: z = ∑ i = 1 m w i x i + b z=\sum_{i=1}^{m} w_{i} x_{i}+b z=i=1∑mwixi+b 得到中间结果 z z z之后,我们可以再用激活函数 s i g n ( x ) sign(x) sign(x),得到最终的决策值:
sign ( z ) = { − 1 z < 0 1 z ≥ 0 \operatorname{sign}(z)=\left\{\begin{array}{ll}{-1} & {z<0} \\ {1} & {z \geq 0}\end{array}\right. sign(z)={
−11z<0z≥0
1.3 逻辑回归
不知道大家有没有和我一样的感受,看了感知机的原理之后,就想到了逻辑回归模型,因为二者的相似处实在太多,想想逻辑回归也是计算特征值的加权和,然后喂给了 S i g m o i d Sigmoid Sigmoid激活函数,得到最终的输出结果。
从函数的判别模型角度来看,感知机和逻辑回归还是挺相似的,那么逻辑回归模型,是否也可以像感知机一样,理解为只含有一个神经元的神经网络模型呢?同理,由LogisicRegression拓展到多分类任务的SoftmaxRegression,是否也是一种特殊的神经网络呢?
这个只是我目前的学习思考,之后学习的更深之后,再来解答此问题,不容否认的是,逻辑回归和神经网络之间一定是有着某种特别的联系的。
1.4 感知机到神经网络的演化
上述的感知机模型,只能用于线性的二分类任务,无法用于复杂的非线性多分类任务,于是在此基础上进行一些扩展,得到了现在我们熟知的神经网络,主要有三点扩展:
- 增加了隐藏层,提升了模型的表达能力,隐藏层的层数以及每层神经元的个数需要自己设计,代价是增加了模型的复杂程度,计算量增加;
- 增加了输出层的神经元个数,有1个变为多个,带来的好处是可用于多分类任务、或其他机器学习领域如降维和聚类;
- 增加了激活函数的种类,感知机的激活函数是 s i g n ( z ) sign(z) sign(z),虽然简单但是能力有限,常用的激活函数有 S i g m o i d 、 R e L U 、 t a n h 和 s o f t m a x Sigmoid、ReLU、tanh和softmax Sigmoid、ReLU、tanh和softmax等,这里有详细介绍不同激活函数的区别和优缺点。
2.深度神经网络DNN
2.1 基本概念
深度神经网络,也被叫做多层神经网络,偶尔也会被叫做多层感知机模型(Multi-Layer perceptron , MLP),我们只需要知道它们指的都是同一个东西即可,这里我们统称为DNN.
深度神经网络的架构图如下:
层与层之间是全连接的,即第(l-1)层的任意一个神经元一定与第l层的任意一个神经元相连接。DNN的结构看起来是很复杂,但是我们单独抽出某一个神经元以及它上一层中的所有神经元,就会发现它其实就是和感知机(还是说逻辑回归?)一样,首先是计算加权和,再加上偏置项b,最终将这个未激活值送到激活函数σ进行激活。
2.2 符号定义
w 42 3 : w_{42}^3: w423: 表示第(3-1)层的第2个神经元到第3层的第4个神经元之间的连接的权重;
z 4 3 : z_4^3: z43: 表示第3层的第4个神经元的未经激活函数激活之前的值,其中 z 4 3 = w 41 3 ⋅ a 1 2 + w 42 3 ⋅ a 2 2 + w 43 3 ⋅ a 3 2 + b 4 3 z_{4}^{3}=w_{41}^{3} \cdot a_{1}^{2}+w_{42}^{3} \cdot a_{2}^{2}+w_{43}^{3} \cdot a_{3}^{2}+b_{4}^{3} z43=w413⋅a12+w423⋅a22+w433⋅a32+b43 a 3 4 : a_3^4: a34: 表示第3层的第4个神经元的激活值(输出值),其中
a 4 3 = σ ( z 4 3 ) a_{4}^{3}=\sigma\left(z_{4}^{3}\right) a43=σ(z43) b 4 3 : b_{4}^{3}: b43: 表示第3层的第4个神经元所对应的偏置项,注意哦,每一层的每一个神经元都对应着一个b,我们把每一个神经元看成是一个感知机模型,所以每个模型对应的bias项是不一样的;
【引申一个问题】为什么要在未激活值的计算中加上bias项呢?这里引用知乎上的回答。
回答一:我们可以把问题先简化,为什么线性模型要加 bias?答案很简单,不加 bias 你的分类线(面)就必须过原点,这显然是不灵活的。有了bias我们就可以上下左右移动我们的线了,神经网络是一样的道理。
回答二:Bias的好处在于:可以使得神经网络Fit的范围得到左右的调整。
没有bias项时,我们用不同的w来拟合数据,w越大,sigmoid函数越陡峭,分类效果越好!!可观察上图。但是如果要判断图中绿色点的类别呢?按照sigmoid函数的输出,绿色点的激活值小于0.5,应该判为蓝色类,这个时候,让sigmoid函数变得更陡也没办法解决了。
这个时候,如果加入一个bias项呢?我们观察函数图像:
w系数不需要学的很大,就可以提高学习的准确率,网络就能够非常灵活的拟合样本点的分布,并准确判断绿点所属的集合。
简单来说,加上bias项能够更加灵活的fit数据样本点的分布!
2.3 DNN的前向传播算法
假设一个神经网络共有三层,第一层(输入层)共有三个神经元x1,x2,x3,第二层也是有三个神经元,第三层为输出层,只有1个神经元。如下图所示:
那么第二层的三个神经元的输出分别为: a 1 2 = σ ( z 1 2 ) = σ ( w 11 2 x 1 + w 12 2 x 2 + w 13 2 x 3 + b 1 2 ) a 2 2 = σ ( z 2 2 ) = σ ( w 21 2 x 1 + w 22 2 x 2 + w 23 2 x 3 + b 2 2 ) a 3 2 = σ ( z 3 2 ) = σ ( w 31 2 x 1 + w 32 2 x 2 + w 33 2 x 3 + b 3 2 ) \begin{aligned} a_{1}^{2} &=\sigma\left(z_{1}^{2}\right)=\sigma\left(w_{11}^{2} x_{1}+w_{12}^{2} x_{2}+w_{13}^{2} x_{3}+b_{1}^{2}\right) \\\\ a_{2}^{2} &=\sigma\left(z_{2}^{2}\right)=\sigma\left(w_{21}^{2} x_{1}+w_{22}^{2} x_{2}+w_{23}^{2} x_{3}+b_{2}^{2}\right) \\\\ a_{3}^{2} &=\sigma\left(z_{3}^{2}\right)=\sigma\left(w_{31}^{2} x_{1}+w_{32}^{2} x_{2}+w_{33}^{2} x_{3}+b_{3}^{2}\right) \end{aligned} a12a22a32=σ(z12)=σ(w112x1+w122x2+w132x3+b12)=σ(z22)=σ(w212x1+w222x2+w232x3+b22)=σ(z32)=σ(w312x1+w322x2+w332x3+b32) 第三层的神经元输出为: a 1 3 = σ ( z 1 3 ) = σ ( w 11 3 a 1 2 + w 12 3 a 2 2 + w 13 3 a 3 2 + b 1 3 ) a_{1}^{3}=\sigma\left(z_{1}^{3}\right)=\sigma\left(w_{11}^{3} a_{1}^{2}+w_{12}^{3} a_{2}^{2}+w_{13}^{3} a_{3}^{2}+b_{1}^{3}\right) a13=σ(z13)=σ(w113a12+w123a22+w133a32+b13) 将上述例子一般化,假设第 ( l − 1 ) (l-1) (l−1)层共有m个神经元,那么对于第l层的第j个神经元的输出值 a j l a_j^l ajl为: a j l = σ ( z j l ) = σ ( ∑ k = 1 m w j k l a k l − 1 + b j l ) a_j^l = \sigma(z_j^l) = \sigma(\sum\limits_{k=1}^mw_{jk}^la_k^{l-1} + b_j^l) ajl=σ(zjl)=σ(k=1∑mwjklakl−1+bjl)
【矩阵法表示】上面这个式子,给出了单个神经元的输出值用代数法如何计算,我们下面来推导更加简洁的矩阵法表示.(最终结果如下:)
a l = σ ( z l ) = σ ( W l a l − 1 + b l ) a^{l}=\sigma\left(z^{l}\right)=\sigma\left(W^{l} a^{l-1}+b^{l}\right) al=σ(zl)=σ(Wlal−1+bl) 假设第 ( l − 1 ) (l-1) (l−1)层共有m个神经元,而第 l l l层共有n个神经元,则第l层的权重系数w组成了一个n×m的矩阵 W l W^l Wl: ( w 11 l w 12 l … w 1 m l w 21 l w 22 l … w 2 m l . . . . . . … . . . w n 1 l w n 2 l … w n m l ) \left( \begin{array}{llll}{w_{11}^{l}} & {w_{12}^{l}} & {\dots} & {w_{1m}^{l}} \\ \\{w_{21}^{l}} & {w_{22}^{l}} & {\dots} & {w_{2m}^{l}}\\\\{...} & {...} & {\dots} & {...} \\\\ {w_{n1}^{l}} & {w_{n2}^{l}} & {\dots} & {w_{nm}^{l}}\end{array}\right) ⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛w11lw21l...wn1lw12lw22l...wn2l…………w1mlw2ml...wnml⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞ 第 ( l − 1 ) (l-1) (l−1)层的输出 a a a组成了一个m×1的向量 a l − 1 a^{l-1} al−1: ( a 1 l − 1 a 2 l − 1 . . . a m l − 1 ) \left( \begin{array}{llll}{a_{1}^{l-1}}\\ \\{a_{2}^{l-1}}\\\\{...}\\\\ {a_{m}^{l-1}}\end{array}\right) ⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛a1l−1a2l−1...aml−1⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞ 第 l l l层的偏置向量 b b b组成了一个n×1的向量 b l b^{l} bl: ( b 1 l b 2 l . . . b n l ) \left( \begin{array}{llll}{b_{1}^{l}}\\ \\{b_{2}^{l}}\\\\{...}\\\\ {b_{n}^{l}}\end{array}\right) ⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛b1lb2l...bnl⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞ 整个过程可以用矩阵和向量进行表示:
( a 1 l a 2 l . . . a n l ) = σ ( ( w 11 l w 12 l … w 1 m l w 21 l w 22