Если вы обращали внимание на последние тенденции в высоких технологиях, вы, вероятно, в последнее время много слышали об использовании искусственного интеллекта и всех его потенциальных приложениях - от обнаружения обнаружения опухолей до, наконец, победы над действующим чемпионом мира » победа »чемпиона мира среди людей в игре Го. За кулисами большая часть этой технологии зависит от сложной структуры, известной как TensorFlow, которая была разработана Google и выпущена под лицензией с открытым исходным кодом. Очевидно, что после демонстрации такого успеха в последние несколько лет к этой области (и к этой библиотеке) проявился большой интерес.

Мое докторское исследование было сосредоточено на использовании аналогичных типов программных методов и моделирования, известных как агентные модели, для изучения экономики телекоммуникационной отрасли. Большая часть успеха TensorFlow пришла, когда я был слишком далеко в своей докторской диссертации, чтобы смотреть на применение этих новых методов. В конечном итоге нужно получить высшее образование ... Однако теперь, когда я закончил обучение, переехал в другой город и начал привыкать к новому распорядку дня, есть несколько разных причин, по которым я среди многих ученых и инженеров, принимающих взгляните на эту захватывающую новую технологию.

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

Хотя меня интересуют модели такого типа (хотя я, конечно, имею в виду различные потенциальные применения), я подумал, что начну с чего-то немного другого, более близкого к моему докторскому исследованию. Я хочу использовать TensorFlow для игр. Не в стратегические игры, в которые люди обычно играют ради удовольствия, например в го, а в экономические игры, в которые «играют» разные экономические фирмы. Есть много веских причин, чтобы внимательно присмотреться к применению существующих фреймворков, подобных этой, вместо того, чтобы пытаться создать что-то специально созданное с нуля - вы можете извлечь выгоду из огромного количества времени, уже потраченного специалистами по данным и компьютерными программистами.

Это означает, что мне нужно понимать низкоуровневые детали фреймворка TensorFlow, хотя мне нужно будет перевести учебники, ориентированные на данные, которые я нашел в большинстве мест, на что-то, что является более подходящей отправной точкой для моей области исследований: экономические модели и эволюционная теория игр. Обычно рамки обучающих технологий начинаются с простого примера «привет, мир». Мы немного прошли… Привет, миры машинного обучения, вероятно, представляют собой линейные или логистические регрессии, причем последние обычно используют набор рукописных цифр MNIST для знакомства новых пользователей с нейронными сетями. Я собираюсь начать с приветственного мира экономических моделей, монополиста, стремящегося максимизировать прибыль.

Максимизация прибыли монополии

Уравнения для такой модели довольно просты. У нас есть (1) функция спроса, описывающая взаимосвязь между количествами, которые могут быть проданы по разным ценам, и (2) производственная функция, описывающая, сколько стоит монополисту производство данного количества. Их можно объединить, чтобы написать функцию, описывающую прибыль монополистов, и затем мы найдем решения, которые максимизируют прибыль монополистов.

Давайте начнем с чего-то очень простого, поэтому решить его относительно легко, если вы все еще помните первые две недели вводного курса математического анализа.

Теперь у нас есть уравнение, которое описывает прибыль монополиста от любого количества товара, которое он хочет произвести. Затем цель состоит в том, чтобы найти максимально возможную прибыль. Здесь, конечно, и пригодится исчисление. Мы берем производную прибыли, устанавливаем ее равной нулю и решаем для количества…

Пока наши предположения о спросе и затратах верны, цена, максимизирующая прибыль, составляет ровно 45. Конечно, возникает вопрос… зачем использовать TensorFlow, если вы можете просто решить эту проблему с помощью небольшой вводной экономики и расчетов? Ответ, конечно, заключается в том, что мы можем использовать это для более сложных моделей в будущем, в том числе для моделей, для которых было бы непрактично найти точное математическое решение. Но это тема для другого раза. А пока давайте продолжим и выясним, как использовать фреймворк TensorFlow для решения этой простой модели. Мы будем использовать ответ, который, как мы знаем, правильный (по математике), чтобы проверить правильность ответа, полученного с помощью нашей модели TensorFlow.

Что мы хотим сделать, так это настроить TensorFlow так, чтобы он находил для нас оптимум, используя логический вывод, а не дедуктивный подход с использованием математики. Мы просто начнем с того же простого уравнения прибыли. Код для перевода этого уравнения в вычислительный граф TensorFlow прост.

quantity = tf.Variable(0.0, dtype=tf.float64, name="quantity")
profit = (90.0 * quantity) - (quantity * quantity)

Количество определяется как тип tf.Variable, потому что мы хотим, чтобы TensorFlow оптимизировал это для нас. (Использование 0.0 в этой строке - это просто временное начальное значение, которое TensorFlow заменит, как только мы запустим цикл оптимизации.) Прибыль в этом случае - это не число, которое рассчитывается сразу, а заполнитель для тензора (ранг 0), который будет произведено, когда количеству будет присвоено число. Это просто код Python, который представляет собой расчет, который дает приведенное выше уравнение прибыли. Мы можем получить явные значения в так называемом сеансе TensorFlow и предоставить ему конкретное значение для количества.

print(sess.run(profit, feed_dict={quantity: 45}))
2025.0

Оптимизаторы в TensorFlow предназначены не для поиска максимальных значений, а для поиска минимальных значений. Как правило, это попытка минимизировать различия между тем, что предсказывает обучаемая модель, и тем, что наблюдается в реальном мире. Затем оптимизаторы вносят дополнительные изменения, чтобы попытаться улучшить модель. У нас есть функция прибыли, которую мы хотим вместо этого максимизировать. Но это довольно тривиальное решение - просто создать функцию потерь, равную отрицательной прибыли. Это узел вычислительного графа TensorFlow, который мы передадим оптимизатору.

neg_profit = 0.0 - profit
optimize = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(neg_profit)

Теперь приступаем к тренировочному циклу. Этот небольшой фрагмент кода запускает новый сеанс TensorFlow и дает оптимизатору градиентного спуска 20 итераций, чтобы найти значение для quantity, которое имитирует значение neg_profit. На каждой итерации он распечатывает вычисленные значения количества и прибыли.

sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(20):
    print(sess.run([quantity,profit]))
    sess.run(optimize)

Запуск приводит к следующему.

[0.0, 0.0]
[9.00000013411045, 729.0000096559525]
[16.200000214576722, 1195.5600123596191]
[21.960000257492066, 1494.1584118652343]
[26.568000274658203, 1685.2613861249997]
[30.254400274658202, 1807.5672887399996]
[33.20352026367188, 1885.8430658304]
[35.56281624609375, 1935.9395627950082]
[37.450253025, 1968.0013206134786]
[38.9602024425, 1988.5208454644173]
[40.168161972, 2001.6533412711733]
[41.134529592, 2010.0581385248763]
[41.90762368512, 2015.4372087271693]
[42.526098957312, 2018.8798136309874]
[43.0208791732224, 2021.0830807530153]
[43.416703344476154, 2022.4931717006068]
[43.733362680299514, 2023.3956299003419]
[43.98669014801448, 2023.9732031438691]
[44.18935212143148, 2024.342850016972]
[44.351481699561106, 2024.5794240139958]

Как видите, оптимизатор градиентного спуска сначала запускается быстро, каждый раз приближаясь к значению, которое приносит большую прибыль. По мере приближения к оптимальному значению он начинает делать все меньшие и меньшие шаги. Этот шаблон основан на том, как работает градиентный спуск, и разные методы обучения будут делать это по-разному. На данный момент градиентный спуск был простым способом начать работу с простой задачей оптимизации.

Модель олигополии Курно

Модель олигополии Курно, вероятно, первая модель, которую изучают студенты-экономисты, когда они обсуждают олигополии - рынки, которые не являются абсолютно конкурентными и не контролируются одним монополистом, но на которых сильно доминирует небольшое количество фирм. В этой модели две фирмы независимо друг от друга выбирают объем производства. Однако мы не делаем ни предположения об идеальной конкуренции на рынках - цена будет равна предельным издержкам, ни предположения монополиста о том, что цена фактически устанавливается монополистом, потому что никакая другая фирма не может производить товар. Вместо этого количество на рынке - это сумма количества, произведенного каждой фирмой.

Давайте использовать некоторые из предположений, которые мы делали в прошлый раз.

Однако, как только мы дойдем до этого момента, мы не сможем использовать то же уравнение спроса, что и раньше, потому что теперь общее количество товаров на рынке является суммой обеих фирм. Вместо этого у нас есть обратная функция спроса, которая выглядит так:

Чтобы решить эту проблему с помощью стандартного математического подхода, мы создадим функцию наилучшего отклика для расчета наилучшего отклика каждой фирмы (их максимальной прибыли) с учетом количества, произведенного другой фирмой. Это похоже на случай с монополией, но вместо того, чтобы в результате получить единое число, используется количество другой фирмы. Затем мы использовали бы эту функцию наилучшего отклика, чтобы исключить член из уравнения прибыли фирмы 2. Вы можете прочитать все об этом в ближайшем к вам учебнике по экономике. Здесь, конечно, мы продолжим нашу нынешнюю парадигму использования TensorFlow и универсального алгоритма оптимизации, чтобы найти оптимальные количества с помощью вывода, а не дедукции.

Ниже приведен расчетный график для представления модели.

quantity_1 = tf.Variable(0.0, dtype=tf.float64, name="quantity_1")
quantity_2 = tf.Variable(0.0, dtype=tf.float64, name="quantity_1")
profit_1 = (90.0 * quantity_1) - (quantity_1 * quantity_1) - (quantity_1 * quantity_2)
profit_2 = (90.0 * quantity_2) - (quantity_2 * quantity_2) - (quantity_1 * quantity_2)
loss_1 = 0.0 - profit_1
loss_2 = 0.0 - profit_2

Однако на этот раз нужно внести небольшое изменение. У нас две фирмы, и обеим нужно отдельно выбирать объемы производства. Итак, нам нужны два отдельных оптимизатора. В связи с этим нам необходимо указать переменные, которые может изменять каждый оптимизатор, поскольку мы не можем полагаться на поведение по умолчанию, когда один оптимизатор может контролировать все, что относится к типу tf.Variable.

choices_1 = [quantity_1]
choices_2 = [quantity_2]
optimize_1 = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss_1, var_list=choices_1)
optimize_2 = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss_2, var_list=choices_2)

Теперь мы готовы запустить модель. Как и раньше, я покажу только 20 итераций, потому что к этому моменту уже совершенно ясно, что мы собираемся сойтись на Q_1 = Q_2 = 30.

sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(20):
    print(sess.run([quantity_1,profit_1,quantity_2,profit_2]))
    sess.run([optimize_1,optimize_2])
[0.0, 0.0, 0.0, 0.0]
[9.00000013411045, 648.0000072419643, 9.00000013411045, 648.0000072419643]
[15.30000018775463, 908.8200054073333, 15.30000018775463, 908.8200054073333]
[19.71000019714236, 996.9318022001088, 19.71000019714236, 996.9318022001088]
[22.797000183999536, 1012.3235817814084, 22.797000183999536, 1012.3235817814084]
[24.957900160999593, 1000.4174535971165, 24.957900160999593, 1000.4174535971165]
[26.470530135239656, 980.9697808903078, 26.470530135239656, 980.9697808903078]
[27.52937111044572, 961.9108524668278, 27.52937111044572, 961.9108524668278]
[28.270559788356575, 945.9012794580041, 28.270559788356575, 945.9012794580041]
[28.789391859580803, 933.3871000732775, 28.789391859580803, 933.3871000732775]
[29.152574307118403, 923.986510176536, 29.152574307118403, 923.986510176536]
[29.40680201877117, 917.0921717469969, 29.40680201877117, 917.0921717469969]
[29.584761415791622, 912.1123113626207, 29.584761415791622, 912.1123113626207]
[29.709332992910397, 908.5510355946673, 29.709332992910397, 908.5510355946673]
[29.79653309633666, 906.0212095481274, 29.79653309633666, 906.0212095481274]
[29.85757316834523, 904.2322341448926, 29.85757316834523, 904.2322341448926]
[29.900301218478358, 902.9710837515754, 29.900301218478358, 902.9710837515754]
[29.930210853380537, 902.0839333486119, 29.930210853380537, 902.0839333486119]
[29.951147597678357, 901.4607989552238, 29.951147597678357, 901.4607989552238]
[29.965803318593238, 901.0235616161648, 29.965803318593238, 901.0235616161648]

Заключение

Мы просто использовали универсальный фреймворк машинного обучения TensorFlow для решения некоторых классических экономических моделей, а не традиционный математический подход. Это действительно полезно?

Это зависит от. Очевидно, бесполезно просто заново решать модель олигополии Курно. Но может ли это быть полезно для других экономических моделей? Возможно, хотя я не уверен, что TensorFlow - правильный способ сделать это. Глядя на API и сопоставляя его с такого рода проблемами, кажется, что действительно мощные функции TensorFlow - способность запускать эти вычислительные графы с действительно массивными наборами данных и использование преимуществ несколько более специализированного компьютерного оборудования (например, графических процессоров) - может оказаться неприменимым для такого рода теоретических моделей. В то же время может быть сложно адаптировать другие необходимые концепции, такие как эволюционная теория игр, для использования этой структуры.

Тем не менее, я все же считаю, что это упражнение того стоило. Во-первых, это было частью моего собственного знакомства с библиотекой TensorFlow на низком уровне. Это полезно для понимания того, как выполняются крупномасштабные проекты машинного обучения, что в первую очередь было частью моей цели. Я мог бы также посмотреть немного глубже в использование системы для теоретических экономических моделей, но это проект на другой день. А пока я надеюсь, что вы нашли это обсуждение, по крайней мере, в некоторой степени полезным.

Если у вас есть вопросы или комментарии, дайте мне знать.