<?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>@awesome_dl</title><generator>teletype.in</generator><description><![CDATA[@awesome_dl]]></description><image><url>https://img1.teletype.in/files/cd/7a/cd7add5d-0c48-4f59-9e55-dac207e75e33.png</url><title>@awesome_dl</title><link>https://teletype.in/@awesome_dl</link></image><link>https://teletype.in/@awesome_dl?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=awesome_dl</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/awesome_dl?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/awesome_dl?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 13 Aug 2026 10:28:42 GMT</pubDate><lastBuildDate>Thu, 13 Aug 2026 10:28:42 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@awesome_dl/wr4vbAqp0UY</guid><link>https://teletype.in/@awesome_dl/wr4vbAqp0UY?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=awesome_dl</link><comments>https://teletype.in/@awesome_dl/wr4vbAqp0UY?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=awesome_dl#comments</comments><dc:creator>awesome_dl</dc:creator><title>First Principles расчёт realtime видеогенерации</title><pubDate>Sun, 15 Mar 2026 11:24:39 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/31/3d/313da504-95d8-4037-b22d-e353c14cdf8e.png"></media:content><category>video generation</category><description><![CDATA[<img src="https://img4.teletype.in/files/32/8b/328bb807-c91d-4b4e-a227-f4663cc8678b.png"></img>Для расчётов нам нужна конкретная архитектура, которую можно разложить на числа. Берём Wan2.1-14B — одну из лучших open-source моделей для генерации видео. (Technical Report).]]></description><content:encoded><![CDATA[
  <nav>
    <ul>
      <li class="m_level_1"><a href="#gl5L">Глава 1: Baseline — считаем от Wan2.1-14B</a></li>
      <li class="m_level_2"><a href="#q5rN">Как устроена модель</a></li>
      <li class="m_level_2"><a href="#wIoq">DiT в числах</a></li>
      <li class="m_level_2"><a href="#3rwa">Сколько токенов обрабатывает DiT?</a></li>
      <li class="m_level_2"><a href="#CHqR">FLOPS на один шаг</a></li>
      <li class="m_level_2"><a href="#OF1Z">Калибровка по реальности</a></li>
      <li class="m_level_2"><a href="#qNTh">Где мы сейчас</a></li>
      <li class="m_level_1"><a href="#q7A7">Глава 2: Базовые ускорения — что можно сделать прямо сейчас</a></li>
      <li class="m_level_2"><a href="#vmgS">FlashAttention + torch.compile</a></li>
      <li class="m_level_2"><a href="#Kh9v">Step Distillation: 50 → 4 шага</a></li>
      <li class="m_level_2"><a href="#NfXM">CFG distillation</a></li>
      <li class="m_level_2"><a href="#N0PD">Sparse Attention</a></li>
      <li class="m_level_2"><a href="#dMc2">Суммарный эффект</a></li>
      <li class="m_level_1"><a href="#nOdj">Глава 3: Квантизация — меньше бит, больше скорость</a></li>
      <li class="m_level_1"><a href="#TF4W">Глава 4: Новое поколение карточек</a></li>
      <li class="m_level_2"><a href="#Mm2b">GPU Roadmap</a></li>
      <li class="m_level_2"><a href="#ZHLf">Пересчёт для новых GPU </a></li>
      <li class="m_level_1"><a href="#PWz9">Глава 5: Мои предположения о будущих улучшениях</a></li>
      <li class="m_level_1"><a href="#jgqO">Глава 6: А давайте всё на мобилку засунем</a></li>
      <li class="m_level_2"><a href="#vAwL">Baseline:</a></li>
      <li class="m_level_2"><a href="#xa76">Текущие мобильные NPU</a></li>
      <li class="m_level_2"><a href="#HtSq">Прогноз TOPS по годам</a></li>
      <li class="m_level_1"><a href="#gT75">Выводы</a></li>
    </ul>
  </nav>
  <h2 id="gl5L">Глава 1: Baseline — считаем от Wan2.1-14B</h2>
  <p id="GbK7">Для расчётов нам нужна конкретная архитектура, которую можно разложить на числа. Берём <a href="https://github.com/Wan-Video/Wan2.1" target="_blank">Wan2.1-14B</a> — одну из лучших open-source моделей для генерации видео. (<a href="https://arxiv.org/abs/2503.09642" target="_blank">Technical Report</a>). </p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <blockquote id="waMQ">Настоящий realtime на практике почти наверняка будет авторегрессивным — модель генерирует кадр за кадром с фиксированным контекстным окном, а не весь клип целиком. Именно поэтому мы делаем все расчёты в стандартной постановке (5с, 81 кадр, 720p) — это соответствует размеру одного контекстного окна, которое и будет единицей compute в реальной системе. Для ознакомления с работами рекомендую почитать <a href="https://github.com/PKU-YuanGroup/Helios" target="_blank">Helios, </a><a href="https://github.com/NVlabs/LongLive" target="_blank">LongLive, </a><a href="https://github.com/guandeh17/Self-Forcing" target="_blank">Self-Forcing</a></blockquote>
  </section>
  <h3 id="q5rN">Как устроена модель</h3>
  <p id="6dHZ">Генерация видео в Wan2.1 — это три этапа:</p>
  <figure id="vKdw" class="m_column">
    <img src="https://img4.teletype.in/files/32/8b/328bb807-c91d-4b4e-a227-f4663cc8678b.png" width="2580" />
  </figure>
  <p id="slSX"><strong>Этап 1: Text Encoder.</strong> Текстовый промпт кодируется через <a href="https://huggingface.co/docs/transformers/model_doc/umt5" target="_blank">UMT5</a> (5.3B параметров) в 512 текстовых токенов. Это делается один раз и кэшируется.</p>
  <p id="HUn2"><strong>Этап 2: DiT (Diffusion Transformer).</strong> Основной вычислительный блок. 14 миллиардов параметров. Берёт шум в latent space и за 50 steps превращает его в сжатое представление видео. Каждый шаг — полный forward pass через все 40 transformer layers.</p>
  <p id="64ag"><strong>Этап 3: VAE Decode.</strong> Wan-VAE (127M параметров) декодирует latent представление обратно в пиксели. Вычислительно дёшево по сравнению с DiT.</p>
  <h3 id="wIoq">DiT в числах</h3>
  <pre id="Cf5X">Число параметров                14B
Transformer layers              40
Hidden dimension (d)            5120
Attention heads                 40 (head dim = 128)
Feedforward dimension (d_ff)    13,824</pre>
  <h3 id="3rwa">Сколько токенов обрабатывает DiT?</h3>
  <p id="f1X2">DiT работает не с пикселями, а с latent tokens — сжатым представлением видео. Считаем:</p>
  <pre id="wkPQ">Формула: tokens = (1 + T/4) × (H/16) × (W/16)</pre>
  <p id="ENfN"><strong>720p (1280×720), 5 сек, 16 fps = 81 кадр:</strong></p>
  <pre id="zS1C">Temporal: 1 + 80/4 = 21 latent кадров
Spatial:  (720/16) × (1280/16) = 45 × 80 = 3,600 latent пикселей на кадр
Tokens = 21 × 3,600 = 75,600</pre>
  <p id="lJ5Q"><strong>75 тысяч токенов</strong> — вот с чем работает DiT на каждом из 50 шагов деноизинга.</p>
  <h3 id="CHqR">FLOPS на один шаг</h3>
  <p id="8wGp">Каждый из 40 layers DiT состоит из трёх блоков. Считаем FLOPS для каждого (S = 75,600, d = 5120):</p>
  <p id="mjJ6"><strong>Self-Attention:</strong></p>
  <pre id="RIVN">QKV проекции:        8 × S × d²     = 8 × 75,600 × 5120²     ≈ 15.9 TFLOP
Attention (scores):  4 × S² × d     = 4 × 75,600² × 5120     ≈ 117.1 TFLOP
                                                        Итого: ≈ 133 TFLOP</pre>
  <p id="aoeL"><strong>Cross-Attention</strong> (текст → видео):</p>
  <pre id="n2oL">≈ 8.4 TFLOP per layer</pre>
  <p id="uwh8"><strong>FFN</strong> (feedforward):</p>
  <pre id="1pFV">4 × S × d × d_ff = 4 × 75,600 × 5120 × 13,824 ≈ 21.4 TFLOP</pre>
  <p id="h3uE"><strong>Итого на один layer:</strong></p>
  <pre id="M0ea">133 + 8.4 + 21.4 = ~163 TFLOP</pre>
  <p id="SMQG"><strong>40 layers, один step:</strong></p>
  <pre id="qzNa">40 × 163 = ~6,500 TFLOP = 6.5 PFLOP</pre>
  <figure id="NNLl" class="m_column">
    <img src="https://img1.teletype.in/files/08/f3/08f3dfb2-010c-443b-ae5f-611c869a78ae.png" width="1269" />
  </figure>
  <p id="6zEL">Self-Attention = <strong>82% всех вычислений</strong>. Обратите внимание на <code>4 × S² × d</code> — квадратичная зависимость от числа токенов. Удвоение разрешения → учетверение attention compute.</p>
  <h3 id="OF1Z">Калибровка по реальности</h3>
  <p id="Qm5t">Теоретические FLOPS — это хорошо, но давайте сверимся с реальными замерами.</p>
  <p id="gdM3">Wan2.1-14B на 1×H100:</p>
  <ul id="szJf">
    <li id="AT84"><strong>720p, 5 сек, 50 steps: 242 секунды</strong></li>
    <li id="a6DV"><strong>На 8×H100 (FSDP + Ulysses): 7.7 секунд</strong></li>
  </ul>
  <p id="tVUT">Из реальных замеров: <strong>1 секунда видео 720p ≈ 48 секунд на H100</strong> (242 сек / 5 сек). Это наша калиброванная точка отсчёта — все дальнейшие расчёты масштабируем от неё.</p>
  <h3 id="qNTh">Где мы сейчас</h3>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="IWU2"><strong>Цель</strong>: 720p@16fps, streaming realtime — генерировать 1 секунду видео за ≤1 секунду.</p>
    <p id="m2hu"><strong>Реальность</strong>: 1 секунда видео 720p = 242/5 ≈ <strong>48 секунд</strong> на H100.</p>
  </section>
  <hr />
  <h2 id="q7A7">Глава 2: Базовые ускорения — что можно сделать прямо сейчас</h2>
  <p id="8rbS">Прежде чем менять железо, выжмем максимум из текущего решения. Для реальных цифр рекомендую глянуть блог от <a href="https://morphic.com/blog/boosting-wan2-2-i2v-56-faster" target="_blank">Morphic</a>, где они подробно расписали ускорения и провели точные замеры</p>
  <h3 id="vmgS">FlashAttention + torch.compile</h3>
  <p id="lCHI"><a href="https://arxiv.org/abs/2307.08691" target="_blank">FlashAttention</a> не уменьшает FLOPS — он уменьшает обращения к памяти. Вместо материализации матрицы attention (75K × 75K ≈ 5.7 миллиардов элементов), считает блоками, не записывая промежуточные результаты в HBM.</p>
  <p id="HUg6"><code>torch.compile</code> добавляет kernel fusion — объединяет операции в один GPU kernel.</p>
  <p id="lmtB"><strong>Эффект: MFU с ~30% → ~50-60%. Speedup: ~1.5-2×.</strong></p>
  <h3 id="Kh9v">Step Distillation: 50 → 4 шага</h3>
  <p id="prVe">Каждый step — полный forward pass через 14B модель. <a href="https://arxiv.org/abs/2303.01469" target="_blank">Consistency distillation</a> обучает модель делать то же за меньше шагов:</p>
  <ul id="2R8a">
    <li id="m7vG">50 → 8 steps: качество почти не падает</li>
    <li id="7OSY">50 → 4 steps: минимальная деградация</li>
    <li id="LZAl">50 → 1 step: заметная потеря, но usable для preview</li>
  </ul>
  <p id="fsLo"><strong>Эффект: 50/4 = 12.5×. Консервативно: ~10×.</strong></p>
  <h3 id="NfXM">CFG distillation</h3>
  <p id="q0Kb">CFG делает два forward pass на каждый step (с промптом и без). Guidance distillation учит модель генерировать &quot;guided&quot; за один проход.</p>
  <p id="B4oT"><strong>Эффект: ~2× speedup.</strong></p>
  <h3 id="N0PD">Sparse Attention</h3>
  <p id="vD1b">Не все пары токенов одинаково важны. <a href="https://arxiv.org/abs/2411.13745" target="_blank">VSA (Variable Sparse Attention)</a> и Block Sparse пропускают ненужные пары. <a href="https://github.com/thu-ml/TurboDiffusion" target="_blank">TurboDiffusion</a> комбинирует sparse attention со step distillation и показывает 100-200× суммарный speedup.</p>
  <p id="EzPD">Консервативная оценка sparse attention отдельно: <strong>~3-6×.</strong></p>
  <h3 id="dMc2">Суммарный эффект</h3>
  <pre id="BJPO">Baseline (1 сек видео 720p):     48 сек на 1×H100

Flash + compile:     ×1.7    → 28 сек
Step distillation:   ×10     → 2.8 сек
CFG removal:         ×2      → 1.4 сек
Sparse attention:    ×4      → 0.35 сек ✅</pre>
  <figure id="z7QG" class="m_column">
    <img src="https://img1.teletype.in/files/88/cb/88cb8b46-7d27-4e4c-b53e-812bc6710903.png" width="2259" />
  </figure>
  <p id="ZcOX"><strong>Результат: 720p realtime на одном H100 достижим</strong> с aggressive optimization (4 steps, sparse, no CFG).</p>
  <p id="kjSX">Реалистичный сценарий (8 steps, moderate sparse, partial CFG):</p>
  <pre id="sYgc">×1.7 × 6 × 1.5 × 3 = ×46
48 / 46 ≈ 1.0 сек — на границе realtime</pre>
  <hr />
  <h2 id="nOdj">Глава 3: Квантизация — меньше бит, больше скорость</h2>
  <p id="Fa75">Современные GPU имеют физически разные Tensor Cores для разных числовых форматов. FP8 Tensor Cores выдают ровно 2× throughput по сравнению с FP16. </p>
  <p id="D66K"><strong>Compute</strong>: меньше бит → больше операций в секунду.</p>
  <pre id="1Hgr">H100:  FP16 = 989 TFLOP/s  |  FP8 = 1,979 TFLOP/s (×2)
B200:  FP16 = 2,250        |  FP8 = 4,500   |  FP4 = 9,000 (×4)</pre>
  <p id="dyVi"><strong>Memory</strong>: меньше бит → меньше данных через шину.</p>
  <pre id="tzEK">14B модель: FP16 = 28 GB  |  FP8 = 14 GB  |  FP4 = 7 GB</pre>
  <p id="V6qG">FP8: потеря качества &lt; 1%, стандарт индустрии. FP4: требует calibration, работает на Blackwell через microscaling.</p>
  <p id="O6cV">Пересчёт с FP8:</p>
  <pre id="uPUM">Aggressive opt, FP16:  0.35 сек → с FP8: 0.18 сек ✅
Moderate opt, FP16:    1.0 сек  → с FP8: 0.5 сек ✅</pre>
  <figure id="cx4x" class="m_column">
    <img src="https://img3.teletype.in/files/ee/8d/ee8dff2c-0b65-41b1-b375-6cbf04af6e85.png" width="2858" />
  </figure>
  <hr />
  <h2 id="TF4W">Глава 4: Новое поколение карточек</h2>
  <blockquote id="ad35">⚡ <strong>Граница</strong>: H100 и B200 — реальность, можно купить/арендовать сегодня. B300 объявлен, поставки H2 2025. Всё дальше — экстраполяция на основе NVIDIA roadmap и исторических трендов.</blockquote>
  <h3 id="Mm2b">GPU Roadmap</h3>
  <p id="Ot15">NVIDIA анонсировала roadmap на GTC 2025: Blackwell Ultra (B300), Rubin (2026), Rubin Ultra (2027), Feynman (2028).</p>
  <p id="Nfvx">Исторический тренд: ~2× achievable FLOPS каждые ~18 месяцев. Memory bandwidth растёт медленнее (~1.5× за поколение), но новые форматы (HBM4, HBM4E) компенсируют.</p>
  <p id="JaWw">*экстраполяция по тренду ~2× за 18 мес</p>
  <figure id="BBhT" class="m_column">
    <img src="https://img3.teletype.in/files/af/41/af412e93-7b1a-4627-b0bf-1f1129c110b9.png" width="2259" />
  </figure>
  <h3 id="ZHLf">Пересчёт для новых GPU </h3>
  <figure id="L0y3" class="m_column">
    <img src="https://img2.teletype.in/files/52/bd/52bd0b4a-d398-48c7-aa78-fcd85f55d7ef.png" width="3658" />
  </figure>
  <p id="gRco"><strong>Вывод главы 4</strong>: 720p realtime уже достигнут на 1×H100 с оптимизациями. 1080p realtime — 8×H100 уже сейчас или 1×Rubin в 2026. Дальше — запас.</p>
  <hr />
  <h2 id="PWz9">Глава 5: Мои предположения о будущих улучшениях</h2>
  <p id="WIBH">По моей интуиции, сейчас основных bottleneck видео-генерации является не эффективное представление данных — видео из 81 кадра != 81 изображению по объему информации и даже темпоральное сжатие не сильно помогает, так как к примеру использование видео-кодеков позволяет сжатие видео намного сильнее.   По этому мне интересно следить за подходами, которые используют более эффективное предстваление видео, к примеру <a href="https://sayands.github.io/cope/" target="_blank">CoPE-VideoLM</a></p>
  <p id="DiXr">Поэтому хочется сделать предположение, что для видео генерации будет использоваться более сжатое представления, и как ориентир взять Wan2.2 VAE. Таким образом:</p>
  <p id="rVyM">Wan2.1 VAE: compression 8×8 spatial → 75,600 tokens для 720p.</p>
  <p id="VLUa">Wan2.2 VAE: compression <strong>16×16</strong> spatial:</p>
  <ul id="bh77">
    <li id="siBv">Tokens в <strong>(16/8)² = 4× меньше</strong> → ~18,900 tokens</li>
    <li id="RVNZ">Attention compute: <strong>4² = 16× меньше</strong> (квадратичная зависимость!)</li>
    <li id="FRCe">Weighted average (attention ~82%): <strong>~13.6× суммарное ускорение</strong></li>
  </ul>
  <p id="dQxF">С patchification 2×2: total compression 32×32×4 → ещё 4× меньше.</p>
  <figure id="7gpg" class="m_column">
    <img src="https://img1.teletype.in/files/8d/dd/8ddd9c66-2753-4b8f-8305-42d8498dcde6.png" width="2258" />
  </figure>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="3WWK">Использование более эффективного VAE сравнимо с двумя поколениями GPU это уже 2-4 года.</p>
  </section>
  <p id="IPly">Если финализировать текущие оптимизации на горизонт 2027 года с более эффективными VAE и оптимизации, то мы получаем, что видео генерации это дело  ближайших пару лет. При этом запас ускорения позволяет сделать архитектуру еще больше, значит мы получим качественную видеогенерацию в реалтайм уже скоро.</p>
  <figure id="RZ7x" class="m_column">
    <img src="https://img1.teletype.in/files/c8/4a/c84a9a9d-0228-4f2e-baad-491e2c1b26ca.png" width="4058" />
  </figure>
  <blockquote id="RZWP">Пока писался этот пост вышла realtime видео генерация в 1080p на базе LTX2.3 <a href="https://haoailab.com/blogs/fastvideo_realtime_1080p/" target="_blank">https://haoailab.com/blogs/fastvideo_realtime_1080p/</a>. А у LTX сжатие 32x пространственное и 8x темпоральное</blockquote>
  <hr />
  <h2 id="jgqO">Глава 6: А давайте всё на мобилку засунем</h2>
  <p id="gcPa">Серверные GPU — хорошо, но телефон в кармане — другая история. Хочется взять телефон и например сделать свой персональный  Subwafe Surfer симулятор, чтобы мотивировать себя заниматься бегом. Давайте глянем насколько мы далеко от реальности. За основу возьмем архитектуру 1.3B, т.к на мобильных устройствах слабее железо</p>
  <h3 id="vAwL">Baseline:</h3>
  <pre id="jjk3">Модель: 1.3B, INT8 = 1.4 GB
Разрешение: 480p
FPS на H100 FP8: 24.8
Computational Power H100: 3,958 TFLOPS (FP8)</pre>
  <h3 id="xa76">Текущие мобильные NPU</h3>
  <p id="AzUl">Давайте глянем на вычислительную мощность современных мобильных чипов.</p>
  <pre id="wCr5">Qualcomm X2 Elite  │ 80 TOPS = 80 TFLOPS (FP8)
Snapdragon 8 Elite │ 45 TOPS = 45 TFLOPS (FP8)
Apple A18 Pro      │ 35 TOPS = 35 TFLOPS (FP8)</pre>
  <figure id="c4CF" class="m_column">
    <img src="https://img4.teletype.in/files/bb/32/bb324a96-c229-4a6a-90c0-4844df7ee935.png" width="2058" />
  </figure>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="uqAF">Видно, что разница колоссальная текущие вычислительные мощности не позволяют даже близко делать реалтайм на мобильном устройстве. При этом мы даже не учли, что стэк для мобильных устройств менее развит и соответственно реальная скорость будет еще медленнее.</p>
  </section>
  <h3 id="HtSq">Прогноз TOPS по годам</h3>
  <p id="QndP">Да, всё выглядит грустно, однако, давайте сделаем прогноз по годам</p>
  <p id="vPum">Прогноз TOPS: исторический тренд ~2× каждые 2 года. Следуя данному прогнозу мы получим:</p>
  <pre id="VjSk">2025: 45-80 TOPS (реальность)
2027: ~150 TOPS (Intel Nova Lake анонс + тренд)
2029: ~250 TOPS (экстраполяция ×2 от 2027)
2030: ~400 TOPS
2031: ~600 TOPS
2033: ~1,500 TOPS</pre>
  <figure id="sobt" class="m_column">
    <img src="https://img2.teletype.in/files/99/eb/99eb2ed8-a21c-48cf-baf2-eb8ff5e97aa0.png" width="2259" />
  </figure>
  <p id="uqED"><strong>Вывод</strong>: мобильный realtime с текущим AR подходом — это долгая история. <strong>480p@1FPS: ~2027</strong>. <strong>480p@12FPS: ~2031-2033</strong>. 720p realtime на мобилке — не раньше 2033-2035.</p>
  <p id="HN4q">Но: это без учёта будущих архитектурных прорывов (smaller models, better compression, hardware-aware architectures). Каждое 10× improvement в model efficiency сдвигает timeline на ~3 года влево.</p>
  <hr />
  <h2 id="gT75">Выводы</h2>
  <p id="wgEx"><u>Глядя на вычисления, качественная реалтайм генерация на серверах вопрос ближайших 2 лет.</u> Отсюда можно дальше прогнозировать, когда появятся реалтайм игры, я бы поиграл в бесконечный Euro Truck Simulator или Subnautica. Надеюсь это будет к 2030 году.</p>
  <p id="mNgo">Для меня оказалось неожиданным насколько мы далеки до realtime генерации на мобильных устройствах в 2030-е года не выглядит как AGI завтра. Возможно мы получим её за счёт качественного сдвига в инференсе - специальные чипы более оптимизированные архитектуры, где будут решены две проблемы: attention и более эффективное представление видео. <u>Тут прогнозирую ближе к 2030 году</u></p>
  <p id="xgX1">Добавлю, что расчеты для архитектуры Wan не слишком реалистичны, потому что более бОльшие архитектуры показывают качественный рост в консистентности, prompt following и эстетике. Чтобы учесть этот фактор и посмотреть, когда будет реалтайм на 30B, 200B архитектурах или попытаться использовать свою интуицию, чтобы оценить время realtime переходите на интерактивное <a href="https://anvilarth.github.io/realtime-video-calculator.html" target="_blank">демо.</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@awesome_dl/llm4robotics</guid><link>https://teletype.in/@awesome_dl/llm4robotics?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=awesome_dl</link><comments>https://teletype.in/@awesome_dl/llm4robotics?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=awesome_dl#comments</comments><dc:creator>awesome_dl</dc:creator><title>Применение LLM для синтеза и стилизации поведений агентов</title><pubDate>Tue, 29 Aug 2023 15:11:13 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/0d/af/0daf0140-1b5b-4003-96dd-ccc3433e9aa6.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/a9/27/a9276c2e-4717-4da2-b468-9bb9b2e23f89.png"></img>TLDR: Рассмотрим, как можно использовать LLM-ки для управлением роботами и какие от этого можно получить преимущества.]]></description><content:encoded><![CDATA[
  <p id="bgWF"><strong>TLDR:</strong> Рассмотрим, как можно использовать LLM-ки для управления роботами и какие от этого можно получить преимущества.</p>
  <nav>
    <ul>
      <li class="m_level_1"><a href="#NrpG">1. Введение</a></li>
      <li class="m_level_1"><a href="#9BbK">2. Reward Design with Language Models (Kwon et al., 2023)</a></li>
      <li class="m_level_1"><a href="#XlON"></a></li>
      <li class="m_level_1"><a href="#qk21">3. SayTap: Language to Quadrupedal Locomotion (Tang et al., 2023)</a></li>
      <li class="m_level_1"><a href="#Q669">4. Language to Rewards for Robotic Skill Synthesis (Yu et al., 2023)</a></li>
      <li class="m_level_1"><a href="#1HNO">5. Code as Policies: Language Model Programs for Embodied Control (Liang et al., 2023)</a></li>
      <li class="m_level_1"><a href="#Piyg">6. Заключение</a></li>
      <li class="m_level_1"><a href="#i32j">7 Supplementary: подробнее про MPC</a></li>
    </ul>
  </nav>
  <h2 id="NrpG">1. Введение</h2>
  <p id="AVO4">В нашем <a href="https://teletype.in/@awesome_dl/rl2robots" target="_blank">предыдущем обзоре</a> мы рассмотрели, как Reinforcement Learning (RL) помогает управлять сложными роботехническими конструкциями, такими как четвероногие роботы. Важную роль в здесь играет дизайн функции награды (reward) — именно награда определяет, какую задачу будет решать агент. </p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="FdTv">Функция награды в определенном смысле <strong>формализует</strong> задачу, которую будет решать RL-алгоритм, и, соответственно, целевое поведение агента, которого мы хотим добиться. </p>
  </section>
  <p id="yf9v">Дизайн функции награды сам по себе может стать отдельной сложной задачей. Эта задача становится ещё сложнее, если мы хотим добиться поведения, которое, с одной стороны, интуитивно понятно человеку, но с другой стороны едва ли возможно явно отобразить с помощью математических выражений в функции награды. RL чаще всего позволяет одновременно решить одну задачу — другими словами, научить робота одному <strong>навыку</strong>. </p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="EnjI">Возникает вопрос: можем ли мы безболезненно комбинировать эти навыки, а также синтезировать новые без обучения?</p>
  </section>
  <p id="dheQ">Конечно, для вышеперечисленных проблем у нас есть методы <a href="https://smartlabai.medium.com/a-brief-overview-of-imitation-learning-8a8a75c44a9c" target="_blank">imitation learning</a>, посвященные обучению политики, имитирующей демонстрации эксперта (им может выступать как какая-то другая политика, так и человек — в этом случае подразумевается наличие датасета демонстраций от человека). Из описаний видно, что главный недостаток этих методов — необходимость достаточного количества экспертных демонстраций, и собрать эти демонстрации, особенно если речь идет о реальных роботах, может быть довольно сложно. </p>
  <p id="PgeP">На тему комбинации навыков (skill combination) работы существуют (например, <a href="https://arxiv.org/abs/2106.13105" target="_blank">первая</a> и <a href="https://ieeexplore.ieee.org/abstract/document/9981105" target="_blank">вторая</a>), также, возможно, сюда подходит и <a href="https://pub.towardsai.net/what-is-hierarchical-reinforcement-learning-e61f8a41c8e1" target="_blank">Hierarchical Reinforcement Learning</a> (<a href="https://dl.acm.org/doi/abs/10.1145/3453160?casa_token=p92gmD5nmfEAAAAA:BKQk6hEEhGH0bJ0Pk5Jy4nwFlIVtH0eLiq_s3t6XUR7TEX_xceqc12trwMYl_QEmD78XT4Byj62aSg" target="_blank">тык</a> на survey), но это все пока что, насколько мне известно, не особо исследованные в контексте роботехники направления.</p>
  <p id="xgWB">Поэтому, вдохновившись показателями уровня знаний, заложенных в LLM, и их результатами в reasoning-задачах, исследователи задались вопросом: </p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="1WQm">Достаточно ли у LLM reasoning-способностей и знаний о нашем мире, чтобы синтезировать поведения роботов из только лишь текстовых описаний и, возможно, нескольких примеров (также только в форме текста), и если ответ &quot;да&quot;, то как мы можем &quot;соединить&quot; LLM с роботом?</p>
  </section>
  <hr />
  <p id="U6UU"></p>
  <h2 id="9BbK">2. Reward Design with Language Models (Kwon et al., 2023)</h2>
  <blockquote id="qkLl"><a href="https://arxiv.org/abs/2303.00001" target="_blank">Link</a></blockquote>
  <p id="lEMA">Начнем немного издалека, кратко рассмотрев данную работу из начала 2023 года. Авторы исследуют задачу формализации &quot;неформальных&quot; поведений агента в небольших текстовых играх на тему экономики и бизнес-переговоров с помощью LLM. Сами авторы называют подобных агентов <strong>objective-aligned agents</strong>. Пример поведений: быть более настойчивым в переговорах, или наоборот, более пассивным.</p>
  <figure id="A60I" class="m_original">
    <img src="https://img2.teletype.in/files/12/8f/128fc6cd-4eca-4095-81a2-e4c729a2ed7c.png" width="1039" />
    <figcaption>Схема предложенного подхода (скрин из статьи)</figcaption>
  </figure>
  <p id="EIyq">Идея заключается в том, чтобы использовать LLM, а именно, GPT-3, в качестве, как они сами её называют, прокси-функцией награды. Конкретно, предлагается следующая схема:</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <ol id="VDPf">
      <li id="Ek6t">Для текущей версии политики запускаем эпизод, и собираем данные с этого эпизода (episode outcomes) — как некий &quot;лог&quot; игры</li>
      <li id="3JjT">Конструируем <s>затравку</s> промпт для LLM. Этот промпт состоит из следующих блоков:</li>
      <ul id="ogfp">
        <li id="B8bb">Описание задачи</li>
        <li id="fmkr">Примеры требуемого поведения</li>
        <li id="xIvo">Собранные данные с эпизода</li>
        <li id="k6lz">Вопрос к LLM о соответствии поведения из эпизода решению описанной задачи и приведенному в пример поведению. На вопрос можно ответить &quot;да&quot; или &quot;нет&quot;.</li>
      </ul>
      <li id="CcXI">Из ответа LLM парсим награду. В данной работе рассматриваются только бинарная награда. Ответ &quot;да&quot; соответствует получению reward, ответ &quot;нет&quot; соответствует штрафу.</li>
      <li id="djFA">На основе награды, обновляем политику с помощью любого RL-алгоритма (в данной работе использовался <a href="https://paperswithcode.com/method/dqn" target="_blank">Deep Q-Learning</a>)</li>
    </ol>
  </section>
  <p id="H38q">По результатам авторы показали, что с помощью такого подхода вполне можно достичь уровня RL-агента, обученного с помощью ground truth-наград, и требует это меньше примеров в промптах, чем данных для supervised learning-бейзлайна. Целевых &quot;стилизованных&quot; поведений также удалось достичь (или, по крайней мере убедить в этом группу из 10 человек).</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="PLVA">В целом, подход довольно интересный, но имеет один главный недостаток — учитывая, что источником награды являлась GPT-3, расширить такой подход на реальные роботехнические задачи: во-первых, скорее всего, нужна будет мультимодальная модель, и, во-вторых, скорее всего, обучение будет занимать очень много времени из-за инференса LLM (а на практике зачастую нужны тысячи и десятки тысяч эпизодов). Какие у нас есть альтернативы?</p>
  </section>
  <hr />
  <h2 id="XlON"></h2>
  <h2 id="qk21">3. SayTap: Language to Quadrupedal Locomotion (Tang et al., 2023)</h2>
  <blockquote id="7oTS"><a href="https://saytap.github.io/" target="_blank">Link</a></blockquote>
  <p id="GtuY">В данной работе авторы рассматривают задачу управления роботом-собакой с помощью LLM. Управление подразумевает как выполнение простых команд, например, &quot;Иди вперед&quot; или &quot;Иди назад&quot;, так и менее структурированных и более &quot;стилизованных&quot;, как в предыдущей работе, например, &quot;Радуйся, мы идем на пикник!&quot; или &quot;Осторожно, перед тобой белка, отойди!&quot; (отличные видосики смотрите на <a href="https://saytap.github.io/" target="_blank">сайте работы</a>).</p>
  <p id="ZBV3">Предложенный подход состоит из двух главных блоков:</p>
  <ol id="FgiD">
    <li id="rNoB">Блок генерации <strong>паттерна</strong> (шаблона) походки на основе LLM: языковая модель на основе промпта генерирует шаблон, то есть некоторое описание походки для робота. Важно отметить, что этот блок <strong>не требует никакого обучения</strong>.</li>
    <li id="7yNs">Контроллер походки: принимает на вход сгенерированный паттерн и отвечает за то, чтобы робот двигался в соответствии этому паттерну. Данный <strong>блок обучается с помощью RL-я</strong>, во время обучения генерируются случайные паттерны.</li>
  </ol>
  <p id="iUlF">Пример на картинке ниже:</p>
  <blockquote id="HJfq">Блог генерации паттерна, получив команду &quot;Good news, we are going to a picnic this weekend&quot;, создает последовательность, говорящую роботу, что ты должен прыгать от радости :) Контроллер, принимая, этот паттерн исполняет его и мы видим, как прыгает робот</blockquote>
  <figure id="aahc" class="m_original">
    <img src="https://img2.teletype.in/files/92/fa/92fa8fdc-5288-44e2-99e8-4c71903080fb.png" width="860" />
    <figcaption>Иллюстрация паттерна походки (скрин из статьи)</figcaption>
  </figure>
  <p id="vqMz">Паттерн походки имеет вид последовательностей из T (число дискретных шагов) нулей и единиц для каждой из ног робота, где 0 означает, что нога должна быть поднята, а 1 — что она должна касаться земли. На рисунках выше ноги обозначены как FL — front left (передняя левая), FR — front right (передняя правая), RL — rear left (задняя левая), RR — rear right (задняя правая). Имхо, чем-то это напоминает игру Guitar Hero :)</p>
  <figure id="WxsR" class="m_column" data-caption-align="center">
    <iframe src="https://giphy.com/embed/l0HlNhH1go9seUvrq"></iframe>
    <figcaption>Легендарная игра Guitar Hero :)</figcaption>
  </figure>
  <figure id="GGDE" class="m_original">
    <img src="https://img2.teletype.in/files/11/b0/11b05444-7128-4422-8d03-4c9382b9eea6.png" width="1056" />
    <figcaption>Структура промпта (скрин из статьи)</figcaption>
  </figure>
  <p id="mp7Q">Теперь самое интересное — как эти паттерны предлагается генерировать. Авторы использовали GPT-4 и промпты, состоящие из следующих блоков:</p>
  <ol id="2SBg">
    <li id="8HnH">Общее описание задачи</li>
    <li id="Ib37">Общее описание того, что вообще такое походка, базовая классификация типов походок для робособак</li>
    <li id="MiHW">Общие правила генерации шаблона и походки и его формат. Здесь также указывается, что общая скорость тела робота задается дискретными значениями — это помогает обрабатывать неформальные запросы типа &quot;быстрее&quot; или &quot;медленнее&quot;.</li>
    <li id="2gfT">Блок с примерами</li>
  </ol>
  <figure id="Ixil" class="m_original">
    <img src="https://img4.teletype.in/files/75/48/754803e2-ce7e-4504-b21b-fa2535405bd9.png" width="846" />
    <figcaption>Общая схема предложенного подхода на этапе обучения и инференса — деплоя на реальном роботе (скрин из статьи)</figcaption>
  </figure>
  <p id="8eyd">В итоге, взаимодействие с человеком выглядит следующим образом:</p>
  <ol id="DCWv">
    <li id="UAwK">Пользователь вводит команду для робота</li>
    <li id="FYSY">LLM на основе базового промпта и введенной команды пользователя генерирует паттерн походки</li>
    <li id="49hb">Сгенерированный паттерн походки &quot;исполняется&quot; контроллером походки.</li>
  </ol>
  <p id="cwhm">Контроллер походки обучался с помощью PPO, в ходе обучения генерировались случайные паттерны в соответствии с определенным механизмом, позволяющим получить более-менее информативные и выполняемые сэмплы.</p>
  <figure id="8Ps4" class="m_original">
    <img src="https://img2.teletype.in/files/5a/b2/5ab23424-afcb-4df3-a373-b00d1396d48e.png" width="1039" />
    <figcaption>Пример команды для робота и соответствующего ожидаемого авторами поведения (скрин из статьи)</figcaption>
  </figure>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="lWQN">Предложенный подход показывает важные свойства LLM, касающиеся понимания &quot;динамики&quot; мира на основе лишь текстовых описаний. Однако, хоть с помощью данного подхода и получилось добиться интересных результатов по &quot;стилизации&quot; движения, его расширение на другие типы роботов или на другие задачи в рамках роботов-собак, как отмечают авторы, ограничено за счет привязки предложенной структуры паттерна для узкого круга задач.</p>
  </section>
  <hr />
  <p id="hUp4"></p>
  <h2 id="Q669">4. Language to Rewards for Robotic Skill Synthesis (Yu et al., 2023)</h2>
  <blockquote id="RklZ"><a href="https://language-to-reward.github.io/" target="_blank">Link</a>; <a href="https://ai.googleblog.com/2023/08/language-to-rewards-for-robotic-skill.html" target="_blank">пост в блоге Google Research</a></blockquote>
  <figure id="gs3e" class="m_column">
    <iframe src="https://www.youtube.com/embed/7KiKg0rdSSQ?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <p id="Zf37">Данная работа также посвящена управлению и генерации навыков для роботов с помощью LLM, однако, помимо четвероного робота, рассматривается также управление манипулятором. В предыдущей статье &quot;связующим звеном&quot; между LLM и роботом выступал паттерн походки и соответствующий контроллер; в этой же работе таким звеном выступает <u>контроллер на основе подхода <a href="https://www.mathworks.com/help/mpc/gs/what-is-mpc.html" target="_blank">Model Predictive Control (MPC)</a></u>.</p>
  <p id="UqFy">В <a href="https://teletype.in/@awesome_dl/rl2robots" target="_blank">предыдущих постах</a> мы уже упоминали MPC, и в целом он заслуживает отдельного поста, поскольку совмещение MPC и Deep Learning-методов тема довольно интересная. Для тех, кому прямо сейчас интересен более подробный разбор MPC — добро пожаловать <a href="#i32j">в дополнительный раздел после заключения </a>( через идею шахмат вы легко поймете MPC).Здесь же для краткости просто скажу так: MPC оптимизирует последовательность действий агента за счет <strong>минимизации функции стоимости</strong> (cost), либо <strong>максимизации функции награды</strong> (последняя формулировка используется реже, хоть и понятия взаимозаменяемы, но авторы пользуется именно ей). MPC <strong>не требует обучения</strong> — процесс оптимизации сам по себе является политикой, выдающей действия для агента. Но взамен для этой оптимизации <strong>требуется модель</strong> агента, и, в зависимости от задачи, среды.</p>
  <figure id="DUJt" class="m_original">
    <img src="https://img3.teletype.in/files/6a/0b/6a0b63bc-c5ce-4376-b3a2-0b77af9ad5c7.png" width="1047" />
    <figcaption>Общая схема предложенного подхода и сравнение с альтернативами (скрин из статьи)</figcaption>
  </figure>
  <p id="bDr6">Возвращаясь к статье, авторы предлагают связывать LLM и физическую платформу с помощью функций награды для контроллера на основе MPC: <strong>LLM генерирует набор функций наград, их весов и параметров, которые далее использует MPC </strong>(как финальная награда используется линейная комбинация из сгенерированных наград и их весов).</p>
  <figure id="QPIx" class="m_original">
    <img src="https://img2.teletype.in/files/5b/63/5b632b41-346e-41b2-9d72-ee875cc9d641.png" width="1030" />
    <figcaption>Структура промпта (скрин из статьи)</figcaption>
  </figure>
  <p id="tS81">Обращение к LLM (в данном случае — <strong>GPT-4</strong>) состоит из двух этапов (в тексте это упоминается как использование двух LLM): <em>Motion Description</em> и <em>Reward Coding.</em> Вместе эту схему генерации авторы называют<strong> Reward Translator,</strong> а MPC-контроллер — <strong>Motion Controller.</strong></p>
  <p id="hVJn"><strong>Motion Description</strong> подразумевает описание требуемого движения робота. Цель — получить от LLM высокоуровневое описание движения робота в соответствии с заданным шаблоном. Промпт имеет следующую структуру:</p>
  <ol id="shNF">
    <li id="qnYW">Шаблон, по которому должныо генерироваться описание движения (motion template)</li>
    <li id="K3jy">Разъяснения по шаблону и дополнительные правила для генерации (rules)</li>
  </ol>
  <p id="CcQk"><strong>Reward Coder</strong> принимает сгенерированное описание движения с предыдущего этапа, и генерирует необходимые функции награды и их параметры. Промпт имеет следующую структуру:</p>
  <ol id="MUJI">
    <li id="wgfi">Описание доступных функций наград и их аргументов (reward API): предполагается, что у нас есть некая библиотека доступных функций наград и краткая документация к ней — за что какая функция отвечает и какие у неё есть аргументы. Задача LLM — подобрать нужные функции и значения их аргументов.</li>
    <li id="cvQ0">Блок с примерами</li>
    <li id="u0NN">Блок с правилами для генерации</li>
  </ol>
  <p id="dogP">Как и в предыдущем случае, Reward Translator<u> не требует какого-либо дообучения</u>. Motion Controller на основе MPC также не требует обучения, но зато требует отдельной настройки, как в общем-то любой &quot;классический&quot; контроллер.</p>
  <figure id="S8bZ" class="m_original">
    <img src="https://img2.teletype.in/files/db/0a/db0ab165-3f5e-4408-910f-7e37a4885cf8.png" width="1045" />
    <figcaption>Результаты — сраванение с упрощенной схемой промпта (Reward Coder Only) и бейзлайном из работы Code as Policies (скрип из статьи)</figcaption>
  </figure>
  <p id="HJon">Тесты проводились в симуляторе <a href="https://mujoco.org/" target="_blank">MuJoCo</a> на четвероногом роботе и манипуляторе, а также на реальном манипуляторе. Как показывают авторы, получилось достичь лучших результатов, чем с Code-as-Policies (об этом подходе речь пойдет далее).</p>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="fj1C">Резюмируя, авторы предложили метод, позволяющий объединить мощь как LLM, так и MPC, причем предложенная схема является довольно универсальной. Из недостатков, и, соответственно, тем для будущих исследований, авторы отмечают сложности с &quot;продвинутой&quot; стилизацией движения, т.к. генерация сильно зависит от шаблонов, используемых в промптах, а также невозможность использовать изменяющиеся во времени (time-varying) награды.</p>
  </section>
  <hr />
  <p id="ZaHD"></p>
  <h2 id="1HNO">5. Code as Policies: Language Model Programs for Embodied Control (Liang et al., 2023)</h2>
  <blockquote id="USeh"><a href="https://code-as-policies.github.io/" target="_blank">Link</a></blockquote>
  <figure id="AX8q" class="m_original">
    <img src="https://img3.teletype.in/files/ae/ee/aeee8a46-beee-404a-8144-80f62e0defe4.png" width="646" />
    <figcaption>Общая схема предложенного подхода (скрин из статьи)</figcaption>
  </figure>
  <p id="Fj8W">Вообще, первая версия данной работы вышла раньше, чем <a href="#Q669">Language-to-Rewards, </a>но по смыслу, учитывая остальные рассматриваемые работы, будет удобнее поместить её после. Авторы предлагают применять LLM для генерации программ (такие программы они называют Language Model Programs — LMP) для роботов, использующих как first-party библиотеки (т.е. &quot;внутренняя&quot; библиотека с функциями и классами, касающимися непосредственно управлением роботом), так и third-party библиотеки (сторонние библиотеки, такие как NumPy, Shapely, и др.). В целом, идея заставить LLM генерировать код для решения какой-либо задачи, не связанной напрямую с программированием, не нова (см., например, <a href="https://viper.cs.columbia.edu/" target="_blank">ViperGPT</a> и <a href="https://arxiv.org/pdf/2302.04761.pdf" target="_blank">Toolformer</a>). Одно из преимуществ такого подхода — код в общем-то является довольно универсальной и интерпретируемой формой, которая при этом явно предоставляет LLM информацию о возможностях целевой платформы (в частности, как мы увидим далее, за счет описания API и примеров в промптах).</p>
  <figure id="hZSY" class="m_original">
    <img src="https://img4.teletype.in/files/30/51/3051b9d7-0a65-45a6-be58-f398e408d042.png" width="1301" />
    <figcaption>Примеры запросов к роботу (скрин из статьи)</figcaption>
  </figure>
  <p id="w0NK">First-party библиотека состоит из двух компонентов: Perception API — функции, касающиеся детекции объектов (в частности, использовались open-vocabulary детекторы <a href="https://arxiv.org/abs/2104.13921" target="_blank">ViLD</a> и <a href="https://arxiv.org/abs/2104.12763" target="_blank">MDETR</a>) и оценки состояния робота, и Control API — функции, касающиеся управления роботом. Важно отметить, что обе эти библиотеки написаны и затюнены людьми. </p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="zONh">Задача LLM — сгенерировать код, который объединит perception и control модули (авторы называют это perception-to-control feedback logic) необходимым для достижения описанной пользователем цели. </p>
  </section>
  <p id="EGd8">Предлагаемый подход также подразумевает иерархическую генерацию кода, подразумевающую как простое использование API-функций, так и генерацию вспомогательных функций и их объединение в основной программе. LLM, использовавшиеся в работе — варианты <a href="https://openai.com/blog/openai-codex" target="_blank">OpenAI Codex</a> и GPT-3.</p>
  <p id="eznV">Промпты довольно сложные. В основном состоят из подсказок (hints — по сути просто аннотации того, что делает пример) и примеров (examples). Примеры делятся на две группы: низкоуровневые (low-level) и высокоуровневые (high-level).</p>
  <p id="n6eq"><strong>Низкоуровневые</strong> примеры показывают LLM, как работать с third-party и first-party библиотеками. </p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="KGdj">Из интересного — авторы говорят, что добавление постфиксов к переменным (например, <em>_np</em> для NumPy-массивов) помогает LLM понять, с какими данными она работает в соответствующей строке, что сильно улучшает качество генерации.</p>
  </section>
  <figure id="rHTO" class="m_original">
    <img src="https://img2.teletype.in/files/19/bf/19bf3dde-4365-40a2-afb2-9964f0a40e2e.png" width="646" />
    <figcaption>Низкоуровневый пример для third-party библиотеки. Серое — промпт, зеленое — входные инструкции для генерации, синее — результат генерации.</figcaption>
  </figure>
  <figure id="AvPa" class="m_original">
    <img src="https://img1.teletype.in/files/47/e7/47e78ecc-3e98-4ac4-bc5d-de0dc4ef851d.png" width="640" />
    <figcaption>Низкоуровневый пример для first-party библиотеки</figcaption>
  </figure>
  <p id="wxkJ">Также к низкоуровневым примерам авторы относят примеры reasoning-а, например, соотношение объектов с их описаниями.</p>
  <p id="ru5E"><strong>Высокоуровневые</strong> примеры по большей части посвящены общей структуре кода и возможности иерархической генерации. Из важных моментов — авторы отмечают:</p>
  <ul id="gZtA">
    <li id="Buc4">LLM может использовать в генерации функции, для которых был описан только интерфейс, но не реализация, что потенциально это позволяет использовать две отдельные языковые модели, одну для реализации функций, другую — для композиции финальной программы.</li>
    <li id="xLP5">Использование возможностей иерархической генерации сильно улучшает качество генерируемого кода и перформанс робота в соответствующих задачах.</li>
  </ul>
  <figure id="fUK7" class="m_original">
    <img src="https://img1.teletype.in/files/0a/aa/0aaa3a5f-70ea-486b-9dfb-0b7ba8e55d9c.png" width="638" />
    <figcaption>Низкоуровневый пример для reasoning-а</figcaption>
  </figure>
  <figure id="9x5C" class="m_original">
    <img src="https://img2.teletype.in/files/19/a7/19a73d29-dba5-4976-81d4-b481b37b4586.png" width="633" />
    <figcaption>Высокоуровневый пример для композиции LMP. Здесь предполагается, что функции, импортируемые из utils, были сгенерированы LLM.</figcaption>
  </figure>
  <figure id="upYU" class="m_original">
    <img src="https://img1.teletype.in/files/c2/44/c2440e64-8759-460a-a739-7aa05093a411.png" width="638" />
    <figcaption>Промпт для генерации функции <em>parse_obj</em> из примера выше</figcaption>
  </figure>
  <figure id="ytG2" class="m_original">
    <img src="https://img2.teletype.in/files/18/dd/18dd19c7-f14d-4599-9534-c4e66b94aa27.png" width="639" />
    <figcaption>Пример сгенерированного кода, содержащий control flows и композицию</figcaption>
  </figure>
  <p id="coRf">Оценка качества генерации кода проводилась на кастомных бенчмарках, и сгенерированные программы-политики запускались на реальных роботах, в частности, для решения задач манипуляции и навигации. </p>
  <p id="bxNH">Предложенный подход частично похож на подход из Language-to-Rewards. Если в последнем был фокус на генерацию скорее псевдокода из списка функций наград и их параметров, то здесь происходит генерация полноценного кода. </p>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="j1ue">Code-as-policies хорошо подходит для генерации высокоуровневого поведения робота, однако, сильно зависит от доступных Perception и Control API. Language-to-rewards же фокусируется скорее на автоматической настройке низкоуровневых контроллеров. В целом, кажется, что эти два подхода могут в будущем дополнить друг друга, позволив одновременно произвести тонкую настройку необходимых скиллов и объединить их в сложное высокоуровневое поведение.</p>
  </section>
  <hr />
  <p id="LQl7"></p>
  <h2 id="Piyg"><strong>6. Заключение</strong></h2>
  <p id="0fth">В данном разборе мы увидели, как можно построить &quot;мост&quot; между LLM и реальным железом. Предложенные подходы имеют разную степень универсальности, но одно из их главных общих преимуществ — возможность сократить потребность в обучении агента. Представленные результаты также говорят о том, что LLM способны производить некий reasoning относительно представлений о движении роботов. В будущем, как отмечают многие авторы, одним из главных направлений исследований в этой области станет применение мультимодальных моделей, которые позволят расширить промпты за пределы текстовой модальности.</p>
  <p id="ZBG2"></p>
  <p id="XeUR"><strong>Автор: @TimeEscaper</strong></p>
  <hr />
  <h2 id="i32j">7 Supplementary: подробнее про MPC</h2>
  <figure id="lLmt" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/79/c3/79c35365-7405-4241-8756-1144278111b9.png" width="632" />
    <figcaption>Постановка задачи MPC</figcaption>
  </figure>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="N8Rc">Дисклеймер: здесь будет много аналогий с RL-ем, поскольку в общем-то MPC и RL имеют общие корни, и некоторые относят MPC к model-based RL, но я все же считаю, что это достаточно сильно разные подходы.</p>
  </section>
  <p id="SiJC">Для начала, приведем небольшую аналогию. Представьте, что вы играете в шахматы. Чаще всего, вы планируете свои действия <em>на несколько ходов вперед</em>, на основе некоторых представлений — то есть <em>модели</em> — действий противника. Имея в голове план на несколько ходов вперед, вы, в соответствии с правилами игры, делаете лишь один ход. Далее, в зависимости от хода противника, вы либо придерживаетесь своего текущего плана, либо составляете новый план, если видите, что действия противника сильно отклоняются от ваших ожиданий. MPC работает по схожей схеме: его задача состоит в создании <strong>плана на <em>H</em> шагов вперед</strong> (либо <em>H</em> секунд, если мы работаем с непрерывной задачей) в соответствии с <strong>заранее известной моделью процессов</strong>. Обычно величину <em>H</em> называют <strong>горизонтом</strong>.</p>
  <p id="aOxF">На изображении выше представлена базовая математическая формулировка задачи MPC (в дискретном и детерминированном случае; непрерывные и стохастические варианты MPC тоже существуют). Здесь векторы <strong>состояний</strong> (states) и <strong>управлений</strong> (controls) имеют те же значения, что и состояния и действия (actions) в RL-е — разница в названиях сложилась исторически. Состояние может включать в себя как непосредственно состояние агента, так и состояние среды, управления же обычно относятся только к агенту. <strong>Модель</strong> представляет собой математическое выражение того, как изменяется состояние агента (и, возможно, среды) в зависимости от приложенного управления. Эта модель может иметь вид как, например, простейших кинематических формул из школьного курса физики, так и сложную систему дифференциальных уравнений. Модель — это тот компонент, который считается неизвестным в model-free RL.</p>
  <p id="ZQMR">Следующий важный компонент — это <strong>функция стоимости (cost)</strong>. Стоимость в MPC играет ту же роль, что и награда (reward) в RL — инкапсулируют нашу задачу. Функцию награды на два компонента: <em>стоимость на этапе (stage cost)</em>, т.е. стоимость на каждом шаге горизонта, и <em>финальную стоимость (final cost)</em> т.е. стоимость в конечном состоянии горизонта, как показано на изображении выше, но это уже детали реализации.</p>
  <section style="background-color:hsl(hsl(0, 0%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="QJD0">Простой пример функции стоимости: расстояние от текущего положения робота до целевой точки в задаче навигации мобильного робота. На практике, правда, добавляются дополнительные члены, связанные с особенностями управления роботом, но об этих деталях мы, возможно, поговорим в отдельном посте.</p>
  </section>
  <p id="8iUp">Важно отметить, как именно происходит минимизация стоимости. Поскольку у нас в явном виде известны и функция стоимости, и наша модель, то у нас в общем-то есть вполне определенная <strong>задача оптимизации</strong>, и, соответственно, мы можем воспользоваться аппаратом <em>методов оптимизации</em>. Оптимизация в MPC — отдельная большая тема, поэтому пока что лишь кратко упомяну, что здесь довольно популярны алгоритмы <a href="https://en.wikipedia.org/wiki/Convex_optimization" target="_blank">выпуклой оптимизации</a> и <a href="https://en.wikipedia.org/wiki/Nonlinear_programming" target="_blank">нелинейного программирования</a>. Существуют также и альтернативные методы решения данной задачи, например, за счет <a href="https://en.wikipedia.org/wiki/Differential_dynamic_programming" target="_blank">динамического программирования</a> или <a href="https://en.wikipedia.org/wiki/Cross-entropy_method" target="_blank">сэмплирования</a>, но об этом, возможно, тоже в отдельном посте. Пока что важно усвоить отличие от RL-я: <strong>здесь мы не используем никакого обучения</strong>, а <em>напрямую</em> решаем нашу задачу минимизации стоимости в соответствии с используемой моделью.</p>
  <p id="NbjZ">Последний важный компонент в MPC — это <strong>ограничения</strong> (constraints). Использование методов оптимизации, многие из которых подразумевают решение задачи оптимизации с ограничениями, позволяет нам в явном виде учитывать ограничения системы, с которой мы работаем — это одна из главных причин, по которой MPC стал популярен в индустрии. В простейшем виде ограничения могут иметь вид, например, отрезков, в которых могут находится компоненты вектора управлений (конкретный пример — ограничения на управляющий сигнал скорости робота). Ограничения можно наложить и на состояния агента — возвращаясь к примеру с навигацией мобильного робота, мы можем наложить ограничения на положение робота для избежания столкновений с объектами на карте.</p>
  <p id="6NwB">Выше мы упоминали, что на выходе MPC выдает план — этот план имеет вид последовательности управлений на <em>H</em> шагов вперед. На практике, из этой последовательности применяется <strong>только первое управление</strong>, после чего вновь начинается процесс планирования (вспоминаем пример с шахматами выше). Такая схема позволяет, с одной стороны, выработать управление, которое будет оптимально в контексте будущего, и, с другой стороны, быть более устойчивым к внезапным изменениям во внешней среде.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@awesome_dl/rl2robots</guid><link>https://teletype.in/@awesome_dl/rl2robots?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=awesome_dl</link><comments>https://teletype.in/@awesome_dl/rl2robots?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=awesome_dl#comments</comments><dc:creator>awesome_dl</dc:creator><title>Reinforcement Learning для управления четвероногими роботами</title><pubDate>Sun, 13 Aug 2023 09:50:41 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d4/66/d466e90e-5add-47fd-9e72-ab12b9bf11a3.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/e3/b9/e3b908e6-9fc2-461c-93c3-5fb07df7c7ea.png"></img>TLDR: Обзор трех работ от одной из ведущих лабораторий ETH Zürich, посвященных управлению четвероногими роботами с помощью RL-я.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="gi56"><strong>TLDR:</strong> Обзор трех работ от одной из ведущих лабораторий ETH Zürich, посвященных управлению четвероногими роботами с помощью RL-я.</p>
  </section>
  <p id="vvvy">Всем привет! В этом посте перейдем непосредственно к более детальному рассмотрению применения ML в роботехнике, а именно - рассмотрим, как RL помогает управлять робо-собаками (они же legged robots, они же quadruped robots), разобрав 3 статьи от авторов из ETH Zürich. Я выбрал их, т.к. они сами по себе довольно влиятельные, а также хорошо демонстрируют ряд приемов, помогающих RL-ю работать в реальном мире.</p>
  <p id="mm0B">Ко всем разобранным статьям настоятельно рекомендую смотреть видео-презентации, чтобы так сказать сфьюзить информацию из данного разбора и информацию от самих авторов работ, и в целом понять, о каких проблемах идет речь.</p>
  <hr />
  <p id="iHNV"></p>
  <h3 id="vIJI">1. Зачем нам вообще здесь RL?</h3>
  <p id="bl8u">Как мы обсуждали в <a href="https://t.me/awesome_dl/35" target="_blank">вводном посте</a>, для управления движением роботов используются аппарат теории управления, а также теории оптимального управления. Для управления четвероногими роботами существуют довольно сильные &quot;классические&quot; бейзлайны, в частности, на основе <a href="https://en.wikipedia.org/wiki/Model_predictive_control" target="_blank">Model Predictive Control </a>(MPC, более детально этот метод, я думаю, мы рассмотрим в следующих постах). Главный недостаток подобных методов - это их <strong>сложность</strong>. Математические модели для данного типа роботов очень сложные (в отличие, например, от большинства колесных роботов), особенно, если попробовать учесть изменяющиеся параметры внешней среды; для этих моделей сложно определять параметры. Поэтому одна из основных областей робототехники, где был популяризирован RL - это именно четвероногие роботы.</p>
  <hr />
  <p id="SG1o"></p>
  <h3 id="LeA1">2. Learning agile and dynamic motor skills for legged robots (Hwangbo et al., 2019)</h3>
  <blockquote id="Xn4Y"><a href="https://arxiv.org/pdf/1901.08652.pdf" target="_blank">Link</a></blockquote>
  <figure id="AIIn" class="m_column">
    <iframe src="https://www.youtube.com/embed/aTDkYFZFWug?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <p id="vEpX">В первой работе, которую мы рассмотрим, авторы решают 3 типа задач с помощью RL: </p>
  <ul id="eyKd">
    <li id="UTnb">Command-conditioned locomotion (движение в соответствии командам с пульта);</li>
    <li id="d9rm">High-speed locomotion (&quot;бег галопом&quot; — движение, обычно, вдоль прямой на высокой скорости);</li>
    <li id="NDOY">Recovery from a fall (учили робота <s>вставать с колен</s> подниматься из &quot;лежачего&quot; или &quot;полулежачего&quot; положения).</li>
  </ul>
  <p id="7pBp">Во всех задачах использовался алгоритм  <a href="https://openai.com/research/openai-baselines-ppo" target="_blank">Proximal Policy Optimization </a>(PPO) — популярный RL-алгоритм, возможно, известный многим по RLHF. Все сети внутри PPO (если совсем упрощенно, то это сети <em>актора — </em>отвечает за выходные действия агента, и <em>критика — </em>отвечает за оценку состояния; именно первую сеть мы далее будем называть <em>политикой</em>) имеют вид простых MLP. </p>
  <p id="RqlE">Наблюдения включали в себя историю положений и скоростей &quot;тела&quot; робота (имеется в виду основной корпус, к которому крепятся ноги), состояния суставов и ряд вспомогательных компонентов в зависимости от задачи (см. картинку ниже).</p>
  <figure id="nTLD" class="m_custom">
    <img src="https://img3.teletype.in/files/2c/41/2c411b45-f4eb-47f7-ba59-5d8b2bd44abe.png" width="519" />
  </figure>
  <p id="wHfq">Команда представляет собой  вектор, состоящий из:</p>
  <ul id="DoYp">
    <li id="HJfz"><strong>Поступательную скорость</strong> (forward velocity, м/c) - компонент скорости, направленный вдоль тела робота;</li>
    <li id="YGtH"><strong>Боковую скорость</strong> (lateral velocity, м/c) — компонент скорости, направленный перпендикулярно телу;</li>
    <li id="bwJZ"><strong>Скорость поворота</strong> (turning rate, рад/c) — по сути, угловая скорость тела робота. </li>
  </ul>
  <p id="4a9w">Так, команда [1., 1., 0.] заставит робота пройтись по диагонали без поворота корпуса, а команда [1., 0., 0.5] — завернуть направо (или налево, в зависимости от ориентации координат). В реальном мире эти скорости задаются с помощью пульта управления, а во время обучения в симуляторе — сэмплируются из равномерного распределения с началом каждого нового эпизода. </p>
  <p id="ZHnG">Функция награды представляет собой взвешенную сумму довольно большого количества компонентов (специально ограничиваюсь смысловым описанием, для тех, кому знакомы основы теоретической механики и хочет разобраться подробнее — добро пожаловать в supplementary materials статьи):</p>
  <ul id="Grs4">
    <li id="z6PE"><em>Ошибка по линейным и угловым скоростям</em>: очевидно, что reward должен поощрять соответствие актуальных скоростей тела входной команде</li>
    <li id="GfFm"><em>Штрафы на моменты на выходе приводов и скорости суставов</em>: это своего рода регуляризация, ограничивающая величины соответствующих моментов и скоростей. Идея в следующем: мы хотим достигать скорости не за счет использования больших мощностей в лоб, а за счет более &quot;умного&quot; переставления ног — эти штрафы как раз &quot;вдохновляют&quot; агента искать эти более умные схемы.</li>
    <li id="pAKh"><em>Штрафы на положения и скорости ступней</em>: мы хотим избежать проскальзывания ступней, а также их высокого отрыва от земли</li>
    <li id="4dHN"><em>Штраф на ориентацию тела робота</em>: для большей устойчивости, мы хотим, чтобы тело робота всегда находилось как можно более параллельно земле</li>
    <li id="E6lu"><em>Штраф за резкое изменение моментов на выходе приводов</em>: мы хотим достичь более гладкого движения робота, поэтому штрафуем большие разности моментов между двумя последовательными шагами в эпизоде</li>
  </ul>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="g5jo">Из интересного стоить отметить сильное влияние discount factor-а в PPO, которое отмечают авторы.</p>
  </section>
  <p id="lBzy">Самые интересные детали статьи касаются приемов, которые применялись, чтобы вся эта RL-ная история заработала в реальном мире.</p>
  <figure id="6JTX" class="m_column">
    <img src="https://img1.teletype.in/files/42/98/42984ab9-8d30-4ad5-8eb7-1917ed66316a.png" width="985" />
  </figure>
  <p id="o4WN"><strong>Первое - это использование самописного симулятора RaiSim</strong> (сейчас он является отдельным <a href="https://raisim.com/" target="_blank">проектом</a> этой лаборатории), который, как утверждают авторы, очень точно моделирует динамику твердого тела, и при этом эффективен с точки зрения вычислений, что также позволяет ускорить обучение.</p>
  <p id="dmaS"><strong>Второе - это предложенный способ моделирования приводов (actuators) робота</strong>. Как упоминают авторы, задача моделирования приводов, в частности, гидравлических и электрических, которые очень часто применяются в лучших робо-собаках, очень сложна, в связи с чем достичь реалистичной симуляции становится намного сложнее. Авторы предложили следующий интересный подход: они собрали датасет с входными и выходными (т.е. моментами) сигналами на реальных приводах, и обучили соответствующую нейросеть. В итоге они получили нейросетевую модель приводов, которая далее была использована в симуляторе, что позволило сделать симуляцию более реалистичной.</p>
  <p id="YZ48"><strong>Третье - применение техники <a href="https://lilianweng.github.io/posts/2019-05-05-domain-randomization/" target="_blank">Domain Randomization</a>. </strong>Как показывает практика, это один из самых эффективных методов решения проблемы sim-to-real transfer и повышения robustness RL-политики (в какой-то степени, его можно сравнить с теми же аугментациями из supervised learning). Идея довольно проста: в ходе обучения в симуляторе рандомизируются разные параметры симуляционной модели, в нашем случае, например, параметры массы робота, трения, начальных положений робота и др.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="eK7E">Главное результаты, которых удалось достичь с помощью всех предложенных подходов:</p>
    <ul id="sxnu">
      <li id="s75O">Упрощенный деплой на реального робота</li>
      <li id="iX3R">Увеличение робастности управления роботом</li>
      <li id="MOX2">Сокращение потребляемых вычислительных ресурсов (все-таки теперь почти вся система управления — это один перцептрон)</li>
      <li id="pXZQ">Повышение энергоэффективности — в первую очередь как раз за приложение меньших моментов для достижения тех же скоростей</li>
    </ul>
  </section>
  <hr />
  <h3 id="bqcI">3. Learning quadrupedal locomotion over challenging terrain (Lee et al., 2020)</h3>
  <blockquote id="AkIE"><a href="https://arxiv.org/abs/2010.11251" target="_blank">Link</a></blockquote>
  <p id="U6G5">Эта статья развивает идеи предыдущей работы. Если в предыдущей работе рассматривалось управление роботом только на ровных поверхностях в indoor-средах, то в этой работе авторы поставили цель выйти &quot;на природу&quot;, причем довольно экстремальную. То есть, цель работы - расширить предложенный RL-подход на &quot;неровные&quot; ourtdoor-среды. </p>
  <figure id="5OAS" class="m_custom">
    <iframe src="https://www.youtube.com/embed/9j2a1oAHDL8?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <p id="BPzB">Поскольку работа в своей основе переиспользует ряд техник из предыдущей работы (симулятор, domain randomization и нейронную модель приводов), то сразу перейдем к рассмотрению новых приемов, которые позволили достичь впечатляющих результатов в реальном мире.</p>
  <figure id="ic9w" class="m_original">
    <img src="https://img3.teletype.in/files/28/ec/28ecbcc8-64ea-41ac-837b-fb905d704624.png" width="991" />
  </figure>
  <p id="fHG5"><strong>Первое - это применение техники на основе подхода <a href="https://arxiv.org/abs/1912.12294" target="_blank">Learning by Cheating</a>. </strong></p>
  <p id="gwP2">Суть состоит в следующем: есть две политики - политика-учитель (teacher policy) и политика-студент (student policy). Политика-учитель обучается с помощью RL-я, и её пространство наблюдений состоит из двух компонентов. Первый включает непосредственно те наблюдения, которые будут использоваться на реальном роботе. Авторы называют их <strong>проприоцептивными (proprioceptive)</strong> наблюдениями, что, говоря простым языком, означает наличие информации только о состоянии робота (в частности, положение тела робота и положения суставов) и отсутствие явных наблюдений о внешнем мире (таких как изображения с камер или данные о контактах ног с поверхностью). Соответственно, политика, которая использует только проприоцептивные наблюдения, называется <strong>проприоцептивной политикой</strong>. Второй компонент авторы называют <strong>привилегированной информацией (privileged information)</strong> - это некая ground truth-информация, которую практически невозможно извлечь в реальном мире, но легко извлечь в симуляторе (в частности, она включала в себя информацию о контактах ног робота с поверхностью, профиль поверхности, параметры трения и др.). Привилегированная информация позволяет значительно упростить процесс обучения, и достичь очень хорошего перформанса в симуляторе.</p>
  <p id="08Ka">А далее происходит основной трюк: модель-учитель, которая <u>обучена с добавление привилегированной информации</u>, дистиллируется на модель-студента, которая использует <strong>только проприоцептивных наблюдений. </strong>То есть модель студент учится выдавать такие же действия, которые выдала бы политика-учитель на основе тех же проприоцептивных наблюдений и привилегированной информации.</p>
  <p id="fPFr"><strong>Второй прием - это domain randomization и  <a href="https://arxiv.org/abs/2003.04960" target="_blank">curriculum learning</a>. <br /><br /></strong>Идея curriculum learning в контексте RL, а точнее, как указывают авторы, automatic curriculum learning, заключается в постепенном усложнении среды по мере улучшения перформанса агента. Также наоборот, среду можно упрощать, если вдруг перформанс агента начинает проседать.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="0ttl">Если модель легко решает задачи мы их усложняем и наоборот.</p>
  </section>
  <p id="y3Zq">Здесь авторы рандомизируют форму поверхности, используя три паттерна: &quot;впадинки&quot; (steps), лесенки (stairs) и холмики (hills). Для оценки перформанса агента нужна какая-то эвристика, и зачастую ей выступает какая-то статистика наград. Но награды зачастую тяжело интерпретировать, чтобы построить правила и параметры для curriculum-а. Поэтому, авторы предлагают использовать намного более интерпретируемую оценку - проходимость поверхности текущей политикой робота, из которой далее выводятся параметры для сэмплирования поверхностей.</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="LyZN">Результаты из видео-презентации, в общем-то, говорят сами за себя. Один из главных показателей, которых удалось достичь - это адаптация политики на реальном роботе к ситуациям, которые в явном виде не были моделированы в ходе обучения, например, застревание ног робота в земле или растительности.</p>
  </section>
  <h3 id="kFy5">4. Learning robust perceptive locomotion for quadrupedal robots in the wild (Miki et al., 2022)</h3>
  <blockquote id="15Hq"><a href="https://arxiv.org/abs/2201.08117" target="_blank">Link</a></blockquote>
  <figure id="zTHL" class="m_column">
    <iframe src="https://www.youtube.com/embed/zXbb6KQ0xV8?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <p id="o0lK">Наконец, третья статья из 2022 года завершит логическую цепочку в данном обзоре. Настоятельно рекомендую к просмотру видео-презентацию!</p>
  <p id="5UfQ">Как было упомянуто выше, предыдущая работа была посвящена проприоцептивной политике. Главный её недостаток — это определение ситуаций, мешающих движению, пост-фактум. Пример из предыдущей видео-презентации — нога робота сталкивается со ступенькой, только после этого политика понимает, что перед роботом — препятствие, которое нужно пройти. Наличие наблюдений о внешнем мире позволило бы заранее выработать нужную походку для обхождения препятствия. </p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="lY8M">Так, авторы ставят цель соединить проприоцептивную информацию и <strong>экстероцептивные (exteroceptive) информацию</strong> - информацию о внешнем мире, получаемую, в первую очередь, с помощью сенсоров вроде <a href="https://velodynelidar.com/what-is-lidar/" target="_blank">LiDAR-ов</a> и <a href="https://www.e-consystems.com/blog/camera/technology/what-is-a-stereo-vision-camera-2/" target="_blank">стерео-камер</a>.</p>
  </section>
  <p id="tqyl">Экстероцептивные информация имеет следующий вид. С помощью LiDAR-а и/или стереокамеры выполняется построения локальной карты высот (elevation map) - эта карта показывает уровень &quot;возвышенностей&quot; на поверхности вокруг робота. Из этой карты сэмплируется множество точек в окрестностях ног робота - это множество относительных высот и является используемой далее информацией о мире (назовем это экстероцептивным наблюдением).</p>
  <figure id="jbZl" class="m_original">
    <img src="https://img4.teletype.in/files/b1/89/b189ea40-0c88-44d7-b31a-f3e5a63a1ffc.png" width="514" />
  </figure>
  <p id="CxPF">Схема обучения также основана на предыдущих статьях - применяется и learning by cheating, и другие приемы. Однако, структуры и политики-учителя, и политики-студента, модифицированы:</p>
  <ul id="lGEz">
    <li id="Wjcm">Политика-учитель, помимо проприоцептивного наблюдения и ground truth-привилегированной информации, также получает GT-экстероцептивное наблюдение, и так же обучается с помощью PPO по схеме с curriculum.</li>
    <li id="KI4d">Политика-студент получает проприоцептивное наблюдение и <strong>зашумленное </strong>экстероцептивное наблюдение. Теперь студент не пытается &quot;вслепую&quot; повторять за учителем, а пытается сначала <strong>оценить</strong> привилегированную информацию на основе экстероцептивных наблюдений, и далее использовать эту оценку —точнее, её латент, который авторы называют <strong>belief state</strong> — для повторения за учителем.</li>
  </ul>
  <p id="cfxR">За эту оценку отвечает автоэнкодер-подобная структура из блоков belief encoder (используется при обучении и деплое) и belief decoder (используется только при обучении). Декодер обучается восстанавливать привилегированную информацию и исходное экстероцептивное наблюдение с помощью <u>reconstruction loss</u> — расстоянием между GT и восстановленными данными. Цель всей этой схемы — связать belief state с недоступными GT-экстероцептивным наблюдением и привилигерованной информацией. Второй лосс - <u>behaviour loss</u> - отвечает за соответствие выходных действий политике-учителю, как в предыдущей работе.</p>
  <figure id="IrgS" class="m_original">
    <img src="https://img3.teletype.in/files/ee/e1/eee1b489-d4c8-4f44-8a8f-13d00a573f5c.png" width="1007" />
  </figure>
  <p id="7xjo">Важно отметить роль attention-а в belief encoder: сколько использовать информации из экстероцептивного наблюдения. Проблема в том, что построенная карта высот может не всегда быть надежной — из-за шума или от природы самой поверхности. Авторы приводят интересный пример со снегом: на карте он выглядит как возвышенность, но по факту, наступив на него, робот проваливается. В этом случае за счет attention-а и рекуррентной структуры энкодер поймет, что экстероцептивному наблюдению нельзя сильно доверять, и будет использовать больше проприоцептивной информации.</p>
  <figure id="3AsB" class="m_original">
    <img src="https://img1.teletype.in/files/45/7f/457ff109-6c7d-43ae-8d95-f8a5d3035f8f.png" width="868" />
  </figure>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="xQFA">Резюмируя, авторы предложили очень интересную схему, которая, с одной стороны, позволяет эффективно использовать экстероцептивные наблюдения, когда они надежны, что значительно улучшает качество походки, и, с другой стороны, позволяет автоматически переключиться на практически только проприоцептивные наблюдения, что значительно увеличивает робастность политики в &quot;краевых&quot; случаях.</p>
  </section>
  <hr />
  <h3 id="RVLc">5. Заключение</h3>
  <p id="zpo3">На примере данных работ я хотел показать, какие техники позволяют запускать RL в сложных задачах управления на реальных роботах, а также эффективно использовать информацию от различных сенсоров. От этой и других рисерч групп в ETH есть много других статей на тему ML-я для четвероногих роботов (так, они уже вовсю рассматривают возможность <a href="https://www.youtube.com/watch?v=20gS20EFDe8" target="_blank">использования подобных роботов на Марсе</a>), а также развивают и <a href="https://www.youtube.com/watch?v=m3rJWJVzYuY" target="_blank">более классические бейзлайны</a>. Вообще, эта тема довольно популярная, и у других лабораторий тоже есть прикольные результаты (например, работа <a href="https://arxiv.org/abs/2107.04034" target="_blank">RMA: Rapid Motor Adaptation for Legged Robots</a> от ребят из Berkley и CMU). </p>
  <p id="dTOM">Также стоит учесть, что ETH фокусируется на роботах семейства ANYmal - одних из самых продвинутых и крупных в своем роде. Однако, многие из описанных выше методов применялись и для более простых роботов.</p>
  <p id="MtBE">Stay tuned!</p>
  <p id="ZYFY"><strong>Автор: @TimeEscaper</strong></p>

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