线性回归和 softmax 回归都是单层神经网络的实例,但我们通常遇到的问题并没有这么简单,本节将涉及多层神经网络的概念。参考吴恩达机器学习中关于神经网络的部分。 已经理解的内容不再赘述。
3.8.1 隐藏层
略。
3.8.2 激活函数
即使有了多层结构,数据在层与层之间不断进行传递,即所谓仿射变换(affine transformation),整个过程中只有线性变换。为了产生非线性的变化,我们需要引入激活函数(activation function)。概念已经在之前学过了,着重看一下几个常用的激活函数。
torch 中关于激活函数的部分都在torch.nn.functional
模块中, 而Tensor
类中可以同样的方法可以用。
先准备一下用于画图的部分。
# 画出激活函数
def show_act_func(x, y, title):
plt.plot(x.detach().numpy(), y.detach().numpy())
plt.title(title)
plt.xlabel("x")
plt.ylabel("y")
plt.show()
# 数据范围
x = torch.arange(-15.0, 15.0, 0.05, requires_grad=True)
- ReLu(rectified linear unit)函数
Relu 函数提供了一种非常简单的非线性变换, 将负数变为0,正数不变。
# relu
y = x.relu()
show_act_func(x, y, "relu(x)")
y = y.sum().backward()
show_act_func(x, x.grad, "grad of relu(x)")
- sigmoid 函数
sigmoid 函数可以将数值变换到(0,1)范围内。
# sigmoid
y =x.sigmoid()
show_act_func(x, y, "sigmoid(x)")
x.grad.zero_()
y = y.sum().backward()
show_act_func(x, x.grad, "grad of sigmoid(x)")
- tanh 函数
tanh 函数用于将数值变换到 (-1,1) 范围内。
# tanh
y =x.tanh()
show_act_func(x, y, "tanh(x)")
x.grad.zero_()
y = y.sum().backward()
show_act_func(x, x.grad, "grad of tanh(x)")
3.8.2 激活函数.py
3.8.3 多层感知机
多层感知机:含有 至少一个隐藏层 的由 全连接层 组成的 神经网络 ,且每个隐藏层的输出通过激活函数进行变换。
多层感知机的层数和各隐藏层中隐藏单元个数都是 超参数 。
其他略,吴恩达机器学习笔记中都讲过了。