机器学习-BP-神经网络

人工神经网络特点:

1.非线性

2.非局限性(例子:联想记忆)

3.非常定性 (自适应,自学习能力,自组织)

4.非凸性(有多个极值-多个稳定的平衡态-系统演化的多样性)

激活(励)函数(非线性映射):

为了增加整个网络的表达能力

 1.sigmod函数

sigmoid(x)=\frac{1}{1+e^{-x}}

 sigmoid 函数的作用原理很简单:将所有数限制在 0 ~ 1 范围内

Sigmoid 函数的输出范围是 0 到 1。由于输出值限定在 0 到 1,因此它对每个神经元的输出进行了归一化;

用于将预测概率作为输出的模型。由于概率的取值范围是 0 到 1,因此 Sigmoid 函数非常合适;

梯度平滑,避免「跳跃」的输出值;

函数是可微的。这意味着可以找到任意两个点的 sigmoid 曲线的斜率;

明确的预测,即非常接近 1 或 0。

Sigmoid 激活函数有哪些缺点?

倾向于梯度消失;

函数输出不是以 0 为中心的,这会降低权重更新的效率;

Sigmoid 函数执行指数运算,计算机运行得较慢。

2.Tanh / 双曲正切激活函数

Tanh(x)=\frac{2}{1+e^{-2x}}-1

在 tanh 图中,负输入将被强映射为负,而零输入被映射为接近零。 

 3. ReLU 激活函数

ReLU(x)=\left\{\begin{matrix} max(0,x),x>=0\\ 0 ,x<0 \end{matrix}\right.

 神经网络的结构:

激活函数选用sigmoid函数

x表示输入,w表示权重,b表示偏置,z表示某一层的输入,经过激活函数作用后输出a,并作为下一层的输入。

权重表示信号的重要程度,偏质(bias)控制神经元被激活的难易程度

则:

Z_{j}^{l}=\sum _{i=1}^{n}w_{ji}^{l}*x_{i}+b_{j}^{l}

a_{j}^{l}=f(z_{j}^{l})

Z_{j}^{l}(input),a_{j}^{l}(output)

其中,公式里面的变量 l 和 j 表示的是第 l 层的第 j 个神经元,ij 则表示从第 i 个神经元到第 j 个神经元之间的连线

正向传播:

h1的输入输出: 

 net .h1=w1*i1*+w2*i2+b1*1

out.h1=sigmoid(net.h1)

o1的输入输出:

net .o1=w5*out.h1*+w6*out.h2+b2*1

 out.o1=\sigma(net.o1)

......

反向传播:

反向传递主要用于通过调整神经网络中的参数来最小化损失函数。在训练神经网络时,通过将输入数据送入网络,得到输出数据;将输出数据与真实标签进行比较,计算损失函数。而反向传递算法则通过计算损失函数对每个参数的偏导数,来调整参数以最小化损失函数。

反向传递算法的基本思想是利用链式法则,逐层计算每个参数对于损失函数的偏导数。从输出层开始,将输出数据与真实标签进行比较,计算损失函数。然后通过链式法则计算损失函数对于每个参数的偏导数。

总误差E_{total},人为设定目标target

E_{total}=\sum _{i=1}^{n}\frac{1}{2}*(target-out.i)^{2}

示例:求w5对Etotal产生的影响

 当前向传播所得出的输出值对应的均方差损失函数大于预期值时进行反向传播进行更新权重,

也即是梯度下降。

1.首先求偏导:(链式法则)

\frac{\partial E_{total}}{\partial w_{5}}=\frac{\partial E_{total}}{\partial out.o1}*\frac{\partial out.o1}{\partial net.o1}*\frac{\partial net.o1}{\partial w5}

2.分布求出每一个偏导即可

其中

\frac{\partial Etotal}{\partial out.o_{i}}=out.o_{i}-target.o_{i}

\frac{\partial out.o_{i}}{\partial net.o_{i}}=out.o_{i}*(1-out.o_{i})

3.更新w5

w_{5}=w_{5}-\eta *(\frac{\partial E_{total}}{\partial w5})

4.不断更新达到一定次数或者损失趋于稳定。

隐含层:

代码:

import math


def s(x):
    y = 1 / (1 + math.exp(-x))
    return y


i1, i2 = 0.05, 0.1
target1, target2 = 0.01, 0.99
w1, w2, w3, w4, w5, w6, w7, w8 = 0.15, 0.20, 0.25, 0.30, 0.40, 0.45, 0.50, 0.55
out_h1 = s(i1 * w1 + i2 * w2)
out_h2 = s(i1 * w3 + i2 * w4)
out_o1 = s(out_h1 * w5 + out_h2 * w6)
out_o2 = s(out_h1 * w7 + out_h2 * w8)
E = 0.5 * ((out_o1 - target1) ** 2 + (out_o2 - target2) ** 2)


# 计算输出层的误差信号
delta_o1 = (out_o1 - target1) * out_o1 * (1 - out_o1)
delta_o2 = (out_o2 - target2) * out_o2 * (1 - out_o2)

# 计算隐藏层到输出层的权重的梯度
dw5 = delta_o1 * out_h1
dw6 = delta_o1 * out_h2
dw7 = delta_o2 * out_h1
dw8 = delta_o2 * out_h2

# 计算隐藏层的误差信号
delta_h1 = (delta_o1 * w5 + delta_o2 * w7) * out_h1 * (1 - out_h1)
delta_h2 = (delta_o1 * w6 + delta_o2 * w8) * out_h2 * (1 - out_h2)

# 计算输入层到隐藏层的权重的梯度
dw1 = delta_h1 * i1
dw2 = delta_h1 * i2
dw3 = delta_h2 * i1
dw4 = delta_h2 * i2

# 更新权重
learning_rate = 0.5
w1 -= learning_rate * dw1
w2 -= learning_rate * dw2
w3 -= learning_rate * dw3
w4 -= learning_rate * dw4
w5 -= learning_rate * dw5
w6 -= learning_rate * dw6
w7 -= learning_rate * dw7
w8 -= learning_rate * dw8

 为了使结果更加准确可以第一步对权重进行随机赋值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值