机器学习中表征问题里的各种 trade-off

感觉写表征这个东西实在有点落伍了,不知为何近来又被大伙翻出来炒,不过问题倒是非常重要,我冥冥中感觉是通向世界模型必须要解决的一个难题。

表征通常是寻找高维样本的一组低维矢量表示 z=f(x),在学术界和工业界都是非常受欢迎的方向。其一,表征能够把复杂的数据类型压缩到小小的矢量空间里面,对于托管和保存,检索,查重等都十分方便。其二,对于偏轻快战线的下游任务,好的表征往往能够不费吹灰之力把性能提上去,让“重”的运算过程,比如各种复杂的神经网络,和“轻”过程,比如 online 的很多实时算法,有效分离开,提供快速迭代的可能性。特别是各大互联网强调中台化建设以后,中台技术支持人员其实很难知道业务的痛点,给业务提供复杂的下游模型算法,还不如沉淀好基础模型,整合训练 pipline,有效输出特征去奶四方。

一般来说,好的特征需(希)要(望)如下几点性质:

  1. 因子化的解释性(disentanglement & hierarchical 等性质):这个不是太好翻译,也就是说,z 的每个分量,或者某些分量的组合具有解释性,比如某个分量位置表示光照,另外的分量表征旋转,还能够展现不同层次的抽象概念等,举个例子,我能够修改 z 某个分量的值,把年轻人变成老人,那么这个分量就是年龄的抽象。
  2. 一定程度的通用性:最理想的情况是,我能够把输入信息,有效压缩到低维的 z 空间里头,能够保证绝大多数下游任务得到有效支持,拿到哪里都能用得上,不至于太差,至少不会比单独跑一个 end-to-end 任务差太多。
  3. 下游任务复杂度:这个性质似乎很少被人鸟,简单来说,比如我做分类,我有一个好的表征,按道理来讲,只要再套一层神经网络就能够实现很好的分类效果,多加几层不会产生实质性差异,这时候的给表征做的外挂网络,复杂度就是可控的,如果套好几层还能狂提性能,这表征的表达能力严重存疑。

首先要说的是,从应用角度来讲,目前很多表征都是靠有监督方案学习出来的,虽然理论巴拉巴拉很多,其实吓人成分也很多,不影响应用。

不过,只要我们还希望从无监督方式去获取表征,通用性,解释性和 trade-off 等问题就变得尤其重要。

表征获取整体套路

表征获取套路搞来搞去,训练套路十分固定了,最基本的就是做一个比较基础的任务,比如分类问题。对于没有标注,但是数据海了去的问题,差不多都是 VAE 的一套方式。

不论有监督还是无监督抽取表征,首先都要构建表征 z 的模型 z\sim q_{\theta}(z|x) ,我们把它广义理解成为 encoder 吧。然后,利用表征去实现某个任务 p_{{\phi}}(y|z) ,广义理解为 decoder。任务可以是无监督的(比如 VAE,此时 y = x ),也可以是有监督问题(分类等),也可以是 NLP 的 cloze 类型任务。

从目前巨量表征 paper 的综述来看(引文),不论无监督还是有监督表征方案,获取表征的 loss 基本可以被统一拆分为如下形式 :

L=\mathbf{distortion} + \mathbf{rate} + \mathbf{metapriori} \\

其中:

  1. distortion: 表示任务的 loss,放到 VAE 里头就是重构误差,就是通过给定的 z 去重构 y 带来的损失,distortion 越小表示任务效果越好。
  2. rate: 表示 encoder 的信息压缩能力,rate 越大,压缩越强。形象点理解,我们有 10 个苹果(x) ,10 个抽屉(z),encoder 结果把 10 个苹果全都放到其中 3 个抽屉里头,此时,按照抽屉原理,一些 z 需要承担保存多个 x 的信息,压缩能力强,此时 rate 就很大。反之,每个抽屉都放一个,每个 z 只需要负责记住一个样本的信息就够,几乎没压缩,rate 就越小。
  3. meta-priori:各种人为强制规定 z 应该满足何种性质的正规项,用来控制解释性,想来多少来多少那种,主要灌水入手点。

掌握了套路就可以去灌水,举一些例子,比如我拍脑袋造一个 supervised-beta-VAE 去灌水(如有巧合,纯属。。),可以这么搞:

\begin{equation} L(\theta, \phi) = \mathbb{E}_{(x, y)} [ -\underbrace{\mathbb{E}_{q_{\theta}(z|x)} \ln p_{\phi}(y|z)}_{distortion} + \beta \underbrace{D_{KL}(q_{\theta}(z|x) \| m(z))}_{rate}+ \underbrace{M_1 +  ...}_{meta-priori} ] \end{equation}


表征里面各种 trade-off

很不幸,按照目前表征的进展来看,同时实现这些性质,大概率是一个鱼和熊掌的问题,也就是说,你不指望拿到因子化解释性好的表征,同时拿到好的下游性能,和低的下游复杂度,trade-off 非常多,我简单说几个我知道的。

encoder 复杂度和 decoder 复杂度有 trade-off:比如说, decoder 模型 p(y|z) 有可能太复杂太强力,随便给定的 z 分布都能拟合到 y 上去, encoder 几乎随便 tune 都行。特别是无监督任务,导致我不需要“好”的表征,甚至随机初始化表征都能完成,此时表征容纳的有效信息是存疑的(引文)。这种 trade-off 带来一个 bug,就是下游赋能力强的表征是和 decoder 模型有很强的依赖,却跟生下它的“妈妈”(encoder)的能力没啥关系,这十分无语。

性能和压缩能力的 trade-off :这个直观上倒是挺好理解的,压缩会丢信息,必然会掉性能。但也不是特别好理解,压缩会丢失无用信息,性能也应该增加才行。数学上描述这种薛定谔的理解,就是表征的 loss 里面包含 distortion (D)和 rate (R)两项,这两项放到一起优化,就是希望性能提高时,尽可能减少信息丢失,然而,数学上并不允许这个要求同时达到,它们有一个你大我小的关系(引文)。

D-R 的这种关系构成一个 phase-diagram,如下图,这个“好”的位置,处在 phase-diagram 里头一个小小区间。当然,这个只是信息论的直接结果,并不能够指出在 realizable 区间里头,transfer 时候的性能。问题是,我们拿捏不好这个 D-R 的度。

复杂度和因子化解释性的 trade-off :因子化解释性( explanatory factors 或者 disentanglement representation,我实在不知道咋翻译比较好),这个目前还没有见过合理的数学定义,一般思路都是假设 z 的每个分量几乎是独立的 q(z) = q(z_1) \times q(z_2) ... ,并强行惩罚分量的相关性(引文非常多,只列举一个,其它大同小异)。

这种思考模式倒是挺符合机器学习界一贯做事风格的(逃),傻大粗特别好懂,但是没人想过数学上的 bug,这种定义,会出现一个复杂度和解释性上的一个 trade-off(引文)。

一般来说,我们直觉上,一个拥有好的解释性表征,按道理来说,应该只需要很轻的下游模型,就能调到比较好的效果,迁移能力非常强才对,然而并非如此。

我举一个例子,比如我有 z=(z_1, z_2) 两个分量,分别表示(年龄,性别)。假设 z 经过 decoder 两层网络后效果达到最佳。但是,经过网络的一层后,表征做了变换 f(z_1, z_2) = (z^*_1, z^*_2) 。数学上,我们知道 dz^*_i / dz_j \neq 0 ,也就是说,下一层的输出的表征 z^* 会有年龄和性别的混合,没有良好的解释性,但是这个没有解释性的表征只需要经过一层网络,就能达到有解释性,但是却要经过两层网络处理的 z 一样的效果,反过来说,有解释性需要更加复杂的 decoder,没解释性反而只需要简单的 decoder,解释性成了性能的累赘。

其实,这是解释性定义带来的,独立分量本身并不能够完全实现因子化解释性。要解决这个问题,需要更加高阶段位的定义:群表示理论,参见(引文)的思路定义(这文章其实没啥干货,我只是没想到老早的想法,居然还真有人去杀入了):

数学上,因子化解释性可以用群表示的直和分解,假设样本存在多个“factor”变换: [g_1, g_2, g_3] ,比如,分别表示:旋转,平移,年龄变化等,每个因子“直乘”作用到样本上 (g_1 \times g_2 \times g_3) \cdot x = g \cdot x ,表示一个同时接受旋转,平移且年龄发生变化的样本。我们考察一个确定性的表征: z=f_{\theta}(x) ,如果满足: g\cdot z = f_{\theta}(g\cdot x) ,也即满足对易关系: [f_{\theta}, g]=0。满足这个条件,我们可以寻找到直乘表示,把 g \cdot z 分解成如下形式: g \cdot z=(g_1 \cdot z_1, g_2 \cdot z_2, g_3 \cdot z_3) ,每个 subspace z_i 就是我们要找的 disentanglement 表征。

重要的是,对易关系,这个是潜在解决解释性和下游模型复杂度的一个可能武器,数学上来非常粗糙来讲(细讲太多公式了,知道的人估计能感受出来),假设 decoder 是三层网络组成: d_{\phi} = d_3d_2d_1 ,每层变换都和 g 对易: [d_i, g]=0 ,那么可以得到 g\cdot z^*_2=d_2 \cdot d_1 \cdot f(g\cdot x)g \cdot z^*_1=d_1\cdot f_{\theta}(g \cdot x)z^*_1z^*_2 都能够有直和分解,都有明确的解释性。换句话说,无论 decoder 多复杂,表征的解释性能够被继承下去,而且本质没任何变化,套几层都不增加额外的性能改变。

可惜的是,这个定义看起来好看,却只能做线性的,非线性和 pooling 等降维操作都会导致对易关系破坏 [f_{\theta}, g] \neq 0 ,所以,一个对易关系的破坏程度(对称破坏程度),成为解释性可继承性以及通用表征的一个思考落脚点,其实,物理界一些做量子场论的朋友转行做机器学习时候,很早和我提到这一点,可惜我老想着赚钱活命,他们老想着能不能找到工作,目前停留在说说而已。

物理专业的学生如何看待机器学习和大数据这些方向呢? - 纳米酱的回答 - 知乎

写这篇小短文,就是希望这条路最后是对的吧,毕竟还真有大佬乐意去尝试了,真的走通了,说明还是要多多学点物理和数学的,别老是做傻大粗拼手速无脑调参的活,虽然深度学习时代 idea 都很廉价,做 work 才是王道,但是 follow 一个模式不动弹,究竟也不行。

编辑于 2019-06-12