Pull to refresh
20
0
Dmytro Panchenko @roryorangepants

Senior ML Engineer

Send message
Зачем очередная статья про то, как писать нейронные сети с нуля?

Действительно, зачем? Предыдущая была меньше недели назад. Я читаю этот хаб четвертый год, и вижу, что подобные статьи выходят с завидной регулярностью.

Увы, я не смог найти статьи, где были бы описаны теория и код с нуля до полностью работающей модели. Сразу предупреждаю, что тут будет много математики.

Вы плохо искали.
Ну или сработало когнитивное искажение — автор долго разбирался с нейросетями, статьи не помогали, а когда автор таки разобрался, ему показалось, что теперь-то он может описать лучше.
Да, я тоже увидел эту статью, но:
1. AutoML -> Automated machine learning, а «machine learning» — это «машинное обучение».
2. Статья на русской вики — это перевод статьи на английской, сделанный человеком, не являющимся экспертом в предметной области, а все ссылки там ведут на англоязычные источники, так что скорее надо поправить название статьи на вики, мне кажется.
3. Если загуглить «автоматическое обучение машин», находится «автоматические машинное обучение».

Понимаю, что вопрос спорный, но мне кажется, что такой вариант звучит лучше.
Переводить AutoML как «автоматического обучения машин» в заголовке некорректно.
Вообще для этого термина в русском ещё нет аналога, но если переводить дословно, как минимум, это «автоматическое машинное обучение».
Если честно, я не помню, когда Отус в последний раз публиковал что-то по ML, не обосравшись по полной, но этот раз превысил все пределы.

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

Рис. 1. Исследования в области искусственного интеллекта (ИИ) Источник: [1].

Во-первых, в источнике 1 этой схемы нет. Вы студентов статьи писать садите? А то у них есть привычка ссылки на литературу от балды накидывать знаете ли.
Во-вторых, когда вы делаете классификацию чего-то (например, доменов ИИ, как здесь), надо четко понимать признак, по которому делите. Например, Robotics — это область применения, NLP — это класс задач, а Machine Learning — это группа алгоритмов. Их нельзя класть в один уровень разделения.

Глубокое обучение является передовой областью исследований машинного обучения (machine learning — ML). Оно представляет из себя нескольких скрытых слоев искусственных нейронных сетей. Методология глубокого обучения применяет нелинейные преобразования и модельные абстракции высокого уровня на больших базах данных. Последние достижения во внедрении архитектуры глубокого обучения в многочисленных областях уже внесли значительный вклад в развитие искусственного интеллекта.… Кроме того, представлены выгода и преимущества методологии глубокого обучения в ее многослойной иерархии и нелинейных операциях, которые сравниваются с более традиционными алгоритмами в обычных приложениях.

Господи, да это же просто дичь и вода. Вам уже сто раз писали — не садите людей без технических знаний за перевод статей по сложным темам (таким, как ML).

Кластеризация, байесовская сеть, глубокое обучение и анализ дерева решений — это только их часть.

Передаю привет автору оригинала, который поставил эти четыре термина в один ряд.

Концепция глубокого обучения (Deep Learning — DL) впервые появилась в 2006 году как новая область исследований в машинном обучении. Вначале оно было известно как иерархическое обучение в [2], и как правило оно включало в себя множество областей исследований, связанных с распознаванием образов.

Deep learning появился в восьмидесятых (термин введен в 1986), и в источнике 2 про это ничего не написано, автор опять нагло лжёт.

и обучение под наблюдением или без него

Google Translate от «supervised learning». К вашему сведению, это переводится как «обучение с учителем».

Позже в 2006 году жадный алгоритм и иерархия были объединены в приложение, способное обрабатывать рукописные цифры [7]

Какая иерархия? Опять надмозговой перевод?
И, кстати, вас не смущает, что ссылка 7 ведет на статью по NLP 2017 года?

Эффективность CNN может достигать 99,35% точности [16].

Сейчас бы в задаче биометрической аутентификации использовать accuracy как метрику. И ссылка 16, разумеется, ведет на совсем другую статью.

В последнее время идентификация на основе изображения лица изменилась на автоматическое распознавание путем определения возраста и пола в качестве исходных параметров.

Это две разных задачи, которые ни в коем случае не являются заменой друг друга.

В результате был достигнут PER на уровне 20,07%. Полученный PER лучше по сравнению с ранее применяемым 3-слойным методом базовой линии нейронной сети

«Базовой линии». Kill me please, переводчик не понимает, что несёт.

Очевидно, что постепенное увеличение числа публикаций мог бы описать экспоненциальный рост. Оригинал: Clearly, there is a progressive increment of publications
that could describe an exponential growth

Ничего, что вы перевернули смысл предложения?

Про анализ публикаций вообще смешно говорить. В выборке какие-то байесовские сети, когда очевидные тренды последних семи лет — это CNN в CV и всякие рекуррентные / сверточные архитектуры в NLP.
В анализах трендов 2017 год, хотя я смотрю в календарь и вижу 2019.

Вот в таких случаях большая производительность чистого C#-кода заметна. Просто рабочий момент, на который обращается внимание, когда один и тот же код пишешь там и здесь.

Справедливо. Но тогда Python-код можно скомпилировать через numba и опять таки получить перфоманс, который в C# так просто не выжать.

Или тот момент, который я приводил в статье — когда в качестве фичи передается то, что классификатор выдал для предыдущих сэмплах.

Код я не смотрел, а в статье я такого почему-то не вижу.
Linq. Они намного удобнее, чем List Comprehension (LC) в Питоне.

Так в ML у вас pandas / numpy стек должен быть, и list comprehensions в норме в коде вообще не должны встретиться.

Интересно, кто как встраивает Python-код в свои проекты на .Net. Опишите свои сценарии и ощущения от них в комментариях, пожалуйста.

Микросервисы. Однажды был вариант, где из другой инфраструктуры Python дергали через баш как скрипты — после этого точно микросервисы.

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

Очень спорное утверждение. Scientific Python stack позволяет писать хорошо векторизированный код очень легко, а C# с ним по перфомансу никогда не сравнится.
В приведеной Вами же ссылке есть еще одно рассуждение про выпуклости, но для ценителей, которое полностью не совпадает с Вашим примером.

Ну всё, сейчас у меня прямо бомбануло. Каким же надо быть тупым, чтобы приводить в качестве аргумента цитату, в конце которой прямым текстом написано:
Hence the function is not convex.

Лосс не выпуклый и не вогнутый. Лосс имеет сложный ландшафт, и, да, в нём есть локальные минимумы. Кому-то нужно пройти курс вышки.

Вам приведен, опровержения, кроме словоблудия, не последовало.

Опровержение частного случая? Алло, логика, как слышно?
Изначальное высказывание было в том, что скор 0.85 можно интерпретировать как «пропускается один объект из семи». Я объяснил, почему эта интерпретация неверна и привел контрпример.
Контрпример — это достаточный аргумент для опровержения утверждения. Пример — недостаточный аргумент для доказательства. В последний раз, когда я проверял, это так работало.

Если мозг отказывается переваривать сложные конструкции, переведу на язык простых примеров:
— У вас написано «треугольник». К вашему сведению, все треугольники равносторонние.
— Нет, это не так.
— Как это? Вот я взял треугольник с тремя углами по 60 градусов, и у него все стороны равны.
Предлагаю вашему острому уму самостоятельно вывести, какие реплики в этом диалоге соответствуют гениальным примерам про каждый седьмой корабль.
Так и у Вас кросс энтропия с локальными минимумами, а у всех выпуклая.

А этот текст из приведенного Вами обсуждения только для ценителей

The cost function of a neural network is in general neither convex nor concave.

Вы ещё и по-английски не понимаете, да? Там написано, что в общем случае она ни выпуклая, ни вогнутая.

Ещё раз повторю. Если вы рассматриваете кроссэнтропию как функцию от двух векторов, она в этом пространстве выпуклая.
Однако в случае нейросети у вас один из векторов сам зависит от параметров сети. И эта функция уже не выпуклая.

Объясню на упрощенном примере:
y(x) = x^2 — выпуклая функция относительно x
Но если x = x(t) = sin(t) в свою очередь, то:
y(t) = x^2(t)
не выпуклая.

Так и с нейросетью.
CCE(y_true, y_pred) выпуклая в координатах этих игреков. Но y_pred = f(x), где x — входная картинка, а f — ни много, ни мало, вся нейросеть.

А поскольку градиенты CCE мы считаем именно по параметрам сети, скрытым внутри нашего f, то CCE(y_true, f(x)) — это суперпозиция функций, которая может иметь и плато, и локальные минимумы, и седловые точки.

Мне жаль, что мне приходится это объяснять человеку, который публиковал на хабре статьи про нейросети.
Вернее не так. Мне жаль, что человек, которому такое нужно объяснять, публиковал статьи про нейросети.

P.S. Я надеюсь, что окончательный переход к обсуждению моей статьи вместо оригинального топика, означает, что вы наконец смирились с ошибочностью своих изначальных утверждений.
В математике, в отличе от болтологии, одного примера достаточно. И, как правило, там где один пример, вдруг внезапно их оказывается много.

Вон оно как. Хороший принцип.
Ну вот, например, математики над проблемой Гольдбаха 250 лет бьются, а ларчик-то просто открывался! Гений своего времени ChePeter пришел, пару чисел на сумму разложил, сказал: «В математике одного примера достаточно», и задача решена. Так что ли?

Да и локальные мининумы кросс энтропии тоже удивительное явление.

Мне кажется, здесь имеет место фундаментальное непонимание того, как обучается сеть.
Да, если мы считаем кроссэнтропию между двумя векторами, то относительно элементов этих векторов она будет выпуклой, и никаких локальных минимумов не будет. Проблема в том, что кроссэнтропия на выходе сети зависит от ground truth и предсказания сети, а предсказание в свою очередь зависит от параметров сети. И относительно них эта функция далеко не выпуклая.
Можно чуть подробнее почитать здесь, например.
Вы опровергнуть так и не смогли. Вам приведен конкретный пример.

Простите, но если для вас единичный пример == способу интерпретации метрики, то о чем вообще разговаривать?
Ещё раз процитирую:
и лучший результат 0.85448.
Это означает, что каждое 7 судно пройдет под Керченским мостом незамеченным :-)

Это не правда. Вы интерпретируете сложную метрику, которую плохо понимаете, как accuracy.
Приводить один единственный пример, где эти величины совпали, и использовать это как аргументацию — это примерно как говорить: «Квадрат — это прямоугольник, поэтому все прямоугольники — квадраты». Если вы не понимаете, почему modus ponens не работает в эту сторону, я не вижу смысла продолжать этот спор.

И не уходите в туман от конкретного вопроса. Приведите нормальное определение используемой Вами функции.

Я не ухожу в туман. Во-первых, это не имеет отношения к предмету спора. Во-вторых, если уж вам интересно, прочитайте внимательно статью, на которую ссылаетесь. Там указано, что функция потерь — взвешенная CCE.
Дорогой roryorangepants теперь понятно?

Понятно, что вы во-первых не знаете, как расчитывается f2, а во-вторых, «удобно» рассматриваете только кейсы, когда маска совпала с кораблем на 100% (чего в реальности обычно не бывает) или на 0%.
На самом же деле, интерпретировать метрики, которые считаются over 0.5..0.95 IoU thresholds таким образом нельзя. Допустим, у меня есть модель, которая предсказывает всегда все боксы, но с IoU 0.89. С точки зрения бизнес-задачи «непропускания кораблей» она по сути не пропускает ни один. С точки зрения метрики она будет иметь TP по восьми трешхолдами и FP+FN по ещё двум.

Поэтому интерпретация скора 0.85 как «каждое 7 судно» — это полная чушь. Вы бы ещё ROC-AUC так, например, интерпретировали. А что, он ведь тоже от 0 до 1?

Вопрос: — о локальных минимумах какой функции идет речь?

Казалось бы, какое это имеет отношение к треду? Но окей, отвечу. Речь идет о локальных минимумах функции потерь.
Абсолютно не означает. Зачем заведомо вводить читателей в заблуждение?
Это означает, что каждое 7 судно пройдет под Керченским мостом незамеченным :-)

Нет, не означает. С каких пор можно интерпретировать F2@0.5..0.95 как accuracy?
Так вот она таких задач — выделение признаков при любом масштабе и ориентации тоже не решает.

При нормальной, разнообразной выборке и хорошиъ аугментациях решает, почему нет?
Reinforcement learning — это заход совсем с другой стороны. Наверняка вы помните как Google обыграл всех в Go. Недавние победы в Starcraft и в Dota. Но тут всё далеко не так радужно и перспективно. Лучше всего про RL и его сложности рассказывает эта статья.

Вы статью вообще читали?
В статье упоминаются в основном примеры работы с неструктурированными данными (картинки, тексты и т.п.), а с ними как раз в подавляющем числе реальных задач только нейросети и работают хорошо.
с отрицательной выборкой

В оригинале другое.
с вложениями слов

Никто так не говорит.
той мере, в какой совпадают названия переменных

Действительно, gensim — единственная известная мне верная реализация на C.

В оригинале другое.
Один вектор для этого слова в фокусе, а второй для слова в контексте

Кому-нибудь понятно, что имел в виду переводчик?

Дальше читал в оригинале.
На базовом уровне это описывает Ын в специализации deeplearning.ai

Это не совсем так. Ширину слоев как и глубину сети в случае обычной полносвязной сетки можно тюнить более эффективно, исходя из bias-variance tradeoff.

Information

Rating
Does not participate
Location
Харьков, Харьковская обл., Украина
Registered
Activity