线性回归和 softmax 回归都是单层神经网络的实例,但我们通常遇到的问题并没有这么简单,本节将涉及多层神经网络的概念。参考吴恩达机器学习中关于神经网络的部分。 已经理解的内容不再赘述。

3.8.1 隐藏层

略。

3.8.2 激活函数

即使有了多层结构,数据在层与层之间不断进行传递,即所谓仿射变换(affine transformation),整个过程中只有线性变换。为了产生非线性的变化,我们需要引入激活函数(activation function)。概念已经在之前学过了,着重看一下几个常用的激活函数。
torch 中关于激活函数的部分都在torch.nn.functional模块中, 而Tensor类中可以同样的方法可以用。
先准备一下用于画图的部分。

  1. # 画出激活函数
  2. def show_act_func(x, y, title):
  3. plt.plot(x.detach().numpy(), y.detach().numpy())
  4. plt.title(title)
  5. plt.xlabel("x")
  6. plt.ylabel("y")
  7. plt.show()
  8. # 数据范围
  9. x = torch.arange(-15.0, 15.0, 0.05, requires_grad=True)
  • ReLu(rectified linear unit)函数

Relu 函数提供了一种非常简单的非线性变换, 将负数变为0,正数不变。

3.8 多层感知机 - 图1

  1. # relu
  2. y = x.relu()
  3. show_act_func(x, y, "relu(x)")
  4. y = y.sum().backward()
  5. show_act_func(x, x.grad, "grad of relu(x)")

图片.png图片.png

  • sigmoid 函数

sigmoid 函数可以将数值变换到(0,1)范围内。
3.8 多层感知机 - 图4
3.8 多层感知机 - 图5

  1. # sigmoid
  2. y =x.sigmoid()
  3. show_act_func(x, y, "sigmoid(x)")
  4. x.grad.zero_()
  5. y = y.sum().backward()
  6. show_act_func(x, x.grad, "grad of sigmoid(x)")

图片.png图片.png

  • tanh 函数

tanh 函数用于将数值变换到 (-1,1) 范围内。
3.8 多层感知机 - 图8
3.8 多层感知机 - 图9

  1. # tanh
  2. y =x.tanh()
  3. show_act_func(x, y, "tanh(x)")
  4. x.grad.zero_()
  5. y = y.sum().backward()
  6. show_act_func(x, x.grad, "grad of tanh(x)")

图片.png图片.png

3.8.2 激活函数.py

3.8.3 多层感知机

多层感知机:含有 至少一个隐藏层 的由 全连接层 组成的 神经网络 ,且每个隐藏层的输出通过激活函数进行变换。
多层感知机的层数和各隐藏层中隐藏单元个数都是 超参数
其他略,吴恩达机器学习笔记中都讲过了。