单层感知器
包含:输入节点,输出节点,权向量,偏置因子,激活函数;
例:
感知器学习规则
y
=
f
(
∑
i
=
1
n
x
i
⋅
w
i
)
y = f(\sum_{i=1}^{n} x_i \cdot w_i)
y=f(∑i=1nxi⋅wi) 或者
y
=
f
(
∑
i
=
1
n
x
i
⋅
w
i
+
b
)
y = f(\sum_{i=1}^{n} x_i \cdot w_i + b)
y=f(∑i=1nxi⋅wi+b)
y
y
y是输出函数,
f
f
f是激活函数,
Δ
w
i
=
η
(
t
−
y
)
x
i
\Delta w_i = \eta(t - y)x_i
Δwi=η(t−y)xi
η
\eta
η表示学习率,
t
t
t表示正确的标签,
t
t
t和
y
y
y的取值为
±
1
\pm1
±1
Δ
w
i
=
±
2
η
x
i
\Delta w_i = \pm 2\eta x_i
Δwi=±2ηxi
学习率
η
\eta
η取值一般
0
−
1
0-1
0−1之间;
学习率太大容易造成权值调整不稳定;
学习率太小,权值调整太慢,迭代次数太多;
此处的感知器学习规则和LSM、NLSM等算法的逻辑基本一致。
主要研究内容:收敛速度与学习率之间的权衡。
模型收敛条件
1、误差小于预先设定值;
2、两次迭代之间的权值变化很小;
3、设定最大迭代次数,当迭代超过最大次数时停止;
实例分析
问题描述
假设平面直角坐标系中有三个点,(2,4), (3 3)这两个点的标签为1,(1,3)点的标签为-1。构建单层感知器来进行分类。
解决方案
需要分类的数据为2维数据,因此单层感知器的输入为2个节点。由于单层感知器有固定的偏置,此处将此偏置设置为一个节点,最终此感知器分类需要3个节点。
步骤
输入数据:(1,2,4) (1,3,3) (1,1,3)
数据对应的标签为(1,1,-1)
初始化权值:
w
0
,
w
1
,
w
2
w_0, w_1, w_2
w0,w1,w2取-1到1之间的随机数
学习率(learning rate)设置为0.15
激活函数:sign函数
#权值初始化,3行1列,取值范围-1到1
# 权值矩阵维度定义:输入与输出的个数,几个输入-几行 几个输出-几列
W = (np.random.random([3,1])-0.5)*2
.......
# 感知学习规则
def update():
global X,Y,W,lr
O = np.sign(np.dot(X,W)) # shape:(3,1) 网络输出
W_C = lr*(X.T.dot(Y-O))/int(X.shape[0]) # 累加了三次w,在进行平均..X与W_C点乘
W = W + W_C
线性神经网络
线性神经网络在结构上与感知器非常相似,只是激活函数不同。在模型训练时把原来的sign函数改成purelin函数: y = x y=x y=x
def update():
global X,Y,W,lr
O = np.dot(X,W) # 和单层感知的区别在于网络输出函数不同 即激活函数由sign函数变为purelin函数
print('O',O)
W_C = lr*(X.T.dot(Y-O))/int(X.shape[0])
W = W + W_C
简单应用
线性神经网络用于异或问题;
Delta学习规则
δ
\delta
δ规则:连续感知器学习规则。一种利用梯度下降法的一般性的学习规则。
代价函数(损失函数)(Cost Function , Lost Function)
二次代价函数:
E
=
1
/
2
(
t
−
y
)
2
=
1
/
2
[
t
−
f
(
W
X
)
]
2
E = 1/2(t-y)^2 = 1/2[t-f(WX)]^2
E=1/2(t−y)2=1/2[t−f(WX)]2
误差E是权向量W的函数,利用梯度下降法来最小化E的值:
Δ
W
=
−
η
E
′
=
−
η
X
T
(
t
−
y
)
f
′
(
W
X
)
=
η
X
T
δ
\Delta W = -\eta E'= -\eta X^T(t-y)f'(WX) = \eta X^T \delta
ΔW=−ηE′=−ηXT(t−y)f′(WX)=ηXTδ
Δ
w
i
=
−
η
E
′
=
−
η
x
i
(
t
−
y
)
f
′
(
W
X
)
=
η
x
i
δ
\Delta w_i = -\eta E'= -\eta x_i(t-y)f'(WX) = \eta x_i \delta
Δwi=−ηE′=−ηxi(t−y)f′(WX)=ηxiδ
最小二乘法:选取合适的权值,使得误差E最小。
梯度下降法的问题
学习率难以选取,太大产生震荡,太小收敛缓慢;
容易陷入局部最优解(局部极小值),我们需要全局最小值;
BP神经网络(Back Propagation Neural Network)
解决多层神经网络的学习问题。广泛应用于分类识别、逼近、回归、压缩等领域。
网络结构
输入层(Input Layer),隐藏层(Hidden Layers),输出层(Output Layer)
BP算法
E
=
1
/
2
(
t
−
y
)
2
E = 1/2(t-y)^2
E=1/2(t−y)2 Delta学习规则
∂
E
∂
W
l
=
−
(
X
l
)
T
δ
l
\frac{\partial E}{\partial W^l} = -(X^l)^T \delta^l
∂Wl∂E=−(Xl)Tδl
Δ
W
l
=
−
η
∂
E
∂
W
l
=
η
(
X
l
)
T
δ
l
\Delta W^l = -\eta \frac{\partial E}{\partial W^l} = \eta(X^l)^T \delta^l
ΔWl=−η∂Wl∂E=η(Xl)Tδl
δ
l
\delta^l
δl 第
l
l
l层学习信号
δ
L
\delta^L
δL 输出层学习信号
W
l
W^l
Wl第
l
−
l
+
1
l-l+1
l−l+1层权值
X
l
X^l
Xl第
l
l
l层的输入信号
δ
L
=
(
t
−
y
)
f
′
(
X
L
W
L
)
\delta^L = (t-y)f'(X^LW^L)
δL=(t−y)f′(XLWL)
δ
l
=
δ
l
+
1
(
W
l
+
1
)
T
f
′
(
X
l
W
l
)
\delta^l = \delta^{l+1}(W^{l+1})^Tf'(X^lW^l)
δl=δl+1(Wl+1)Tf′(XlWl)
例
Δ
W
l
3
=
−
η
δ
l
3
X
l
3
=
η
(
t
−
y
)
f
′
(
X
l
3
W
l
3
)
X
l
3
\Delta W^{l3} = -\eta \delta^{l3}X^{l3} = \eta (t-y)f'(X^{l3}W^{l3})X^{l3}
ΔWl3=−ηδl3Xl3=η(t−y)f′(Xl3Wl3)Xl3
δ
l
3
=
(
t
−
y
)
f
′
(
X
l
3
W
l
3
)
\delta^{l3} = (t-y)f'(X^{l3}W^{l3})
δl3=(t−y)f′(Xl3Wl3)
Δ
W
l
2
=
−
η
δ
l
2
X
l
2
=
η
δ
l
3
(
W
l
3
)
T
f
′
(
X
l
2
W
l
2
)
X
l
2
\Delta W^{l2} = -\eta \delta^{l2}X^{l2} = \eta \delta^{l3}(W^{l3})^T f'(X^{l2}W^{l2})X^{l2}
ΔWl2=−ηδl2Xl2=ηδl3(Wl3)Tf′(Xl2Wl2)Xl2
δ
l
2
=
δ
l
3
(
W
l
3
)
T
f
′
(
X
l
2
W
l
2
)
\delta^{l2} = \delta^{l3}(W^{l3})^Tf'(X^{l2}W^{l2})
δl2=δl3(Wl3)Tf′(Xl2Wl2)
Δ
W
l
1
=
−
η
δ
l
1
X
l
1
=
η
δ
l
2
(
W
l
2
)
T
f
′
(
X
l
1
W
l
1
)
X
l
1
\Delta W^{l1} = -\eta \delta^{l1}X^{l1} = \eta \delta^{l2}(W^{l2})^Tf'(X^{l1}W^{l1})X^{l1}
ΔWl1=−ηδl1Xl1=ηδl2(Wl2)Tf′(Xl1Wl1)Xl1
δ
l
1
=
δ
l
2
(
W
l
2
)
T
f
′
(
X
l
1
W
l
1
)
\delta^{l1} = \delta^{l2}(W^{l2})^Tf'(X^{l1}W^{l1})
δl1=δl2(Wl2)Tf′(Xl1Wl1)
常用的激活函数
Sigmoid函数
f
(
x
)
=
1
1
+
e
−
x
f(x) = \frac{1}{1+e^{-x}}
f(x)=1+e−x1
Tanh函数
f
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
f(x)=ex+e−xex−e−x
Softsign函数
x
1
+
∣
x
∣
\frac{x}{1+\left |x \right |}
1+∣x∣x
ReLU函数(非线性边界)
f
(
u
)
=
m
a
x
(
0
,
u
)
f(u) = max(0, u)
f(u)=max(0,u)
BP神经网络解决异或问题
#权值初始化,取值范围-1到1
V = np.random.random([3,10])*2-1 # 输入3层,输出10层,输出中间隐藏层
W = np.random.random([10,1])*2-1 # 输入10层,输出1层,最终输出层
# 激活函数
def sigmoid(x):
return 1/(1+np.exp(-x))
def dsigmoid(x):
return x*(1-x)
def update():
global X,Y,W,V,lr
# 求每一层输出
L1 = sigmoid(np.dot(X,V))#隐藏层输出 (4,10)
L2 = sigmoid(np.dot(L1,W))#输出层输出 (4,1)
# 求每一层的学习信号 # BP算法中的delta计算方法
L2_delta = (Y - L2)*dsigmoid(L2) #(4,1)
L1_delta = L2_delta.dot(W.T)*dsigmoid(L1) #(4,10)
# 求每一层权值的改变
W_C = lr*L1.T.dot(L2_delta)
V_C = lr*X.T.dot(L1_delta)
# 改变权值
W = W + W_C
V = V + V_C
SKlearn 神经网络-手写数字识别
digits = load_digits()#载入数据
x_data = digits.data #数据
y_data = digits.target #标签
x_train,x_test,y_train,y_test = train_test_split(x_data,y_data) #分割数据1/4为测试数据,3/4为训练数据
mlp = MLPClassifier(hidden_layer_sizes=(100,50) ,max_iter=500) # hidden_layer_sizes 隐藏层1 有100个神经元 隐藏层2 有50个神经元 max_iter 迭代次数500
mlp.fit(x_train,y_train)
predictions = mlp.predict(x_test)