前言
很早就听说了神经网络,上学期在一个老师那儿也了解了一些,但总感觉神经网络太难,不敢去学,这次跟着Datawhale组队学习,虽然模模糊糊也算入门了吧。。。。
神经元模型
在生物神经网络中,每个神经元与其他神经元相连,当神经元兴奋时,会向相连的神经元传递化学物质,改变神经元内的电位分布,当电位超过阈值时,就会被激活,向其他神经元传递信息。
模拟生物神经元,机器学习抽象出了简单的模型。
上图就是抽象的模型:M-P神经元模型。
神经元收到来自其他n个神经元传递的输入信号,这些信号通过带权重的边进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,通过激活函数产生神经元的输出。
常用的激活函数有阶跃函数和Sigmoid函数:
多个神经元模型连接起来就构成了神经元网络。
前一个神经元的输入乘以边权作为下一个神经元的输入,该神经元的输出就是输入减去阈值带入激活函数得到的。
感知机与多层网络
感知机就是只有一个神经元的模型,该神经元直接作为输出:
感知机能够容易的实现逻辑与、或、非的运算。
因为
y
=
f
(
∑
i
w
i
x
i
−
θ
i
)
y=f(\sum_iw_ix_i-\theta_i)
y=f(∑iwixi−θi)
令
w
1
=
w
2
=
1
,
θ
=
2
w_1=w_2=1,\theta =2
w1=w2=1,θ=2可实现逻辑与;
令
w
1
=
w
2
=
1
,
θ
=
0.5
w_1=w_2=1,\theta=0.5
w1=w2=1,θ=0.5可实现逻辑或;
令
w
1
=
−
0.6
,
w
2
=
0
,
θ
=
0.5
w_1=-0.6,w_2=0,\theta=0.5
w1=−0.6,w2=0,θ=0.5可实现非。
一般的给定数据集,权重
w
i
(
i
=
1
,
2
,
.
.
.
.
,
n
)
w_i(i=1,2,....,n)
wi(i=1,2,....,n)以及阈值
θ
\theta
θ可通过学习得到。阈值固定为-1,对应的边权为
w
n
+
1
w_{n+1}
wn+1,可统一为边权的学习。对训练样例
(
x
,
y
)
(x,y)
(x,y),若感知机输出为y’,则权重调整为:
w
i
=
w
i
+
Δ
w
i
w_i=w_i+\Delta w_i
wi=wi+Δwi
Δ
w
i
=
η
(
y
−
y
′
)
x
i
\Delta w_i=\eta (y-y')x_i
Δwi=η(y−y′)xi
η
∈
(
0
,
1
)
\eta ∈(0,1)
η∈(0,1)称为学习率。
但是,感知机只能处理线性可分的问题,对于非线性可分的问题,单个神经元就无能为力了,需要使用多层功能神经元,输入层与输出层之间可能有多层功能神经元,称为隐藏层。
一般常见的是如图所示的“多层前馈神经网络”,每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接。
输入层神经元只接收外界输入,隐藏层神经元对信号进行加工,最终结果由输出层神经元输出。学习过程中,神经网络根据训练数据来调整神经网络之间的“连接权”以及功能神经元的阈值。
误差逆传播算法
误差你传播算法简称BP算法。
BP算法:
给定训练集
D
=
(
x
i
,
y
i
)
D={(x_i,y_i)}
D=(xi,yi),输入由d个属性描述,输出为l维实值向量,如上图所示的神经网络。假设输出层第j个神经元的阈值用
θ
j
\theta _j
θj表示,隐藏层第h个神经元的阈值用
γ
h
\gamma _h
γh表示,输入层与第i个神经元与隐藏层第h个神经元的连接权是
v
i
h
v_{ih}
vih,隐藏层与输出层之间的连接权是
w
h
j
w_{hj}
whj,
1/2是为了便于求导。
BP算法是基于梯度下降的策略,以目标的负梯度方向对参数进行调整。就是调整那一层的神经元的输入参数就将损失函数对该输入前一层的输出进行就偏导,乘以学习率即可得到变化量。
例如调整
v
i
h
v_{ih}
vih:
其实就是链式求导,改变那个参数就用损失函数对该参数进行求梯度,然后用该变量改变参数。
学习率对于不同层可以不同。
BP算法的目标是使累积误差
E
=
1
m
∑
k
=
1
m
E
k
E=\frac{1}{m} \sum_{k=1}^{m}E_k
E=m1∑k=1mEk最小,实际过程中通常将所有输入都读取提一遍后计算累积误差再对参数进行更新。
此外,如何确定神经元的个数也是个问题,实际中常用试错法调整。
神经网络也经常过拟合,通常用早停和正则化的方法进行改进。
早停:将数据分为训练集和验证集,训练集用来计算梯度、更新链接权和阈值,验证集用来估计误差,如果训练集误差降低但是验证集误差升高,则停止训练,同时返回具有最小验证集的连接权和阈值。
正则化:在误差函数中加一个描述网络复杂度的部分,例如连接权与阈值的和,用
w
i
w_i
wi表示连接权和阈值的平方和,则误差函数变为:
E
=
λ
1
m
∑
k
=
1
m
E
k
+
(
1
−
λ
)
∑
i
w
i
2
E=\lambda \frac{1}{m}\sum_{k=1}^{m}E_k+(1-\lambda)\sum_iw_i^2
E=λm1k=1∑mEk+(1−λ)i∑wi2
其中
λ
∈
(
0
,
1
)
\lambda ∈(0,1)
λ∈(0,1)用于对经验误差和网络复杂度这两项进行折中,常通过交叉验证法来估计。
全局最小与局部最小
神经网络得到的函数极其复杂,梯度下降计算的误差可能是局部最小的,现实中常采用以下方法跳出局部最小:
- 以不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数。
- 使用:“模拟退火”技术,在每一步都以一定概率接受比当前解更差的结果,接受次优解的概率要随时间的推移逐渐降低。
- 随机梯度下降,计算梯度时加入随机因素。
- 遗传算法
这些方法都是启发式的。