多层感知机MLP——笔记

多层感知机

感知机:

  • ​ 二分类模型,最早的AI模型之一
  • ​ 求解算法等价于批量大小为一的梯度下降
  • ​ 不能拟合XOR函数,导致第一次AI寒冬

多层感知机:

多层感知机使用隐藏层激活函数来得到非线性模型

隐藏层

  • 通过在网络中加入一个或多个隐藏层来克服线性模型的限制, 使其能处理更普遍的函数关系类型。 要做到这一点,最简单的方法是将许多全连接层堆叠在一起。
  • 每一层都输出到上面的层,直到生成最后的输出。 我们可以把前L−1层看作表示,把最后一层看作线性预测器。
  • 这种架构通常称为多层感知机(multilayer perceptron),通常缩写为MLP

在这里插入图片描述

​ 这个多层感知机有4个输入,3个输出,其隐藏层包含5个隐藏单元。 输入层不涉及任何计算,因此使用此网络产生输出只需要实现隐藏层和输出层的计算。 因此,这个多层感知机中的层数为2。

注意,这两个层都是全连接的。 每个输入都会影响隐藏层中的每个神经元, 而隐藏层中的每个神经元又会影响输出层中的每个神经元。

​ 虽然一个单隐层网络能学习任何函数, 但并不意味着我们应该尝试使用单隐藏层网络来解决所有问题。 事实上,通过使用更深(而不是更广)的网络,我们可以更容易地逼近许多函数。

激活函数

激活函数(activation function)通过计算加权和并加上偏置来确定神经元是否应该被激活, 它们将输入信号转换为输出的可微运算。 大多数激活函数都是非线性的。

ReLU函数
  • 修正线性单元*(Rectified linear unit,ReLU), 因为它实现简单,同时在各种预测任务中表现良好。 ReLU提供了一种非常简单的非线性变换。 给定元素x,ReLU函数被定义为该元素与0的最大值:
    在这里插入图片描述
sigmoid函数
  • 对于一个定义域在R中的输入, sigmoid函数将输入变换为区间(0, 1)上的输出。 因此,sigmoid通常称为挤压函数(squashing function): 它将范围(-inf, inf)中的任意输入压缩到区间(0, 1)中的某个值:

tanh函数
  • 与sigmoid函数类似, tanh(双曲正切)函数也能将其输入压缩转换到区间(-1, 1)上。 tanh函数的公式如下:

    简介实现

    import torch
    from torch import nn
    from d2l import torch as d2l
    
    # 模型
    # 第一层是隐藏层,它包含256个隐藏单元,并使用了ReLU激活函数。 第二层是输出层。
    net = nn.Sequential(nn.Flatten(),
                        nn.Linear(784, 256),
                        nn.ReLU(),
                        nn.Linear(256, 10))
    
    
    # 定义初始化参数权重方法
    def init_weights(m):
        if type(m) == nn.Linear:
            nn.init.normal_(m.weight, std=0.01)
    
    
    # 模型参数初始化
    net.apply(init_weights)
    
    # 定义参数
    batch_size, lr, num_epochs = 256, 0.1, 10
    # 调用交叉熵损失函数
    loss = nn.CrossEntropyLoss()
    # 调用(优化器):随机梯度下降算法
    trainer = torch.optim.SGD(net.parameters(), lr=lr)
    # 读取数据集
    train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
    d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
    

    小结

  • 多层感知机在输出层和输入层之间增加一个或多个全连接隐藏层,并通过激活函数转换隐藏层的输出。

  • 常用的激活函数包括ReLU函数、sigmoid函数和tanh函数。

  • 我们可以使用高级API更简洁地实现多层感知机。

  • 对于相同的分类问题,多层感知机的实现与softmax回归的实现相同,只是多层感知机的实现里增加了带有激活函数的隐藏层。

【注】线性函数与非线性函数的区别

  • 线性Line,是指量与量之间按照比例成直线关系,在数学上可理解为一阶导数是个常数;
  • 非线性non-line则指不按照比例不成直线关系,一阶导数不为常数。

线性Line,是指量与量之间按照比例成直线关系,在数学上可理解为一阶导数是个常数;

  • 非线性non-line则指不按照比例不成直线关系,一阶导数不为常数。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值