神经网络笔记 by Zk
模拟人脑神经细胞的工作特点
- 单元间的广泛连接
- 并行分布式的信息存储和处理
- 自适应学习能力
基本特点
- 可以处理非线性。(网,图之类的数据可以进行处理)
- 并行结构,这样的结构最便于计算机并行处理(想一想电脑CPU是多核的,可以同时处理多个任务)
- 具有学习记忆能力(越来越逼近真实,越来越强)
神经元
神经元的基本介绍
神经元是神经网络的基本单位,相当于盖高楼大厦的砖块。
神经元接受输入,对其做一些数据操作,然后产生输出。
神经元的运行过程
神经元。神经元接受输入,对其做一些数据操作,然后产生输出。例如,这是一个2-输入神经元:
这里发生了三个事情。首先,每个输入都跟一个权重相乘(红色):
x
1
←
x
1
×
w
1
x
2
←
x
2
×
w
2
\begin{array}{l}{x_{1} \leftarrow x_{1} \times w_{1}} \\ {x_{2} \leftarrow x_{2} \times w_{2}}\end{array}
x1←x1×w1x2←x2×w2
然后,为了保证可靠性,加权后的输入求和,加上一个偏差b(绿色)用来修饰调整输出
(
x
1
×
w
1
)
+
(
x
2
×
w
2
)
+
b
(x_1×w_1)+(x_2×w_2)+b
(x1×w1)+(x2×w2)+b
最后,这个结果传递给一个激活函数f:
y
=
f
(
x
1
×
w
1
+
x
2
×
w
2
+
b
)
y=f\left(x_{1} \times w_{1}+x_{2} \times w_{2}+b\right)
y=f(x1×w1+x2×w2+b)
激活函数的用途是将一个无边界的输入,转变成一个可预测的形式。常用的激活函数就就是S型函数:
它的用处嘛…简单来说,就是把(−∞, +∞)压缩到(0, 1) ,很大的负数约等于0,很大的正数约等于1。
常用传递函数
计算公式
输入值求和: S j = ∑ i = 1 n w j i ∗ x i + b j S_{j}=\sum_{i=1}^{n} w_{j i} * x_{i}+b_{j} Sj=∑i=1nwji∗xi+bj
输出值计算: y j = f ( S j ) y_j = f(S_j) yj=f(Sj)
X为输入,W为权值,y为输出,b为阈值,f(*)为激活函数
BP神经网络定义
BP(Back Propagation)是一种按误差逆传播算法训练的多层前馈网络。是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。
核心思想
将传递函数变为非线性可微函数
BP算法由数据流的前向计算(正向传播)和误差信号的反向传播两个过程构成。
-
前向计算(正向传播)
用来计算用现在的网络和输入数值得到的结果,将结果与真实值比较
-
误差信号的反向传播
用来调整神经网络的权值,也就是学习纠正的过程
这玩意儿的用途
- 函数逼近:用输入向量和相应的输出向量训练网络逼近函数
- 模式识别:用特定的输出向量将它与输入向量联系起来
- 分类:输入向量分类
- 数据压缩:减少输入向量维数
神经元组装成网络
把砖块盖成大楼
所谓的神经网络就是一堆神经元。这就是一个简单的神经网络:
这个网络有两个输入,一个有两个神经元( h 1 h_1 h1和 h 2 h_2 h2 )的隐藏层,以及一个有一个神经元( o 1 o_1 o1)的输出层。要注意, o 1 o_1 o1 的输入就是 h 1 h_1 h1和 h 2 h_2 h2 的输出,这样就组成了一个网络。
BP神经网络的学习
前馈/前向计算(正向传播)
给神经元输入数据和权值,得到神经元的输出结果。
某层任意一神经元 j j j的输入为 w w w,输出为 y j y_j yj
相邻低一层中任一神经元 i i i的输出为 y i y_i yi
n
e
t
j
=
∑
i
w
i
j
y
i
y
j
=
f
(
n
e
t
j
)
\begin{array}{l}{n e t_{j}=\sum_{i} w_{i j} y_{i}} \\ {y_{j}=f\left(n e t_{j}\right)}\end{array}
netj=∑iwijyiyj=f(netj)
w
i
j
w_{ij}
wij:神经元i和j之间的连接权
f ( ⋅ ) f(·) f(⋅):神经元的输出函数
y
j
=
f
(
n
e
t
j
)
=
1
1
+
e
−
(
n
e
t
j
+
θ
j
)
/
h
0
y_{j}=f\left(n e t_{j}\right)=\frac{1}{1+e^{-\left(n e t_{j}+\theta_{j}\right) / h_{0}}}
yj=f(netj)=1+e−(netj+θj)/h01
θ
j
\theta_{j}
θj:神经元阈值;
h 0 h_0 h0:修改输出函数形状的参数;
误差信号的反向传播(损失反馈调整权值)
在训练网络之前,我们需要量化当前的网络是 好 还是 坏 ,从而可以寻找更好的网络。这就是定义损失的目的。
衡量损失的方法:采用均方差,是所有方差的平均值。均方差越小,预测效果越好,损失就越少。
输入n组数据,系统的均方差为
E
=
1
N
∑
i
=
1
N
(
d
p
k
−
y
p
k
)
2
=
1
N
∑
p
E
p
E=\frac{1}{N}\sum_{i=1}^{N}\left(d_{p k}-y_{p k}\right)^{2}\\=\frac{1}{N} \sum_{p} E_{p}
E=N1i=1∑N(dpk−ypk)2=N1p∑Ep
-
N N N是你喂给神经网络的数据的数目。
-
d p k d_{pk} dpk代表变量的真实值,也就是正确答案(训练的时候需要你喂给它)。
-
y p k y_{pk} ypk代表变量的预测值,是通过现在的网络计算得出来的
-
( d p k − y p k ) 2 (d_{p k}-y_{p k})^{2} (dpk−ypk)2被称为方差,我们的损失函数就是所有方差的平均值。预测效果越好,损失就越少。
-
更好的预测 = 更少的损失!
训练网络 = 最小化它的损失!
现在我们有了一个明确的目标:最小化神经网络的损失。通过调整网络的权重和截距项,我们可以改变其预测结果,但如何才能逐步地减少损失?
根据变量的损失,计算出对于 w w w的修正增量,对权值进行修正
我们可以把整体神经网络的损失(均方差)看成是关于各权值和截距项常数的函数。
E ( w 1 , w 2 , . . . , w n , b 1 , b 2 , . . . , b n ) E\left(w_{1}, w_{2}, ...,w_{n}, b_{1}, b_{2}, ...,b_{n}\right) E(w1,w2,...,wn,b1,b2,...,bn)
假如我们要优化权值 w 1 w_1 w1,当我们改变 w 1 w_1 w1时,损失 E E E会怎么变化。
我们可以通过 ∂ L ∂ w 1 \frac{\partial L}{\partial w_{1}} ∂w1∂L来表示修正量,偏导数也就是高数里面学过的梯度向量(可能…忘光了,不过有点印象就行)。因为沿梯度方向时,方向导数取得最大值,计算速度最快。因此,在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数。当梯度向量为零,说明到达一个极值点,这也是梯度下降算法迭代计算的终止条件。
推导步骤(嫌麻烦或高数忘光了可以不看,直接看结论部分)
首先,让我们用
∂
y
p
k
∂
w
1
\frac{\partial y_{pk}}{\partial w_{1}}
∂w1∂ypk来改写这个偏导数:
∂
E
∂
w
1
=
∂
E
∂
y
p
k
×
∂
y
p
k
∂
w
1
\frac{\partial E}{\partial w_{1}}=\frac{\partial E}{\partial y_{pk}} × \frac{\partial y_{pk}}{\partial w_{1}}
∂w1∂E=∂ypk∂E×∂w1∂ypk
而我们知道,对于单个数据
E
=
(
d
p
k
−
y
p
k
)
2
E = \left(d_{p k}-y_{p k}\right)^{2}
E=(dpk−ypk)2,因此我们可以计算
∂
E
∂
p
k
\frac{\partial E}{\partial_{pk}}
∂pk∂E,
∂
E
∂
y
p
k
=
∂
(
1
−
y
p
k
)
2
∂
y
p
k
=
−
2
(
1
−
y
p
k
)
\frac{\partial E}{\partial y_{pk}}=\frac{\partial\left(1-y_{pk}\right)^{2}}{\partial y_{pk}}=-2\left(1-y_{pk}\right)
∂ypk∂E=∂ypk∂(1−ypk)2=−2(1−ypk)
接下来我们来搞定
∂
y
p
k
∂
w
1
\frac{\partial y_{pk}}{\partial w_{1}}
∂w1∂ypk
y p k = f ( ⋅ ) y_{pk} = f(·) ypk=f(⋅),即输入变量经过神经元输出函数得到的输出
由于我们要计算的权值
w
1
w_1
w1仅仅与对应的输入
x
1
x_1
x1有关,所以
∂
y
p
k
∂
w
1
=
∂
y
p
k
∂
x
1
∗
∂
x
1
∂
w
1
∂
y
p
k
∂
x
1
=
w
⋅
∗
f
′
(
⋅
)
\begin{array}{c}{\frac{\partial y_{pk}}{\partial w_{1}}=\frac{\partial y_{pk}}{\partial x_{1}} * \frac{\partial x_{1}}{\partial w_{1}}} \\ {\frac{\partial y_{pk}}{\partial x_{1}}=w_{·} * f^{\prime}\left(·\right)}\end{array}
∂w1∂ypk=∂x1∂ypk∗∂w1∂x1∂x1∂ypk=w⋅∗f′(⋅)
对输出函数求导得到
f
(
x
)
=
1
1
−
e
−
x
f
′
(
x
)
=
e
x
(
1
+
e
−
x
)
2
=
f
(
x
)
∗
(
1
−
f
(
x
)
)
\begin{array}{c}{f(x)=\frac{1}{1-e^{-x}}} \\ {f^{\prime}(x)=\frac{e^{x}}{\left(1+e^{-x}\right)^{2}}=f(x) *(1-f(x))}\end{array}
f(x)=1−e−x1f′(x)=(1+e−x)2ex=f(x)∗(1−f(x))
结论
输出单元的误差:
∂ E ∂ w 1 = ∂ E ∂ y p k ∂ y p k ∂ x 1 ∂ x 1 ∂ w 1 \frac{\partial E}{\partial w_{1}}=\frac{\partial E}{\partial y_{pk}} \frac{\partial y_{pk}}{\partial x_{1}} \frac{\partial x_{1}}{\partial w_{1}} ∂w1∂E=∂ypk∂E∂x1∂ypk∂w1∂x1
输出单元的修正增量:
η ∂ E ∂ w 1 \eta\frac{\partial E}{\partial w_{1}} η∂w1∂E
使用名为随机梯度下降法的优化算法来优化网络的权重和截距项,实现损失的最小化。
w
1
←
w
1
−
η
∂
E
∂
w
1
w_{1} \leftarrow w_{1}-\eta \frac{\partial E}{\partial w_{1}}
w1←w1−η∂w1∂E
通过梯度向量求得修正增量来修正权值
w
1
w_1
w1,优化权重和截距向量
η \eta η是一个常数,被称为学习率,用于调整训练的速度。
我们要做的就是用 w 1 w_1 w1减去 η ∂ E ∂ w 1 \eta\frac{\partial E}{\partial w_{1}} η∂w1∂E:
- 如果 ∂ E ∂ w 1 \frac{\partial E}{\partial w_{1}} ∂w1∂E是正数, w 1 w_1 w1会变小, L L L会下降
- 如果 ∂ E ∂ w 1 \frac{\partial E}{\partial w_{1}} ∂w1∂E是负数, w 1 w_1 w1会变大, L L L会上升
训练算法流程
- 从我们的数据集中选择一个样本,用随机梯度下降法进行优化——每次我们都只针对一个样本进行优化;
- 计算每个权重或截距项对损失的偏导;
- 用更新等式更新每个权重和截距项;
- 重复第一步;
BP算法建模步骤
- 对权值和神经元阈值初始化:(0,1)上分布的随机数。
- 输入样本,指定输出层各神经元的希望输出值。
- 依次计算每层神经元的实际输出。
- 从输出层开始修正每个权值,直到第一隐层。
- 转到第2步,循环至权值稳定或者达到循环次数为止。
参考:
知乎·陈钢·用Python从头实现一个神经网络 https://zhuanlan.zhihu.com/p/58964140(推荐食用)
Machine Learning for Beginners: An Introduction to Neural Networks https://victorzhou.com/blog/intro-to-neural-networks/
河南科技大学·张瑞民·神经网络讲解与实例.ppt