页面树结构

2017-11-09 ApacheCN 开源组织,第二期邀请成员活动,一起走的更远 : http://www.apachecn.org/member/209.html


MachineLearning 优酷地址 : http://i.youku.com/apachecn

转至元数据结尾
转至元数据起始

本文档介绍了XLA中广播语义的工作原理。

什么是广播?

广播是使具有不同形状的阵列具有用于算术运算的兼容形状的过程。这个术语是从Numpy (广播)借来的 。

可能需要对不同等级的多维阵列之间或具有不同但兼容形状的多维阵列之间的操作进行广播。考虑加法X+v,其中X是矩阵(等级2的数组),并且v是向量(等级1的数组)。为了执行元素加法,XLA需要通过复制一定次数将矢量“广播” v到与矩阵相同的等级。矢量的长度必须匹配矩阵的至少一个维度。X v 

例如:

|1 2 3| + |7 8 9|
|4 5 6|
矩阵的维数为(2,3),向量为(3)。向量通过在行上复制得到:
|1 2 3| + |7 8 9| = |8  10 12|
|4 5 6|   |7 8 9|   |11 13 15|
在Numpy,这被称为广播 。

原则

XLA是一种具有XLA语言的低级基础架构,尽可能严格和明确,避免了隐含和“神奇”的功能,可能会使一些计算稍微更容易定义,代价将更多的假设放在用户代码中长期难以改变。如果需要,可以在客户端级别的包装器中添加隐含和神奇的功能。

关于广播,需要对不同等级阵列之间的操作的明确的广播规范。这与Numpy不同,Numpy尽可能推荐规格。

将较低等级的阵列广播到更高等级的阵列上

标尺可以随时在数组上广播,而不需要明确规定广播尺寸。标量和数组之间的元素二进制运算意味着应用数组中每个元素的标量运算。例如,向矩阵添加标量意味着产生每个元素是标量与相应的输入矩阵元素之和的矩阵。

|1 2 3| + 7 = |8  9  10|
|4 5 6|       |11 12 13|
可以通过在二进制操作上使用维度的元组来捕获大多数广播需求。当操作的输入具有不同的等级时,该广播元组指定与较低等级阵列匹配的高级阵列中的哪个维度。  

考虑上一个例子,而不是向(2,3)矩阵添加标量,将尺寸(3)的向量添加到维度矩阵(2,3)。没有指定广播,此操作无效。要正确地请求矩阵向量加法,请将广播维度指定为(1),表示向量的维度与矩阵的维度1匹配。在2D中,如果将维度0视为行和维度1作为列,则这意味着向量的每个元素将成为与矩阵中行数匹配的大小的列:

|7 8 9| ==> |7 8 9|
            |7 8 9|
作为一个更复杂的例子,考虑将3元素向量(维(3))添加到3×3矩阵(维(3,3))中。这个例子有两种方式可以播放:

(1)可以使用1的广播尺寸。每个向量元素变成一个列,并且矩阵中的每一行都复制向量。

|7 8 9| ==> |7 8 9|
            |7 8 9|
            |7 8 9|
(2)可以使用0的广播尺寸。每个向量元素成为一行,并且向量对于矩阵中的每一列进行复制。
 |7| ==> |7 7 7|
 |8|     |8 8 8|
 |9|     |9 9 9| 

注意:当向3元素向量添加2x3矩阵时,广播维度为0无效。

广播尺寸可以是描述如何将更小的排列形状广播成更大排列形状的元组。例如,给定2x3x4长方体和3×4矩阵,广播元组(1,2)意味着匹配矩阵与长方体的尺寸1和2。

这种类型的广播在二进制操作中被使用ComputationBuilder,如果broadcast_dimensions给出了 参数。例如,请参阅 ComputationBuilder :: Add。在XLA源代码中,这种类型的广播有时被称为“InDim”广播。

正式定义

广播属性允许通过指定要匹配的高级阵列的哪个维度来匹配较低等级阵列到较高等级阵列。例如,对于尺寸为MxNxPxQ的数组,具有维度T的向量可以匹配如下:

          MxNxPxQ

dim 3:          T
dim 2:        T
dim 1:      T
dim 0:    T 
在每种情况下,T必须等于高阶阵列的匹配维数。然后将向量的值从匹配的维度广播到所有其他维度。

为了将TxV矩阵匹配到MxNxPxQ阵列上,使用一对广播尺寸:

          MxNxPxQ
dim 2,3:      T V
dim 1,2:    T V
dim 0,3:  T     V
etc...

广播元组中的维度顺序必须是下级阵列的尺寸与高级阵列尺寸相匹配的顺序。元组中的第一个元素表示高等级数组中的哪个维度必须匹配低级数组中的维度0。尺寸为1的第二个元素,依此类推。广播维度的顺序必须严格增加。例如,在前面的例子中,将V与N和T匹配为P是非法的; 将V与P和N相匹配也是非法的。

 

广播具有退化尺寸的类似等级阵列

相关的广播问题是广播具有相同等级但尺寸不同的两个阵列。类似于Numpy的规则,这只有在阵列兼容时才有可能。当两个阵列的尺寸兼容时,两个阵列是兼容的。以下两个维度兼容:

  • 他们是平等的
  • 其中一个是1(一个“退化”维度)

当遇到两个兼容阵列时,结果形状在每个维度索引的两个输入中具有最大值。

例子:

  1. (2,1)和(2,3)广播到(2,3)。
  2. (1,2,5)及(7,2,5)广播至(7,2,5)
  3. (7,2,5)及(7,1,5)广播至(7,2,5)
  4. (7,2,5)和(7,2,6)是不兼容的,不能广播。

出现了一个特殊情况,并且还被支持,其中每个输入数组在不同索引处具有退化维度。在这种情况下,结果是“外部操作”:(2,1)和(1,3)广播到(2,3)。有关更多的例子,请参阅关于广播Numpy文档

 

广播组成

将较低级阵列广播到较高级阵列使用简维度广播都可以在相同的二进制操作中执行。例如,可以使用(0)的广播尺寸值将大小为4的矢量和大小为1x2的矩阵相加在一起:

|1 2 3 4| + [5 6]    // [5 6] is a 1x2 matrix, not a vector.
首先使用广播维度将向量广播到等级2(矩阵)。广播维度中的单个值(0)表示向量的维度零与矩阵的维度零相匹配。这产生尺寸为4xM的矩阵,其中选择值M以匹配1x2阵列中的对应尺寸大小。因此,产生4x2矩阵:
|1 1| + [5 6]
|2 2|
|3 3|
|4 4|
然后,“退化维度广播”广播1x2矩阵的维度零以匹配右侧的相应维度大小:
|1 1| + |5 6|     |6  7|
|2 2| + |5 6|  =  |7  8|
|3 3| + |5 6|     |8  9|
|4 4| + |5 6|     |9 10|
更复杂的例子是使用(1,2)的广播尺寸将1x2的矩阵添加到大小为4×3×1的数组中。首先,使用广播尺寸将1x2矩阵广播到等级3,以产生中间Mx1x2阵列,其中维度尺寸M由产生4×1×2中间阵列的较大操作数(4×3×1阵列)的大小确定。由于广播尺寸为(1,2),因为尺寸1和2被映射到原始1x2矩阵的维度,所以M在维度0(最左边的维度)。该中间阵列可以使用简并维度的广播来添加到4x3x1矩阵,以产生4×3×2的阵列结果。
  • 无标签