---
# System prepended metadata

title: 讨论 2021-12-30
tags: [Fudan, '2021', tutorials]

---

讨论 2021-12-30
=

###### tags: `tutorials` `Fudan` `2021`

## 浅谈Deep Learning中的深度
本次分享主要讨论深度学习中的"深度"是什么意思？为什么需要深度，以及深度带来了哪些挑战。

### 什么是 "Deep"
深度学习之前就早有神经网络的概念，实际上，神经网络之前就有很多机器学习的方法讨论了如何构造复杂函数。简单来说，经典研究常常从两个角度思考问题，一是函数拟合，即认为任何任务的输入输出可以用某种函数映射表达，即$$Y = f(X), \quad Y,X \in R^{d} $$
当然，这里其实还涉及很多概率论的知识，因为很多数据本身就是以分布形式存在，并且这种映射关系有时也不是确定性的（函数的定义让其对同一个输入只能有一个输出，但引入概率密度函数就可以规避这一限制）。对于一个函数的复杂性，我们可以通过其阶数，项数，连续性，高阶导，条件数等性质加以描述。例如高次多项式显然比直线复杂。

第二类方法则是从区分样本出发，他们认为如果能找到一种方法把正确的输出和其他输出区分开，就能得到结果。例如SVM，决策树，聚类算法都体现了这种思想。同样的，区分样本也有难易之分，通常可以通过研究其VC维（指定函数族可以二元区分的最大样本数量，即对于某个数目的一组样本样本，不论他们的二元标签如何分布，总能找到一种分割方式），混淆矩阵（二元关系）的特征值等。

### 为什么需要深度

神经网络实际就是一种通过组合嵌套基本模块来组成复杂的函数的方法，而其深度就体现了所构造函数的复杂性。神经网络与其他方法的一个重要区别是它的每个模块是非常简单的，所以深度（也就是嵌套的层次）对它的作用是巨大的。如果每个模块不简单，比如一个模块是复杂的分段函数，或是复杂的非线性函数，那么一两个模块就能表达极其复杂的函数。也就没必要讨论深度了。

所以，我们同时可以知道，深度本身没有绝对含义，不同模块搭建的网络层数不是直接可比的，比如5层MLP+relu和5层attention+tanh，它们就不好直接比较。只有当组成元件高度相似时，深度才是有比较价值的。

### 深度为什么是瓶颈
一个直观的问题是，我们为什么要把复杂问题拆分成一堆基本模块的叠加？这就涉及到了参数估计和优化问题，参数越多越难估计，需要的数据也更多，同样的，在参数量相等时，模块越复杂，优化难度也越高。如果这些条件都一致，那么结构和优化顺序同样会带来影响，通常认为输出的天然产生过程是最容易估计的路线。即如果要完全了解一个事件，了解它是如何产生是最容易的路径。

简单来说，我们遇到了这样一串问题，目标任务需要非常复杂的函数来模拟或求解，而非常复杂的函数又往往需要大量的参数和复杂的函数形式，神经网络将其分解成简单模块的叠加，但叠加的深度过高同样难以处理。所以深度学习初期主要是讨论如何解决叠加很深的神经网络的参数估计问题。

此外，我们可以通过一个简单的例子来理解深度带来的麻烦。
如果$f(x)=Wx$，那么$f'(x) = W$，同理，在层数增加的时候，由于链式法则，我们知道网络的导数也是层次化的，并且深度和网络深度一样。那一个信号被经过一连串的缩放，很容带来两个结果，一是过大，一是过小。例如即便是一个稍大于对的1的数字在几十次方后也会很大，一个略小于1的数字在几十次方后也会很小。所以深度增加后遇到梯度爆炸和梯度消失的可能性会越来越高。

### 过去的解决方法

#### 无监督和Autoencoder
解决深度带来问题有多种思路，其中一种是减少优化到目标参数的路径长度，即我们先让模型参数处于一个良好的初始点，再让其走一小步到达目标参数。而什么是一个良好的初始点呢？往往是由无监督任务决定的，本质上现在利用MLM做预训练也是相同的思路，不过Autoencoder的基础是信息瓶颈理论，即一个样本的最重要的重构特征，往往是具有含义的，也是具有代表性的。

#### 卷积网络/循环网络
除了找到良好的起始点，另一种思路是缩减优化的可能性，即减少解空间。卷积神经网络，和现在众多以inductive bias为卖点的工作都是出于这类目的。

### 现在的方法

#### 残差连接
我们上面提到了深度指的是简单模块嵌套的层数，如果嵌套很少，优化就更加容易，但表达能力也会变弱。而残差连接便是一种平衡的策略，我们认为目标任务并不是一个完全复杂的任务，它更可能是由一个相对简单的主体和较为复杂的分支合并组成的。这其实和28定律有一定的呼应，所以残差提供了一种难易度的分工，并且让网络很容易退化为更简单的形式。

#### 预训练
不论是有监督的，还是无监督的，预训练本质还是尽可能的让网络参数处于一个有利于下游任务的起始点。

#### 激活值的模长/分布控制
除了不同层参数的连乘，很多非线性激活函数的导数是带有激活值的，比如
\begin{gather}
y = tanh(x) \quad y'= 1-y^2 \\
y = sigmoid(x) \quad y' = y(1-y)
\end{gather}
那么对于模长和激活值的控制就显得尤为重要了，把他们控制在1附近是更有利于优化层数很深的网络的。

### 优化路径的不可逆转性
初始点不过影响了优化的路径，很多时候也决定了优化的结果。我们的优化方法大多只能找到局部极值而非全局最优。优化的路径也是如此，它是有后效性的，即第一步走错，很可能是后续无数步无法修正的。因为梯度下降几乎是不会倒退的。所以优化过程本身存在着一定的不可逆性。