张量(Tensor)的技术以及它在不同场景中的应用


摘要

本文主要介绍张量(Tensor)相关技术以及张量在数据恢复(missing data)、推荐中的应用。在文章的最后,简单介绍怎么通过ADMM算法吧把张量应用在大规模数据上。文章的内容来自于葛瀚骋博士、现任美国亚马逊资深科学家。




我们现在所处的时代是一个信息爆炸的时代,许多现代的信息系统,比如物联网,电子健康记录,以及社交网络,每天都在不断产生着新的数据,这些数据是以指数级的方式去增长的。它的特点包括数量庞大、维度较多、而且这些数据的来源也是“多方面”的。那么我们怎么样去理解“多方面”这个词呢?


这里举一个非常简单的例子,我们可以看到下图这三人大家应该都比较熟悉。他们三人日常会通过不同的方式去联系,比如推特、facebook、微信以及电话。但是因为众所周知的原因,推特以及facebook在某些国家是没法使用的,微信在某些国家是特别受欢迎的。所以,这些因素会导致联系方式上的多样性。

这种多方面的社交关系,可以用多个矩阵来表达。在上述情况下,我们需要四个矩阵来刻画上面所提到的关系,每一个矩阵代表某种特定联系方式下的人物之间关系,比如用一个矩阵来表示基于推特的关系,用另一个矩阵来表示基于微信的关系等等。这种多方面的关系网络存在于我们生活中的点点滴滴。



一、什么是张量(Tensor)?


张量这个词英文叫Tensor。很多人有可能觉得比较陌生,但相信大部分人都听说过Tensorflow。其实Tensorflow里最基本的数据结构就是Tensor,跟本文讲的Tensor的概念是一样的,并不是物理学中的张量概念。 


那具体什么是张量呢,张量是多维数组的泛概念。一维数组我们通常称之为向量,二维数组我们通常称之为矩阵,但其实这些都是张量的一种。以此类推,我们也会有三维张量、四维张量以及五维张量。那么零维张量是什么呢?其实零维张量就是一个数。


为了加深大家对张量概念的理解,再举一个简单例子。如用户对电影的评分可以用来一个二维矩阵来表示。但是如果我们把时间因素也考虑进去,就变成了一个三维数组,那么我们就称这一数组是一个三维张量。其实在某些方面,张量和多维度数据是对等的。张量非常适合去表示多维度的数据,张量通过多维度的数据,可将用户间的内在联系捕捉到。


张量通常是动态增长的,它的增长通常可以用三种形式来实现。


第一种是维度的增长。比如我们只考虑用户时间、电影和评分来进行张量建模,那么这个张量只有三个维度。但如果我们再把电影主题也加进去,那么就从一个三维张量增长成了四维张量,这是通过维度上的增长,


第二种增长是维度中数据的增长,如现在我们有用户、时间和电影这三个维度,但是还会有新的用户,也会有新的电影,时间也是逐渐增长的,所以每个维度也会自然增长,但是维数始终是固定的,这就是第二种增长。


最后一种增长是观测数据的增长,比如说维度的个数是固定的,三个维度——用户、时间、电影。那么每个维度上的数量也是固定的,但是呢,我们可能一开始只获取了部分数据,然后后面会获取越来越多的数据。这样就形成了一种观测数据的增长,所以这也是一种张量的增长方式。

下面我们介绍张量的基本操作。首先如何计算两个张量的内积?其实就是把他们相对应维度的元素相乘,然后把相乘后元素相加,这就是两个张量的内积。张量的每一维度都可以被展成一个相应的矩阵。一个三维的、3×4×2的张量可以被展成对应的三个矩阵(如下图所示)。 

接下来介绍另一个重要的操作--张量乘以矩阵。因为很多时候我们都需要用一个张量去乘一个矩阵。比如,我们有一个三维张量,它的大小是3×4×2,我们还有一个矩阵,它的大小是2×5。那么我们用这一张量去乘以这一矩阵,最后得到的也是一个张量,它的大小就是3×4×5。


对于张量,我们可以定义两种不同的积,一个叫Kronecker(克罗内克)积,另一个叫Khatri-Rao积。这两个积跟张量分解息息相关。需要注意的是Khatri-Rao积是基于Kronecker积的扩展。如果大家对于这两种积的运算不太熟悉,建议大家可以在网上查询相关资料,网络有大量关于这两种积的介绍。


下面来谈一下张量的分解。谈张量分解之前,我们先回忆一下矩阵分解。下面的图表示如何做矩阵的SVD分解。SVD分解是矩阵分解的一种形式,一个矩阵A可分解成三个矩阵(如下图所示),U和V都是正交矩阵,S是一个对角矩阵。和矩阵分解相似,张量其实也是可以被分解的。


张量分解通常是从数据中提取一个低秩(low rank)的结构。具体来说,就是把张量分解成一堆rank为1的张量的和。我们可以看下面的图,这张图里揭示了两种张量分解的方式,一种叫tucker,一种叫cp。张量x,可以被分解成矩阵a、b、c 以及一个张量叫g。这种分解形式跟矩阵的分解非常像。该张量是三维的,其每一维都会分解成一个矩阵。对应的分别是abc,那么中间那个对角矩阵也会变成一个三维的对角张量。


另外一种方式为cp,cp是由秩为1的张量来组成的,这个秩为1的张量,是由三个向量相乘所得到的。R我们通常就称为是这个张量的秩。


除了张量分解之外,还有另外一个概念叫张量补全。张量补全的目标是用一个低秩的模型来恢复丢失的数据。通过下图的两个公式,我们可以看到,其实张量分解和张量补全只有一个微小的差别,就是张量补全会多出一个告诉张量哪个位置是我们观测到的数据,而剩下的就是我们没有观测到的数据。在具体的方法中,张量分解在每次迭代中,是不需要估计丢失信息的。而张量补全在每次迭代中是需要估计丢失信息的。




二、张量在时空数据恢复的应用


众所周知,手机已经成为了我们不可或缺的生活工具,每时每刻通过手机在互联网上产生了大量的动态信息,这些动态信息一般分为以下几个维度——时间、位置、内容,这些动态信息本身很有价值,比如谁产生了这些信息,在哪里产生了这些信息,什么时候产生了这些信息,以及这些信息是关于什么事件等。


但是因为各种限制,如访问权限的限制,我们往往不能获取到全部的信息,也就是说我们在获取信息的时候,同时也会发生信息的丢失,比如,我们只能获取到新浪微博中很少一部分的数据,那么我们在基于这些极为有限的信息,来作出社交网络结构特点的估计时,其结果往往是不准确的。


所以如何去恢复这些丢失的信息,对于某些应用来说,是一件非常重要的事情。


接下来我们拿主题标签(Hashtags)举一个例子。主题标签指的是(以微博为例)我们在发微博的时候,会带一个#,后面会跟一个跟你发的信息相关的一个主题,每一个主题标签在发出去的时候都会统计到当时所发信息的时间、地理位置,以及主题内容信息,这三个维度信息就可以被一个三维张量去表示。


我们通常所获取的主题标签信息是不完整的,我们的目标是学习一个模型,使得我们没有观测到的数据,

  • 8
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PyTorch 和 Keras 都提供了张量tensor)作为多维数组的数据类型,但它们之间有一些不同: 1. **计算图的构建方式不同** PyTorch 使用动态计算图(Dynamic Computational Graph),即在每次计算时动态地构建计算图,这使得模型的结构比较灵活,可以在运行时根据需要修改计算图。而 Keras 使用静态计算图(Static Computational Graph),即在编译模型时就构建好计算图,这使得模型的结构比较固定,无法在运行时修改计算图。 2. **张量的默认数据类型不同** 在 PyTorch 张量的默认数据类型是浮点型(`torch.FloatTensor`),而在 Keras 张量的默认数据类型是 32 位浮点型(`float32`)。 3. **张量的索引方式不同** 在 PyTorch 张量的索引方式类似于 NumPy,可以使用整数、切片、布尔型数组等方式进行索引,也可以使用 `torch.gather`、`torch.masked_select` 等函数进行高级索引。而在 Keras 张量的索引方式较为简单,只能使用整数或切片进行索引。 4. **部分函数的实现不同** PyTorch 和 Keras 都提供了丰富的张量操作函数,但有些函数的实现方式略有不同,例如 `torch.cat` 和 `keras.layers.concatenate` 函数在拼接张量时的默认拼接维度不同,`torch.matmul` 和 `keras.backend.dot` 函数在矩阵乘法时的维度顺序不同等等。 总的来说,PyTorch 和 Keras 都是非常强大的深度学习框架,它们之间的异同也使得它们更适合不同应用场景和个人喜好。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值