---
# System prepended metadata

title: 讨论 2023-10-26

---

讨论 2023-10-26
=
###### tags: `tutorials` `Fudan` `2023`
神经网络基础（一）
=
我们之前介绍了大部分语言模型想要找到一个通用的函数关系，根据前文预测下一个词是什么。
$$ P_\theta (x_1 | <bos>) \prod_i P_\theta (x_i | x_{<i}) $$

我们把前文通过一个可学习的函数$r(\cdot)$得到一个前文表示，然后根据训练集中学到的$r(t;\theta)$与$x_t$之间的关系，预测出$\hat{x}_t$。
![](https://hackmd.io/_uploads/rJqHA5IMp.png =600x)

今天开始介绍如何利用神经网络构造这个前文表示$r(\cdot)$
## MLP
首先，我们先介绍一下神经网络的基本概念。

神经网络是由若干个神经元的组成，其中一个神经元的具体构成如下图所示，
![](https://hackmd.io/_uploads/SJRysiIGT.png =400x)

输入为三个实数,$x_1, x_2, x_3$，经过参数线性组合，$\hat{x}=w_1 x_1 + w_2 x_2 + w_3 x_3$，之后再通过一个激活函数，$f(\cdot)$，得到输出$y$。其中常见的激活函数如下图所示，我们稍后会讨论如何选取激活函数。

![](https://hackmd.io/_uploads/rki3boUM6.png =300x)![](https://hackmd.io/_uploads/rymJGj8Ma.png =300x)
神经网络是由多个神经元组合而成的，比如下图所示，输入x构成了中间层的结果y，然后再经过一个神经元得到z。我们可以看到下图一共有4个神经元。

![](https://hackmd.io/_uploads/r1_zGjUzT.png =500x)


## Universal Approximation
回到激活函数的选择问题，一个核心的性质是无限宽的神经网络或者无限深的神经网络可以拟合任何函数。这称之为Universal Approximation，可翻译为通用逼近原理。

我们可以考虑这样一种情况，一个神经元的激活函数
![](https://hackmd.io/_uploads/rymJGj8Ma.png =300x)

叠加多个这样的神经元，不管是嵌套（增加深度）还是并列（增加宽度），都可以促成下面的函数图形，可以看出，继续增加神经元的数量，可以模拟一个分段函数。
![](https://hackmd.io/_uploads/S1klzsLfa.png =500x)

假如我们有m个数据点，每个输入维度为d，label有k个。那么我们通过$m(d+k)$个参数，我们就可以构造一个分段函数，正好记忆这m个数据。

对于更复杂的函数，假如我们有无限个神经元，也可以用类似的方式去构造，达到任意精度的近似。

但这里有个有趣的问题，满足上述构造方式的激活函数有什么特点。这里严格的证明推荐阅读 https://arxiv.org/pdf/2105.04026.pdf ，这里只讲几个特例，比如两个ReLU叠加可以出现上述函数图像，sigmoid，tanh等本来就是类似的形式。而多项式函数都不可以，因为我们知道任意多p阶多项式相加，还是不会超过p阶的多项式，换言之，多项式函数的组合无法逼近非多项式函数。需要注意的是，用多项式函数逼近其他函数时需要阶数提升，所以增加网络宽度不行，但深度可以。

这里还有一个有趣的构造方式，同样是有m个数据点，每个输入维度为d，label有k个。如果我们可以通过一个d维的哈希函数，把原始的m个数据点映射到一维数轴上，然后仅需要$mk$个参数，既可以让神经网络记忆中这些样本对应的标签，总参数为$d+mk$。


基于这些分析，我们可以到，不论语言模型需求的前文推出后文的规律有多复杂，据够大的神经网络总是能拟合这样的规律。当然存在一个解，不代表我们可以通过优化的方式找到。此外，这套理论也没有考虑泛化性的问题，只是说模型的记忆和拟合能力是可以通过扩大规模加强的。

一个值得思考的问题是，现在神经网络的参数往往是多于记忆最复杂数据情况所要求的数目的，即神经网络的参数过多了，但实际上有不少工作认为这是有好处的，具体讨论超出了语言模型相关的范畴，并且这还是属于一个新生的研究领域，所以不做过多介绍。常见的讨论涉及优化路径和稀疏、低维流形表示等。


## MLP for N-gram LM
![](https://hackmd.io/_uploads/Hyfyro8Mp.png =400x)

有了神经网络之后，我们就可以用它来增强我们之间讲的N元语言模型，假如我们把前文当作神经网络的输入，然后中间层输出为$h$，之后再汇总成预测的下一个词，那么如果中间的$h$足够多，理论上我可以拟合任意复杂的函数，也就自然包括语言模型需要找的规律。

不过这里引出了一点问题，假如我们给神经网络的输入时完整的前文，那么就意味着输入长度是不固定的。如不固定的（变长的）输入恰恰是自然语言处理模型和图像及其他领域模型的关键区别。


要想让固定的参数适配不同长度的输入，我们可以考虑几种构造方法

- 递推式，$h_t = f(x_t, h_{t-1}; \theta)$
- 池化，比如$h = max_t (x_t), h=\sum_t x_t$等，attention类似于池化，或统称为与顺序无关的降维变换，其中与顺序无关指的是$f(x_1, x_2, \cdots, x_n) = f(x_2, x_1, \cdots) = f(x_{\sigma1}, x_{\sigma2}, \cdots)$。$\sigma1,\cdots, \sigma n$ 为任意一种下标排序。
- 分段递归，树状（比如两两合并，三三合并等）收窄到一个向量

我们会在后续的介绍中讨论具体构造方法的优劣和性质。
