Эффективное вычисление больших составных функций в Theano - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь вычислить большие (до 10 000 переменных) произвольно вложенные составные функции.Например, функция переменной 100 может выглядеть так:

'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( A0 * (1 - A1) ) * A2 ) * A3 ) * A4 ) * A5 * A6 * (1 - A7) ) * A8 ) * A9 * A10 + A11 * A12 + (1 - A13) + A14 + (1 - A15) ) * A16 + (1 - A17) * A18 + A19 + (1 - A20) * (1 - A21) ) * A22 * (1 - A23) + (1 - A24) + (1 - A25) ) * A26 + A27 + (1 - A28) ) * A29 + A30 + A31 * (1 - A32) + (1 - A33) + (1 - A34) * A35 ) * A36 + (1 - A37) + (1 - A38) + (1 - A39) ) * A40 ) * A41 + (1 - A42) ) * A43 * (1 - A44) * A45 + A46 + A47 + A48 * (1 - A49) * (1 - A50) * A51 + A52 * (1 - A53) + A54 * A55 * (1 - A56) ) * A57 + (1 - A58) * A59 * (1 - A60) * (1 - A61) * A62 * A63 ) * A64 * A65 * (1 - A66) * A67 + A68 ) * A69 ) * A70 ) * A71 + (1 - A72) + A73 * (1 - A74) ) * A75 * A76 + (1 - A77) + (1 - A78) * A79 * (1 - A80) + (1 - A81) * A82 ) * A83 * (1 - A84) * (1 - A85) + (1 - A86) + (1 - A87) + (1 - A88) + A89 + (1 - A90) ) * A91 + A92 + (1 - A93) * A94 * A95 ) * A96 + (1 - A97) + A98 * A99'

Я хочу максимизировать производительность.

Мне указали в направлении Theano, но она выдает ошибку, когдаЯ поместил только 250 переменных. Даже когда переменных намного меньше и функция компилируется, она все еще работает довольно медленно.

При печати графика вычислений я вижу, что все переменные сидят в ряд и переходят в 1 составную функцию.Я мог бы предположить, что был бы какой-то способ улучшить производительность составной функции, хотя я знаю, что библиотека больше предназначена для больших матричных и векторных операций.

Я очень новичок в Theano, и эта проблема могла былегко быть из-за отсутствия понимания.Я не уверен, правильно ли я строю график.Введенный выше ввод будет передан в функцию eval, которая установит переменную ответа.Тогда это то, что используется для инициализации Theano.function.Краткая версия реализации ниже.

import numpy as np
import theano.tensor as T
from theano import function

expr_str = '(1-A1)*(A2*A3+A4*(1-A5)+A6)+A7*((1-A8)+A9)*A10'

# use regex to get a set of the variables
var_set = set(re.findall(r'A\d', expr_str)

# build dict with str vars as keys and Theano tensors as values
var_dict = {}
for var in var_set:
   var_dict[var] = T.dscalar(var)

# evaluate the string expression with Theano tensors as variables
result_tensor = eval(expr_str, var_dict)

# function
f = function([var_dict[var] for var in var_set], result_tensor)
...