Вот что сам автор доклада говорит о нём: «В этом докладе я применю методы статистической физики для изучения поведения нейронных сетей в пределе большого количества нейронов. Я выведу первый и второй законы обучения: во время обучения общая энтропия должна уменьшаться (т.е. второй закон обучения), и увеличение функции потерь должно быть пропорционально увеличение энтропии плюс увеличение сложности нейронной сети (т.е. первый закон обучения). Я рассчитаю разрушение энтропии, чтобы показать, что эффективность обучения задается лапласианом свободной энергии, которая должна быть максимизирована в оптимальной нейронной архитектуре, и объясню, почему условие оптимизации лучше выполняется в глубокой сети с большим числом скрытых слоев. Ключевые свойства модели будут проверены численно путем обучения нейронной сети с использованием метода стохастического градиентного спуска. Я также рассмотрю возможность того, что вся Вселенная на самом фундаментальном уровне представляет собой нейронную сеть».
Запись прошедшего вебинара: https://youtu.be/FHef-E1gZtE
Презентация: https://drive.google.com/drive/u/1/folders/1lq1x8la-0Eix3H6735LLvCyWhZfTvyAC
(00:00:00) (Начало записи)
Николай Михайловский: Добрый день! Я – Николай Михайловский, генеральный директор компании NTR. Я приветствую всех на очередном вебинаре NTR и Высшей IT школы Томского государственного университета. У нас сегодня в гостях Виталий Ванчурин, профессор университета Миннесоты. В этом году он сделал немного спорную, но, несомненно, интересную работу по термодинамике машинного обучения. Сегодня он нам расскажет, в чём дело. На мой взгляд, в работе много интересных вещей. Даже помимо самой термодинамики интересное обобщение самого понятия нейронной сети, интересные заходы на методы обучения нейронных сетей. Поэтому я уверен, многим из присутствующих будет интересно и полезно послушать. На уровне насыщенности идей работа, несомненно, интересная и важная.
Виталий Ванчурин: Здравствуйте. Спасибо, Николай. Действительно, хотелось бы, чтобы вопросы поступали сразу, в основном из-за того, что я все-таки физик, и некоторые термины, которые я буду использовать, будут отличаться, поэтому нужно будет всё более-менее уточнять. В чём основная идея? Идея наверно хорошо изображена на этой картинке, хотя это, наверно, будет единственная картинка. Будет много формул, графиков, но картинок больше нет.
Идея в том, что у нас есть некоторое понимание, как работают нейронные сети (это слева). Вопрос – чем нам может помочь физика? Тот аппарат, который мы используем в физике (который я проиллюстрировал справа), может помочь нам изучить и понять, главное – понять, как работают большие многоуровневые, глубокие нейронные сети. Я начал заниматься этой темой только недавно. Первая статья внизу, этот номер архива. В этом и заключается идея – взять физику и посмотреть, можем ли мы что-то с помощью тех инструментов, которые есть в физике, понять, как работают нейронные сети. Потом just for fun, как говорится, решил попробовать, можно ли делать наоборот и сказать – давайте решим, что нейронные сети – это всё, и сможем посмотреть, можно ли моделировать некоторые физические процессы. Все получается интересно, сложно. Но этот доклад – только первая часть этого, как физика может помочь нам понять машинное обучение.
Мотивация. Основная мотивация для меня была, я не понимал, как работают глубокие нейронные сети, то, что называется deep learning диплом. После того, как поговорил с некоторыми специалистами, понял, что никто не понимает. Хорошо. В чём проблема понять? Казалось бы, что нейронная сеть – это достаточно четко описанная математическая модель. Почему нельзя разобраться? Но проблема всегда, что количество переменных очень большое.
Тут я написал три типа переменных. Эти три буквы будут везде в докладе присутствовать, поэтому давайте я сразу по ним пройдусь. Ŵ и всё, что с hat (шапочкой) – это матрица. B, всё, что жирное – это векторы. Это будет weight matrix, матрица, wise vector, x – это вектор состояния. Мы к этому скоро вернемся. Переменных действительно много, аналитические методы не очень хороши, поэтому основные результаты приходят из численных вычислений.
В физике ситуация очень похожа. Мы очень хорошо знаем, как считать системы, описывать системы, когда количество степеней свободы маленькое, и как только оно начинает расти, мы затеряемся, не знаем что делать. Мы придумали только одну хорошую идею. Не мы, это Гольцман, Гиббс, Джеймс – это всё в конце XIX – начало XX века, статистическая механика. Статистическая механика нам позволила сделать очень многое для понимания физических систем с большим количеством переменных, с очень большим. И чем больше, тем лучше, в чём прелесть.
(00:04:59)
Но физическая механика – это всего лишь теория, но она позволяет нам вывести то, что мы можем реально померять, это термодинамику. Термодинамику вывели сначала через статистическую механику, потом показали, как это можно вывести через теорию информации, прекрасно описывает то, что мы видим в лабораториях. Но вопрос – можем ли мы сделать то же самое? Казалось бы, возьмем нейронную сеть с большим количеством переменных, с большим количеством нейронов, создадим какие-то статистические ансамбли. Ансамбли – это распределение вероятности, и можем ли мы вывести термодинамическое описание нейронных сетей?
Это план на этот доклад. Outline следующий. Перед тем, как я еще выведу еще статистическое описание, надо будет разобраться, как правильно определить нейронные сети. Правильно с точки зрения того, что будет легче с ними описывать статистические ансамбли. Это первая часть доклада. Николай сказал, что нужно немножко обобщить нейронные сети.
Потом само статистическое описание, и, имея это статистическое описание, термодинамика. Как только мы прошли эти все три шага, остается вопрос – хорошо, а теперь как насчет нейронных архитектур? Какие архитектуры будут изучать лучше, хуже? В этом будет как бы основная панчлайн.
После этого будет вопрос, по которому я очень быстро пройдусь, буквально за две минуты, как мы можем всю эту наработанную теорию приложить к физике? Наверно, этот первый слайд самый важный, потому что здесь я собираю всё, что я предполагаю о нейронных сетях и определяю некоторый объект, строго определенный математический объект, состоящий из семи частей. Тут важно, что под вектором x я понимаю состояние не каких конкретных нейронов, а всех нейронов. Этот вектор x, который я называю state vector, он описывает и входящие нейроны, и выходящие нейроны, и hidden нейроны, все. Это достаточно высокомерный вектор. Но при этом иногда мне нужно будет оперировать с входящими нейронами. Для этого я прилагаю оператор P̂in, pкоторый отпроектирует вектор нейронов на подпространство входящих нейронов. Грубо говоря, P – это матрица, состоящая из нулей и только единицы по диагонали, которые соответствуют входящим нейронам. То же самое для выходящих нейронов P̂out.
Ŵ – я уже говорил, что это значит матрица весов. Важно, что это не матрица весов на каком-то уровне, а между всеми нейронами. Ŵ – это объект, который в основном состоит из нулей. Более того, если у вас сеть feedforward, которая часто используются, я пишу номер четыре, то эта матрица обладает таким свойством. Если ты возведешь эту матрицу в степень ŵn, где n – количество levels, то получишь ноль, нулевую матрицу. Такие матрицы называются нильпотентные матрицы. Это будет важное свойство для того, чтобы понять, как работают глубокие и мелкие нейронные архитектуры.
С вектором мы поняли, с проекторными операциями. Единственное, здесь я добавил note. Уже притягивая ту терминологию, которую мы используем в физике, эти и входящие, и выходящие нейроны вместе мы будем называть поверхностные нейроны (boundary), тогда, когда спрятанные (hidden) нейроны называем bulk нейроны. Это терминология, которую я могу просто не использовать, но для иллюстрации, наверно, правильно будет думать о входящих и выходящих, лежащие на поверхности, a hidden (скрытые) нейроны, лежащие внутрь. Bias vector. Я мог бы прочитать бóльшую часть доклада без этого вектора, но он присутствует, и он присутствует в этом выражении. Это вектор такого сдвига.
(00:10:14)
Что здесь означает это уравнение шесть, которое я написал? Х – сама компонента, i компонента вектора состояния. Время (t + 1), мы потом проговорим, что это означает. Равна функции активации, которая посчитана в этом месте. Что физики часто делают, и люди из других областей их за это часто ругают? Когда мы видим повторяющиеся индексы jj, мы не ставим символ сложения. Мы предполагаем, изначально это называется Einstein summation convention. Мы предполагаем, что нужно просуммировать по всем значениям j. Тогда здесь мы получаем некоторую величину, которую складываем с компонентом Bias vector, вкладываем в функцию активации и получаем значение нейрона.
Ничего нового я вам здесь не говорю. Я просто прилагаю некоторую компактную терминологию, что вы дадите мне septuple, и я знаю, о чём вы говорите, знаю, о какой нейронной сети вы говорите.
Самое важное – это loss function, которая определяет и cost function, определяет, что мы хотим, чтобы нейронная сеть делала. Сразу пример. Это то, что я буду называть поверхностная loss, boundary loss. Это мы фиксируем начальные input нейроны, начинаем много раз оперировать с этим уравнением. Что происходит в конечном итоге? Все значения нейронов перестают изменяться, и потом мы сравниваем полученный результат на boundary нейронах с тем, что мы хотим. Это выражение, эта часть – это что произойдет, если мы зададим какие-то начальные условия для нейронов, они пройдут через все уровни, а потом мы сравним, что на самом деле мы хотим, какие были значения у этих нейронов. Это такой root mean square. Я могу это переписать так, так, так, но понятно, что здесь вся ошибка loss лежит на поверхности, в данном случае на выходящих нейронах (output).
Это один из вариантов. Этот вариант мы очень часто используем. Но почему нельзя подумать о других вариантах loss function? Причем мы знаем, что этот loss прекрасно работает для supervised learning. Но как насчет чего-то более общего? Проблема, что для unsupervised learning, когда у нас нет никаких output нейронов, этот проектор, матрица, которая проектирует на output нейроны, она равна нулю, нулевая матрица, этот loss всегда будет равен нулю, и е нужно что-то обобщить. Если наша мотивация – придумать какую-то loss функцию для unsupervised learning.
Тогда мы замечаем, что на предыдущей странице было два важных уравнения – fixed-point уравнение и это boundary loss. Это уравнение мы выполняли точно, а вся ошибка была на выходящем слое. Мы можем все это поменять и сказать – давайте наоборот. Ошибка у нас будет не только на выходящих нейронах, а на всех нейронах. Так посчитаем. А это X\bar теперь – это не решение fixed-point уравнения, а решение этого. Мы хотим найти значение нейронов так, чтобы ошибка по всем нейронам была минимальна, чтобы это было минимальное. Запомним это (3). Я очень быстро скажу другое обобщение, которое можно сделать.
(00:15:01)
Обобщение следующее. Мы можем сказать, что наши нейроны локально также имеют какой-то свой objective. Например, нейрон может говорить, что для меня важно, чтобы я классифицировал сигнал на два значения – большое или маленькое, скажем, т + 1 или -1. Тогда в этот loss function можно добавить такую, чтобы назвать потенциалом, и это общее уравнение (5) теперь будет еще более общая loss function.
Я могу продолжать играть эту же игру и сказать, что не один нейрон локально objective, а какой-то набор нейронов, и увеличивать сложность этой функции дальше и дальше. Но я остановлюсь здесь, потому что для того, что я буду делать дальше, достаточно уравнения (3).
Сразу, перед тем, как мы перейдем к математике, я хочу показать на примере конкретного численного эксперимента, я так их называю, в котором я посчитал этот bulk loss (внутренней loss) в объеме и поверхностный loss, чтобы примерно представляли, как они друг с другом коррелируют. Отличие только – здесь теперь я пишу не H, а U. U – это усредненное по всему ансамблю. Loss, которая усредненная по всем элементам, по всему training set. Но я мог бы делать и для каждого отдельно, но просто было бы больше шума. Что важно? Со временем, когда происходит обучение, этот обычный наш Uд, это boundary (поверхностная ошибка, она просто падает. Этот то, что и хотелось, чтобы ошибка в output layer становилась всё меньше и меньше. Мы можем использовать ту же самую программу.
Что за обучение здесь? Это я вот стандартный MNIST database цифр, написанных от руки, и использовал TensorFlow library. В общем более-менее всё стандартно. Для этой сети, в данном случае пока не важно, сколько слоев я использовал, эта картинка не изменится, какую архитектуру я использовал. Мы видим, поведение loss function, она идет вниз одна, и идет вниз другая. Давайте теперь сделаем другое построение. Вместо того, чтобы просто смотреть, что они так скучно идут вниз, давайте построим log Uд versus log U. Посмотрим, как они согласуются друг с другом. Это более интересная картинка. Всё идет влево и вниз. И log U уменьшается, и объемная loss уменьшается, и поверхностная loss уменьшается. Это так все и должно.
Но что интересное происходит? Поверхностная loss сначала хорошо уменьшается, потом она в какой-то момент притормаживает, это такие flat directions. В этот момент программа эволюционирует, проходит много-много эпох, но значительного уменьшения loss не осуществляется. Оно долго-долго так идет, а потом перепрыгивает. Это то, что в красном овале. В зеленом овале то же самое – долго-долго стоит на месте, а потом перепрыгивает. В это время, когда обычная ошибка, которая считается на поверхности (boundary loss) особенно не уменьшается, на самом деле внутри нейронной сети (in the bulk) происходят значительные изменения. Это показывает, что в какой-то степени bulk loss знает немножко больше о том, как эффективно происходит обучение по сравнению с boundary loss.
(00:20:12)
Вопросы. В данном случае я закончил первую часть доклада, где я хотел просто описать обобщение нейронных сетей путем обобщения и матрицы весов, и loss функции.
Возник вопрос. Фазовый переход переобученной сети. Вижу вопрос. Фазовый переход все-таки я больше ассоциирую, когда меняется температура. Давайте подождем с ответом на этот вопрос, потому температура скоро придет, и определим, что это такое, и тогда поймем. Я так понимаю, что этот процесс известен, когда долго-долго. Это называется flat directions. Хорошо, мы вернемся к этому вопросу, и я попытаюсь на него ответить. Статистическое описание.
Николай Михайловский: Извиняюсь, там еще есть вопрос в вопросах. Что целевое значение bulk loss, и откуда берут идеальные активации внутренних слоев.
Виталий Ванчурин: Я попытаюсь ответить. Значение bulk loss определенно здесь. Наверно, может возникнуть немножко confusing, что здесь я не делаю сумму по всем-всем нейронам. Но фактически что нам говорит? Мы смотрим, на какой степени каждый конкретный нейрон, какая его контрибуция к общей ошибке. Мы не смотрим на конечную ошибку на конечном слое, а мы смотрим внутри этот нейрон, насколько он неправильно его вход не соответствует тому, что мы хотим, чтобы у него было на выходе. Значения у них, естественно, будут любые, какие могут быть. Но важно понять, что при этом мы размываем ошибку с выходящего слоя на все внутренние слои. Важно понять, что при таком определении эти bulk loss намного-намного, меньше чем boundary loss. Это видно на следующем графике.
А второй, откуда берутся идеальные активации. Я это не понимаю. Что значит идеальные активации?
Николай Михайловский: По всей видимости, коллеги представляют, будто бы та функция активации, которая есть у какого-то нейрона, выход нейрона сравнивается с стандартным значением, и считается эта разница. У вас считается разница с уравнением фиксированной точке.
Виталий Ванчурин: Я понял. Это H – что такое уравнение фиксированной точки? Это и есть то, что мы берем входящие нейроны, которые имеют сейчас какое-то значение, мы ударяем по ним функцией, получаем какое-то значение, и это значение расходится с тем значением нейрона, которое там есть. Фактически – да, у нас уравнение теперь не фиксированное. Оно не всегда не фиксированное, потому что всегда то, что мы получаем на output layer, не согласуется с тем, что мы хотим получить на output layer. Здесь эта несогласованность размыта. Второй вопрос отпадает, спасибо. Второй вопрос отпал.
Возможно, что-то в жаргоне, используемом в физике и machine learning, различается. Давайте пройдемся немножко дальше, если никаких других вопросов нет. Нет, bulk loss – это не градиент. Это не сумма значений градиентов.
(00:25:00)
Это разница значений нейрона на выходящем значении нейрона с активационной функцией, посчитанной во входящих нейронах. Насколько у нас нейрон должен измениться, если мы начнем apply эту активационную функцию.
Градиент будет потом, когда мы хотим этот bulk loss или boundary loss уменьшить. Тогда вы считаете, действительно, градиент, и хотите уменьшить это значение, как можно больше. Тут пока градиента нет. Это просто сумма квадратов ошибок на всех нейронах. У вас была раньше сумма квадратов ошибок на выходящем нейроне, а мы его размазали по всему bulk.
Идем дальше. Статическая механика. Так как мы потратили много время на это, здесь я пройдусь немножко побыстрее, чтобы побыстрее попасть в самую интересную часть. Что мы делаем в статистической механике? Мы не знаем конкретное значение этого вектора нейронов, мы рассматриваем вероятностное распределение (probability distribution) этих векторов нейронов x.
Одно распределение у нас есть прямо на самой задачке. Когда нам дадут training dataset, у нас есть это распределение. Мы можем построить. Она состоит из суммы дельта функций, потому что у нас конкретные данные. Мы можем ее сгладить, а можем не сглаживать. У нас есть какое-то такое распределение. Оно только на boundary нейроны, на входящие и выходящие. У нас нет этого распределения изначально для внутренних (hidden) нейрон. Мы можем эту проблему исправить и доопределить наше распределение, это p0, и определить распределение всех нейронов p0(х).
Задача машинного обучения – это уменьшить не это H, что я говорил, а это U. Хотим, чтобы среднее значение по какому-то распределению всех этих векторов состояния было минимальным. Мы хотим это U уменьшить. На предыдущих plots я показывал, как уменьшать это U.
Теперь ключевая идея, приходящая из физики, а не из машинного обучения. В физике у нас все очень похоже. Единственная проблема, что мы нам сложно иметь дело с этими дельта функциями. Когда у нас распределения имеет вид дельта функций, мы это называем микроканоническое распределение. Оказывается, что всё гораздо легче считать, когда распределение не микроканоническое, в каноническое, оно представляет собой экспоненту. Казалось бы, мы сразу меняем задачку, когда мы меняем распределение, а вот и нет. В физике можно четко показать, что в пределе, когда количество нейронов очень большое, все предсказания, которые вы получаете от микроканонического ансамбля или от канонического ансамбля, они просто идентичны.
Зачем же менять задачку, если предсказания идентичны? Оказывается, с точки зрения вычислений этот ансамбль намного проще. Вообще физика любят экспоненты, именно из-за того, что с ними легче работать, легче считать. Когда мы в конце потом все посчитали с этим новым ансамблем, нужно сравнить с экспериментами и показать, что, действительно, вычисления, которые мы делаем с этим ансамблем, имеют relevant.
Еще раз. Что мы сейчас сделали на этой странице? Мы перешли от конкретного вектора состояния нейронов к вероятностному распределению состояния нейронов, которое частично задано training datase, именно та база данных, которая нам была предоставлена. А частично мы достроили ее, исходя из этого распределения.
(00:30:05)
Из теории вероятности можно даже вывести это распределение. Есть такой принцип максимальной энтропии, который, долго мучиться не надо, покажет, что если у вас есть распределение вероятности, вы знаете об этом распределении вероятности только то, что какие-то на него constraint, например, вам известно среднее значение чего-то, и вы хотите вывести распределение вероятности, которое соответствуют тем средним значениям, которые указаны. Стартуя с принципа максимальной энтропии, вы всегда можете прийти к данному распределению. Заметьте, что я здесь пишу p(x), но, конечно, кроме x, он еще зависит и от b, и от ŵ.
Как только у нас есть распределение, мы стартуем и начинаем. Задаем самый важный объект в статистической механике, который называется partition fiction, по-русски функция разбиения или функция распределения. Всё, что это означает, мы берем. Что здесь вероятность пропорциональна, мы не знаем, здесь не символ «равно». Если мы отинтегрируем по всем значениям x, то мы получим какое-то значение. Это значение и есть функция разбиения. Вероятность для какого-то x- это эта экспонента, поделенная на partition fiction.
Чем эта partition fiction хороша? Как только мы для системы посчитали partition fiction, она обычно сложная, потому что это H сложное, не всегда ее можно посчитать аналитически. Но если можно, посчитав Z, мы сразу знаем всё о системе. Я покажу, что я имею в виду под этим «знаем всё». Давайте я просто быстренько покажу пример, как ее можно посчитать. Давайте возьмем, чтобы H, bulk loss вместе с этой массой или без массы, это абсолютно не важно. Активационная функция, я возьму гиперболический тангенс. Можно брать другие функции, тоже не важно. Важно, что, если эта функция H содержит только квадратные члены или ее можно приблизить, апроксимировать через квадратные члены, то она очень легко считается. Это гауссовский интеграл, и вот ответ.
Это, конечно, аппроксимация. В этом выражении, в этой аппроксимация очень важна матрица G, которая получилась. Всё, что я буду говорить в основном в последующих слайдах, это всё вокруг этой G крутится. Что такое G? G – это у нас матрица, это оператор. Он состоит из двух частей. Пришел он отсюда. Я взял это выражение и просто разложил до второго порядка. Эта матрица зависит от матрицы весов Ŵ, также она зависит от вектора bias через матрицу f, prime, который является диагональным. Это матрица первых производных. Что она показывает? Она конкретно показывает вам эту часть, показывает, как изменяется состояние нейрона, когда вы ударяете один раз по нему с активационной функцией. Это всё, что это есть. Линелизированная операция изменения вектора состояния при single iteration. Это квадрат. Это всё, что есть. Вы меняете Ŵ, меняется G. Вы меняете B, меняется G. А тут, зная G, теперь я просто подставляю сюда и получаю значение той функции, которая мне позволяет вычислить всё.
Важно понять, что эта функция разбиения или partition fiction меняется тогда, когда меняются векторы состояния (state vectors). Она также будет меняться, когда у вас меняются эти bias vector и weight matrix.
(00:35:00)
Показываю сразу про этот оператор G, чтобы немножко было какое-то понимание, как он эволюционирует, потому что в этом операторе G, в его эволюции, как мне кажется, таится вся тайна этого глубокого изучения. Чтобы понять, как эволюционирует оператор, тем более, он у нас симметричный, легче всего посмотреть, как эволюционируют его собственные значения. Более того, я буду делать plot для логарифмов этих eigenvalues, только потому, что, как я покажу дальше, сумма логарифмов этих собственных значений должна равняться нулю для тех сетей, которые используются feedforward, для тех матриц весов, которые нильпотентные. Я говори, что мы обычно используем нильпотентные матрицы, потому что, возведя эту матрицу в определенную степень, вы получаете ноль. Оператор G определяет partition fiction, и он определяет в принципе с точки зрения статистической механики всё.
Две страницы следующие. Тут пример, как собственные значения этого оператора или log этого оператора меняются со временем. Это у нас начальные условия для сети столько с одним hidden layer (один спрятанный слой). Один входящий, один выходящий. Тот же самый эксперимент с MNIST database TensorFlow library. Всё то же самое.
Сначала вот что мы видим. Через некоторое время после 100 эпох у нас растет пик. Тут уже всё сильно похоже на МГУ, через 10 тыс. эпох вот, как это выглядит. Самое важное observation, которое вы здесь должны увидеть – это то, что картинка симметричная. Как только от нуля eigenvalues начинают ползти вправо, другие eigenvalues (собственные значения) ползут влево. Это наблюдается до самого конца. Это то, что мы наблюдаем для сетей, которые shallow (неглубокие). А те посмотрим на следующей картинке, что происходит, когда у нас network не shallow, а deep, два или три слоя.
Картина совсем меняется. Что важно, что этот оператор, тоже начинаем с какого-то начального условия, я хочу добавить, что это оператор содержит очень много eigenvalues. Я здесь делаю плод только plot eigenvalues, которые отличаются от нуля. Там их очень много. Динамические eigenvalues, динамические собственные значения здесь увеличены. Здесь самый важный момент, что картинка совершенно не симметрична – что-то уползает влево, что-то уползает вправо. С правой стороны у нас формируется такой горбик, с левой стороны такие run away. Что означает эта стрелочка, которую здесь рисую, я расскажу немножко позже. Но пока самое важное на предыдущей странице – это то, что есть функция разбиения, которая полностью определена оператором, и вот как этот оператор выглядит, как его собственные значения выглядят для двух разных сетей – shallow deep шоу. Всё.
Почему я сказал, что как только у нас есть функция разбиения Z, мы всё можем посчитать? Мы всё можем посчитать с точки зрения термодинамики. Пример. Возьмите логарифм этой функции разбиения, продифференцируйте по параметру β. Β – это параметр, который в статистической механике эквивалентен единице определенной температуры. Но в данном случае просто рассматривайте это как некий параметр. Если я про дифференцирую эту функцию, а если я эту функцию уже посчитал, то мне очень легко ее дифференцировать, то я это. А это у нас есть средний loss (average loss).
(00:40:00)
Это то, что мы хотим уменьшить. Хорошо, давайте теперь посмотрим, что происходит, когда мы его уменьшили до самого невозможно маленького значения, которое вообще в сети возможно. В этом случае любые его вариации, его любые производные по ŵ или по b должны быть равны нулю, потому что мы достигли минимума для этого U. Но если это так, это очень говорит о том, что этот log Z должен быть такой, что он является суммой двух величин, одна величина, которая зависит от β, другая величина, которой зависит от b и ŵ. 1/ β – это и есть температура.
Мы также очень быстро можем посчитать энтропию, зная log Z. Энтропия системы, логарифм объема возможных векторов состояния x, он тоже разбивается на две части. Есть какая-то температура, зависящая часть, и есть часть, которая зависит от их векторов b и ŵ. Я здесь особенно не распространялся, но можно показать, что эта C, если мы на него посмотрим, она показывает уровень сложности нейронной сети. Она показывает, сколько собственных векторов достаточно для хорошей аппроксимации оператора G. Какие-то собственные значения начинают стремиться к нулю, как мы уже показывали, какие-то остаются большими. Которые стремятся к нулю, мы их можем просто бросить, и ранг этой матрицы становится просто меньше в результате эволюции. В результате эволюции ранг матрицы G становится всё меньше и меньше. Это такое уменьшение complexity, которое ведет. Также уменьшение энтропии, потому что это complexity С – часть энтропии.
Здесь очень важно заметить эту деталь. В статистической механике, в термодинамике энтропия обычно растет. Здесь энтропия должна падать. Это связано именно с обучением. Эта обучающая часть делает то, что энтропия падает, комплектность сетей падает, ранг матрицы G падает. Здесь я немножко об этом говорю.
Николай Михайловский: Виталий, тут в чате возникает дискуссия о нильпотентности матрицы.
Виталий Ванчурин: Отлично. Почему для feedforward сетей матрица обязательно нильпотентна? Хороший вопрос. Когда возводим матрицу в какую-то степень, реально не нулевые элементы этой квадратной матрицы, это от какого-то нейрона не к следующему. Я вернусь к этой картине. Это у нас здесь матрица перехода. Это девять на девять матрица. Много-много нулей. Не ноль, когда column соответствует этому нейрону, а row соответствует этому нейрону. Я начинаю ее возводить во вторую степень. Теперь этот элемент не ноль, только когда column соответствует этому нейрону, а row соответствует этому нейрону. Нужно пройти через раз. Понятно, что теперь не нулевые элементы, только которые ведут отсюда сюда, только потому, что у этих стрелочка в эту сторону.
Теперь я возвожу эту же матрицу в третью степень. Теперь не существует этих, которые идут раз, два, три, уже никуда. Матрица в третьей степени для этой нейронной сети будет равна просто нулю. Она нильпотентна. Если бы мы к этому нейрону добавили бы link, который идет сюда, она сразу перестает быть нильпотентной. У нас для любой степени n всегда существует path (траектория), для любого n .
(00:45:03)
А для этой сети только два. Спасибо, отлично. Это свойство только для feedforward. Как только мы начинаем что-то усложнять, что-то перебрасывать назад, то это свойство пропадает.
Возвращаемся. Average loss падает, и loss, который на поверхности, и в bulk. Температура падает. Это говорит о том, что наше распределение начинает сужаться и сужаться к правильным значениям. Энтропия падает. Это очень важный момент. Вся физика у нас крутится на том, что энтропия растет, а если система обучающая, то энтропия падает. Это ключевой момент. Это момент, я покажу, что и численно можно посчитать и подтвердить. Соответственно, у нас возникает второй закон of learning или можете называть минус второй, где всё то же самое, как во втором законе термодинамики, только энтропия должна всё время падать.
Дальше идем. Теперь рассмотрим переходы. Она падает, и она становится самой маленькой энтропии именно в равновесии. Теперь давайте посмотрим пример перехода системы из одного состояния равновесия в другое, третье при какой-то температуре. В этом случае параметр, который должен равняться нулю, не изменяться, это не энтропия, а свободная энергия, который также содержит части из энтропии. Ту т я немножко должен пройтись быстрее. Что такое свободная энергия, я вам показал. Но именно этот момент, что изменение энтропии должно равняться нулю, нужно немножко больше описывать, чтобы наступило полное понимание. Но здесь нет никакой разницы нет между термодинамикой. Основная разница – это то, что обычно термодинамическая система достигает минимум свободной энергии, а обучающая система достигает максимум свободной энергии. Но и в том, и в другом случае изменение свободной энергии dF равно нулю. И в том, и в другом случае у нас есть первый закон термодинамики, или первый закон обучения, где говорится, что, если у вас изменяется U, то у вас будет изменяться и общая энтропия. У вас будет изменяться complexity или ранг матрицы G.
Что здесь происходит? Этот эффект я тоже пронаблюдал. Допустим, вы долго-долго-долго тренируете сетку, и продолжаете тренировать ее тренировать, а у вас всё равно веса гуляют туда-сюда, потому что каждый раз вы уменьшаете не U, которое вы хотите уменьшить, а H. Вы видите какую-то ошибку, вы поменяли веса, увидели ошибку – поменяли веса. Но не факт, что это будет изменять среднее значение вашего loss. U у вас всё равно гуляет, и гуляет энтропия, но гуляют они связано, таким образом.
Перейдем дальше к, наверно, самому важному – результату. Это теория. Теперь давайте мы попробуем применить это к архитектуре. Я хочу показать, как изменяется complexity, как изменяется сумма больших собственных значений оператора G, они падают. G становится меньшего и меньшего ранга. Или как меняется complexity как функция от loss – то же самое, идет падение, но здесь уже более линейное.
До сих пор мы разбирали только распределение вероятности по x для состояния state of neurons. Параметры b и ŵ мы держали фиксированными, думали о них, как внешние параметры. Мы зафиксировали b и ŵ и посчитали распределение вероятности, как она меняется. давайте теперь немножко обобщим эту задачу. B и ŵ тоже имеют возможность быть описаны, как векторы распределения, и они могут гулять.
(00:50:09)
До того, как я оглашу этот принцип, давайте сконцентрируемся на этой части этого слайда. Всё, что нам дает конкретная нейронная архитектура, она дает нам эти две функции – b(q) и ŵ(q). Q – это у нас и есть параметры, которые являются динамическими, a b(q) и ŵ(q) – возможные значения этих функций говорят, что в этой матрице весов может гулять. Как мы видели, в нильпотентных матрицах многие элементы ŵ равны нулю. Так что эти функции очень простые. Там ŵ два, три, если нет линка, идущего то трех к двум, будет равняться нулю. Но, задав эти две функции, я описал нейронную архитектуру, я описал, что и как должно двигаться и меняться, что является динамическим в этом вектор b, и что являет динамическим в этой матрице.
Я не знаю, какая система является оптимальный, поэтому предлагается здесь такой принцип. Оптимальная – это которая хорошо изучает сеть. Здесь я говорю следующее. Давайте оптимальная система будет такая, при которой энтропия будет разрушаться с наименьшей скоростью. Для чего мне это нужно? Я хочу, чтобы обучение шло, но возможность получения разных решений уменьшалась, как можно меньше. Я хочу иметь много разных возможностей получить правильное решение при определенном β. Я увеличиваю β, количество решений всё равно становится меньше и меньше, но я хочу всё равно иметь архитектуру, которая мне дает много возможных решений. Почему? Потому что есть предположение, что решение будет не одно, решений всегда будет много, но архитектура может сильно урезать мои возможности нахождения тех решений. Поэтому я хочу, чтобы энтропия падала, она будет падать, но с минимальной скоростью. Примерно так.
А дальше математика. Как только этот принцип озвучен, что я хочу от архитектуры, я считаю то, как падает энтропия. Здесь энтропия уже не по параметру x, а по параметру q. Q является моей статистической переменной. Каждое значение q определяет b и ŵ. Q – это то, что гуляет, то, что то на чём мы будем строить распределение, p (q). Это у нас энтропия, минус энтропия, это будет destruction value. Я увеличил β, уменьшил температуру, я приблизился к хорошему ответу, но я хочу, чтобы в этот момент архитектура была такая, чтобы эта энтропия не сильно уменьшилась.
Потом я это считаю фактически, использую здесь один момент, который пришел из термодинамики. Это то, что q с β будут изменяться в направлении градиента свободной энергии. А уж когда я найду равновесие, там свободная энергия будет равна нулю, и q перестанут изменяться. Считаю эту entropy destruction (разрушение энтропии), потом говорю – давайте как самое простое предположим, что эти q являются просто собственными значениями нашего оператора G, который, как я предполагаю, является определяющим. Подставляю и считаю. Это получается лапласиан свободной энергии. Я считаю, чему равен лапласиан свободной энергии и получаю это выражение, и говорю следующее, что нужно найти нейронную сеть, при которой это минус лапласиан f как можно меньше. Если этот минус лапласиан как можно маленький, эффективность нахождения решение будет самой большой. Вот и всё.
Теперь уже для каждой конкретной архитектуры я могу посчитать G, и могу понять, хороший лапласиан или не хороший. Хорошие G будут давать хорошие лапласиан, слабое разрешение энтропии и много вариантов получения решений, а плохие архитектуры будут давать другие G, при котором минус лапласиан будет больше.
(00:55:05)
Я быстро пройду через этот слайд, потому что время уже истекает, а это панчлайн. Эффективность обучения – это минимизация минус лапласиана. Что за вычисления я здесь делаю? Я понимаю из предыдущих рассуждений, что собственные значения оператора G будут двигаться влево и вправо, и я хочу понять, как устроено ΔF. Здесь у меня есть плот ΔF для разных значений β. Но я считаю ΔF в очень простом приближении, когда я беру все собственные значения, разделяю на две части – на часть которая маленькая, fraction, мало собственных значений, и много собственных значений. Меня интересует, куда начнет двигаться маленькая часть собственных значений. Что здесь мне это говорит? Что изначально все они стартуют около нуля, собственные значения какие-то пойдут вправо, здесь становятся, какие-то пойдут влево. Но как температура падает, β растет, теперь какие-то значения могут продолжать двигаться налево, вправо уже особо движения нет. Потом здесь возникает такой максимум, в конечном итоге уже ни влево, ни вправо собственные значения двигаться не могут. Те, которые успели перешагнуть через этот горбик, они здесь застрянут.
Это то, что мы видели здесь. У нас есть собственные значения. Это начальное условие. Что-то пошло вправо, что-то пошло влево. Теперь эта стрела имеет значение, это как раз показывает горбик, и собственные значения начинают катиться налево. Если у меня архитектура позволяет это движение, позволяет, чтобы собственные значения G были несимметричные, то изучение будет эффективно.
Теперь мне просто надо посчитать одну простую вещь – для каких архитектур собственные значения G могут быть эту ассиметрию. Это очень просто. Мы просто считаем вариацию (skewness). Это показывает, как распределение может расширяться. А µ3 показывает, как она может быть несимметрична, когда вправо идет больше, а слева больше tail. Я это считаю, и результат такой. Если у вас сеть shallow, то эти все нечетные статистические моменты равны нулю. Это исходит из нильпонентности матрицы. Как только у вас добавляется больше и больше слоев, это уравнение уже становится не справедливо для многих n, и этот параметр µ3 становится больше и больше. Чем больше параметр µ3, тем больше распределение может быть несимметричное, и тем лучше обучения.
Мне нужна помощь Николая, потому что здесь подали вопрос про residual networks. Я, будучи физиком, не знаю, что это такое.
Николай Михайловский: Гриша, для целого ряда архитектур не совсем понятно, как то обобщение нейронных архитектур, которое делает Виталий, работает. Но для residual networks, если сейчас сразу думать, там будет не блочно-диагональная матрица, а там будет несколько блочных наддиагоналей. Residual networks – это такая сеть, в которой между удаленными слоями есть связи.
Виталий Ванчурин: Это всё равно нильпотентная.
Николай Михайловский: Она, по сути, будет нильпотентной. Для трансформеров мне непонятно, как отобразить на стандартную архитектуру Виталия.
Виталий Ванчурин: Чтобы ответить на вопрос, да, если вы просто пропускаете какие-то слои, все равно это становится нильпотентно.
(01:00:03)
Это наводит определенные ограничения на статические моменты, которые можно посчитать и понять. Мы ответили на этот вопрос, может двигаться дальше?
Николай Михайловский: Думаю, да.
Виталий Ванчурин: С точки зрения описания алгоритма, я думаю, это самое важное здесь. Это для определенной архитектуры вы читаете эти моменты µ1, µ2, µ3, и понимаете, до такой степени она хорошо обучается. А этот график – просто иллюстрация, что да, действительно, мы видим, что собственные значения не симметричны. Даже можете не считать, а просто посмотреть, как ведут себя эти собственные значения оператора G. Если они так расходятся влево и вправо, у нас задача, чтобы эти, которые идут влево, и как можно больше убежало налево. Почему? Потому что это и есть compression, это и есть уменьшение сложности нейронной сети. Только большие собственные значения, посчитав их, вы поймете ранг матрицы. A всё, что уходит влево, это уменьшает complexity.
С точки зрения нейронных архитектур это показывает, почему deep хороши. Они не накладывают эти определенные ограничения распределения вероятности. А shallow такие, более ограничивающие.
Давайте последний слайд про физику, потому что я – физик, и потому что мне показалось это интересным. Самый основной, наверное, месседж – это то, что в физике мы не думаем, что энтропия может падать. У нас она всё время растет, но здесь она падает. Это падение энтропии очень важно. Я рассмотрел это падение энтропии с точки зрения квантовой механики. Это основной результат.
Используя этот принцип minimal destruction of entropy в более научном понимании можно посмотреть, как двигаются распределения вероятности по этим q с учетом того, что свободная энергия тоже эволюционирует определенным образом. Что получается интересно? забудьте пока квантовую механику. Уравнения движения q для распределения вероятностей по q, по весам и bias vector, может быть описано называется уравнением, которое называется маделунговское уравнение. Чем это маделунговское уравнение интересно? В нём квантовая механика описывается не через state вектор, вектор состояния, (пси комплексный), а через просто переменную вероятности. Но маделунговское и шредингеровское описание эквалентно. Откуда вообще взялись эти все комплексные числа в квантовой механике? Это из-за этого F, свободной энергии. Свободная энергия, про которую мы разговаривали, она не что иное, как фаза. Если мы возьмем, напишем корень из p, умноженное на еif, это объект, где мы просто в одном уравнении описали и p, и распределение вероятности, и свободную энергию, этот объект как раз эволюционирует уравнением Шредингера. Но в этом смысле мы как бы делаем квантовую механику простой гидродинамикой, что описывает маделунговское уравнение, с одним небольшим твистом, это то, что у нас есть свободная энергия. Также в определенном пределе можно вывести уравнение классической механики. Но это менее странно, потому что мы знаем, что классическая механика – это предел квантовой механики в определенном пределе.
Быстро пройдусь по этому. Основная задача физики – это, конечно, не квантовая механика, мы ее хорошо понимаем, а как объединить гравитацию и квантовую механику, мы очень плохо понимаем. В интерпретации квантовой механики, которую я написал наверху, она также называется как _____ (01:05:03), там их много.
(01:05:07)
В них есть скрытые переменные, которые мы не видим. Эти скрытые переменные и есть как раз векторы состояния. Если мы будем разбирать то, как эволюционирует сам вектор состояния, то в определенном пределе мы также можем получить уравнение Эйнштейна. Но в этом случае они emergent, они не фундаментальные, а это получилось при нашем описании. И в том, и в другом случае квантовая механика и гравитация – это приблизительное описание эволюции систем.
Я прохожусь по этому быстро не из-за того, что я думаю, что что-то будет понятно, а просто показать, что идеи нейронных сетей полезны и могут описывать многие физические процессы, которые мы наблюдаем.
Третий вопрос у нас всегда был и в квантовой механике и в космологии – проблема наблюдателя. Было неясно, как еще описать наблюдателя. Но тут есть такая полусерьезная возможность. Если, действительно, весь мир – это всего лишь микроскопическая нейронная сеть, не та, которая у нас в голове, а микроскопическая, то мы можем понять, почему формируются структуры очень малой сложности, например one dimensional chains, chains нейронов, которые имеют очень большую глубокость, от одного нейрона к другому, от другому к третьему, четвертому, такие strings. Из-за того, что формируются такие strings, мы и получаем гравитацию. Это-то связанное с теорией.
Идея здесь, что мы можем также взять идею эволюции и сказать, что, если всё это – нейронная сеть, то эволюция должна проходить на всех масштабах. На самых маленьких масштабах я вижу эти strings, которые формируются, chains. Но, чем дольше мы это эволюционируем, то что-то похожее….
Да, сеть, которая изучает сама себя, потому что у нас есть какая-то bulk loss, она записана, и всё. Остальное, эта часть сети смотрит на инпуты, которые идут от соседей, из-за этого она меняет свои веса, чтобы минимально уменьшить расхождение с предсказанием этой сети, и того, что она видит снаружи. Всё время идет такое bulk, boundary.
Идея такая, что этот процесс может привести, если мы возьмем natural selection как фундаментальный принцип, то и на самых маленьких масштабах должна происходить, и на бóльших, и всех. Тут те подструктуры, которые наиболее устойчивы, они просто выживут, а те, которые менее устойчивы, они вымрут. Не вижу особенной разницы в данной интерпретации от selection, которая происходит на больших масштабах, на биологических, и на маленьких, если всё это в действительности нейронная сеть. А вычисление квантовой механики подсказывает, что, видимо, что-то там есть.
Я заключаю, потом приму вопросы. Два основных месседжа. Первое – то, что физика очень полезна для машинного обучения. Первое – это то, что действительно можно подумать, как обобщить нейронные архитектуры через этот neural septuple. Существует еще более тривиальное обобщение, когда у нас векторы состояния теперь живут в другом поле. Они не обязательно должны быть реальные, могут быть комплексные, но я уже про эти обобщения и не говорю, они straightforward. Можем конструировать новые loss functions. Мне кажетс, что bulk loss интересна, потому что она по предсказанию не сильно отличается, но она лучше описывает, в какой степени какая-то сеть прошла ближе к правильному ответу. Когда количества нейронов становятся большие, я думаю, кроме термодинамики, мы мало, что мы можем сказать, потому что это тот инструмент, который мы разработали. Я думаю, он здесь полезен в физике.
Если принцип minimum entropy destruction действительно правильный, и действительно мы хотим, чтобы наши решения не просто сходились к лучшему результату, а сходились к лучшему результату, который имеет наибольшую энтропию, к большому количеству хороших результатов, туда легче попасть просто, тогда мы можем разрабатывать те архитектуры, которые позволят именно это схождение, и тут видно, почему deep network лучше.
(01:10:12)
Матрицы менее нильпотентные, нежели shallow. И в обратную сторону все тоже, наверно, сработает. Квантовую механику, видимо, мы сможем вывести, с теорией относительности всё гораздо сложнее, есть какие-то обнадеживающие результаты. Но на этом не должно всё ставиться, потому что есть много феноменов, которые emergent, и понять, какие они, и что за ними стоит на разных масштабах, было бы интересно. На этом, наверно, всё. Какие вопросы?
Николай Михайловский: Спасибо большое, Виталий, очень интересно. Коллеги, помимо тех вопросов, которые уже задавали, призываю вас задавать вопросы еще. Уже у нас в чате что-то пишут. Пишут, что интересно.
Виталий Ванчурин: Если кто-то голосом хочет задать вопрос….
Николай Михайловский: То поднимайте руки.
Виталий Ванчурин: В какой последовательности лучше считать, что будет в продолжении? Я нарисовал этот круг от физики к машинному обучению и обратно. Я думаю, я по этому кругу продолжу работать. Я возвращаюсь во вторую часть и пытаюсь понять. Пока я брал только Гауссовы интегралы. Физику, которую я применял к машинному обучению, она тривиальна. Что было бы более интересно – это взять уже теорию возмущений, уже отходя от Гауссовых интегралов. Тогда мы можем действительно нелинейность f, функции активации, раскладывать с разной степенью порядков и смотреть, какие можно предсказывать, изучать пертурбативные эффекты. Я думаю, в эту сторону было бы интересно. Пока вопросов больше, чем ответов.
Да, это очень интересный вопрос. почему? Потому что сети, которые я разбираю, классические нейронные сети. Квантовая механика, которая получается, она emergent, она не фундаментальна. Естественно, с точки зрения теоретиков мы могли расширить это понятие и разобрать квантовые нейронные сети, где какие-то параметры являются квантовыми. Что-то подобное делал Двали в Мюнхене. Возможно, это правильно. почему? Потому что если даже квантовая механика emergent, никто не говорит о том, что приближение нейронных сетей, где некоторые параметры являются квантовыми, неправильно. В этом случае это описание было бы интересно.
С точки зрения машинного обучения и прикладной части, я думаю, мы далеки от квантовых нейронных сетей, как от Марса. Я не вижу, что вот-вот вот квантовые компьютеры вместе с TensorFlow начнут приносить какие-то результаты. Но с точки теоретика, конечно, это интересный и важный вопрос, хотя, наверно, вам виднее. Вы знаете лучше, какие последние успехи у Google, IBM в построении квантовых компьютеров. Насколько я знаю, я разговаривал с разными людьми, что всё это еще в состоянии зародыша. Хотя есть некоторые у них _____ (01:14:39). Еще вопросы? Почему никто голосом не говорит? Программисты стеснительные люди?
(01:14:54)
Николай Михайловский: Потому что это запрещено. Я могу, конечно, дать всем присутствующим возможность голосом, я ненавижу за голосом, а может быть, не могу. Так что, кто хочет что-то голосом сказать, поднимайте, пожалуйста, руку.
Виталий Ванчурин: Да, пока нет подтверждения моих слов. Если этот можно. Тогда встречный вопрос. Этот Google Colab, там квантовая механика настоящая или она simulation? Не знаю. Яков подключился.
Николай Михайловский: Я просто дал Якову возможность говорить голосом. Говорят, вам что-то пишут напрямую в чат или вопросы.
Яков: Добрый день! Точно не знаю, Tensorflow Quantum сделан тоже на квантовом компьютере, но Google описывал, что в Google Colab можно работать с квантовым машинным обучением.
Виталий Ванчурин: Это настоящий квантовый? Тогда там, наверно, маленький.
Яков: _____ (01:16:52) позволяет удаленно подключаться.
Виталий Ванчурин: Я понимаю. Мы, физики, знаем только два предела, когда делать – когда количество переменных очень маленькое, один-два, и когда очень большое. Моя статья про большое. Я думаю, много чего интересного можно еще просчитать с квантовыми нейронными сетями, когда маленькое, но я об этом не задумывался. Я сразу стартовал с большого.
Технический вопрос (01:17:34)-(01:18:35)
Николай Михайловский: Яков поднял руку. Яков, у вас есть возможность говорить голосом, если вы размьютитесь.
Яков: IBM тоже позволяет просто удаленно проводить некоторые экскременты с моим квантовым компьютером. Когда Google анонсировал Tensorflow Quantum, у него тоже есть документация. Описывал и проводил эксперимент по распознанию рукописных цифр. Пока не выпустили статью. У Tensorflow Quantum будет документация в открытом и будут показывать примеры программировать.
Виталий Ванчурин: Интересно. Преимущество квантовых нейронных сетей доказано?
Николай Михайловский: Следует изучить.
Виталий Ванчурин: Мне даже достаточно теоретического доказательства преимущества. Я – теоретик, если теоретически доказано. Иногда приписывают, почему бы и нет, я знаю квантовую механику, давайте я попробую. Иногда это может показать, что действительно есть превосходство для решения определенных задач, и тогда интересно было понять, в чём превосходство именно квантовой части над не квантовой.
(01:20:03)
Яков: В документации пишут, что хотя бы на базовом уровне желательно знать квантовую механику перед перепрограммированием.
Виталий Ванчурин: Квантовая механика – это просто.
Яков: Tensorflow Quantum потом выдаст документацию по нему. Только, конечно, документация не очень, отстает пока еще от других.
Виталий Ванчурин: Понятно, спасибо.
Николай Михайловский: Я очень рад тому, что сегодня собралась большая аудитория. Из 50 зарегистрировавшихся у нас сегодня по максимуму было 30 человек, что лучше средней конверсии. Здесь присутствует несколько очень уважаемых мною людей, в том числе, Григорий Сапунов, который задавал нам вопросы, Николай Швырев, который сидел тихонько. Кстати, я рад анонсировать следующий наш вебинар через две недели, 8 сентября, который собственно Николай Швырев будет проводить про распознавание речи на мобильных устройствах. Поэтому я всех присутствующих приглашаю. Николай – человек, который долго-долго занимается распознаванием речи, занимался ей еще со времен классического распознавания речи, был maintainer CMU Sphinx – одной из ведущих open-source систем распознавания речи, которая делалась в Carnegie Mellon. Сейчас занимается новыми нейронными системами распознавания речи. Очень всех приглашаю. Николай – один из лучших известных мне специалистов в области распознавания речи. Большое спасибо всем. До свидания и до новых встреч у нас.
Виталий Ванчурин: Спасибо. До свидания.
(01:22:14) (Конец записи.)