一、生物学上的神经网络
神经网络是由神经元组成的,在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个“阈值”,那么它就会被激活,即“兴奋”起来,再向其他神经元发送化学物质。
二、神经元模型
1943 年,McCulloch 和 Pitts 将上述情形抽象为 M-P 神经元模型。神经元接收来自 n 个其他神经元传递过来的输入信号 x,这些输入信号通过带权重 w 的连接进行传递,神经元接收到的总输入值
∑
i
=
1
n
w
i
x
i
\sum_{i=1}^{n}w_ix_i
∑i=1nwixi,将与神经元的阈值 θ 进行比较,然后通过“激活函数”f 处理产生神经元的输出:
y
=
f
(
∑
i
=
1
n
w
i
x
i
−
θ
)
y=f(\sum_{i=1}^{n}w_ix_i-θ)
y=f(i=1∑nwixi−θ)
M-P 神经元模型:
在上面的神经元模型中,包含两层神经元(输入层和输出层),只拥有一层功能神经元(因为只有输出层神经元进行激活函数处理)。回想逻辑回归,和上面的模型是非常相似的,其中激活函数是Sigmoid函数:
三、神经网络模型与前向传播
如果在此基础上加一层隐藏层,就构成了浅层神经网络(三层:输入层、隐藏层、输出层):
标上“+1”的圆圈被称为偏置节点,也就是截距项。没有其他单元连向偏置单元(即偏置单元没有输入),因为它们总是输出 +1。
我们用
n
l
n_l
nl来表示网络的层数,本例中
n
l
=
3
n_l=3
nl=3 ,我们将第
l
l
l层记为
L
l
L_l
Ll,于是
L
1
L_1
L1是输入层,输出层是
L
n
l
L_{n_l}
Lnl 。 本例神经网络有参数
(
W
,
b
)
=
(
W
(
1
)
,
b
(
1
)
,
W
(
2
)
,
b
(
2
)
)
(W,b) = (W^{(1)}, b^{(1)}, W^{(2)}, b^{(2)})
(W,b)=(W(1),b(1),W(2),b(2)),其中
W
i
j
(
l
)
W^{(l)}_{ij}
Wij(l) (下面的式子中用到)是第
l
l
l层第j单元与第
l
+
1
l+1
l+1层第i单元之间的联接参数(其实就是连接线上的权重,注意标号顺序),
b
i
(
l
)
b^{(l)}_i
bi(l) 是第
l
+
1
l+1
l+1层第i单元的偏置项。因此在本例中,
W
(
1
)
∈
ℜ
3
×
3
W^{(1)} \in \Re^{3\times 3}
W(1)∈ℜ3×3,
W
(
2
)
∈
ℜ
1
×
3
W^{(2)} \in \Re^{1\times 3}
W(2)∈ℜ1×3。我们用
s
l
s_l
sl 表示第
l
l
l层的节点数(偏置单元不计在内)。
你也许会问,为什么权重的标号为什么要这样设计?这主要是为了便于模型用于矩阵表示运算,将输出的索引放在前面的话,则线性运算不用转置,即直接为 w x + b wx+b wx+b
我们用
a
i
(
l
)
a^{(l)}_i
ai(l)表示第
l
l
l层第i单元的激活值(输出值)。当
l
=
1
l=1
l=1时,
a
i
(
1
)
=
x
i
a^{(1)}_i = x_i
ai(1)=xi,也就是第i个输入值(输入值的第i个特征)。对于给定参数集合W,b,我们的神经网络就可以按照函数
h
W
,
b
(
x
)
h_{W,b}(x)
hW,b(x)来计算输出结果。本例神经网络的计算步骤如下:
a
1
(
2
)
=
f
(
W
11
(
1
)
x
1
+
W
12
(
1
)
x
2
+
W
13
(
1
)
x
3
+
b
1
(
1
)
)
a
2
(
2
)
=
f
(
W
21
(
1
)
x
1
+
W
22
(
1
)
x
2
+
W
23
(
1
)
x
3
+
b
2
(
1
)
)
a
3
(
2
)
=
f
(
W
31
(
1
)
x
1
+
W
32
(
1
)
x
2
+
W
33
(
1
)
x
3
+
b
3
(
1
)
h
W
,
b
(
x
)
=
a
1
(
3
)
=
f
(
W
11
(
2
)
a
1
(
2
)
+
W
12
(
2
)
a
2
(
2
)
+
W
13
(
2
)
a
3
(
2
)
+
b
1
(
2
)
)
a_1^{(2)}= f(W_{11}^{(1)}x_1 + W_{12}^{(1)} x_2 + W_{13}^{(1)} x_3 + b_1^{(1)})\\ a_2^{(2)}= f(W_{21}^{(1)}x_1 + W_{22}^{(1)} x_2 + W_{23}^{(1)} x_3 + b_2^{(1)})\\ a_3^{(2)} = f(W_{31}^{(1)}x_1 + W_{32}^{(1)} x_2 + W_{33}^{(1)} x_3 + b_3^{(1)}\\ h_{W,b}(x) = a_1^{(3)} = f(W_{11}^{(2)}a_1^{(2)} + W_{12}^{(2)} a_2^{(2)} + W_{13}^{(2)} a_3^{(2)} + b_1^{(2)})
a1(2)=f(W11(1)x1+W12(1)x2+W13(1)x3+b1(1))a2(2)=f(W21(1)x1+W22(1)x2+W23(1)x3+b2(1))a3(2)=f(W31(1)x1+W32(1)x2+W33(1)x3+b3(1)hW,b(x)=a1(3)=f(W11(2)a1(2)+W12(2)a2(2)+W13(2)a3(2)+b1(2))
我们用 z i ( l ) z^{(l)}_i zi(l)表示第 l l l层第 i i i单元输入加权和(包括偏置单元),比如, z i ( 2 ) = ∑ j = 1 n W i j ( 1 ) x j + b i ( 1 ) z_i^{(2)} = \sum_{j=1}^n W^{(1)}_{ij} x_j + b^{(1)}_i zi(2)=∑j=1nWij(1)xj+bi(1),则 a i ( l ) = f ( z i ( l ) ) a^{(l)}_i = f(z^{(l)}_i) ai(l)=f(zi(l))。
这样我们就可以得到一种更简洁的表示法。这里我们将激活函数
f
(
⋅
)
f(\cdot)
f(⋅)扩展为用向量来表示,即
f
(
[
z
1
,
z
2
,
z
3
]
)
=
[
f
(
z
1
)
,
f
(
z
2
)
,
f
(
z
3
)
]
f([z_1, z_2, z_3]) = [f(z_1), f(z_2), f(z_3)]
f([z1,z2,z3])=[f(z1),f(z2),f(z3)],那么,上面的等式可以更简洁地表示为:
z
(
2
)
=
W
(
1
)
x
+
b
(
1
)
a
(
2
)
=
f
(
z
(
2
)
)
z
(
3
)
=
W
(
2
)
a
(
2
)
+
b
(
2
)
h
W
,
b
(
x
)
=
a
(
3
)
=
f
(
z
(
3
)
)
z^{(2)} = W^{(1)} x + b^{(1)}\\ a^{(2)} = f(z^{(2)})\\ z^{(3)} = W^{(2)} a^{(2)} + b^{(2)}\\ h_{W,b}(x) = a^{(3)} = f(z^{(3)})
z(2)=W(1)x+b(1)a(2)=f(z(2))z(3)=W(2)a(2)+b(2)hW,b(x)=a(3)=f(z(3))
我们将上面的计算步骤叫作前向传播。回想一下,之前我们用
a
(
1
)
=
x
a^{(1)} = x
a(1)=x表示输入层的激活值,那么给定第
l
l
l层的激活值
a
(
l
)
a^{(l)}
a(l)后,第
l
+
1
l+1
l+1层的激活值
a
(
l
+
1
)
a^{(l+1)}
a(l+1)就可以按照下面步骤计算得到:
z
(
l
+
1
)
=
W
(
l
)
a
(
l
)
+
b
(
l
)
a
(
l
+
1
)
=
f
(
z
(
l
+
1
)
)
z^{(l+1)} = W^{(l)} a^{(l)} + b^{(l)} \\ a^{(l+1)} = f(z^{(l+1)})
z(l+1)=W(l)a(l)+b(l)a(l+1)=f(z(l+1))
将参数矩阵化,使用矩阵-向量运算方式,我们就可以利用线性代数的优势对神经网络进行快速求解。
如果包含多个隐藏层的神经网络(深度神经网络DNN),可以按照之前描述的等式,按部就班,进行前向传播,逐一计算第 L 2 L_2 L2层的所有激活值,然后是第 L 3 L_3 L3层的激活值,以此类推,直到第 L n l L_{n_l} Lnl层。这是一个前馈神经网络的例子,因为这种联接图没有闭环或回路。
通过上面的过程可以看出,DNN的前向传播算法也就是利用我们的若干个权重系数矩阵W,偏倚向量b来和输入值向量x进行一系列线性运算和激活运算,从输入层开始,一层层的向后计算,一直到运算到输出层,得到输出结果为止。
四、DNN反向传播 BP算法
公式推导:https://www.cnblogs.com/pinard/p/6422831.html 公式部分看不太懂。
大白话讲解:https://blog.csdn.net/zhaomengszu/article/details/77834845
三、用神经网络做分类
之前做分类,我们用逻辑回归或者linear SVM(LR和Linear SVM的区别就是,LR找到这样一条直线将数据分成两部分即可,而Linear SVM则是试图找到一条最大间隔化的、具有鲁棒性的直线使其可分),都是解决的线性可分的数据,如果数据是非线性可分(找不到一条直线能够分开两类样本点)呢?
直线划分 + 逻辑操作 选定模块区域,然后多块区域之间能OR 组合