4-1多层感知机
4-1多层感知机
激活函数
%matplotlib inline
import torch
from d2l import torch as d2l
ReLU函数
最受欢迎的激活函数是修正线性单元(Rectifiedlinearunit,ReLU),因为它实现简单,同时在各种预测任务
中表现良好。ReLU提供了一种非常简单的非线性变换。
通俗地说,ReLU函数通过将相应的活性值设为0,仅保留正元素并丢弃所有负元素。为了直观感受一下,我
们可以画出函数的曲线图。正如从图中所看到,激活函数是分段线性的。
-
torch.arange(start, end, step)是 PyTorch 中用于生成一个从start到end(不包括end)的等差数列张量,步长为step。 -
这里生成了一个从 -8.0 到 8.0 的张量,步长为 0.1。因此,
x是一个包含从 -8.0 到 7.9 的张量,形状为[160]。 -
requires_grad=True表示这个张量需要计算梯度,这通常用于反向传播计算中。虽然在这个绘图场景中不需要计算梯度,但设置requires_grad=True不会影响结果 -
d2l.plot是 D2L 库中的绘图函数,用于绘制图像。 -
x.detach()和y.detach():detach()方法用于将张量从计算图中分离出来,返回一个新的张量,该张量与原始张量共享数据,但不需要梯度计算。在这里,detach()的作用是将x和y转换为普通的张量,避免在绘图时涉及梯度计算。 -
'x'和'relu(x)'分别是 x 轴和 y 轴的标签。 -
figsize=(5, 2.5)指定了图像的大小,宽度为 5 英寸,高度为 2.5 英寸。
x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = torch.relu(x)
d2l.plot(x.detach(), y.detach(), 'x', 'relu(x)', figsize=(5, 2.5))
y.backward()是 PyTorch 中用于计算梯度的函数,它会根据y的值对x进行反向传播。torch.ones_like(x):生成一个与x形状相同的张量,其所有元素值为 1。这表示对y的每个元素施加一个梯度值为 1 的反向传播信号。retain_graph=True:在默认情况下,PyTorch 在调用backward()后会释放计算图,以节省内存。设置retain_graph=True可以保留计算图,使得可以多次调用backward()。在这个场景中,虽然只调用了一次backward(),但设置retain_graph=True不会影响结果。
反向传播计算
在 ReLU 函数中,梯度的计算规则如下:
- 当 x>0 时,ReLU(x)=x,因此梯度为 1。
- 当 x≤0 时,ReLU(x)=0,因此梯度为 0。
因此,y.backward(torch.ones_like(x)) 会计算出 x 的梯度,并将结果存储在 x.grad 中。
x.grad:这是x的梯度张量,存储了反向传播计算得到的梯度值。x.detach():将x从计算图中分离出来,用于绘图。d2l.plot:使用 D2L 库绘制图像。x.detach()作为 x 轴数据。x.grad作为 y 轴数据。'x'和'grad of relu'分别是 x 轴和 y 轴的标签。figsize=(5, 2.5)指定了图像的大小。
y.backward(torch.ones_like(x), retain_graph=True)
d2l.plot(x.detach(), x.grad, 'x', 'grad of relu', figsize=(5, 2.5))
sigmoid函数
y = torch.sigmoid(x)
d2l.plot(x.detach(), y.detach(), 'x', 'sigmoid(x)', figsize=(5, 2.5))
# 清除以前的梯度
x.grad.data.zero_() #用于将张量 x 的梯度归零
y.backward(torch.ones_like(x), retain_graph=True)
d2l.plot(x.detach(), x.grad, 'x', 'grad of sigmoid', figsize=(5, 2.5))
tanh函数
y = torch.tanh(x)
d2l.plot(x.detach(), y.detach(), 'x', 'tanh(x)', figsize=(5, 2.5))
# 清除以前的梯度
x.grad.data.zero_()
y.backward(torch.ones_like(x), retain_graph=True)
d2l.plot(x.detach(), x.grad, 'x', 'grad of tanh', figsize=(5, 2.5))

本章主要叙述多层感知机在输出层和输入层之间增加一个或多个全连接隐藏层,并通过激活函数转换隐藏层的输出。并介绍常用的激活函数包括ReLU函数、sigmoid函数和tanh函数
浙公网安备 33010602011771号