当前位置: 首页 > news >正文

《d2l Chapter4 多层感知机基础内容》

Chapter 4 : 多层感知机(MLP)


先看看这个原理简单的嵌套式的“双层”的线性回归

\[\mathbf{X} \in \mathbb{R}^{n \times d} \]

表示 \(n\) 个样品且每个样品有 \(d\) 个输入特征的小批量,\(\mathbf{H}\) 为隐藏层变量。
\(\mathbf{W}^{(1)} \in \mathbb{R}^{d \times h}\)\(\mathbf{b}^{(1)} \in \mathbb{R}^{1 \times h}\)\(\mathbf{W}^{(2)} \in \mathbb{R}^{h \times q}\)\(\mathbf{b}^{(2)} \in \mathbb{R}^{1 \times q}\)
有:

\[\begin{split}\begin{aligned}\mathbf{H} & = \mathbf{X} \mathbf{W}^{(1)} + \mathbf{b}^{(1)}, \\\mathbf{O} & = \mathbf{H}\mathbf{W}^{(2)} + \mathbf{b}^{(2)}. \end{aligned}\end{split}\]

然而显然,这并没有什么用处,因为:

\[\mathbf{O} = (\mathbf{X} \mathbf{W}^{(1)} + \mathbf{b}^{(1)})\mathbf{W}^{(2)} + \mathbf{b}^{(2)} = \mathbf{X} \mathbf{W}^{(1)}\mathbf{W}^{(2)} + \mathbf{b}^{(1)} \mathbf{W}^{(2)} + \mathbf{b}^{(2)} = \mathbf{X} \mathbf{W} + \mathbf{b} \]

完全可以被一个 \(\mathbf{X}\) 完美替代,还不会添加性能开销。

为了发挥多层的真正实力用处,我们在仿射变换之后对每个隐藏单元应用非线性的激活函数 \(\sigma\)
我们让

\[\begin{split}\begin{aligned}\mathbf{H} & = \sigma(\mathbf{X} \mathbf{W}^{(1)} + \mathbf{b}^{(1)}), \\\mathbf{O} & = \mathbf{H}\mathbf{W}^{(2)} + \mathbf{b}^{(2)}.\\ \end{aligned}\end{split} \]

激活函数的输出(例如\(\sigma(\cdot)\))被称为活性值
一般来说,有了激活函数,就不可能再将我们的多层感知机退化成线性模型

常见激活函数

\(ReLU\) 函数:

  • \(\operatorname{ReLU}(x) = \max(x, 0)\)
  • \(x=0\) 时认为导数为0
  • 还有变式:\(\operatorname{pReLU}(x) = \max(0, x) + \alpha \min(0, x)\)

\(sigmoid\) 函数:

  • 将输入变换为区间 \((0, 1)\) 上的输出$$\operatorname{sigmoid}(x) = \frac{1}{1 + \exp(-x)}$$
  • 导数如下$$\frac{d}{dx} \operatorname{sigmoid}(x) = \frac{\exp(-x)}{(1 + \exp(-x))^2} = \operatorname{sigmoid}(x)\left(1-\operatorname{sigmoid}(x)\right)$$

\(tanh\) 函数:

  • 双曲正切函数压缩至 \((-1,1)\)

\[\operatorname{tanh}(x) = \frac{1 - \exp(-2x)}{1 + \exp(-2x)}\]

  • 此外,存在关系式:$$\operatorname{tanh}(x) + 1 = 2 \operatorname{sigmoid}(2x)$$

简单模型(调用d2l函数)

import torch
from torch import nn
from d2l import torch as d2l
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)
http://www.jsqmd.com/news/48418/

相关文章:

  • 洛谷P2678题解
  • 【JVM】详解 Class类文件的结构 - 指南
  • 实验3_CPP
  • longchain4j 学习系列(4)-mcp调用
  • Java 学习路线可按「基础→进阶→实战→架构」四阶段推进
  • Jetson Orin Nano super -2 烧录概念及必要性
  • blog搬迁
  • 102302122许志安作业3
  • iPhone14系列电池容量多少毫安
  • ipc linux
  • 读 《d2l:Chapter3. 线性神经网络 》随笔
  • 错排的
  • ipad学linux
  • iPadOS16有什么新功能
  • ipad linux
  • 深入解析:蓝色星球如何打造能与企业共同进化的灵活系统
  • 第七讲上自监督学习self-supervised learning-BERT
  • 内网渗透过程的多种代理搭建方法
  • 男女生排列 女生的一定千万别忘了
  • 2025年11月上海专业防水补漏推荐!Top5口碑公司实测,先检测后施工有保障
  • 商品推荐系统-FAISS召回
  • AI 时代,.NET 开发者是向左还是向右?
  • Claude code 使用技巧
  • OpenDroneMap (ODM) 无人机影像三维模型重建安装及应用快速上手
  • OneDrive人脸分组功能预览引发隐私担忧
  • 人和动物的区别在哪里???
  • 机器人模仿学习运动基元数学编码高效的方法还有用吗?
  • CF2152
  • xyd 2025 NOIP 模拟赛
  • 7段第二课:贪心