《动手学深度学习》——多层感知机

news2024/11/25 4:18:03

参考资料:

  • 《动手学深度学习》

4.1 多层感知机

4.1.1 隐藏层

image-20230704183854268

隐藏层 + 激活函数能够模拟任何连续函数。

4.1.2 激活函数

4.1.2.1 ReLu函数

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

image-20230704184145684

当输入为负时,ReLU 的导数为 0 ;当输出为负时,ReLU 的导数为 1 。

ReLU的优势在于它的求导非常简单,要么让参数消失,要么让参数通过;并且,ReLU减轻了梯度消失的问题。

4.1.2.2 sigmoid函数

sigmoid ⁡ ( x ) = 1 1 + exp ⁡ ( − x ) \operatorname{sigmoid}(x) = \frac{1}{1 + \exp(-x)} sigmoid(x)=1+exp(x)1

image-20230704184543498

sigmoid 函数的导数为:
d d x sigmoid ⁡ ( x ) = sigmoid ⁡ ( x ) ( 1 − sigmoid ⁡ ( x ) ) \frac{{\rm d}}{{\rm d}x} \operatorname{sigmoid}(x) = \operatorname{sigmoid}(x)\left(1-\operatorname{sigmoid}(x)\right) dxdsigmoid(x)=sigmoid(x)(1sigmoid(x))
image-20230704184728252

4.1.2.3 tanh函数

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

image-20230704184821700

tanh 函数的导数为:
d d x tanh ⁡ ( x ) = 1 − tanh ⁡ 2 ( x ) \frac{{\rm d}}{{\rm d}x} \operatorname{tanh}(x) = 1 - \operatorname{tanh}^2(x) dxdtanh(x)=1tanh2(x)
image-20230704184920531

4.2 多层感知机的从零开始实现

暂略

4.3 多层感知机的简洁实现

4.3.1 模型

假设输入为 28*28 的黑白图片,输出对应 10 个可能的类别,隐含层有 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(reduction='none')
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)

4.4 模式选择、欠拟合和过拟合

4.4.1 训练误差和泛化误差

4.4.1.1 统计学习理论

独立同分布假设:训练数据和测试数据都是从相同的分布中独立提取的。

4.4.1.1 模型复杂性

几个倾向于影响模型泛化的因素。

  1. 可调整参数的数量。当可调整参数的数量(有时称为自由度)很大时,模型往往更容易过拟合。
  2. 参数采用的值。当权重的取值范围较大时,模型可能更容易过拟合。
  3. 训练样本的数量。即使模型很简单,也很容易过拟合只包含一两个样本的数据集。而过拟合一个有数百万个样本的数据集则需要一个极其灵活的模型。

4.4.2 模型选择

4.4.2.1 验证集

原则上,在我们确定所有的超参数之前,我们不希望用到测试集。 如果我们在模型选择过程中使用测试数据,可能会有过拟合测试数据的风险。

4.4.2.2 K折交叉验证

原始训练数据被分成 K K K个不重叠的子集。然后执行 K K K次模型训练和验证,每次在 K − 1 K-1 K1个子集上进行训练,并在剩余的一个子集(在该轮中没有用于训练的子集)上进行验证。最后,通过对 K K K次实验的结果取平均来估计训练和验证误差。

4.4.3 欠拟合还是过拟合?

4.4.3.1 模型复杂度

image-20230704193832103

4.4.3.2 数据集大小

训练数据集中的样本越少,我们就越有可能(且更严重地)过拟合。 随着训练数据量的增加,泛化误差通常会减小。

4.5 权重衰减

4.5.1 范数与权重衰减

我们改写损失函数:
L ( w , b ) + λ 2 ∥ w ∥ 2 L(\mathbf{w}, b) + \frac{\lambda}{2} \|\mathbf{w}\|^2 L(w,b)+2λw2
其中, λ \lambda λ 为超参数。引入正则项后,模型更倾向于将让参数逐渐衰减。通常,网络输出层的偏置项不会被正则化。

较小的参数对输入不敏感,所以可能拥有更好的泛化性能。

4.5.2 参数衰减的简洁实现

def train_concise(wd):
	...
    # 偏置参数没有衰减
    trainer = torch.optim.SGD([
        {"params":net[0].weight,'weight_decay': wd},
        {"params":net[0].bias}], lr=lr)
	...

上面的代码中,wd 就是正则项中的 λ \lambda λ .

4.6 暂退法

4.6.1 重新审视过拟合

4.6.2 扰动的稳健性

经典泛化理论认为,为了缩小训练和测试性能之间的差距,应该以简单的模型为目标。

暂退法在前向传播过程中,计算每一内部层的同时注入噪声,在整个训练过程的每一次迭代中,标准暂退法包括在计算下一层之前将当前层中的一些节点置零。通常,我们给中间层活性值 h h h 以暂退概率 p p p 由随机变量 h ′ h' h 替换,如下所示:
h ′ = { 0  概率为  p h 1 − p  其他情况 h' = \begin{cases} 0 & \text{ 概率为 } p \\ \frac{h}{1-p} & \text{ 其他情况} \end{cases} h={01ph 概率为 p 其他情况
image-20230704204103537

4.6.3 暂退法的简洁实现

dropout1, dropout2 = 0.2, 0.5

net = nn.Sequential(nn.Flatten(),
        nn.Linear(784, 256),
        nn.ReLU(),
        # 在第一个全连接层之后添加一个dropout层
        nn.Dropout(dropout1),
        nn.Linear(256, 256),
        nn.ReLU(),
        # 在第二个全连接层之后添加一个dropout层
        nn.Dropout(dropout2),
        nn.Linear(256, 10))

4.7 前向传播、反向传播和计算图

暂略。

4.8 数值稳定性和模型初始化

4.8.1 梯度消失和梯度爆炸

由于 Sigmoid 函数的导数在输入距离 0 较远的时候非常接近 0 ,所以在反向传播的时候很可能导致某个参数的梯度为 0 。所以现在人们更倾向于选择 ReLU 函数。

如果深度网络在初始化具有较大的权重矩阵,则多个权重矩阵相乘将导致梯度下降很难收敛。

4.8.2 参数初始化

4.8.2.1 默认初始化

如果我们不指定初始化方法, 框架将使用默认的随机初始化方法,对于中等难度的问题,这种方法通常很有效。

4.8.2.2 Xavier初始化

通常,Xavier初始化从均值为零,方差 σ 2 = 2 n i n + n o u t \sigma^2 = \frac{2}{n_\mathrm{in} + n_\mathrm{out}} σ2=nin+nout2 的高斯分布中采样权重。

4.8.2 参数初始化

4.8.2.1 默认初始化

如果我们不指定初始化方法, 框架将使用默认的随机初始化方法,对于中等难度的问题,这种方法通常很有效。

4.8.2.2 Xavier初始化

通常,Xavier初始化从均值为零,方差 σ 2 = 2 n i n + n o u t \sigma^2 = \frac{2}{n_\mathrm{in} + n_\mathrm{out}} σ2=nin+nout2 的高斯分布中采样权重。

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

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

相关文章

Python爬虫-求是网

前言 本文是该专栏的第2篇,后面会持续分享python爬虫案例干货,记得关注。 地址:aHR0cDovL3NlYXJjaC5xc3RoZW9yeS5jbi9xaXVzaGkvP2tleXdvcmQ9 需求:根据搜索关键词,爬取对应关键词下的全部文章信息 废话不多说,跟着笔者直接往下看详细内容。(附带完整代码) 正文 1. 请…

说说 OpenAI 最新发布的Function calling 是什么

这两天看的比较多的一个新闻就是 OpenAI 又更新了自己的 API。 除了各种大减价,增加 Token 数量之外,还新推出了一个叫做 Function calling 的能力。那么 Function calling 到底是什么东西,可能很多新闻类型的内容也没讲太明白,我…

基于SpringBoot+vue的教师人事档案管理系统设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

【力扣周赛】第 352 场周赛

文章目录 Q1:2760. 最长奇偶子数组解法1——纯纯暴力解法2——枚举左端点,尝试右端点继续优化 Q2:2761. 和等于目标值的质数对一个小优化 Q3:2762. 不间断子数组解法1——滑动窗口维护哈希表普通HashMap使用TreeMap补充&#xff1…

利用Python批量压缩图片大小(不改变图片尺寸,不改变图片格式)

我们经常需要在某些文件中如:Word,Excel,PPT等中,插入大量的图片,但是图片每一张的内存都不小,累计多了,就是导致文件的内存过大,导致客户打不开文件,那么我们可以将图片的内存压缩一…

指针的指针理解与用法

指针实际上就是一个变量,当他不是空指针的时候他的值就是某一个地址,同时他自己也是有地址的,因为它是一个变量。 指针的指针的值其实就是某一个指针的地址。 int main() {int a 5;int *p &a;int **pp &p;printf("%p\n&quo…

GitHub Pages + Hexo搭建个人博客网站

步骤 参考如下步骤:https://blog.csdn.net/yaorongke/article/details/119089190 出现的问题 1 Fluid主题 其更换Fluid主题时: 下载最新 release 版本 解压到 themes 目录,并将解压出的文件夹重命名为 fluid 按照上面执行后,后…

新增数据列--Pandas

1. 直接赋值 order pd.read_excel(C:\\Users\\changyanhua\\Desktop\\order.xlsx) print(order.head()) # 1.直接赋值新增列: order[平均价]order[销售额]/order[数量] print(order.head())2.apply()方法 2.1 函数功能 沿着DataFrame的某个轴应用一个函数。返回…

AIGC - Stable Diffusion 的 Prompts 提示词工程框架 (1)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131544508 当前 Stable Diffusion 模型使用基础的 stable-diffusion-v1-5,即 v1-5-pruned-emaonly.safetensors。 Stable Diffusion …

【RT】统一的基于文本的行人检索:大规模多属性和语言检索基准

Towards Unified Text-based Person Retrieval: A Large-scale Multi-Attribute and Language Search Benchmark 西安交通大学 针对 基于文本的行人检索的预训练 展开探索 Motivation Data Scarcity Contributions MALS(Multi-Attribute and Language Search dataset for pe…

关于亚马逊测评,为何绝大多数卖家都倾向于自养号测评

亚马逊测评在当前的电商环境中对于卖家的重要性不言而喻。现在越来越多的卖家选择自养账号测评,相对于找国外买手或测评服务商,主要是出于以下考虑: 1.避免买家账号资源的重复使用:使用国外买手或测评服务商时,买家账…

Python+selenium自动化测试

批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。 unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner 一、导入HTML…

VSCode如何通过Ctrl+P快速打开node_modules中的文件

背景 咱们新建一个NodeJS项目,必然会安装许多依赖包,因此经常需要查阅某些依赖包的源码文件。但是,由于node_modules目录包含的文件太多,出于性能考虑,在VSCode中默认情况下是禁止搜索node_modules目录的。在这种情况…

Spring Boot 中的 XSS 攻击是什么,原理,如何预防

Spring Boot 中的 XSS 攻击是什么,原理,如何预防 XSS(Cross-Site Scripting,跨站脚本攻击)是 Web 应用程序开发中常见的一种安全问题。在 Spring Boot 中,XSS 攻击可能会导致应用程序被攻击者利用&#xf…

阿里云直播配置

一、开通阿里云直播 首先进入阿里云直播产品主页:https://www.aliyun.com/product/live 。 点击下方的“立即开通”。 如果是还未注册的用户请按照页面提示进行完成注册并实名认证。 2、首次进入会提示开通服务,点击“开通服务”,然后选择计…

操作系统与内核、系统编程与应用编程

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

Ubuntu18.04系统如何安装和使用telnet工具

在ubuntu18.04中如何安装和使用telnet工具呢?本文给出详细说明。 1.更新软件列表 sudo apt update 2.安装telnet服务 sudo apt install openbsd-inetd telnetd 3.查看telnet运行状态 netstat -a | grep telnet 4.登录测试 telnet 127.0.0.1

【NLP】PNR指标

PNR(Positive Negative Rate) 正逆序比 正序数 / 逆序数; 当正序数量越多、逆序数量越少时,表明模型对序关系的刻画越准确,模型效果越好。 参考:https://www.jianshu.com/p/e9813ac25cb6

如何使用不同的工具运行交互式的python

最近在极客时间学习陈旸老师《数据分析实战45讲》专栏,需要用到python,自19年后基本没用过python,现在又重头抓起,针对遇到的问题进行总结积累。代码片段均取自专栏内容。 示例代码: name raw_input("Whats your…

了解抖音本地生活服务商:连接你与便捷生活的桥梁

抖音本地生活服务商是抖音平台为用户提供的一项服务,旨在连接用户与本地商家,为用户提供更便捷的本地生活服务。下面是四川不若与众对抖音本地生活服务商的介绍。 1. 提供多样化的服务:抖音本地生活服务商为用户提供了多样化的服务&#xff0…