<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Локис Александр</title><generator>teletype.in</generator><description><![CDATA[Локис Александр]]></description><image><url>https://img4.teletype.in/files/b7/52/b752baa3-7d17-4717-b185-5f094dac23cf.png</url><title>Локис Александр</title><link>https://teletype.in/@abletobetable</link></image><link>https://teletype.in/@abletobetable?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/abletobetable?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/abletobetable?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Mon, 06 Apr 2026 17:58:30 GMT</pubDate><lastBuildDate>Mon, 06 Apr 2026 17:58:30 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@abletobetable/trees_and_ensembles</guid><link>https://teletype.in/@abletobetable/trees_and_ensembles?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable</link><comments>https://teletype.in/@abletobetable/trees_and_ensembles?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable#comments</comments><dc:creator>abletobetable</dc:creator><title>Вопросы с собесов. Деревья и ансамбли</title><pubDate>Thu, 17 Apr 2025 16:33:47 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/87/65/8765fc1d-671b-4e1c-9f8d-53e2e4467b51.png"></media:content><category>machine learning</category><description><![CDATA[<img src="https://img4.teletype.in/files/3f/2d/3f2daea6-317c-4e26-b079-d2584f8c465d.jpeg"></img>Подобные вопросы не редкость на собеседованиях по машинному обучению. Более того, неправильный ответ на них выдаёт вас за новичка, поскольку они уже стали базой собесов!]]></description><content:encoded><![CDATA[
  <p id="W3vm">Собрал подборку популярных вопросов с технических собеседований по теме деревьев решений и ансамблей — с подробными ответами и пояснениями. Подходит как для повторения перед интервью, так и для закрепления теории.</p>
  <p id="rLiB">А ещё по этим вопросам провели мок-собес с моей ученицей — полезно, если хочется посмотреть, как это выглядит в формате собеседования.</p>
  <h3 id="pkjm">Как выглядит алгоритм построения решающего дерева?</h3>
  <ul id="RLg6">
    <li id="Lad5">Начинаем с корня — берём весь обучающий датасет</li>
    <li id="XZxf">Выбираем лучший признак и значение для сплита (критерия ветвления)</li>
    <li id="2FiC">Разбиваем данные на две части по этому сплиту</li>
    <li id="s6fH">Повторяем шаги для каждой части — рекурсивно строим поддеревья</li>
    <li id="DxLN">Останавливаемся, если выполнен критерий остановки; тогда вершина становится листом</li>
  </ul>
  <p id="fjnm">Критерии ветвления:</p>
  <ul id="W87n">
    <li id="uEKH">gini или entropy - классификация</li>
    <li id="1Hkp">mse или mae - регрессия</li>
  </ul>
  <p id="eArP">Критерий остановки:</p>
  <ul id="Rqs9">
    <li id="GGJJ">достигнута максимальная глубина</li>
    <li id="6YOq">в узле мало или много объектов</li>
    <li id="gOFS">прирост информации от нового сплита слишком мал</li>
  </ul>
  <figure id="xS3p" class="m_column">
    <img src="https://img1.teletype.in/files/45/17/4517e53a-b7ad-4d1c-a0e5-7238af0ea4b3.png" width="1999" />
    <figcaption>Пример решающего дерева</figcaption>
  </figure>
  <h3 id="O9R5">Какие есть критерии сплиттинга? Джини, энтропия, мсе</h3>
  <p id="bdHm">Gini</p>
  <p id="kxw1">Интуиция: вероятность, что случайно выбранный элемент будет неправильно классифицирован, если мы выберем класс случайно по распределению в узле.</p>
  <figure id="iA3V" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfPZ3Pj43y8iM9fFkXLU1powgQSaQY-dWLiBijwri7xlHeFneetEklpNYkwOfFxar6a1lqORawnU5wFAqjT4TPU9MVtunZl2zYkzcIcHzkPzTVlkK9FoaPHZDRXbpZeM3XKjcY3KQ?key=iEGmSD0Uznfy_ioioO5uhKah" width="108" />
    <figcaption>первый вариант джини</figcaption>
  </figure>
  <figure id="QCEo" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcJQaYIC7BEMlPwTeGreQWJZ1wQpgYbOQs0mtcMfPfHEXwrTkwkLmBePimzefLuWv61VIcoahHsuZQ8LUqhdCdGGVNQZA-ulWb9fGYRGbBWZgt7sevSwMSQpRHO8zJTASiojYNe4g?key=iEGmSD0Uznfy_ioioO5uhKah" width="134" />
    <figcaption>второй вариант записи джини</figcaption>
  </figure>
  <p id="GGd1">где p_i - доля i-го класса в листе.</p>
  <p id="wC0A">Особенности:</p>
  <ul id="wNTd">
    <li id="xZQu">Быстро считается.</li>
    <li id="z3kQ">Часто используется по умолчанию (например, в DecisionTreeClassifier из sklearn).</li>
  </ul>
  <p id="3TTX">Entropy</p>
  <p id="TQAM">Интуиция: мера &quot;неопределённости&quot; или &quot;хаоса&quot; — насколько непредсказуемо распределение классов.</p>
  <figure id="WuQM" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXf0GFaySBB110BfY44a4Jhv1cq0R532WUckk2DFceAWNQLHw8gf5DX4BVbN68qtdkEc8wAYH4_0awfW1KR1VtBZEulLJKBnhioYkAOF7wPx9SCYwFbfzDt8cek_WsXn094UUgZJ?key=iEGmSD0Uznfy_ioioO5uhKah" width="277" />
    <figcaption>формула энтропии</figcaption>
  </figure>
  <p id="0gY5">где p_i - доля i-го класса в листе.</p>
  <p id="O9AP">На практике разница в выборе критерия редко сильно влияет на итоговую модель — важнее настройка других параметров (например, глубины, минимального количества в узле и т.д.).</p>
  <h3 id="YpWs">В чём разница между классификацией и регрессией в деревьях?</h3>
  <p id="xbWi">Классификация:</p>
  <ul id="LH6t">
    <li id="d8cE">предсказываем метки классов</li>
    <li id="msUV">Используем gini или энтропию</li>
    <li id="b6PC">самый популярный класс по объектам в листе (мода)</li>
  </ul>
  <p id="WPXp">Регрессия:</p>
  <ul id="wMTH">
    <li id="1Egc">предсказываем числовое значение</li>
    <li id="tiJf">Оптимизируем mse/mae во время сплита</li>
    <li id="FLsw">Используем среднее / медиану в листе как предсказание</li>
  </ul>
  <h3 id="fBnH">Какие есть плюсы и минусы решающего дерева?</h3>
  <p id="FXd5">Плюсы:</p>
  <ul id="gkRq">
    <li id="t4N4">Хорошо работают с нелинейными зависимостями</li>
    <li id="O5hW">Интерпретируемость: легко объяснить, почему модель приняла решение</li>
    <li id="PHFI">Работает с категориальными и числовыми признаками</li>
    <li id="XC1b">Не требует нормализации данных</li>
  </ul>
  <p id="WWft">Минусы:</p>
  <ul id="2kWM">
    <li id="0FLF">Легко переобучается, особенно при большой глубине</li>
    <li id="TpB8">Плохо работает с трендами</li>
    <li id="9O6T">Очень чувствительны к гиперпараметрам</li>
  </ul>
  <h3 id="mMFd">Почему деревья плохо улавливают тренды и не умеют экстраполировать?</h3>
  <p id="rAva">todo</p>
  <h3 id="v0J3">Как глубина влияет на дерево?</h3>
  <p id="TOVU">Маленькая глубина → недообучение (underfitting): модель слишком простая, плохо захватывает зависимости.</p>
  <p id="AoXC">Слишком большая глубина → переобучение (overfitting): модель подстраивается под шум в данных, плохо обобщает. Крайний случай, например, когда дерево поместила каждый объект обучающей выборки в отдельный лист, в таком случае у нас идеальные метрики на трейне и очень плохие на тесте.</p>
  <p id="Vb1q">Обычно глубина дерева — один из основных гиперпараметров для настройки</p>
  <figure id="poDe" class="m_column">
    <img src="https://img3.teletype.in/files/2c/3c/2c3c7518-053a-40b8-8857-4699d973a1cd.png" width="1997" />
    <figcaption>Пример переобученного = очень глубокого дерева для классификации</figcaption>
  </figure>
  <figure id="fcw6" class="m_column">
    <img src="https://img1.teletype.in/files/8c/83/8c831d6e-feff-4e64-ac5c-56996edea39c.png" width="1998" />
    <figcaption>Пример переобученного = очень глубокого дерева для регрессии</figcaption>
  </figure>
  <h3 id="Mf0g">Как можно регуляризировать решающее дерево?</h3>
  <ul id="ntqt">
    <li id="UN1Q">Ограничить максимальную глубину дерева (max_depth)</li>
    <li id="1Yfp">Задать минимальное количество объектов в узле (min_samples_split, min_samples_leaf)</li>
    <li id="9tdo">Ограничить максимальное число признаков для выбора сплита (max_features)</li>
    <li id="94OI">Использовать pruning (обрезку лишних веток после обучения)</li>
    <li id="rNbT">max_leaf_nodes — ограничивает общее число листьев в дереве</li>
    <li id="qhJ5">min_impurity_decrease - минимальный прирост критерия сплита</li>
  </ul>
  <h3 id="64IK">Почему деревья не чувствительны к масштабированию признаков?</h3>
  <p id="7Yiq">Потому что они не используют расстояния. Сплиты происходят по порогам типа: &quot;если x &gt; 3, то идти влево&quot;, и не важно, в каком масштабе заданы значения — хоть в сантиметрах, хоть в метрах.</p>
  <h3 id="dNHd">Как оценить важность признаков по дереву?</h3>
  <p id="7tvv">Обычно важность признака измеряется как суммарное снижение impurity (Gini или энтропии), которое произошло благодаря разбиениям по этому признаку, по всем уровням дерева.</p>
  <p id="jYpo">В ансамблях деревьев (например, в Random Forest) эти значения усредняются по всем деревьям.</p>
  <h3 id="1Kuh">Что такое бэггинг?</h3>
  <p id="bTyT">Бэггинг (Bagging) — это метод ансамблирования, в котором используется несколько одинаковых моделей, обученных на разных случайных подмножествах обучающих данных. Модели обучаются параллельно, а затем их прогнозы усредняются (для регрессии) или берётся мода (для классификации), чтобы получить итоговое решение.</p>
  <h3 id="qHez">Что такое бустинг?</h3>
  <p id="dv00">Бустинг — это метод ансамблирования, в котором модели обучаются последовательно. Каждая последующая модель пытается исправить ошибки предыдущих. Например, слабые модели (например, слабые деревья) обучаются на ошибках предыдущих моделей, усиливая их предсказания на тяжёлых объектах.</p>
  <h3 id="1hQ0">Что такое стекинг?</h3>
  <p id="FxBi">Стекинг (Stacking) — это метод ансамблирования, при котором несколько моделей обучаются на исходных данных, а затем их предсказания используются как входные данные для мета-модели (вторичного уровня). Мета-модель учится на прогнозах базовых моделей и даёт итоговое предсказание.</p>
  <h3 id="gxI0">Что такое bias-variance decomposition? Какой тип ансамблирования, что оптимизирует?</h3>
  <p id="PHEf">Bias-Variance Decomposition — это концепция, которая помогает понять, как ошибки модели можно разделить на две основные составляющие:</p>
  <ul id="XJMk">
    <li id="pd7F">Bias (смещение) — ошибка, возникающая, когда модель слишком простая и не может захватить все закономерности в данных. Это приводит к систематической ошибке в предсказаниях.</li>
    <li id="hdDW">Variance (вариативность) — ошибка, возникающая, когда модель слишком сложная и слишком чувствительна к случайным колебаниям данных, что приводит к нестабильным и переобученным предсказаниям.</li>
    <li id="y9p0">Noise (шум) — это неизбежная ошибка, которая не может быть уменьшена ни с помощью улучшения модели, ни с помощью большого объёма данных.</li>
  </ul>
  <p id="8uaa">Полная ошибка модели может быть разложена на три части:</p>
  <figure id="ux9e" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdpMHfd_Nr8E6VbcJAP3WNK0KZK1aPGhzfLyLqRaoHTnPhPBctDkeQpKDCuXCUpH8STeLse-yDXs9dm3jNp0fQ8ufHTb8Tk0X1YOtIDZHyfqwQkwn8xiRA-sebG5ohh_f2E7tRrZw?key=iEGmSD0Uznfy_ioioO5uhKah" width="371" />
    <figcaption>Разложение ошибки на компоненты</figcaption>
  </figure>
  <p id="uLtC">Бэггинг - уменьшает вариенс и уже обладает низким смещением.</p>
  <figure id="9SRh" class="m_column">
    <img src="https://img3.teletype.in/files/24/62/24620da2-19f0-4b72-8d09-977991fdada4.png" width="1999" />
    <figcaption>Как бэггинг уменьгает в К раз разброс (вариенс)</figcaption>
  </figure>
  <p id="bIPK">Бустинг имеет низкий вариенс и уменьшает смещение.</p>
  <p id="AdIW">Стекинг явно ничего из этого не призван минимизировать.</p>
  <h3 id="ugqz">Что такое бутстреп?</h3>
  <p id="x1hf">Бутстрэп (Bootstrap) — это метод случайного выбора подмножества данных с возвращением (т.е. с повторениями). В контексте бэггинга, для каждой базовой модели создаётся случайное подмножество обучающих данных путём повторного выбора объектов из исходного набора.</p>
  <h3 id="wqyk">Что такое случайные лес? Где там случайность?</h3>
  <p id="sFWN">Случайный лес (Random Forest) — это ансамбль решающих деревьев, построенных на случайных подмножествах данных и признаков. Случайность здесь проявляется как в процессе бутстрэппинга (создание случайных подмножеств данных), так и в случайном выборе подмножества признаков на каждом сплите дерева.</p>
  <h3 id="XR4a">Почему в Random Forest при выборе признаков на каждом сплите используют случайное подмножество признаков?</h3>
  <p id="CfCh">Это делается для того, чтобы снизить корреляцию между деревьями в лесу и улучшить общую производительность модели. Если все деревья будут использовать одни и те же признаки, они будут более похожи друг на друга, что приведёт к менее разнообразным решениям.</p>
  <p id="qoTW">С точки зрения bias-variance decomposition мы хотим строить максимально разнообразные деревья и как можно больше их. То есть мы строим экспертов в своей области (по подмножеству данных и признаков), а потом их усредняем.</p>
  <p id="sttT">Да и просто с точки зрения логики - зачем нам строить одинаковые деревья?)</p>
  <h3 id="z8gT">Почему градиентный бустинг называется градиентным? Где там градиент?</h3>
  <p id="SKjx">Когда мы говорим, что обучаемся на ошибках предыдущих моделей, мы:</p>
  <ul id="a5Bo">
    <li id="FMNV">выбираем функцию потерь<br />она зависит от таргета и нашего предсказания</li>
    <li id="83hi">после очередного шага считаем антиградиент в точке a_k(x_i) предсказания текущей части композиции на объекте x_i</li>
    <li id="T5db">обучаем следующий алгоритм на значение антиградиента</li>
  </ul>
  <p id="Ba6f">Таким образом мы обучаемся на ошибках, но не совсем на остатках (разницы между предсказанием и таргетом), а на значение антиградиента, что, например, для функции потерь mse одно и то же.</p>
  <figure id="h5gK" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcldQQf_ExxPZ2_pfB6DrR5lR9nqGl-cgannfs4K5SaEwaqjRDXwJ8sXhfy-PFhJMN_Bcv33SJqNPMwGDBnVAdA9s240sqvtclODqOW4a6vF81x3ob58XK7NdDlDT1lbEW4iPOyuA?key=mXnNi9-CcenP9PtJP7dT5XJL" width="221" />
    <figcaption>функция потерь</figcaption>
  </figure>
  <figure id="Lwvm" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcILGn_mIOvDYbpA3ywp6J9wqQLp7O7zHBOTJpQbreqNOlGJ_Bk7GybwoIlbV1W-EJj_9Bds-ygsbgoIdY4Swi3CPkN8mCIC37cIcrUnNbIMJMQpzB29sWtJJ3_uREsEdyvtZrD1Q?key=mXnNi9-CcenP9PtJP7dT5XJL" width="222" />
    <figcaption>градиент (и также просто остаток)</figcaption>
  </figure>
  <h3 id="y1Lk">Почему нельзя в качестве базовых алгоритмов использовать линейные модели, например?</h3>
  <p id="n4EA">Потому что будет линейная комбинация линейных моделей - это бессмысленно, будет просто та же самая линейная комбинация.</p>
  <h3 id="RRiP">Где деревья глубже бустинг/бэггинг?</h3>
  <p id="N74s">В бэггинге обычно деревья глубже, а бустинге с ограничением, чтобы не переобучаться.</p>
  <p id="PrLL">Если в бустинге в какой-то момент будет переобучение - вырулить из этого никак не получится.</p>
  <p id="4cnJ">А в бэггинге даже если будет несколько переобученных деревьев, эффект от них может быть некритичным, так как мы берем несколько алгоритмов и усредняем их предсказаниях.</p>
  <h3 id="LqkA">Что если сделать первое дерево очень глубоким в бэггинге/бустинге?</h3>
  <p id="TNbw">В бэггинге:</p>
  <p id="3ig8">Если первое дерево очень глубокое, оно будет склонно к переобучению на обучающих данных, так как оно будет слишком подстраиваться под шум и выбросы в данных. Однако, поскольку в бэггинге используются ансамбли деревьев, остальные деревья будут обучаться на других подмножествах данных, и, возможно, это частично уменьшит влияние переобучения первого дерева. Но в целом такое дерево может ухудшить стабильность ансамбля.</p>
  <p id="lgmI">В бустинге:</p>
  <p id="noz7">Если первое дерево слишком глубокое, это может усилить переобучение с самого начала. В бустинге каждая модель обучается на ошибках предыдущей, и если первое дерево слишком сильно подгоняет данные, оно будет давать плохие результаты для последующих моделей. Если у нас первое дерево уже переобучилось - что тогда делать другим деревьям, трейн данные мы уже идеально запомнили. Это может повлиять на стабильность и общую точность всей модели. Поэтому в бустинге часто ограничивают глубину деревьев для предотвращения этого.</p>
  <h3 id="gFdJ">Что если убрать первое дерево в бэггинге/устинге?</h3>
  <p id="1JMr">В бэггинге:</p>
  <p id="YDaO">Если удалить первое дерево, в ансамбле всё равно останется множество других деревьев, и они будут давать разнообразие прогнозов. Так как в бэггинге важно среднее усреднение множества деревьев, удаление одного не сильно повлияет на итоговый результат, особенно если количество деревьев велико. Однако, если деревьев мало, удаление может снизить точность ансамбля.</p>
  <p id="24TV">В бустинге:</p>
  <p id="aCff">Если удалить первое дерево в бустинге, это сломает всю последовательность обучения, так как каждое следующее дерево пытается исправить ошибки предыдущего. Без первого дерева у модели не будет фундамента для исправления ошибок, и это может значительно снизить эффективность ансамбля. Это нарушает основной принцип бустинга, и результат будет хуже.</p>
  <h3 id="JaLf">Можно ли переобучить бустинг? а бэггинг?</h3>
  <p id="kWrS">Да, бустинг легко переобучается, особенно при слишком большом количестве итераций, сложных базовых моделях.</p>
  <p id="OJCL">Бэггинг в целом более устойчив к переобучению, поскольку каждое дерево обучается на случайных подмножествах данных. И при увеличении числа базовых алгоримтов переобучить ансамбль не получится.</p>
  <h3 id="bBDo">Как можно регуляризировать ансамбли?</h3>
  <p id="A1gP">Для регуляризации можно:</p>
  <ul id="aVq9">
    <li id="jjNz">Ограничить глубину деревьев и настраивать другие гиперпараметры.</li>
    <li id="Rcmf">Использовать бутстрэппинг и случайный выбор признаков (для Random Forest).</li>
    <li id="46Uv">Использовать методы ранней остановки (early stopping) в бустинге.</li>
    <li id="sKH3">Применять методы усечения моделей (например, ограничение на максимальное количество итераций).</li>
  </ul>
  <h3 id="CA0g">Отличия LightGBM, XGBoost, CatBoost?</h3>
  <p id="hOou">В основном в форме деревьев.</p>
  <p id="sh5n">LightGBM</p>
  <ul id="5sAr">
    <li id="zOx6">На каждом шаге выбираем вершину для ветвления с наилучшим скором</li>
    <li id="YSoN">Дерево получается несимметричным</li>
    <li id="x3b9">В этом алгоритме быстро подстраиваемся под трейн данные, поэтому можно быстрее переобучиться</li>
    <li id="XREQ">Основной критерий остановки - максимальная глубина</li>
  </ul>
  <figure id="zWhO" class="m_column">
    <img src="https://img3.teletype.in/files/e2/10/e21010cc-9436-4438-98fd-7f03bc318115.png" width="1148" />
    <figcaption>LightGBM</figcaption>
  </figure>
  <p id="yW4W">XGBoost</p>
  <ul id="bsQe">
    <li id="mlCr">Строим дерево последовательно по уровням до достижения максимальной глубины</li>
    <li id="tsYV">Дерево получается симметричным, а иногда и бинарным</li>
    <li id="JJzM">Такому алгоритму тяжелее переобучиться, чем LightGBM</li>
  </ul>
  <figure id="erUN" class="m_column">
    <img src="https://img3.teletype.in/files/e7/43/e743db49-73d9-4d57-b725-116450e86bf7.png" width="1286" />
    <figcaption>XGBoost</figcaption>
  </figure>
  <p id="YiCq">CatBoost</p>
  <ul id="MAtb">
    <li id="pxkm">Все вершини одного уровня имеют одинаковых предикат (см картинку ниже). предикат = условие ветвления</li>
    <li id="qFhj">Такое жесткое ограничение является сильным регуляризатором</li>
    <li id="JCNP">Также из-за отсутствия вложенных if-else ускоряется инференс дерева</li>
  </ul>
  <figure id="nKGr" class="m_column">
    <img src="https://img3.teletype.in/files/eb/06/eb060f04-23a2-4cfb-b183-433c46d76f46.png" width="1286" />
    <figcaption>CatBoost</figcaption>
  </figure>
  <h3 id="quwp">Как делать трейн/тест сплит для стекинга?</h3>
  <p id="CiLH">Для стекинга важен out-of-fold split. Каждый базовый классификатор обучается на части данных (например, с использованием кросс-валидации), а затем делает предсказания на оставшихся данных, которые не использовались в обучении. Эти предсказания (out-of-fold) используются для тренировки мета-модели.</p>
  <p id="z1Y7">Часто делают кросс-валидацию, чтобы в итоге обучаться на всех данных.</p>
  <figure id="ibaL" class="m_column">
    <img src="https://img2.teletype.in/files/1d/ed/1dedf1dd-cf09-4779-a485-d09006aa12bf.png" width="1999" />
    <figcaption>трейн базовых алгоритмов на фолдах и предиктим новые фичи</figcaption>
  </figure>
  <figure id="CmJF" class="m_column">
    <img src="https://img2.teletype.in/files/96/78/96783da7-41bc-4b30-a09b-d85da5ed7ff7.png" width="1999" />
    <figcaption>на новых фичах обучаем мета-модель</figcaption>
  </figure>
  <p id="AAjV"><strong>Ссылки</strong></p>
  <p id="g7bY">Видео с мок-собесом</p>
  <p id="WGWq"><a href="https://teletype.in/@abletobetable" target="_blank">Блогпосты</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@abletobetable/rnns</guid><link>https://teletype.in/@abletobetable/rnns?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable</link><comments>https://teletype.in/@abletobetable/rnns?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable#comments</comments><dc:creator>abletobetable</dc:creator><title>Вопросы с собесов. RNNs: рекуррентные нейронные сети</title><pubDate>Tue, 08 Apr 2025 16:29:22 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c9/1c/c91c8d24-44e8-4a6e-a9f5-2148b30bdf5d.png"></media:content><category>nlp</category><description><![CDATA[<img src="https://img4.teletype.in/files/7f/32/7f327701-ae40-4165-a235-f613a98412cf.jpeg"></img>Разберем RNN от А до Я: как отвечать на собеседованиях и что знать про них для работы!]]></description><content:encoded><![CDATA[
  <p id="BTvu">Разберем RNN от А до Я: как отвечать на собеседованиях и что знать про них для работы!</p>
  <h3 id="KhCY">Что такое RNN?</h3>
  <p id="T6zQ">Тип нейросети, предназначенный для работы с последовательностями.</p>
  <p id="zxyj">Последовательно проходят по последовательности: обновляют и передают скрытое представление на следующий шаг.</p>
  <figure id="ud8E" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeCLRCHBP4GAAvw-RYvsDP0mLBbtMAcQBrEaK9_XjmdRa1F9ajlHS_7bzuMhNJ1ImOn_LyYBuZNkpEOpvvBlSF_04G9sVzGmmigstRdOq-XMIUImnrhD7c3Kh3QXvk4d9cTTn0t-w?key=-qNVVw9oi-nkZK5NZsxIrn6o" width="831" />
  </figure>
  <p id="7Vzx">Так как у нас одинаковые блоки и те же параметры, то мы как будто зацикливаемся над ячейкой - отсюда рекуррентность.</p>
  <figure id="57mH" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcdemXdG9IUMSDFUUIJVcl1eu_5vY9ZqvOM9aHh2JSNdlyc8xf3UqDEK1N3g3HyrumaHkZg2Xbwub9eFMFSGNQdi7fST50PdTyvrS-lYNSTW14j4OxEzwFz7GPVzVh1_UWN0oNJ?key=-qNVVw9oi-nkZK5NZsxIrn6o" width="430" />
  </figure>
  <figure id="RHva" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdCfHyUyesa-pAAsKEkDAZhrzyOLAs2bG1qYxKCfDC5K2aKZFHR0_vgoWK8k4hbvKtGxaNEn7NN6Ttpmh0jfhqBdQS6wVDm2EfM10jPTesJIL_gUecy0VOo1mLW1lyZ3-oBoNgO0Q?key=-qNVVw9oi-nkZK5NZsxIrn6o" width="610" />
  </figure>
  <p id="uAba">h - скрытое состояние</p>
  <p id="sYJt">x - новый элемент последовательности</p>
  <h3 id="2pFY">Что такое Bidirectional RNN?</h3>
  <p id="HaAb">Две рекуррентных подсети:</p>
  <ul id="DLCf">
    <li id="zSjf">прямая (forward, токены в нее подаются от первого к последнему)</li>
    <li id="FvWS">обратная (backward, токены подаются в обратном порядке)</li>
  </ul>
  <figure id="E0qu" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdqijUs84FI44h1-uzMcwgk0PCVhcWb3vhEN0Vo4juxaSlvX057mMe7Ht1kJTpz7UP05kND4Gc3DVufGp726fRg2W4Ey3hO7oURayKIKPGa9tjmoYLNIRDTiN7TcZfhvlHDZ83ZSw?key=-qNVVw9oi-nkZK5NZsxIrn6o" width="1692" />
  </figure>
  <figure id="kKaS" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc5Ctj8wN5byCfy1SPnRKEO83lw64McQEodiC9nw9ly7c9UFFH-Vp2ATE1cO3Zs2sPSggD11xEEVpSYVVyR_V0rja1xoAIsdTQa91Coem2gO4_3U4gB2FdKy2jDjBnptD47ivgPYA?key=-qNVVw9oi-nkZK5NZsxIrn6o" width="296" />
  </figure>
  <p id="7sXB">Можно аггрегировать не только конкаетнацией, но и усреднением, например.</p>
  <h3 id="KHyl">Какие проблемы возникают при работе с RNN?</h3>
  <p id="U9Ib">При обратном распространении ошибки мы будем умножать n раз на матрицу весов (где n - длина входа). Поэтому если у нас там большие собственные числа, то будет “взрыв” градиента, если маленькие, то “затухание”.</p>
  <ul id="UaJq">
    <li id="1liF">Ванишинг градиент (затухание градиента)</li>
    <ul id="Ev1v">
      <li id="g8AL">При обучении на длинных последовательностях градиент становится слишком малым, и ранние токены не оказывают влияния на выход.</li>
    </ul>
    <li id="f10W">Exploding gradient (взрыв градиента)</li>
    <ul id="ilfa">
      <li id="JUnu">Градиенты становятся слишком большими, что приводит к нестабильному обучению.</li>
    </ul>
    <li id="8ZR3">Затрудненное запоминание долгосрочной информации</li>
    <ul id="EZqw">
      <li id="7ioo">Базовые RNN плохо работают с зависимостями на длинных расстояниях из-за затухания градиента в том числе</li>
    </ul>
  </ul>
  <h3 id="Kc4D">Что такое LSTM?</h3>
  <p id="BvwT">У нас есть теперь не только скрытые состояния h_t (краткосрочная память), но еще и состояния блока c_t (долгосрочная память).</p>
  <ul id="tCUV">
    <li id="hURG">Forget gate (вентиль забывания)<br />На основании входа x_t и предыдущего скрытого состояния h_t-1 решаем какую долю из состояния блока c_t-1 на прошлом шаге пропустить.</li>
  </ul>
  <figure id="C6a9" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdEzCdrqrEprpr_taPfJAwLAh_Rbphs61dDhCgmAFo_2W-S3vuCJantxpot2hZxf9580EoIs3xNzoH-wxgADoY3a1od17f5p8knZNATGfoU4d8sCYOzUT27sZkd8rtpqtMO91Jw?key=-qNVVw9oi-nkZK5NZsxIrn6o" width="328" />
  </figure>
  <p id="KDs5">Формула такая же как и обычной рнн, но меняются активация - на сигмоиду.<br />То есть получаем маску после сигмоиды и поэлементно умножаем на c_t-1.<br />Сигмоида из-за своего выхода на промежуток [0; 1] больше подходит для интерпретации, что забыть, а что пропустить.<br />Здесь обучаемые параметры учатся на то, чтобы эффективно определять, что нужно забыть, а что не надо забывать.</p>
  <ul id="CRRG">
    <li id="lOhD">Input gate (вентиль входного состояния)</li>
  </ul>
  <figure id="I2R5" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXf0IfewU9N-Wrg_F8SLonJqVPETGdoSi5VTv1oe2V3I4jG7CaC1ZXVKMltZmMtBMSVUpGF5QtCHSp1utxADZoFyZBxzyn0vH0JT_-nGUq5SHK2k6AJXH7_O5CwrqQzh_-TISvxPQg?key=-qNVVw9oi-nkZK5NZsxIrn6o" width="314" />
  </figure>
  <p id="vDQ4">По той же формуле считаем с тангенсом новое состояние блока c_t по x_t и h_t-1. Но также накладываем маску после сигмоиды, но уже с параметрами, которые учатся определять, что нужно пропускать, а что пропускать не надо. Хотя шаблон слоев одинаковый.<br />Потом после гейта забывания и гейта входа суммируем полученное и это будет итоговое состояние c_t.</p>
  <figure id="cIiH" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeAvmnZalNHfpIn5i1fn2-npGWKY5nwnsAvYG7RbKGH27yfpezNa_7kIuusfKC4iZpZOUDcHRzRY4nLjHfEvdHMWP-YImVppz3Pq2BVZKfTbdHp4lb2IxQgwiKmoojBk7uLAy1vTg?key=-qNVVw9oi-nkZK5NZsxIrn6o" width="305" />
  </figure>
  <ul id="KsVR">
    <li id="CnIs">Output gate (вентиль выходного состояния)</li>
  </ul>
  <figure id="iBBG" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcq218Pa6x31CN1f_hU752s0JEgvYXZmIZwwdOX8XcLeG4_McSUBkewzOK3BgRpx-juoTjidYakhXy4UcbUz5q4BMkvRE_6Yc0KiR2oHRdkKrFZE1hezaMl9h7GbAYy29XOZzSyng?key=-qNVVw9oi-nkZK5NZsxIrn6o" width="296" />
  </figure>
  <p id="dzFi">По все той же формуле определяем какую долю выученной информации c_t отправить дальше на основании x_t и h_t-1.</p>
  <p id="ypFI">Плюсы:</p>
  <ul id="hjPB">
    <li id="xFsZ">более умный подход, чтобы обрабатывать входы и выходы</li>
  </ul>
  <p id="8BVo">Минусы:</p>
  <ul id="MRFp">
    <li id="aBCn">громоздкая архитектура</li>
    <li id="qeaZ">нужно 2 состояния: скрытое h и обычное c</li>
  </ul>
  <h3 id="wMll">Что такое GRU?</h3>
  <p id="ixJu">Упрощение LSTM.</p>
  <p id="pwAJ">Оставляем только одно скрытое представление.</p>
  <p id="Inlk">Теперь только 2 гейта: update и reset gate.</p>
  <ul id="JZ9Q">
    <li id="eN5g">update - играет роль input и forget вентилей из LSTM</li>
    <li id="xjIV">reset - решаем какие активации заново проинициализировать</li>
  </ul>
  <p id="UDAK">По формулам все примерно то же самое. Но параметров меньше, обучается быстрее и часто на то же качество.</p>
  <h3 id="E4xk">Какие особенности RNN по сложности реализации?</h3>
  <ul id="dNz3">
    <li id="3g6A">линейна по сложности от длины последовательности</li>
    <li id="Wcl2">но не распараллелить, потому что нужно проходить последовательно один за другим</li>
    <li id="OnzR">квадратичная по размеру внутреннего представления</li>
  </ul>
  <h3 id="aS79">В чем отличие трансформеров от RNN?</h3>
  <figure id="rrt4" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdLjIi-5U29D4H-PEAUedSK1vB2ORNlio0KtrMe9qqii1OtFnFyhtFGtZtfGpnbtTxYZ-fw4BVC_c3HmkzroGzHzPKKNCHV5Sf4y3o5iVrl2Ww9_EUUT10M8LIZSOp15kWl8sQlRw?key=-qNVVw9oi-nkZK5NZsxIrn6o" width="590" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@abletobetable/nlp_fundamentals</guid><link>https://teletype.in/@abletobetable/nlp_fundamentals?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable</link><comments>https://teletype.in/@abletobetable/nlp_fundamentals?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable#comments</comments><dc:creator>abletobetable</dc:creator><title>Вопросы с собесов. База по NLP</title><pubDate>Mon, 07 Apr 2025 10:07:56 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/6e/7c/6e7c3a23-f205-4e57-a6d2-e35091588cf6.png"></media:content><category>nlp</category><description><![CDATA[<img src="https://img2.teletype.in/files/5e/95/5e959872-22e1-427b-8f71-229f3a586f6c.webp"></img>Рассмотрим самые популярные вопросы по классическому NLP: от предобработки текста до Word2Vec.]]></description><content:encoded><![CDATA[
  <p id="ujtb">Рассмотрим самые популярные вопросы по классическому NLP: от предобработки текста до Word2Vec.</p>
  <p id="uJ8f">Вопросы:</p>
  <ul id="pPPw">
    <li id="k0pO">Какие основные задачи решает NLP?</li>
    <li id="3mnS">Какие основные этапы обработки текста в NLP?</li>
    <li id="syFx">В чем разница между лемматизацией и стеммингом?</li>
    <li id="HCTJ">Что такое стоп-слова и почему их нужно удалять?</li>
    <li id="e6XD">Что такое Bag of Words (BoW)?</li>
    <li id="Fztl">Что такое TF-IDF (Term Frequency-Inverted Document Frequency)?</li>
    <li id="rFLq">Что такое BM25?</li>
    <li id="iNn5">Что такое word embeddings?</li>
    <li id="x909">Как считается близость между векторами?</li>
    <li id="1qfY">Что такое Word2Vec?</li>
    <li id="Wpu6">Что такое FastText?</li>
    <li id="fBAO">Что такое GloVe (Global Vectors for Word Representation)?</li>
  </ul>
  <h3 id="QmzV">Какие основные задачи решает NLP?</h3>
  <ul id="XbBV">
    <li id="ZXxP">Классификация / регрессия текста<br />определение тональности, спам-фильтры, анализ тематики, предсказание возраста / цены</li>
    <li id="Oz2u">Извлечение информации<br />Named Entity Recognition, факты</li>
    <li id="AwaX">Генерация текста<br />чат-боты, LLM, текстовые автодополнения, машинный перевод, RAG</li>
    <li id="alBS">Ранжирование / поиск<br />Как семантический поиск, так и поиск по ключевым словам</li>
    <li id="4knD">Векторные представления<br />Для того, чтобы добавить текстовые признаки в какую-нибудь другую модель</li>
  </ul>
  <h3 id="lNiI">Какие основные этапы обработки текста в NLP?</h3>
  <ul id="Uyaw">
    <li id="qpZk">фильтрация</li>
    <li id="aYAS">токенизация</li>
    <li id="EEAI">лемматизация / стемминг</li>
    <li id="aLR2">векторное представление</li>
  </ul>
  <h3 id="6NK7">В чем разница между лемматизацией и стеммингом?</h3>
  <ul id="z6xO">
    <li id="ziDz">Стемминг — алгоритмический подход, который просто отрезает окончания (не всегда грамматически правильно).<br /> (пример: &quot;running&quot; → &quot;run&quot;, но &quot;studies&quot; → &quot;studi&quot;)</li>
    <li id="jKH0">Лемматизация — использует морфологические базы и правила языка, поэтому точность выше.<br />(пример: &quot;бегущий&quot; → &quot;бежать&quot;)</li>
  </ul>
  <h3 id="jZUC">Что такое стоп-слова и почему их нужно удалять?</h3>
  <p id="qwag">Стоп-слова — это часто встречающиеся слова (например, &quot;и&quot;, &quot;в&quot;, &quot;на&quot;, &quot;the&quot;, &quot;is&quot;), которые мало влияют на смысл текста. Они удаляются, чтобы снизить размерность и шум в данных при анализе.</p>
  <h3 id="bi4T">Что такое Bag of Words (BoW)?</h3>
  <p id="cwWv">Составляем вектор текста по частоте встречаемости слов в нем.</p>
  <p id="Lqr2">Исключаем заранее заданные стоп-слова.</p>
  <p id="FDr7">Особенности:</p>
  <ul id="mToU">
    <li id="a4vg">Не учитывает семантику и порядок (синонимы будут разными векторами)</li>
    <li id="BH6s">Может приводить к разреженным векторам (особенно для больших корпусов)</li>
    <li id="1qiK">Требует больших объемов памяти</li>
    <li id="hV5w">Требует сильной предобработки</li>
  </ul>
  <h3 id="rYCX">Что такое TF-IDF (Term Frequency-Inverted Document Frequency)?</h3>
  <p id="XIdI">Вместо обычной частоты слова, мы балансируем между распространенными и редкими (потенциально более информативными словами).</p>
  <p id="jUgP" data-align="center">TF(t,d) * IDF(t,D)</p>
  <p id="76AD">где TF (Term Frequency) — частота появления термина в документе</p>
  <figure id="tUCJ" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcXijk773L2cqFwdT7L9071D9s9AYnPiqlFMOfGr6ehSliuueFFkdHt_ggd0cwdvJlC47dOmgSvQkzw4GSsxnzKv-7n8owd_ddRC2OlACazl0x4rFEEaPeRLTA6sbRqdreXaVtORg?key=dlApc3SUfgfha0JQx3K76ect" width="399" />
  </figure>
  <p id="KLvB">IDF (Inverse Document Frequency) —  обратная частота документа</p>
  <figure id="E1SG" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdy_M3RuU1Qvd4aAhd4to39rEloRHddXfwqXVR0jzmrsCswFgIHbLWFnMRqD17QyWmNuu9FNXBr8Zy3Ow4SslmJY0zQDxsy6B4-EZZjymwgVET91LLP46Zw9HXOAXq2irQ4pb8A6g?key=dlApc3SUfgfha0JQx3K76ect" width="399" />
  </figure>
  <p id="krnb">Вектор представления документа будет выглядеть как набор tf-idf по словам в корпусе.</p>
  <p id="WsVs">А именно:</p>
  <ul id="N1P4">
    <li id="2y45">там будет столько элементов, сколько у нас уникальных слов</li>
    <li id="kYVb">для каждого слова мы будет считать TF(t, d) * IDF(t, D)</li>
    <li id="0B3u">таким образом у нас все вектора будут одного размера и каждый текст будет иметь свое уникальное векторное представление</li>
  </ul>
  <p id="bCVL">Плюсы:</p>
  <ul id="XlUC">
    <li id="ytRx">Простота реализации</li>
    <li id="44o8">Эффективность для небольших корпусов</li>
  </ul>
  <p id="K1Yc">Минусы:</p>
  <ul id="tWHU">
    <li id="06ZC">Не учитывает порядок слов</li>
    <li id="2aam">Плохо работает с многозначными словами</li>
    <li id="IBR0">Нормализация по длине документа не всегда адекватна</li>
    <li id="PKyh">Требует больших объемов памяти</li>
  </ul>
  <h3 id="tvpU">Что такое BM25?</h3>
  <p id="nDMY">BM25 (Best Matching 25) — улучшенная версия TF-IDF, используемая в поисковых системах для ранжирования документов.</p>
  <figure id="Uz2S" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe2NJejQlsk-ZfRrtgwCy-6d-hSbyCtP1m5_5B-Yg0XOUF6msQyIpoyit0ZidmXFQ1Y1RTnRx-8hqOzS32CZwHsso03a9FT8mhGxyeJyoO8ipeRafuysgEX17vTPUTJAEB8I2hkMQ?key=dlApc3SUfgfha0JQx3K76ect" width="436" />
  </figure>
  <p id="GIrO">Плюсы:</p>
  <ul id="EEzv">
    <li id="z7cE">Просто и быстро работает</li>
    <li id="qbwS">Лучше ранжирует релевантные документы</li>
    <li id="F66h">Нормализует длину документа, устраняя проблему TF-IDF</li>
    <li id="gtw2">Используется в полнотекстовом поиске (Elasticsearch)</li>
  </ul>
  <p id="SeMQ">Минусы:</p>
  <ul id="Mqrd">
    <li id="i0jH">Не учитывает порядок слов</li>
    <li id="hr17">Чувствителен к гиперпараметрам</li>
  </ul>
  <h3 id="x3dU">Что такое word embeddings?</h3>
  <p id="bh7U">Word embeddings — это метод представления слов в виде плотных (dense) векторов в многомерном пространстве, где семантически похожие слова располагаются ближе друг к другу. В отличие от Bag of Words и TF-IDF, embeddings захватывают контекст и смысл слов.</p>
  <h3 id="Mzwf">Как считается близость между векторами?</h3>
  <ul id="qKcO">
    <li id="QYwI">косинусная близость - косинус угла между векторами (скалярное произведение / нормы векторов)</li>
  </ul>
  <figure id="1IN2" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfYDYaKNPzYpEQLNrrIoUNYRBgAzShVJfa0R6ke99MGsSGpdTcYD_D1kvUByCPFlCB1-vH1HPk_aZbLwRwdP_kq6n3dUDOwiDqAaLAUTsOp7zkVVGRPgHwW3xwZB6xBUFCGHV3DqQ?key=dlApc3SUfgfha0JQx3K76ect" width="178" />
  </figure>
  <ul id="K7Mt">
    <li id="heXb">евклидовое расстояние - корень из суммы квадратов разностей между координатами<br /></li>
  </ul>
  <figure id="t7mh" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcEbELmN1IISqhQP5EIK9cfAIbk7dgViExK_FjP4Z0D1ZceFwszh_gv3qsiGzLf3JHhNP5QbRPbP93ATcQCbmCm2Oc2OJdFaJTy8BlOm7u_MRgQUuA8OJezwaRi9A_6a3nFN1E80Q?key=dlApc3SUfgfha0JQx3K76ect" width="198" />
  </figure>
  <ul id="1SeT">
    <li id="ZfNN">манхеттенское расстояние - сумму модулей разности между координатами</li>
  </ul>
  <figure id="ODcu" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfBcP37JyB6gBPNSwRlEbsKXT-jNkjDjIve3lTJkFDzub9azuZqFVH20lywr0tRD1BXRJXQPNWTM12STG5P4eXOkMRuCW58YX8Z7uTOd9hy6HdTkr490q4kqxBNFlDvCM1oi1zWDw?key=dlApc3SUfgfha0JQx3K76ect" width="224" />
  </figure>
  <h3 id="jmf2">Что такое Word2Vec?</h3>
  <p id="woNJ">Метод получения вектора слова фиксированного размера = его эмбеддинга по контексту этого слова.</p>
  <p id="g2G6">Проходимся окном контекста по тексту и может обучаться на 2 задачи: Skip-Gram или CBOW.</p>
  <ul id="JfCm">
    <li id="msYd">Skip-Gram — из центрального слова предсказываем контекст</li>
  </ul>
  <figure id="O7ON" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeqThX7KCFzjdxYfwxA6Gsh_XIPSgBo790c97N1bDyO6I14qN-Z1i0P3fYHoquaQmw0b2EYL0zRrKlQgo23crCwu5fm0QAYDVk_NqgL7YKLDQr3WjF9lc4I7BIEuL3La62j4QDWXQ?key=dlApc3SUfgfha0JQx3K76ect" width="520.2698220230533" />
  </figure>
  <p id="XNiF">для небольших корпусов, хорошо работает даже с редкими словами</p>
  <ul id="RplY">
    <li id="4Db8">CBOW — по сумме векторов контекста предсказываем само слово</li>
  </ul>
  <figure id="MlnU" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfDeUbm1TcSEp8pCjhDc82USxE3PKRZhCzNSDOh2hgnRME11AlEdiKVrgDkfUfL87Fwt7-MK2XTjkRYX4TVvFwaigSRKfFra8blfHtzYhAkI2poh1N9mBMN0eIow3tJLn4NKkqVlQ?key=dlApc3SUfgfha0JQx3K76ect" width="465.42407277816665" />
  </figure>
  <p id="DT9X">быстрее обучается и для популярных слов качество выше</p>
  <p id="3Iu9">Как мы видим, у нас есть две большие матрицы U и V. В одной лежат вектора слов, когда они являются контекстом, а в другой когда они центральное слово.</p>
  <p id="YRUS">Это все дело обучаем, используя косинусную близость, то есть увеличиваем скалярное произведение векторов слов, которые находятся в одном контексте, и отдаляем их друг от друга, если они не встречаются вместе.</p>
  <p id="Pw0s">Слова из контекста несложно получить - просто проходимся окном фиксированного размера и на каждом шаге имеем центральное слово и слова контекста.</p>
  <p id="uhwx">Негативные слова мы случайно семплируем из всех остальных слов в словаре, это существенно ускоряет обучение, по сравнению с тем, когда мы для всех слов не из контекста увеличиваем расстояние.</p>
  <p id="G14S">Семплируем взвешенно относительно частоты встречаемости слова в корпусе, но корректируем таким образом, чтобы немного чаще выбирались более редкие слова (возводим частоту в степень ¾)</p>
  <figure id="6BAU" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcXv9ATNjZznpW7jzetRMJW3FEs2MqSn4XLqkkjpvONQIu62H7syuhAqN5rcr1m_YUaFTCppGBr1e4DGOIIJjzUTUPEQwdpv0OUe6cdGqFKRzM603h9AIngNpFmJePNwf_0ipF4?key=dlApc3SUfgfha0JQx3K76ect" width="415" />
  </figure>
  <p id="nqx2">Шаги 1, 2, 3 нам напоминают формулу софтмакса, а это на самом деле и хорошо.</p>
  <p id="W0tz">И теперь мы можем обучать наш word2vec с помощью sgd на кросс-энтропию между истинным распределением и предсказанным.</p>
  <p id="lm31">Плюсы:</p>
  <ul id="gkVG">
    <li id="ZEU1">Хорошо улавливает семантические и синтаксические связи между словами</li>
    <li id="96Nc">Интерпретируемость –Близкие по смыслу слова оказываются рядом в векторном пространстве.</li>
    <li id="U9gv">Простота использования – Готовая реализация в библиотеках</li>
    <li id="3RoH">Работа с контекстом – Учитывает окружение слов</li>
  </ul>
  <p id="p47X">Минусы:</p>
  <ul id="6jUz">
    <li id="adya">Не учитывает многозначность слов – Каждому слову соответствует один вектор, даже если оно имеет несколько значений</li>
    <li id="WnlT">Не обрабатывает OOV-слова – Если слова не было в обучающей выборке, модель не сможет создать для него вектор</li>
    <li id="9Dh5">В разных предложениях эмбеддинг слова будет один и тот же, в отличие, например, от моделей типа BERT.</li>
  </ul>
  <h3 id="uCFK">Что такое FastText?</h3>
  <p id="Ff6p">Улучшает Word2Vec, разбивая слова на n-граммы.</p>
  <p id="K9fw">Помогает работать с морфологически богатыми языками, редкими словами, опечатками, незнакомыми словами.</p>
  <p id="7S0E">Вектор слова — это сумма векторов н-граммы слова.</p>
  <h3 id="bXoL">Что такое GloVe (Global Vectors for Word Representation)?</h3>
  <p id="kbdD">Объединяет частотные подходы и обучение через SGD как у Word2Vec.</p>
  <p id="wYZH">Работает так:</p>
  <ul id="WQB1">
    <li id="a8tC">строим матрицу со встречаемости слов в корпусе<br />получается большая квадратная матрица</li>
    <li id="Dz1q">нормализуем частоты, чтобы сгладить слишком частые и редкие слова</li>
    <li id="Uwvh">у нас также есть 2 матрицы для векторов слов</li>
    <li id="32ud">обучаем с помощью SGD на лосс таким образом, чтобы вектора слов были другу на друга более похожи, если их совстречаемость выше</li>
  </ul>
  <figure id="aM3S" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXevEBshMhfFahVYszFf0m4007107VeEKoOMAL18faCErtk5nZuyvchcLSTnorXdj-aVptfeIxLVCvSFVqNF7-fo7aN4jqAq0tQVOLQ9Nn1V1ggGplDnxqxvOCi0BR_PyiIVULiM?key=dlApc3SUfgfha0JQx3K76ect" width="512" />
  </figure>
  <p id="q7EE">Плюсы:</p>
  <ul id="jRmW">
    <li id="FmwZ">Учитывает глобальную статистику корпуса (Word2Vec работает только на локальных окнах контекста)</li>
    <li id="rhoT">Хорошо отражает семантические и синтаксические связи между словами</li>
    <li id="o75A">Обучается быстрее, чем Word2Vec (потому что использует матричное представление)</li>
  </ul>
  <p id="rAm3">Минусы:</p>
  <ul id="IzjM">
    <li id="VE16">Требует большого корпуса для построения матрицы совместных встречаемостей</li>
    <li id="1yxv">Потребляет много памяти (матрица соразмерна квадрату словаря)</li>
    <li id="YvNU">Дает статические векторы, которые не зависят от контекста (в отличие от, например, эмбеддингов BERT)</li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@abletobetable/regularization_techniques</guid><link>https://teletype.in/@abletobetable/regularization_techniques?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable</link><comments>https://teletype.in/@abletobetable/regularization_techniques?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable#comments</comments><dc:creator>abletobetable</dc:creator><title>Вопросы с собесов. Регуляризация в DL</title><pubDate>Thu, 03 Apr 2025 11:38:07 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/3f/8c/3f8cb0ad-bc1d-4ffa-a75c-7b18a7ec86b0.png"></media:content><category>Deep learning</category><description><![CDATA[<img src="https://img4.teletype.in/files/38/0c/380cb028-d399-4fe3-876b-5657435d24cd.png"></img>Рассмотрим какие методы регуляризации есть в DL: от изменений лосс функций и до вмешательства в архитектуру модели.]]></description><content:encoded><![CDATA[
  <p id="27xr">Рассмотрим какие методы регуляризации есть в DL: от изменений лосс функций и до вмешательства в архитектуру модели.</p>
  <p id="GHMw">Подобные вопросы не редкость на собеседованиях по глубокому обучению. Более того, неправильный ответ на них выдаёт вас за новичка, поскольку они уже стали базой собесов!</p>
  <h1 id="pdX0">Dropout</h1>
  <p id="jT0u"><strong>Во время обучения:</strong></p>
  <p id="2BYr">С заранее заданной вероятностью обнуляем случайные признаки перед слоем. То есть накладываем маску из единиц и нулей на слой. Можем обнулять как входные признаки, так и внутренние представления.</p>
  <p id="MqKQ">Сделано это для того, чтобы модель училась использовать как можно больше своих нейронов, не подстраиваясь под возможный шум в данных. Таким образом избегаем переобучения сети.</p>
  <figure id="7tmC" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfwy3xosj9dAiMTFfmeSAjjsubghZdtp_gnMryodZeFjZgT-LK_7HhqD27doyfk-5cph9OsWZ4tfMAw1adQTqXM18xfVAG7_KoVW_yS5yB3IJ3kpLdkpQVbjnzFvAC5PnymdXA6Rw?key=9vKlQXBczLErlbVvp-SHGwHD" width="1600" />
    <figcaption>Применение dropout</figcaption>
  </figure>
  <p id="diXn"><strong>Во время инференса:</strong></p>
  <p id="i7ZI">Конечно, мы не хотим делать жизнь модели тяжелее во время ее применения, поэтому обнулять активации нейронов не надо.</p>
  <p id="pf3v">Но необходимо умножить все выходы нейронов на (1 - p), где p - это вероятность обнуления, чтобы распределение на инференсе совпадало с распределением на трейне.</p>
  <p id="wDcg">Также есть обратный дропаут (аналогичный способ использовать дропаут), когда мы во время трейна умножаем на 1/(1-p), а на инференсе ничего не меняем.</p>
  <h1 id="157N">Batch Norm</h1>
  <p id="T8ar">Мотивация батч нормализации в том, чтобы контролировать распределения активаций нейронов после слоя.</p>
  <p id="v6QR">Это достигается за счет того, что мы<strong> на трейне:</strong></p>
  <ul id="CdGX">
    <li id="L1ai">сначала считаем матожидание и дисперсию по батчу</li>
    <li id="zOJB">нормируем представление по формуле</li>
  </ul>
  <figure id="kGPP" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc0HMhEit4-5_Nf9vGHC7nlNHe3QMCqTVLGSlBVgP2CKotone9rb_92Ns11lBytC2gziHsTgW3alVek52zFRW1zxBhIEl7y4l2a90toSqEZwUtdvOag6b3-BOIiCyfbzGtEBpSbfw?key=9vKlQXBczLErlbVvp-SHGwHD" width="209" />
    <figcaption>нормировка</figcaption>
  </figure>
  <ul id="8QfA">
    <li id="oDyv">а потом делаем масштабирование с помощью умножение на scale (бета) и прибавление shift (гамма), эти параметры обучаются</li>
  </ul>
  <figure id="dXTp" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdoq0-N2LDe3kporxFJchy8ywV2NDXT8aQrEpbz3Fyfb_AFQEwrZ6Fhb-sKOA53z4LINF9HTWnpXz65jB5rOIcMfc8QFTR8xvbMhnppbbAEfT8Fo1SJxjmkRDVa3Ue8lhUM8bsLjg?key=9vKlQXBczLErlbVvp-SHGwHD" width="246" />
    <figcaption>масштабирование</figcaption>
  </figure>
  <p id="FTwF">Этот шаг нужен, чтобы с помощью обучающих параметров модель могла отменить нормализацию с прошлого шага</p>
  <p id="Pbk0"><strong>На инференсе</strong> у нас, конечно, нет подсчета статистик по батчу, хотя бы потому что батч может быть из одного элемента. Поэтому во время обучения мы также накапливаем скользящее среднее матожидания и дисперсии, чтобы потом их использовать на инференсе.</p>
  <figure id="77Ze" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd6gXeDcgGmc0_trgIZ4OiM2cMeJtVroxwcU4T5w7vrjEDkAuydmUgSRMb7beh0bfqGzIB0mNTz9lN9-SFs9pRFOJvNo8tq4uz-1E2dIZm6WyCeoXWWIbEzvo51I2jUF9fJQhvrfg?key=9vKlQXBczLErlbVvp-SHGwHD" width="283" />
    <figcaption>скользящее среднее</figcaption>
  </figure>
  <p id="yu02">Обучаемые параметры бета и гамма также остаются и мы выученные значения используем по той же схеме во время инференса.</p>
  <p id="ZTUV">Плюсы:</p>
  <ul id="VMRa">
    <li id="PWBw">ускоряет и улучшает сходимость, можно использовать более высокие learning rate-ы</li>
    <li id="V6j8">уменьшает зависимость нейронной сети от начальной инициализации</li>
    <li id="nG6a">в какой-то степени помогает бороться с переобучением, поэтому его и называют методом регуляризации</li>
  </ul>
  <p id="qhdV">Существуют и другие способы нормировать промежуточные представления: instance normalization, layer normalization (используется в трансформерах) и по другим возможным размерностям.</p>
  <h1 id="6dop">Weight decay</h1>
  <p id="vLJp">По сути это L2 регуляризация, встроенная в оптимизатор AdamW, рассмотренный здесь.</p>
  <figure id="mgE0" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfd8xPFSPg9VJVJSCRIL4tlj6AvaOjTYMYpEvcheLs47mLsp_6CdXRcZxXXfoitV7zoA6g-LjkkD5fDGpjpM_ZJQok2h7eYpsGEaFe1HAhhK78gh5uf9sjzEPrx_D_VPc86vRgikQ?key=9vKlQXBczLErlbVvp-SHGwHD" width="454" />
    <figcaption>регуляризация</figcaption>
  </figure>
  <p id="zzL0">То есть мы накладываем штраф за слишком большие по норме веса.</p>
  <h1 id="mxgW">Label smoothing</h1>
  <p id="2wzW">Техника регуляризации, которая добавляет шум в целевым меткам, предполагая, что разметка может сама по себе где-то неправильной.</p>
  <p id="eM0Z">Принцип работы довольно прост:</p>
  <ul id="Nn5u">
    <li id="l3nF">Выбираем небольшую константу e (эпсилон)</li>
    <li id="KG0h">Заменяем жесткие таргет лейблы 0 и 1 на e/k и 1 - e(k-1)/k</li>
  </ul>
  <p id="kN6s">k - кол-во классов</p>
  <figure id="Inpe" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXewek1gWL72cyo_DwATVAMdt7l2Nh3Ts80AZj8mUqPbQpnd9o3--3_6qJzNhIxxVtVWOpT44gOWMMhJGj_qv5Z-Njh08lfhZjXn6kKJwjg9-ccgUwF58yPODO6lHB1e0nXwoZIasQ?key=9vKlQXBczLErlbVvp-SHGwHD" width="115" />
    <figcaption>Было</figcaption>
  </figure>
  <figure id="rmRu" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfkQEODW_3dESFbKr8-CynHCORduZAMW4m9fS-SKdIWWThsOmcPkpY8fSaEAPYiRjR8dINq-9Y68LakiEjYOBnsKg5p8vC-wQIzTVM4mM2X7s6fqbuinI9gIEU36Asij_b3dceqqA?key=9vKlQXBczLErlbVvp-SHGwHD" width="236" />
    <figcaption>Стало</figcaption>
  </figure>
  <p id="ue0M">Пример результата работы label smoothing из статьи:</p>
  <figure id="eaxe" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXck4p1farWx7NQ1ng25md4LYAByZx8-QbwYeYVW_9bpqiesnqpCVeftCgY6ydteIOPPp6qzXGvT_Eim1HgzOkotg5aUwFzO_ZCWiJUEGU0baVItPZwelfu8ExWhzMYMxnomtXJE?key=9vKlQXBczLErlbVvp-SHGwHD" width="320" />
    <figcaption>эффект от label smoothing</figcaption>
  </figure>
  <h1 id="94Yf">Аугментация</h1>
  <p id="RLpv">Аугментация данных или создание новых семплов на основе уже имеющихся тоже является методом регуляризации, так как мы в этом случае боремся с переобучением модели и делаем ее устойчивой к более разнообразным данным.</p>
  <p id="FvMq">Например, в компьютерном зрении аугментацией может служить: поворот, разворот, переворот, добавление шума и тд. Объект на картинке не изменит свою метку класса после таких преобразований.</p>
  <h1 id="CaBd">Ранняя остановка</h1>
  <p id="tT38">Давайте вдумаемся, что такое регуляризация - это когда мы вмешиваемся в обучение модели и накладываем какие-то ограничения на разные аспекты ее обучения: в лосс функцию, в архитектуру, в данные.</p>
  <p id="DYix">Early stopping тоже регуляризация, потому что мы не даем модели достаточно времени на запоминание и прерываем оптимизацию раньше времени.</p>
  <p id="8Veg">Обычно если модель склонна к переобучению, то это можно будет отследить на лоссе на валидации - он начнет расти, при падающем лоссе на трейне.</p>
  <figure id="3ODx" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcPqLZ8MKeRCXk5VFCNAGOP0GTzTEumd_BueBGtTVugTNEWhjIHmAAbSIeluhHM1LnJNm37eFSwzJa8-36k8gt9q7LXIomMX-lQ6-C0f136aapnkfYx0klI_eniRQsw9pRu6Bik?key=9vKlQXBczLErlbVvp-SHGwHD" width="616.5" />
  </figure>
  <h1 id="Bbgm">Заключение</h1>
  <p id="r426">Не переобучайтесь - обобщайтесь</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@abletobetable/optimizers</guid><link>https://teletype.in/@abletobetable/optimizers?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable</link><comments>https://teletype.in/@abletobetable/optimizers?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable#comments</comments><dc:creator>abletobetable</dc:creator><title>Оптимизаторы в DL. От SGD до AdamW</title><pubDate>Sat, 29 Mar 2025 04:58:03 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/f5/f7/f5f7d588-1055-439d-9b7d-caa9298f5261.png"></media:content><category>Deep learning</category><description><![CDATA[<img src="https://img3.teletype.in/files/e7/5e/e75e9984-2e40-48a8-a022-51311e2cb456.png"></img>Функции активации пронизывают все нейронные сети. Зачем это нужно и какие именно активации использовать — обсудим в этом блоге.]]></description><content:encoded><![CDATA[
  <p id="nAf8">Вопрос про то, какие есть оптимизаторы в глубоком обучении и какие у них особенности и отличия друг от друга очень популярный. В этом блоге разберем, как именно нужно отвечать на этот вопрос)</p>
  <p id="DmBp">Для начала, пару слов о терминологии:</p>
  <ul id="DCgk">
    <li id="Da0s">Оптимизировать будем функцию потерь, то есть некоторый функционал качества работы модели. Например, MSE или logloss.</li>
    <li id="BIFs">Оптимизировать = искать глобальный (в идеале) минимум этой функции потерь.</li>
    <li id="5Tr1">Оптимизируем с помощью движения в сторону антиградиента, а тому как именно двигаться и будет посвящена эта статья.<br />Антиградиент - потому что градиент показывает наискорейшее локальное возрастание функции. Мы хотим искать убывание, то есть берем градиент со знаком минус = антиградиент.</li>
  </ul>
  <h1 id="WmXj">1. GD: Gradient Descent</h1>
  <ul id="CmIX">
    <li id="2SbE">Считаем градиент по всей обучающей выборке.</li>
    <li id="vu9S">Смещаемся в сторону антиградиента со скоростью learning rate по формуле:</li>
  </ul>
  <figure id="jyfj" class="m_retina" data-caption-align="center">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXf7jeXPzjCZ5X7-rp_y93MrbLeQP7p37n2m-4sUNgkyiWe9HgMSKytCivg0BNQu4WbrtBaXD5vBBskCRW-Q9giPvAqB52MRaSKE651jzMk8loeXHlUbjQZbDk_i8kL70dcCBqnx?key=lNVCn-9GG37Lk7c_wkCHs7GO" width="482" />
    <figcaption>GD формула</figcaption>
  </figure>
  <p id="pRZ4">Может быть довольно точным, но считать градиент на всей выборке просто вычислительно нереально)</p>
  <p id="pSMN">Поэтому придумали SGD.</p>
  <h1 id="QzNa">2. SGD: Stochastic Gradient Descent</h1>
  <ul id="HaXq">
    <li id="EKLE">Нарезаем датасет на батчи: группы данных. Причем очень важно перемешать датасет и выдавать батчи случайно от эпохи к эпохе.</li>
    <li id="WOs7">Считаем градиент по батчу</li>
    <li id="sg0r">Смещаемся в сторону антиградиента со скоростью learning rate по все той же формуле:</li>
  </ul>
  <figure id="5IHx" class="m_retina" data-caption-align="center">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXf7jeXPzjCZ5X7-rp_y93MrbLeQP7p37n2m-4sUNgkyiWe9HgMSKytCivg0BNQu4WbrtBaXD5vBBskCRW-Q9giPvAqB52MRaSKE651jzMk8loeXHlUbjQZbDk_i8kL70dcCBqnx?key=lNVCn-9GG37Lk7c_wkCHs7GO" width="482" />
    <figcaption>SGD формула</figcaption>
  </figure>
  <p id="h0AR">Плюсы:</p>
  <ul id="jJUn">
    <li id="thnS">Баланс между скоростью и стабильностью</li>
    <li id="VvEp">Прост в реализации</li>
    <li id="Xele">Кроме градиентов и весов модели ничего не нужно держать в оперативной памяти</li>
  </ul>
  <p id="rji1">Минусы:</p>
  <ul id="mgj8">
    <li id="g673">Может застревать в локальных минимумах</li>
    <li id="ENN1">Нужно подбирать learning rate</li>
  </ul>
  <h1 id="1Ww8">3. SGD с импульсом (Momentum)</h1>
  <p id="E4bE">Отличие от SGD в том, что мы дополнительно накапливаем градиенты с прошлых шагов и двигаемся не только в сторону “жадного” антиградиента на текущем шаге, но и в сторону общего движения оптимизации.</p>
  <p id="xHJX">Пытаемся решить проблему того, что градиент показывает только в сторону локального изменения функции потерь, а мы целимся в сторону глобального минимума.</p>
  <ul id="8Vns">
    <li id="mo8Z">Считаем градиент по батчу</li>
    <li id="bUBj">Считаем момент / импульс / скорость по формуле (1)</li>
    <li id="Sxqz">Смещаемся в сторону антиградиента со скорректированной скоростью по формуле: (2)</li>
  </ul>
  <figure id="n6kj" class="m_retina" data-caption-align="center">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdUFEwh3fIjKrq4FtKh48Ege2_lYyWFrGidztNxJolIAxZcP_ITdsLSLGCi95zl5vauHJfJX3ibKt63027DbOxlhHPKvJzq4edVFyKtmSsVKAqsO4o875VStPQ_HfZVZH499OWuPA?key=lNVCn-9GG37Lk7c_wkCHs7GO" width="478" />
    <figcaption>Momentum формула</figcaption>
  </figure>
  <p id="O5FA">Плюсы:</p>
  <ul id="4bBf">
    <li id="KPZF">Ускоряет обучение в направлениях с устойчивым градиентом.</li>
    <li id="mVhg">Сглаживает колебания в шумных градиентах.</li>
    <li id="Viiv">Быстрее обычного SGD.</li>
    <li id="whCW">Лучше проходит &quot;овраги&quot; в ландшафте функции потерь.</li>
  </ul>
  <p id="syrl">Минусы:</p>
  <ul id="5ZnA">
    <li id="JKUj">Может &quot;проскочить&quot; минимум.</li>
    <li id="4Tqx">Нужно в оперативной памяти дополнительно хранить моменты.</li>
  </ul>
  <h1 id="cQw4">4. Nesterov Accelerated Gradient (NAG)</h1>
  <p id="GKUk">Отличие от обычного момента в том, что мы как бы заглядываем в будущее и рассчитываем направление оптимального движения оттуда. Грубо: сначала смещаемся по моменту, а только потом по антиградиенту. Если до сих пор непонятно, то лучше всмотреться в формулу</p>
  <ul id="foyd">
    <li id="Eolc">Считаем градиент по батчу</li>
    <li id="ZAMM">Считаем момент / импульс / скорость по формуле (1)</li>
    <li id="XMZQ">Смещаемся в сторону антиградиента со скорректированной скоростью по формуле: (2)</li>
  </ul>
  <figure id="l5iT" class="m_retina" data-caption-align="center">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcIIJvP9fDS6vlsQFdREoqwyIZlyoALAGfD2Xlfh4OzsBZ9Lsx8nbTb3JnxyHkA8go3y9BPQ7pxl0N2nafNrQo0OiBmyScmPLiVuPRsuXBEi6Tz-u9fh16lt6N086-w3W_M2laqmw?key=lNVCn-9GG37Lk7c_wkCHs7GO" width="515" />
    <figcaption>Nesterov momentum формула</figcaption>
  </figure>
  <p id="DDcC">Видно, что изменился подсчет градиента, считаем не просто по тета, а по тета минус импульс</p>
  <p id="53Z8">Плюсы:</p>
  <ul id="7DsB">
    <li id="TYck">Улучшенный Momentum, который &quot;заглядывает вперед&quot;.</li>
    <li id="42al">Корректирует градиент с учетом будущего шага.</li>
    <li id="vcW7">Лучше сходится на сложных функциях.</li>
  </ul>
  <p id="NZcJ">Минусы:</p>
  <ul id="nFXq">
    <li id="TUok">Чуть сложнее в реализации.</li>
    <li id="lT0K">Нужно в оперативной памяти дополнительно хранить моменты.</li>
  </ul>
  <h1 id="kHbX">5. AdaGrad (Adaptive Gradient)</h1>
  <p id="pgbf">Делает адаптивные шаги, то есть у разных параметров разные по скорости шаги, тем самым выравнивает скорость в среднем на всем обучении. Логика в том, чтобы делать маленькие шаги при очень больших суммарных градиентах, и увеличивать скорость при небольших суммарных градиентах. Такое возможно за счет деления на корень из суммы квадратов градиентов.</p>
  <ul id="CbYH">
    <li id="ziQK">Считаем градиент по батчу</li>
    <li id="w8Po">Обновляем сумму квадратов градиентов (1)</li>
    <li id="Auip">Делим скорость learning rate на корень из суммы квадратов градиентов (эпсилон нужен, чтобы случайно на 0 не разделить)</li>
    <li id="QpJ6">Смещаемся в сторону антиградиента со скорректированной скоростью по формуле (2):</li>
  </ul>
  <figure id="F3bl" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeqn3oZz5LCs-FO7bxAhDzpGsJszjTpLlfVgT-YvVkfYysdgoP0WotGSGR_7LzEN5YKI5FzIKlDySXKfYk4O8cWOrHBviXWnT24WZJZ1q0HtHcWL0rAiGH4TX7SI52ykLWK5PWm?key=lNVCn-9GG37Lk7c_wkCHs7GO" width="513" />
    <figcaption>Adagrad</figcaption>
  </figure>
  <p id="JTrd">Плюсы:</p>
  <ul id="LN3F">
    <li id="uWRH">Адаптивный learning rate для каждого параметра.</li>
    <li id="atGZ">Большие градиенты уменьшают шаг, малые — увеличивают.</li>
  </ul>
  <p id="knq2">Минусы:</p>
  <ul id="gvVC">
    <li id="Cefm">Learning rate может стать слишком малым (обучение останавливается).</li>
    <li id="0FVA">Нужно в оперативной памяти дополнительно хранить квадраты градиентов.</li>
  </ul>
  <h1 id="4B5S">5. RMSprop</h1>
  <p id="97sn">Решаем проблему остановки обучения из-за очень низкого learning rate с помощью экспоненциального сглаживания. В остальном то же самое.</p>
  <ul id="lnEZ">
    <li id="iUAm">Считаем градиент по батчу</li>
    <li id="mst0">Обновляем сумму квадратов градиентов через скользящее среднее (1)</li>
    <li id="IXGQ">Делим скорость learning rate на корень из суммы квадратов градиентов (эпсилон нужен, чтобы случайно на 0 не разделить)</li>
    <li id="QABF">Смещаемся в сторону антиградиента со скорректированной скоростью по формуле (2):</li>
  </ul>
  <figure id="S6ec" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcLwN0kSQGtZyGI3tz5aTXYUPhj_u4ADhIiyFJ2rEQShNgCnmQmNCJrMbSglehhnBfr2puxB30_sETSHUfYLB30Wk6w2ZmBAMi_Z45yeFU_Z2RZWfXE2XKL5lT_COm3F3RG7aAGQg?key=lNVCn-9GG37Lk7c_wkCHs7GO" width="525" />
  </figure>
  <p id="2fDU">Плюсы:</p>
  <ul id="iuTH">
    <li id="fa4J">Исправляет проблему AdaGrad (не дает learning rate слишком уменьшиться).</li>
  </ul>
  <p id="xcsO">Минусы:</p>
  <ul id="9xV2">
    <li id="hdSe">Нужно подбирать gamma.</li>
    <li id="drlK">Нужно в оперативной памяти дополнительно хранить квадраты градиентов.</li>
  </ul>
  <h1 id="tYLX">6. Adam (Adaptive Moment Estimation)</h1>
  <p id="GKU5">Комбинация Momentum и RMSprop, то есть адаптивный learning rate + учет истории градиентов.</p>
  <ul id="hSS8">
    <li id="31Ro">Считаем градиент по батчу</li>
    <li id="wZWY">Обновляем момент (1)</li>
    <li id="DQKC">Обновляем сумму квадратов градиентов через скользящее среднее (2)</li>
    <li id="u21U">Смещаемся по формуле (3):</li>
  </ul>
  <figure id="aaw9" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXclKQHrXkeZUunNm-uGhuePi4BiHq31lTg64fHbD0kNe3ltAb6dzUX113pwZrh1BK07CEDaNPM_ZfFuBILx8m8duatraZEnNZumwmhyHvvkUkIAwwVsl5Zu8SM2X62b_SI86OJh-Q?key=lNVCn-9GG37Lk7c_wkCHs7GO" width="418" />
  </figure>
  <p id="E5r0">Плюсы:</p>
  <ul id="pOhU">
    <li id="A68O">Один из самых популярных оптимизаторов.</li>
    <li id="Ch1u">Хорошо работает &quot;из коробки&quot;.</li>
  </ul>
  <p id="ANg9">Минусы:</p>
  <ul id="ryEA">
    <li id="U7Hv">Иногда сходится к субоптимальным решениям</li>
    <li id="Jf7N">Требует тонкой настройки</li>
    <li id="xFRO">Нужно в оперативной памяти дополнительно хранить моменты и квадраты градиентов.</li>
  </ul>
  <h2 id="Q6va">7. AdamW</h2>
  <p id="4Sau">Улучшенный Adam с правильным учетом L2-регуляризации (weight decay).</p>
  <p id="OdBV">Это сделано для того, чтобы эффект L2-регуляризации не затухал со временем и обобщающая способность модели была выше.</p>
  <figure id="AtCu" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeytOktt3rpe5BEsRDrcNdnESmaXQdMJtd3kLYAcuS-pfUVsPocjivyovMmAwAJBvcDiiQo7gXZ0IqcXzSd_GysUDJm2AwaJRVSk7jMWFPhgZN7dCEuNxdHhoDsdM-eeMQhn6yeHA?key=lNVCn-9GG37Lk7c_wkCHs7GO" width="465" />
  </figure>
  <p id="i6dS">Плюсы и минусы такие же как у Адама, но чуть лучше сходится за счет регуляризации.</p>
  <h1 id="qDO0">Заключение</h1>
  <p id="zhe9">Конечно, есть и другие оптимизаторы, и они даже используются на практике, но про них не спрашивают на собеседованиях и не особо часто используют в реальных задачах. Поэтому достаточно просто знать, что иногда придется использовать что-то кроме адама, например, lion.</p>
  <p id="22tq">Также не забывайте, что есть разные оптимизаторы специально придуманные для мульти-гпу, например, LARS, LAMB.</p>
  <p id="5Yq5">Но для собесов и работы до определенного момента достаточно знать только рассмотренные выше.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@abletobetable/activation_functions</guid><link>https://teletype.in/@abletobetable/activation_functions?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable</link><comments>https://teletype.in/@abletobetable/activation_functions?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable#comments</comments><dc:creator>abletobetable</dc:creator><title>Вопросы с собесов. Функции активации в DL</title><pubDate>Thu, 27 Mar 2025 18:55:38 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/ad/ff/adffee02-c709-4d3f-a8de-92a12dad414d.png"></media:content><category>Deep learning</category><description><![CDATA[<img src="https://img2.teletype.in/files/d0/13/d013787e-28c6-43b1-853a-d468bfddc6c5.webp"></img>Функции активации пронизывают все нейронные сети. Зачем это нужно и какие именно активации использовать — обсудим в этом блоге.]]></description><content:encoded><![CDATA[
  <p id="C6Op">Функции активации пронизывают все нейронные сети. Зачем это нужно и какие именно активации использовать — обсудим в этом блоге.</p>
  <p id="N5Dc">Подобные вопросы не редкость на собеседованиях по глубокому обучению. Более того, неправильный ответ на них выдаёт вас за новичка, поскольку они уже стали базой собесов в DL.</p>
  <h1 id="XFds">Зачем нужны функции активации?</h1>
  <p id="BZxu">Они нужны для внесения нелинейности в модель, что позволяет нейронным сетям аппроксимировать сложные функции.</p>
  <p id="2raA">Без них сеть свелась бы к одной линейной трансформации, а использование нескольких слоёв в том же многослойном перцептроне не имело бы смысла.</p>
  <h1 id="mqbD">Какие бывают функции активации, их плюсы и минусы?</h1>
  <h2 id="bR2Y">Sigmoid</h2>
  <figure id="sJZV" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfVtVWOiTp2fwgNi3NfU2ZSFBbTWF10rGvAYbKNKZGvwUbAwGIHg2w9y1y1y1wAMIlYOX_DyhFRSynVQHLhg697xkU-SG5yo5CP0xlW9443F3VD8f16yDT4hu45mcXopxA2iuBERg?key=Qg8ZhnAqceiKwbbzHqhzdcpU" width="362" />
  </figure>
  <p id="M5L7">Плюсы:</p>
  <ul id="hWKo">
    <li id="UGMi">хороша для вероятностей</li>
    <li id="UGlZ">ограниченная область значений</li>
  </ul>
  <p id="h2lt">Минусы:</p>
  <ul id="uQ9W">
    <li id="yjOz">на «хвостах» обладает практически нулевой производной, что может привести к затуханию градиента</li>
    <li id="Hx3W">максимальное значение производной составляет 0.25, что также приводит к затуханию градиента</li>
    <li id="F5k0">нет симметричности относительно нуля</li>
    <li id="Ywoh">вычислительно сложно считать экспоненту</li>
  </ul>
  <h2 id="FFEh">Tanh</h2>
  <figure id="DurU" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdsre9aXPJwK_tpuYuO1YznNL6L9w4SIDLVUZP-oYM-cHgENYbJazHHSnby3OS00ddkAA7IWTN8vUmD8GkZf-LUl9Q0UlDOMuJDOfsCUvvtHjhXBT24waT-bciOHZlO1mghcO9Cvw?key=Qg8ZhnAqceiKwbbzHqhzdcpU" width="292" />
  </figure>
  <p id="jLVU">Плюсы:</p>
  <ul id="DmOI">
    <li id="yceL">симметрична относительно 0, подходит для центровки данных.</li>
    <li id="NeQ2">ограниченная область значений</li>
  </ul>
  <p id="37Ah">Минусы:</p>
  <ul id="wnjF">
    <li id="diB6">всё ещё имеет проблему затухания градиента</li>
    <li id="s1bB">требует вычисления экспоненты, что является достаточно сложной вычислительной операцией</li>
  </ul>
  <h2 id="6Xk2">ReLU (Rectified Linear Unit)</h2>
  <figure id="z5yL" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdRX3Z_v_AI2n__gS7Pchb0zyMci7-fdEL5bNvYvVkPoqiXFu7BUtCfV4Il9BuTCSbg6oW2n8jA3JWvlhs_l99ogUzdPwJzwIcCvwvF8Enuq4pEpplxWRKLhwqXtZQU_2-zBaMP?key=Qg8ZhnAqceiKwbbzHqhzdcpU" width="308" />
  </figure>
  <p id="0Kx0">Плюсы:</p>
  <ul id="dUVw">
    <li id="aXX9">простая, быстрая в вычислении</li>
    <li id="oUb4">не вызывает проблем с градиентами для положительных значений</li>
  </ul>
  <p id="K9gN">Минусы:</p>
  <ul id="tVd2">
    <li id="NN25">Может вызывать проблему &quot;dead neurons&quot; из-за нулевой производной у отрицательных значений</li>
  </ul>
  <h2 id="NQbN">Leaky ReLU</h2>
  <figure id="Xprl" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXf_bZQiyo_1sa3a5BAJU-HMLSJjDfjRppd__60fXGqsCRTRpgFq8TUO7lJ6qmXJ4Gjc0loKnGOJyQgIi6-KJdy_2GVFTI7w6ysaEtiUA6qX2MJPGA58haqe7bMVIk3fuF61f5uI1Q?key=Qg8ZhnAqceiKwbbzHqhzdcpU" width="347" />
  </figure>
  <p id="eBy0">Плюсы:</p>
  <ul id="uHYQ">
    <li id="6YIO">решает проблему dead neurons, пропуская небольшое отрицательное значение</li>
  </ul>
  <p id="wx8g">Минусы:</p>
  <ul id="40WH">
    <li id="M0K1">гиперпараметр наклона требует настройки</li>
  </ul>
  <h2 id="1IB8">ELU (Exponential Linear Unit)</h2>
  <figure id="x7vM" class="m_retina">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeY-xm39qOhamgyQ396rvJ4kJ2ejsfOtvwu5ueLCdP2ep6jzAJqiiptW55ewhKSbBb75JXDG6ku5s7htY3SkN-_UTUqqgqnKDFfcXhYUhzykqhoMTw_HyXPuLmYBLyb4raR17SpTg?key=Qg8ZhnAqceiKwbbzHqhzdcpU" width="410" />
  </figure>
  <p id="aX9y">Плюсы:</p>
  <ul id="uWZV">
    <li id="Giat">сглаживает нулевую точку, помогает избежать dead neurons.</li>
  </ul>
  <p id="tfkE">Минусы:</p>
  <ul id="YeOI">
    <li id="ZkTf">дороже в вычислениях, чем ReLU.</li>
  </ul>
  <p id="c4ja">Конечно, кроме рассмотренных есть и другие функции активации, например, GELU (активно используемый в трансформерах), но на собеседованиях обычно спрашивают только про самые основные.</p>
  <h1 id="o3K9">Заключение</h1>
  <p id="bsTo">Используйте функции активации.</p>
  <p id="fBFN">Но используйте с умом, хотя бы для того, чтобы градиент не затухал.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@abletobetable/text_quality_evaluation_metrics</guid><link>https://teletype.in/@abletobetable/text_quality_evaluation_metrics?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable</link><comments>https://teletype.in/@abletobetable/text_quality_evaluation_metrics?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable#comments</comments><dc:creator>abletobetable</dc:creator><title>Как оценивать качество генеративных моделей?</title><pubDate>Sun, 23 Mar 2025 17:50:06 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/1b/0c/1b0c591f-0bcc-40c4-9294-37e922e11ffb.png"></media:content><category>nlp</category><description><![CDATA[<img src="https://img3.teletype.in/files/67/33/6733b7f7-871f-40e5-a70f-c8075f2986a3.webp"></img>Оценка качества генеративных моделей — ключевой этап разработки, позволяющий определить, насколько хорошо модель справляется с поставленной задачей.]]></description><content:encoded><![CDATA[
  <p id="ZGYQ">Оценка качества генеративных моделей — ключевой этап разработки, позволяющий определить, насколько хорошо модель справляется с поставленной задачей.</p>
  <p id="s9ND">Также это не самый редкий вопрос на собеседованиях и важный пункт в ML System Design)</p>
  <p id="SUWP">Существует два основных подхода к оценке: автоматические метрики и ручная оценка.</p>
  <h2 id="Lk6Q">Автоматические метрики</h2>
  <p id="8Nqs">Автоматические метрики позволяют быстро и объективно оценивать качество сгенерированного текста.</p>
  <p id="XIuQ"><strong>1. Exact match</strong> — проверяет точное совпадение с правильным ответом.</p>
  <p id="lWX2"><strong>2. BLEU (Bilingual Evaluation Understudy)</strong> — измеряет точность совпадений n-грамм в сгенерированном и эталонном текстах (часто используется в машинном переводе). Также накладывает штраф за краткость.</p>
  <figure id="VE4q" class="m_retina">
    <img src="https://img3.teletype.in/files/e6/65/e665fed0-536c-4dd7-8e9e-2410a12268b0.png" width="256" />
    <figcaption>BLEU формула.</figcaption>
  </figure>
  <p id="AmTz">Где</p>
  <ul id="ImZk">
    <li id="s44z">BP — это штраф за краткость, учитывающий длину сгенерированного текста по сравнению с ссылочным текстом(ами).</li>
    <li id="XfhG">n — максимальный рассматриваемый порядок n-грамм (обычно 4).</li>
    <li id="M1lM">P_i — это точность i-граммы между сгенерированным текстом и ссылочным текстом(ами).</li>
  </ul>
  <figure id="XDiV" class="m_retina">
    <img src="https://img4.teletype.in/files/fe/57/fe57a85f-e1e0-40f0-8756-6f25899057b3.png" width="225" />
    <figcaption>формула штрафа за краткость</figcaption>
  </figure>
  <p id="gAzp">Где</p>
  <ul id="bLlF">
    <li id="dvxl">c — длина сгенерированного текста</li>
    <li id="yDDV">r — длина ближайшего ссылочного текста</li>
  </ul>
  <p id="qEsr"><strong>3. ROUGE (Recall-Oriented Understudy for Gisting Evaluation) —</strong> применяется для оценки суммаризации, например, сравнивая n-граммы с таргетом.</p>
  <figure id="TQVE" class="m_retina">
    <img src="https://img2.teletype.in/files/9e/52/9e52c1a6-e1ad-421d-9764-f6cbf2c328ac.png" width="657" />
    <figcaption>Общая формула ROUGE</figcaption>
  </figure>
  <p id="Yzex">Существует несколько видом оценки ROUGE. Ниже приведены наиболее популярные ее разновидности.</p>
  <p id="4gKk">ROUGE-N: Эта метрика считает, сколько слов из вашего резюме встречается в референсном резюме. </p>
  <p id="zSqE">ROUGE-1 считает, сколько отдельных слов из вашего резюме встречается в референсном резюме.</p>
  <p id="Py8K">ROUGE-2 считает, сколько пар слов из вашего резюме встречается в референсном резюме.</p>
  <p id="5IJJ">ROUGE-L: Эта метрика считает, сколько слов в вашем резюме образуют самую длинную общую последовательность слов в референсном резюме. Это позволяет оценить, насколько ваше резюме похоже на референсное.</p>
  <p id="lqVT"><strong>4. METEOR</strong> — расширяет BLEU, учитывая синонимы и морфологические вариации слов.</p>
  <p id="kudB"><strong>5. BERTScore</strong> — использует эмбеддинги BERT для оценки семантического сходства между сгенерированным и эталонным текстами. <a href="https://arxiv.org/pdf/1904.09675" target="_blank">статья</a></p>
  <p id="DL7v"><strong>6. Seahorse</strong> — бенчмарк и специально обученная модель на оценку качества суммаризации. <a href="https://arxiv.org/abs/2305.13194" target="_blank">статья</a></p>
  <p id="NxuM"><strong>7. LLM as a judge</strong> — использование больших языковых моделей (LLM) для оценки генерации. <a href="https://huggingface.co/learn/cookbook/llm_judge#using-llm-as-a-judge--for-an-automated-and-versatile-evaluation" target="_blank">блогпост huggingface</a><br />Могут быть очень полезны в случаях, когда требуется оценить очень много текстов без привлечения людей. Но в таком подходе оценка качества это тоже сгенерированный текст, который снова требует валидации)</p>
  <p id="DXeS"></p>
  <p id="AO1V">Автоматические метрики оценки генерации текста могут быть полезны как прокси-метрики, например, для быстрого сравнения гипотез во время активной фазы исследования, но полагаться на них полностью будет не совсем правильно.</p>
  <p id="1omt">Те же BLEU / ROUGE не улавливают смысл предсказания и таргета, поэтому имеют потолок в адекватности своей оценки, то есть начиная с какой-то порога по качеству сгенерированного текста такие метрики не смогут улавливать улучшения и нужно будет применять ручную оценку.</p>
  <h2 id="ifZ2">Ручная оценка</h2>
  <p id="EdEG">Ручная оценка проводится экспертами в предметной области или с привлечением асессоров.</p>
  <p id="IVh9">Обычно люди смотря на следующие критерии оценки качества:</p>
  <ul id="aUIQ">
    <li id="gcAm">Осмысленность (coherence) — логичность и связность текста.</li>
    <li id="49ff">Грамматическая правильность — наличие ошибок и соответствие нормам языка.</li>
    <li id="jt2w">Стиль и естественность — насколько текст похож на человеческое письмо.</li>
    <li id="YGg0">Фактическая точность — корректность представленных фактов (актуально для генерации ответов на вопросы и новостных статей).</li>
  </ul>
  <p id="EDez">Схемы оценивания генерации:</p>
  <ul id="mRsX">
    <li id="Xoao">текст &lt;–&gt; бинарная оценка<br />логично такую схему реализовать в том числе прямо в сервисе и собирать фидбэк юзеров через лайк / дизлайк</li>
    <li id="2jhI">текст &lt;–&gt; вещественная оценка<br />или от 1 до 10, например</li>
    <li id="HDI6">side-by-side: winner &gt; loser<br />как между ответами разных моделей, так и между таргетом и предсказанием</li>
  </ul>
  <h2 id="zuYU">Заключение</h2>
  <p id="CDLn">Заранее продумайте иерархию метрик для оценки качества вашей модели.</p>
  <p id="Jl2Q">Автоматизируйте валидацию с использованием bleu/rouge и тд.</p>
  <p id="hXm8">Улучшайте систему оценки с помощью ручных методов.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@abletobetable/explore_alignment</guid><link>https://teletype.in/@abletobetable/explore_alignment?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable</link><comments>https://teletype.in/@abletobetable/explore_alignment?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable#comments</comments><dc:creator>abletobetable</dc:creator><title>Обзор и развитие LLM алаймента: История и современные практики</title><pubDate>Tue, 07 Jan 2025 12:59:37 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/38/14/38149f77-99ae-4a99-9348-0698d62b1b10.png"></media:content><category>Large Language Models</category><description><![CDATA[<img src="https://img2.teletype.in/files/d6/e9/d6e9532b-ce55-4258-8904-069cc10a5fe0.png"></img>Что такое алаймент, как развивался и куда идем]]></description><content:encoded><![CDATA[
  <p id="EITh">Что такое алаймент больших языковых моделей, как развивался и куда идем</p>
  <h1 id="05h1">Что такое alignment больших языковых моделей и зачем он нужен?</h1>
  <p id="TZml">Большие языковые модели становятся все более совершенны, они не только хорошо генерируют текст, но и неплохо справляются с выполнением различных заданий, например, машинный перевод, суммаризация, вопросно-ответные системы, создание контента и другие.</p>
  <p id="qFNH">Однако даже самые продвинутые LLM не всегда ведут себя корректно. Ответы языковых моделей могут не просто не соответствовать ожиданиям пользователей, отвечая нерелевантно или не точно следуя инструкции, но и генерировать неэтичный или небезопасный контент.</p>
  <p id="Mwja">Alignment - это процесс выравнивания намерений большой языковой модели с намерениями человека.</p>
  <p id="yTfp">В общем понимании alignment важен по трем причинам. В английском это правило трех H:</p>
  <ul id="W0Ti">
    <li id="DQR1">Honest</li>
    <li id="FAPE">Helpful</li>
    <li id="QCj1">Harmless</li>
  </ul>
  <p id="gFx4">То есть модель должна быть честной и не пытаться обмануть пользователя. В тоже время была полезной, генерировала ответ строго по инструкции в приятном и удобном для конкретного случая виде, но при этом не распространяла опасную и вредную информацию. На самом деле здесь есть трейд офф между полезностью и безопасностью, потому что у каждого пользователя свои границы того, что считать полезным ответом, а что неэтичным. Задача алаймента минимизировать риски, связанные с использованием больших языковых моделей, при этом улучшив пользовательский опыт.</p>
  <h1 id="bGp0">Роль алаймента в пайплайне обучения LLM.</h1>
  <p id="dZ9R">Обычно пайплайн обучения больших языковых моделей состоит из следующих этапов:</p>
  <ul id="ql4Q">
    <li id="mhhr">Сбор большого корпуса текстовых данных, без какой либо разметки. Дальше предобучение на задачу предсказания следующего токена на этом корпусе.</li>
  </ul>
  <p id="Daox">На этом этапе модель получается очень умной, она знает все о мире, что мы смогли уложить в обучающий корпус, но она по-большому счету бесполезна, так как умеет лишь предсказывать следующий токен, но быть удобной и безопасной она не умеет.</p>
  <ul id="aLJ1">
    <li id="Dhur">Следующий этап это составление датасета инструкций: запрос - ответ, и дообучение претрен модели на нем - SFT, instruction tuning этап.</li>
  </ul>
  <p id="q34B">Здесь мы закладываем в модель навыки выполнения инструкций, она учится понимать, что от нее требуется, какие задачи нужно выполнять, как общаться с пользователем. На этом этапе модель не просто умная, но и существенно более полезная.</p>
  <ul id="sLGa">
    <li id="Gw25">Заключительный этап - это Alignment. Здесь мы закладываем в LLM ценности, которым хотим, чтобы она следовала. Чтобы ее ответ был более естественным и сильнее нравился пользователем.</li>
  </ul>
  <p id="dVoy">На самом деле, в сообществе есть мнение, что 20% усилий и 80% результата достигаются за счет простого SFT, то есть этапа instruction-tuning. А оставшиеся 80% усилий и 20% результата это alignment, потому что поведение модели обычно меняется не так сильно после него, особенно если требования не самые специфичные. В то время, как времени и денег на сбор датасета и проведения экспериментов по дообучению тратится сильно больше, чем на простой instruction tuning.</p>
  <h1 id="hdfO">В каком виде собирать датасет для алаймента?</h1>
  <p id="d5F4">Выбор формата датасета для финальной стадии обучения LLM важный вопрос, от которого зависят трудозатраты при обучении и итоговое качество модели, поэтому сразу о нем проговорим.</p>
  <p id="eCVA">Глобально можно выделить 3 формы датасетов.</p>
  <ol id="o4Ti">
    <li id="nsWA">Инструкция - ответ</li>
  </ol>
  <p id="RpEy">Формат такой же как и для обычного instruction tuning.</p>
  <p id="fxLY">Плюсы:</p>
  <ul id="cwKw">
    <li id="LxP3">легко собирать</li>
    <li id="YDbZ">быстро обучать, много доступных и понятных библиотек и фреймворков</li>
    <li id="LlUT">прогнозируемый результат</li>
  </ul>
  <p id="6mBi">Минусы:</p>
  <ul id="dNed">
    <li id="5qME">качество не самое высокое, потому что модель не знает, какие ответы могли бы быть плохими, а видит только хорошие ответы</li>
  </ul>
  <ol id="d4wO">
    <li id="KCEU">Инструкция - ответ - лейбл (лайк / дизлайк)</li>
  </ol>
  <p id="Vppi">Улучшение предыдущего формата, путем добавления явной информации о том, какие ответы приемлемы, а какие нет.</p>
  <p id="0bpG">Плюсы:</p>
  <ul id="DxTI">
    <li id="c9kA">учитывает фидбек пользователей: какой ответ понравился, а какой нет</li>
  </ul>
  <p id="uoVj">Минусы:</p>
  <ul id="85sP">
    <li id="tYcJ">сложнее найти такую разметку</li>
    <li id="3Gq9">лейблы могут быть шумными</li>
    <li id="ym2d">сложнее обучать без какой-либо гарантии на лучший результат</li>
    <li id="2JGl">не так много инструментов для дообучении на таком датасете</li>
  </ul>
  <ol id="vmXQ">
    <li id="2OZI">Инструкция - winner &gt; loser (проранжированная пара ответов для нее)</li>
  </ol>
  <p id="IcOB">Здесь оба ответа для того же самого промпта, что позволяет показать модели на примере одной инструкции как надо и как не надо отвечать.</p>
  <p id="b6eh">Плюсы:</p>
  <ul id="fPRp">
    <li id="1Kil">явно учитывает предпочтения пользователей</li>
  </ul>
  <p id="zKtW">Минусы:</p>
  <ul id="lf86">
    <li id="u6Z5">собирать такую разметку сложно, в каких-то бизнес кейсах напрямую с прода такой фидбек реальных пользователей не получить</li>
    <li id="We5g">непрогнозируемый результат: может переобучиться или не сойтись. Бывает такое, что модели вставляют странные символы, неправильные окончания, больше галлюцинируют.</li>
    <li id="FcKd">обучать долго и дорого + не так много инструментов, и модели, которые работают с таким форматом, обычно требуют бОльшего кол-ва ГПУ памяти.</li>
  </ul>
  <h1 id="Cfvx">RLHF. OpenAI. PPO</h1>
  <p id="Zz3Y"><a href="https://arxiv.org/abs/2203.02155" target="_blank">Training language models to follow instructions with human feedback</a></p>
  <p id="mCSB">Про формат данных поговорили, теперь давайте пройдемся по ключевым этапам развития алаймента.</p>
  <p id="OVCs">В индустрии большой вклад в развитие технологии алаймента внесли исследователи из OpenAI в работе RLHF. Они предложили не останавливаться на этапе инстракшн тюнинг и продолжить дообучение модели через концепцию обучения с подкреплением для того, чтобы лучше учитывать предпочтения пользователей.</p>
  <ul id="OpNh">
    <li id="XNKE">агент = модель</li>
    <li id="WF3r">среда = промпт</li>
    <li id="k1bv">действие = генерация текста</li>
    <li id="FnJb">награда</li>
  </ul>
  <p id="dgDf">Обучение с подкреплением здесь это обучаемый агент (то есть наша модель) или, как еще говорят, обучаемая политика взаимодействия со средой (то есть генерация текста при условии промпта), которая получает обратную связь от модели наград.</p>
  <figure id="KOnq" class="m_custom">
    <img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcxQjP1Qx8iOBCYmDKsvStfHU4bbUwoYaYTTfi22jYa85mtppzABnwcUAJzacRArHFNrBMc1y1sA38fTBrYory8WQ-xeHujqaW3x43JQSqAVVe4IFmkvbB9w95uykBn_AJWirBY6dtqkAq7vGGo7-ONF2U?key=X021q5oIBMeOZywBHoMmEg" width="896" />
    <figcaption>схема RLHF из статьи</figcaption>
  </figure>
  <p id="OYk0">Видим, что OpenAI не останавливаются на SFT дообучении претрен модели на датасете инструкций. Идут дальше и собирают human feedback - то есть датасет предпочтений, в котором для каждого промпта есть хороший и плохой ответы. На этом датасете, они обучают модель наград, которая должна ранжировать ответы LLM. Потом дообучаем большую языковую модель генерировать такие ответы, которые максимизируют скор из ревард модели.</p>
  <p id="aOvM">Плюсы:</p>
  <ul id="2E2z">
    <li id="afXI">мы корректируем поведение LLM, показывая хорошие и плохие ответы</li>
  </ul>
  <p id="UCTj">Минусы:</p>
  <ol id="o2Eb">
    <li id="f9nj">нужно собирать разметку для обучающей выборки для модели наград, через ассесоров это долго, дорого и сложно итеративно обновлять.</li>
    <li id="pZHT">используем синтетическую награду от внешней модели, которую можно хакнуть, то есть сгенерировать плохой ответ, ревард которого будет очень большим, для этого в обучающий функционал помимо реварда добавляют штраф в виде KL-дивергенции между распределениями вероятностей следующего токена для SFT и обучаемой политик, чтобы итоговая модель не сильно далеко уходила от своей прошлой версии, тем не менее это не всегда помогает избежать переобучения или расхождения модели.</li>
    <li id="MXSV">вычислительно дорого и долго, потому что нужно держать в памяти не только текущую модель, но и предыдущую версию для KL-дивергенции, а также ревард модель.</li>
    <li id="h9jG">потом алгоритм PPO, используемый для обучения с подкреплением, очень чувствителен к гиперпараметрам, и его результаты сложно воспроизводить</li>
  </ol>
  <h1 id="WBkO">Constitutional AI</h1>
  <p id="6fEA"><a href="https://arxiv.org/abs/2212.08073" target="_blank">Constitutional AI: Harmlessness from AI Feedback</a></p>
  <p id="bQ5X">Еще одним шагом в развитии технологии алаймента стал Constitutional AI.</p>
  <p id="NYrp">Исследователи антропик предложили написать свод правил, то есть конституцию для большой языковой модели. Это подробная, полная расписанная система ценностей, которую хотим заложить в поведение модели.</p>
  <figure id="L6A1" class="m_custom">
    <img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXf54sqZw-FC9r5kKzMFnVE_RGD5-seYgbdcMIu8jpEHH-9RG-2IQX5yat5bfMPmfFdjFn1xgeqC3GfBVXqIK403OpmfuOrhLQphAgitqw0eezUOqswZ6qJuIS-Sqah5349NrbR55CXDuNMtZ4RyxveTkN38?key=X021q5oIBMeOZywBHoMmEg" width="960" />
    <figcaption>Схема ConstitutionalAI</figcaption>
  </figure>
  <p id="ZxWQ">Рецепт антропик - это</p>
  <ol id="izj1">
    <li id="BTBd">Находим очень полезную (то есть разговорчивую) модель, обычно ее несложно получить, так как, после небольшого инстракт тюнинг получаются обычно именно такие модели.</li>
    <li id="jP3Z">Генерируем ответы с помощью этой модели на датасете инструкций.</li>
    <li id="pkrv">Показываем конституцию той же самой модели и просим раскритиковать предыдущий ответ по ней</li>
    <li id="zs0n">Просим перегенерировать ответ в соответствии с конституцией и критикой</li>
    <li id="jMOe">Получаем датасет промпт + два ответа: плохой и хороший</li>
    <li id="orsK">Дообучаем исходную модель с помощью алаймента на собранном датасете</li>
  </ol>
  <p id="3uxp">Я думаю, ключевой вклад антропик в том, что они показали, как можно только с помощью конституции и разговорчивой полезной LLM собрать хороший датасет для алаймента.</p>
  <p id="3YgD">Также даже если у вас уже есть датасет или тем более его еще нет, нужно первым делом сформулировать свою конституцию, которой должна следовать большая языковая модель.</p>
  <h1 id="qPBC">DPO</h1>
  <p id="Kiln"><a href="https://arxiv.org/abs/2305.18290" target="_blank">Direct Preference Optimization: Your Language Model is Secretly a Reward Model</a></p>
  <figure id="f0w0" class="m_custom">
    <img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXdzGePUHXujYMogqC76qNmrQH3p0PkMpWLpAPPWsnmEAmSOJLWmh52jQ0YAi-vekmNpxr5vUuVKuZXF3VvMRs6kG0E9IJ1IqcXti-9xL4J1orATBUQfBffM0p2V__AzP4E7B-ocL80ESsboIZB1LRLYu5c?key=X021q5oIBMeOZywBHoMmEg" width="960" />
    <figcaption>Схема DPO из статьи</figcaption>
  </figure>
  <p id="3c5t">Авторы DPO поднимают вопрос о необходимости обучать модель наград на датасете предпочтений, чтобы потом с помощью обучения с подкреплением искать оптимальную политику, максимизирующую эту награду. Они выводят лосс так, что оптимизируемая политика наилучшим образом соответствует датасету предпочтений через функционал для классификации, обучая неявную модель наград, оптимальная политика которой может быть получена в явной форме.</p>
  <p id="km1X">Плюсы:</p>
  <ol id="MF5w">
    <li id="2g5y">Избавились от необходимость дополнительно обучать модель наград и держать ее в памяти при обучении с подкреплением</li>
    <li id="ocOM">Заменили сложные алгоритмы RL на простую максимизацию правдоподобия</li>
  </ol>
  <p id="9Z3K">Минусы:</p>
  <ol id="cFFe">
    <li id="FnGn">По-прежнему нужно держать в памяти исходную политику, полученную до алаймента, чтобы не уходить далеко от нее и не переобучаться</li>
    <li id="ZfMp">DPO все равно не всегда стабильно обучается, может расходиться и переобучаться</li>
  </ol>
  <h1 id="G9Pl">Улучшения DPO</h1>
  <p id="tURL">Чтобы преодолеть недостатки функционала DPO, авторы разных статей придумывали свои улучшения.</p>
  <ul id="5xj1">
    <li id="K08D">Авторы <a href="https://arxiv.org/abs/2309.06657" target="_blank">RSO</a> предлагают использовать hinge лосс поверх negative likelihood из <a href="https://arxiv.org/abs/2305.10425" target="_blank">Slic-hf</a>.</li>
    <li id="0z9n">Авторы <a href="https://arxiv.org/abs/2310.12036" target="_blank">IPO</a> приводят более глубокое понимание математических алгоритмов за DPO и пытаются бороться с переобучением по-своему трансформируя вид функционала.</li>
    <li id="VYAm">Авторы <a href="https://arxiv.org/abs/2401.08417" target="_blank">CPO</a> на примере задачи машинного перевода обобщают лосс DPO и выбивают из LLM еще большее качество.</li>
    <li id="ci3s">Авторы <a href="https://arxiv.org/abs/2402.01306" target="_blank">KTO</a> предлагают новый функционал для обучения на датасете с бинарными предпочтениями: лайк / дизлайк.</li>
  </ul>
  <p id="fCOz">На самом деле улучшений и новых методов по типу DPO очень много, постоянно появляются новые, вот список тех, кто уже доступен для использования в trainer-е hf.</p>
  <h2 id="6eII">Упрощения процедуры алаймента</h2>
  <p id="UUtA">Есть работы, которые направлены на упрощение процедуры алаймента.</p>
  <h3 id="7M8X">ORPO: Odds Ratio Preference Optimization</h3>
  <p id="rR39"><a href="https://arxiv.org/abs/2403.07691" target="_blank">paper</a></p>
  <p id="I2nc">ORPO, набирающая популярность в индустрии, предлагает избавиться от этапа SFT и сразу же дообучать претрен модель на датасете предпочтений, сильно максимизируя вероятность ответа победителя и слабо минимизируя вероятность ответа проигравшего.</p>
  <p id="uOiP">Также в ORPO не нужно хранить в памяти исходную модель.</p>
  <figure id="XZ0z" class="m_custom">
    <img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcCD2Dm9uBROXqSG_5yN-en9XjwpO5Oo8nEWcxezw2IUBGscurcRWKiGeODetg4Yrm-X2AuP0_JSDHW_fZYjw1wzOrZS-EYpx0OvPY6nUoSrjOQdC8Wz7VmOvmNjLPmkvrceof1_FYyzSht11rYHL0m7MGX?key=X021q5oIBMeOZywBHoMmEg" width="960" />
    <figcaption>Схема ORPO</figcaption>
  </figure>
  <h3 id="Z07M">OpenChat: Advancing Open-source Language Models with Mixed-Quality Data</h3>
  <p id="PoU3"><a href="https://arxiv.org/abs/2309.11235" target="_blank">paper</a></p>
  <p id="kTls">Другая очень популярная, сильная открытая языковая модель openchat обучена с помощью C-RLFT алаймента. Он еще более простой в реализации.</p>
  <figure id="oTfu" class="m_custom">
    <img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXf_sagVtQ4pEHOL6GWT7hxhbLZyLFJLjtXoXcv-ueb1dazF0oBbZllTKUoJVkDWoY1Jt_0He3hUZ6lpQsU3aOh45kxv8WU_YwyQAoYJbkZpyu-Zju_afiTedVUjgppJG_B5MAeOzrSKomDDeSH4WVfHz7Qd?key=X021q5oIBMeOZywBHoMmEg" width="1872" />
    <figcaption>Схема OpenChat</figcaption>
  </figure>
  <p id="AxvN">Рецепт следующий:</p>
  <ul id="h7Fq">
    <li id="aTHh">Собираем обычный SFT датасет, но разграничиваем источники, где-то качественные данные, а где-то не всегда хорошие ответы. Пример такого разделение: все ответы gpt3.5 считаем sub-optimal, а все ответы gpt-4 считаем экспертными.</li>
    <li id="4NYm">Дальше просто дообучаем LLM с помощью кросс энтропии, присваивая большие веса в лоссе для экспертных семплов.</li>
  </ul>
  <h3 id="Qv7r">Lima: Less Is More for Alignment</h3>
  <p id="yjpZ"><a href="https://arxiv.org/abs/2305.11206" target="_blank">paper</a></p>
  <p id="1J84">И еще одна статья, которая ставит под сомнение необходимость сложных методов, подчеркивая важность простого SFT дообучения. Авторы предлагают собрать максимально чистый и качественный датасет пусть и небольшой и на нем обучаться в supervised режиме. Таким образом, инвестиция времени и денег на разметку и простое дообучение приносит неплохой результат, а самое главное прогнозируемый.</p>
  <h1 id="GMJ4">Заключение</h1>
  <p id="e18z">На сегодняшний день исследования и разработки в этой области ведутся в совершенно разных направлениях. Компании и лаборатории разрабатывают множество разнообразных подходов, и нет универсального метода, которым бы все пользовались.</p>
  <p id="1uQ1">Некоторые модели и методы направлены на обучение на датасете предпочтений, предлагая свои улучшения и обобщения на новые виды функций потерь. Какие-то подходы углубляются в понимание исходных моделей, данных и оптимизационных функционалов. Другие сосредоточены на освоении новых форматов датасетов. Существуют подходы, упрощающие процедуру алаймента, при которых обучение проводится только в supervised режиме.</p>
  <p id="cLeC">Однако, не стоит забывать, что alignment не ограничивается лишь обучением моделей. Сейчас выходят статьи, направленные на интерпретацию внутренних процессов модели, там авторы пытаются понять, как мыслит модель и как можно влиять на ее поведение через активацию внутренних представлений.</p>
  <p id="g0IJ">Понятное заключение доклада - это то, что алаймент сложная задача, требующая в первую очередь системного подхода. Необходимо четко определить цели и проблемы, сформулировать систему ценностей, которую модель должна разделять, и итеративно усложнять способы обучения, учитывая ваши вычислительные ресурсы, специфичные задачи и данные.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@abletobetable/node2vec</guid><link>https://teletype.in/@abletobetable/node2vec?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable</link><comments>https://teletype.in/@abletobetable/node2vec?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable#comments</comments><dc:creator>abletobetable</dc:creator><title>Обзор Node2vec: Scalable Feature Learning for Networks</title><pubDate>Tue, 07 Jan 2025 12:58:57 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/5d/f4/5df45a23-c88a-4bd6-8c28-0c603371de55.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/7e/d6/7ed6a381-f2c0-4256-bc69-ea669e5751cd.webp"></img>Обзор Node2vec: Scalable Feature Learning for Networks]]></description><content:encoded><![CDATA[
  <p id="mRHp"><a href="https://arxiv.org/abs/1607.00653" target="_blank">Статья</a></p>
  <figure id="8pMj" class="m_retina">
    <img src="https://img4.teletype.in/files/7e/d6/7ed6a381-f2c0-4256-bc69-ea669e5751cd.webp" width="512" />
  </figure>
  <h3 id="Вводные">Вводные</h3>
  <p id="erxb">Цель работы получать эмбеддинги вершин графа.</p>
  <p id="XiSZ">Авторы вдохновлялись SkipGram, поэтому работает по принципу Word2Vec.</p>
  <p id="Nqzl">Разметка не нужна, можем строить эмбеддинги оптимизируя функционал с SGD имея только информацию о связях вершин.</p>
  <figure id="pTOr" class="m_retina" data-caption-align="center">
    <img src="https://lh7-us.googleusercontent.com/QSRAB_JJ0g3rKwDUf13zjgN_HncONxiKawJUZe3ZJYAITgeaJxtraXaYAhhypIcqXyCgXxJHJtA7tjGvPcPikqndhq18krgfYppvaLHpTLENd_0Y0By_TESKXYbh-E_Y-hBAl7D9dh1iWcBSe6Loj8Q" width="407" />
    <figcaption>Shallow node embeddings scheme</figcaption>
  </figure>
  <h3 id="Принцип-работы">Принцип работы</h3>
  <ul id="yciX">
    <li id="9X3Q">Случайно выбираем центральную вершину v из V</li>
    <li id="lwIg">Сэмплируем вершины W</li>
    <li id="Db0Q">Максимизируем правдоподобие соседних вершин W</li>
    <li id="zdAt">Минимизируем правдоподобие несоседних вершин V\W</li>
  </ul>
  <h3 id="Лосс">Лосс</h3>
  <figure id="oFYb" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/26/fa/26fa71c3-721d-4c22-b8d9-79d1c6f1aaa7.png" width="1721" />
    <figcaption>Contrastive loss for node2vec</figcaption>
  </figure>
  <p id="CBuv">Здесь V - все вершины, а W - соседние вершины.</p>
  <h3 id="Как-сэмплируем">Как сэмплируем</h3>
  <p id="qaLd">Генерируем random walk - случайный обход по графу. В результате имеем множестве вершин W, которые считаем соседними вершинами v.</p>
  <p id="gN4p">Есть принципиально 2 разных подхода выбирать вершины: BFS и DFS.</p>
  <figure id="XREb" class="m_original" data-caption-align="center">
    <img src="https://lh7-us.googleusercontent.com/asv4UPg91kyMpNlGJxD6kfC1e4VQpdCaBQFWz7RZ4W9pLLgTj9Nlkb_4R9XCh1xbY0aAZWqdY6oXRGu5pO2SBk9rEJ5MhslraRwQdgVbNCywyx5Mfe0wQbXJX6B57Eq5CEShBtQHBFgMpCrgtbCA73M" width="711" />
    <figcaption>Разница между BFS и DFS</figcaption>
  </figure>
  <p id="iwEJ">Breadth-first Sampling (BFS) - обходим в первую очередь непосредственных соседей центральной вершины.</p>
  <p id="6eA2">Depth-first Sampling (DFS) - обходим вершины с нарастанием длины пути до центральной вершины.</p>
  <h3 id="Интерпретируемость-фичей">Интерпретируемость фичей</h3>
  <p id="kBUW">BFS выучивает структурные признаки вершин графа - то есть улавливает только локальный контекст, например, группирует в один кластер вершины-мосты, в то время как DFS выучивает более глобальные признаки и больше подходит для, например, поиска сообществ в графе.</p>
  <figure id="ha0J" class="m_retina" data-caption-align="center">
    <img src="https://lh7-us.googleusercontent.com/Sn7UBDcYnGYCuCk0raHJyBjSdNo9nbw69HzpatKXin3chwxjBx-0iZrlGQ-yF3OfGyDPGImSwXuleGTsvwAEPO3p1Rt6sXe_cSDybRpUEI4y3bSk4kNp6TAzPH8bBHehlQK9oXLiglkwVSL-s7v-8Es" width="370.5" />
    <figcaption>Визуализация группировки вершин по выученный векторным представлениям разными способами семплирования в random walk</figcaption>
  </figure>
  <p id="rCbN">Авторы предлагают обощить BFS и DFS в один фреймворк, введя в random walk 2 гиперпараметра p и q</p>
  <ul id="7pq0">
    <li id="lOlb">p - параметр, который отвечает за возвращение, то есть перепосетить вершину вновь. Увеличивая p ( &gt; max(q, 1)) мы ближе к DFS, в противном случае BFS.</li>
    <li id="tBZL">q - in-out параметр, чем он меньше, тем более дальние вершины мы будем посещать вероятнее.</li>
  </ul>
  <h3 id="Эксперименты">Эксперименты</h3>
  <p id="yCMA">Обучается все с помощью обычного SGD, берем любой оптимайзер, обучаем с батчами, совместимо с pytorch в современных реализациях, можем учить на GPU.</p>
  <p id="uuHA">Авторы учат фичи вершин, а потом используют их для multi-label классификации и link prediction задачи.</p>
  <p id="Y96W">Качество выше, чем у других работ.</p>
  <figure id="Xvj8" class="m_retina" data-caption-align="center">
    <img src="https://lh7-us.googleusercontent.com/cCMJhw07PbGoUJZoOZfSX2eq_TuH15nCcciPW53KkNOrzh7H1giZ_OWvZyqZvArbplfsVF_zQdzF4ll-328znMlLb-0V9c9nXftJXc-jOIB0wsBWUA6gXcxtctlAShWdA2DcOyQgvm2-cg_jFqGMaWw" width="488" />
    <figcaption>Сравнение по milti-label classification</figcaption>
  </figure>
  <figure id="kjeR" class="m_retina" data-caption-align="center">
    <img src="https://lh7-us.googleusercontent.com/Mvg_zHqPTexI1nFeutqtcPz6GhsFSJn1-KCIqJQRBlHo9NI0AK-fPxVEnGy48fCdSZN47rfhUU1LjLSTlVLKtEzFBygczqN93nWs7HvCPZKJivHWxXau7L60TuTGKY3mzb6PkAMSZSh2CIgyCDrteO0" width="307" />
    <figcaption>Сравнение на link prediction</figcaption>
  </figure>
  <h3 id="Выводы">Выводы</h3>
  <p id="Fupn">Как бейзлайн можно брать спектральную кластеризацию, но node2vec классно работает, масштабируется, поддерживает батч обучение на GPU.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@abletobetable/rag_techniques</guid><link>https://teletype.in/@abletobetable/rag_techniques?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable</link><comments>https://teletype.in/@abletobetable/rag_techniques?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=abletobetable#comments</comments><dc:creator>abletobetable</dc:creator><title>Обзор техник RAG: Retrieval Augmented Generation</title><pubDate>Thu, 12 Dec 2024 10:55:53 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/04/83/04834d7c-a819-4679-a67a-1be9619d1bce.png"></media:content><category>Large Language Models</category><description><![CDATA[<img src="https://img2.teletype.in/files/d4/b5/d4b5bb2c-7794-4e14-bdae-22ea352a8a25.webp"></img>Рассмотрим техники построения и улучшения RAG систем: от нарезания текстов на куски, до продвинутых способов улучшения качества ответа.]]></description><content:encoded><![CDATA[
  <p id="GNyQ">Рассмотрим техники построения и улучшения RAG систем: от нарезания текстов на куски, до продвинутых способов улучшения качества ответа.</p>
  <p id="p828">Этим блогом можно пользоваться как шпаргалкой для проектирования своего RAG-а и/или для подготовки к собеседованиям.</p>
  <p id="gVHD">Все полезные ссылки и материалы, на которые я опирался будут в конце.</p>
  <h2 id="8hXc">Что такое RAG и зачем нужен</h2>
  <p id="bNS8">RAG - это фреймворк взаимодействия предобученной LLM с базой знаний. То есть при ответе LLM на запрос пользователя модель отвечает используя актуальный контекст из базы и свои pre-trained знания.</p>
  <figure id="rjI3" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXelirWl_lRMNHl36qK_oeLx7C3uLcrxZ2X9DDONuMJDJSjgJreRPswRourl5V4gLp9W0MpouyDGvL284r9QFzCpKdYyK7e6rVgQVngqPOdOvZRulbI_T7awzbnARdyVvSLxQH_V?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1302" />
    <figcaption>RAG framework</figcaption>
  </figure>
  <p id="PYnJ">Обогащение запрос контекстом позволяет модели дать более точный ответ без необходимости дообучения на этих данных.</p>
  <p id="UUu7">RAG очень часто можно использовать для формирования отчетов, создания корпоративных и специализированных чат-ботов. Причем так как не нужно дополнительного дообучения на доменных данных, то использование RAG-а часто более дешевый и быстрый вариант, а также безопасный и интерпретируемый по сравнению с fine-tuning-ом.</p>
  <p id="cirG"><strong>Базовый пайплайн подготовки системы RAG:</strong></p>
  <ul id="xK9P">
    <li id="8oZA">Загрузить документы</li>
    <li id="JZf2">Нарезать на куски</li>
    <li id="M5yD">Построить базу данных</li>
    <li id="buY4">Подготовить ретривер и, возможно, эмбеддер</li>
    <li id="7SsK">Развернуть LLM для инференса</li>
  </ul>
  <p id="fYek"><strong>Базовый пайплайн применения RAG:</strong></p>
  <ul id="qWLk">
    <li id="BFcF">Аутентифицировать пользователя</li>
    <li id="klo3">Обработать входной запрос</li>
    <li id="mZDi">Найти релеватные куски из базы данных</li>
    <li id="69wk">Отранжировать контексты</li>
    <li id="46NF">Собрать промпт из запроса и контекстов</li>
    <li id="HsnJ">Запромптить LLM</li>
    <li id="hONO">Получить от LLM ответ на вопрос</li>
    <li id="Z1ld">Верифицировать и отдать пользователю</li>
  </ul>
  <figure id="njhJ" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd2-ZP4TvM46HDkOT28MAmt-roZl-N41IctIimLiOjX7q2O1sPzUHdaVfFh_hboOi6pm9h-1WW_vmKeKY2cYPpE0YdBnZfKi0FAwZMo_oXEXT6ohIAl0ckGwFg8BhFYhO9S6KQEnQ?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1600" />
    <figcaption>Базовый пайплайн использования RAG системы</figcaption>
  </figure>
  <p id="Vawg"><strong>Метрики RAG-а:</strong></p>
  <ul id="zxAb">
    <li id="vNHU">Приверженность - то, как сильно ответ похож на контекст, поданный в модель. Чем ниже метрика, тем выше вероятность галлюцинаций.</li>
    <li id="UlMR">Полнота - то, насколько полный ответ для заданного вопроса и предоставленного контекста.</li>
    <li id="kZ5l">Учёт контекстов - то, какая доля контекстов использовалась при ответе.</li>
    <li id="0VP5">Утилизация контекстов - то, какую долю контекста модель использовала при ответе на вопрос.</li>
    <li id="YrGo">токсичность ответа</li>
    <li id="8ppo">тональность ответа - например, по категориям эмоций</li>
  </ul>
  <p id="1CjC"><a href="https://www.galileo.ai/blog/mastering-rag-improve-performance-with-4-powerful-metrics" target="_blank">https://www.galileo.ai/blog/mastering-rag-improve-performance-with-4-powerful-metrics</a> - больше про метрики можно почитать тут</p>
  <h2 id="VT4K">Загрузка документов</h2>
  <p id="7QVl">Это первый этап построения RAG системы.</p>
  <figure id="I0Zu" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXddelIEyHDaZRrWIhFX2n90mnXhdcrM4weFWO4yEBEuPUefid4W-Mkj66OhEyyJau8MyGx_0NQi-yane5ZbVPUNsFtVOqPHkOsMSwTsgPxkhCmyAgGyxxTGZblPFtOXAroTe051UQ?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1600" />
    <figcaption>Еще одна схема, как выглядит RAG, если забыли</figcaption>
  </figure>
  <p id="kE00">Для своей базы знаний можно использовать разные источники: видео на ютубе, конспекты ноушен, эксель таблицы и др.</p>
  <p id="3kC2">Если в документе есть таблицы, или картинки, то из них можно извлечь полезную информацию в том числе - воспользоваться OCR и / или TableTransformer.</p>
  <p id="ER9a">Библиотека, которая сама все делает за вас: <a href="https://unstructured-io.github.io/unstructured/introduction.html" target="_blank">https://unstructured-io.github.io/unstructured/introduction.html</a></p>
  <p id="DCoB">Также важно помнить, что у каждого документа есть метаданные: название, дата, автор и др.</p>
  <h2 id="aeiX">Нарезка документов</h2>
  <p id="vPyh"><a href="https://www.galileo.ai/blog/mastering-rag-advanced-chunking-techniques-for-llm-applications" target="_blank">Mastering RAG: Advanced Chunking Techniques for LLM Applications</a></p>
  <p id="apBo"><a href="https://learn.deeplearning.ai/courses/langchain-chat-with-your-data/lesson/3/document-splitting" target="_blank">Урок по разделению с помощью LangChain</a></p>
  <p id="C2c7">Нарезка документов на куски нужна для того, чтобы не переполнять контекст LLM ненужной и шумной информацией, а максимально информативной - это нужно как для более точного ответа, так и для ускорения работы LLM.</p>
  <p id="tWQH"><strong>На что влияет нарезка на куски:</strong></p>
  <ul id="oBTF">
    <li id="Eb02">качество контекстов, которые отдаем LLM<br />Чем меньше контекст, тем меньше там информации, которая может сбить с толку LLM, а также тем легче правильнее определить семантический смысл эмбеддеру при создании вектора представления</li>
    <li id="LOkz">затраты на индекс кусков<br />Чем больше кусков, тем выше затраты, так как нужно хранить больше векторов</li>
    <li id="vlE3">Скорость извлечения релевантных кусков из индекса<br />Чем больше кусков, тем дольше задержка</li>
    <li id="5mQF">Скорость ответа LLM<br />Чем длиннее контекст, подаваемый в LLM, тем дольше она будет отвечать</li>
  </ul>
  <p id="0OXM"><strong>Факторы, влияющие на разделения документа на куски:</strong></p>
  <ul id="jrW3">
    <li id="GRy8">Структура текста<br />пунктуация, переносы строки, маркдаун верстка и др.</li>
    <li id="1nCY">Контекстное окно LLM и эмбеддера</li>
    <li id="FYDG">Сложность и специфика запросов</li>
  </ul>
  <p id="Zq2o"><strong>Параметра функции разделения документа на куски:</strong></p>
  <ul id="aVwu">
    <li id="isEe">размер куска по символам или по токенам</li>
    <li id="4cJo">размер пересечения (наложения) кусков</li>
    <li id="lNDF">желаемый разделитель</li>
  </ul>
  <figure id="C0oN" class="m_column">
    <img src="https://img3.teletype.in/files/2e/59/2e597635-105e-4aa4-916a-b86e196b15b7.png" width="1600" />
    <figcaption>Cunking techniques</figcaption>
  </figure>
  <p id="z6tr"><strong>Виды нарезок:</strong></p>
  <ul id="Kq9t">
    <li id="Ny2a">По символам / токенам без специфичного разделителя<br />Разделяем документ согласно длины контекста и размере пересечения.<br />Работает быстро, но глупо.</li>
    <li id="4Wdz">По символам / токенам с желаемыми разделителями<br />Пытаемся разделять на куски, например, по переносу строки, по точке или хотя бы по пробелу. Но все равно есть ограничение на длину контекста и длину наложения.<br />Чуть дольше, но намного умнее, потому что не обрывает слова или даже предложения.</li>
    <li id="03bP">По Маркдаун разметке<br />Примерно как предыдущий метод, только разделитель заголовки маркдауна<br />Получается более структурированное разделение, а также обновляет метадату кусков - добавляет поле названия.</li>
    <li id="8jwx">Семантически<br />Разделяем текст на предложения.<br />Добавляем в кусок текста новое предложение, если оно похоже семантически на уже имеющийся кусок.<br />Ограничиваем количество предложений в куске.<br />Разделение довольно умное, но расчет более ресурсоемкий из-за модели схожести.</li>
    <li id="mdsL">Переписываем текст как утверждение<br />С помощью специальной модели или через LLM переписываем исходные предложения так, чтобы каждой из них по отдельности имело смысл, было понятно, о чем идет речь и не могло больше разделится на более мелкое утверждение.<br />Потенциально очень умное разделение, которое сразу же помогает отвечать на вопрос. Но есть вероятность испортить хороший текст, а также требует дополнительных ресурсов на обработку документов.</li>
  </ul>
  <figure id="cL6D" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc2owg3Aqlhs2JI-hKyIqxCmZ7yRqRklih-lDqpBjKn07KTf1X1c9jT3pK_L_QWyImXz9-9t0tcfPixvgMVPJECs67s0G1BmltFSmgJ-dzU2ja9BDMa2-PCXbzOyqNNKFIfmMfmaw?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1600" />
    <figcaption>Proposition chuncking</figcaption>
  </figure>
  <ul id="qQom">
    <li id="15Kq">Мульти-векторная индексация<br />Иногда полезно для каждого документа иметь несколько векторов представления.<br />Например, поделить документ на куски и для каждого посчитать векторы, делать ретрив по векторам кусков, а возвращать сам документ, таким образом уменьшается влияние шума и разнообразие топиков в документе.<br />Также можно заменить или добавить к вектору документа вектор представление суммаризации этого документа.<br />Также частая практика это придумывать гипотетические вопросы, ответом на которые может быть документ, и складывать в индекс вектор представления этих вопросов.<br /><a href="https://python.langchain.com/docs/how_to/multi_vector/" target="_blank">https://python.langchain.com/docs/how_to/multi_vector/</a></li>
  </ul>
  <p id="UE6J">Кстати, метадата документа должна наследоваться каждому его куску, а также иногда дополняться свойствами отдельного куска, например, заголовок маркдаун при соответствующем методе разделения.</p>
  <p id="Jf0h"><strong>Метрики оценки качества</strong>, на которые можно ориентироваться при выборе стратегии разбиения документов на куски:</p>
  <ul id="XUHH">
    <li id="bna8">Приверженность - то, как сильно ответ похож на контекст, поданный в модель. Чем ниже метрика, тем выше вероятность галлюцинаций.</li>
    <li id="cULn">Полнота - то, насколько полный ответ для заданного вопроса и предоставленного контекста.</li>
    <li id="wQ3h">Учёт контекстов - то, какая доля контекстов использовалась при ответе.</li>
    <li id="Slr9">Утилизация контекстов - то, какую долю контекста модель использовала при ответе на вопрос.</li>
  </ul>
  <p id="DRhY"><a href="https://www.galileo.ai/blog/mastering-rag-improve-performance-with-4-powerful-metrics" target="_blank">https://www.galileo.ai/blog/mastering-rag-improve-performance-with-4-powerful-metrics</a> - больше про метрики можно почитать тут</p>
  <p id="aLvT"><strong>Как подбирать параметры для нарезки на куски:</strong></p>
  <figure id="Dizo" class="m_custom">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfSqxAac2hRg8y4eFbHoazIPcc21d9qWKDM6wWru3_tJOOWmqRitdLDIxiMwnOD0SZRDs7Yui5NVBUDeRHnrb5in-GKlkRZq60pYIgqdq6YP5Ez-3E0l0ipL9y4EqgHJP6vGR8v?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="659" />
    <figcaption>RAG metrics ops</figcaption>
  </figure>
  <h2 id="vbSA">База данных</h2>
  <p id="YhGv">База данных это система, которая хранит, индексирует и позволяет обрабатывать запросы для неструктурированных данных, таких как текст, изображения и подобное через числовое представление в виде вектора.</p>
  <p id="6eNJ">С помощью таких векторов можно делать поиск похожих объектов в базе данных. В нашем случае обычно поиск похожих кусков текста на пользовательский запрос.</p>
  <p id="x5Qo"><strong>Ключевые факторы выбора базы данных:</strong></p>
  <ul id="kq53">
    <li id="lQct">Открытая ли база или закрытая</li>
    <li id="9kZL">Язык программирования, на котором можно создать клиента для использования базы данных</li>
    <li id="Z8it">Лицензия</li>
    <li id="iorj">Фичи для организаций:</li>
    <ul id="khFp">
      <li id="rZCQ">лимиты</li>
      <li id="Lxd2">пользовательская аутентификация</li>
      <li id="NyV8">многое другое</li>
    </ul>
    <li id="GH4J">Продуктовые фичи:</li>
    <ul id="MEYJ">
      <li id="CHnG">точный поиск</li>
      <li id="W5Qk">приближенный поиск - когда можно пожертвовать качеством для ускорения и масштабирования</li>
      <li id="1dTB">префильтрация - когда до векторного поиска нужно уменьшить количество кандидатов</li>
      <li id="jnLj">постфильтрация - дополнительный фильтр для улучшения точности результатов</li>
      <li id="U5gL">гибридный поиск</li>
      <li id="BYCB">поддержка разреженных векторов</li>
      <li id="IOTb">поддержка поиска напрямую по тексту, например, через bm25</li>
    </ul>
    <li id="anuz">Возможность инференса моделей эмбеддингов.<br />Например, sentence transformers, Mixedbread, BGE, OpenAI.</li>
    <li id="6eOW">Возможность инференса модели реранкера</li>
    <li id="ijni">Скорость добавление новых объектов</li>
    <li id="2ymN">Скорость поиска</li>
    <ul id="OZVj">
      <li id="I0Yc">индексация</li>
      <li id="g63o">кэширование</li>
      <li id="mh91">другие оптимизации</li>
    </ul>
    <li id="htdb">Затраты на обслуживание</li>
    <ul id="74w9">
      <li id="9DrI">disk-based базы данных VS in-memory</li>
      <li id="l35j">Serverless базы данных</li>
      <li id="3rBO">квантизация эмбеддингов</li>
    </ul>
    <li id="R5LR">Поддержка, мониторинг, бэкапы и тд</li>
  </ul>
  <h2 id="W9zg">Выбор эмбеддера</h2>
  <p id="zjeG">Эмбеддинг - это векторное представление текста (или картинки, звука и тд) в пространстве, в котором похожие тексты отображаются в похожие векторы.</p>
  <figure id="FabG" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfTPaas_RL7QchssXrUcqa9i3AXwKesIR60gQgu5auo9xb6wYUwSbOCRKlM3vodh2Ezn1rayqbeuG27lMHnEeLTSLdTmQjmfngQoMDbhYdp0wepCVAcJFxEE_g96aj0P5KmikUoDA?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="928" />
    <figcaption>Что такое эмбеддинги</figcaption>
  </figure>
  <p id="W2v8"><strong>Как можно использовать эмбеддинги:</strong></p>
  <ul id="TlOU">
    <li id="Q3hu">кодировать вопросы и контексты эмбеддером, чтобы для вопроса находить самые релевантные куски информации</li>
    <li id="NC9R">находить few-shot примеры для in context learning (ICL)</li>
    <li id="uPrS">определять намерения пользователя, чтобы, например провести по какой-нибудь ветке заготовленного сценария общения, или вызвать какой-нибудь инструмент</li>
  </ul>
  <p id="Flak"><strong>На что смотреть при выборе эмбеддера:</strong></p>
  <ul id="YfNP">
    <li id="lavj">размерность векторного пространства</li>
    <li id="OU3s">размер модели</li>
    <li id="jeeG">перфоманс модели на доменных или общих бенчмарках</li>
    <li id="PKsB">открытая или закрытая модель</li>
    <li id="DnOq">стоимость</li>
    <li id="jtgM">поддержка языков</li>
    <li id="RFIg">гранулярность: на уровне слов, предложений, длинных документов</li>
  </ul>
  <p id="hb27"><strong>Виды эмбеддингов:</strong></p>
  <ul id="1kRg">
    <li id="rmyA">dense векторы<br />классика</li>
    <li id="sqg3">разряженные<br />Извлекают из текста только самую релевантную информацию, а в других размерностях значения просто 0.<br />Часто используется в задачах со специфической терминологией.<br />Работает примерно как bag-of-words, но обходит многие его недостатки.<br /><a href="https://arxiv.org/abs/2109.10086" target="_blank">https://arxiv.org/abs/2109.10086</a></li>
    <li id="MxVd">матрешка эмбеддинги<br />Позволяют выбирать размерность вектора на инференсе.<br />можно почитать тут лонгрид про них: <a href="https://teletype.in/@abletobetable/embeds_ops" target="_blank">https://teletype.in/@abletobetable/embeds_ops</a></li>
  </ul>
  <figure id="te0D" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc69hEXaev1UdgKHmiqtIhkGqJxaIDESL0vUfZSswF5bFiPbsNqMqq52PTPX5YF_Mhjk_VVgpbL7qphr0GQGSCEFtTqmR8TzIgqm05Gz2BUby49M6LWnKwfpbTXJGF4TMbaAv1U?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1600" />
    <figcaption>Матрешка эмбеддинги</figcaption>
  </figure>
  <ul id="UJLx">
    <li id="Sxob">long-context эмбеддинги<br />Если мы можем эффективно и без потери качества кодировать более длинные куски текста, то будем уменьшать задержку при поиске и косты на хранение векторов, так как их будет меньше.</li>
    <li id="Oghi">code эмбеддинги<br />специально натренированные модели для работы с кодом</li>
  </ul>
  <p id="Rbnc"><strong>Примеры как, на каких задачах измерить качество эмбеддингов:</strong></p>
  <figure id="HiTJ" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfVvUXzRfzhs1XC6WUf7Ts_L0bDlLGAVJ2KiTiWkLQRSkxpirfrfi46P_KOOOezdR8AcetXIVjiIhcdIUxFFEAfheYwyYqRRjq0ab0EEe2-EuBItNRGhx3mTa-t-Ts_BFODdXc8Dg?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1600" />
    <figcaption>Embedding benchmark</figcaption>
  </figure>
  <p id="X283"><strong>Метрики рага, которые подходят и для метрик эмбеддера:</strong></p>
  <ul id="S2Cz">
    <li id="ljbb">Приверженность - то, как сильно ответ похож на контекст, поданный в модель. Чем ниже метрика, тем выше вероятность галлюцинаций.</li>
    <li id="fXhJ">Полнота - то, насколько полный ответ для заданного вопроса и предоставленного контекста.</li>
    <li id="XfHb">Учёт контекстов - то, какая доля контекстов использовалась при ответе.</li>
    <li id="m9tM">Утилизация контекстов - то, какую долю контекста модель использовала при ответе на вопрос.</li>
  </ul>
  <p id="Q8jX"><a href="https://www.galileo.ai/blog/mastering-rag-improve-performance-with-4-powerful-metrics" target="_blank">https://www.galileo.ai/blog/mastering-rag-improve-performance-with-4-powerful-metrics</a> - больше про метрики можно почитать тут</p>
  <h2 id="y98i">Извлечение, поиск</h2>
  <p id="SdGQ">Поиск - это процесс извлечения максимально релевантных кусков текста из базы данных, в которых потенциально находится информация необходимая для ответа на вопрос пользователя.</p>
  <figure id="Xlt5" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdP4s6iGf_pogr1P3TVp9YPVOYm1Q2AgMAuOy9XtVU2OTLx2NQzOY80f5au8yF9c85GsV7FNYHLV9KBxj7TY3ynOREyL1lcESL2usqIX2ORSGBGRC1RShxE-rkYtaiMMUl6sNEvpg?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1600" />
    <figcaption>Retrieve scheme</figcaption>
  </figure>
  <p id="9HPC">С одной стороны мы хотим найти как можно больше полезных кусков и предоставить максимально полную картину для LLM, поэтому мы хотим находить не только самые релевантные контексты, но и максимально разнообразные.</p>
  <p id="mON8">Но с другой стороны, чем больше текста вы извлекаем, тем более они зашумленные, менее релевантные, тем самым LLM будет проще галлюцинировать, поэтому важность этапа поиска нельзя недооценивать.</p>
  <p id="MNHk"><strong>Техники для улучшения извлечения:</strong></p>
  <ul id="CuoI">
    <li id="ccMJ">Hypothetical document embeddings (HyDE) <a href="https://arxiv.org/abs/2212.10496" target="_blank">https://arxiv.org/abs/2212.10496</a> <br />На вопрос пользователя генерируем с помощью LLM такой текст, в котором гипотетически мог бы содержаться ответ на вопрос.<br />Такой документ будет недостоверным в большинстве случаев, но зато текстовый энкодер сможет построить очень близкий эмбеддинг для реального контекста.</li>
    <li id="wDzl">Maximal Marginal Relevance (MMR)<br />Техника для увеличения разнообразия в найденном множестве контекстов. То есть мы скорее отдадим предпочтение менее релевантному контексту, но еще незнакомому.</li>
  </ul>
  <figure id="btNf" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXd9Fk_VhXvsyD9XDybuT13lVOOMYpMLfvCeK20YUZmNdphyqlGk9PMcCrMhDapakKYtaTvFtXBm-1DyoOCTOtWazvbHChlW5YO8kDaqkn4ixptR8PzaoEAdMnEdJdcRaWfRTkOk?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1600" />
    <figcaption>MRR scheme</figcaption>
  </figure>
  <ul id="jRCm">
    <li id="doDy">Autocut<br />Смотрим на скоры похожести контекста и определяем так называемые “прыжки” в них, находя самую оптимальную границу между релевантными и менее релевантными контекстами. <a href="https://weaviate.io/developers/weaviate/api/graphql/additional-operators#autocut" target="_blank">https://weaviate.io/developers/weaviate/api/graphql/additional-operators#autocut</a></li>
    <li id="W7a5">Recursive retrieval<br />Нарезаем контекст на более мелкие куски, ищем релевантный, но отдаем более крупный контекст.<br /><a href="https://youtu.be/TRjq7t2Ms5I?si=D0z5sHKW4SMqMgSG&t=742" target="_blank">https://youtu.be/TRjq7t2Ms5I?si=D0z5sHKW4SMqMgSG&amp;t=742</a> <br /><a href="https://docs.llamaindex.ai/en/stable/examples/query_engine/pdf_tables/recursive_retriever.html" target="_blank">https://docs.llamaindex.ai/en/stable/examples/query_engine/pdf_tables/recursive_retriever.html</a> <br />Похожая техника Sentence window retrieval, где мы возвращаем не кусок, а окно, которое включает наш кусок текста<br /><a href="https://docs.llamaindex.ai/en/latest/examples/node_postprocessor/MetadataReplacementDemo.html" target="_blank">https://docs.llamaindex.ai/en/latest/examples/node_postprocessor/MetadataReplacementDemo.html</a></li>
  </ul>
  <figure id="HqGC" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXf8ZD6MVqcPEY4y1dPO_dj8hPAUGfxAdaQWkTTL1HAZlsQaOZHiax_3VvCjucY8jUjJ-szvGp3_DvnakUsXAEdYUExG5_XpqWKF5RWOW4wy1r3OlovXxrePS3l2IYcQw0DuY86G?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1600" />
    <figcaption>Recursive retriever scheme</figcaption>
  </figure>
  <ul id="qjpu">
    <li id="eagu">SelfQuery<br />Техника для таких вопросов, где полезно будет сделать фильтрацию по какому-нибудь атрибуту, например, по дате.</li>
  </ul>
  <figure id="LETV" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXczojelzify_s6Ke9Ff25cxXGQjXQmBwRxtV2k-SdusXPw41fVyEuXqPsR73PpaBV0-j4eT4xS1NxnIPbZU9iuEDJPA83kZWr04fPGSUuxPEPQa2-U1S0ZFK4cUdWVb5cy5BplsBQ?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1396" />
    <figcaption>Self query scheme</figcaption>
  </figure>
  <ul id="V2vm">
    <li id="tMXx">Сжатие контекстов<br />После извлечения самый релевантных контекстов, мы их суммаризируем при условии вопроса юзера с помощью LLM. Таким образом финальная LLM получает на вход более плотную информацию, с минимумом  шума, но, скорее всего, довольно полную. Хотя тут мы делаем дополнительные вызовы суммаризатора.</li>
  </ul>
  <figure id="XU6B" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcJGr_V2X0vcLlW2ljWWbtNEx4ysQDQxDaY85S9eNXEIJnlWqpLa6A8eOooevxwZxitXEGblHzydE28hua_hHDb5dE0dxFcGJzZ463t4Uyad2Hm-_DShyfl2RJxliFkI157yMOg?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1308" />
    <figcaption>Compresion scheme</figcaption>
  </figure>
  <ul id="jSLG">
    <li id="RUHs">Классический методы поиска</li>
    <ul id="hYAs">
      <li id="INIi">svm</li>
      <li id="mRR5">tf-idf</li>
      <li id="nsAR">и другие</li>
    </ul>
  </ul>
  <p id="w361">Работают напрямую с текстом.</p>
  <p id="tgZ6"><a href="https://learn.deeplearning.ai/courses/langchain-chat-with-your-data/lesson/5/retrieval" target="_blank">https://learn.deeplearning.ai/courses/langchain-chat-with-your-data/lesson/5/retrieval</a> - урок по извлечению от LangChain</p>
  <h2 id="6tOY">Question Answering / generation</h2>
  <p id="ZtP0">На этапе генерации мы отдаем релевантные контексты вместе с вопросом пользователя в LLM, а от нее уже получаем ответ. Это центральный элемент RAG системы, поэтому тут также нужно аккуратно рассмотреть следующие пункты:</p>
  <ul id="g5Sh">
    <li id="v2Xu">Выбор LLM<br />При выборе LLM стоит опираться на то, на каких данных и задачах была обучена модель, с какими языками она хорошо работает. Желательно проверить несколько моделей самостоятельно перед выкаткой, также можно опираться на результаты бенчмарков.</li>
    <li id="ugYT">Open-source или проприетарная модель<br />С одной стороны использование закрытых апи упрощает разработку системы, но с другой стороны возникает вопрос конфиденциальности данных, а также зависимости от внешней апи.</li>
    <li id="a3Ae">Размер модели<br />При большем размере растет качество, но растет задержка и падает пропускная способность.</li>
    <li id="MfgM">Параметры генерации<br />Такие параметры как температура, top p, top k, могу сильно влиять на ответы моделей, их креативность и разнообразие.</li>
    <li id="q1Ef">Способ инференса<br />Этот вопрос может отпасть, если мы будем использовать закрытые апи, но в случае с моделями, которые мы сами хотим разворачивать и поддерживать, этот вопрос является очень существенным.<br />Так как разные фреймворки инференса поддерживают разные модели, способы оптимизации и ускорения инференса.<br />Основные решения: tensorrt-llm, vllm, tgi, deepspeed-mii.</li>
  </ul>
  <p id="9cEL">Отдельно затронем техники промпт-инжиниринга для улучшения ответов LLM. Они могут помочь сделать ответ информативнее, более персонализированным для юзера, а также уменьшить вероятность галлюцинаций.</p>
  <figure id="DYwM" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeC63_nPJhRNW1mV8d4ys1wUOJ1RB6HbrWTHABiEeg0qzfSsYV3Ib_I0o0wQzmwYI5r67oHDVecxeCm5bdMwzyAl0X0hjk9I27NkVpjq2mVULweeLMYtolUrnrbzD6OV8kCkfycDA?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1600" />
    <figcaption>Prompt engineering techniques</figcaption>
  </figure>
  <ul id="Cmoc">
    <li id="Jv6k">Few-shot prompting<br />Показываем несколько примеров, как могут выглядеть ответы.<br />Можно улучшить выбор этих нескольких примеров через поиск ближайших соседей.</li>
    <li id="6k77">Chain-Of-Thoughts<br />Заставлять LLM генерировать цепочку мыслей и только после размышления давать финальный ответ: “Take a deep breath and let’s think step by step”.</li>
    <li id="rMvE">Map reduce<br />делаем суммаризацию каждого контекста, и только потом по всем суммаризациям генерируем ответ на вопрос.</li>
    <li id="Seo1">Map refine<br />Начинаем с 1го контекста, отвечаем на вопрос по нему, затем обновляем ответ с учетом 2го контекста и так далее.</li>
    <li id="KE0i">Thread of Thought<br />Разбиваем длинные куски текста на контексты, модель извлекает из них релевантную информацию, затем просим модель суммаризировать и проанализировать информацию, а не просто прочитать и понять.</li>
  </ul>
  <figure id="zaZE" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc5MZ9UgpuKNv_wuhLmG7aE42Vj3HaPZtk7dgFqmsJwbtGEJUBO5MQFFok1SeEK4PKzS6du9FGBQJSR9txa31m4oEiWXxCJb3NgKsENrpkPmqLUHG7BekoJ10J8Tom2JdWJxX8h?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1346" />
    <figcaption>ToT scheme</figcaption>
  </figure>
  <ul id="AycL">
    <li id="qocr">Chain of Note<br />Примерно то же самое, что и ToT, но здесь для каждого извлеченного куска текста генерируем суммаризацию и оцениваем его релевантность касательно вопроса. И уже на основании таких заметок отвечаем.</li>
  </ul>
  <figure id="c0Cf" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfdU-G2l7WzALt9781KnWEW3q96Cb0umOzlVKJ6OT3ETEagwvju-GJXEdDVih3oLWewqLLBubQmUxgWAyGqucSUiT_hKGWz2KPzvGk3Wc9Tv7RIfjNis3q8OTp1sbPCx6oGvHKUaQ?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1226" />
    <figcaption>CoN</figcaption>
  </figure>
  <ul id="x71X">
    <li id="dZ4S">Chain of Verification(CoVe)<br />На запрос генеририруем бейзлайн, далее подбираем проверочные вопросы, отвечаем на них и редактируем ответ.</li>
  </ul>
  <figure id="hdz7" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXe4LmTHoYq8dX1aScEzXvwspbwYjNQx3yAJrC5Q3mHrlnJF6-tBJcj8uhg9LgN8vWc1P-QSpORqPyL5g5LMon6FzICyOhZXc6ZZxhYomfg4RAmNpooF2PF29dt_PhqLaQy2uVDd5A?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1108" />
    <figcaption>CoVe</figcaption>
  </figure>
  <ul id="caCz">
    <li id="Nkrd">Эмоциональное давление<br />Удивительно, но работает все: представь, что ты эксперт, я дам тебе 200 долларов за правильный ответ и др.)</li>
  </ul>
  <figure id="3fbR" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdWq-Gd69C7Fwwc8K-FfuwG3jM6ISR9Q3ceeBqlYxFx_UxNCfU2ppMKYkdXhC2qQC4NighzYGtiM2zSdXatITcKqBpaW6CIlTh9Tt4AyK8aRwkOweNd0W9JpKA4NJAxIJrQKexLkg?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="914" />
    <figcaption>Emotion prompt</figcaption>
  </figure>
  <p id="qmQH">Также для того, чтобы еще минимизировать риски галлюцинаций, можно ответ LLM проверять дополнительно на безопасность/адекватность той же LLM, или другими специализированными моделями, или просто регулярными выражениями.</p>
  <h2 id="E1qo">Chat, user experience</h2>
  <p id="fdVw">Также для некоторых бизнес кейсов важно уметь помнить то, о чем шла речь в предыдущих сообщениях.</p>
  <p id="DIVg">Это можно сделать, сохраняя предыдущие вопросы и ответы на них.</p>
  <ul id="c2Uv">
    <li id="U64z">Можно переписывать вопрос с учетом истории, чтобы поиск релевантных контекстов работал корректно.</li>
    <li id="EtMM">Можно вместе с вопросом и релевантным контекстом также предоставить доступ LLM к истории чата.</li>
    <li id="xMhH">Если чат разрастается, его можно суммаризировать: либо просто извлечь самое главное, либо суммаризировать при условии текущего вопроса, чтобы точно не потерять ничего важного из истории.</li>
  </ul>
  <p id="9HmU">Так как RAG это в общение с пользователем, то для дальнейших улучшений, можно в сервис внедрить логику сбора обратной связи: через лайки/дизлайки или открытых форм.</p>
  <p id="E4OI">В том числе для большей прозрачности работы сервиса можно давать пользователю доступ к извлеченным контекстам и цепочкам мыслей модели.</p>
  <p id="ixVz">А для ускорения работы модели, можно делать кэширование и не нагружать модели по несколько раз.</p>
  <p id="pVjM">А также использовать техники оптимизации инференса как эмбеддинг модели (например, вот лонгрид: <a href="https://teletype.in/@abletobetable/embeds_ops" target="_blank">https://teletype.in/@abletobetable/embeds_ops</a> ), так и LLM (начиная от continuous batching до speculative decoding).</p>
  <h2 id="GQzX">Заключение</h2>
  <p id="CPU6">Заключения не будет, я устал. Просто красивые схемы из <a href="https://arxiv.org/abs/2312.10997" target="_blank">статьи</a>.</p>
  <figure id="s1iN" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXflrQBSVJqp8DezYr3p1zXcbSxB4HIkPGmpHAO3mjIdGkhDetm06ntnEW8yTswl8RHcJbbnp_zFqcokPiw6a2xu0_KxMrLNwiVIFxP1RNTh7YJr2b7HTT8dC2-o7w9-_CqyLHDYwg?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1522" />
    <figcaption>RAG ecosystem summary</figcaption>
  </figure>
  <figure id="DVER" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfQLAoBnkYrGS2bzT4OCKKK1ptz725ThtzkSQcc2CTFD4BjB97uOdp_ShTFzdE7kzYzC8LE-VSJHQKMIB7-KnEnC9KddMd2pUaGKciaYIrgyMqyfon6Psx1RxODm3G1stRhUAj5Hw?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1600" />
    <figcaption>Улучшение RAG</figcaption>
  </figure>
  <figure id="WDhA" class="m_column">
    <img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdFG5P6bHKkFmESI7n8yUJ1QZyu94Tdf3xeKQPVR0FRvErTZKIXLlM8WNI8GdUtTI7pB-KP6kE9YHlUUaYO8k6K6TGEsmD95CZ82C5ZyjPoRW3H2JA-BVrawKbGtlkT2M5PtihO?key=mCtNvCAgPYsGyC1VqCg9_qwK" width="1510" />
    <figcaption>Добавление доп знаний VS Дополнительное дообучение</figcaption>
  </figure>
  <h2 id="8Sb9">Полезные ссылки</h2>
  <p id="bq9Z">Мои другие лонгриды:</p>
  <p id="lsO7"><a href="https://teletype.in/@abletobetable" target="_blank">https://teletype.in/@abletobetable</a></p>
  <p id="ZpQ8">A Survey on Retrieval-Augmented Generation for Large Language Models:</p>
  <p id="En0t"><a href="https://arxiv.org/abs/2312.10997" target="_blank">https://arxiv.org/abs/2312.10997</a></p>
  <p id="pAAK">HF blogposts:</p>
  <p id="TLLw"><a href="https://huggingface.co/blog/airabbitX/rag-vs-fine-tuning-for-llms-a-com" target="_blank">RAG vs Fine-Tuning for LLMs: A Comprehensive Guide with Examples</a></p>
  <p id="9Vly"><a href="https://huggingface.co/blog/hrishioa/retrieval-augmented-generation-1-basics" target="_blank">Better RAG 1: Advanced Basics</a></p>
  <p id="VaDt"><a href="https://huggingface.co/blog/hrishioa/retrieval-augmented-generation-2-walking" target="_blank">Better RAG 2: Single-shot is not good enough</a></p>
  <p id="RGzM"><a href="https://huggingface.co/blog/hrishioa/retrieval-augmented-generation-3-structure" target="_blank">Better RAG 3: The text is your friend</a></p>
  <p id="1iq9">Mastering RAG series:</p>
  <p id="lZNy"><a href="https://www.galileo.ai/blog/mastering-rag-how-to-architect-an-enterprise-rag-system" target="_blank">How To Architect An Enterprise RAG System</a></p>
  <p id="JXbV"><a href="https://www.galileo.ai/blog/optimizing-llm-performance-rag-vs-finetune-vs-both" target="_blank">RAG Vs Fine-Tuning Vs Both: A Guide For Optimizing LLM Performance</a></p>
  <p id="ydSY"><a href="https://www.galileo.ai/blog/mastering-rag-advanced-chunking-techniques-for-llm-applications" target="_blank">Advanced Chunking Techniques for LLM Applications</a></p>
  <p id="YhSf"><a href="https://www.galileo.ai/blog/mastering-rag-improve-performance-with-4-powerful-metrics" target="_blank">Improve RAG Performance With 4 Powerful RAG Metrics</a></p>
  <p id="KBWt"><a href="https://www.galileo.ai/blog/mastering-rag-llm-prompting-techniques-for-reducing-hallucinations" target="_blank">LLM Prompting Techniques For Reducing Hallucinations</a></p>
  <p id="4bI3"><a href="https://www.galileo.ai/blog/how-to-evaluate-llms-for-rag" target="_blank">How To Evaluate LLMs For RAG</a></p>
  <p id="F4vH"><a href="https://www.galileo.ai/blog/mastering-rag-how-to-select-a-reranking-model" target="_blank">How to Select A Reranking Model</a></p>
  <p id="KD4g"><a href="https://www.galileo.ai/blog/mastering-rag-how-to-select-an-embedding-model" target="_blank">How to Select an Embedding Model</a></p>
  <p id="WM1S"><a href="https://www.galileo.ai/blog/mastering-rag-choosing-the-perfect-vector-database" target="_blank">Choosing the Perfect Vector Database</a></p>
  <p id="TGdv"><a href="https://www.galileo.ai/blog/synthetic-data-rag" target="_blank">Generate Synthetic Data for RAG in Just $10</a></p>
  <p id="ogLv"><a href="https://www.galileo.ai/blog/mastering-rag-8-scenarios-to-test-before-going-to-production" target="_blank">Mastering RAG: 8 Scenarios To Evaluate Before Going To Production</a></p>
  <p id="alkY">DeepLearning.AI courses:</p>
  <p id="43x9"><a href="https://www.deeplearning.ai/short-courses/langchain-chat-with-your-data/" target="_blank">LangChain: Chat with Your Data</a></p>

]]></content:encoded></item></channel></rss>