嵌入层(Embedding Layer)对非稀疏数据(Dense Data)处理

原载于知乎上我的一个自问自答

Tensorflow中提供了embedding layer的实现,但是都是针对稀疏数据处理,比如one-hot编码、电影推荐等数据,在其API的实现中也是对数据做了稀疏限制。

按照我的理解,embedding layer其实就是一个转换矩阵,把高维数据映射到低维上,在训练过程中,这层跟神经网络中其他层一样,参数被训练出来。有这一层和没有这一层在数学上应该是等价的(吧?),添加这一层让整个网络结构更加清晰,显式地把这一块的功能定义为降维处理,并且可以得到低维的坐标,可以用于后续的可视化或者相似度分析等等。

所以我的问题就是:

  1. 我理解的是不是准确?
  2. 如果准确的话,为什么不能应用在dense data上面,比如音频之类的时序数据,或者说为什么tensorflow的embedding layer的默认实现限制在稀疏数据?
  3. MDS、PCA、流形学习(manifold learning)和度量学习这些都是embedding的一些技术,这些技术跟使用TensorFlow的embedding layer相比就复杂多了,看起来不那么自动。他们最后的结果形式都是一个映射矩阵,优化的目标也都是为了降维后整体学习目标的优化而服务的,那么使用这些更复杂的“半自动”技术跟单纯使用embedding layer有什么优劣?特别是针对TensorFlow的embedding layer所限制的dense data上面。

我来自问自答一下,embedding layer作为降维处理的一种方式,同其他降维处理一样,本质是一个转换矩阵,将高维数据转换成低维数据进行后续处理。

one-hot形式的稀疏数据,比如字符、推荐标记等,其信息存储是高度稀疏的,所以可以以较低维的非稀疏形式比较好地表示,使用自动化的学习的方式就可以得到比较好的结果。而其他非稀疏的高维数据,本身信息存储就是稠密的,降维会引起信息的丢失,引入专家知识,比如流形理论,对降维过程中保持我们感兴趣的信息不被丢失,有比较大的帮助。

同时,值得注意的是,对于word embedding这类降维,一般是在较大的训练集上对embedding进行训练,然后将训练好embedding layer再应用于其他学习任务,这样在新的学习任务上就有比较好的泛化结果。

举个例子,比如我们进行情感判断的学习,由于训练集数据较小,对于“I feel exhilarated”这个句子,exhilarated是一个生词,并没有出现在训练集中,训练集中只有happy、good这类常见单词。但是由于我们先行在一个较大的训练集上对 word embedding进行了训练,这个embedding layer就会较大的概率将exhilarated和happy、good这类词降维到相近的向量空间,所以即使在训练集没有出现exhilarated,我们仍能判断此时的情感跟“I feel good”是相近的。

至于TensorFlow中的embedding layer应该是三个作用,一是数据的可视化,二是结构清晰、方便训练embedding layer,三是将训练好的embedding layer的权重load进来,用于其他学习任务。


2019年1月3日更新

本答案已经由南京大学计算机系张建兵老师及冯霁博士审阅,感谢二位老师!

以下是冯博士的补充:

目前各个lib对嵌入层的实现是用了一个字典结构(源于word2vec那篇文章),一个one hot对应一个embedding. 如果输入是dense的话,无法用,也不需要用embedding layer 直接用线性层即可。

Leave a Reply

Your email address will not be published. Required fields are marked *