Я выложил решения и разборы двух вчерашних задач, ищите их в комментариях к соответствующим постам.
Лучше, конечно, сначала попробовать решить одну или обе задачи самостоятельно, а потом сравнить с моими решениями.
Буду рад, если поделитесь впечатлениями от задач или прокомментируете мои разборы)
Завтра выложу полезные советы из своего опыта о том, как решать задачи.
Лучше, конечно, сначала попробовать решить одну или обе задачи самостоятельно, а потом сравнить с моими решениями.
Буду рад, если поделитесь впечатлениями от задач или прокомментируете мои разборы)
Завтра выложу полезные советы из своего опыта о том, как решать задачи.
Как научиться хорошо решать алгоритмические задачи?
#py_basic #py_advanced
Мы уже говорили о важности решении задач для развития алгоритмического мышления и подготовки к собеседованиям. Затем я предложил вам пару задач разной сложности с последующим разбором, знаю, что некоторым из вас удалось их решить. Теперь поделюсь лайфхаками из своего опыта - надеюсь, что они помогут вам научиться хорошо решать алгоритмические задачи и чувствовать себя увереннее на собеседованиях.
1. Когда начинаете решать новую задачу, рекомендую сначала разобрать её на бумаге, нарисовать схему, диаграмму, таблицу и т.п. Я считаю, что это самый важный шаг (и навык) - так обычно получаются более эффективные решения, чем если сразу садиться писать код.
2. При этом часто помогает вопрос: "а как человек (а не компьютер) решал бы эту задачу?" Вручную пошагово разобрать несколько примеров ввода, от простых до более сложных.
3. Если за 10-15 минут не появилось идей (иногда полезно и дольше поломать голову для тренировки), нужно сесть за код и попробовать запрограммировать хотя бы неполное решение, начав с простых случаев. Обычно в процессе этого приходят новые идеи.
4. Если на одних примерах ваше решение работает, а на других нет, это уже большой прогресс. Дальше нужно просто разобрать сложные случаи и понять, как их включить в ваше решение, сделав его более общим.
5. Если задача "не поддалась" за час-два и вы устали, лучше сделать перерыв и отдохнуть. Мозг так устроен, что он не может очень долго напряжённо работать над одной сложной задачей. Возможно, задача пока что вам не подходит и нужно какое-то время порешать более простые задачи, либо вы её всё-таки решите за несколько дней в "фоновом" режиме. И то, и другое - хорошо.
6. Не нужно ругать себя, если не получилось решить, потому что это нормальный процесс саморазвития. Помните, что мозг лучше всего учится на неудачах. Настоящая цель - не решить задачу, а повысить свои навыки.
7. Рекомендуют подбирать себе задачи таким образом, чтобы было где-то 15% неудач. Это оптимальный уровень сложности, когда из, скажем, 20 задач вы можете решить 17, а остальные не можете. Если процент успеха выше, значит, вы недостаточно себя нагружаете и ваш прогресс идёт медленнее, чем мог бы. Если же процент успеха ниже, значит, вы выбираете слишком сложные задачи, а это опасно для вашей мотивации и самооценки.
Ну и достаточно пока о задачах) В ближайших постах поговорим на другие темы.
#py_basic #py_advanced
Мы уже говорили о важности решении задач для развития алгоритмического мышления и подготовки к собеседованиям. Затем я предложил вам пару задач разной сложности с последующим разбором, знаю, что некоторым из вас удалось их решить. Теперь поделюсь лайфхаками из своего опыта - надеюсь, что они помогут вам научиться хорошо решать алгоритмические задачи и чувствовать себя увереннее на собеседованиях.
1. Когда начинаете решать новую задачу, рекомендую сначала разобрать её на бумаге, нарисовать схему, диаграмму, таблицу и т.п. Я считаю, что это самый важный шаг (и навык) - так обычно получаются более эффективные решения, чем если сразу садиться писать код.
2. При этом часто помогает вопрос: "а как человек (а не компьютер) решал бы эту задачу?" Вручную пошагово разобрать несколько примеров ввода, от простых до более сложных.
3. Если за 10-15 минут не появилось идей (иногда полезно и дольше поломать голову для тренировки), нужно сесть за код и попробовать запрограммировать хотя бы неполное решение, начав с простых случаев. Обычно в процессе этого приходят новые идеи.
4. Если на одних примерах ваше решение работает, а на других нет, это уже большой прогресс. Дальше нужно просто разобрать сложные случаи и понять, как их включить в ваше решение, сделав его более общим.
5. Если задача "не поддалась" за час-два и вы устали, лучше сделать перерыв и отдохнуть. Мозг так устроен, что он не может очень долго напряжённо работать над одной сложной задачей. Возможно, задача пока что вам не подходит и нужно какое-то время порешать более простые задачи, либо вы её всё-таки решите за несколько дней в "фоновом" режиме. И то, и другое - хорошо.
6. Не нужно ругать себя, если не получилось решить, потому что это нормальный процесс саморазвития. Помните, что мозг лучше всего учится на неудачах. Настоящая цель - не решить задачу, а повысить свои навыки.
7. Рекомендуют подбирать себе задачи таким образом, чтобы было где-то 15% неудач. Это оптимальный уровень сложности, когда из, скажем, 20 задач вы можете решить 17, а остальные не можете. Если процент успеха выше, значит, вы недостаточно себя нагружаете и ваш прогресс идёт медленнее, чем мог бы. Если же процент успеха ниже, значит, вы выбираете слишком сложные задачи, а это опасно для вашей мотивации и самооценки.
Ну и достаточно пока о задачах) В ближайших постах поговорим на другие темы.
Что нужно показать на собеседовании по машинному обучению?
#ml #career
Из опыта прохождения и проведения многочисленных собеседований в сфере ML могу сказать, что чаще всего интервьюеры хотят видеть в вас следующее:
• Чёткое понимание того, как происходит машинное обучение - градиентный спуск, типичные постановки задач в ML, функции потерь, недообучение / переобучение (bias / variance), валидация моделей, правильная методология проведения экспериментов.
• Опыт или хотя бы теоретическое знание методов решения различных проблем с данными: шум, выбросы, несбалансированность, низкая репрезентативность, повторы, слишком мало данных, слишком много данных и т.д.
• Знание и опыт применения основных современных и классических моделей в вашей области, будь то обработка структурированных данных или же естественного языка, изображений, звука.
• Не всегда, но довольно часто желателен опыт создания микросервисов, оптимизации моделей, мониторинга ML-приложений в продакшне.
Всё это, конечно, желательно демонстрировать на конкретных примерах из своей предыдущей работы / личных проектов. Так вы лучше продемонстрируете уверенное владение "матчастью". Не "проблема X решается методами Y1 и Y2", а "когда в таком-то проекте наша команда столкнулась с проблемой X, мы сначала применили метод Y1, но он оказался неэффективен по такой-то причине, поэтому мы перешли на метод Y2, и это привело вот к таким результатам". Так можно раскрыть больше деталей. Детали - ваши друзья, они не только свидетельствуют о вашем реальном опыте решения сложных проблем, но и делают ваш рассказ более живым и запоминающимся в глазах интервьюера. А это важно, потому что нас с вами (пока что) оценивают на собеседованиях живые люди, а не беспристрастные машины)
Пока остановлюсь на этом. Тема технических собеседований очень объёмная, буду постепенно раскрывать её в следующих постах.
#ml #career
Из опыта прохождения и проведения многочисленных собеседований в сфере ML могу сказать, что чаще всего интервьюеры хотят видеть в вас следующее:
• Чёткое понимание того, как происходит машинное обучение - градиентный спуск, типичные постановки задач в ML, функции потерь, недообучение / переобучение (bias / variance), валидация моделей, правильная методология проведения экспериментов.
• Опыт или хотя бы теоретическое знание методов решения различных проблем с данными: шум, выбросы, несбалансированность, низкая репрезентативность, повторы, слишком мало данных, слишком много данных и т.д.
• Знание и опыт применения основных современных и классических моделей в вашей области, будь то обработка структурированных данных или же естественного языка, изображений, звука.
• Не всегда, но довольно часто желателен опыт создания микросервисов, оптимизации моделей, мониторинга ML-приложений в продакшне.
Всё это, конечно, желательно демонстрировать на конкретных примерах из своей предыдущей работы / личных проектов. Так вы лучше продемонстрируете уверенное владение "матчастью". Не "проблема X решается методами Y1 и Y2", а "когда в таком-то проекте наша команда столкнулась с проблемой X, мы сначала применили метод Y1, но он оказался неэффективен по такой-то причине, поэтому мы перешли на метод Y2, и это привело вот к таким результатам". Так можно раскрыть больше деталей. Детали - ваши друзья, они не только свидетельствуют о вашем реальном опыте решения сложных проблем, но и делают ваш рассказ более живым и запоминающимся в глазах интервьюера. А это важно, потому что нас с вами (пока что) оценивают на собеседованиях живые люди, а не беспристрастные машины)
Пока остановлюсь на этом. Тема технических собеседований очень объёмная, буду постепенно раскрывать её в следующих постах.
Что важнее, модель или данные?
#ml
Как известно, суть машинного обучения в том, что мы не сами программируем логику принятия решений, а показываем машине довольно большое количество примеров, на которых она должна научиться решать ту или иную задачу. Многие инженеры по машинному обучению, с которыми я работал, считали, что главное в достижении хороших результатов - это применять самые свежие алгоритмы и трюки из научных статей. Другими словами, добиваться прироста качества за счёт изменений (часто - усложнений) в ML-модели. "Давайте возьмём нейросеть побольше!" Но нередко случается так, что недели и месяцы уходят на реализацию новых моделей и эксперименты с ними, при этом качество выполнения задачи не повышается или повышается несущественно - на 0.1-0.2%. Небольшой выигрыш в качестве может стоить значительных вычислительных ресурсов, что может быть неприемлемо в продакшне.
В последние годы набирает популярность другой подход, фокусирующийся на данных, а не на модели. По-английски его называют "data-centric machine learning". В нём задачу ставим чуть иначе: что, если наша модель уже достаточно хороша и мы просто должны показать ей более правильные и качественные примеры, чтобы она лучше научилась решать задачу?
В одной из компаний, где я работал, мы решали довольно трудную задачу классификации коротких текстов на японском языке. Классов было довольно много, некоторые из них были очень похожи, обучающих примеров было мало, и в результате всего этого наши нейросетевые модели плохо работали. Эксперименты с разными архитектурами мало помогали, поэтому я предложил применить подход, ориентированный на повышение качества датасета. Что мы сделали:
1. Анализ ошибок нашей модели. Валидационные примеры, которые не удаётся правильно классифицировать, часто могут выявить систематические проблемы обучения, сказать о том, чего не хватает в обучающих данных. Нам это помогло понять, какого рода тексты обычно относятся моделью к неверным классам, что между ними общего.
2. Построение матрицы ошибок (confusion matrix). Это ответило на вопрос, какие классы наиболее часто путает модель. По результатам мы добавили в обучающий датасет примеры, лучше разводящие между собой именно эти классы.
3. Сравнение качества модели с тем, насколько хорошо человек справляется с такой же задачей. Дали экспертам примеры из валидационного сета для ручной разметки, увидели, что люди тоже допускают немало ошибок и путают некоторые классы. Это помогло снизить нереалистичные ожидания от модели, а также пересмотреть принятую систему классов.
4. Очистка датасета от "плохих" примеров. Эксперты просмотрели датасет на предмет того, какие примеры (с человеческой точки зрения) слишком неоднозначны. С другой стороны, применили и автоматические методики поиска неадекватных примеров, основанные на методе ближайших соседей (сейчас я бы применил ещё и метод TracIn от Google).
Всё это в совокупности помогло значительно повысить точность классификации - с 0.47 до 0.85 - и практически "вернуло жизнь" проекту. Временные затраты были относительно невелики, к тому же значительная часть работ выполнялась экспертами-лингвистами, что позволило высвободить ценное время ML-инженеров.
Пишите в комментариях, о чём было бы интересно прочитать в следующих постах!
#ml
Как известно, суть машинного обучения в том, что мы не сами программируем логику принятия решений, а показываем машине довольно большое количество примеров, на которых она должна научиться решать ту или иную задачу. Многие инженеры по машинному обучению, с которыми я работал, считали, что главное в достижении хороших результатов - это применять самые свежие алгоритмы и трюки из научных статей. Другими словами, добиваться прироста качества за счёт изменений (часто - усложнений) в ML-модели. "Давайте возьмём нейросеть побольше!" Но нередко случается так, что недели и месяцы уходят на реализацию новых моделей и эксперименты с ними, при этом качество выполнения задачи не повышается или повышается несущественно - на 0.1-0.2%. Небольшой выигрыш в качестве может стоить значительных вычислительных ресурсов, что может быть неприемлемо в продакшне.
В последние годы набирает популярность другой подход, фокусирующийся на данных, а не на модели. По-английски его называют "data-centric machine learning". В нём задачу ставим чуть иначе: что, если наша модель уже достаточно хороша и мы просто должны показать ей более правильные и качественные примеры, чтобы она лучше научилась решать задачу?
В одной из компаний, где я работал, мы решали довольно трудную задачу классификации коротких текстов на японском языке. Классов было довольно много, некоторые из них были очень похожи, обучающих примеров было мало, и в результате всего этого наши нейросетевые модели плохо работали. Эксперименты с разными архитектурами мало помогали, поэтому я предложил применить подход, ориентированный на повышение качества датасета. Что мы сделали:
1. Анализ ошибок нашей модели. Валидационные примеры, которые не удаётся правильно классифицировать, часто могут выявить систематические проблемы обучения, сказать о том, чего не хватает в обучающих данных. Нам это помогло понять, какого рода тексты обычно относятся моделью к неверным классам, что между ними общего.
2. Построение матрицы ошибок (confusion matrix). Это ответило на вопрос, какие классы наиболее часто путает модель. По результатам мы добавили в обучающий датасет примеры, лучше разводящие между собой именно эти классы.
3. Сравнение качества модели с тем, насколько хорошо человек справляется с такой же задачей. Дали экспертам примеры из валидационного сета для ручной разметки, увидели, что люди тоже допускают немало ошибок и путают некоторые классы. Это помогло снизить нереалистичные ожидания от модели, а также пересмотреть принятую систему классов.
4. Очистка датасета от "плохих" примеров. Эксперты просмотрели датасет на предмет того, какие примеры (с человеческой точки зрения) слишком неоднозначны. С другой стороны, применили и автоматические методики поиска неадекватных примеров, основанные на методе ближайших соседей (сейчас я бы применил ещё и метод TracIn от Google).
Всё это в совокупности помогло значительно повысить точность классификации - с 0.47 до 0.85 - и практически "вернуло жизнь" проекту. Временные затраты были относительно невелики, к тому же значительная часть работ выполнялась экспертами-лингвистами, что позволило высвободить ценное время ML-инженеров.
Пишите в комментариях, о чём было бы интересно прочитать в следующих постах!
Наткнулся на полезный ресурс, делюсь:
https://github.com/Extremesarova/data_science_resources
Репозиторий в GitHub с обучающими материалами для дата-сайентистов и ML-инженеров. Собраны в одном месте ответы на вопросы для собеседований, бесплатные курсы, тьюториалы, шпаргалки и т.д. Все материалы упорядочены по темам. Многое на английском (как и сам репозиторий), но часть - на русском.
https://github.com/Extremesarova/data_science_resources
Репозиторий в GitHub с обучающими материалами для дата-сайентистов и ML-инженеров. Собраны в одном месте ответы на вопросы для собеседований, бесплатные курсы, тьюториалы, шпаргалки и т.д. Все материалы упорядочены по темам. Многое на английском (как и сам репозиторий), но часть - на русском.
Как удобно выводить на экран вложенные структуры?
#py_basic
Иногда приходится иметь дело со сложными питоновскими структурами данных: например, у нас есть список словарей, в котором ключи являются кортежами, а значения списками. Что делать, если нужно быстро разобраться, как организованы подобные данные? Можно использовать дебаггер, но иногда это бывает неудобно. Что если нам просто хочется быстро и красиво вывести данные на экран?
Рассмотрим простой пример (скриншот 1). Выводить сложную структуру на экран "в лоб" обычным вызовом print не всегда наглядно - данные отображаются в одну строку, их структуру довольно сложно считать.
В качестве альтернативы можно применить стандартный модуль pprint (сокращённое pretty print). Становится чуть лучше (скриншот 2). Кстати, из функции pprint.pprint / pprint.pp можно легко записывать в файл, а отображение данных можно настраивать с помощью аргументов. На RealPython даже целый тьюториал про это написали:
https://realpython.com/python-pretty-print/
Есть ещё один чуть менее очевидный способ - воспользоваться преобразованием данных в формат строки JSON с отступами (скриншот 3). У этого подхода есть свои существенные ограничения, но иногда бывает очень удобно. Лично мне форматирование стандартных питоновских структур данных в json.dumps нравится больше, чем использование pprint.pprint.
В качестве бонуса - полезно знать о сторонней библиотеке rich, в которой есть функция print с таким же интерфейсом, как и стандартный питоновский print. Отличие в том, что rich при выводе на экран раскрашивает в разные цвета числа, строки, булевы значения и т.д. (скриншот 4). Это, конечно, не решает проблему вывода на экран сложных структур с глубокой вложенностью, но иногда помогает легче считывать то, что выводится на экран, особенно в консоли. А для сложных структур в rich есть свой pprint (скриншот 5).
#py_basic
Иногда приходится иметь дело со сложными питоновскими структурами данных: например, у нас есть список словарей, в котором ключи являются кортежами, а значения списками. Что делать, если нужно быстро разобраться, как организованы подобные данные? Можно использовать дебаггер, но иногда это бывает неудобно. Что если нам просто хочется быстро и красиво вывести данные на экран?
Рассмотрим простой пример (скриншот 1). Выводить сложную структуру на экран "в лоб" обычным вызовом print не всегда наглядно - данные отображаются в одну строку, их структуру довольно сложно считать.
В качестве альтернативы можно применить стандартный модуль pprint (сокращённое pretty print). Становится чуть лучше (скриншот 2). Кстати, из функции pprint.pprint / pprint.pp можно легко записывать в файл, а отображение данных можно настраивать с помощью аргументов. На RealPython даже целый тьюториал про это написали:
https://realpython.com/python-pretty-print/
Есть ещё один чуть менее очевидный способ - воспользоваться преобразованием данных в формат строки JSON с отступами (скриншот 3). У этого подхода есть свои существенные ограничения, но иногда бывает очень удобно. Лично мне форматирование стандартных питоновских структур данных в json.dumps нравится больше, чем использование pprint.pprint.
В качестве бонуса - полезно знать о сторонней библиотеке rich, в которой есть функция print с таким же интерфейсом, как и стандартный питоновский print. Отличие в том, что rich при выводе на экран раскрашивает в разные цвета числа, строки, булевы значения и т.д. (скриншот 4). Это, конечно, не решает проблему вывода на экран сложных структур с глубокой вложенностью, но иногда помогает легче считывать то, что выводится на экран, особенно в консоли. А для сложных структур в rich есть свой pprint (скриншот 5).
Мой любимый способ борьбы с синдромом самозванца
#soft_skills
Как известно, синдром самозванца - довольно распространённая проблема. Даже матёрые специалисты нередко от этого страдают. Есть, конечно, тиражируемый совет "fake it until you make it": просто не показывай, что ты чего-то не знаешь, притворяйся уверенным в себе, а настоящая уверенность якобы придёт со временем. Лично мне такие манипулятивные подходы совсем не по душе. Думаю, ни к чему хорошему такие игры не приводят.
Мне больше нравится такой способ. Когда накатывает чувство неуверенности и сомнения в себе, нужно сказать себе следующее:
1. Я знаю, что у меня пока не получается <задача_А> и есть пробелы в <навык_Б>.
2. Однако я уже неплохо умею <навык_В>, <навык_Г> и <навык_Д>, а также справляюсь с <задача_Е> и <задача_Ж>.
3. Я готов учиться решать <задача_А> и знаю, что нужно сделать, чтобы лучше освоить <навык_Б>
То есть:
1) честное признание своих текущих ограничений,
2) опора на свои сильные стороны и уже сделанный прогресс,
3) целеполагание.
Правда работает.
И ещё, не нужно сравнивать себя с другими - если уж хочется сравнивать, то лучше с собой же год назад.
#soft_skills
Как известно, синдром самозванца - довольно распространённая проблема. Даже матёрые специалисты нередко от этого страдают. Есть, конечно, тиражируемый совет "fake it until you make it": просто не показывай, что ты чего-то не знаешь, притворяйся уверенным в себе, а настоящая уверенность якобы придёт со временем. Лично мне такие манипулятивные подходы совсем не по душе. Думаю, ни к чему хорошему такие игры не приводят.
Мне больше нравится такой способ. Когда накатывает чувство неуверенности и сомнения в себе, нужно сказать себе следующее:
1. Я знаю, что у меня пока не получается <задача_А> и есть пробелы в <навык_Б>.
2. Однако я уже неплохо умею <навык_В>, <навык_Г> и <навык_Д>, а также справляюсь с <задача_Е> и <задача_Ж>.
3. Я готов учиться решать <задача_А> и знаю, что нужно сделать, чтобы лучше освоить <навык_Б>
То есть:
1) честное признание своих текущих ограничений,
2) опора на свои сильные стороны и уже сделанный прогресс,
3) целеполагание.
Правда работает.
И ещё, не нужно сравнивать себя с другими - если уж хочется сравнивать, то лучше с собой же год назад.
Проклятие правил (часть 1/2)
#ml
Когда имеет смысл для решения бизнес-задачи применять машинное обучение, а когда это того не стоит? С одной стороны, если задача не очень сложная, то быстрый результат можно получить и без ML, построив систему на правилах (эвристиках). Для этого нужно иметь некоторую экспертизу в решаемой задаче и уметь описывать логику принятия решения на формальном языке, будь то Python, регулярные выражения или что-то ещё.
Пример из личного опыта. Когда-то давно я работал преподавателем английского. Однажды мне захотелось заменить скучные языковые упражнения из учебника на более интересные. Я подумал, что дело не в самом формате упражнений - вставить пропущенные слова, выбрать правильную форму глагола, подходящуе по смыслу и т.д. - а в их содержании. Например, вместо текстов про банальных Джона и Мэри можно было бы взять более интересные студентам темы: музыку, спорт, Гарри Поттера и т.д. Но составлять упражнения вручную не хотелось. Зная Питон, я за несколько вечеров написал прототип автоматического генератора упражнений на основе любых текстов на английском. Программа ранжировала тексты по сложности на основе количественных показателей (средняя длина предложений и слов, средняя частота слов), затем выбирала в текстах интересные слова и контексты для создания пропусков, после чего форматировала тексты в виде упражнений. В первой версии программа поддерживала всего три вида упражнений, но её уже можно было использовать в учебном процессе. Получив первые результаты, я стал постепенно улучшать генератор: добавлял новые виды упражнений и совершенствовал алгоритм оценки сложности текстов. Всё это безобразие работало довольно хорошо без какого-либо машинного обучения, только на правилах. (Кстати, это был мой первый серьёзный проект в natural language processing, хоть и некоммерческий, т.к. программа распространялась бесплатно. Зато я сделал по нему несколько научных публикаций в 2014-2015 гг.)
Однако, как известно, есть много сложных задач, решение которых практически невозможно автоматизировать на достойном уровне качества без использования машинного обучения: машинный перевод, генерация изображений по текстовому запросу, распознавание речи и т.д. Странно было бы пытаться решать подобные задачи с помощью правил, написанных экспертами вручную (хотя такое порой пытались провернуть на ранних этапах развития искусственного интеллекта). А что нужно для машинного обучения? Хороший набор обучающих данных: чем он чище и полнее, тем лучше на нём обучится алгоритм. Для действительно сложных задач, которые решаются большими нейросетевыми моделями, конечно, нужно ещё обеспечить достаточные вычислительные ресурсы, но об этом мы поговорим как-нибудь в другой раз.
#ml
Когда имеет смысл для решения бизнес-задачи применять машинное обучение, а когда это того не стоит? С одной стороны, если задача не очень сложная, то быстрый результат можно получить и без ML, построив систему на правилах (эвристиках). Для этого нужно иметь некоторую экспертизу в решаемой задаче и уметь описывать логику принятия решения на формальном языке, будь то Python, регулярные выражения или что-то ещё.
Пример из личного опыта. Когда-то давно я работал преподавателем английского. Однажды мне захотелось заменить скучные языковые упражнения из учебника на более интересные. Я подумал, что дело не в самом формате упражнений - вставить пропущенные слова, выбрать правильную форму глагола, подходящуе по смыслу и т.д. - а в их содержании. Например, вместо текстов про банальных Джона и Мэри можно было бы взять более интересные студентам темы: музыку, спорт, Гарри Поттера и т.д. Но составлять упражнения вручную не хотелось. Зная Питон, я за несколько вечеров написал прототип автоматического генератора упражнений на основе любых текстов на английском. Программа ранжировала тексты по сложности на основе количественных показателей (средняя длина предложений и слов, средняя частота слов), затем выбирала в текстах интересные слова и контексты для создания пропусков, после чего форматировала тексты в виде упражнений. В первой версии программа поддерживала всего три вида упражнений, но её уже можно было использовать в учебном процессе. Получив первые результаты, я стал постепенно улучшать генератор: добавлял новые виды упражнений и совершенствовал алгоритм оценки сложности текстов. Всё это безобразие работало довольно хорошо без какого-либо машинного обучения, только на правилах. (Кстати, это был мой первый серьёзный проект в natural language processing, хоть и некоммерческий, т.к. программа распространялась бесплатно. Зато я сделал по нему несколько научных публикаций в 2014-2015 гг.)
Однако, как известно, есть много сложных задач, решение которых практически невозможно автоматизировать на достойном уровне качества без использования машинного обучения: машинный перевод, генерация изображений по текстовому запросу, распознавание речи и т.д. Странно было бы пытаться решать подобные задачи с помощью правил, написанных экспертами вручную (хотя такое порой пытались провернуть на ранних этапах развития искусственного интеллекта). А что нужно для машинного обучения? Хороший набор обучающих данных: чем он чище и полнее, тем лучше на нём обучится алгоритм. Для действительно сложных задач, которые решаются большими нейросетевыми моделями, конечно, нужно ещё обеспечить достаточные вычислительные ресурсы, но об этом мы поговорим как-нибудь в другой раз.
Проклятие правил (часть 2/2)
#ml
Так значит, всё просто? Для сложных задач размечаем датасет и используем машобуч, а для относительно простых - придумываем хорошие эвристики? Проблема в том, что во многих компаниях неверно оценивают сложность задачи и начинают решать её системой правил, думая, что это "дёшево и сердито" и что так будет всегда. Поначалу всё выглядит неплохо: правила позволяют быстро получить какой-то приемлемый результат, а для дальнейшего улучшения системы, как кажется, нужно всего лишь учесть в правилах все возникающие исключения. Но это очень большое "всего лишь". Проклятие правил в том, что чем сложнее становится система, тем труднее и дороже её становится поддерживать. Штат экспертов, пишущих правила, постоянно растёт, как растёт и время, необходимое для обучения новых сотрудников (чем больше система правил, тем дольше в ней приходится разбираться даже опытному человеку). А допускать ошибки в таких системах становится всё легче. При этом у руководства компании может возникнуть ощущение, что раз в эту систему уже вбухали столько ресурсов, то нужно её развивать и дальше, а не отказываться от неё в пользу чего-то другого (например, машинного обучения). А тут на рынке появляется новый стартап, который с самого начала решал эту задачу как задачу машинного обучения. И вот он уже обходит компанию, которая за несколько лет на рынке вложила в свой продукт огромные ресурсы.
В качестве наглядной иллюстрации приведу ещё один пример из опыта. В одной из компаний, где я раньше работал, был матёрый программист, который в течение года разрабатывал систему правил для извлечения именованных сущностей (имён людей, географических локаций, названий компаний и т.п.) из текстов. Он работал над этой системой год. В ней была сложная логика, написанная на Джаве, использовались разные хитрые словари и списки исключений, а запуск полного цикла тестов занимал целую ночь. В конце концов автору системы и его начальству стало очевидно, что уровень качества распознавания всё ещё недостаточно высок, все исключения учесть невозможно, а любое изменение в раздувшейся до невозможности системе вызывает больше новых ошибок, чем исправляет старых. В результате компании всё равно пришлось переходить на ML, но уже было впустую потрачено слишком много времени и ресурсов.
Такие вот дела. Вывод: используйте правила для несложных задач, но используйте их с умом и помните, что иногда они становятся проклятием.
#ml
Так значит, всё просто? Для сложных задач размечаем датасет и используем машобуч, а для относительно простых - придумываем хорошие эвристики? Проблема в том, что во многих компаниях неверно оценивают сложность задачи и начинают решать её системой правил, думая, что это "дёшево и сердито" и что так будет всегда. Поначалу всё выглядит неплохо: правила позволяют быстро получить какой-то приемлемый результат, а для дальнейшего улучшения системы, как кажется, нужно всего лишь учесть в правилах все возникающие исключения. Но это очень большое "всего лишь". Проклятие правил в том, что чем сложнее становится система, тем труднее и дороже её становится поддерживать. Штат экспертов, пишущих правила, постоянно растёт, как растёт и время, необходимое для обучения новых сотрудников (чем больше система правил, тем дольше в ней приходится разбираться даже опытному человеку). А допускать ошибки в таких системах становится всё легче. При этом у руководства компании может возникнуть ощущение, что раз в эту систему уже вбухали столько ресурсов, то нужно её развивать и дальше, а не отказываться от неё в пользу чего-то другого (например, машинного обучения). А тут на рынке появляется новый стартап, который с самого начала решал эту задачу как задачу машинного обучения. И вот он уже обходит компанию, которая за несколько лет на рынке вложила в свой продукт огромные ресурсы.
В качестве наглядной иллюстрации приведу ещё один пример из опыта. В одной из компаний, где я раньше работал, был матёрый программист, который в течение года разрабатывал систему правил для извлечения именованных сущностей (имён людей, географических локаций, названий компаний и т.п.) из текстов. Он работал над этой системой год. В ней была сложная логика, написанная на Джаве, использовались разные хитрые словари и списки исключений, а запуск полного цикла тестов занимал целую ночь. В конце концов автору системы и его начальству стало очевидно, что уровень качества распознавания всё ещё недостаточно высок, все исключения учесть невозможно, а любое изменение в раздувшейся до невозможности системе вызывает больше новых ошибок, чем исправляет старых. В результате компании всё равно пришлось переходить на ML, но уже было впустую потрачено слишком много времени и ресурсов.
Такие вот дела. Вывод: используйте правила для несложных задач, но используйте их с умом и помните, что иногда они становятся проклятием.
Как мотивировать себя? Три ошибки
#soft_skills
Меня просили написать о мотивации. Это вообще одна из самых важных тем. Откуда брать силы на изучение новых технологий и саморазвитие? Что помогает, а что мешает нашей мотивации? Как поддерживать себя, когда хочется сдаться и всё бросить?
TLDR:
1. Мотивация - не причина, а следствие
2. Фокус на процессе (приложении усилий), а не на результате
3. Подбадривание себя, а не самокритика
Есть несколько ошибок, которые легко допустить. Первая из них - думать, что мотивация является причиной, а не следствием. Тот, кто так думает, откладывает своё развитие на потом, "когда будет подходящее настроение". Этот момент может и не наступить. Мотивация - результат осознанных усилий с чётким пониманием цели. Преодолеть себя, победить сиюминутную лень, сделать что-то полезное для своего развития - и тогда получить в награду мотивацию. В это, может быть, трудно поверить, но если понаблюдаете за собой, то увидите, что самая сильная и "долгоиграющая" мотивация бывает не перед началом работы, когда ещё ничего не сделано, а после того, как сделали несколько шагов к цели, получили хотя бы какие-то результаты.
Но при этом зацикливаться на результате тоже неправильно, это вторая ошибка. Выучить Питон, поменять карьеру, взяться за трудный проект - звучит страшно и даже невозможно, но если идти к цели постепенно и думать только о непосредственном следующем шаге, то всё обычно получается. Мы движемся вперёд тогда, когда делаем следующий шаг, а не тогда, когда уже дошли. Мне очень сильно помогает измерять свой прогресс не достижениями, а количеством вложенного времени. Парадоксально? Но что зависит от меня напрямую - приложить усилия или получить результат? Только первое. А потраченное время - это хорошая метрика для оценки приложенных усилий. Результат же почти всегда зависит не только от меня, но и от других участников процесса, от обстоятельств, от сложности задачи и так далее.
С этим связана третья ошибка - ругать себя за неудачи. Порой мы для себя бываем самыми жестокими и беспощадными критиками. Это здорово замедляет развитие. Ругать себя - значит лишать себя воли и мотивации. Кстати, доказано экспериментально. Негатива в жизни и так хватает, лучше поддерживать и подбадривать себя, хвалить себя (да, даже так) за прилагаемые усилия и время, вложенное в саморазвитие. Это правда эффективно, как бы наивно ни звучало. Помогает получать положительные эмоции в процессе работы над собой и над трудными задачами. Для хорошей мотивации нужны положительные подкрепления, так устроен мозг. Ежедневные маленькие победы над собой, своей ленью, страхами, заблуждениями приводят к тому, что высокая мотивация превращается в полезную привычку.
#soft_skills
Меня просили написать о мотивации. Это вообще одна из самых важных тем. Откуда брать силы на изучение новых технологий и саморазвитие? Что помогает, а что мешает нашей мотивации? Как поддерживать себя, когда хочется сдаться и всё бросить?
TLDR:
1. Мотивация - не причина, а следствие
2. Фокус на процессе (приложении усилий), а не на результате
3. Подбадривание себя, а не самокритика
Есть несколько ошибок, которые легко допустить. Первая из них - думать, что мотивация является причиной, а не следствием. Тот, кто так думает, откладывает своё развитие на потом, "когда будет подходящее настроение". Этот момент может и не наступить. Мотивация - результат осознанных усилий с чётким пониманием цели. Преодолеть себя, победить сиюминутную лень, сделать что-то полезное для своего развития - и тогда получить в награду мотивацию. В это, может быть, трудно поверить, но если понаблюдаете за собой, то увидите, что самая сильная и "долгоиграющая" мотивация бывает не перед началом работы, когда ещё ничего не сделано, а после того, как сделали несколько шагов к цели, получили хотя бы какие-то результаты.
Но при этом зацикливаться на результате тоже неправильно, это вторая ошибка. Выучить Питон, поменять карьеру, взяться за трудный проект - звучит страшно и даже невозможно, но если идти к цели постепенно и думать только о непосредственном следующем шаге, то всё обычно получается. Мы движемся вперёд тогда, когда делаем следующий шаг, а не тогда, когда уже дошли. Мне очень сильно помогает измерять свой прогресс не достижениями, а количеством вложенного времени. Парадоксально? Но что зависит от меня напрямую - приложить усилия или получить результат? Только первое. А потраченное время - это хорошая метрика для оценки приложенных усилий. Результат же почти всегда зависит не только от меня, но и от других участников процесса, от обстоятельств, от сложности задачи и так далее.
С этим связана третья ошибка - ругать себя за неудачи. Порой мы для себя бываем самыми жестокими и беспощадными критиками. Это здорово замедляет развитие. Ругать себя - значит лишать себя воли и мотивации. Кстати, доказано экспериментально. Негатива в жизни и так хватает, лучше поддерживать и подбадривать себя, хвалить себя (да, даже так) за прилагаемые усилия и время, вложенное в саморазвитие. Это правда эффективно, как бы наивно ни звучало. Помогает получать положительные эмоции в процессе работы над собой и над трудными задачами. Для хорошей мотивации нужны положительные подкрепления, так устроен мозг. Ежедневные маленькие победы над собой, своей ленью, страхами, заблуждениями приводят к тому, что высокая мотивация превращается в полезную привычку.
Здесь тоже проанонсирую: в воскресенье буду рассказывать про трансформеры и ChatGPT на очередной встрече нижегородского сообщества ODS. Если хотите, приходите послушать!
Тема: От классического трансформера к ChatGPT
Время: 19 февраля 18:00
Формат: Zoom (https://us02web.zoom.us/j/86771868132)
Трансформеры - это наиболее актуальная на сегодняшний день нейросетевая архитектура для решения различных задач автоматической обработки естественного языка (natural language processing). Именно трансформеры лежат в основе таких нашумевших моделей как GPT-3 и ChatGPT. Предлагаю поговорить о том, как работают трансформеры в NLP и каким образом они справляются с самыми разнообразными задачами, такими как машинный перевод, автоматическое реферирование, анализ тональности и ведение свободного диалога с человеком на естественном языке.
В лекции начнём с рефрешера о трансформерах, затем расскажу о том, как исследователям и инженерам из OpenAI удалось обучить ChatGPT. Поговорим о том, оправдан ли весь хайп вокруг этой модели. Также оставлю время на вопросы и свободную дискуссию. Надеюсь, что лекция будет интересна как начинающим, так и практикующим специалистам в NLP.
Тема: От классического трансформера к ChatGPT
Время: 19 февраля 18:00
Формат: Zoom (https://us02web.zoom.us/j/86771868132)
Трансформеры - это наиболее актуальная на сегодняшний день нейросетевая архитектура для решения различных задач автоматической обработки естественного языка (natural language processing). Именно трансформеры лежат в основе таких нашумевших моделей как GPT-3 и ChatGPT. Предлагаю поговорить о том, как работают трансформеры в NLP и каким образом они справляются с самыми разнообразными задачами, такими как машинный перевод, автоматическое реферирование, анализ тональности и ведение свободного диалога с человеком на естественном языке.
В лекции начнём с рефрешера о трансформерах, затем расскажу о том, как исследователям и инженерам из OpenAI удалось обучить ChatGPT. Поговорим о том, оправдан ли весь хайп вокруг этой модели. Также оставлю время на вопросы и свободную дискуссию. Надеюсь, что лекция будет интересна как начинающим, так и практикующим специалистам в NLP.
Zoom Video
Join our Cloud HD Video Meeting
Zoom is the leader in modern enterprise video communications, with an easy, reliable cloud platform for video and audio conferencing, chat, and webinars across mobile, desktop, and room systems. Zoom Rooms is the original software-based conference room solution…
Пару недель тут не постил, время было немного суматошное по работе и не только. Но вот исправляюсь)
Решил поделиться слайдами со своего выступления про трансформеры и ChatGPT (подробнее о содержании в предыдущем посте). Доклад вызвал большой интерес, а после была ещё классная дискуссия с коллегами на целых полтора часа. Если пропустили само мероприятие, можете посмотреть слайды. Думаю, будет полезно и познавательно, особенно тем, кто пока не очень в теме. (А ещё там есть шутки и мотивационные цитаты от ChatGPT)
#ml
Решил поделиться слайдами со своего выступления про трансформеры и ChatGPT (подробнее о содержании в предыдущем посте). Доклад вызвал большой интерес, а после была ещё классная дискуссия с коллегами на целых полтора часа. Если пропустили само мероприятие, можете посмотреть слайды. Думаю, будет полезно и познавательно, особенно тем, кто пока не очень в теме. (А ещё там есть шутки и мотивационные цитаты от ChatGPT)
#ml
Что мешает нам учиться или тайна исчезающей мотивации
#soft_skills
Задавались ли вы когда-нибудь вопросом, почему не получается сохранить мотивацию надолго? Например, человек вдруг захотел научиться играть на гитаре, купил себе инструмент, с восторгом и энтузиазмом начал заниматься, вот уже первые успехи - получилось сыграть бой "шестёрку", взять аккорд G - ещё больше мотивации, но... Подкрались и первые трудности, пальцы болят, упражнения делать лень, первоначальный запал куда-то подевался, и человек бросает то, что могло бы стать классным хобби на всю жизнь.
Наверное, у каждого есть подобный неудачный опыт, когда не получилось научиться чему-то интересному и сложному, хотя вроде бы сначала очень хотелось. Я думаю, что на 90% причиной подобных неудач являются неправильные представления и завышенные ожидания. Мы представляем себе процесс обучения как размеренный подъём по ступенькам лестницы. Нам кажется, что прогресс должен быть постоянным и заметным, что мотивация должна всегда нас сопровождать на этом пути. Если реальность отличается от ожиданий, велик соблазн подумать: "Проблема во мне. У меня нет способностей. Это просто не моё." и всё бросить.
Однако на самом деле обучение устроено иначе. Оно неравномерно. За маленькими победами следуют довольно долгие периоды "плато", когда кажется, что никакого прогресса нет, несмотря на все вложенные усилия. Могут быть и спады, особенно если сделали большой перерыв или взялись за непосильно сложную задачу или упражнение. Это совершенно нормально, путь изучения чего-то сложного ожидаемо труден и тернист. Если это осознать и принять, то становится легче проявлять терпение, не сдаваться, двигаться дальше. Особенно если также взять на вооружение три совета из моего предыдущего поста про мотивацию.
Ещё здесь мне хочется упомянуть три типа людей, у которых не получается достичь высокого уровня владения чем-либо сложным, будь то программирование, иностранный язык или игра на музыкальном инструменте. Я узнал об этих типажах из книги Джорджа Леонарда "Mastery". Знакомы ли они вам?
1. "Вечный неофит" (the Dabbler). Обожает начинать что-то новое, рассказывает о новом увлечении всем друзьям и знакомым, ловит кайф от первых успехов. Как только наступает плато, мгновенно теряет интерес и переключается на что-то другое.
2. "Одержимый" (the Obsessive). Всё ради результата. Бешеная мотивация, работа по 16 часов в сутки, любая неудача - это слабость, я не неудачник, я должен быть лучшим, мне нужен только быстрый прогресс... Выгорание и разочарование в себе.
3. "Хакер" (the Hacker). У них неплохо получается овладеть самыми азами, но дальше им становится лень. Нет желания развиваться и углублять знания. Не реализуют свой потенциал, потому что не берутся за дело всерьёз.
Каждый из нас может увидеть в себе черты, присущие одному или нескольким из этих типов. Важно вовремя это заметить и осознать, что подобные паттерны поведения - путь в никуда.
В заключение - успехов вам и не сдавайтесь!
#soft_skills
Задавались ли вы когда-нибудь вопросом, почему не получается сохранить мотивацию надолго? Например, человек вдруг захотел научиться играть на гитаре, купил себе инструмент, с восторгом и энтузиазмом начал заниматься, вот уже первые успехи - получилось сыграть бой "шестёрку", взять аккорд G - ещё больше мотивации, но... Подкрались и первые трудности, пальцы болят, упражнения делать лень, первоначальный запал куда-то подевался, и человек бросает то, что могло бы стать классным хобби на всю жизнь.
Наверное, у каждого есть подобный неудачный опыт, когда не получилось научиться чему-то интересному и сложному, хотя вроде бы сначала очень хотелось. Я думаю, что на 90% причиной подобных неудач являются неправильные представления и завышенные ожидания. Мы представляем себе процесс обучения как размеренный подъём по ступенькам лестницы. Нам кажется, что прогресс должен быть постоянным и заметным, что мотивация должна всегда нас сопровождать на этом пути. Если реальность отличается от ожиданий, велик соблазн подумать: "Проблема во мне. У меня нет способностей. Это просто не моё." и всё бросить.
Однако на самом деле обучение устроено иначе. Оно неравномерно. За маленькими победами следуют довольно долгие периоды "плато", когда кажется, что никакого прогресса нет, несмотря на все вложенные усилия. Могут быть и спады, особенно если сделали большой перерыв или взялись за непосильно сложную задачу или упражнение. Это совершенно нормально, путь изучения чего-то сложного ожидаемо труден и тернист. Если это осознать и принять, то становится легче проявлять терпение, не сдаваться, двигаться дальше. Особенно если также взять на вооружение три совета из моего предыдущего поста про мотивацию.
Ещё здесь мне хочется упомянуть три типа людей, у которых не получается достичь высокого уровня владения чем-либо сложным, будь то программирование, иностранный язык или игра на музыкальном инструменте. Я узнал об этих типажах из книги Джорджа Леонарда "Mastery". Знакомы ли они вам?
1. "Вечный неофит" (the Dabbler). Обожает начинать что-то новое, рассказывает о новом увлечении всем друзьям и знакомым, ловит кайф от первых успехов. Как только наступает плато, мгновенно теряет интерес и переключается на что-то другое.
2. "Одержимый" (the Obsessive). Всё ради результата. Бешеная мотивация, работа по 16 часов в сутки, любая неудача - это слабость, я не неудачник, я должен быть лучшим, мне нужен только быстрый прогресс... Выгорание и разочарование в себе.
3. "Хакер" (the Hacker). У них неплохо получается овладеть самыми азами, но дальше им становится лень. Нет желания развиваться и углублять знания. Не реализуют свой потенциал, потому что не берутся за дело всерьёз.
Каждый из нас может увидеть в себе черты, присущие одному или нескольким из этих типов. Важно вовремя это заметить и осознать, что подобные паттерны поведения - путь в никуда.
В заключение - успехов вам и не сдавайтесь!
Telegram
Плюшевый Питон
Как мотивировать себя? Три ошибки
#soft_skills
Меня просили написать о мотивации. Это вообще одна из самых важных тем. Откуда брать силы на изучение новых технологий и саморазвитие? Что помогает, а что мешает нашей мотивации? Как поддерживать себя, когда…
#soft_skills
Меня просили написать о мотивации. Это вообще одна из самых важных тем. Откуда брать силы на изучение новых технологий и саморазвитие? Что помогает, а что мешает нашей мотивации? Как поддерживать себя, когда…
Узнал от коллеги, что вышел опенсорсный "аналог" ChatGPT. Он простоват, конечно, по сравнению с творением OpenAI, но создатели говорят, что будут его развивать. Он понимает и по-русски, но на вопросы на английском умнее отвечает. См. скриншоты)
Поболтать с ним можно здесь:
https://huggingface.co/spaces/togethercomputer/OpenChatKit
Поболтать с ним можно здесь:
https://huggingface.co/spaces/togethercomputer/OpenChatKit