小言_互联网的博客

TensorFlow的名字来源?矩阵与张量的区别?

300人阅读  评论(0)

TensorFlow为啥叫TensorFlow?什么是Tensor?它和矩阵有什么区别和联系?为什么不能叫MatrixFlow?

一、什么是Tensor?

数学家眼中的Tensor和物理学家眼中的Tensor实在是把我看懵了,接下来就看看没有复杂公式版的,且用于非数学及物理方面的Tensor,或许以后有机会再做一篇Tensor的详细数学定义和解释。

Tensor指张量,是对矢量和矩阵向潜在的更高维度的泛化。

张量通常被认为是一个广义矩阵。也就是说,它可以是如下的具体形式:

标量(0维tensor)

向量(1维tensor)

矩阵(2维tensor)

张量(3+维tensor)

二、矩阵和张量的区别是什么?

矩阵是一个由中括号括起来n x m的网格,可以加上和减去一个相同维数的矩阵,也可以乘以另一个矩阵(A,B矩阵相乘,需满足A的列数与B的行数相等),一个向量也是一个只有一行或一列的矩阵。

总而言之:一个矩阵就是一个二维的数字网格。

张量通常指的是一个广义的矩阵,它可以是一维的(向量),可以是三维的(类似于一个数字的立方体),甚至可以是0维的(一个数字),或者是一个难以可视化的高维结构。张量的维数被称为秩。

但是这个描述忽略了一个张量最重要的性质:张量是一个数学实体,它存在于一个结构中,并与其他数学实体相互作用。在此过程中,张量必须服从一个相关的变换规则。

这种“动态”的性质是区分它与矩阵的一个关键特征,如果把它看作一个团队中的成员,那么当引入一个影响所有成员的转换时,他的数值会随着队友的数值变化而变化。

任何一个秩为2的张量(tensor)可以被表示为一个矩阵,但并不是所有的矩阵都是一个秩为2的张量。一个张量矩阵中的数值还取决于它所在的系统中应用了什么变换规则。

举一个例子

上述的表述已经说清楚了张量和矩阵的区别,但没有例子总是不生动的,所以下面来举一个深度学习方面的例子来进一步阐述。

假如我们的神经网络中有一个隐含层,包括了3个节点,原始数据流入它们以后经过了相应的ReLU函数,输出的向量如下:

接下来另一个隐含层又有3个节点,来自第一层的3个节点中的每个节点都有一个与它的输入相关的权重,该权重与接下来的3个节点相关联。那么,把这些权值写成一个3×3的矩阵就很方便了。假设我们已经多次更新网络并得到了权值(在本例中是半随机选择的),

在上述权重矩阵中,每一行中的数字最终会作用于下一层的同一个节点,每一列的数字来自前一层的同一个节点。如下图所示:

注意下图中权重的数据走向和来源:

如上所展示的一样,目前为止,我们看到的都是一些简单的矩阵和向量的运算。

BUT!

假设我想对每个神经元使用自定义激活函数。一种简单的方法是将每个ReLU函数从第一层分别重新缩放。在这个例子中,假设我将第一个节点向上伸缩2倍,不影响第二个节点,将第三个节点向下伸缩1/5。这将改变这些函数的图形如下图所示:

这种修改的效果是将第一层输出的值分别修改为2、1和1/5的因数。这等价于将L1乘以矩阵A:

现在,如果这些新的值通过原始的权值网络,我们得到完全不同的输出值,如图所示:

如果神经网络以前正常运作,我们现在已经破坏了它。我们必须重新进行训练以获得正确的权重。

我们接下来将会怎么做呢?

第一个节点的值是以前的两倍。如果我们把它所有的输出权重都减去1/2,它对下一层的净贡献是不变的。我们没有对第二个节点做任何操作,所以我们可以不考虑它的权重。最后,我们需要将最后一组权重乘以5来补偿该节点上的1/5因子。这在数学上等价于使用一组新的权值,我们用原权值矩阵乘以A的逆矩阵得到:

如果我们将第一层修改后的输出与修改后的权值结合起来,我们最终会得到正确的值到达第二层:

回顾一下:当我们把节点的输入、输出和权值看作固定的量时,我们称它们为向量和矩阵,然后就完成了。

但是一旦我们开始变换其中一个向量,用常规的方式转换它,我们必须通过用相反的方式转换权值来进行补偿。这个附加的、完整的结构把单纯的数字矩阵提升到一个真正的张量对象。

事实上,我们可以进一步描述它的张量性质。如果我们称对节点所做的改变为协变(即随节点变化并乘以A),那么权重就是一个逆变张量(根据节点变化,具体地说,乘以A的倒数而不是A本身)。一个张量可以在一个维度上是协变的,在另一个维度上是逆变的

拿第一层的第一个节点而言,刚开始损失了1/2(协变),我们就得给权重矩阵补偿2倍(逆变),这样最终的结果和刚开始的结果相同。

这就是张量和矩阵的区别。也是为什么不能使用MatrixFlow的原因。

三、什么是Flow?

在TensorFlow中,使用图 (graph) 来表示计算任务。其实TensorFlow默认会给我们一张空白的,一般我们会叫这个为”数据流图“。数据流图由有向边和节点组成,在使用TensorFlow的时候我们会在图中创建各种的节点,而Tensor会在这些节点中流通。所以,就叫做TensorFlow。

我们来看看官方的给出数据流图的gif,加深下印象。

  • TensorFlow使用数据流图来表示计算任务
  • TensorFlow使用Tensor来表示数据,Tensor在数据流图中流动。
  • 在TensorFlow中”创建节点、运算“等行为统称为op


参考链接:

https://medium.com/@quantumsteinke/whats-the-difference-between-a-matrix-and-a-tensor-4505fbdc576c

张量的直观解释:https://www.youtube.com/watch?v=CliW7kSxxWU

什么是TensorFlow - Java3y的文章 - 知乎
https://zhuanlan.zhihu.com/p/59077525


转载:https://blog.csdn.net/qq_33414271/article/details/102503999
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场