Ну наконец-то, в первый раз на хабре вижу в ссылках имя Mohri, написанное не мной :). Риспект. Но все же яндекс очень отстает в ASR. Во-первых, ничего не сказано про языковые модели. Скорей всего вы делаете это старыми добрыми n-gramm'ами, но RNN-модели работают гораздо лучше. Во-вторых, после RBM уже появилось довольно много способов тренировки «глубокой» нейронной сети. Странно что у нас почти нет статей на эту тему. В тетьих — появляются медоды получения фич минуя MFCC и прочие костыли. Вы это пробовали?
Спасибо.
Если вы хотите понять принципы работы нервной системы, тогда нужно ей и заниматься. И к роботу приступить, лет через 50, когда хоть что-то станет понятно :). А что касается «моделирования мозга» — воссоздание динамики работы ЦНС еще ничего не дает. Я уже не помню сколько раз кричали о создании симуляции мозга крысы-кролика-человека. Ок, приблизительно воссоздали динамику активаций. Что дальше-то?
Я бегло посмотрел книгу. Там описываются принципы работы нейронов нервной системы. Вы можете более конкретно описать, как это может в конкретном случае — например, при навигации, или распознавании объектов?
Почему не динамические системы, HMM, SVM, или какие-нибудь марковские поля? Почему нейронные сети?
То что они чуть ближе к биологическим системам это не значит того, что именно так работает мозг человека. Да и в конце концов, почему алгоритмы робота должны быть подобны биологическим системам?
Ну допустим, вы возьмете все же нейронные сети. Для каких задач будете использовать? Если это моделирование последовательностей, опять куча вопросов. Это рекуррентная сеть? Как тренировать, ведь обычный сильно BPTT лажает? Какая инициализация, сколько слоев, какие длины последовательностей, регуляризация?
Учитывая то, что процесс зрительного восприятия у людей многоуровневый (различные уровни наших нейронных сетей обрабатывают разные свойства изображения), то мне пришла идея использовать несколько плат BeagleBone Black или Parallela, соединенных иерархически. Каждая плата будет выполнять свой алгоритм, максимально утилизирующий мощность процессора и количество свободной памяти, передавая данные дальше по цепочке для дальнейшей обработки
Какие именно алгоритмы? Почему нейронные сети? Зачем соединять иерархически?
Согласен. Иногда лучше вообще не минимизировать :). Вообще, там есть такая штука, как ленивая композиция. Очень эффективная, когда приходится строить композицию больших автоматов, а потом искать кратчайший путь. Но ее тяжеловато использовать — функция не вынесена в шелл-скрипты, и документации мало.
Для трансдьюсера не существует способа минимизации. То есть минимизировать можно, но автомат в результате не будет гарантированно минимальным (и единственно возможным). Чтобы детерминировать трансдьюсер, нужно чтоб выполнялось свойство проективности, а это на практике редкость (на моей, по крайней мере). Но есть разные обходные пути, типа воспринимать пару символов a:b как оду метку, минимизировать как обычный акцептор.
А чем вам OpenFST не нравится? Ребята хорошо потрудились. Правда, в погоне за универсальностью вышло тяжеловесно. Но вцелом, работает.
Сергей, у вас отличные посты. Продолжайте в том же духе.
Вопрос по loopy belief propagation. Я несколько раз сталкивался с граф. моделями, и все никак не мог понять «легитимность» этого алгоритма.
Обычно, в книжках рассуждается так. Вот есть задача марджинализации. В лоб — нерешаемо, придумываем умный способо суммирования пользуясь факторизацией графа. Называем блоки произведений-суммирований «сообщениями» и передаем эти «сообщения» вдоль графа чтобы маргинализовать нужную переменную (или группу переменных).
А потом, внезапно, берут те же «сообщения» и применяют к циклическому графу. Но ведь изначальный смысл маргинализации при этом как-то теряется, и получается что мы оперируем придумаными терминами типа «message passing», забыв откуда это вообще взялось. Так было, к примеру, в курсе pgm на курсере. И еще где-то втречал такой подход…
Не могли бы вы пояснить этот момент, ну или дать ссылку на хорошее описание этого алгоритма.
Вобщем, да, minibatch — это разновидность стохастического градиентного спуска, где мы считаем следующий шаг спуска на основе части выборки, а не на всем объеме данных, как в классическом градиентном спуске. Это во-первых, ускоряет обсчет градиента, во-вторых позволяет (теоретически) избежать локальных минимумов.
Ну а параллелить можно так — разбить данные на куски, взять несколько кусков в пулл и обсчитывать параллельно. Обновлять параметры по мере обсчета каждого из кусков. Хотя, думаю, есть и другие способы распараллеливания.
В общем математически то оба алгоритма стоят на одной ступени, но мы то знаем что один чуть выше -)
Т.е. градиент выше, или EM? :) Вообще градиентный спуск хорош тем, что его можно превратить в стохастический или minibatch и хорошенько распараллелить. Не уверен что с EM так же просто получится.
Можете все же подробней про алгоритмы? Как устроена навигация, прокладка маршрута? Строите ли карту? Есть ли какой-нибудь высокоуровневый планировщик? Как сглаживаете шум датчиков?
В статье уклон в железо, хотя по мне это не самое интересное.
Раз вы вне конкурса, то небольшой спойлер не повредит :).
Ну смысл предварительной настройки весов вобщем-то понятен. Но я немного о другом. В той статье что я привел (да и в куче последующих у коллег Хинтона) используется не вычисление градиента как в стандартном backprop, а вычисление гессиана. Точнее, не гессиана а его приближения, т.к. сам гессиан конечно никто считать не будет. Т.е. фактически инициализация весов не важна — важен сам способ оптимизации.
По-моему в питоновском theano все функции для этого есть. Нужно попробовать.
И еще один момент. Вроде как товарищи из той же компании что и Хинтон говорят что можно достичь хорошего обучения и без при-тренинга через один из квазиньютоновских методов. Не пробовали, случаем?
Вот статья: Martens, J. (2010). Deep learning via hessian-free optimization
ps я практически не занимался дип ленингом и нейросетями, просто интересно
Замечание о графиках: поскольку нас фактически интересует способность сети правильно распознавать эмоции, а не минимизировать функцию ошибки, обучение продолжается, пока эта способность улучшается, даже после того, как функция ошибки начинает расти.
Не понял этот момент. А как вы понимаете что способность распознавать эмоции все еще улучшается?
Но в любом случае, из вашего ответа, все не так уж плохо. Удачи в вашем деле!
Спасибо.
Это не совсем так. Сейчас сильно развиваются методы representation learning, которые спосбоны выучить эффективные признаки из сырых данных.
Не думаю что это такая уж закрытая информация. С другой стороны, интенресно же :).
Спасибо.
Если вы хотите понять принципы работы нервной системы, тогда нужно ей и заниматься. И к роботу приступить, лет через 50, когда хоть что-то станет понятно :). А что касается «моделирования мозга» — воссоздание динамики работы ЦНС еще ничего не дает. Я уже не помню сколько раз кричали о создании симуляции мозга крысы-кролика-человека. Ок, приблизительно воссоздали динамику активаций. Что дальше-то?
Я бегло посмотрел книгу. Там описываются принципы работы нейронов нервной системы. Вы можете более конкретно описать, как это может в конкретном случае — например, при навигации, или распознавании объектов?
То что они чуть ближе к биологическим системам это не значит того, что именно так работает мозг человека. Да и в конце концов, почему алгоритмы робота должны быть подобны биологическим системам?
Ну допустим, вы возьмете все же нейронные сети. Для каких задач будете использовать? Если это моделирование последовательностей, опять куча вопросов. Это рекуррентная сеть? Как тренировать, ведь обычный сильно BPTT лажает? Какая инициализация, сколько слоев, какие длины последовательностей, регуляризация?
Какие именно алгоритмы? Почему нейронные сети? Зачем соединять иерархически?
А чем вам OpenFST не нравится? Ребята хорошо потрудились. Правда, в погоне за универсальностью вышло тяжеловесно. Но вцелом, работает.
Вопрос по loopy belief propagation. Я несколько раз сталкивался с граф. моделями, и все никак не мог понять «легитимность» этого алгоритма.
Обычно, в книжках рассуждается так. Вот есть задача марджинализации. В лоб — нерешаемо, придумываем умный способо суммирования пользуясь факторизацией графа. Называем блоки произведений-суммирований «сообщениями» и передаем эти «сообщения» вдоль графа чтобы маргинализовать нужную переменную (или группу переменных).
А потом, внезапно, берут те же «сообщения» и применяют к циклическому графу. Но ведь изначальный смысл маргинализации при этом как-то теряется, и получается что мы оперируем придумаными терминами типа «message passing», забыв откуда это вообще взялось. Так было, к примеру, в курсе pgm на курсере. И еще где-то втречал такой подход…
Не могли бы вы пояснить этот момент, ну или дать ссылку на хорошее описание этого алгоритма.
Вобщем, да, minibatch — это разновидность стохастического градиентного спуска, где мы считаем следующий шаг спуска на основе части выборки, а не на всем объеме данных, как в классическом градиентном спуске. Это во-первых, ускоряет обсчет градиента, во-вторых позволяет (теоретически) избежать локальных минимумов.
Ну а параллелить можно так — разбить данные на куски, взять несколько кусков в пулл и обсчитывать параллельно. Обновлять параметры по мере обсчета каждого из кусков. Хотя, думаю, есть и другие способы распараллеливания.
Т.е. градиент выше, или EM? :) Вообще градиентный спуск хорош тем, что его можно превратить в стохастический или minibatch и хорошенько распараллелить. Не уверен что с EM так же просто получится.
В статье уклон в железо, хотя по мне это не самое интересное.
Раз вы вне конкурса, то небольшой спойлер не повредит :).
По-моему в питоновском theano все функции для этого есть. Нужно попробовать.
Вот статья: Martens, J. (2010). Deep learning via hessian-free optimization
ps я практически не занимался дип ленингом и нейросетями, просто интересно
Не понял этот момент. А как вы понимаете что способность распознавать эмоции все еще улучшается?