【实用机器学习】3.5 多层感知机


从本章开始,我们将正式介绍神经网络。

为什么需要神经网络:手工提取特征→学习特征

Untitled

在之前讲过的线性模型中,我们往往需要对原始数据做特征工程,把原始数据表示成线性模型喜欢的特征(即每个向量必须是数,并且语义信息清楚)。

神经网络或者或深度学习,是把我们手工特征提取的部分,换成了一个神经网络。此前我们使用人的知识对特征进行提取,现在则使用神经网络对特征进行提取,它提取出的特征可能对后面的线性归回或者softmax归回来讲更好一些。

优点:神经网络的好处在于我们人不需要再画脑筋去想怎么样提取特征。
缺点:神经网络需要的数据量和计算量大数个数量级的。

一般的神经网络架构:

  • 多层感知机
  • 卷积神经网络
  • 循环神经网络
  • Transformer网络

线性方法→多层感知机

多层感知机中最重要的是全连接层(fully connected layer)或叫稠密层(dence layer),这个层中包含可以学习的参数 W ∈ R m × n \mathbf{W} \in \R^{m\times n} WRm×n b ∈ R m b\in \R^{m} bRm,该层计算输出为 y = W x + b ∈ R m \mathbf{y}=\mathbf{W} \mathbf{x}+\mathbf{b} \in \mathbb{R}^m y=Wx+bRm

  • 线性回归就可以看做只有一个输出( m = 1 m=1 m=1)的全连接层
  • Softmax回归可以看做具有 m m m个输出的全连接层+softmax操作子

所以线性模型可以统一表示成:

Untitled

多层感知机(MLP)

上面的线性模型可以理解为单层感知机,那么如果表示多层感知机呢?

如果我们想得到一个非线性模型(线性模型能力有限),可以使用多个全连接层。但是仅仅使用全连接层是没有用的,因为简单的 n n n个线性操作的叠加还是一个线性操作,所以为了实现非线性,需要加入激活函数

  • 激活函数是一个按照元素的(elemental-wise)的非线性函数,例如Sigmoid、ReLU

sigmoid ⁡ ( x ) = 1 1 + exp ⁡ ( − x ) \operatorname{sigmoid}(x)=\frac{1}{1+\exp (-x)} sigmoid(x)=1+exp(x)1

Untitled

ReLU ⁡ ( x ) = max ⁡ ( x , 0 ) \operatorname{ReLU}(x)=\max (x, 0) ReLU(x)=max(x,0)

Untitled

有一层隐藏层的MLP:

Untitled

为什么标黄的Dense叫做隐藏层呢?
因为对于输出Outputs来说,只能看到最外层的Dence,所以里面的Dense是被隐藏了。

有多个隐藏层的MLP:

Untitled

  • 超参数:隐藏层的个数、每个隐藏层输出的大小都是需要手动调整的超参。

代码实现(一个隐藏层)

import torch
import torch.nn as nn

def relu(X):
    return torch.max(X, 0)

W1 = nn.Parameter(torch.randn(num_inputs, num_hiddens) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens))
W2 = nn.Parameter(torch.randn(num_hiddens, num_outputs) * 0.01)
b2 = nn.Parameter(torch.zeros(num_hiddens))

H = relu(X @ W1 + b1)
Y = H @ W2 + b2

参考资料

3.5 多层感知机【斯坦福21秋季:实用机器学习中文版】_哔哩哔哩_bilibili

https://c.d2l.ai/stanford-cs329p/_static/pdfs/cs329p_slides_5_1.pdf

猜你喜欢

转载自blog.csdn.net/weixin_46421722/article/details/129667166
今日推荐