<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
    <title>Notes &amp; Insights - reinforcement-learning</title>
    <subtitle>Блог об архитектуре систем, AI-агентах, распределенных системах и алгоритмическом трейдинге.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://xsa-dev.github.io/tags/reinforcement-learning/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://xsa-dev.github.io"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-10-07T00:00:00+00:00</updated>
    <id>https://xsa-dev.github.io/tags/reinforcement-learning/atom.xml</id>
    <entry xml:lang="ru">
        <title>Reinforcement Learning в алготрейдинге: архитектура памяти состояний, Q-learning и стационарные признаки</title>
        <published>2026-10-07T00:00:00+00:00</published>
        <updated>2026-10-07T00:00:00+00:00</updated>
        
        <author>
          <name>Alexei Savin</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://xsa-dev.github.io/posts/rl-algo-trading-state-memory/"/>
        <id>https://xsa-dev.github.io/posts/rl-algo-trading-state-memory/</id>
        
        <content type="html" xml:base="https://xsa-dev.github.io/posts/rl-algo-trading-state-memory/">&lt;p&gt;Большинство попыток применить классическое машинное обучение (Supervised Learning) к финансовым рынкам разбиваются об одну фундаментальную проблему — &lt;strong&gt;нестационарность временных рядов&lt;/strong&gt;. Рыночный режим меняется, скользящие средние смещаются, а обученная на исторических ценах «монолитная» нейросеть начинает генерировать ложные сигналы.&lt;/p&gt;
&lt;p&gt;Вместо монолитных «черных ящиков» в количественном трейдинге все чаще применяются &lt;strong&gt;иерархические системы обучения с подкреплением (Reinforcement Learning)&lt;/strong&gt; на основе дискретной памяти состояний и стационарных признаков.&lt;/p&gt;
&lt;p&gt;Разберем архитектуру такого контура: от квантования рыночного опыта в «нейроны памяти» до взвешенного ансамблевого голосования (&lt;em&gt;Collective Mind&lt;/em&gt;).&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-ierarkhicheskaia-arkhitektura-ot-neirona-k-ansambliu&quot;&gt;1. Иерархическая архитектура: от нейрона к ансамблю&lt;/h2&gt;
&lt;p&gt;Вместо одной сложной модели строится трехуровневая модульная иерархия:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;flowchart&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    CM&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;🧠 Collective Mind (Совет агентов)&amp;lt;br/&amp;gt;Взвешенное динамическое голосование&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A1&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;📈 Агент 1: Trend Following&amp;lt;br/&amp;gt;(Свои веса &amp;amp; Q)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A2&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;🔄 Агент 2: Mean Reversion&amp;lt;br/&amp;gt;(Свои веса &amp;amp; Q)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A3&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;⚡ Агент 3: Volatility Breakout&amp;lt;br/&amp;gt;(Свои веса &amp;amp; Q)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    CM &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Агрегация весов P_win&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; A1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    CM &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Агрегация весов P_win&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; A2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    CM &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Агрегация весов P_win&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; A3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    DB&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;💾 База нейронов памяти (Q-Table)&amp;lt;br/&amp;gt;Квантованные инварианты опыта z_t&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A1 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Чтение / Запись опыта&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; DB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A2 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Чтение / Запись опыта&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; DB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A3 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Чтение / Запись опыта&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; DB&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Нейрон памяти (Memory Neuron):&lt;/strong&gt; элементарная единица опыта. Хранит квантованный ключ рыночной ситуации, предпринятое действие ($a \in {\text{Buy}, \text{Sell}, \text{Hold}}$), текущую $Q$-оценку, счетчик посещений и возраст записи.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Специализированный агент:&lt;/strong&gt; независимый модуль логики со своим фокусом (краткосрочный импульс, спред, фильтр волатильности).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collective Mind (Коллективный разум):&lt;/strong&gt; управляющий контур, объединяющий решения агентов через взвешенное голосование, где вес каждого агента динамически пропорционален его исторической точности ($P_{\text{win}}$).&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-statsionarnye-priznaki-invariantnost-k-urovniu-tsen&quot;&gt;2. Стационарные признаки: инвариантность к уровню цен&lt;/h2&gt;
&lt;p&gt;Сырые цены закрытия и абсолютные индикаторы нестационарны. Если обучить модель на Bitcoin по $30,000, при цене $90,000 ее веса потеряют физический смысл.&lt;/p&gt;
&lt;p&gt;Решение — переход к &lt;strong&gt;стационарным z-score инвариантам&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;$$z_t = \frac{p_t - \mu_{\text{SMA}(k)}}{\sigma_{\text{StdDev}(k)}}$$&lt;/p&gt;
&lt;p&gt;Вектор состояния описывает не &lt;em&gt;«где находится цена»&lt;/em&gt;, а &lt;em&gt;«форму и аномалию движения»&lt;/em&gt; относительно локальной волатильности. Далее непрерывные значения квантуются в дискретные интервалы (бины). Например:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$z_{\text{RSI}} \in {\text{Oversold}, \text{Neutral}, \text{Overbought}}$&lt;/li&gt;
&lt;li&gt;$z_{\text{Spread}} \in {\text{Tight}, \text{Normal}, \text{Wide}}$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Благодаря квантованию пространство состояний сжимается с бесконечности до сотен тысяч обозримых ситуаций, которые накапливают статистический опыт.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-matematika-q-learning-i-balansirovka-redkikh-klassov&quot;&gt;3. Математика Q-Learning и балансировка редких классов&lt;/h2&gt;
&lt;p&gt;Обновление оценок ценности действия строится по уравнению Беллмана:&lt;/p&gt;
&lt;p&gt;$$Q(s, a) \leftarrow Q(s, a) + \alpha \cdot \left[ r + \gamma \cdot \max_{a’} Q(s’, a’) - Q(s, a) \right]$$&lt;/p&gt;
&lt;p&gt;где:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\alpha$ — скорость обучения (learning rate);&lt;/li&gt;
&lt;li&gt;$\gamma$ — фактор дисконтирования будущих наград;&lt;/li&gt;
&lt;li&gt;$r$ — немедленная рыночная награда (PnL с поправкой на проскальзывание и комиссию).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;# Концептуальная логика обновления нейрона памяти&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #59C2FF;&quot;&gt; MemoryNeuron&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    def&lt;/span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; __init__&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; state_key&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; action&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;state_key&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; state_key&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;action&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; action&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;q_value&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;visits&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;last_seen&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    def&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; update&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; reward&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; next_max_q&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; alpha&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;0.1&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; gamma&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;0.95&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;        # Балансировка: редкие состояния обновляются с повышенным весом&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        effective_alpha&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; alpha&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; /&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0.01&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;visits)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        td_target&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; reward&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +&lt;/span&gt;&lt;span&gt; gamma&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; *&lt;/span&gt;&lt;span&gt; next_max_q&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;q_value&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +=&lt;/span&gt;&lt;span&gt; effective_alpha&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; *&lt;/span&gt;&lt;span&gt; (td_target&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;q_value)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;font-style: italic;&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;visits&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +=&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Борьба с дисбалансом классов:&lt;/strong&gt; на рынке 70%+ времени идет боковик. Без балансировки редкие ситуации разворота тренда просто не успеют набрать статистику. Взвешивание через счетчик посещений позволяет системе адекватно оценивать редкие критические режимы.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-pruning-pamiati-i-adaptivnyi-exploration&quot;&gt;4. Pruning памяти и адаптивный Exploration&lt;/h2&gt;
&lt;p&gt;Чтобы база нейронов памяти не раздувалась, применяются два механизма:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pruning (Отсечение):&lt;/strong&gt; нейроны с околонулевыми счетчиками посещений за длительный период или стабильно отрицательным $Q$ удаляются, освобождая память и очищая стратегию от устаревших аномалий.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Эволюционный $\varepsilon$-Greedy:&lt;/strong&gt; в спокойные периоды система эксплуатирует накопленный опыт ($\varepsilon \to 0$), а при резких скачках волатильности (режим сменился) уровень исследования повышается.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;kliuchevye-vyvody&quot;&gt;Ключевые выводы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Квантование + z-score&lt;/strong&gt; превращают нестационарные рыночные котировки в долговечные признаки.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Иерархия (Память → Агенты → Совет)&lt;/strong&gt; защищает от сбоев отдельных стратегий за счет взвешенного ансамбля.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Детерминированный Q-learning&lt;/strong&gt; на понятных состояниях прозрачнее и устойчивее к оверфиттингу, чем глубокие черные ящики.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;pervoistochniki-i-materialy&quot;&gt;Первоисточники и материалы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Автор исследования:&lt;/strong&gt; Yevgeniy Koshtenko (MQL5 / MetaTrader 5 Research)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Заметки и детальный конспект статьи:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://github.com/xsa-dev/obsidian-vault/blob/main/Articles/RL-System-AlgoTrading-MQL5-RU.md&quot;&gt;Obsidian Vault: RL System AlgoTrading (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Количественные репозитории:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://github.com/xsa-dev&quot;&gt;github.com/xsa-dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Как обучать и оценивать AI-агентов: почему Pass@1 бесполезен и как работает связка SFT + GKD + GRPO</title>
        <published>2026-10-07T00:00:00+00:00</published>
        <updated>2026-10-07T00:00:00+00:00</updated>
        
        <author>
          <name>Alexei Savin</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://xsa-dev.github.io/posts/training-evaluating-ai-agents/"/>
        <id>https://xsa-dev.github.io/posts/training-evaluating-ai-agents/</id>
        
        <content type="html" xml:base="https://xsa-dev.github.io/posts/training-evaluating-ai-agents/">&lt;p&gt;Большинство метрик, по которым сегодня сравнивают языковые модели (вроде Pass@1 на HumanEval или статичных QA-тестах), практически бесполезны, когда дело доходит до &lt;strong&gt;автономных агентов&lt;/strong&gt; в продакшне.&lt;/p&gt;
&lt;p&gt;В отличие от классического чат-бота (&lt;code&gt;prompt → response&lt;/code&gt;), агент — это динамическая система: &lt;strong&gt;модель + обвязка (harness) + инструменты + память + мутабельное окружение + логика восстановления после ошибок&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Разберем, из чего складывается реальная надежность агентов и как устроен современный трехуровневый пайплайн их обучения: &lt;strong&gt;SFT → On-Policy Distillation (GKD) → RLVR (GRPO)&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-izmereniia-nadezhnosti-agenta-vmesto-pass-1&quot;&gt;4 измерения надежности агента (вместо Pass@1)&lt;/h2&gt;
&lt;p&gt;Когда агент выполняет транзакционные действия (запись в БД, пуш в репозиторий, исполнение ордеров), статичный процент правильных ответов ничего не говорит о безопасности. В продакшне критичны 4 других фактора:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;flowchart&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Core&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;🛡️ 4 измерения надежности агента&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    C1&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;🎯 1. Consistency&amp;lt;br/&amp;gt;(Повторяемость результата)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    C2&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;⚡ 2. Robustness&amp;lt;br/&amp;gt;(Устойчивость к шуму API)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    C3&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;🔄 3. Recoverability&amp;lt;br/&amp;gt;(Откат после 5xx и tool errors)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    C4&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;⛔ 4. Failure Severity&amp;lt;br/&amp;gt;(Штраф за деструктивные действия)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Core &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; C1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Core &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; C2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Core &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; C3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Core &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; C4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Consistency (Повторяемость):&lt;/strong&gt; одна и та же задача при повторных прогонах должна давать стабильный результат с контролируемой дисперсией по токенам и времени.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Robustness (Устойчивость к шуму):&lt;/strong&gt; мелкие изменения в формулировке, смена формата вывода CLI или незначительный шум в API не должны ломать логику рассуждений.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recoverability (Восстановление):&lt;/strong&gt; способность агента понять, что инструмент вернул ошибку (&lt;code&gt;404&lt;/code&gt;, &lt;code&gt;SyntaxError&lt;/code&gt;, пустой вывод), скорректировать гипотезу и продолжить, а не падать в бесконечный цикл.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Failure Severity (Тяжесть сбоя):&lt;/strong&gt; синтаксическая ошибка tool call должна штрафоваться минимально, а необратимое действие (удаление таблицы или рассинхрон стейта) — приводить к жесткому блокирующему штрафу.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;trekhurovnevyi-paiplain-obucheniia&quot;&gt;Трехуровневый пайплайн обучения&lt;/h2&gt;
&lt;p&gt;Обучать агентов только с помощью SFT или только через RL неэффективно. Оптимальный стек пост-тренинга строится в три этапа:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;flowchart&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    S1&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;1. SFT (Supervised Fine-Tuning)&amp;lt;br/&amp;gt;Приучает к синтаксису tool_call и Loss Masking&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    S2&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;2. Distillation (On-Policy GKD)&amp;lt;br/&amp;gt;Перенос навыков учителя + выход из тупиков&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    S3&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;3. RLVR (GRPO / Verifiable Rewards)&amp;lt;br/&amp;gt;Максимизация надежности через проверяемые награды&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    S1 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;==&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Формат освоен&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; S2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    S2 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;==&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Траектории исследованы&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; S3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;etap-1-sft-supervised-fine-tuning&quot;&gt;Этап 1. SFT (Supervised Fine-Tuning)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Цель:&lt;/strong&gt; научить модель синтаксису вызова инструментов (&lt;code&gt;tool_calls&lt;/code&gt;), структуре системных инструкций и multi-turn диалогу.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Критический нюанс — Loss Masking:&lt;/strong&gt; градиентный спуск должен рассчитываться &lt;strong&gt;только&lt;/strong&gt; на токенах генерации агента (thought + action). Обучать модель предсказывать вывод терминала, ответ пользователя или результат исполнения инструмента — грубая ошибка. Токены окружения маскируются значением &lt;code&gt;-100&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Потолок SFT:&lt;/strong&gt; модель становится идеальным имитатором обучающего датасета, но не умеет исследовать новые пути или исправлять свои ошибки.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;etap-2-on-policy-distillation-gkd-generalized-knowledge-distillation&quot;&gt;Этап 2. On-Policy Distillation (GKD / Generalized Knowledge Distillation)&lt;/h3&gt;
&lt;p&gt;Классическая дистилляция (Off-Policy) подает студенту идеальные траектории учителя-гиганта. В реальности маленькая модель неизбежно ошибается, попадает в незнакомое состояние и «галлюцинирует» (exposure bias).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Решение — On-Policy GKD:&lt;/strong&gt; студент &lt;strong&gt;сам генерирует траекторию&lt;/strong&gt;, а модель-учитель оценивает логиты именно в тех промежуточных состояниях, куда студент реально зашел.&lt;/li&gt;
&lt;li&gt;Использование &lt;strong&gt;Reverse KL&lt;/strong&gt; заставляет студента фокусироваться на главных модах распределения учителя и учит выходить из тупиков.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;etap-3-rlvr-i-grpo-reinforcement-learning-with-verifiable-rewards&quot;&gt;Этап 3. RLVR и GRPO (Reinforcement Learning with Verifiable Rewards)&lt;/h3&gt;
&lt;p&gt;Когда формат закреплен, в дело вступает обучение с подкреплением по проверяемому результату. &lt;strong&gt;GRPO (Group Relative Policy Optimization)&lt;/strong&gt; убирает необходимость в отдельной тяжелой модели-критике (Critic Network):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;На один входной промпт генерируется группа из $G$ вариантов ($G = 8..16$).&lt;/li&gt;
&lt;li&gt;Каждый вариант прогоняется через детерминированный верификатор (тесты, компилятор, линтер).&lt;/li&gt;
&lt;li&gt;Награда нормализуется внутри группы: $A_i = \frac{r_i - \text{mean}(R)}{\text{std}(R)}$.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;# Концептуальная схема многокомпонентной награды&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; calculate_agent_reward&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;trajectory&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; test_result&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    return&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;        0.2&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; format_reward&lt;/span&gt;&lt;span&gt;(trajectory)&lt;/span&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;       # Валидный JSON / tool schema&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;        +&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0.6&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; execution_reward&lt;/span&gt;&lt;span&gt;(test_result)&lt;/span&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt; # Unit-тесты пройдены&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;        +&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0.2&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; efficiency_reward&lt;/span&gt;&lt;span&gt;(trajectory)&lt;/span&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt; # Минимальное число шагов&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Правило дисперсии:&lt;/strong&gt; GRPO работает только при наличии вариативности наград. Если все 8 вариантов провалились или все 8 выполнились успешно — обучающий сигнал равен нулю. Задача тренера — подбирать задачи на «границе возможностей» модели.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;glavnyi-anti-pattern-reward-hacking&quot;&gt;Главный анти-паттерн: Reward Hacking&lt;/h2&gt;
&lt;p&gt;Если верификатор наград слаб (например, оценивает только наличие ключевого слова в выводе), RL-агент моментально найдет шорткат: научится вызывать заглушку &lt;code&gt;exit(0)&lt;/code&gt; или обходить тесты.&lt;/p&gt;
&lt;p&gt;Грейдер должен быть &lt;strong&gt;физически изолирован&lt;/strong&gt; от среды агента (отдельный контейнер / процесс), а валидация обязана проверять фактический граф мутаций файловой системы и БД.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;kliuchevye-vyvody&quot;&gt;Ключевые выводы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Агент = Модель + Среда:&lt;/strong&gt; оценивайте не LLM в изоляции, а всю замкнутую систему действий.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SFT дает форму, GKD учит исправлять ошибки, RL находит оптимум.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Трейсы продакшна — топливо для тестов:&lt;/strong&gt; каждая непредвиденная ошибка агента в бою должна автоматически превращаться в изолированный тест для пост-тренинга.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;pervoistochniki-i-materialy&quot;&gt;Первоисточники и материалы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Оригинальная серия воркшопов:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://youtube.com/playlist?list=PLo2EIpI_JMQvQZm-kVlz4wY1vWF0LBcf5&quot;&gt;Hugging Face — Training and Evaluating AI Agents (YouTube Playlist)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Детальный структурированный конспект:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://github.com/xsa-dev/obsidian-vault/blob/main/YouTube/Training-and-Evaluating-AI-Agents-Workshop-Series-2026-09-16.md&quot;&gt;Obsidian Vault: Training &amp;amp; Evaluating AI Agents (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Репозитории и код:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://github.com/xsa-dev&quot;&gt;github.com/xsa-dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
</feed>
