Русский
Русский
English
Статистика
Реклама

Рекомендации

Перевод Оценка трудозатрат в разработке ПО для начинающих

02.12.2020 06:07:25 | Автор: admin

Оценка временных затрат при разработке ПО может быть сложной задачей, но есть несколько хитростей, которые помогут получить точные цифры.

Помню, как меня впервые попросили дать оценку

Тогда это застало врасплох.

Меня завели в кабинет, где были мой начальник, его босс и кто-то из вышестоящего руководства, и мы сели за круглый стол, уставившись друг на друга.

Аналитики зачитали некоторые требования от клиента. Мы их коротко обсудили.

И тут мой начальник повернулся ко мне и спросил: Сколько времени это займет?

Я не знал, что сказать, меня к этому не готовили. Мне не сказали, что на этой встрече нужно будет давать оценку я думал, меня позвали поприсутствовать, чтобы я чему-то научился.

И вдруг на меня все смотрят и ждут ответа, а я растерялся и не знаю, что сказать.

Передо мной лежала бумага для заметок. Я взял один листок и начал писать какие-то числа без понятия, для чего, но точно не для этой оценки.

Где-то через минуту, которая показалась мне часом, я решил просто сказать первое, что пришло в голову: Не знаю часов 600?

Начальник рассмеялся, а затем сказал остальным рассчитывать на примерно 1200часов.

Не очень люблю вспоминать тот день.

Понятно, что мне еще многое предстояло узнать, но меня мучил один вопрос: как оценивать объем предстоящей работы?

Цель проведения оценки

Прежде чем приступать к оценке, нужно понять, для чего она будет использоваться. Вы сообщите цифры начальнику или вышестоящему руководству и что будет дальше?

Оценка объема работы используется в основном в двух целях:

  • Планирование.

  • Выставление счета клиенту.

Планирование

Старшие менеджеры, директора и вице-президенты компании заинтересованы в том, чтобы работа шла и выполнялась в срок. Им нужно знать, что и к какому времени будет сделано а для этого нужна оценка того, сколько времени уйдет на проект.

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

Допустим, в вашей команде разработчиков три человека. Каждый работает по 40часов в неделю это примерно 160часов в месяц, или 480часов в квартал (на троих примерно 1500часов).

Представьте, что ваша команда должна выполнить пять проектов с оценками объемов работ 800, 400, 300, 200 и 50часов. Планируя загрузку, вы будете видеть, что не сможете к концу квартала выполнить все проекты. Менеджеры составят график, использующий определенный процент максимальной загрузки на случай, если разработка займет больше времени, чем предполагалось.

С оценками из нашего примера можно было бы взяться за проекты на 800, 400 и 50часов, и при этом осталась бы некоторая свобода для маневра.

Выставление счета клиенту

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

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

Примечание. Это применимо не ко всем компаниям разработчикам ПО: не все занимаются разработкой на заказ. Если вы не разрабатываете ПО на заказ, то оценки объема работ будут использоваться в основном для планирования.

Ключевые факторы при оценке

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

Фото AbsolutVision, площадка UnsplashФото AbsolutVision, площадка Unsplash

1. Не оценивайте, сколько времени понадобится ВАМ

Первые два года своей карьеры в качестве оценщика я постоянно пытался определить, сколько времени на разработку ушло бы у меня но спрашивают-то не об этом.

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

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

2. Не занижайте завышайте

Помните, что в первую очередь оценка делается для планирования. Поэтому не нужно давать цифры, которые, по вашему мнению, могут быть превышены.

Если разработчики выйдут за отведенный вами срок, это нарушит график работ.

Находиться в границах 20% это нормально, но только если оценка оказалась завышена а не занижена.

К какой бы цифре вы ни пришли, добавьте к ней 20%: задачи обычно оказываются сложнее в реализации, чем кажется.

3. Повышение квалификации

Потребуется ли команде для выполнения проекта изучать что-то новое? Например, если вы обычно разрабатываете приложения для толстых клиентов, а новый проект это создание веб-страницы.

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

Фото Matheus Frade, площадка UnsplashФото Matheus Frade, площадка Unsplash

4. Примеры аналогичных проектов

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

Если у команды имеется некий опорный материал в виде ранее разработанного ПО, то объем работы может значительно снизиться. Разработчикам проще действовать по принципу копировать, вставить, заменить, и это отражается на скорости выполнения задач.

Обязательно подумайте, делали ли что-то подобное в этой компании раньше. Если у вас есть специалисты, которые занимались такого рода проектами, проконсультируйтесь с ними при оценке и обязательно используйте их код в качестве вспомогательного при разработке.

5. Не забывайте об аналитиках

Часто вас будут просить дать полную оценку, а она включает в себя время разработчиков, бизнес-аналитиков и специалистов по обеспечению качества.

В этом случае дать оценку только по разработчиками будет мало нужно учесть, что бизнес-аналитикам придется писать документацию, делать пользовательские истории и руководить обзорами спринтов.

Также потребуется учесть время, необходимое отделу контроля качества для тестирования. Возможно, у вас есть какая-то система автоматизации, которую нужно настроить и для этого проекта тоже? На всё это нужно время, которое также включается в оценку.

Заключение

Чтобы научиться давать оценку объему работу, нужно время. Этот навык, как и любой другой, требует практики.

Со временем оценки будут даваться вам всё легче. Запомните перечисленные моменты, научитесь понимать, сколько времени занимает разработка определенных элементов, и полагайтесь на свой опыт.

Если резюмировать самое главное, запомните вот что:

задача всегда сложнее, чем кажется, и лучше переоценить объем работ, чем недооценить.

Никто не будет злиться, если у вас всё пойдет по плану, начальство даже порадуется! И при этом у вас останется больше времени на другие проекты.

Так что не стесняйтесь выделять побольше времени и помните, что оценка это всего лишь оценка.


О переводчике

Перевод статьи выполнен в Alconost.

Alconost занимается локализацией игр, приложений и сайтов на 70 языков. Переводчики-носители языка, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов.

Мы также делаем рекламные и обучающие видеоролики для сайтов, продающие, имиджевые, рекламные, обучающие, тизеры, эксплейнеры, трейлеры для Google Play и App Store.

Подробнее..

Перевод Антипаттерны деплоя в Kubernetes. Часть 2

04.06.2021 12:23:32 | Автор: admin

Перед вами вторая часть руководства по антипаттернам деплоя в Kubernetes. Советуем также ознакомиться с первой частью.

Список антипаттернов, которые мы рассмотрим:

  1. Использование образов с тегом latest

  2. Сохранение конфигурации внутри образов

  3. Использование приложением компонентов Kubernetes без необходимости

  4. Использование для деплоя приложений инструментов для развёртывания инфраструктуры

  5. Изменение конфигурации вручную

  6. Использование кubectl в качестве инструмента отладки

  7. Непонимание сетевых концепций Kubernetes

  8. Использование неизменяемых тестовых окружений вместо динамических сред

  9. Смешивание кластеров Production и Non-Production

  10. Развёртывание приложений без Limits

  11. Неправильное использование Health Probes

  12. Не используете Helm

  13. Не собираете метрики приложений, позволяющие оценить их работу

  14. Отсутствие единого подхода к хранению конфиденциальных данных

  15. Попытка перенести все ваши приложения в Kubernetes

6. Использование кubectl в качестве инструмента отладки

Утилита kubectl незаменима при работе с кластерами Kubernetes. Но не стоит использовать её как единственный отладочный инструмент.

При возникновении проблем, особенно в production кластере, вашим первым импульсом не должен быть запуск kubectl. Если вы поступаете именно так, то вы уже проиграли битву, особенно если сейчас 3 часа ночи, сервисы не работают, и вы на связи.

kubectl get nskubectl get pods -n saleskubectl describe pod prod-app-1233445 -n saleskubectl get svc - n saleskubectl describe...

Вместо этого все ваши кластеры Kubernetes должны иметь надлежащие системы мониторинга, трассировки и сбора логов, которые можно использовать для своевременного выявления проблем. Если вам нужно запустить kubectl для проверки чего-либо, это означает, что вы не учли это, настраивая вашу систему мониторинга.

Сложно переоценить ценность метрик и трассировок, мы расскажем о них отдельно в одном из следующих антипаттернов.

Даже если вы просто хотите проверить конфигурацию кластера, вы также можете использовать для этой цели специальный инструмент. Сегодня существует множество решений для работы с кластерами Kubernetes.

Например, обратите внимание на Kubevious, это универсальная панель управления Kubernetes, которая позволяет вам искать и отображать ресурсы Kubernetes в соответствии с настраиваемыми правилами.

7. Непонимание сетевых концепций Kubernetes

Прошли те времена, когда единственный балансировщик нагрузки был всем, что необходимо для настройки подключения к вашему приложению. Kubernetes представляет свою собственную сетевую модель, и вам нужно разобраться с её основными концепциями. По крайней мере, вы должны быть знакомы с типами сервисов - Load Balancer, Cluster IP, Node Port и понимать, чем сервисы отличаются от Ingress.

Сервисы типа Сluster IP используются внутри кластера, Node Port также могут использоваться внутри кластера, но при этом доступны снаружи, а балансировщики нагрузки могут принимать только входящий трафик.

Но это ещё не всё потребуется разобраться, как в кластере Kubernetes работает DNS. И не забывать, что весь трафик между служебными компонентами шифруется и нужно контролировать срок действия сертификатов.

Будет полезно разобраться, что такое Service Mesh и какие проблемы она решает. Необязательно разворачивать Service Mesh в каждом кластере Kubernetes. Но желательно понимать, как она работает и зачем вам это нужно.

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

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

8. Использование неизменяемых тестовых окружений вместо динамических сред

Когда вы используете виртуальные машины или физические сервера, то командам разработчиков программного обеспечения обычно предоставляется несколько тестовых сред, которые используются для проверки приложения, прежде чем оно попадет в production.

Один из наиболее распространенных подходов наличие как минимум трех сред (QA / Staging / Production), в зависимости от размера компании их может быть больше. Наиболее важной из них является интеграционная, которая содержит результат слияния всех обновлений с основной веткой.

Когда вы используете неизменяемые тестовые среды, вы платите за них, даже если они не используются. Но наиболее серьёзной проблемой является изоляция обновлений для последующего тестирования.

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

  1. Обновление A содержит ошибки, B и C в порядке

  2. Обновление B содержит ошибки, A и C в порядке

  3. Обновление C содержит ошибки, B и A в порядке

  4. Каждое обновление в отдельности работает, но при работе вместе с обновлениями A и B возникает ошибка

  5. Каждое обновление в отдельности работает, но при работе вместе с обновлениями A и C возникает ошибка

  6. Каждое обновление в отдельности работает, но при работе вместе с обновлениями B и C возникает ошибка

  7. Каждое обновление в отдельности работает, но все 3 обновления вместе не работают

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

Способы избежать подобных проблем:

  1. "Резервирование" промежуточного (stage) окружения разработчиками, чтобы они имели возможность тестировать свои обновления изолированно.

  2. Компания создает несколько staging сред, которые разработчики используют для тестирования своих обновлений (поскольку единственное staging окружение может быстро стать узким местом).

Эта ситуация по-прежнему приводит к проблемам, потому что разработчики должны не только координировать действия между собой при выборе сред, но также потому, что вы должны отслеживать действия по очистке каждой среды. Например, если нескольким разработчикам требуется набор изменений базы данных, им необходимо убедиться, что база данных содержит только необходимые данные, а не данные предыдущего разработчика, который использовал эту среду.

Кроме того, несколько промежуточных (staging) сред могут страдать от проблемы дрейфа конфигурации, когда среды должны быть одинаковыми, но после нескольких изменений это уже не так.

Решение, конечно же, состоит в том, чтобы отказаться от ручного обслуживания статических сред и перейти к динамическим средам, которые создаются и уничтожаются по запросу. С Kubernetes это очень легко сделать:

Есть много способов реализовать этот сценарий, по крайней мере, каждый запрос Pull Request должен создавать динамическую среду, содержащую только этот запрос Pull Request и ничего больше. Среда автоматически уничтожается, когда Pull Request объединяется / закрывается или по прошествии определенного времени.

Преимущество динамических сред это полная свобода разработчиков. Если я разработчик и только что закончил работу с обновлением A, а мой коллега завершил работу над обновлением B, я должен иметь возможность:

git checkout mastergit checkout -b feature-a-b-togethergit merge feature-agit merge feature-bgit push origin feature-a-b-together

Как по волшебству, будет создана динамическая среда:feature-a-b-together.staging.company.comилиstaging.company.com/feature-a-b-together.

Для создания динамических сред вы можете использовать, например, пространства имен Kubernetes.

Обратите внимание, что это нормально, если у вашей компании есть постоянные staging среды для специализированных нужд, таких как нагрузочное тестирование, тестирование на проникновения, развертывание A / B и т. д. Но для базового сценария Я разработчик и хочу, чтобы моё обновление работало изолированно и запускались интеграционные тесты динамические среды лучшее решение.

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

9. Смешивание кластеров Production и Non-Production

Несмотря на то, что Kubernetes специально разработан для оркестрирования кластеров, вы не должны создавать единый кластер для всех ваших окружений. Как минимум у вас должно быть два кластера: производственный и непроизводственный.

Прежде всего, смешивание Production и Non-Production кластеров может привести к нехватке ресурсов.

Так как приложение, работающее некорректно, может утилизировать слишком много ресурсов.

Для разработчиков самая большая проблема связана с безопасностью. Если вы не предпринимаете дополнительных шагов по настройке Kubernetes, то вопреки распространенному мнению, под из одного пространства имен может свободно взаимодействовать с подом из другого пространства имен. Также есть некоторые ресурсы Kubernetes, которые вообще не имеют пространства имен.

Пространства имен Kubernetes не являются мерой безопасности. Если ваша команда обладает глубокими знаниями Kubernetes, то действительно можно поддерживать мультитенантность внутри кластера и защищать все рабочие нагрузки друг от друга. Но это требует значительных усилий, и в большинстве случаев гораздо проще создать второй кластер исключительно для production.

Если вы объедините этот антипаттерн со вторым (сохранение конфигурации внутри образов), должно стать очевидно, что может произойти множество негативных сценариев, например:

  1. Разработчик создает новое пространство имен, используемое для тестирования и production.

  2. Далее развертывается приложение и запускаются интеграционные тесты.

  3. Интеграционные тесты записывают фиктивные данные или очищают БД.

  4. К сожалению, в контейнерах были рабочие URL-адреса и конфигурация внутри них, и, таким образом, все интеграционные тесты фактически повлияли на работу production!

Чтобы не попасть в эту ловушку, гораздо проще просто создать Production и Non-Production кластера. К сожалению, многие руководства описывают сценарий при котором, пространства имен можно использовать для разделения сред, и даже в официальной документации Kubernetes есть примеры с пространствами имен prod / dev.

Обратите внимание, что в зависимости от размера вашей компании у вас может быть больше кластеров, чем два, например:

  1. Production

  2. Pre Production (Shadow) клон production, но с меньшими ресурсами

  3. Development кластер, который мы уже обсуждали выше

  4. Специализированный кластер для нагрузочного тестирования / тестирования безопасности

  5. И даже отдельный кластер для служебных инструментов

10. Развёртывание приложений без Limits

По умолчанию приложение, развернутое в Kubernetes, не имеет ограничений на использование ресурсов. Это означает, что ваше приложение потенциально может мешать работе всего кластера, поскольку утечка памяти или высокая загрузка ЦП нанесут ущерб остальным приложениям, работающим в кластере.

Это означает, что все ваши приложения (независимо от окружения) должны иметь ограничения на использование ресурсов.

К сожалению, просто взглянуть на среднюю загрузку памяти и ЦП приложением недостаточно. Вам необходимо изучить свое приложение и отследить всплески трафика и нагрузки, а также понять, как оно ведёт себя в этих условиях. Вы же не хотите, чтобы ваше приложение перезапускалось без причины.

Одно из преимуществ Kubernetes эластичность ресурсов. Если кластер убивает / перезапускает ваше приложение, когда оно начинает обрабатывать значительную нагрузку (например, ваш интернет-магазин испытывает всплеск трафика), вы не используете все преимущества Kubenetes. Вы можете решить эту проблему с использованием vertical pod auto-scaler (VPA).

Подробнее..

Правильное питание мифы и реальность. Часть 1

06.12.2020 22:08:26 | Автор: admin
image

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


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


Цель этой статьи: исследовать и проверить 5 рекомендаций правильного питания. Какие из них окажутся мифами, а какие разумными? Кроме того, я объясню, что такое полезный и вредный продукты. Для тех, кому ближе формат блога, на моём YouTube канале Пролить свет есть видео по материалу данного мета-анализа.



Что такое полезный и вредный продукт?


image

Наверняка, у вас есть знакомый или знакомая, которые говорили что-то вроде: фу, зачем ты это ешь? Оно же вредное! Ешь лучше это. Оно полезное.


Когда я пытался добиться объяснения вредности у этих знакомых, то чаще не получал рационального ответа. Обычно они отвечают, что просто слышали об этом. Но мы же знаем, что источники бывают так недостоверны


Полезный продукт, по моему мнению, это продукт с хорошим сбалансированным набором аминокислот (белков), минералов, витаминов и других нужных организму веществ, употребляемый контролируемо.


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


Кроме того, существуют пустые продукты. В них просто нет практически ничего, кроме, например, крахмала или воды.


Перейдём к рассмотрению рекомендаций.



Рекомендация #1. Заменить кофе цикорием


image

Полезна ли частичная или полная замена кофе цикорием? Цикорий это растение, растворимый порошок из которого по вкусу и цвету похож на кофе.


Если посмотреть информацию по цикорию (как напитку) в интернете, то можно просто обалдеть! Оказывается, это полезнейший продукт, который содержит в себе уйму калия, а также понижает уровень сахара в крови. И это неправда.


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


А вот то, чем цикорий действительно полезен это отсутствием кофеина!


О вреде кофеина по-научному


image

Кофеин это алкалоид и самое популярное психоактивное вещество в мире, влияющее на функционирование ЦНС. Если что, алкалоиды это такие вещества, как морфин, никотин, эфедрин и кодеин, из которого получают дезоморфин, более известный в народе, как крокодил.


Кофеин, конечно, не такой токсичный и сильный наркотик, как перечисленные, но считать его безвредным нельзя.


Рекомендуемая дневная доза 200 мг. Это примерно 4 чашки чёрного чая, либо 1 большой капучино. Далее я зачитаю вам стопку научных исследований, после которой вы решите либо отказаться от кофеина, либо частично заменить его цикорием.


Научные работы о вреде кофеина


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


Национальный центр биотехнической информации США опубликовал исследование, что кофеин повышает выработку кортизола (гормон стресса). Это приводит к плохой стрессоустойчивости, негативному мышлению, а в самых плохих случаях к эффекту загнанного в угол.


Этот же центр опубликовал исследование, что употребление кофеина за 6 часов до сна ухудшает его качество и сокращает длительность до одного часа.


И опять этот же центр опубликовал исследование о том, что кофеин может являться причиной ежедневной головной боли.


Британское фармацевтическое сообщество опубликовало исследование, согласно которому кофеин уменьшает шанс забеременеть на 27% из-за снижения мышечной активности в маточных трубках, которые приносят яйцеклетки в матку.


Национальный институт здоровья США опубликовал статью с результатами исследований о зависимости между потреблением кофеина и потерей беременности. 300 мг кофеина (это примерно 2 чашки американо или 6 чашек чёрного чая) могут препятствовать росту плода, нарушать его сердечный ритм и, в худшем случае, привести к его потере.


Учёные из Южной Кореи опубликовали исследование, что регулярное действие кофеина на психику приводит к набору веса (косвенно), снижению эффективности мышления и усилению депрессии.


Американская ассоциация диабетиков опубликовала исследование, из которого следует, что уровень глюкозы в крови незначительно (но заметно) повышается в следствии угнетения инсулина кофеином.


Вывод #1


Кофеин это зло. Не употребляйте его. Если для вас потеря одного напитка из всего ассортимента является большим неудобством, замените кофе цикорием либо частично, либо полностью. Я, например, принял для себя решение: выпивать 1 латте по выходным, если сильно захочется, а в остальное время использовать цикорий.



Рекомендация #2. Отказ от глютена и безглютеновые макароны


image

Следующая наша остановка глютен. Простыми словами, это вещество, которое склеивает частицы пшеницы и других зерновых культур. Благодаря глютену можно замесить тесто и слепить из него, например, колобка.


Сейчас очень популярны безглютеновые диеты, а безглютеновые продукты появляются в здоровых отделах супермаркетов. Как ещё объяснить то, что даже компания Макфа выпустила рисово-кукурузные макароны. Бизнес, как известно, реагирует на спрос.


На самом деле, глютен демонизирован. Он представляет опасность только для людей с целиакией болезнью, когда иммунитет начинает вести войну с глютеном. Подтверждений, что глютен вреден для остальных людей, нет.


Что там по макаронам?


Макароны gluten-free, как правило, чуть менее калорийные за счёт меньшего количества крахмала и в них чуть больше пищевых волокон, но это слишком малые различия. Гликемический индекс и у кукурузно-рисовых макарон, и у пшеничных макарон, находится в районе 4060. Это верхняя граница простых углеводов.


А вот аминокислотный состав у обычных макарон в разы лучше. Здесь есть все незаменимые аминокислоты в неплохом объёме. См. таблицу ниже.



image

Вывод #2


Gluten-free for all ложный тренд. Глютен безвреден для большинства людей. Использование безглютеновых макарон не делает рацион полезнее и эффективнее. Наоборот, лишает вас незаменимых аминокислот. Если у вас нет индивидуальных непереносимостей, ешьте обычные макароны из твёрдых сортов пшеницы в меру. Если что, твёрдые сорта это те, которые нужно варить больше 8 минут. Исключение составляет мелкая вермишель. Подробнее о макаронах из твёрдых сортов я рассказываю в моём Telegram-канале.

Рекомендация #3. Стевия вместо сахара


image

Сахар. Он добавляется даже в те продукты, которые не кажутся нам сладкими. Если не читать состав и не следить за ним намеренно, будьте уверены, вы махнёте лишнего! Хотя, что значит лишнего?


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


Но насилие над собой и отказ от любимого сладенького тоже не выход. Выход это сахарозаменитель на основе травы стевии.



Смертельная битва между сахаром и стевией


image

Калорийность сахара 387; стевии 0. Это потому что стевиоид (молекула стевии) не углевод, а гликозид. Следовательно, гликемический индекс сахара 65; стевии 0. Сахар сладкий, но стевия слаще в 30 раз. Сахар на вкус привычный и классный, но стевия тоже классная, однако имеет особый привкус, который может оставаться во рту. Привкус не плохой, а просто особый.


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



Вывод #3


Стевия ваш надёжный партнёр в борьбе с сахаром, лишним весом и болезнями сердца! Используйте её вместо сахара везде, где это возможно: в напитках, выпечке и соусах. Информация о её мутагенности миф.



Рекомендация #4. Заменить подсолнечное масло


image

Помню, как 10 лет назад я всё чаще начал слышать точку зрения, что подсолнечное масло следует заменить оливковым. Но сейчас и это подвергается сомнению. Эко-уголки в магазинах предлагают нам другие (более дорогие) масла. Такие, как, например, кокосовое.


Совершенно непонятно, что это за новая волна и кому верить. Действительно ли оливковое масло лучше подсолнечного? А может кокосовое лучше оливкового и подсолнечного вместе взятых?



Разбираемся в том, что такое масло вообще


Первое. Любое масло это на 99% жир. В нём практически нет белков, углеводов, витаминов и минералов.


Второе. Жир нужен организму, вопреки расхожему мнению. Он помогает телу усваивать витамины A, D, E, и K, необходим для мозга и нервных функций.


Третье. Глобально жир делится на насыщенный и ненасыщенный. Насыщенный жир плохой. Ненасыщенный полезный в контролируемых количествах.


Четвёртое. Ненасыщенные жиры делятся на мононенасыщенные и полиненасыщенные. Мононенасыщенные жирные кислоты более устойчивы к жарке и обработке. Вредных веществ образуется меньше.


Учёные из Кембриджской школы клинической медицины доказали связь употребления насыщенных жиров с высоким уровнем плохого холестерина в крови, который является причиной сердечных заболеваний. Плохой холестерин также называется lipoprotein LDL cholesterol или ЛПНП (липопротеины низкой плотности).


Сердечная ассоциация США сообщает, что ненасыщенные жиры могут уменьшить риск сердечных заболеваний людей, которые выбрали их вместо насыщенных и транс-жиров.


Исследуем жировой профиль масел


Теперь давайте взглянем на таблицу жирового состава оливково, кокосового, рапсового и подсолнечного масла через призму полученной информации.


image

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


Оливковое масло, наоборот, содержит в себе самое большое количество полезных мононенасыщенных жиров. Как уже было сказано, мононенасыщенные жиры более устойчивы при жарке, поэтому, в случае с оливковым маслом, вредных соединений образуется меньше. Оливковое масло первого отжима лучше подходит для жарки.


В магазинах продаётся специальное оливковое масло для жарки. Я знаю, что многие (по ошибке) жарят на оливковом масле, которое предназначено для заправки салатов. Будьте внимательны!


На почётное второе место я бы поставил рапсовое масло. Во-первых, в нём также много ненасыщенных жиров, во-вторых, большая часть из них мононенасыщенные.


Вывод #4


Польза кокосового масла миф. Смысл в замене подсолнечного масла оливковым есть. Используйте специальное оливковое масло для жарки и обычное Extra Virgin для заправки салатов. Да, существует большое количество других масел, но все они требуют детального изучения. Я обязательно сделаю выпуск об этом, а пока безвредность оливкового масла ваша надёжная синичка в руках.



Рекомендация #5. Использовать альтернативное молоко вместо коровьего


image

Есть молоко, которое даёт корова, а есть, которое получается путём замачивания зёрен или орехов в воде. Второй вариант называется альтернативным молоком.


Изначально, основное предназначение альтернативного молока заменять обычное для тех, у кого есть с ним проблемы (аллергия, непереносимость). Например, в китайской культуре используют соевое молоко из-за непереносимости лактозы. Но есть мнение, что альтернативное молоко гораздо полезнее обычного в принципе. Проверим!


Сравним составы альтернативного молока с коровьим


Начнём с того, что общий собирательный термин альтернативное молоко, не совсем корректен. Альтернативное молоко, чаще всего, бывает миндальным, соевым, рисовым и кокосовым. В зависимости от сырья, из которого его изготавливали, состав будет очень сильно меняться.


Давайте взглянем на таблицу составов различных видов альтернативного молока. Будем начислять по баллу за преимущество (зелёные цифры) и отнимать бал за очевидный вред (оранжевые цифры).


image

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


image

Вывод #5


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



Заключение


Недавно я отказался от кофе, сахара, молока и алкоголя на 2 недели. Эффект, которой я получил, был настолько потрясающим, что теперь я просто не могу иначе. Я полон энергии, сконцентрирован и работоспособен целый день. Я больше не устаю к 6 вечера.


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


Вы можете следить за мной на YouTube и в Instagram.

Подробнее..

Перевод Как машинное обучение влияет на алгоритм ранжирования ленты новостей в Facebook

02.02.2021 22:08:40 | Автор: admin
Разработка персонализированной системы ранжирования для более чем 2 миллиардов человек (учитывая, что у всех разные интересы) и обилием контента на выбор представляет собой серьёезные и сложные задачи. Это то, чем мы занимаемся каждый день с системой ранжирования News Feed. Без машинного обучения новостные ленты людей могут быть переполнены контентом, который они не считают актуальным или интересным (включая чрезмерно рекламный контент или постоянные публикации от знакомых), который будет выше в ленте, чем публикации от близких друзей или родственников. Ранжирование существует, чтобы помочь решить эти проблемы, но как создать систему, которая представляет такое количество различных типов контента таким образом, чтобы он был персонализирован для каждого человека в Facebook? Мы используем машинное обучение, чтобы предсказать, какой контент будет иметь наибольшее значение для каждого человека, чтобы сделать его более интересным и позитивным для пользовательского опыта. Мы делимся новыми подробностями о том, как в Facebook разработали систему ранжирования лент новостей на основе машинного обучения.




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

Построение алгоритма ранжирования


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

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

Возьмём, к примеру, видео с пробежки Саанви. В Facebook есть один конкретный наблюдаемый сигнал о том, что пост имеет ценность для кого-то, это нажатие кнопки Нравится. Учитывая различные атрибуты, которые известны о публикации (кто отмечен на фотографии, когда она была опубликована и т. д.), мы можем использовать характеристики публикации $X_{it}$ по отношению к зрителю (j) в момент времени (t) и спрогнозировать $Y_{ijt}$ (понравится ли Хуану публикация). Математически для каждой публикации (i) мы оцениваем $Y_{ijt} = f(x_{ijt}1; x_{ijt}2; ... x_{ijt}C)$, где C представляет характеристику c(1..C), такую как тип публикации или отношения между пользователями и автором поста (например, отметили ли они друг друга как членов семьи), а функция f(.) объединяет атрибуты в одно значение.

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

Но разве Хуан выражает свои предпочтения, только когда ставит лайки? Конечно, нет. Он может делиться статьями, которые ему интересны, смотреть трансляции своих любимых стримеров или оставлять осмысленные комментарии к публикациям друзей. Математически всё усложняется, когда нам нужно оптимизировать это для нескольких целей, каждая из которых вносит вклад в нашу общую цель (создание наиболее долгосрочной ценности для людей). У вас может быть несколько значений ($Y_{ijtk}$), например, лайков, комментариев и репостов, каждое для разного значения k, которые все должны каким-то образом агрегировать до одного значения Vijt. Ещё больше усложняет ситуацию то, что для каждого человека в Facebook есть тысячи сигналов, которые нам нужно оценить, чтобы определить, что для этого человека может оказаться наиболее актуальным, поэтому алгоритм становится очень сложным на практике.

Как выбрать общую ценность для экосистемы размером с Facebook? Мы хотим предоставить людям, которые пользуются нашими услугами, долгосрочную ценность. Насколько ценны для Хуана просмотр видеоролика друга или чтение интересной статьи? Мы думаем, что лучший способ оценить, создаёт ли что-то долгосрочную ценность для кого-то, это выбрать показатели, соответствующие тому, что пользователи считают важным для них. Поэтому мы опрашиваем пользователей о том, насколько значимым они считают общение со своими друзьями и стоит ли публикация их времени, чтобы убедиться, что наши ценности (Y_{ijtk}) отражают то, что пользователи считают значимым.

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

Аппроксимация идеальной функции ранжирования в масштабируемой системе ранжирования


Теперь, когда мы знаем теорию ранжирования на примере ленты новостей Хуана, нам нужно определить, как построить систему для этой оптимизации. Нужно оценить все публикации, доступные для более чем 2 миллиардов человек (в среднем более 1000 публикаций на пользователя в день), что является сложной задачей. И нам нужно делать это в режиме реального времени, поэтому нам нужно знать, получила ли статья много лайков, даже если она была опубликована всего несколько минут назад. Нам также нужно знать, нравился ли Хуану другой контент последнее время, чтобы мы могли оптимально использовать эту информацию при ранжировании.

Наша системная архитектура использует уровень Web/PHP, который запрашивает агрегатор фидов. Роль агрегатора фидов состоит в том, чтобы собрать всю релевантную информацию о публикации и проанализировать все функции (например, сколько людей оценили этот пост ранее), чтобы предсказать ценность публикации Y{ijt} для пользователя, а также итоговый рейтинг Vijt путём агрегирования всех прогнозов.

Когда кто-то открывает Facebook, независимо от внешнего интерфейса (iPhone, Android, веб-браузер), интерфейс отправляет запрос на уровень Web/PHP (фронтенд), который затем запрашивает агрегатор фидов (бэкенд). После принятия запроса от фронтенда агрегатор фидов извлекает действия и объекты вместе со сводкой по объектам из конечных баз данных фидов, чтобы обрабатывать, агрегировать, ранжировать и возвращать результирующий список ранжированных FeedStories на внешний интерфейс для рендеринга.

А теперь давайте посмотрим, как работает агрегатор.

  1. Собираем данные. Сначала нам нужно собрать все публикации-кандидаты, которые мы можем ранжировать для Хуана (фото кокер-спаниеля, видео с пробежки и другие публикации). Первая часть довольно проста: соответствующие данные включают в себя все неудалённые публикации, которыми поделился с Хуаном друг, паблики или группы, на которые он подписан с момента его последнего входа в систему. Но как насчёт публикаций, появившихся перед входом Хуана в систему, которые он ещё не видел? Возможно, они будут более качественными или более актуальными, чем более старые публикации, но у него просто не было времени их просмотреть. Чтобы убедиться, что непросмотренные публикации также будут просмотрены, у нас есть логика кеширования непрочитанных публикаций: свежие публикации, которые Хуан ещё не видел, но которые были ранжированы для него в его предыдущих сессиях, снова могут быть просмотрены им. У нас также есть логика действий: если в какой-либо публикации, которые Хуан уже видел, возникла интересная беседа среди его друзей, Хуан может иметь право снова увидеть этот пост как публикацию с комментариями.
  2. Оценка $X_{it}$ для Хуана для каждого прогноза ($Y_{ijt}$). Теперь, когда у нас есть собранные данные для Хуана, мы оцениваем каждую публикацию с помощью многозадачных нейронных сетей. Есть очень много функций ($x_{ijtc}$), которые мы можем использовать для прогнозирования $Y_{ijt}$, включая тип публикации, встраивания (то есть представления функций, генерируемые моделями глубокого обучения) и то, с чем обычно взаимодействует пользователь. Чтобы рассчитать это для более чем 1000 публикаций, для каждого из миллиардов пользователей (всё в реальном времени), мы запускаем эти модели для всех историй кандидатов параллельно на нескольких машинах, называемых предикторами.
  3. Подсчитайте один результат из множества прогнозов: $V_{ijt}$. Теперь, когда у нас есть все прогнозы, мы можем объединить их в один результат. Для этого необходимо несколько проходов для экономии вычислительной мощности и применения правил, таких как разнообразие типов контента (т. е. тип контента должен быть разнообразным, чтобы пользователи не видели повторяющиеся типы контента, такие как несколько видео, одно за другим), зависящих от начального рейтингового балла. Во-первых, к каждому посту применяются определённые процессы целостности. Они предназначены для определения того, какие меры по обнаружению целостности, если таковые имеются, необходимо применить к историям, выбранным для ранжирования. Затем на этапе 0 запускается облегчённая модель, чтобы выбрать примерно 500 наиболее релевантных публикаций для Хуана, которые имеют право на ранжирование. Это помогает нам ранжировать меньше историй с высокой степенью запоминания на более поздних этапах, чтобы мы могли использовать более мощные модели нейронных сетей. Первый проход это основной проход для подсчёта очков, где каждая история оценивается независимо, а затем все ~500 подходящих публикаций упорядочиваются по количеству баллов. Наконец, у нас есть проход 2, который является контекстным проходом. Здесь добавлены контекстные функции, такие как правила разнообразия типов контента, чтобы помочь разнообразить ленту новостей Хуана.

Более пристальный взгляд на первый этап: большая часть персонализации происходит на первом этапе. Мы хотим оптимизировать то, как мы комбинируем $Y_{ijtk}$ в $V_{ijt}$. Для некоторых оценка может быть выше за лайки, чем за комментарии, поскольку некоторым людям нравится выражать себя больше через лайки, чем за комментарии. Для простоты и управляемости мы оцениваем наши прогнозы линейным способом,

$V_{ijt} = w_{ijt1}Y_{ijt1} + w_{ijt2}Y_{ijt2} + + w_{ijtk}Y_{ijtk}$. Обратите внимание, что у этой линейной формулировки есть преимущество: любое действие, в котором редко участвует человек (например, предсказание по лайкам, которое очень близко к 0), автоматически получает минимальную роль в рейтинге, поскольку $Y_{ijtk}$ для этого события очень низкое. Чтобы персонализировать публикации за пределами этого измерения, мы продолжаем исследования персонализации на основе данных наблюдений. Люди с более высокой корреляцией получают большую ценность от этого конкретного события, если мы делаем этот метод инкрементным и контролируем возможные мешающие переменные.

После того как мы завершим все этапы ранжирования, у нас будет лента новостей для Хуана (и всех людей, использующих Facebook) в режиме реального времени, готовая к использованию и потреблению.

Теперь, когда вы лучше понимаете теорию, архитектуру ранжирования и инженерные разработки, лежащие в основе новостной ленты, вы можете увидеть, как наш алгоритм ранжирования помогает создавать ценный опыт для людей в ранее невообразимых масштабах и скорости. Хуан выигрывает от того, что видит более значимый и интересный контент, когда он заходит в Facebook, как и миллиарды других людей. Мы постоянно совершенствуем нашу систему ранжирования, повторяя наши модели прогнозирования, улучшая персонализацию и многое другое, чтобы помочь людям найти контент, который создаёт ценность и помогает им оставаться на связи с друзьями и семьёй.

Пока в Fecebook постоянно совершенствуют систему ранжирования, повторяя модели прогнозирования, улучшая персонализацию и многое другое, мы в SkillFactory продолжаем обучать машинному обучению. Для хабравчан постоянно действует промокод HABR, прибавляющий 10% к скидке на баннере.



image



Подробнее..

Рекомендации Друзей ВКонтакте ML на эго-графах

13.04.2021 14:10:30 | Автор: admin

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

Меня зовут Женя Замятин, я работаю в команде Core ML ВКонтакте. Хочу рассказать, как устроены рекомендации, которые делают ближе пользователей самой крупной социальной сети рунета.

Обзор

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

Прежде всего сформулируем задачу, которую будем решать: для каждого пользователя необходимо найти k кандидатов, которых он с наибольшей вероятностью добавит в друзья. Метрика, на которую будем ориентироваться, recall@k. Она идеально описывает задачу: на первом уровне нам не интересен порядок кандидатов, но важна их релевантность.

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

Ещё один важный метод рекомендаций Adamic/Adar. В его основе лежит всё тот же анализ общих друзей, но с модификацией: авторы предлагают учитывать число друзей у общего друга. Чем больше это значение, тем меньше информации о релевантности он несёт.

Кроме методов на основе анализа общих друзей, довольно распространены рекомендации на базе эмбеддингов. В Лаборатории искусственного интеллекта ВКонтакте в МФТИ мы провели исследование: сравнили эффективность разных подходов к задаче предсказания дружб в VK. Результаты совпали с нашим опытом решения на базе графовых эмбеддингов у нас работают плохо. Учитывая это, мы стали развивать систему отбора кандидатов по пути анализа общих друзей.

EGOML

Общая схема нашего метода продолжает идеи числа общих друзей и Adamic/Adar. Финальная мера релевантности E(u, v), с помощью которой мы будем отбирать кандидатов, всё так же раскладывается в сумму по общим друзьям u и v. Ключевое отличие в форме слагаемого под суммой: в нашем случае это мера ez_c(u, v).

Сначала попробуем понять физический смысл меры ez_c(u, v). Представим, что мы взяли пользователя c и спросили у него: Насколько вероятно, что два твоих друга, u и v, подружатся? Чем больше информации для оценки он учтёт, тем точнее будет его предсказание. Например, если c сможет вспомнить только число своих друзей, его рассуждения могут выглядеть следующим образом: Чем больше у меня друзей, тем менее вероятно, что случайные двое из них знакомы. Тогда оценка вероятность дружбы u и v (с точки зрения c) может выглядеть как 1/log(n), где n число друзей. Именно так устроен Adamic/Adar. Но что если c возьмёт больше контекста?

Прежде чем отвечать на этот вопрос, разберёмся, почему ez_c(u, v) важно определять через пользователя c. Дело в том, что в таком виде очень удобно решать задачу распределённо. Представим, что теперь мы разослали всем пользователям платформы анкету с просьбой оценить вероятность дружбы в каждой паре их друзей. Получив все ответы, мы можем подставить значения в формулу E(u, v). Именно так выглядит вычисление E(u, v) с помощью MapReduce:

  • Подготовка. Для каждого c выделяется тот контекст, который он будет учитывать для вынесения оценок. Например, в Adamic/Adar это будет просто список друзей.

  • Map. Спрашиваем у каждого c, что он думает про возможность дружбы в каждой паре его друзей. По сути, вычисляем ez_c(u, v) и сохраняем в виде (u, v) ez_c(u, v) для всех u, v in N(c). В случае Adamic/Adar: (u, v) 1/log|N(c)|.

  • Reduce. Для каждой пары (u, v) суммируем все соответствующие ей значения. Их будет ровно столько, сколько общих друзей у u и v.

Таким образом мы получаем все ненулевые значения E(u, v). Заметим: необходимое условие того, что E(u, v) > 0, существование хотя бы одного общего друга у u и v.

Эго-граф ХоппераЭго-граф Хоппера

Контекстом пользователя c в случае меры ez_c будет тот же список друзей, но дополненный информацией о связях внутри этого списка. Такую структуру в науке называют эго-графом. Если более формально, эго-граф вершины x это такой подграф исходного графа, вершинами которого являются все соседи x и сама x, а рёбрами все рёбра исходного графа между этими вершинами. Коллеги из Одноклассников написали подробную статью об эго-графах и затронули в ней вопрос их эффективного построения.

Ключевая идея меры ez_c в том, что её можно сделать обучаемой. Для каждого пользователя c, его эго-графа и всех пар пользователей u, v внутри него мы можем посчитать много разных признаков, например:

  • число общих друзей u и v внутри эго-графа c;

  • число общих друзей u и c;

  • интенсивность взаимодействий между v и c;

  • время, прошедшее с последней дружбы между u и кем-либо из эго-графа c;

  • плотность эго-графа c;

  • и другие.

Таким образом мы получим датасет с признаками. Но для обучения нужны ещё и метки. Пусть датасет был построен по состоянию графа на момент времени T. Тогда в качестве положительных примеров возьмём те пары пользователей, которые не были друзьями на момент T, но подружились к T + T. А как отрицательные все остальные, не подружившиеся, пары пользователей. Заметим: поскольку мы решаем задачу предсказания новых дружб, те пары пользователей, которые уже дружат на момент T, учитывать не нужно ни на обучении, ни на применении.

В конечном счёте мы получаем датасет следующего вида:

  • для каждой пары пользователей u и v, а также их общего друга c, посчитаны признаки по эго-графу c;

  • пара пользователей u и v встречается в датасете ровно столько раз, сколько у них общих друзей;

  • все пары пользователей в датасете не являются друзьями на момент времени T;

  • для каждой пары u и v проставлена метка подружились ли они в течение определённого промежутка времени начиная с T.

По такому датасету мы и будем обучать нашу меру ez_c. В качестве модели выбрали градиентный бустинг с pairwise функцией потерь, где идентификатором группы выступает пользователь u.
По сути, мера ez_c(u, v) определяется как предсказание описанной выше модели. Но есть один нюанс: при pairwise-обучении распределение предсказаний модели похоже на нормальное. Поэтому, если в качестве определения меры ez_c(u, v) взять сырое предсказание, может возникнуть ситуация, когда мы будем штрафовать финальную меру E(u, v) за общих друзей, так как значения предсказаний бывают отрицательными. Это выглядит не совсем логично хочется, чтобы с ростом числа общих друзей мера E(u, v) не убывала. Так что поверх предсказания модели мы решили взять экспоненту:

Такой подход хорошо себя показывает на небольших графах. Но чтобы применить его на реальных данных, необходимо выполнить ещё одно действие. Суть проблемы такая: мы не можем вычислять признаки и применять модель для каждой пары пользователей всех эго-графов это слишком долго. Для решения мы придумали специальный трюк. Представим, что наш градиентный бустинг обучился таким образом, что каждое дерево использует признаки только одного пользователя: либо u, либо v. Тогда мы могли бы разделить весь ансамбль на две группы: к группе A мы бы отнесли деревья, которые используют только признаки пользователя u, к B пользователя v. Предсказание такой модели можно представить в виде:

Имея такую модель, мы могли бы получить предсказания для всех пар пользователей одного эго-графа быстрее. Достаточно применить модели A и B для каждого пользователя, а затем сложить соответствующие парам предсказания. Таким образом, для эго-графа из n вершин мы могли бы сократить число применений модели с O(n^2) до O(n). Но как получить такую модель, каждое дерево которой зависит только от одного пользователя? Для этого сделаем следующее:

  1. Исключим из датасета все признаки, которые одновременно зависят и от u и от v. Например, от признака число общих друзей u и v внутри эго-графа c придётся отказаться.

  2. Обучим модель A, используя только признаки на базе u, c и эго-графа c.

  3. Для обучения модели B оставим только признаки на базе v, c и эго-графа c. Также в качестве базовых предсказаний передадим предсказания модели A.

Если объединим модели A и B, получим то что нужно: первая часть использует признаки u, вторая признаки v. Совокупность моделей осмысленна, поскольку B была обучена корректировать предсказания A. Эта оптимизация позволяет ускорить вычисления в сотни раз и делает подход применимым на практике. Финальный вид ez_c(u, v) и E(u, v) выглядит так:

Вычисление меры E в онлайне

Заметим, что E(u, v) можно представить в виде:

Эта формула скалярное произведение разреженных векторов, индексами которых являются пользователи, а значениями экспоненты предсказаний модели. Ненулевые значения здесь проставлены только у друзей u по сути это просто списки друзей с дополнительными значениями.

При построении рекомендаций мы уже вычислили предсказания моделей для всех существующих дружб. Поэтому для каждого пользователя мы можем собрать векторы и сложить их в доступное онлайн key-value хранилище. После этого сможем получать значение E(u, v) для любой пары пользователей в онлайне простой операцией перемножения векторов. Это даёт возможность использовать E(u, v) как лёгкую функцию релевантности в нагруженных местах либо как дополнительный признак финальной модели ранжирования.

Итог

В результате система EGOML позволяет:

  1. Распределённо отбирать кандидатов для каждого пользователя в офлайне. Асимптотическая сложность оптимизированного алгоритма составляет O(|E|) вычислений признаков и применений модели, где |E| число связей в графе. На кластере из 250 воркеров время работы алгоритма составляет около двух часов.

  2. Быстро вычислять меру релевантности E(u, v) для любой пары пользователей в онлайне. Асимптотическая сложность операции O(|N(u)| + |N(v)|).

  3. Улучшать качество рекомендаций, расширяя количество учтённых графов (по дружбам, скрытиям рекомендаций, отправленным сообщениям и другим графам) и добавляя всевозможные метки на рёбра и вершины. Например, интенсивность взаимодействий на ребре, дату образования ребра, город, место работы или учёбы пользователя.

В конечном счёте мы перешли со способа отбора кандидатов с использованием Adamic/Adar к системе EGOML и внедрили в модель второй уровень признаков на основе меры E(u, v). И это позволило увеличить количество подтверждённых дружб со всей платформы на несколько десятков процентов.

Благодарность

Хочу сказать спасибо руководителю команды Core ML Андрею Якушеву за помощь в разработке метода и подготовке статьи, а также всей команде Core ML за поддержку на разных этапах этой работы.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru