多层感知机

  • 1. 基本知识
  • 2. 激活函数
    • 2.1 ReLU函数
    • 2.2 Sigmoid函数
    • 2.3 tanh函数
    • 2.4 关于激活函数的选择
  • 3. PyTorch实现
    • 3.1 导入相应的包
    • 3.2 初始化模型和各个参数
    • 3.3 训练

1. 基本知识

深度学习主要关注多层模型。在这里,我们将以多层感知机(multilayer perceptron,MLP)为例,介绍多层神经网络的概念。

多层感知机就是含有至少一个隐藏层的由全连接层组成的神经网络,且每个隐藏层的输出通过激活函数进行变换。多层感知机的层数和各隐藏层中隐藏单元个数都是超参数。以单隐藏层为例并沿用本节之前定义的符号,多层感知机按以下方式计算输出:

H=ϕ(XWh+bh),O=HWo+bo,\begin{aligned} \boldsymbol{H} &= \phi(\boldsymbol{X} \boldsymbol{W}_h + \boldsymbol{b}_h),\\ \boldsymbol{O} &= \boldsymbol{H} \boldsymbol{W}_o + \boldsymbol{b}_o, \end{aligned} HO​=ϕ(XWh​+bh​),=HWo​+bo​,​

其中ϕ\phiϕ表示激活函数。

下图展示了一个多层感知机的神经网络图,它含有一个隐藏层,该层中有5个隐藏单元。


具体来说,给定一个小批量样本X∈Rn×d\boldsymbol{X} \in \mathbb{R}^{n \times d}X∈Rn×d,其批量大小为nnn,输入个数为ddd。假设多层感知机只有一个隐藏层,其中隐藏单元个数为hhh。记隐藏层的输出(也称为隐藏层变量或隐藏变量)为H\boldsymbol{H}H,有H∈Rn×h\boldsymbol{H} \in \mathbb{R}^{n \times h}H∈Rn×h。因为隐藏层和输出层均是全连接层,可以设隐藏层的权重参数和偏差参数分别为Wh∈Rd×h\boldsymbol{W}_h \in \mathbb{R}^{d \times h}Wh​∈Rd×h和 bh∈R1×h\boldsymbol{b}_h \in \mathbb{R}^{1 \times h}bh​∈R1×h,输出层的权重和偏差参数分别为Wo∈Rh×q\boldsymbol{W}_o \in \mathbb{R}^{h \times q}Wo​∈Rh×q和bo∈R1×q\boldsymbol{b}_o \in \mathbb{R}^{1 \times q}bo​∈R1×q。

我们先来看一种含单隐藏层的多层感知机的设计。其输出O∈Rn×q\boldsymbol{O} \in \mathbb{R}^{n \times q}O∈Rn×q的计算为

H=XWh+bh,O=HWo+bo,\begin{aligned} \boldsymbol{H} &= \boldsymbol{X} \boldsymbol{W}_h + \boldsymbol{b}_h,\\ \boldsymbol{O} &= \boldsymbol{H} \boldsymbol{W}_o + \boldsymbol{b}_o, \end{aligned} HO​=XWh​+bh​,=HWo​+bo​,​

也就是将隐藏层的输出直接作为输出层的输入。如果将以上两个式子联立起来,可以得到

O=(XWh+bh)Wo+bo=XWhWo+bhWo+bo.\boldsymbol{O} = (\boldsymbol{X} \boldsymbol{W}_h + \boldsymbol{b}_h)\boldsymbol{W}_o + \boldsymbol{b}_o = \boldsymbol{X} \boldsymbol{W}_h\boldsymbol{W}_o + \boldsymbol{b}_h \boldsymbol{W}_o + \boldsymbol{b}_o. O=(XWh​+bh​)Wo​+bo​=XWh​Wo​+bh​Wo​+bo​.

从联立后的式子可以看出,虽然神经网络引入了隐藏层,却依然等价于一个单层神经网络:其中输出层权重参数为WhWo\boldsymbol{W}_h\boldsymbol{W}_oWh​Wo​,偏差参数为$\boldsymbol{b}_h

2. 激活函数

上述问题的根源在于全连接层只是对数据做仿射变换(affine transformation),而多个仿射变换的叠加仍然是一个仿射变换。解决问题的一个方法是引入非线性变换,例如对隐藏变量使用按元素运算的非线性函数进行变换,然后再作为下一个全连接层的输入。这个非线性函数被称为激活函数(activation function)。

下面我们介绍几个常用的激活函数。

2.1 ReLU函数

ReLU(rectified linear unit)函数提供了一个很简单的非线性变换。给定元素xxx,该函数定义为

ReLU(x)=max⁡(x,0).\text{ReLU}(x) = \max(x, 0). ReLU(x)=max(x,0).

可以看出,ReLU函数只保留正数元素,并将负数元素清零。

2.2 Sigmoid函数

sigmoid函数可以将元素的值变换到0和1之间:

sigmoid(x)=11+exp⁡(−x).\text{sigmoid}(x) = \frac{1}{1 + \exp(-x)}. sigmoid(x)=1+exp(−x)1​.

2.3 tanh函数

tanh(双曲正切)函数可以将元素的值变换到-1和1之间:

tanh(x)=1−exp⁡(−2x)1+exp⁡(−2x).\text{tanh}(x) = \frac{1 - \exp(-2x)}{1 + \exp(-2x)}. tanh(x)=1+exp(−2x)1−exp(−2x)​.

2.4 关于激活函数的选择

ReLu函数是一个通用的激活函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。

用于分类器时,sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。

在神经网络层数较多的时候,最好使用ReLu函数,ReLu函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。

在选择激活函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他激活函数。

3. PyTorch实现

3.1 导入相应的包
import torch
from torch import nn
from torch.nn import init
import numpy as np
import sys
sys.path.append("/home/kesci/input")
import d2lzh1981 as d2l
3.2 初始化模型和各个参数
# 定义输入特征数、输出特征以及隐藏层的个数
num_inputs, num_outputs, num_hiddens = 784, 10, 256net = nn.Sequential(# 转化输入维度d2l.FlattenLayer(),# 经过第一层线性回归nn.Linear(num_inputs, num_hiddens),# 经过激活函数nn.ReLU(),# 经过第二层线性回归nn.Linear(num_hiddens, num_outputs), )# 初始化网络参数
for params in net.parameters():init.normal_(params, mean=0, std=0.01)
3.3 训练
# 定义每个批量的样本数
batch_size = 256
# 训练集与测试集
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size,root='/home/kesci/input/FashionMNIST2065')
# 定义损失函数为交叉熵函数
loss = torch.nn.CrossEntropyLoss()# 定义优化函数为随机梯度下降SGD
optimizer = torch.optim.SGD(net.parameters(), lr=0.5)# 定义训练周期为5
num_epochs = 5
# 开始训练
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)

训练结果为:

动手学深度学习(PyTorch实现)(五)--多层感知机相关推荐

  1. 动手学深度学习Pytorch Task01

    深度学习目前以及未来都有良好的发展前景.正值疫情期间,报名参加了动手学深度学习pytorch版的公开课,希望在以后的学习生活中能够灵活运用学到的这些知识. 第一次课主要包含三个部分:线性回归.soft ...

  2. 【动手学深度学习PyTorch版】19 网络中的网络 NiN

    上一篇请移步[动手学深度学习PyTorch版]18 使用块的网络 VGG_水w的博客-CSDN博客 目录 一.网络中的网络 NiN 1.1 NiN ◼ 全连接层的问题 ◼ 大量的参数会带来很多问题 ◼ ...

  3. 伯禹公益AI《动手学深度学习PyTorch版》Task 04 学习笔记

    伯禹公益AI<动手学深度学习PyTorch版>Task 04 学习笔记 Task 04:机器翻译及相关技术:注意力机制与Seq2seq模型:Transformer 微信昵称:WarmIce ...

  4. 伯禹公益AI《动手学深度学习PyTorch版》Task 07 学习笔记

    伯禹公益AI<动手学深度学习PyTorch版>Task 07 学习笔记 Task 07:优化算法进阶:word2vec:词嵌入进阶 微信昵称:WarmIce 优化算法进阶 emmmm,讲实 ...

  5. 伯禹公益AI《动手学深度学习PyTorch版》Task 03 学习笔记

    伯禹公益AI<动手学深度学习PyTorch版>Task 03 学习笔记 Task 03:过拟合.欠拟合及其解决方案:梯度消失.梯度爆炸:循环神经网络进阶 微信昵称:WarmIce 过拟合. ...

  6. 伯禹公益AI《动手学深度学习PyTorch版》Task 05 学习笔记

    伯禹公益AI<动手学深度学习PyTorch版>Task 05 学习笔记 Task 05:卷积神经网络基础:LeNet:卷积神经网络进阶 微信昵称:WarmIce 昨天打了一天的<大革 ...

  7. 伯禹公益AI《动手学深度学习PyTorch版》Task 06 学习笔记

    伯禹公益AI<动手学深度学习PyTorch版>Task 06 学习笔记 Task 06:批量归一化和残差网络:凸优化:梯度下降 微信昵称:WarmIce 批量归一化和残差网络 BN和Res ...

  8. 【动手学深度学习PyTorch版】6 权重衰退

    上一篇移步[动手学深度学习PyTorch版]5 模型选择 + 过拟合和欠拟合_水w的博客-CSDN博客 目录 一.权重衰退 1.1 权重衰退 weight decay:处理过拟合的最常见方法(L2_p ...

  9. 【动手学深度学习PyTorch版】12 卷积层

    上一篇移步[动手学深度学习PyTorch版]11 使用GPU_水w的博客-CSDN博客 目录 一.卷积层 1.1从全连接到卷积 ◼ 回顾单隐藏层MLP ◼ Waldo在哪里? ◼ 原则1-平移不变性 ...

最新文章

  1. Android onTouch 方法 和onTouchEvent 方法
  2. Matchme php script_apache php-fpm Primary script unknown\n - TechBlog
  3. spring boot 邮件端口_1 分钟教会你用 Spring Boot 发邮件
  4. 产品经理的必经之路:搭建属于自己的成长模型
  5. matlab梯度检测,Matlab:关于梯度的一阶导数边缘检测
  6. [转]在Winform(C#)中使用Flash控件
  7. button标签设置隐藏和显示_让你更高效的功能——设置、预设的妙用【动态数学软件GeoGebra】...
  8. iOS 8下应用中仅有几个页面需要横屏其余均为竖屏的处理办法
  9. LINUX FFMPEG编译汇总(中等,只编译必要的部分)
  10. Android电视远程桌面,【当贝市场】教你使用小米电视远程控制Windows桌面
  11. 群晖nas使用rsync备份
  12. Swagger注解使用示例
  13. 【CQF Finance Class 3 债券】
  14. matlab建立机器人模型,matlab 机器人工具箱8-通过URDF建立机器人模型
  15. 分享5款干净好用的电脑浏览器,用最后一款工作不累
  16. Activity的基本理解
  17. 密集脚集成块的手工焊接方法
  18. 阿里巴巴集团急招职位
  19. Diana and Liana
  20. STM32三种BOOT启动模式详解(全网最全)

热门文章

  1. 华为已经升级鸿蒙系统的机型,鸿蒙系统名单已确认!覆盖55款机型,这些手机将被淘汰!...
  2. java swarm_科学网—Java_Swarm编程:遇到麻烦了...... - 高德华的博文
  3. python网络爬虫开发从入门到精通_Python突击-从入门到精通到项目实战
  4. Java基础---File类,就是这么简单
  5. java ThreadLocal理解和使用
  6. django请求生命周期
  7. 112. Path Sum
  8. 06软件构架实践阅读笔记之六
  9. 【bzoj2730】 HNOI2012—矿场搭建
  10. (二)再议MII、RMII、GMII接口