这里回顾dlsys第三讲,本讲内容是神经网络和反向传播。

课程主页:

大纲

  • 从线性到非线性假设类;
  • 神经网络;
  • 反向传播(即计算梯度);

从线性到非线性假设类

线性假设类的问题

回想一下,我们需要一个假设函数来将$\mathbb R^n$中的输入映射到$\mathbb R^k$中的输出,因此我们最初使用线性假设类:

这个分类器本质上形成了输入的$k$个线性函数,然后预测值最大的类,相当于把输入分成每个类对应的$k$个线性区域:

非线性分类边界呢?

如果我们的数据不能被一组线性区域分开怎么办?我们想要一些方法通过一组非线性的类边界来分离这些点:

一个想法:将线性分类器应用于数据的某些(可能是更高维度的)特征:

图示:

我们如何创建特征?

我们如何创建特征函数$\phi$?

  1. 通过手动设计与问题相关的特征(机器学习的“旧”方式);

  2. 以一种从数据中学习的方式(机器学习的“新”方式);

最简单的方式:如果将$\phi$设置为线性函数会怎么样?

不起作用,因为它只是相当于另一个线性分类器:

非线性特征

既然线性函数无效,那什么有效呢? 只要是线性特征的任何非线性函数即可:

其中$W \in \mathbb{R}^{n \times d}$,并且$\sigma: \mathbb{R}^d \rightarrow \mathbb{R}^d$是任意非线性函数。

例子:设$W$为随机高斯样本的(固定)矩阵,并设$\sigma$为余弦函数$\Rightarrow$“随机傅里叶特征”(适用于许多问题)。

但也许我们也想训练$W$来最小化损失? 或者我们想将多个特征组合在一起?

神经网络

神经网络/深度学习

  • 神经网络是指一种特定类型的假设类,由多个参数化的可微分函数(又名“层”)组成,以任何方式组合在一起以形成输出。
  • 该术语源于生物学灵感,但在这一点上,从字面上看,上述类型的任何假设函数都被称为神经网络。
  • “深度网络”只是“神经网络”的同义词,“深度学习”只是指“使用神经网络假设类的机器学习”;
    • 但现代神经网络确实涉及将许多函数组合在一起,因此“深度”通常是一个合适的限定词;

“两层”神经网络

我们从最简单的神经网络形式开始,基本上只是前面提出的非线性特征,但两组权重都是可学习的参数:

其中$\sigma: \mathbb{R} \rightarrow \mathbb{R}$是按元素应用于向量的非线性函数(例如 sigmoid、ReLU)。

写成批量矩阵形式:

那么神经网络能做什么呢?一个重要的事实就是神经网络可以拟合任意函数。

通用函数逼近

定理(一维情况):给定任意平滑函数$f:\mathbb R\to \mathbb R$,闭区域$\mathcal D \subset \mathbb R$,和$\epsilon > 0$,我们可以构造一个单隐藏层神经网络$\hat f$,使得:

证明:

假设训练集为:

并且假设:

首先考虑拟合2个点:

对于3个点,考虑坐在$x^{(2)}, x^{(3)}$上拟合下式即可:

注意该函数还需要满足当$x< x^{(2)}$时为$0$。

全连接深度网络

$L$层神经网络的一种更通用的形式——又名“多层感知机”(MLP)、前馈网络、全连接网络——以批处理形式,可以表述为:

其中非线性函数$\sigma_i: \mathbb{R} \rightarrow \mathbb{R}$按元素应用,参数为:

反向传播(即计算梯度)

这里老师举了一个两层神经网络的例子,这里略过。

一般形式的反向传播

假设全连接网络为:

那么:

记:

然后我们有一个简单的“反向”迭代来计算:

计算实际梯度

要将这些量转换为“真实”梯度,请考虑矩阵大小:

所以使用矩阵运算可得:

实际参数梯度的类似公式:

反向传播:前向和反向传播

综上所述,我们可以按照以下过程有效地计算神经网络所需的所有梯度。

前向传播:

  1. 初始化:$Z_1=X$;
  2. 迭代:$Z_{i+1}=\sigma_i(Z_i W_i),i=1,\ldots, L$;

反向传播:

  1. 初始化:$G_{L+1}=\nabla_{Z_{L+1}} \ell\left(Z_{L+1}, y\right)=S-I_y$;
  2. 迭代:$G_i=\left(G_{i+1} \circ \sigma_i^{\prime}\left(Z_i W_i\right)\right) W_i^T, \quad i=L, \ldots, 1$;

我们可以计算所需要的梯度:

“反向传播”就是链式法则+中间结果的智能缓存,将该过程推广到任意计算图,即可得到自动微分。