深度学习pytorch--多层感知机(一)

多层感知机

    • 隐藏层
    • 激活函数
      • ReLU函数
      • sigmoid函数
      • tanh函数
    • 多层感知机
    • 小结

我们已经介绍了包括线性回归和softmax回归在内的单层神经网络。然而深度学习主要关注多层模型。在本节中,我们将以多层感知机(multilayer perceptron,MLP)为例,介绍多层神经网络的概念。

隐藏层

多层感知机在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。隐藏层位于输入层和输出层之间。下图展示了一个多层感知机的神经网络图,它含有一个隐藏层,该层中有5个隐藏单元。

在这里插入图片描述

带有隐藏层的多层感知机

在上图所示的多层感知机中,输入和输出个数分别为4和3,中间的隐藏层中包含了5个隐藏单元(hidden unit)。由于输入层不涉及计算,图中的多层感知机的层数为2。由上图可见,隐藏层中的神经元和输入层中各个输入完全连接,输出层中的神经元和隐藏层中的各个神经元也完全连接。因此,多层感知机中的隐藏层和输出层都是全连接层

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

我们先来看一种含单隐藏层的多层感知机的设计。其输出O∈Rn×q\boldsymbol{O} \in \mathbb{R}^{n \times q}ORn×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=XWhWo+bhWo+bo.

从联立后的式子可以看出,虽然神经网络引入了隐藏层,却依然等价于一个单层神经网络:其中输出层权重参数为WhWo\boldsymbol{W}_h\boldsymbol{W}_oWhWo,偏差参数为bhWo+bo\boldsymbol{b}_h \boldsymbol{W}_o + \boldsymbol{b}_obhWo+bo。不难发现,即便再添加更多的隐藏层,以上设计依然只能与仅含输出层的单层神经网络等价。

另外,可以得出结论:

  • 计算神经网络的层数时候不算输入层。
  • 某一层的权重是指 前一层 到 该层 线性变换所需的权重参数。如输出层的权重为 隐藏层 到 输入层 的权重。
  • 权重W的形状为 前一层神经元的个数 * 当前层的神经元的个数

激活函数

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

在这里插入图片描述

不使用激活函数

在这里插入图片描述

使用激活函数

结论:使用了激活函数的多层感知机可以表示任意函数。不加激活函数则无法表示非线性空间。

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

ReLU函数

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

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

可以看出,ReLU函数只保留正数元素,并将负数元素清零。为了直观地观察这一非线性变换,我们先定义一个绘图函数xyplot

import torch
import numpy as np
import matplotlib.pylab as plt
import sysdef xyplot(x_vals, y_vals, name):d2l.set_figsize(figsize=(5, 2.5))d2l.plt.plot(x_vals.detach().numpy(), y_vals.detach().numpy())d2l.plt.xlabel('x')d2l.plt.ylabel(name + '(x)')

我们接下来通过Tensor提供的relu函数来绘制ReLU函数。可以看到,该激活函数是一个两段线性函数。

x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = x.relu()
xyplot(x, y, 'relu')

在这里插入图片描述

显然,当输入为负数时,ReLU函数的导数为0;当输入为正数时,ReLU函数的导数为1。尽管输入为0时ReLU函数不可导,但是我们可以取此处的导数为0。下面绘制ReLU函数的导数。

y.sum().backward()
xyplot(x, x.grad, 'grad of relu')

在这里插入图片描述

sigmoid函数

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

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

sigmoid函数在早期的神经网络中较为普遍,但它目前逐渐被更简单的ReLU函数取代。在后面“循环神经网络”一章中我们会介绍如何利用它值域在0到1之间这一特性来控制信息在神经网络中的流动。下面绘制了sigmoid函数。当输入接近0时,sigmoid函数接近线性变换。

y = x.sigmoid()
xyplot(x, y, 'sigmoid')

在这里插入图片描述

依据链式法则,sigmoid函数的导数

sigmoid′(x)=sigmoid(x)(1−sigmoid(x)).\text{sigmoid}'(x) = \text{sigmoid}(x)\left(1-\text{sigmoid}(x)\right).sigmoid(x)=sigmoid(x)(1sigmoid(x)).

下面绘制了sigmoid函数的导数。当输入为0时,sigmoid函数的导数达到最大值0.25;当输入越偏离0时,sigmoid函数的导数越接近0。

x.grad.zero_()
y.sum().backward()
xyplot(x, x.grad, 'grad of sigmoid')

在这里插入图片描述

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)1exp(2x).

我们接着绘制tanh函数。当输入接近0时,tanh函数接近线性变换。虽然该函数的形状和sigmoid函数的形状很像,但tanh函数在坐标系的原点上对称。

y = x.tanh()
xyplot(x, y, 'tanh')

在这里插入图片描述

依据链式法则,tanh函数的导数

tanh′(x)=1−tanh2(x).\text{tanh}'(x) = 1 - \text{tanh}^2(x).tanh(x)=1tanh2(x).

下面绘制了tanh函数的导数。当输入为0时,tanh函数的导数达到最大值1;当输入越偏离0时,tanh函数的导数越接近0。

x.grad.zero_()
y.sum().backward()
xyplot(x, x.grad, 'grad of tanh')

在这里插入图片描述

多层感知机

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

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ϕ表示激活函数。在分类问题中,我们可以对输出O\boldsymbol{O}O做softmax运算,并使用softmax回归中的交叉熵损失函数。
在回归问题中,我们将输出层的输出个数设为1,并将输出O\boldsymbol{O}O直接提供给线性回归中使用的平方损失函数。

小结

  • 多层感知机在输出层与输入层之间加入了一个或多个全连接隐藏层,并通过激活函数对隐藏层输出进行变换。
  • 常用的激活函数包括ReLU函数、sigmoid函数和tanh函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

太阳能板如何串联_光伏板清洁专用的清洁毛刷

光伏发电是利用半导体界面的光生伏特效应将光能直接转变为电能的一种技术。主要由太阳电池板(组件)、控制器和逆变器三大部分组成。主要部件由电子元器件构成。太阳能电池经过串联后进行封装保护可形成大面积的太阳电池组件,再配合上功率控制…

java 异步等待_Java中的异步等待

java 异步等待编写异步代码很困难。 试图了解异步代码应该做什么的难度更大。 承诺是尝试描述延迟执行流程的一种常见方式:首先做一件事,然后再做另一件事,以防万一出错时再做其他事情。 在许多语言中,承诺已成为协调异步行为的实…

cass生成曲线要素_干货在线 | CASS入门指南——道路断面计算土方

CASS操作指南——道路断面计算土方法小伙伴们赶紧学起来!道路类的土方工程,主要用CASS的断面法土方计算之道路断面来计算。整个计算过程主要分为以下四步:菜单截图第一步:绘制道路中心线道路的中心线,一般由直线段和缓…

正则表达式的捕获性分组/反向引用

文章目录分组捕获性分组和反向引用分组 正则的分组主要通过小括号来实现,括号包裹的子表达式作为一个分组,括号后可以紧跟限定词表示重复次数。如下,小括号内包裹的 abc 便是一个分组: // (abc) 表示匹配一个或多个"abc"&#xf…

深度学习pytorch--多层感知机(二)

多层感知机的从零开始实现获取和读取数据定义模型参数定义激活函数定义模型定义损失函数训练模型小结我们已经从上一节里了解了多层感知机的原理。下面,我们一起来动手实现一个多层感知机。首先导入实现所需的包或模块。 import torch import numpy as np获取和读取…

jwt同一会话_在会话中使用JWT

jwt同一会话这个话题已经在黑客新闻,reddit和博客上讨论了很多次。 共识是–请勿使用JWT(用于用户会话)。 而且我在很大程度上同意对JWT的典型论点 , 典型的“但我可以使其工作……”的解释以及JWT标准的缺陷的批评 。 。 我不会…

表必须要有主键吗_玄关隔断什么材质好?玄关隔断必须要做吗?

为了避免一到门口就能够看到全部室内的东西,为了更好的保护家居的隐私,目前有很多人都会在玄关的位置加一个隔断,而玄关隔断什么材质好?在做玄关隔断的时候,有些人觉得做了隔断会太浪费空间了,而玄关隔断必须要做吗?…

深度学习pytorch--多层感知机(三)

使用pytorch框架实现多层感知机和实现softmax回归唯一的不同在于我们多加了一个全连接层作为隐藏层。它的隐藏单元个数为256,并使用ReLU函数作为激活函数。#模型的核心代码为:nn.Linear(num_inputs, num_hiddens),nn.ReLU(),nn.Linear(num_hiddens, num_outputs),

mysql 日期索引的使用_日期使用

mysql 日期索引的使用时区糟透了。 特别是夏令时。 我不介意像与此行为相关的编程错误那样,不停移动时钟或失去一个小时的睡眠。 更糟糕的是Java的旧日期/时间API。 Java社区通过JSR 310公开承认了这一点,该JSR 310代替了Java Date&Time API…

axure元件库 文件上传_手把手教你打造一套属于产品经理自己的元件库

之前有篇文章聊完了如何打造一套属于自己的原型图设计规范,今天咱们来聊聊如何打造一套属于自己的元件库。毕竟,每个追求效率的PM,总会拥有一个专属自己的Axure元件库,并不断打磨优化。今天就教大家一步一步创建属于自己的Axure元…

KMP算法笔记

1.KMP算法本质上就是对朴素匹配算法(BF)的一个优化,减少朴素匹配算法中不必要匹配的次数,核心代码和朴素匹配算法差不多,BF是移动字串逐个字符匹配,每次模式串(子串)匹配只移动一个字符单位,而KMP算法是每次模式串匹配…

正则表达式的非捕获性分组

非捕获性分组,通常由一对括号加上 ?: 加上子表达式组成,非捕获性分组不会创建反向引用,就好像没有括号一样。如下: var color "#808080"; var output color.replace(/#(?:\d)/,"$1""~~"); console.log(Re…

Spring Security并发会话控制示例教程–如何限制Java JEE Web应用程序中的用户会话数...

如果您不知道, Spring安全性可能会限制用户可以拥有的会话数。 如果要开发Web应用程序,尤其是Java JEE中的安全Web应用程序 ,则必须提出与在线银行门户相似的要求,例如, 每个用户一次只能有一个会话,或者每…

prometheus命令_Prometheus 入门

学习安装 Prometheus 监控和警报系统并编写它的查询。-- Michael Zamot(作者)Prometheus 是一个开源的监控和警报系统,它直接从目标主机上运行的代理程序中抓取指标,并将收集的样本集中存储在其服务器上。也可以使用像 collectd_exporter 这样的插件推送…

正则表达式的命名分组

语法格式&#xff1a;(?<name>…) 命名分组也是捕获性分组&#xff0c;它将匹配的字符串捕获到一个组名称或编号名称中&#xff0c;在获得匹配结果后&#xff0c;可通过分组名进行获取。 如下是一个python的命名分组的例子&#xff1a; import re data "#80808…

python--字符/文本编码解码笔记

字符/文本编码解码笔记1.字符问题编码和解码2.字节概要3.基本的编解码器编码类型史字符编码ASCII码GB2312以及其他编码UNICODE标准编码UTF-8编码4.了解编解码问题处理UnicodeEncoderError解决方法:处理UnicodeDecodeError解决方法5.修改源代码编码6.查看文件编码方式终端查看文…

neo4j cypher_Neo4j:Cypher – Neo.ClientError.Statement.TypeError:不知道如何添加Double和String...

neo4j cypher最近&#xff0c;我将支持Neo4j的应用程序从Neo4j 3.2升级到Neo4j 3.3&#xff0c;发现围绕类型强制的行为发生了有趣的变化&#xff0c;导致我的应用程序抛出了很多错误。 在Neo4j 3.2和更早版本中&#xff0c;如果将String添加到Double&#xff0c;它将把Double…

easyui数据表格显示复选框_【Excel技巧】使用控件一键切换实现单位元和万元随意显示...

工欲善其事&#xff0c;必先利其器。职场上亦是如此。Excel报表想要做得完美&#xff0c;首先肯定Excel要精通。做一份Excel报表&#xff0c;如果涉及到金额&#xff0c;当金额比较大&#xff0c;单位到底是用元还是万元&#xff0c;经常是大家纠结的一个问题。我们今天就来介绍…

正则表达式的固化分组

固化分组&#xff0c;又叫原子组。 语法格式&#xff1a;(?>…) 我们在使用非贪婪模式时&#xff0c;匹配过程中可能会进行多次的回溯&#xff0c;回溯越多&#xff0c;正则表达式的运行效率就越低。而固化分组就是用来减少回溯次数的。 实际上&#xff0c;固化分组 (?…

Requests库基本使用

requests库基本使用基本流程python中一个基于网络请求的模块&#xff0c;功能强大&#xff0c;简单便捷&#xff0c;效率极高&#xff0c;可以取代古老的urllib模块。作用&#xff1a;模拟浏览器向服务器发起请求。基本流程 1.指定URL2.对指定的URL发起请求(get或post)3.获取响…