MLP多层感知器+BP算法原理及实战

本文介绍了多层感知器(MLP)的概念,解释了其如何通过非线性激活函数解决单层感知器无法解决的异或问题。通过实例展示了如何用Python实现MLP,并利用反向传播算法进行训练。最终,通过绘制误差曲线展示模型在迭代过程中的学习情况。

多层感知器是在感知器的基础上多元化,原来只是用一个感知器,但是单个感知器因为是单输出,所以只能进行二分类的操作,他并不能进行类似异或问题的求解,再次基础上前辈们提出了多层感知器。
在这里插入图片描述
如上图所示,{a11,a12,a13}所代表的是第一层的神经元,{a21,a22}所代表的是第二层的神经元,图中的w代表的是权重。
与单层感知器不同的是这里在前层神经元权重求和后,还有进行一次非线性激活函数激活,最后得到的就是该神经元的值。
在这里插入图片描述
如上所示,其中f就是其中的激活函数,激活函数有类似sigmoid函数、tanh函数以及ReLU函数和它的改进Leaky ReLu函数。
MLP多层感知器算法的前馈部分就是这一步,以次遍历到最后的输出。
在这里插入图片描述
到此为止为前馈操作,接下来是反馈操作,前馈和反馈之间还存在一个损失函数。
在这里插入图片描述
此处损失函数代表的是目标值和结果值之间的差距多大。所以反馈操作的目的就是减小该损失函数的结果值。
根据刚才的神经网络图,进行改进。
根据链式求导法则
在这里插入图片描述
在这里我们把激活函数定义为sigmoid函数。
在这里插入图片描述
在这里可以看出,sigmoid函数f(z)的导数是f(z)*(1-f(z))
在这里插入图片描述
这就可以得出从输出层到隐藏层的导数,
在这里插入图片描述
从隐藏层到输入层:
(连式求导)
在这里插入图片描述
在这里插入图片描述
同理可得出别的导数。
然后用所求出的导数去更新权重。
在这里插入图片描述
用MLP多层感知器算法求解异或问题。

import numpy as np
import matplotlib.pyplot as plt


rate=0.1 #学习率
sample_num=4 #样本数据量


class my_mlp:
    def __init__(self, input_size, hidden_size, output_size):
        self.w1 = np.random.normal(size=(hidden_size, input_size))#输入层到隐藏层
        self.w2 = np.random.normal(size=(hidden_size,output_size))#隐藏层到输出层
        self.b1 
多层感知器BP学习算法,即多层前馈网络的反向传播(BP)学习算法,简称BP算法,是有导师的学习,也是梯度下降法在多层前馈网中的应用[^1]。 多层感知机(MLP)是一种前馈人工神经网络,包括一个输入层、一个或多个隐藏层以及一个输出层,每层由多个神经元组成,每个神经元与下一层的所有神经元通过权重连接,且使用非线性激活函数,能够学习非线性模型[^2]。 BP算法所针对的网络中,𝐮(或𝐱 )、𝐲是网络的输入、输出向量,神经元用节点表示,网络由输入层、隐层和输出层节点组成,隐层可一层,也可多层,前层至后层节点通过权联接,使用该学习算法的网络常称BP神经网络[^1][^3]。 反向传播算法由Rumelhart以及Hinton在1986年发表的文章中介绍,该算法可很好地解决神经网络的模型参数训练问题[^4]。 ### 代码示例 ```python import numpy as np # 定义激活函数及其导数 def sigmoid(x): return 1 / (1 + np.exp(-x)) def sigmoid_derivative(x): return x * (1 - x) # 多层感知机的BP算法实现 class MLP: def __init__(self, input_size, hidden_size, output_size): # 初始化权重 self.weights_input_hidden = np.random.rand(input_size, hidden_size) self.weights_hidden_output = np.random.rand(hidden_size, output_size) def forward(self, X): # 前向传播 self.hidden_input = np.dot(X, self.weights_input_hidden) self.hidden_output = sigmoid(self.hidden_input) self.final_input = np.dot(self.hidden_output, self.weights_hidden_output) self.final_output = sigmoid(self.final_input) return self.final_output def backward(self, X, y, output): # 反向传播 self.output_error = y - output self.output_delta = self.output_error * sigmoid_derivative(output) self.hidden_error = self.output_delta.dot(self.weights_hidden_output.T) self.hidden_delta = self.hidden_error * sigmoid_derivative(self.hidden_output) # 更新权重 self.weights_hidden_output += self.hidden_output.T.dot(self.output_delta) self.weights_input_hidden += X.T.dot(self.hidden_delta) def train(self, X, y, epochs): for epoch in range(epochs): output = self.forward(X) self.backward(X, y, output) # 示例使用 input_size = 2 hidden_size = 3 output_size = 1 X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0], [1], [1], [0]]) mlp = MLP(input_size, hidden_size, output_size) mlp.train(X, y, epochs=10000) print(mlp.forward(X)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值