神经网络之初入神经网络

单层感知器

包含:输入节点,输出节点,权向量,偏置因子,激活函数;
例:
在这里插入图片描述

感知器学习规则

y = f ( ∑ i = 1 n x i ⋅ w i ) y = f(\sum_{i=1}^{n} x_i \cdot w_i) y=f(i=1nxiwi) 或者 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=1nxiwi+b)
y y y是输出函数, f f f是激活函数,
Δ w i = η ( t − y ) x i \Delta w_i = \eta(t - y)x_i Δwi=η(ty)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 01之间;
学习率太大容易造成权值调整不稳定;
学习率太小,权值调整太慢,迭代次数太多;
此处的感知器学习规则和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函数

#权值初始化,31列,取值范围-11
# 权值矩阵维度定义:输入与输出的个数,几个输入-几行 几个输出-几列
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,在进行平均..XW_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(ty)2=1/2[tf(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(ty)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(ty)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(ty)2 Delta学习规则
∂ E ∂ W l = − ( X l ) T δ l \frac{\partial E}{\partial W^l} = -(X^l)^T \delta^l WlE=(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=ηWlE=η(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 ll+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=(ty)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=η(ty)f(Xl3Wl3)Xl3
δ l 3 = ( t − y ) f ′ ( X l 3 W l 3 ) \delta^{l3} = (t-y)f'(X^{l3}W^{l3}) δl3=(ty)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+ex1
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+exexex
Softsign函数
x 1 + ∣ x ∣ \frac{x}{1+\left |x \right |} 1+xx
ReLU函数(非线性边界)
f ( u ) = m a x ( 0 , u ) f(u) = max(0, u) f(u)=max(0,u)

BP神经网络解决异或问题

#权值初始化,取值范围-11
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 隐藏层1100个神经元 隐藏层250个神经元  max_iter 迭代次数500
mlp.fit(x_train,y_train)

predictions = mlp.predict(x_test)
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值