机器学习入门--多层感知机原理与实践

神经网络与多层感知机

神经网络是一种模仿生物神经系统结构和功能的计算模型。它由许多个节点(或称为神经元)组成,这些节点通过连接权重相互连接。神经网络的输入经过一系列的加权求和和激活函数变换后,得到输出结果。

神经网络的训练过程主要包括前向传播和反向传播两个阶段。前向传播是指数据从输入层逐层传递到输出层的过程,每一层的节点都会根据输入值和连接权重计算输出值。反向传播是指通过计算损失函数对网络参数进行梯度下降优化的过程,使得网络的输出与期望输出尽可能接近。

多层感知机(Multilayer Perceptron,简称MLP)是一种最基本的前馈神经网络模型。它由多层神经元组成,每一层都与前一层全连接。多层感知机通常包含一个输入层、若干个隐藏层和一个输出层。

多层感知机的每个神经元都具有自己的权重和偏置,通过激活函数对加权求和结果进行非线性映射。常用的激活函数包括Sigmoid函数、ReLU函数等。

多层感知机数学原理

多层感知机(Multilayer Perceptron, MLP)是一种前馈人工神经网络,由一个输入层、若干个隐藏层和一个输出层组成。它能够学习非线性模型,主要用于分类和回归问题。多层感知机的核心数学原理包括前向传播算法、激活函数、损失函数和反向传播算法。下面详细描述这些原理:

  1. 前向传播算法

    前向传播是多层感知机处理信息的过程,从输入层开始,经过隐藏层,最后到达输出层。在每一层,节点(神经元)的输出是上一层所有节点输出的加权和,加上一个偏置项,然后通过一个激活函数进行转换。数学表达式如下:

    对于第 l l l 层的第 j j j 个神经元,其输入 z j ( l ) z_j^{(l)} zj(l) 可以表示为:
    z j ( l ) = ∑ i w i j ( l ) a i ( l − 1 ) + b j ( l ) z_j^{(l)} = \sum_{i} w_{ij}^{(l)} a_i^{(l-1)} + b_j^{(l)} zj(l)=iwij(l)ai(l1)+bj(l)
    其中 w i j ( l ) w_{ij}^{(l)} wij(l) 是连接第 l − 1 l-1 l1 层的第 i i i 个神经元和第 l l l 层的第 j j j 个神经元的权重 a i ( l − 1 ) a_i^{(l-1)} ai(l1) 是第 l − 1 l-1 l1 层的第 i i i 个神经元的输出 b j ( l ) b_j^{(l)} bj(l) 是第 l l l 层的第 j j j 个神经元的偏置项。

    然后,第 l l l 层的第 j j j 个神经元的输出 a j ( l ) a_j^{(l)} aj(l) 为:
    a j ( l ) = f ( z j ( l ) ) a_j^{(l)} = f(z_j^{(l)}) aj(l)=f(zj(l))
    这里 f f f 是激活函数,常见的有Sigmoid、ReLU等。

  2. 激活函数

    激活函数是用来增加神经网络的非线性的,因为没有激活函数,不管神经网络有多少层,最终都相当于一个线性模型。常见的激活函数包括:

    • Sigmoid函数: f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+ex1
    • ReLU函数: f ( x ) = m a x ( 0 , x ) f(x) = max(0, x) f(x)=max(0,x)
    • 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
  3. 损失函数

    损失函数用于衡量模型预测值与真实值之间的差异。根据不同的任务(如分类或回归),选择合适的损失函数非常关键。对于二分类问题,常用的损失函数是交叉熵损失:
    L ( y , y ^ ) = − [ y log ⁡ ( y ^ ) + ( 1 − y ) log ⁡ ( 1 − y ^ ) ] L(y, \hat{y}) = -[y \log(\hat{y}) + (1-y) \log(1-\hat{y})] L(y,y^)=[ylog(y^)+(1y)log(1y^)]
    其中 y 是真实标签 y ^ \hat{y} y^ 是预测值。

  4. 反向传播算法

    反向传播算法用于计算损失函数对每个权重的梯度,然后更新权重以最小化损失函数。这个过程包括两个步骤:梯度的反向传播和权重的更新。

    首先,计算输出层的误差,并将这个误差反向传播到前面的层。对于第 l l l 层的第 j j j 个神经元的误差 δ j ( l ) \delta_j^{(l)} δj(l) 可以表示为:
    δ j ( l ) = ∂ L ∂ z j ( l ) \delta_j^{(l)} = \frac{\partial L}{\partial z_j^{(l)}} δj(l)=zj(l)L
    对于输出层,这个误差直接由损失函数导出;对于隐藏层,这个误差是由后一层的误差加权求和再乘以当前层激活函数的导数得到。

    然后,利用计算得到的误差更新权重和偏置:
    w i j ( l ) = w i j ( l ) − α ∂ L ∂ w i j ( l ) w_{ij}^{(l)} = w_{ij}^{(l)} - \alpha \frac{\partial L}{\partial w_{ij}^{(l)}} wij(l)=wij(l)αwij(l)L
    b j ( l ) = b j ( l ) − α ∂ L ∂ b j ( l ) b_j^{(l)} = b_j^{(l)} - \alpha \frac{\partial L}{\partial b_j^{(l)}} bj(l)=bj(l)αbj(l)L

    其中 α \alpha α 是学习率,决定了参数更新的步长。

多层感知机代码实现

import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 数据标准化
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 转换数据为PyTorch张量
X_train_tensor = torch.tensor(X_train_scaled, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train, dtype=torch.long)
X_test_tensor = torch.tensor(X_test_scaled, dtype=torch.float32)

# 定义多层感知机模型
class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.fc1 = nn.Linear(4, 100)
        self.fc2 = nn.Linear(100, 3)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = MLP()

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练模型
num_epochs = 500
# 记录损失
losses = []
for epoch in range(num_epochs):
    optimizer.zero_grad()
    outputs = model(X_train_tensor)
    loss = criterion(outputs, y_train_tensor)
    loss.backward()
    optimizer.step()
    print(f"epoch : {epoch}, loss: {loss.item()}")
    losses.append(loss.item())

# 测试模型
model.eval()
with torch.no_grad():
    outputs = model(X_test_tensor)
    _, predicted = torch.max(outputs, 1)
    accuracy = accuracy_score(y_test, predicted.numpy())
    print(f'Accuracy: {accuracy:.2f}')

# 可视化损失曲线
plt.plot(range(num_epochs), losses)
plt.xlabel('Epoch')
plt.ylabel('loss')
plt.title('Training Loss Over Epoches')
plt.show()

在上述代码中,我们选择使用PyTorch来实现多层感知机。首先,我们加载鸢尾花数据集并将数据转换为张量类型,以便于后续神经网络的计算。接着,我们使用两个线性层构建了一个简单的多层感知机模型。我们选择了交叉熵损失函数和Adam优化器作为神经网络的损失函数和优化器。经过500个epoch的训练后,我们可视化了损失曲线,如下图所示。
Training-Loss

总结

本文对人工神经网络中多层感知机的数学原理进行了讲解,主要包括前向传播算法、激活函数、损失函数和反向传播。为了更加直观地展示多层感知机在实际应用中的效果,我们构建了一个多层感知机模型,并使用鸢尾花数据集进行了训练。最后,我们可视化了损失曲线,以便于进一步分析模型训练过程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值