Optimizations

Theano应用多种图优化,具有不同的目标:

优化大致按时间顺序列出。下表列出了默认模式中包含的优化的快速摘要。描述是简短的,并指向进一步阅读。

如果您想要添加其他优化,请参阅扩展Theano的指南中的Graph optimization

注意

此列表是部分的。

print_summary方法允许多个OpDB和优化程序列出已执行的优化。这使得有可能具有最新的列表。

python -c'import theano; theano.compile.FAST_RUN.optimizer.print_summary()'

python -c'import theano; theano.compile.FAST_COMPILE.optimizer.print_summary()'

优化 快速运行 FAST_COMPILE 稳定
merge X X  
constant folding X X  
GPU transfer X X  
shape promotion X    
fill cut X    
inc_subtensor srlz. X    
reshape_chain X    
const. elimination X    
add canonical. X    
mul canonical. X    
dot22 X    
sparse_dot X    
sum_scalar_mul X    
neg_neg X    
neg_div_neg X    
add specialize X    
mul specialize X    
pow specialize X    
inplace_setsubtensor X    
gemm X    
inplace_elemwise X    
inplace_random X    
elemwise fusion X    
local_log_softmax X   X
local_remove_all_assert      
合并

简单的优化,其中组合冗余的Apply节点。例如,在函数([x,y], [(x + y)* 2, (x + y)* 3] t>合并优化将确保xy仅添加一次。

这种优化非常有用,因为它可以使用户编写高度冗余的数学代码。Theano将确保计算什么是必要的。

请参阅MergeOptimizer

恒定折叠

当表达式的所有输入都是常量时,表达式可以在编译时预先计算。

请参见opt.constant_folding()

形状促进

Theano通常知道如何从其输入的形状推断输出的形状。没有这个优化,它将不得不计算的东西(例如log(x))只是为了找出它的形状!

请参阅opt.local_shape_lift_*()

填充切割

填充(a,b)意味着形成a形状的张量满了b的值。Often when fills are used with elementwise operations (e.g. f) they are un-necessary: * f(fill(a,b), c) -> f(b, c) * f(fill(a, b), fill(c, d), e) -> fill(a, fill(c, f(b, d, e)))

请参阅opt.local_fill_cut()opt.local_fill_sink()

inc_subtensor序列化

使用内部操作可以快速地增大大张量的小子区域,但是如果在相同的大张量上进行两个增量,则只能在现场进行其中的一个。这种优化重新排序这样的图形,使得所有增量可以在现场完成。

inc_subensor(a,b,idx) + inc_subtensor(a,c,idx) -> inc_subtensor(inc_subtensor(a,b,idx),c,idx)

请参见local_IncSubtensor_serialize()

reshape_chain

这会优化图表,例如reshape(reshape(x, shape1), shape2) - > reshape(x, shape2)

请参见local_reshape_chain()

常数消除

许多常数指示特殊情况,例如pow(x,1) - > x。 Theano认可许多这些特殊情况。

请参见local_mul_specialize()local_mul_specialize()::func:local_mul_specialize

添加规范化

将加法和减法的表达式重新排列为规范形式:

(a+b+c+...) - (z + x + y + ....)

请参阅Canonizerlocal_add_canonizer

mul规范化

将乘法和除法的表达式重新排列为规范形式:

\frac{a * b * c * ...}{z * x * y * ....}

请参阅Canonizerlocal_mul_canonizer

dot22

这个简单的优化用特殊的dot22 op代替点(矩阵,矩阵),它只适用于矩阵乘法。这个op是通过调用GEMM来实现的,有时完全由gemm优化来替代。

请参见local_dot_to_dot22()

sparse_dot

Theano有一个稀疏矩阵乘法算法,在许多情况下比scipy更快(对于密集矩阵输出)。这个优化交换了我们的scipy的算法。

请参见local_structured_dot()

sum_scalar_mul

这可优化sum(标量 * 张量) - > > * sum(tensor)

请参见local_sum_mul_by_scalar()

neg_neg

两个负值的组合可以被取消。

请参见local_neg_neg()

neg_div_neg

在分子和分母中的匹配负值都可以去除。

请参见local_neg_div_neg()

添加专业化

这种优化简化了涉及添加零的表达式。

请参见local_add_specialize()

mul专业化

存在几个特殊情况的mul(),这种优化尝试识别它们。Some examples include: * mul(x,x) -> x**2 * mul(x,0) -> zeros_like(x) * mul(x, -1) -> neg(x)

请参见local_mul_specialize()

pow专业化

pow()的几个特殊情况存在,这种优化尝试识别它们。Some examples include: * pow(x,2) -> x**2 * pow(x,0) -> ones_like(x) * pow(x, -0.5) -> inv(sqrt(x))

请参见local_pow_specialize()

inplace_setsubtensor

为了成为一个纯粹的Op,setsubtensor必须复制其整个输入,并只修改所讨论的subtensor(可能是一个单一的元素)。在现场修改该元素要高效得多。

请参阅local_inplace_setsubtensor()

宝石

数值库(如MKL和ATLAS)实现BLAS级别3接口,并提供实现GEMM的函数Z \leftarrow \alpha A \cdot B + \beta Z,对于矩阵ABZ\alpha, \beta

这种优化试图将各种线性代数表达式重新排列成该主题的一个或多个实例,并用一个Gemm Op替换它们。

请参见GemmOptimizer

inplace_elemwise

当元素表达式的输入之一具有与输出相同的类型和形状,并且在elemwise表达式是求值之后不再需要计算时,则我们可以重用输入的存储以存储输出。

请参见insert_inplace_optimizer()

inplace_random

通常,当图表使用随机数时,RandomState存储在共享变量中,每次调用使用一次,并在每次函数调用后更新。在这种通常情况下,有意义的是,就地更新随机数发生器。

请参见random_make_inplace()

elemwise融合

该优化将计算上便宜的元素操作的子图压缩成单个Op,其在输入上的单次遍历中(例如循环融合)执行整个作业。当从主存储器到CPU(或从图形存储器到GPU)转移是一个瓶颈时,这是一个胜利。

请参阅FusionOptimizer

GPU传输

当前在GPU上选择哪个表达式求值和在GPU上求值的策略是贪婪的。对于GPU实现,有许多Ops * TODO *,只要我们找到一个图形将数据从GPU复制到CPU,以求求一个可能是GPU上的求值的表达式,我们用该CPU的GPU版本为CPU版本。同样,如果我们将具有GPU实现的Op的输出复制到GPU,那么我们用GPU版本替换CPU版本。这样,如果一切顺利,此过程将产生具有以下形式的图:

  1. 将非共享输入复制到GPU
  2. 在GPU上执行大多数/所有计算
  3. 将输出复制回CPU

当使用GPU时,shared()将默认为'float32'ndarray参数的GPU存储,这些共享变量作为贪婪算法的种子。

请参阅theano.sandbox.cuda.opt.*()

local_log_softmax
这是一个稳定优化。它可能发生由于舍入误差,一个值的softmax概率变为0。取0的日志将生成-inf,可能以后生成NaN。我们返回更近的答案。
local_remove_all_assert

这是一个不安全的优化。为了尽可能快的Theano,可以通过设置optimizer_including=local_remove_all_assert来启用此优化,这将删除图中用于检查用户输入有效的所有断言。如果你确定你的图中的一切有效,请使用此优化。

请参阅Unsafe optimization