Когда знаешь модный тренд в программировании
1 помогите
2 я знаю машинное обучение
1 помогите
2 я знаю машинное обучение
Виктор Кантор расскажет аудитории, в чем состоит работа специалиста по анализу данных, и как люди попадают в эту область. «Анализ данных и, в частности, машинное обучение – это прекрасная возможность быть востребованным и работать по специальности для тех, кому нравятся математика, физика или информатика, и кто получил техническое образование. Эта область не только открывает заманчивые карьерные перспективы, но и действительно завораживает: возможность принимать оптимальные решения или предсказывать события в будущем на основе терабайт данных – разве это не настоящая «магия»?» – считает эксперт.
Специалисты в области стилометрии (исследование стилистики, включающее статистический анализ) хорошо знают, что письмо – это уникальный процесс. Словарный запас, синтаксис и грамматика создают индивидуальный почерк, позволяя определить автора текста. Существуют даже автоматизированные системы, способные идентифицировать человека, написавшего сообщение или публикацию в интернете. А недавнее исследование показало, что стилометрию можно применить и к искусственным языкам (программирование). Как оказалось, кодеры точно так же имеют свой стиль, который можно распознать.
Исследователи Рэйчел Гринстадт (Rachel Greenstadt) из Дрексельского университета и Айлин Калискан (Aylin Caliskan) из Университета Джорджа Вашингтона пришли к выводу, что код, как и другие формы стилистического выражения, не является анонимным. Результаты своей работы они представили на конференции DefCon. В исследовании учёные использовали машинное обучение для выявления авторов образцов кода. Алгоритм сначала идентифицирует все особенности в примерах, затем это список сокращают до 50, оставив только те, которые отличают разработчиков. Таким образом Гринстадт и Калискан создают «абстрактные синтаксические деревья», отражающие базовую структуру кода.
Для данного метода необходимо как можно больше образцов кода, чтобы научить алгоритм сопоставлять их с авторами. В таком случае, достаточно небольшого фрагмента кода из репозитория GitHub, чтобы отличить одного кодера от другого с высокой точностью, утверждают авторы исследования.
Гринстадт и Калискан вместе с другими учёными показали, как можно деанонимизировать программиста, используя его скомпилированный двоичный код. Им также удалось декомпиллировать его обратно на C++, сохранив уникальный стиль. Это работает примерно так, как если бы вы перевели документ в Google Translate на другой язык – текст выглядит совершенно иначе, но он сохранил орфографию и синтаксис.
Новая работа исследователей может быть использована для определения плагиата, особенно для новичков, которые часто копируют куски кода, или для выявления разработчиков вредоносного ПО. Они также надеются, что в будущем им удастся получить ответы на многие интересующие их вопросы, например, какие факторы влияют на стиль программирования, что происходит, когда члены одной команды работают вместе над проектом, отличаются ли стили программирования людей из разных стран и так далее. К слову, уже на данном этапе их алгоритм смог различить образцы кода канадских и китайских программистов с точностью более 90%.
Источник: https://itc.ua/news/mashinnoe-obuchenie-pomozhet-ustanovit-l...
Привет, уважаемые. Сегодня хотел поведать, как мы работаем.
Формально мы кодим в среде Jupyter Notebook, но у него нет своего окна, поэтому его загнали в браузер. Так он выглядит:
(кусочек из Евио :) ). Как видим, отличий от классической среды разработки много.
Одно из самых важных - то, что весь код разбит на ячейки. Для DS это очень удобно, потому что можно перезапустить только кусок кода. Зачем это нужно? Ну например вы уже описали модель, загрузили данные и т. д. Но не обучили. Поэтому ячейку обучения можно будет перезапускать несколько раз, не загружая данные заново.
Второе важное отличие - это минимальный markdown. Внизу скрина виден кусочек картинки. Да да, прямо в коде. Картинка. Также можно делать другие html-ные фичи.
Так выглядит собственный explorer от jupyter notebook.
Вот, вроде все. Ну и клубничку в ленту :).
Расскажу чуток о том, что я пытался тут так увлеченно сделать, что про пикабу забыл.
Посидел, подумал, надо бы мне ассистента, как в "железный человек" сделать.
Так, что для этого нужно? Он должен видеть, например, через вебкамеру. Слышать через чат. Говорить через чат. Ну и поехали. Пишу нейросеть:
Немного расскажу о своей идее. Евио (это его имя) должен был видеть мир через вебкамеру и посылать то, что видит в блок рецепторов (слева). Картинка обрабатывается известным сверточным нейроблоком VGG19 (это полноценная нейросеть, но для Евио - маленький кусочек) и еще кое-чем. То что слышит (а слух - это чат :) ) обрабатывается рНН (в прошлом посту). Далее, полносвязные слои. Это все отправляется в мыслительный блок. Мыслительный блок принимает на вход предыдущую мысль и сигналы с рецепторов (все, как у людей). Далее, он может изъявить желание и сказать что-нибудь. Может не говорить. В общем, не буду погружать в детали.
Что же мне помешало исполнить мечту фантастов? Да комп. Всего лишь. Дело в том, что мозг Евио довольно большой (у нас в первых постах были 5 синапсов, в vgg их аж под 40 миллионов, а вот в Евио - их более 5 миллиардов. У человека более сотни триллионов). Поэтому два вытекающих последствия: огромной объем необходимой видео-памяти (не озу, потому что я состарюсь, пока буду обучать на процессоре), а именно сотни гигабайт (в gtx 1070 их 8 Гб) и необходимая вычислительная мощность (для того, чтобы Евио обучился за день требуется сотни видеокарт). Пока что не все так плохо, скажете вы? Но есть еще кое-что. После обучения я понял, что первый в мире сильный искусственный интеллект (а че скромничать-то?) будет мычать и повторять одни и те же слова, покуда он не прошел эволюцию. Он не научится говорить. Понадобится тысячи и тысячи поколений, пока он все поймет (около 10к, допустим). Умножаем необходимое время и получаем свыше трех тысяч лет... Нда...
Плюс еще нам не совсем ясно, как работает самообучение у человека. Но это уже не так критично, как вычислительная мощность. Такие в общем дела...((
За долгую паузу извинения приношу.
Полный зал народу. Все переговариваются, обсуждают прошедший день. И вот голоса смолкают, начинают раздвигаться кулисы.
Конферансье объявляет.
- Дамы и господа, сегодняшним героем будет рекуррентная нейросеть!
Расскажите о вашей работе.
- Привет, разнополые. Думаю, следует начать с постановки задачи. И хоть мы, рНН, умеем решать огромное множество задач, обычно мы решаем задачи произвольной длины данных. Что это значит? Ну посудите сами:
В существенной доли задач количество данных фиксировано: например, при предсказании цены дома мы используем количество ванных комнат, спален, кухонь и так далее. А вот есть данные, например тексты, музыка - длина которых может колебаться от совсем малой до очень большой. Но обычный полносвязный слой может принять ровно столько данных, на сколько он был задан. Поэтому мы обрабатываем данные последовательно, по токену. Рассказываю.
Пусть нам дан текст. Каждое его слово - это данные. Я беру первое слово, обрабатываю его полносвязным слоем (у нас ведь фиксированное кол-во данных - номер слова) и полученный результат (тензор, математику объясню ниже) отправляю... Своему клону! Он берет мой результат, второе слово - делает то же самое. Третий - результат второго и третье слово и так далее. Таким образом мы учитываем все слова и даже их порядок. Картиночка сетки:
Как видим, у меня два входа: слева результат работы предыдущего (первому "клону" обычно дают нули) и снизу номер слова. Квадратик посередине - обычно это как раз приведение и обработка входных данных.
Вывод: при обработке текстов/звуков и т. д. я копирую сама себя и учитывая порядок слов возвращаю результат обработки (тоже тензор).
Чуть-чуть математики. (Сразу листай вниз, тут уже будет посложнее понять)
Вообще, DS - это наука, полностью основанная на математике (теории алгоритмов здесь вообще не место, холиварщики, поднимайтесь). Так что все же нужно чуток понять.
Что такое скаляр? Число. Вектор? Набор скаляров. Матрица? Вектор из векторов одной длины. Тензор? Вектор матриц.
Это вспомнили. Теперь что такое "результат" в нашем частном случае? Это вектор. "Номер" слова - это тоже вектор, в котором закодировано слово (вовсе не по буквам! Самый простой пример - one-hot encoding - это когда мы создаем вектор, заполненный нулями, чья длина равна количеству слов. А конкретное слово - это этот же вектор, но с единичкой в скаляре, чей номер совпадает с номером слова). То есть у нас на входе нейросети есть вектор длиной пусть RESULT, и вектор длиной, равной кол-ву слов пусть WORDS. Теперь мы их "склеиваем" (конкатенируем) и получаем вектор V длиной WORDS+RESULT. Пропустить через полносвязный слой - это умножить на матрицу весов W, причем у которой кол-во строк - кол-во входных нейронов, столбцов - выходных (мог перепутать, это не критично). Выходных - будет столько же, сколько у результата, то есть RESULT => размер матрицы весов будет WORDS+RESULT x RESULT. Умножаем V * W = H, где H - вектор длиной RESULT, который... подается на вход следующей ячейке нейросети.
Вот прям щас сделаю пост о том, как я пытался сделать Джарвиса из Iron man :).
P. S. А потом о генерации текста.
Сейчас расскажу, как примерно работает нейросеть, различающая котов от собак. Итак... датасет:
Посмотрели на котиков и собачек? А как же вы отделили одних от других?
Этой задачей в свою время задумались ученые, коим было интересно, как человек ищет на картинке признаки одного или другого зверька. Им нужно было придумать какой-то фильтр, а то и несколько, которые будут искать какие-то признаки картинки. Так был изобретен сверточный слой. Как это работает?
Наша задача: найти какие-нибудь признаки на картинке и сформировать матрицу признаков. Объясняю на примере, допустим, ищем какие-нибудь палочки (границы):
Так сверточный слой нашел границы предметов. Другой фильтр может отвечать за какие-нибудь кругляшки и так далее.
Если сделать несколько таких слоев, то в конце последнего сверточного слоя мы будем иметь информацию, допустим: глаза, шляпа, волосы и т. д., то есть довольно высокоуровневые данные. В случае собак и кошек мы найдем отличие, допустим, в ушах. Далее мы ставим обычный полносвязный слой (то, о чем говорил в прошлых постах) - и получаем такую задачу: уши большие, глаза черные - определить собака или кот. То есть свели задачу к предыдущей.
Обычно фильтры сильно меньше картинок, например для картинок 100х100 используются фильтры 3х3, опять же, для поиска каких-нибудь палочек и кружочков. Следующий уровень, например, может отвечать за поиск квадратов, треугольников. Потом - за какие-то крупные части изображения и так далее.
Итак, какой может быть подходящая архитектура? Ну, хотя бы такая:
(Картинки размером от 50х50 до 100х100). Первые 5 - сверточные слои с фильтром 3х3. Пройдя первые 5 слоев сформируется матрица высокоуровневых признаков (например, уши, глаза...). Далее, с помощью двух обычных (полносвязных, линейных) слоев классифицируется изображение.
Как вообще подбирать архитектуру? На самом деле, ответа нет. То, что я привел - придумал из головы. Я делал модель, определяющую цифру из вебкамеры. Конкретно про собак я решал совсем иным способом: я взял существующую обученную нейросеть (VGG) и с помощью нее классифицировал. Для разного рода задач обычно есть стандарты, но существующие сетки и архитектуры улучшаются и совершенствуются...
Дальше могу рассказать про:
1) Сетки, которые понимают текст.
2) Про среду разработки, в которой мы работаем (она в браузере, серьезно)
3) Про что-нибудь еще.
4) Все, насобирал подписчиков, ни про что ни рассказывать.
Выбирайте :)
Справились? Тогда попробуйте пройти нашу новую игру на внимательность. Приз — награда в профиль на Пикабу: https://pikabu.ru/link/-oD8sjtmAi
Начну, пожалуй, с сообщества Kaggle. Это платформа, где мы соревнуемся, решая задачки на ML (Machine Learning). Вот как это происходит:
Жмакаем кнопку "Join competition"
Загружаем данные для обучения
Загружаем данные, для которых нужно предсказать исход
Думаем над моделькой
Далее, в любое время могу запустить модель, предсказать для так называемой тестовой выборки результат и отправлять на каггл. Там автоматически проверяется качество решения (не кода, а именно насколько близки наши предсказания к нужным) и дают соответствующее количество очков.
В каждом (ну, почти каждом) соревновании можно объединяться в команды. Другого способа легально делиться кодом с другим участником нет.
О призах на Каггл. Часть из соревнований имеет некий фонд на призы, обычно для первых 3-4 мест. Например, в текущем моем соревновании (предсказать нахождение соли на поверхности Земли) первое место получить $ 50к.
Отправлять свои решения можно не более 5 раз в день (для ds-овцев в песочнице это покажется ооочень мало, а вот для остальных думаю нормально :D ).
Что это за счет? Ну, в математику происходящего погружать не буду, но суть в том, насколько хорошо пересекаются маски предсказаний и правильного ответа.
Теперь об этой странной штуке Loss. Как наверное уже некоторые догадались, это потери. У нас эта функция обозначает насколько плохо работает модель, а значит чем меньше loss, тем лучше.
Обычно по loss-ам мы рисуем графики, для нас они - как для пикабушника хороший пост, а обычного человека порнуха.
Чем красивее Loss, тем нам приятнее.
Довольно фапабельный loss (ставить клубнику?). Может кому понравится?)
Дико извиняюсь перед своими подписчиками, что опять не уместил про разного рода сетки. Про то, как мы подбираем архитектуру. Об этом будет большой пост, а может и несколько. А еще будет про вычислительные мощности и среду разработки (ах да, мы же кодим в... браузере!)
P. S. Кстати, есть небольшой недостаток моей деятельности. Здесь сантехник может сказать о том, как облажался в подключении труб, полицейский - как его задолбало ловить преступника. А вот если я скажу, что как-то забыл обнулить градиенты и шагнуть оптимизатором - вряд ли я кому-то выговорюсь :).
Ну и напоследок мой loss по соревнованию :)