理解神经网络

神经网络为什么这么厉害?
这已经是一个困扰我们快三十年的问题了. 深度学习的广泛应用，反而加深了这种困惑. 为什么只需要稍微调整一下参数，就能将它应用到任何分类和预测的问题上，还总能得到不错的结果？对于好奇心旺盛的人而言，使用这样强大却难以解释的工具会带来强烈的不安感：会不会还有更好的作为选择？

不安感随着神经网络的使用仍在发酵. 神经网络中有大量的参数往往需要使用试错的方式来选择，包括隐藏层的数量、神经元的数量、激活函数的类型等. 训练神经网络的反向传播算法可能是神经网络其中最神秘的部分. 在理解这些过程之前，很难想象要怎样提高神经网络的效率.

所有这些困难本质上都指向了同一个问题：神经网络到底在做什么？什么使得它看起来无所不能？

答案在这里！准备好了吗？
简单地说，神经网络从数据中提取出了描述特征和标签性关联性的关键信息. 换句话说，神经网络的具体形式决定了我们可存储和计算的数据结构，而神经网络训练的结果给出的是使用该数据结构对特征与标签的统计关联的最佳刻画.

现在你一定有两个问题要问：真的么？为什么？

要回答“为什么”可能得花些功夫，我们为此写了一篇论文对此进行讨论. 用一句话总结的话，首先我们度量了信息对特定推断任务的价值，并发现了神经网络实际上是在提取数据中最有价值的信息. 同样的分析方法可以用在理解或比较其他学习算法，或者主成分分析和 压缩感知等方法中.

我们尝试用这个页面回答“真的么”这个问题. 要回答这个问题，我可以列出论文里的数学证明. 不过这里，我们尝试从数值上解释相关的结果，可能还带一点点数学以及直观的解释. 在一系列的实验之后，我们会介绍一个新的度量用来评价神经网络的“效率”. 在设计复杂的网络时，这个度量对于选择网络结构和超参数是尤其有用的.

我们希望这个页面可以：


 * 1) 为神经网络的初学者提供可参考的案例. 希望这些基础的案例在你开始变成时能有帮助.
 * 2) 为有丰富神经网络实践经验的工程师解释我们的研究. 我们将使用代码解释研究的核心想法，希望它可以使你更灵活高效地开展下一个项目.
 * 3) 为对理论感兴趣的统计学家提供附加材料. 本页面无法取代论文中的数学证明，但可以有效地解释我们论文里的核心想法.

为了理解这些实验：
你可以阅读这些代码和注释，并且接受运行结果；或者选择自己运行代码. 运行代码将需要一个标准的Python环境, 还会用到Numpy, Matplotlib等工具包. 当然，神经网络neural network的工具包也是需要的，这里我使用的是基于TensorFlow后台的Keras，安装过程可以参照这个链接. 我推荐使用Anaconda来安装和管理所有这些环境，应该只需要几分钟的时间. 当然，我会把实验现象都展示出来，悠闲地欣赏也会是不错的体验.

你会需要一些代码来初始化：

如果程序没有报错，那么恭喜你，至少环境配置没有问题. 现在，我们的旅途正式开始了！

实验
我们将会开展三个难度依次递进的实验. 在每个实验里，我们都会生成一系列的样本$$ (x_i, y_i), i=1, \ldots, N $$. 我们使用$$ x $$和$$ y $$分别作为神经网络的输入和对应的标签，并进行训练. 我们的目标是理解神经网络训练过程中到底发生了什么：神经网络从训练数据中“学习”到了什么，以及如何存储学习的结果. 为了解答这些问题，我们将在训练结束时提取出网络参数，并和参数的理论值进行对比；在某些情况下我们会跳过训练过程，直接将使用理论的参数值，并检查此时网络的性能.

这三个实验的大体内容如下：
 * 1) 我们从结构最简单的神经网络入手，即只有SoftMax输出层的单层神经网络. 这回帮助我们建立关于神经网络中权重计算的第一个数学公式；
 * 2) 接下来，我们考虑有一个隐藏层的网络，但我们限定数据集中的$$ x $$ 和 $$ y $$的只能取有限的离散值. 这实际上对应于有足够表达/拟合能力的神经网络，进而我们可以得到这个网络提取出的“理想”特征，并与理论最优的特征进行比较；
 * 3) 最后我们对多层神经网络进行研究，以理解表达能力不足的网络如何逼近“理想”的特征. 基于此，我们可以自然地定义对逼近效果的度量，从而可衡量不同网络结构表达特征的有效性.

数据样本生成
我们将生成一系列的数据样本$$(\underline{x}, y )$$，其中$$\underline{x}$$为数据的特征，$$y $$为数据所对应的标签. 有了这些样本之后，我们可以训练一个简单的 神经网络完成对特征的分类任务.

具体操作时，我们生成服从Dirichlet分布的一系列$$ \underline{x} $$. 分布的参数是随机选取的，但会与$$ y $$的值有关. 为什么要使用Dirichlet分布呢？当然，我们也可以使用更熟悉的混合高斯模型，但这样容易造成错误的印象：实验结果与数据分布密切相关，或者只在高斯条件下成立. 从这个意义上来说，Dirichlet分布显然是足够“非高斯”的. 这不是一个严谨的说法，欢迎你尝试其他更奇怪的概率分布，越多越好.

这是我用来生成数据的代码：

生成的数据大概长成这样. 我必须把数据对应的标签用不同颜色表明，否则几乎无法区分. 这个分类问题看起来不那么容易，是吧？图里面有点古怪的三角形，是由于Dirichlet分布的支撑集在一个单纯形上. 这里我们是在一个3维空间中的单纯形上生成了数据，然后将它们投影到二维空间，看起来就是三角形的样子.



用于分类问题的神经网络
现在，我们搭建一个神经网络来处理这些数据. 这里用到的网络只有一层，还不能称为深度学习；不过简单的结构会有助于我们的理解，也能够说明神经网络的SoftMax单元的一些特性. 这个网络的结构是这样：



神经网络所做的就是训练其中的参数$$(\underline{v}_j, b_j )$$，从而对特征进行相应的线性变换，可表示为$$Z_j = \underline{v}_j^{\mathrm{T}} \cdot \underline{x} + b_j$$，每个$$j$$对应不同的输出层神经元. 接下来，输出层通过SoftMax函数将这些$$Z_j$$转化为概率分布的形式

$$Q^{(v,b)}_{Y|\underline{X}}(j | \underline{x}) = \frac{e^{Z_l}}{\sum_i e^{Z_l}}$$

并且尝试最大化样本对应的似然函数值：

$$\max_{v, b} \sum_{i=1}^N \log Q_{Y|\underline{X}}^{(v,b)}(y_i| \underline{x}_i) $$

输出层节点的数量$$ K $$应该和标签所有可能取值的数量一样，对应于代码里的$$\text{Cy} = |{\mathcal Y}| $$. 使用Keras实现该网络的代码很简单：

从变量和函数名称里可以清楚地看出我们在做什么：model.add指定了网络的结构，接下来model.fit开始训练权重. 训练好的权重值可以通过调用model.get_weights获得，于是我们得到：

一个困扰我们几十年的问题是：这些权重到底代表什么？

这些权重是什么?
现在我们来计算$$ Y $$的经验分布以及每一类数据的经验平均值$$ {\mathbb E} [\underline{X}|Y=y] $$：

所得到的M是一个Cy行Dx列的矩阵. 对于range(C_y=8)中的每一个j， M[j,:]是一个Dx=2维的向量. M的每一列M[:, i]可以被看作是$$ y $$的一个函数. 可以注意到，神经网络计算的权重，即我们在图里画的$$ v_j $$们，也是一个Cy乘Dx的矩阵，它的每个元素对应从一条从输入层神经元到输出层神经元的连线. 我们希望对这两组取值进行比较. 在比较之前，我们需要使用以下的程序将所有$$ y $$的函数归一化，保证它们在经验分布PPy下是零均值和单位方差的.

现在我们可以准备画图了：

得到的结果类似这样：

是不是有点意思？所以神经网络的训练过程实际上在算的东西很简单：不同$$y$$对应的条件期望$${\mathbb E} [\underline{X}|Y=y] $$的经验值.

那么，为什么神经网络要费这么大劲去算条件期望呢？这个可以追溯到Alfréd Rényi以及HGR相关的的记号. 在论文里，我们证明了条件期望实际上是$$y$$的所有函数中，与分类问题最相关的函数.

好吧，如果HGR这些东西听起来过于抽象，你可以简单地认为有一个统计学家们希望计算的“好”的函数. 这个函数可能和经典概念中所说的描述$$(\underline{X}, Y)$$的充分统计量有些不一样. 在这里，由于输入特征维度过高且具有复杂的结构，很难通过学习得到像充分统计量这样完整的信息. 神经网络则限定了我们能够学习到包含多少个自由参数的函数，而这个数量远小于描述$$(\underline{X}, Y)$$完整的统计模型所需要的参数个数. 因此，我们希望通过比较少的参数有效地对完整的统计模型进行逼近. HGR相关的概念以及我们的论文说的就是，我们可以从理论上分析什么样的函数可以给出最佳的逼近；我们的结果表明，神经网络所给出的参数正是理论上逼近效果最好的，而且这些参数正是以权重的方式存储在网络中！

无需训练的神经网络
到这里，我想我们可以来点更大胆的想法. 我们可以构造一个神经网络但并不训练，而是直接把权重的理论值填进去，看看结果会怎样！

我们用到的代码应该长这样：

本质的变化是，这里没有出现model.fit函数. 这里，我们用函数makeup_1layer计算所有这些权重，并用model.set_weights直接设置了权重值. 这种做法相当于只是把神经网络作为一个特定的数据结构，并使用我们自己造的函数替代了反向传播/训练过程. 之后，我们可以用model.predict_classes检查这个新网络的性能.

我们计算权重的函数如下:

更明确地说，这段程序实际在计算

$$ \underline{v}_j = \frac{{\mathbb E}[\underline{X} | Y=j]}{\sigma^2}; \qquad b_j= \log P_Y(j) - \frac{\|{\mathbb E}[\underline{X} | Y=j]\|^2}{2\sigma^2} $$

其中$$ {\mathbb E}[\cdot] $$是经验平均，$$ \sigma^2 $$是$$ \underline{x}$$中元素经验方差的平均值.

毋庸讳言，计算的这些权重表现不错，可以和Keras训练出来的结果相比拟. 换句话说，神经网络的所有秘密都藏在这两个等式里！

实验2: 离散数据输入
上一个实验远远不能满足我们对深度学习的好奇心，尽管它已经说明了SoftMax输出层的作用. 对实际的深度神经网络而言，似乎中间上百个隐藏层对网络性能的影响更大. 那么这些隐藏层都起了什么作用呢？

为了研究这个问题，我们把之前的单层神经网络稍作修改，得到如下的网络.



暂且将红色的虚线看作是神经网络中的许多层，它们构造了特征$$ S(x) $$，即输入$$ x $$的一个函数，并将它送到SoftMax输出层中. 神经网络会选择什么样的函数$$ S(\cdot) $$呢？直觉告诉我们，$$ S(x) $$应该会是一个“有信息量”的特征以帮助我们完成对$$ y $$的推断过程. 但什么样的特征会是“有信息量”的？

为了回答这个问题，我们先看一个简单的情形. 当$$ x $$只从有限集合$$ \{ 1, \ldots, m\} $$取值时，若神经网络输入为指示函数，或者说one-hot编码的形式，设此时经过一个隐藏层后我们将得到$$ S(x) $$. 这个简单例子的精妙之处在于，任何形式的$$ S(x) $$ 都可以通过选择合适的权重$$ w_1, \ldots, w_m $$生成：

$$ S(x) = \sigma\left( \sum_{i=j}^m w_j \cdot \mathbb{I}_{x=j}\right) $$

其中$$ \sigma(\cdot) $$为激活函数，这里我们选用sigmoid函数. 换句话说，这个单隐藏层的神经网络具有足够的表达能力. 我们的问题是，当我们给神经网络选择特征的自由时，它会选择什么样的$$ S(x) $$？为什么？

生成数据样本
我们通过随机的方式产生联合分布$$ p_{XY} $$. 这不是必要的，你也可以选择任何其它想要的联合分布. 这里的随机，只是为了避免产生精心选择实验条件的印象. 好吧，如同所有非数学的表述，这样也说不清楚到底生成了什么. 尽管如此，我们是这样生成的：

值得一提的是，这个函数在生成数据之后返回的是分布$$ p_{XY}, p_X, p_Y $$. 这可能有作弊的嫌疑，因为更严格的方法应该仅仅返回生成的数据样本，再调用另一个函数根据样本计算联合分布及边缘分布的经验值. 基于对大数定理的信心，这里我们省去了这一步骤.

这时候我们已经可以计算两个函数，作为理论结果：

正如变量的名字所暗示的，计算得到的S_theory和v_theory将作为理论结果并与神经网络训练的结果进行比较. 别急，我很快会说明它们的计算过程. 如果不留一点点悬念，这个wiki页面会是多么的无趣！

在使用我们的数据样本之前，需要把它们转化成one-hot编码的形式. 这可以通过sklearn中标准的函数完成：

运行神经网络
现在我们准备构造一个神经网络用来学习这些数据. 这是Keras中相当标准的流程：

代码最后一行所得到的weights是一个列表，列表中有两个元素与我们图中的权重$$ w, v $$相对应. 我们把它们拿出来并进行如下的处理，其中regulate函数用于对结果归一化. 在这之后，我们就可以将结果画出来并与理论值进行比较了.

需要指出的是，这里我们使用了'expit'函数来计算$$ S $$，因为我们使用了sigmoid作为激活函数. 这样计算得到的$$ S(x) $$就对应于我们图中隐藏层的输出，也就是神经网络所提取的特征.

这里给出一个典型的结果：意外不意外？训练值和理论值看起来是一样的！现在是不是有点好奇理论值的计算方式，或者说WhatTheorySays函数的内容了？



What Theory Says?
首先，我们使用真实分布 $$ p_{XY} $$ 作为了WhatTheorySays的输入参数，这其实是在作弊. 原则上，我们应该输入的是所有的训练样本，以保证WhatTheorySays获取的信息和神经网络完全一样. 你当然可以计算经验的联合分布来替代 $$ p_{XY} $$ ，因为大数定理的作用，结果应该是一样的. 这里的情形更为微妙：我们提供的样本数量可能还不足以精确地学习出 $$ p_{XY} $$，因为 $$ {\mathcal X} $$ 和 $$ {\mathcal Y} $$ 可能是很大的字母集. 但是为了使得神经网络能够正常工作，我们只需要保证联合分布中与任务相关的部分有比较准确的估计. 这是一个重要的有关控制算法样本复杂度的事实. 在我们的例子里，两个字母集都很小，避免了有关样本复杂度的讨论. 有兴趣的读者可以试着增大字母集，即程序中的xCard, yCard，看看神经网络和我们的方法哪一个会先失效.

聊完这些后，我们来看一下代码：

比你想象的简单多了，不是么？是的，这就是神经网络所计算的！以数学形式表达，这段代码所做的是：首先构造一个大小为 $$ |{\mathcal Y} | \times |{\mathcal X}| $$ 的矩阵 $$ B $$，矩阵各元素与特定的$$ (x, y) $$取值相对应:

$$ B(y, x) = \frac{p_{XY}(x, y)}{\sqrt{p_X(x)} \sqrt{p_Y(y)}} $$

在这之后我们对 $$ B $$ 矩阵进行奇异值分解(SVD)，并选出第二大奇异值对应的左右奇异向量 $$\underline{r}_1 \in {\mathbb R}^{|{\mathcal Y}|} $$ 和 $$ \underline{u}_1 \in {\mathbb R}^{|{\mathcal X}|}$$. 将 $$ \underline{u}_1, \underline{r}_1 $$ 分别视为 $$ {\mathcal X, Y} $$ 的实值函数，并作归一化

$$ S(x) = \frac{u_1(x)}{\sqrt{p_X(x)}}, \quad v(y) = \frac{r_1(y)}{\sqrt{p_Y(y)}} $$

这样得到的 $$S, v $$ 就是我们的理论结果. SVD的性质保证了它们是零均值和单位方差的因此我们这里不需要regulate函数了. 这就给出了你看到的图中的结果.

被这些公式绕晕了？别慌，让我们走近再瞧一瞧.

B 矩阵
首先，你可能会觉得我们引入的归一化方式有一点奇怪. 这个归一化建立了数据的函数及可以操作的向量之间的对应关系. 在 $$ X $$ 空间中，我们将函数 $$ S : {\mathcal X} \mapsto {\mathbb R} $$ 以向量形式表达为 $$ \underline{u} \in {\mathbb R}^{|{\mathcal X}|} $$. 在 $$ Y $$空间中，归一化方式是 $$ v(y) = r(y) /\sqrt{p_Y(y)} $$. 这样建立了函数与向量之间的对应关系 $$ \underline{u} \leftrightarrow S, \underline{r} \leftrightarrow v $$. 在我们进一步解释之前，暂且认为这个奇怪的归一化方式是给定的.

你可能会问，我们之前不是已经计算过 $$ v(y) $$ 的表达式了，它不就应该等于 $$ v(y) = {\mathbb E} [ S(X)|Y=y] $$ 吗？

是的，这正是我希望你问的问题.

结果表明，这里的和之前问题的答案确实完全一样. 我们从刚才定义的 $$ B $$ 矩阵入手，寻找些线索. $$ B $$ 矩阵有许多漂亮的性质，其中一个出现在 $$ B $$ 矩阵与向量做乘法时.

考虑 $$ \underline{r} = B \cdot \underline{u} $$ ，其中 $$ \underline{u}, \underline{r} $$ 分别和函数 $$ S(x) $$ 及 $$ v(y) $$ 相对应. 把这个乘法的计算过程写出来：

$$ \begin{align} v(y) &= \frac{1}{\sqrt{p_Y(y)}} r(y) = \frac{1}{\sqrt{p_Y(y)}} \sum_x B(x, y) u(x) \\ & = \frac{1}{\sqrt{p_Y(y)}} \sum_x B(x, y) \sqrt{p_X(x)} \cdot S(x) \\ &= \frac{1}{\sqrt{p_Y(y)}} \sum_x \left( \frac{p_{XY}(x,y) } {\sqrt{p_X(x)} \sqrt{p_Y(y)}} \right) \sqrt{p_X(x)} \cdot S(x)\\ &= {\mathbb E} [S(X)|Y=y] \end{align} $$

换句话说，矩阵乘法 $$ \underline{r} = B \cdot \underline{u} $$ 定义了一个映射关系，将定义在 $$ {\mathcal X} $$ 空间上的特征 $$ S(\cdot) $$ 映射为 $$ {\mathcal Y} $$ 上对应的特征 $$ v(\cdot) $$ ，而且 $$ v(y)={\mathbb E} [S(X)|Y=y] $$. 正如我们已经看到的那样，这个映射关系和神经网络的运行机制密切相关.

不难验证，与之共轭的操作 $$ \underline{u} = B^{\mathrm{T}} \cdot \underline{r} $$ 定义了反方向的映射，将 $$ y $$ 的函数 $$ v(y) $$ 映射为 $$ x $$ 的函数 $$ S(x) = {\mathbb E}[v(Y)|X=x] $$.

特征投影
现在我们可以大致描述神经网络的运行机制了. 最开始，网络中的所有系数都是随机选择的，因此相应的特征 $$ S(x) $$ 和输出层权重 $$ v(y) $$ 也是随机的. 在反向传播算法的执行过程中，我们首先固定了 $$ S(x) $$ 来更新 $$ v(y) $$ ，这可以看作是在找和 $$ S(x) $$ 最“吻合”的 $$ y $$ 的特征 $$ v(y) $$ ，而这个 $$ v(y) $$ 就是 $$ v(y) = {\mathbb E} [S(X)|Y=y] $$. 下一步，我们固定 $$ v(y) $$ 找与之相吻合的 $$ x $$ 的特征，也就是 $$ S(x) = {\mathbb E}[v(Y)|X=x] $$. 这样多次迭代之后， $$ S(x) $$ 与 $$ v(y) $$ 最终将完美地吻合.

在刚才的描述里，我们在重复地回答一个问题：一个变量什么样的特征与另一个变量的特征是最吻合的. 我们将这个问题的结果称为“特征投影”：如果我们要在所有 $$ y $$ 的特征的空间中寻找 $$ S(x) $$ 的投影，那这个投影的结果正是条件期望 $$ v(y) = {\mathbb E} [S(X)|Y=y] $$.

特征投影的故事将自然引出的理论结果中的SVD. 设 $$ \underline{u}, \underline{r} $$ 是 $$ B $$与奇异值 $$ \sigma $$ 对应的一组奇异向量，我们有 $$ \sigma \cdot \underline{r} = B \cdot \underline{u} $$ 以及 $$ \sigma \cdot \underline{u} = B^{\mathrm{T}} \cdot \underline{v} $$. 暂时不用关心这里的比例因子 $$ \sigma $$ ，毕竟它已经程序里的regulate处理了. 当我们需要计算SVD时，可以考虑使用幂法. 也就是说，我们随机选择一个 $$ \underline{u} $$ 的初始值，然后重复地左乘上 $$ B^{\mathrm{T}} B $$. 你可以发现这实际上就是在做特征投影.

在论文里，我们表明最终的 $$ \underline{u}, \underline{r} $$ 对就是 $$ B $$ 的第二大奇异值所对应的奇异向量. 这样的 $$ \underline{u}, \underline{r} $$ 提炼出了 $$ X $$ 和 $$ Y $$ 最强的相关模式. 这正是这样的特征被用于神经网络预测的原因. 这个故事可以很容易地推广到有 $$ k $$ 对奇异向量的情形，此时提炼出的是最强的 $$ k $$ 个相关模式，对应神经网络在输出层的前一层有 $$ k $$ 个神经元的情形.

还漏了一件事情：这里为什么选择第二大奇异值对应的奇异向量，而不是最大的. 事实上，第一对奇异向量的值是固定的：

$$ \underline{u}_0 = [\sqrt{P_X(x)}, x \in {\mathcal X}], \underline{r}_0 = [\sqrt{P_Y(y)}, y \in {\mathcal Y}] $$,

它们对应的奇异值是 $$\sigma_0= 1 $$. 这可通过简单的计算验证： $$ \begin{align} B \underline{u}_0 = \sum_x B(y,x) \sqrt{P_X(x)} = \sum_x\left( \frac{P_{XY}(x, y)}{\sqrt{P_X(x)}\sqrt{P_Y(y)}}\right)\cdot \sqrt{P_X(x)} = \sqrt{P_Y(y)} \end{align} $$

所有其他的奇异向量都必须和第一对奇异向量正交，即

$$ \begin{align} 0 = \langle \underline{u}_0, \underline{u} \rangle = \sum_x \sqrt{P_X(x)} \cdot \sqrt{P_X(x)} S(x) = {\mathbb E}[S(X)] \end{align} $$

这意味着对应于 $$ \underline{u} $$ 的特征 $$ S(x) $$ 必须关于分布 $$ P_X $$ 是零均值的. 不失一般性，我们假设选取的特征都是零均值的. 可以发现，$$ B $$ 的其它奇异值都不大于1，这是数据处理不等式的一个简单推论. 因此，第二对奇异向量其实是第一对非平凡的奇异向量.

在我们的论文里，我们实际上使用了如下的 $$ \tilde{B} $$ 作为 $$ B $$ 的定义. $$ \tilde{B} $$ 中除去了平凡的那对奇异向量的影响，更清晰地反映了 $$ X $$ 和 $$ Y $$ 之间的相关性.

$$ \begin{align} \tilde{B} (y,x)= \frac{P_{XY}(x, y)}{\sqrt{P_X(x)}\sqrt{P_Y(y)}} - \sqrt{P_X(x)}\sqrt{P_Y(y)} = \frac{P_{XY}(x, y) - P_X(x) P_Y(y)}{\sqrt{P_X(x)}\sqrt{P_Y(y)}} \end{align} $$

实验3: 受限的表达能力
目前，我们已经知道神经网络在基于输入样本 $$ X $$预测 $$ Y $$ 时，网络使用训练样本所“学习”到的是两个特征$$ S(x) $$ 及 $$ v(y) $$ ，并以权重的形式存储在神经网络中. 这两个特征可表示为以下问题的解：

$$ \begin{cases} S(x) = {\mathbb E}[v(Y)|X=x]\\ v(y) = {\mathbb E}[S(X) |Y=y] \end{cases} $$

而且，它们对应于一个矩阵 $$ \tilde{B} $$ 的奇异向量，因此可以解释为 $$ X $$ 和 $$ Y $$ 最强的相关“模式”.

换句话说，神经网络有清晰的计算目标，并且我们解释了这样计算的优点.

但这个目标要求这个网络有足够强的表达能力，即可以表达任何形式的特征. 为此，我们在上一个实验里限制了输入的 $$ x $$ 只取离散值. 但在这里，我们更进一步地讨论神经网络表达能力不足的情况. 这是我们将神经网络用于自然语言处理、计算机视觉等应用时都将面临的问题. 直观地看，这时候网络应该寻找次优解，即在所有能够生成的特征中找到与SVD所得出理想特征最接近的一个. 我们希望能够验证并更好地理解这个直观的想法.

这是我们准备研究的网络：



离散数据，连续数据
这个网络和之前的主要区别在于，这里的输入数据 $$ T_1, \ldots, T_m $$ 取的是连续值，而之前我们假设输入是离散随机变量 $$ X $$ 的one-hot编码.

这个改动为什么值得一提呢？如果你仔细检查刚才的解法，我们指出神经网络是在计算联合分布 $$ P_{XY} $$ 的一个函数. 当输入 $$ T $$ 取连续值的时候，并不是我们不能类似地做联合分布 $$ P_{TY} $$ 的假设，而是像 $$ {\mathbb E}[v(Y)|T=t] $$ 的记号不再有意义. 仔细考虑一下，这个条件期望是 $$ t $$ 的函数. 我们可能指望对接近的 $$ t $$ 和 $$ t+ \delta $$ ，对应条件期望的值也很接近，但是数据似乎并不能保证这一点. 当然，一个自然的考虑是对数据进行平滑操作，但这样很难给出漂亮的解析结果.

所以我们计划这样：不直接将一组随意的连续值的数据送到神经网络中，而是假设在 $$ T $$ 的背后存在一个离散取值的 $$ X $$. 也就是说，在获取数据的过程中，我们不能直接观测到离散取值的 $$ X $$ ，而是 $$ X $$ 经过“预处理”（pre-processing）后的结果，也就是连续取值的 $$ T $$. 预处理的方式是给定的. 现在问题是：神经网络会怎样处理这些预处理后的数据样本呢？

这样的视角可以帮助我们理解深度神经网络：从多层神经网络中的每一层看，前一层都是在做特定方式的预处理；在给定预处理方式后，神经网络会通过反向传播算法来分配相应的权重；而我们这里要解决的，正是解读这个权重的问题.

这会引出有点哲学意味的问题：我们是不是总可以将连续取值的数据看作是，某个离散取值的数据源预处理后的结果？我们给出的答案是：几乎总是如此！尤其是，当我们允许 $$ X $$ 的字母集很大的时候. 这不是严格的数学陈述，我们先把它作为假设.

这样的假设会使神经网络“表达能力”的概念发生变化. 一般地，我们认为表达能力解决的问题是，给定的网络能否能够产生输入 $$ T $$ 的任意函数. 为此，我们希望网络可以尽量复杂，或者说需要更多神经元和更多层，以产生更复杂的 $$ T $$ 的函数. 现在如果假设 $$ T $$ 是被离散数据源 $$ X $$ 所驱动的，那我们只需要有限的网络. 以图中网络为例，如果 $$ m \geq L $$ ，也就是预处理结果的维度大于输入 $$ X $$ 字母集的大小，那么只要让 $$ w $$ 取合适的值，网络就可以完成预处理的逆过程. 这样，我们就回到了输入取离散值的情况. 在现实中，一方面 $$ X $$ 的字母集会非常的大，另一方面预处理过程中不可避免地包含噪声，因此即便是这样“有限的网络”也会非常的大. 我们不能因此就放弃让老板给换GPU的想法.

好！聊了这么多，我们来做些实验吧.

运行神经网络
这是我们生成数据的方式：

函数Generate2DSamples和之前的实验一样，首先随机选择联合分布 $$ P_{XY} $$ 并依次生成数据样本. MakeLabels和之前一样用于one-hot编码. 这里只是增加了一个随机生成的“预处理”矩阵，用于产生对应于每个 $$ x_i $$ 的 $$ T(x_i) $$. 注意我们保证了xCard > tDim，用图里的记号表示就是 $$ L > m $$ ，否则问题就会成为平凡的.

现在我们把数据 $$ (T(x_i), y_i) $$ 送到神经网络里：

训练这个网络，我们就可以得到权重. 现在就剩检验权重了？

检验权重
我们已经证实了，将离散数据源 $$ X $$ 输入神经网络，训练的结果应该满足

$$ \begin{cases} v^*(y) = {\mathbb E} [S^*(X)|Y=y]\\ S^*(x) = {\mathbb E} [v^*(Y)|X=x] \end{cases} $$

还可以非常漂亮地被解释为矩阵 $$ \tilde{B} $$ 的奇异向量.

现在我们将 $$ X $$ 换为预处理的结果 $$ T(x) $$. 第一个等式应该是一样的：

$$ v(y) = {\mathbb E} [S(T(X)) | Y=y ] $$

第二个等式不再成立，因为我们可能得不到函数 $$ S^*(x) $$. 神经网络的结构限制了特征 $$ S(x) $$ 只能取特定的形式

$$ S(x) = \sigma\left( \sum_{j=1}^m w_j \cdot T_j(x) + d\right) $$

其中 $$ \sigma(\cdot) $$ 是sigmoid函数，各 $$ T_j(\cdot) $$ 的形式是给定的. 直观上，我们可以做的是选择合适的权重 $$ (w_1, \ldots, w_m, d) $$ 是的所生成的 $$ S(x) $$ 在某种意义上尽量“接近”我们想要的 $$ S^*(x) $$.

回顾之前的内容，条件期望可以解释为特征投影. 对于给定的特征 $$ v(y) $$，我们希望找到 $$ x $$ 的特征使其与 $$ v(y) $$ 最吻合. 对应结果就是条件期望 $$ S(x) = {\mathbb E} [v(Y) |X=x] $$. 现在，我们的问题做了一个小的改动. 对于给定特征 $$ v(y) $$，我们希望找到可以由诸 $$ T_j(x) $$ 以特定形式生成的特征，并使得它与 $$ v(y) $$ 最吻合. 这在概念上只是做了一点推广，因此我们称之为“有约束的特征投影”.

要在数值计算层面验证刚才的直觉并不容易，因为这里对 $$ S(x) $$ 的约束是非线性的. 另一个更不明显的困难来自神经网络的偏置项. 这些困难，让我们逐一来处理.

讨厌的偏置
偏置项，即图中的 $$ b_1, \ldots, b_k $$ ，在这里是一个枯燥又碍事的存在.

从特征投影角度来看，神经网络做的是一个特征到另一个特征的线性映射，加减常数显然对结果而言是无关紧要的. 因此我们应该将注意力集中在零均值的特征上. 这里的零均值是相对于边缘分布而言，即 $$ S(x) $$ 在分布 $$ P_X $$ 下、 $$ v(y) $$ 在分布 $$ P_Y $$ 下是零均值的.

为得到零均值的特征，我们引入相应的记号

$$ \begin{align} \tilde{S}(x) &= S(x) - {\mathbb E}[S(X)], \\ \tilde{v}(y) &= v(y) - {\mathbb E}[v(Y)] \end{align} $$

于是特征投影可表达为

$$ \begin{cases} \tilde{S}(x) = {\mathbb E}[\tilde{v}(Y)|X=x]\\ \tilde{v}(y) = {\mathbb E}[\tilde{S}(X)|Y=y] \end{cases} $$

遗憾的是，神经网络并不喜欢这样简单而优雅的形式. （而你还在操心人类会不会被AI取代. ）神经网络的做法是控制这些函数的均值，使得神经元在激活函数特定的工作点附近起作用，以利用激活函数的非线性特性. 因此，神经网络的输出几乎都不是零均值的. 例如，sigmoid函数的输出就总为正，因此不会是零均值的.

这就是在对比网络训练结果与理论结果时，总需要用regulate函数先作归一化的原因. 在神经网络里，偏置节点实际上会对非零均值的特征做补偿. 如果将偏置项 $$ b_1, \ldots, b_k $$ 看作一个函数 $$ b(y) $$ ，它实际上满足

$$ b(y) = \log P_Y(y) - v(y) \cdot {\mathbb E} [S(X)] $$

其中第二项就是用于补偿 $$ S(x) $$ 均值的作用. 在偏置项的作用下，神经元实际输出为 $$ v(y) \cdot S(x) + b(y) = v(y) \cdot \tilde{S}(x) + \log P_Y(y) $$

也就是说，在输出层看来，特征 $$ S(x) $$ 总是零均值的.

这个事实可以很容易通过下面的代码来验证，其中weights是通过model.get_weights函数得到的神经网络权重.



得到的运行结果长这样.

你会发现我们在计算b和b_theory的时候，我们也减去了均值. 这个均值是相对于分布 $$ P_Y $$ 而言的. 因为输出层的Softmax函数也是非线性的，偏置项又出来捣乱了. 是挺讨人厌的！

细心的读者可能发现在第一个实验里，我们构造的偏置项使用了另一个公式

$$ b(y) = \log P_Y(y) - \frac{({\mathbb E}[S|Y=y])^2}{2 \cdot {\rm var}[S]} $$

论述这两个公式的等价性会显得相当乏味，不过道理很简单：表达式形式不同是因为我们用了不同的归一化方式.

本质特性
现在，讨厌的偏置已经被扔到一边，我们来看一下神经网络是怎么做特征投影的. 回顾一下，隐藏层神经元理想的输出为

$$ S^*(x) = {\mathbb E} [ \tilde{v}(Y)| X=x] = {\mathbb E}[v(Y)|X=x] - {\mathbb E}[v(Y)] $$

我们的假设是，神经网络会生成 $$ \tilde{S}(x) = S(x) - {\mathbb E}[S(X)] $$ 来逼近理论解 $$ S^* $$. 神经网络通过选择权重 $$ w_1, \ldots, w_m, d $$ 实际生成的是非零均值的

$$ S^{(w, d)}(x) = \sigma\left( \sum_j w_j T_j(x) + d \right) $$

不过，我们知道均值在下一层会被偏置项补偿，因此并不影响.

我们做个大胆的假设，假设逼近是在均方误差意义下的. 现在，逼近问题可以写成

$$ \min_{w, d} \sum_x P_X(x) \cdot ( S^{(w, d)}(x) - {\mathbb E}[S^{(w, d)}(X)] - S^*(x))^2 $$

或者使用 $$ \tilde{S} $$ 的记号，写成

$$ \min_{w, d} \sum_x P_X(x) \cdot (\tilde{S}^{(w, d)} (x) - S^*(x))^2 $$

现在，我们可以对目标求导了：

$$ \begin{align} 0 &= \frac{\partial}{\partial w_j } \sum_x P_X(x) \cdot (\tilde{S}^{(w, d)} (x) - S^*(x))^2\\ &= \sum_x P_X(x) \cdot (\tilde{S}^{(w, d)} (x) - S^*(x)) \cdot\left( \frac{\partial}{\partial w_j} \tilde{S}^{(w, d)}(x)\right) \end{align} $$

这可以看做是函数 $$ (\tilde{S}^{(w, d)} (x) - S^*(x)) $$ 与函数 $$ \left( \frac{\partial}{\partial w_j} \tilde{S}^{(w, d)}(x)\right)$$ 的正交性，其中内积定义为 $$ P_X $$ 加权后的标准内积. 因为两个函数都可以按比例缩放，我们很难在数值上判断内积是否足够接近0. 因此，我们转而检查这两个函数的夹角是否接近 $$ \pi/2 $$ ，或者说 $$ 90 ^\circ $$.

唯一需要小心的是第二个带导数的函数表达式. 我知道许多人，包括我自己，都还记得 sigmoid函数的导数表达式： $$ \sigma'(z) = \sigma(z) \cdot (1- \sigma(z)) $$. 然而，这里我们需要将导数的均值减去：

$$ \begin{align} \frac{\partial}{\partial w_j} \tilde{S}^{(w, d)}(x) &= \frac{\partial}{\partial w_j} \left[ S^{(w, d)} (x) - \sum_{x'} P_X(x') S^{(w, d)}(x') \right] \end{align} $$

用我们的记号就可以简单地写成 $$ \widetilde{\frac{\partial }{\partial w_j} S^{(w, d)}}(x) $$，也就是零均值版本的导数. 最后，我们将以下结果代入：

$$ \frac{\partial}{\partial w_j} S^{(w, d)} (x) = S^{(w, d)}(x) (1-S^{(w, d)}(x)) \cdot T_j(x) $$

现在我们可以再次准备编程了：

结果如何？这是一组典型的结果：

服不服气?

深度学习的理论
如果你在Google搜索栏中输入“神经网络”，那么“解释”很可能是下一个候选词. 实际上，有很多工作都试图对神经网络的工作机制进行解释，但我还没看到能够对网络学习结果进行定量描述并验证的. 这个意义上，我相信我们已经取得了一些进步.

这里我们没有在理论方面深入，也不指望用这些简单的实例证明什么. 我只希望用这些实验解释关键的想法，以及展示我们的理论在若干特定场景下的应用. 以上可能足够让一些读者有兴趣阅读我们的论文. 在论文里，我们给出了一个更完整的图景. 首先，我们论述了需要一个新的衡量信息的方式. 在设计了这样的度量后，我们可以用它来描述任何数据处理过程中的信息流动情况，包括信息的保留和丢弃过程，并对每个处理过程给出评价. 接着我们表明，之前说的求 $$ \tilde{B} $$ 奇异向量的过程是一个好的信息处理方式——它提取了 $$ X $$ 和 $$ Y $$ 关联中最强的模式，或者说提取了 $$ X $$ 和 $$ Y $$ 的“共同信息”中最为重要的部分. 可能更重要的是，这样选出的特征在我们称为“通用特征选择”的问题中是最优的.

在经典统计学中，当我们需要从数据中选取某些特征以进行推断时，应该选择的是充分统计量. 在大多数学习问题中，当我们面临高维数据样本时，很难精确得知数据的哪些属性对之后的推断有帮助. 例如，单看顾客的消费行为，我们并不清楚哪些消费行为会对之后为顾客推荐产品的过程有影响. 从而，对于尚未明确的新任务，我们无法针对特定任务构建充分统计量. 取而代之的是，我们需要选取一系列的特征，无论新任务依赖于哪个特征，要保证基于这些特征的决策在“通用”意义下是好的. 对这个问题，我们表明奇异向量的选择确实是通用意义下最优的. 也就是说，对任何特征选取问题，只要特征不是用来解决某一个统计模型已知的任务，最明智的选择是选取这样的通用特征. 而神经网络作为解决这类问题的一个工具，正是给出了通用特征的解决方案. 这个结果是前面三个实验的基础.

尤其在深度学习这个领域，我希望能够避免过度强调我们结果的重要性，比如做“打开深度学习黑箱”这样的论述. 陈述结论最好的方式，是给出相应的数学结果. 既然我们没有在这里做这件事，我认为至少要澄清这个理论能做与不能做的事情. 下面就开始吧.

A Performance Metric for Neural Networks
We get a performance metric of neural networks. If we keep the notation that $$ \underline{S}(x) = [S_1(x), \ldots, S_k(x)] $$ is the output of the last hidden layer with $$ k $$ nodes, and $$ \underline{v}(y) = [v_1(y), \ldots, v_k(y)] $$ is the weights on the output layer, our theory says the goal is to make them as highly correlated as possible, i.e. to make $$ {\mathbb E}[ \langle\underline{S}(x), \underline{v}(y)\rangle] $$. The optimal solution is to choose $$ S(x) $$'s and $$ v(y) $$'s from the SVD solutions. However, due to the limited expressive power of the selected network structure, we usually cannot achieve such optimum. The gap is then a good metric of how effecitve our network is.

The H-Scores
For that purpose, we can define a metric we called the "H-Score". For a given network with both $$ S(x) $$ and $$ v(y) $$ computed, keep in mind that a neural network might not put the answers in out favorate coordinate system, but can have rotation, scaling and shift to the solutions, we first write $$ \tilde{S}(x), \tilde{v}(y) \in {\mathbb R}^k $$ as the centralized versions of the features and the weights, with the means subtracted, and then define $$ \Phi = [\phi_1, \ldots, \phi_k], \Psi= [\psi_1, \ldots, \psi_k] $$, with

$$ \begin{align} \phi_i (x) &= \sqrt{P_X(x)} \cdot \tilde{S}(x) \\ \psi_i (y) &= \sqrt{P_Y(y)} \cdot \tilde{v}(y) \end{align} $$

Then the "H-Score" is defined as

$$ \begin{align} H(S, v) &:= \|\tilde{B}\|^2 - \| \tilde{B} - \Psi \Phi^{\mathrm{T}} \|^2\\ &= 2 {\mathbb E}[ \underline{S}^{\mathrm{T}}(X) \underline{v}(Y) ] - {\rm trace} ({\rm cov}(\underline{S}(X)) {\rm cov}(\underline{v}(Y))) \end{align} $$

If we are interested in only to evaluate how good the selected feature $$ S(x) $$ is, we can plug-in the theoretical optimal weights to get the one-sided H-score as

$$ \begin{align} H(S) := H(S, v^*) &= \| \tilde{B} \Phi (\Phi^{\mathrm{T}} \Phi) ^{-\frac{1}{2}}\|^2 \\ &= {\mathbb E}_{P_Y} [ \ {\mathbb E} [\underline{S}(X) |Y=y]^{T} \cdot {\rm cov}(\underline{S}(x))^{-1} \cdot {\mathbb E} [\underline{S}(X) |Y=y]\ ] \end{align} $$

In practice, all of the expectations and covariances above can be replaced by the empirical averages. So the H-Scores can be computed for all the features and weights computed in the network, including the features at the output of intermediate hidden layers, to evaluate how good they are.



To demonstrate the use of the H-Score, we have the following classification experiment for the data as shown. These are the first 2 dimensions of a 6-dimensional dataset, with color-coded classes. The data is generated with a mixture-Gaussian model, and is rather complicated. We need a multi-layer neural network for this task, and we plotted the H-Scores for the outputs at each layer as follows:



What we can observe is that as we run the network with more and more iterations, the H-Score improves; and the H-Scores of the outputs at the later layers is higher. This shows that the more iterations and more layers in the network are actually picking better and better features of the data. Finally, the classification accuracy is also included in the figure to show the correspondence with the H-Scores: higher H-Scores generally mean better performance as expected.

Interested readers might find from the plot that layer-3 might not be doing her job too well, and try to do something about it. The code for this experiment can be downloaded from here.

For a more realistic test, we also evaluated the features selected from different algorithms on the ImageNet dataset, where we listed the H-Scores and the accuracy in the following table to show the correspondence between the H-Score and the accuracy, in both picking the top-1 and the top-5 candidates.



Why Not Log-Loss?
Of course the more commonly used metric in such experiments is the log-loss, which is also called the cross entropy, or the K-L divergence. Here is how the H-Score is related to them and why it is (somewhat) better.

Log-Loss, or cross entropy computes $$ {\rm LL}(S, v)= {\mathbb E}_{P_{XY}} \left[ \log Q_{Y|X}^{(S, v)}(Y|X) \right] $$, where $$ P $$ is the empirical distribution and $$ Q^{(S, v)} $$ is the output of the SoftMax unit interpretted as a conditional distribution. The entire network chooses $$ S $$ and $$ v $$ to maximize this. As the objective of the entire optimization, we of course can use that as a measure of how good the result is. In fact, currently the most important job of the engineer who designed the neural network when it runs is to watch the log-loss value grows, slows down, and converges.

One issue of the Log-Loss is that it is not clear a priori what value we should expect. Should it be positive, negative, in the order of a few hundred, or 10 to power of 6? The actual result depends on the specific dataset and task. This makes it hard to use the log-loss as an indicator of the goodness of the network in an absolute sense.

An alternative is the K-L divergence, which is also called the relative entropy. It computes $$ D(P_{XY} || P_X \cdot Q_{Y|X}^{(S, v)}) = {\mathbb E}_{P_{XY}} \left[ \log \frac{P_{Y|X}(Y|X)}{Q_{Y|X}^{(S, v)}(Y|X)}\right] $$

and tries to minimize it. In terms of the optimization, this is equivalent as the Log-Loss, since the only difference is a term $$ {\mathbb E} [\log P_{Y|X}] $$, which does not depend on $$ (S, v) $$ at all.

A slight advantage of the K-L divergence is that it has an operational meaning: the distance between the two distribution: the actual empirical distribution $$ P $$, and the one generated by the network $$ Q $$. This gives the entire network a nice interpretation: it finds the best approximation to the true joint empirical distribiton $$ P_{XY} $$. Operationally, K-L divergence does have an absolute range: the divergence above always satisfies $$ 0 \leq D(P||Q) \leq \log |{\mathcal Y}|$$. This is a good thing. For example you can claim that for a dataset with $$ |{\mathcal Y}| =8 $$ you can get a K-L divergence of 0.02, it sort of says that you have a pretty good approximation; instead if your K-L divergence is 1.2, then your network is pretty much shooting randomly.

The problem of the K-L divergence is that we often cannot compute it from the data, because we don't know $$ P_{Y|X} $$. In fact, the reason we want to have a good approximation to the true $$ P_{Y|X} $$ is often to have a decent guess of what it looks like. This is where one should understand this difficulty to have a good metric for neural networks, which is like a Marco Polo game: we are chasing this wildly moving target, and it is hard to report where it is and how close we are from it with a single number.

Another issue of the K-L divergence is revealed when we write it in our vector form, with

$$ D(P_{XY} || P_X \cdot Q_{Y|X}^{(S, v)}) \approx \frac{1}{2} \| \tilde{B} - \Psi \Phi^{\mathrm{T}} \|^2 = \frac{1}{2} \| \tilde{B} - \sum_{i=1}^k \psi_i \cdot \phi_i^{\mathrm{T}} \|^2 $$

We are trying to use a rank-k matrix to approximate $$ \tilde{B} $$, but the distance we used here is actually the norm of the entire matrix. That is, even if we have used the optimal rank-k matrix computed from the SVD, the remaining singular values $$ \sigma_{k+1}, \sigma_{k+2}, \ldots $$ are still there in the resulting distance. In general, the K-L divergence is a sum of the contribution from these singular values that we can never reach to and the actual distance between our rank-k solution and the optimal one; and we have no way to separate the two. This is bad particularly when $$ |{\mathcal Y}| $$ is large.

This is the point that we can understand why H-Score is nice:

$$ H(S, v) := \|\tilde{B}\|^2 - \| \tilde{B} - \Psi \Phi^{\mathrm{T}} \|^2 $$

That is, we subtracted from the K-L divergence $$ \|\tilde{B}\|^2 $$, which is the part of the K-L divergence that is not computable from the data samples. With that, we also dropped the contributions of the extra singular values. To see that, suppose $$ \Psi \Phi^{\mathrm{T}} $$ is precisely the rank-k approximation of $$ \tilde{B} $$ from the SVD, the resulting H-Score is then the sum of the squared top-k singular values, with all other singular values cancelled.

The following sequence of inequalities can be very useful:

$$

H(S, v) \leq H(S) \leq \sum_{i=1}^k \sigma_i^2 \leq k

$$

where k is the dimensionality of the selected feature function $$ S(x) $$.

By definition, the first gap between $$ H(S, v) $$ and $$ H(S) $$ indicates how far is the weights $$ v(y) $$ from the optimal $$ v^*(y) $$. For an intermediate layer of the deep neural network, we can imagine of taking the output of this layer and immediately have a fully connected SoftMax output layer, and $$ v^* $$ is the weights on this layer. Thus, this gap is often a good measure of how well the network compuation has converged to its limit.

The second gap measures how far is the selected features $$ S(x) $$ from the optimal SVD solutions. If the network has converged well, the only reason that we cannot select this optimal feature is due to the limited expressive power of the network. Thus, this gap is a good measure of how good our network structure is.

The third gap measure how good our dataset is. That is, how much information a k-dimensional approximation of the dependence between $$ X $$ and $$ Y $$ can capture. The result is convienently normalized to have an absolute upper bound of k. For example, in a good solution of the MNIST problem, $$ H(S) $$ can be about 8.1, where $$ k =9 $$ corresponding to 9 dimensions in distinguishing 10 hand-written letters. Thus we can conclude from this that the dataset is actually really good, and the selected features are very close to the optimal; and hence the classification results can be expected to be very precise.

The Limitations
This is what we can do with the H-Score. Now here is what we cannot. Basically there are ways where the H-Scores are not accurate measure of the performance. A design with a lower H-Score can actually do better. This can happen for multiple reasons.

First, as stated, H-Score measure how good the selected features are in the universal sense. That is, how useful the features are averaged over all possible queries. This universal often cannot be as good as the custom-made solution for a specific task. We argue that if we don't know the task, then the universal choice is the only senisble choice. In practice, however, it can be the case that we are actually interested in just one specific problem, or the problem space is actually quite narrow; and we are allowed to do some trial-and-error experiments. What such trial and error can gives us is the choice of feature functions that are actually tuned to this specific task, even though such tunning happens in a rather implicit way. Although we would like to claim that our universal solution is a more noble solution, we cannot deny that this trial and error approach does have its value in practice.

The second problem can be seen from our ImageNet solution table. Sometimes a solution with higher H-Score can have worse performance, such as VGG16 and VGG19. One reason for this these solutions are significantly more complex than the others, with much more parameters. All of our results are derived with the assumption that the statistical models are quite precisely and stably reflected from the models. The generalization error from overfitting is not captured.

The third problem of the H-Score, perhaps the most important one, is that it is based on a local approaximation. This is explained in much more details in our paper. The short statement is that the approximation allows us to focus on a particular local optima. If we insist to do the math without this approximation, the solutions would be much more complicated, less clean, harder to generalize, and sometimes numerically less stable. The lack of stability is one servere problem of deep neural networks, which is the nightmare to all engineers working in this area. Unfortunately, our theory does not help with that. The local assumption helped us to avoid this entire issue from the outstart. This is a deliberate choice, and perhaps the main reason that we could have a clean story like this. In optimization, brave people do look for better ways to find the global optima for non-convex problems, but it is hard to imagine the result can be as general and as simple as those on local optima, which is what we are trying to find for the neural network problem.

Interpretability
Interpretability is one important issue for neural networks. Exactly what is learned by this complex structure? Those selected features, what are they? We should expect that our results can shed some lights to this. We have an mathematical expression for the output of each hidden node and the weight of each edge. We know what the network tries to compute and where it stores these results. That must be a good thing.

One obvious advantage is that we now have guidance for transfer learning and multi-task learning. Instead of using a large deep neural network as a blackbox, we can now name the intermediate results, which helps us to use such results in a different task. We have some practice on this, and will report it in another page.

Now does this mean that we can interpret the meanings of the selected features? Not really. Perhaps even worse, it gives a reason why interpretability is something we probably should not expect. What our theory says is that in general these features selected by neual networks are the solution to a number of optimization problems: they carry the most information, they are the most distinctive features, they are universally good for unknown inference tasks, etc. But they are not necessarily interpretable. Meaning they might not correspond to a simple and compact term that human are familiar to.

Think of a close friend of yours. The first thing that comes to your mind must be a general impression of this person as a whole, probably not the age, gender, ID number, or anything else you can find on a customs form. People invent a number of tags to catergorize items in the world. The question of why these tags are chosen as they are is far beyond the scope of engineering. All we can say is that they may not be aligned with the features we choose from data. Often these features that can best distinguish data samples are combinations of many human-chosen tags in specific ways. In principle one can learn these combinations if there is a dataset labeled by some tags, and thus translate the data features into terms that we are more familiar with. We view this a learning problem separated from that of selecting features from the data.

Bob finally found his soulmate since her &xi; value is really high, and &xi; = 0.0122 &times; haircolor + 0.0031 &times; athletic + 0.0041 &times; cooking-skills +0.0201 &times; laugh-on-old-jokes + 0.0311 &times; prefer-python-to-matlab + ...

Yeah! You guessed it. Bob is a software engineer.

This page is made with the help of Xiangxiang Xu. He looks like this.

其他语言: English