File size: 32,794 Bytes
299bfda
 
 
 
 
f5aea10
299bfda
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f5aea10
299bfda
 
 
f5aea10
299bfda
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f5aea10
299bfda
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f5aea10
299bfda
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f5aea10
299bfda
f5aea10
299bfda
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
<!doctype html>
<html lang="ru">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>Multi-Motions 28 — двуязычный EN/RU классификатор эмоций</title>
  <meta name="description" content="Как из GoEmotions была построена одна EN/RU multi-label модель на 28 эмоций, как она проверялась на translated и native Russian benchmarks, и как использовать модель через Transformers." />
  <meta name="author" content="Илья Зеленский (proxy3d)" />
  <meta property="article:author" content="Илья Зеленский (proxy3d)" />
  <style>
    :root {
      --bg:#0b1020; --panel:#11182b; --panel2:#151e34; --text:#e8edf7; --muted:#aab5ca;
      --line:#26334f; --accent:#7dd3fc; --accent2:#a7f3d0; --warn:#fde68a; --max:1120px;
    }
    *{box-sizing:border-box} html{scroll-behavior:smooth}
    body{margin:0;background:linear-gradient(180deg,#08101f 0,#0b1020 28rem,#0b1020 100%);color:var(--text);font:16px/1.68 Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}
    a{color:var(--accent);text-decoration:none} a:hover{text-decoration:underline}
    .wrap{max-width:var(--max);margin:auto;padding:0 28px}
    header{padding:74px 0 44px;border-bottom:1px solid var(--line)}
    .eyebrow{font-size:.8rem;letter-spacing:.16em;text-transform:uppercase;color:var(--accent2);font-weight:800}
    h1{font-size:clamp(2.25rem,6vw,4.8rem);line-height:1.03;letter-spacing:-.045em;margin:.5rem 0 1.2rem;max-width:1000px}
    .lead{font-size:1.2rem;max-width:880px;color:#c7d2e7}
    .stats{display:grid;grid-template-columns:repeat(5,1fr);gap:12px;margin-top:34px}
    .stat{background:rgba(17,24,43,.78);border:1px solid var(--line);border-radius:15px;padding:18px}
    .stat b{display:block;font-size:1.65rem;color:#fff}.stat span{color:var(--muted);font-size:.88rem}
    nav{position:sticky;top:0;z-index:10;background:rgba(11,16,32,.9);backdrop-filter:blur(14px);border-bottom:1px solid var(--line)}
    nav .wrap{display:flex;gap:24px;overflow:auto;padding-top:12px;padding-bottom:12px;white-space:nowrap;font-size:.91rem}
    main{padding:42px 0 70px} section{scroll-margin-top:70px;margin:0 0 66px}
    h2{font-size:2rem;letter-spacing:-.025em;margin:0 0 18px} h3{font-size:1.25rem;margin:32px 0 10px}
    p{max-width:920px;color:#d5dcec}.muted{color:var(--muted)}
    .callout{border:1px solid #31506f;background:#0e1b2e;border-radius:16px;padding:18px 20px;margin:22px 0;max-width:980px}
    .callout strong{color:#fff}
    .flow{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:26px 0}
    .flow .box{position:relative;background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:20px;min-height:150px}
    .flow .num{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;background:#183148;color:var(--accent);font-weight:800;margin-bottom:12px}
    .flow b{display:block;margin-bottom:5px}.flow small{color:var(--muted)}
    .labels{display:flex;flex-wrap:wrap;gap:7px;margin:16px 0 24px}.labels span{border:1px solid var(--line);background:var(--panel);padding:5px 9px;border-radius:999px;font-size:.82rem;color:#cbd6ea}
    .table-wrap{overflow:auto;border:1px solid var(--line);border-radius:16px;margin:20px 0}
    table{border-collapse:collapse;width:100%;min-width:760px;background:var(--panel)}
    th,td{text-align:left;padding:13px 15px;border-bottom:1px solid var(--line);vertical-align:top}
    th{font-size:.82rem;letter-spacing:.03em;text-transform:uppercase;color:#adbad2;background:#101a2f}
    tr:last-child td{border-bottom:0}.best{color:var(--accent2);font-weight:750}.note{color:var(--warn)}
    .metric-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:20px 0}
    .metric-card{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:18px}
    .metric-card h4{margin:0 0 13px;font-size:1.05rem}
    .bar-row{display:grid;grid-template-columns:110px 1fr 55px;gap:10px;align-items:center;margin:9px 0;font-size:.88rem}
    .bar{height:9px;background:#202c45;border-radius:999px;overflow:hidden}.bar>i{display:block;height:100%;background:linear-gradient(90deg,#38bdf8,#a7f3d0);border-radius:inherit}
    pre{background:#070b14;border:1px solid var(--line);border-radius:15px;padding:18px;overflow:auto;color:#d9e5f7;font-size:.88rem;line-height:1.55}
    code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
    .compare td:first-child{font-weight:650;color:#fff}.badge{display:inline-block;padding:2px 8px;border:1px solid #395472;border-radius:999px;font-size:.72rem;color:#bfe9ff}
    footer{border-top:1px solid var(--line);padding:30px 0 60px;color:var(--muted)}
    .author-card{display:flex;flex-wrap:wrap;gap:10px 22px;align-items:center;margin:18px 0 4px;color:#c7d2e7;font-size:.96rem}.author-card b{color:#fff}.author-card a{font-weight:650}
    ol.refs{padding-left:22px;max-width:980px}.refs li{margin:9px 0;color:#bdc8db}
    @media(max-width:850px){.stats{grid-template-columns:repeat(2,1fr)}.flow{grid-template-columns:1fr 1fr}.metric-grid{grid-template-columns:1fr}}
    @media(max-width:560px){.wrap{padding:0 18px}.flow{grid-template-columns:1fr}.stats{grid-template-columns:1fr 1fr}header{padding-top:48px}}
  </style>
</head>
<body>
<header>
  <div class="wrap">
    <div class="eyebrow">Text emotion classification · EN / RU</div>
    <h1>Multi-Motions 28: двуязычная модель на 28 эмоций</h1>
    <p class="lead">Мы построили одну XLM‑RoBERTa модель, которая возвращает одинаковый 28‑мерный вектор эмоций для английского и русского текста, а затем проверили её не только на переведённом GoEmotions, но и на двух независимых наборах с изначально русскими текстами.</p>
    <div class="author-card">
      <span><b>Автор:</b> Илья Зеленский (proxy3d)</span>
      <span><b>Hugging Face:</b> <a href="https://huggingface.co/proxy3d/multi-motions-28" target="_blank" rel="noopener">proxy3d/multi-motions-28</a></span>
      <span><b>Телеграмм канал:</b> <a href="https://t.me/greenruff" target="_blank" rel="noopener">@greenruff</a></span>
      <span><b>Связанный проект:</b> <a href="https://iproxy3d.github.io/communication-styles-llm/" target="_blank" rel="noopener">Communication Styles LLM</a></span>
    </div>
    <div class="stats">
      <div class="stat"><b>28</b><span>GoEmotions labels</span></div>
      <div class="stat"><b>2</b><span>языка в одной модели</span></div>
      <div class="stat"><b>67,144</b><span>training IDs</span></div>
      <div class="stat"><b>3</b><span>independent seeds</span></div>
      <div class="stat"><b>2</b><span>native‑RU holdouts</span></div>
    </div>
    <div class="callout" style="margin-top:22px;max-width:1000px">
      <strong>Зачем использовать эту модель.</strong> Один checkpoint работает сразу с английским и русским, возвращает не 5–6 базовых классов, а полный 28‑мерный GoEmotions‑вектор, устойчиво воспроизводится на трёх seed и переносится на независимые native‑Russian корпуса без дообучения на них.
    </div>
  </div>
</header>
<nav><div class="wrap"><a href="#model">1. Что построено</a><a href="#data">Данные</a><a href="#difference">Отличия</a><a href="#benchmarks">2. Бенчмарки</a><a href="#comparison">Как читать результаты</a><a href="#fit">Когда использовать</a><a href="#usage">3. Код</a><a href="#limits">Ограничения</a></div></nav>
<main class="wrap">
<section id="model">
  <h2>1. Что мы построили</h2>
  <p>Исходной точкой стал <a href="https://aclanthology.org/2020.acl-main.372/">GoEmotions</a>: английский multi‑label корпус Reddit с 27 категориями эмоций и <code>neutral</code>. В simplified split находятся 43,410 training, 5,426 validation и 5,427 test примеров. Вместо создания отдельного русского классификатора с другой таксономией мы сохранили все 28 координат и обучили одну мультиязычную модель на базе <a href="https://huggingface.co/FacebookAI/xlm-roberta-base">XLM‑RoBERTa base</a>.</p>
  <p>На выходе нет обязательного выбора одной эмоции. Каждая координата имеет собственный sigmoid score, поэтому один текст может одновременно выражать, например, <em>gratitude</em>, <em>joy</em> и <em>approval</em>. Такой формат удобен не только для классификации, но и как непрерывное эмоциональное представление для агентов, диалоговых систем и downstream‑логики.</p>
  <div class="labels">
    <span>admiration</span><span>amusement</span><span>anger</span><span>annoyance</span><span>approval</span><span>caring</span><span>confusion</span><span>curiosity</span><span>desire</span><span>disappointment</span><span>disapproval</span><span>disgust</span><span>embarrassment</span><span>excitement</span><span>fear</span><span>gratitude</span><span>grief</span><span>joy</span><span>love</span><span>nervousness</span><span>optimism</span><span>pride</span><span>realization</span><span>relief</span><span>remorse</span><span>sadness</span><span>surprise</span><span>neutral</span>
  </div>
</section>

<section id="data">
  <h2>Как получили EN/RU обучающий корпус</h2>
  <div class="flow">
    <div class="box"><div class="num">1</div><b>GoEmotions</b><small>Официальный simplified split и исходная 28‑label разметка. English остаётся исходным языком.</small></div>
    <div class="box"><div class="num">2</div><b>Aligned Russian</b><small>Английские тексты переводились на русский emotion‑aware LLM‑переводом. EN/RU пара всегда оставалась в одном исходном split.</small></div>
    <div class="box"><div class="num">3</div><b>Long‑tail synthetic</b><small>Добавлен целевой synthetic слой для редких и плохо покрытых эмоций, примерно 12k training‑примеров.</small></div>
    <div class="box"><div class="num">4</div><b>Human-written augmentation</b><small>EmpatheticDialogues, ISEAR, MELD и SemEval‑2018 были приведены к общей GoEmotions‑таксономии; для уверенных human‑примеров использованы soft targets.</small></div>
  </div>
  <p>Финальный training source содержит <strong>67,144 уникальных IDs</strong> и <strong>134,288 EN/RU views</strong>. Из них 55,346 обучаются как hard‑label примеры, 11,798 human-written примеров используют сохранённые soft confidence targets. Для последней группы слабые scores ниже 0.75 не передаются в loss как положительный сигнал.</p>
  <div class="callout"><strong>Ключевой принцип.</strong> Русский язык не создаёт отдельную emotion ontology. Английский и русский тексты обучаются в одной координатной системе, поэтому выход модели имеет одинаковый смысл независимо от языка.</div>
</section>

<section id="difference">
  <h2>Чем подход отличается от типичного русского emotion classifier</h2>
  <p>Большинство русских benchmark‑корпусов покрывают 5–6 базовых эмоций и оптимизируют модель непосредственно под конкретный набор. Здесь задача другая: сохранить fine‑grained 28‑мерное пространство GoEmotions и сделать его двуязычным, не обучая отдельные головы или отдельные модели для EN и RU.</p>
  <div class="table-wrap"><table>
    <thead><tr><th>Свойство</th><th>Этот проект</th><th>Типичный benchmark classifier</th></tr></thead>
    <tbody>
      <tr><td>Таксономия</td><td>27 fine-grained эмоций + neutral</td><td>Обычно 5–7 базовых эмоций</td></tr>
      <tr><td>Языки</td><td>EN и RU в одной модели и одном label space</td><td>Отдельная модель под язык/датасет</td></tr>
      <tr><td>Выход</td><td>Полный 28-D sigmoid vector</td><td>Часто бинарные/категориальные labels</td></tr>
      <tr><td>Русская проверка</td><td>Translated GoEmotions + два native-RU holdout</td><td>Train/test внутри одного русского корпуса</td></tr>
      <tr><td>External holdout</td><td>Не использовался для обучения или настройки thresholds</td><td>Часто benchmark train/dev используется для fine-tuning</td></tr>
      <tr><td>Reproducibility</td><td>3 независимых seed</td><td>Зависит от конкретной работы</td></tr>
    </tbody>
  </table></div>
</section>

<section id="benchmarks">
  <h2>2. Бенчмарки и инженерная проверка</h2>
  <p>Финальную конфигурацию обучили трижды с разными random seeds. Все значения ниже — <strong>mean ± population std</strong>. Для checkpoint selection использовался threshold‑free macro Average Precision на внутренней validation, а не external Russian benchmarks.</p>

  <h3>GoEmotions: EN и переведённый RU</h3>
  <div class="table-wrap"><table>
    <thead><tr><th>Test</th><th>Micro‑F1</th><th>Macro‑F1</th><th>Micro‑AP</th><th>Macro‑AP</th></tr></thead>
    <tbody>
      <tr><td>English</td><td class="best">0.5953 ± 0.0017</td><td>0.5196 ± 0.0035</td><td class="best">0.6366 ± 0.0041</td><td>0.5065 ± 0.0028</td></tr>
      <tr><td>Russian translation</td><td>0.5654 ± 0.0014</td><td>0.4826 ± 0.0050</td><td>0.5950 ± 0.0023</td><td>0.4609 ± 0.0057</td></tr>
    </tbody>
  </table></div>
  <p class="muted">Это проверка одной и той же 28‑label задачи на выровненных EN/RU данных. Малый разброс между seed показывает, что итог не зависит от одного удачного обучения.</p>

  <h3>Native Russian: данные, которые не были переводом GoEmotions</h3>
  <p>Для проверки переноса мы использовали два независимых корпуса. <a href="https://github.com/sag111/CEDR">CEDR</a> содержит изначально русские тексты из Twitter, LiveJournal и Lenta.ru и размечает пять эмоций. Русская часть <a href="https://aclanthology.org/2025.semeval-1.327/">SemEval‑2025 Task 11 / BRIGHTER</a> размечает шесть базовых эмоций. Мы оценивали только пересекающиеся координаты модели; остальные GoEmotions labels не считались отрицательными.</p>
  <div class="table-wrap"><table>
    <thead><tr><th>Native‑RU benchmark</th><th>N</th><th>Shared labels</th><th>Micro‑F1</th><th>Macro‑F1</th><th>Macro‑AP</th></tr></thead>
    <tbody>
      <tr><td>CEDR test</td><td>1,882</td><td>5</td><td>0.5180 ± 0.0135</td><td>0.5295 ± 0.0181</td><td class="best">0.6762 ± 0.0079</td></tr>
      <tr><td>SemEval‑2025 RU test</td><td>1,000</td><td>6</td><td>0.6355 ± 0.0142</td><td>0.6332 ± 0.0180</td><td class="best">0.8448 ± 0.0047</td></tr>
    </tbody>
  </table></div>
  <div class="metric-grid">
    <div class="metric-card"><h4>CEDR · AP по эмоциям</h4>
      <div class="bar-row"><span>joy</span><div class="bar"><i style="width:73.9%"></i></div><b>.739</b></div>
      <div class="bar-row"><span>sadness</span><div class="bar"><i style="width:73.8%"></i></div><b>.738</b></div>
      <div class="bar-row"><span>fear</span><div class="bar"><i style="width:73.6%"></i></div><b>.736</b></div>
      <div class="bar-row"><span>surprise</span><div class="bar"><i style="width:66.3%"></i></div><b>.663</b></div>
      <div class="bar-row"><span>anger</span><div class="bar"><i style="width:50.5%"></i></div><b>.505</b></div>
    </div>
    <div class="metric-card"><h4>SemEval‑2025 RU · AP по эмоциям</h4>
      <div class="bar-row"><span>fear</span><div class="bar"><i style="width:92.7%"></i></div><b>.927</b></div>
      <div class="bar-row"><span>joy</span><div class="bar"><i style="width:88.2%"></i></div><b>.882</b></div>
      <div class="bar-row"><span>disgust</span><div class="bar"><i style="width:87.0%"></i></div><b>.870</b></div>
      <div class="bar-row"><span>anger</span><div class="bar"><i style="width:85.6%"></i></div><b>.856</b></div>
      <div class="bar-row"><span>sadness</span><div class="bar"><i style="width:80.6%"></i></div><b>.806</b></div>
      <div class="bar-row"><span>surprise</span><div class="bar"><i style="width:72.8%"></i></div><b>.728</b></div>
    </div>
  </div>
  <div class="callout"><strong>Что особенно важно для production.</strong> На native‑RU ranking (Average Precision) переносится лучше, чем фиксированные binary thresholds. Значит, 28‑D score vector переносится между доменами устойчивее, а thresholds при необходимости следует калибровать под конкретный продуктовый домен.</div>
</section>

<section id="comparison">
  <h2>Как правильно читать сравнение с другими моделями</h2>
  <div class="callout"><strong>Главное:</strong> эта модель не является специализированным классификатором CEDR или SemEval. Её задача — одна общая EN/RU модель на 28 эмоций. Поэтому CEDR и SemEval используются здесь как <em>внешние transfer‑тесты</em>, а не как соревнования, под которые модель обучалась.</div>

  <h3>1. Где сравнение действительно прямое: GoEmotions</h3>
  <p>Здесь модели решают одну и ту же исходную задачу GoEmotions. Это наиболее полезный внешний ориентир для оценки качества нашей модели. Наша модель при этом двуязычная: тот же checkpoint обслуживает EN и RU.</p>
  <div class="table-wrap"><table class="compare">
    <thead><tr><th>Модель</th><th>Языки</th><th>Macro‑F1</th><th>Как читать результат</th></tr></thead>
    <tbody>
      <tr><td>Original BERT baseline, GoEmotions</td><td>EN</td><td>0.460</td><td>Исходный опубликованный baseline GoEmotions.</td></tr>
      <tr><td><strong>Наша EN/RU модель, 3 seeds</strong></td><td><strong>EN + RU</strong></td><td class="best"><strong>0.520 ± 0.004</strong></td><td><strong>+0.060 absolute macro‑F1 к исходному BERT baseline, при этом один checkpoint работает на двух языках.</strong></td></tr>
      <tr><td>RoBERTa‑large community reference</td><td>EN</td><td>≈0.533</td><td>English‑only, более крупная RoBERTa‑large; self‑reported reference. Разница с нашей моделью около 0.013 macro‑F1.</td></tr>
    </tbody>
  </table></div>
  <p class="muted">Это не заявление SOTA. Смысл сравнения в другом: двуязычная XLM‑RoBERTa base остаётся близка к сильному English‑only reference и заметно выше исходного BERT baseline, сохраняя единое 28‑label пространство для двух языков.</p>

  <h3>2. CEDR и SemEval — не leaderboard для нашей модели, а проверка переноса</h3>
  <p>В CEDR и SemEval специализированные системы обычно обучаются на train/dev именно этих корпусов и оптимизируются под их 5–6 классов. Наша модель <strong>не видела ни CEDR, ни SemEval/BRIGHTER при обучении</strong>, не настраивала на них thresholds и сохраняла исходные 28 GoEmotions координат. Поэтому сравнивать её число F1 с target‑trained leaderboard как «кто лучше» методологически неверно.</p>
  <div class="table-wrap"><table class="compare">
    <thead><tr><th>Внешний native‑RU тест</th><th>Что увидела модель при обучении</th><th>Macro‑F1</th><th>Macro‑AP</th><th>Что это показывает</th></tr></thead>
    <tbody>
      <tr><td>CEDR test, 1,882</td><td><span class="badge">0 CEDR train/dev</span></td><td><strong>0.529 ± 0.018</strong></td><td class="best"><strong>0.676 ± 0.008</strong></td><td>Перенос на другой native‑Russian домен и другую схему разметки без fine‑tuning.</td></tr>
      <tr><td>SemEval‑2025 RU test, 1,000</td><td><span class="badge">0 SemEval/BRIGHTER train/dev</span></td><td><strong>0.633 ± 0.018</strong></td><td class="best"><strong>0.845 ± 0.005</strong></td><td>Сильный ranking шести общих эмоций на независимом русском benchmark без target‑specific обучения.</td></tr>
    </tbody>
  </table></div>

  <h3>3. Почему специализированная модель может показать выше F1 — и почему это не делает эту модель бесполезной</h3>
  <p>Если задача — только один конкретный benchmark с шестью эмоциями и доступны его train/dev данные, специализированная модель закономерно может показать более высокий F1: она обучается прямо под этот label set, распределение текстов и конкретный threshold protocol. Это другой продуктовый режим.</p>
  <p>Здесь ценность модели в другом: <strong>один универсальный checkpoint, 28 fine‑grained эмоций, английский и русский в одном пространстве, полный score vector и подтверждённый перенос на native Russian без дополнительного обучения</strong>. Для приложений, которым нужно единое эмоциональное представление между языками, это полезнее, чем отдельный 5–6‑class классификатор под каждый корпус.</p>

  <div class="callout"><strong>Практический вывод.</strong> Если нужен классификатор строго под CEDR или SemEval и можно переобучаться на их train split — лучше строить target‑specific модель. Если нужен единый EN/RU encoder на 28 эмоций, который можно использовать сразу и получать сопоставимый 28‑D вектор на обоих языках, эта модель решает именно такую задачу.</div>
</section>


<section id="fit">
  <h2>Когда эта модель особенно полезна</h2>
  <div class="table-wrap"><table>
    <thead><tr><th>Сценарий</th><th>Почему подходит</th></tr></thead>
    <tbody>
      <tr><td>EN/RU продукт с единым API</td><td>Один checkpoint и одинаковые 28 координат для обоих языков.</td></tr>
      <tr><td>LLM/agent emotional state</td><td>Можно использовать полный 28‑D score vector, а не только один выбранный класс.</td></tr>
      <tr><td>Fine‑grained анализ эмоций</td><td>28 категорий вместо типичных 5–7 базовых эмоций.</td></tr>
      <tr><td>Перенос на новый RU домен</td><td>Native‑RU holdouts показывают, что ranking переносится без дообучения на CEDR/SemEval.</td></tr>
    </tbody>
  </table></div>
  <div class="callout" style="margin-top:20px">
    <strong>Практическое применение: Communication Styles LLM.</strong><br>
    Эта модель может использоваться как семантический канал эмоций в системе управления коммуникационным стилем и эмоциональным состоянием агента: 28-D вектор передаётся дальше в логику состояния, стиля, мотивации и микродиалогов вместо сведения реплики к одной эмоции.<br><br>
    <a href="https://iproxy3d.github.io/communication-styles-llm/" target="_blank" rel="noopener">Статья и документация Communication Styles LLM</a><br>
    <a href="https://github.com/iproxy3d/communication-styles-llm" target="_blank" rel="noopener">GitHub проекта Communication Styles LLM</a>
  </div>
</section>

<section id="usage">
  <h2>3. Использование модели</h2>
  <p>Release рассчитан на обычный Hugging Face workflow. После публикации весов достаточно указать ID репозитория. Основной контракт — получить все 28 scores; thresholds являются дополнительным представлением.</p>
  <h3>Минимальный Transformers пример</h3>
<pre><code># Автор: Илья Зеленский (proxy3d)
# Телеграмм канал: https://t.me/greenruff

import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

MODEL_ID = "proxy3d/multi-motions-28"

labels = [
    "admiration", "amusement", "anger", "annoyance", "approval", "caring",
    "confusion", "curiosity", "desire", "disappointment", "disapproval",
    "disgust", "embarrassment", "excitement", "fear", "gratitude", "grief",
    "joy", "love", "nervousness", "optimism", "pride", "realization",
    "relief", "remorse", "sadness", "surprise", "neutral",
]

tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForSequenceClassification.from_pretrained(MODEL_ID).eval()

text = "Я наконец закончил — какое облегчение!"
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=64)

with torch.inference_mode():
    scores = torch.sigmoid(model(**inputs).logits[0])

result = sorted(zip(labels, scores.tolist()), key=lambda x: x[1], reverse=True)
print(result[:5])</code></pre>

  <h3>Через wrapper из inference repository</h3>
<pre><code># Автор: Илья Зеленский (proxy3d)
# Телеграмм канал: https://t.me/greenruff

from goemotions_en_ru import EmotionClassifier

clf = EmotionClassifier("proxy3d/multi-motions-28")
result = clf.predict("Спасибо, это действительно помогло.")

print(result["top"])
print(result["scores"])   # все 28 координат
print(result["labels"])   # thresholded view</code></pre>
</section>

<section id="limits">
  <h2>Что результаты доказывают — и чего не доказывают</h2>
  <p>Native‑Russian тесты подтверждают перенос на реальный русский текст, но покрывают только пять/шесть базовых эмоций. Они не являются доказательством одинакового качества всех 28 fine‑grained категорий на native Russian. Для таких редких категорий, как <em>grief</em>, <em>relief</em>, <em>pride</em> или <em>nervousness</em>, отдельный большой native‑RU benchmark пока отсутствует.</p>
  <p>Также sigmoid scores не следует интерпретировать как универсально откалиброванные вероятности внутреннего психологического состояния человека. Модель определяет эмоциональные признаки, выраженные в тексте, и её thresholds зависят от домена.</p>
  <p>При этих ограничениях эксперимент закрывает основной инженерный вопрос: одна fine‑grained EN/RU модель остаётся конкурентоспособной на исходном GoEmotions, стабильно воспроизводится между seed и демонстрирует перенос на независимые native‑Russian corpora без target‑specific дообучения. Поэтому её корректно оценивать как универсальную двуязычную 28‑label модель, а не как специализированную CEDR/SemEval submission.</p>
</section>

<section>
  <h2>Источники</h2>
  <ol class="refs">
    <li>Demszky et al. <a href="https://aclanthology.org/2020.acl-main.372/">GoEmotions: A Dataset of Fine-Grained Emotions</a>, ACL 2020.</li>
    <li>Google Research. <a href="https://github.com/google-research/google-research/tree/master/goemotions">GoEmotions dataset repository</a>.</li>
    <li>Facebook AI. <a href="https://huggingface.co/FacebookAI/xlm-roberta-base">XLM‑RoBERTa base</a>.</li>
    <li>Sboev, Naumov, Rybka. <a href="https://doi.org/10.1016/j.procs.2021.06.075">Data-Driven Model for Emotion Detection in Russian Texts</a>, 2021; <a href="https://github.com/sag111/CEDR">CEDR repository</a>.</li>
    <li>Muhammad et al. <a href="https://aclanthology.org/2025.acl-long.436/">BRIGHTER</a>, ACL 2025.</li>
    <li>Muhammad et al. <a href="https://aclanthology.org/2025.semeval-1.327/">SemEval-2025 Task 11: Bridging the Gap in Text-Based Emotion Detection</a>.</li>
    <li>Riad & Ullah. <a href="https://aclanthology.org/2025.semeval-1.191/">SyntaxMind at SemEval‑2025 Task 11</a> — published comparison table for Russian Track A.</li>
    <li><a href="https://huggingface.co/AliceYin/goemotions-roberta-large-focal-sota">RoBERTa-large focal GoEmotions community checkpoint</a> — self-reported reference metrics.</li>
  </ol>
</section>
</main>
<footer><div class="wrap">
  Multi-Motions 28 · EN/RU inference release · 2026<br>
  Автор: Илья Зеленский (proxy3d) · <a href="https://t.me/greenruff" target="_blank" rel="noopener">Telegram @greenruff</a> ·
  <a href="https://huggingface.co/proxy3d/multi-motions-28" target="_blank" rel="noopener">Hugging Face</a> ·
  <a href="https://iproxy3d.github.io/communication-styles-llm/" target="_blank" rel="noopener">Communication Styles LLM — статья</a> ·
  <a href="https://github.com/iproxy3d/communication-styles-llm" target="_blank" rel="noopener">GitHub</a>
</div></footer>
</body>
</html>