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