单层感知器
包含:输入节点,输出节点,权向量,偏置因子,激活函数;
例:
感知器学习规则
y=f(∑i=1nxi⋅wi)y = f(\sum_{i=1}^{n} x_i \cdot w_i)y=f(∑i=1nxi⋅wi) 或者y=f(∑i=1nxi⋅wi+b)y = f(\sum_{i=1}^{n} x_i \cdot w_i + b)y=f(∑i=1nxi⋅wi+b)
yyy是输出函数,fff是激活函数,
Δwi=η(t−y)xi\Delta w_i = \eta(t - y)x_iΔwi=η(t−y)xi
η\etaη表示学习率,ttt表示正确的标签,ttt和yyy的取值为±1\pm1±1
Δwi=±2ηxi\Delta w_i = \pm 2\eta x_iΔwi=±2ηxi
学习率
η\etaη取值一般0−10-10−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)
初始化权值:w0,w1,w2w_0, w_1, w_2w0,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=xy=xy=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(WX)]2E = 1/2(t-y)^2 = 1/2[t-f(WX)]^2E=1/2(t−y)2=1/2[t−f(WX)]2
误差E是权向量W的函数,利用梯度下降法来最小化E的值:
ΔW=−ηE′=−ηXT(t−y)f′(WX)=ηXTδ\Delta W = -\eta E'= -\eta X^T(t-y)f'(WX) = \eta X^T \deltaΔW=−ηE′=−ηXT(t−y)f′(WX)=ηXTδ
Δwi=−ηE′=−ηxi(t−y)f′(WX)=ηxiδ\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)2E = 1/2(t-y)^2E=1/2(t−y)2 Delta学习规则
∂E∂Wl=−(Xl)Tδl\frac{\partial E}{\partial W^l} = -(X^l)^T \delta^l∂Wl∂E=−(Xl)Tδl
ΔWl=−η∂E∂Wl=η(Xl)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 第lll层学习信号
δL\delta^LδL 输出层学习信号
WlW^lWl第l−l+1l-l+1l−l+1层权值
XlX^lXl第lll层的输入信号
δL=(t−y)f′(XLWL)\delta^L = (t-y)f'(X^LW^L)δL=(t−y)f′(XLWL)
δl=δl+1(Wl+1)Tf′(XlWl)\delta^l = \delta^{l+1}(W^{l+1})^Tf'(X^lW^l)δl=δl+1(Wl+1)Tf′(XlWl)
例
ΔWl3=−ηδl3Xl3=η(t−y)f′(Xl3Wl3)Xl3\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
δl3=(t−y)f′(Xl3Wl3)\delta^{l3} = (t-y)f'(X^{l3}W^{l3})δl3=(t−y)f′(Xl3Wl3)
ΔWl2=−ηδl2Xl2=ηδl3(Wl3)Tf′(Xl2Wl2)Xl2\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
δl2=δl3(Wl3)Tf′(Xl2Wl2)\delta^{l2} = \delta^{l3}(W^{l3})^Tf'(X^{l2}W^{l2})δl2=δl3(Wl3)Tf′(Xl2Wl2)
ΔWl1=−ηδl1Xl1=ηδl2(Wl2)Tf′(Xl1Wl1)Xl1\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
δl1=δl2(Wl2)Tf′(Xl1Wl1)\delta^{l1} = \delta^{l2}(W^{l2})^Tf'(X^{l1}W^{l1})δl1=δl2(Wl2)Tf′(Xl1Wl1)
常用的激活函数
Sigmoid函数
f(x)=11+e−xf(x) = \frac{1}{1+e^{-x}}f(x)=1+e−x1
Tanh函数
f(x)=ex−e−xex+e−xf(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}f(x)=ex+e−xex−e−x
Softsign函数
x1+∣x∣\frac{x}{1+\left |x \right |}1+∣x∣x
ReLU函数(非线性边界)
f(u)=max(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)