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 中用于生成一个从 startend(不包括 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() 的作用是将 xy 转换为普通的张量,避免在绘图时涉及梯度计算。

  • '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))

image

  • 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))

image

sigmoid函数

y = torch.sigmoid(x)
d2l.plot(x.detach(), y.detach(), 'x', 'sigmoid(x)', figsize=(5, 2.5))

image

# 清除以前的梯度
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))

image

tanh函数

y = torch.tanh(x)
d2l.plot(x.detach(), y.detach(), 'x', 'tanh(x)', figsize=(5, 2.5))

image

# 清除以前的梯度
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))

image


posted @ 2025-06-19 12:50  小西贝の博客  阅读(18)  评论(0)    收藏  举报