Artyom / πŸ’‘ Elixir для Machine Learning. Π§Π°ΡΡ‚ΡŒ 1 - ВСория

Created Wed, 02 Apr 2025 00:00:00 +0000 Modified Wed, 21 May 2025 11:23:38 +0000

ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°

πŸ’‘Elixir для Machine Learning. Π§Π°ΡΡ‚ΡŒ 1 - ВСория

Π’ послСднСС врСмя Ρ€ΠΎΠ»ΡŒ искусствСнного ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚Π° Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сфСрах Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΡ€ΠΎΡ‚Ρ‹. МногиС ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΡƒΠΆΠ΅ Π²Π½Π΅Π΄Ρ€ΡΡŽΡ‚ ИИ для ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Π½Π° своих ΠΏΠΎΡ€Ρ‚Π°Π»Π°Ρ…, Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ собствСнныС Π½Π΅ΠΉΡ€ΠΎΠ½Π½Ρ‹Π΅ сСти для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ спСциализированных Π·Π°Π΄Π°Ρ‡

Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Python Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Π² ML-Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π΅, Elixir Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² особых Π½ΠΈΡˆΠ°Ρ…: систСмы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (Bumblebee), сСрвисы инфСрСнса ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ (Nx.Serving) ΠΈ распрСдСлСнныС систСмы машинного обучСния. Компании, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ DockYard ΠΈ Dashbit, ΡƒΠΆΠ΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Π½Π΅Π΄Ρ€ΡΡŽΡ‚ ML-Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° Elixir Π² ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠΉ срСдС

Данная ΡΡ‚Π°Ρ‚ΡŒΡ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° 2 части β€” ВСория ΠΈ ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ части ΠΌΡ‹ рассмотрим основы машинного обучСния, познакомимся с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌΠΈ понятиями ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ΠΉΡ€ΠΎΠ½Π½Ρ‹Π΅ сСти с использованиСм Elixir

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ машинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π½Π΅ΠΉΡ€ΠΎΠ½Π½Ρ‹Π΅ сСти?

МашинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ (Machine Learning, ML) β€” это ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ созданию систСм, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΡƒΡ‡Π°Ρ‚ΡŒΡΡ Π½Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Ρ‚ΡŒ свою ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ с ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ Π±Π΅Π· явного программирования. ВмСсто написания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… инструкций для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΌΡ‹ создаСм модСль, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ “ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ” Π½Π° основС ΠΎΠΏΡ‹Ρ‚Π°

НСйронныС сСти β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² машинного обучСния, Π²Π΄ΠΎΡ…Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ чСловСчСского ΠΌΠΎΠ·Π³Π°. Они ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой систСмы взаимосвязанных ΡƒΠ·Π»ΠΎΠ² (Π½Π΅ΠΉΡ€ΠΎΠ½ΠΎΠ²), ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² слои:

  1. Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ слой ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ исходныС Π΄Π°Π½Π½Ρ‹Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, пиксСли изобраТСния)
  2. Π‘ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ слои ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, выявляя всС Π±ΠΎΠ»Π΅Π΅ слоТныС ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹
  3. Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ слой прСдоставляСт ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°)

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π½Π΅ΠΉΡ€ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ сигналы, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ…, примСняя Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ взвСшСнной суммС Π²Ρ…ΠΎΠ΄ΠΎΠ², ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ дальшС ΠΏΠΎ сСти. Бвязи ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π΅ΠΉΡ€ΠΎΠ½Π°ΠΌΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ вСсовыС коэффициСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π²Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ сигнала

ΠŸΡ€ΠΎΡ†Π΅ΡΡ обучСния Π½Π΅ΠΉΡ€ΠΎΠ½Π½ΠΎΠΉ сСти Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² настройкС этих вСсовых коэффициСнтов Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΅Ρ‚ΡŒ Π²Ρ‹Π΄Π°Π²Π°Π»Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Π­Ρ‚ΠΎ происходит ΠΏΡƒΡ‚Π΅ΠΌ:

  1. ΠŸΠΎΠ΄Π°Ρ‡ΠΈ мноТСства ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²
  2. ВычислСния ошибки ΠΌΠ΅ΠΆΠ΄Ρƒ прСдсказаниями сСти ΠΈ фактичСскими значСниями
  3. ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ вСсов для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ этой ошибки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ распространСния ошибки (backpropagation)

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Π² машинном ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠΈ

МодСли ΠΈ ΠΈΡ… Ρ‚ΠΈΠΏΡ‹

МодСль β€” матСматичСская ΠΈΠ»ΠΈ алгоритмичСская конструкция, которая обучаСтся Π½Π° Π΄Π°Π½Π½Ρ‹Ρ… для выполнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. МодСли Π±Ρ‹Π²Π°ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²:

  • Π›ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ: ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ простыС ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹: линСйная рСгрСссия, логистичСская рСгрСссия
  • НСйронныС сСти: ΠœΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠΉΠ½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ слоТныС Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ зависимости. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для Π·Π°Π΄Π°Ρ‡ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠ³ΠΎ зрСния, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ СстСствСнного языка ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… слоТных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ
  • Ансамбли ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ: ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ для получСния Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹: случайныС лСса (Random Forests), Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΉ бустинг (Gradient Boosting)

Π’Π΅Π½Π·ΠΎΡ€Ρ‹ ΠΈ ΠΈΡ… Ρ€ΠΎΠ»ΡŒ Π² ML

Π’Π΅Π½Π·ΠΎΡ€ β€” это ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ понятий скаляра, Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π΅Π½Π·ΠΎΡ€Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ структурой Π΄Π°Π½Π½Ρ‹Ρ… Π² соврСмСнных систСмах машинного обучСния:

  • Бкаляр: Π’Π΅Π½Π·ΠΎΡ€ Ρ€Π°Π½Π³Π° 0 (0-D). ΠŸΡ€ΠΈΠΌΠ΅Ρ€: число 5
  • Π’Π΅ΠΊΡ‚ΠΎΡ€: Π’Π΅Π½Π·ΠΎΡ€ Ρ€Π°Π½Π³Π° 1 (1-D). ΠŸΡ€ΠΈΠΌΠ΅Ρ€: [1, 2, 3]
  • ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π°: Π’Π΅Π½Π·ΠΎΡ€ Ρ€Π°Π½Π³Π° 2 (2-D). ΠŸΡ€ΠΈΠΌΠ΅Ρ€: [[1, 2, 3], [4, 5, 6]]
  • ΠœΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Ρ‚Π΅Π½Π·ΠΎΡ€: Π’Π΅Π½Π·ΠΎΡ€ Ρ€Π°Π½Π³Π° 3+ (3-D ΠΈ Π²Ρ‹ΡˆΠ΅). ΠŸΡ€ΠΈΠΌΠ΅Ρ€: [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

Π’Π΅Π½Π·ΠΎΡ€Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для прСдставлСния ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π² ML:

  • Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ (Ρ‚Π΅Π½Π·ΠΎΡ€Ρ‹ размСрности 4: [batch_size, height, width, channels])
  • ВСксты (ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… слова ΠΈΠ»ΠΈ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹)
  • Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ряды (ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ наблюдСний с Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ)

Π’ΠΈΠΏΡ‹ обучСния

ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ β€” процСсс, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ модСль настраиваСт свои ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½Π° основС Π΄Π°Π½Π½Ρ‹Ρ…:

  • ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ с ΡƒΡ‡ΠΈΡ‚Π΅Π»Π΅ΠΌ (Supervised Learning): МодСль обучаСтся Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Π³Π΄Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° извСстСн ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π·Π°Π΄Π°Ρ‡: классификация ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ†Π΅Π½, распознаваниС Ρ€Π΅Ρ‡ΠΈ
  • ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π±Π΅Π· учитСля (Unsupervised Learning): МодСль обучаСтся Π½Π° Π½Π΅Ρ€Π°Π·ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, выявляя скрытыС структуры ΠΈ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π·Π°Π΄Π°Ρ‡: кластСризация, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ размСрности, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΉ
  • ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠ΄ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ΠΌ (Reinforcement Learning): МодСль обучаСтся Ρ‡Π΅Ρ€Π΅Π· взаимодСйствиС с ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ срСдой, получая Π½Π°Π³Ρ€Π°Π΄Ρ‹ ΠΈΠ»ΠΈ ΡˆΡ‚Ρ€Π°Ρ„Ρ‹ Π·Π° свои дСйствия. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅Ρ‚ΡΡ Π² Ρ€ΠΎΠ±ΠΎΡ‚ΠΎΡ‚Π΅Ρ…Π½ΠΈΠΊΠ΅, ΠΈΠ³Ρ€Π°Ρ…, Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Ρ… систСмах

Π“ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ ΠΈΡ… настройка

Π“ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ β€” это настройки ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° обучСния ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² Π΅Π³ΠΎ процСссС:

  • АрхитСктурныС Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ слоёв Π² Π½Π΅ΠΉΡ€ΠΎΠ½Π½ΠΎΠΉ сСти, количСство Π½Π΅ΠΉΡ€ΠΎΠ½ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ слоС, Ρ‚ΠΈΠΏΡ‹ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
  • ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ: Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ обучСния (learning rate), Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π°Ρ‚Ρ‡Π° (batch size), количСство эпох обучСния
  • РСгуляризационныС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: ΠšΠΎΡΡ„Ρ„ΠΈΡ†ΠΈΠ΅Π½Ρ‚Ρ‹ L1/L2 рСгуляризации, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ dropout для прСдотвращСния пСрСобучСния

Настройка Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ поиск ΠΏΠΎ сСткС (grid search), случайный поиск (random search) ΠΈΠ»ΠΈ байСсовская оптимизация

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ β€” это количСствСнныС ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΎΡ†Π΅Π½ΠΊΠΈ качСства Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ:

  • Для Π·Π°Π΄Π°Ρ‡ классификации:
    • Π’ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ (Accuracy): Доля ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… прСдсказаний срСди всСх прСдсказаний
    • Π’ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡ‚Π° (Precision & Recall): ΠŸΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ баланс ΠΌΠ΅ΠΆΠ΄Ρƒ Π»ΠΎΠΆΠ½ΠΎΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ Π»ΠΎΠΆΠ½ΠΎΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ
    • F1-ΠΌΠ΅Ρ€Π°: ГармоничСскоС срСднСС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡ‚ΠΎΠΉ
    • ROC-AUC: ΠŸΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΏΠΎΠ΄ ROC-ΠΊΡ€ΠΈΠ²ΠΎΠΉ, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰Π°Ρ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ классы
  • Для Π·Π°Π΄Π°Ρ‡ рСгрСссии:
    • БрСднСквадратичная ошибка (MSE): Π‘Ρ€Π΅Π΄Π½Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² разностСй ΠΌΠ΅ΠΆΠ΄Ρƒ прСдсказанными ΠΈ фактичСскими значСниями
    • БрСдняя Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Π°Ρ ошибка (MAE): Π‘Ρ€Π΅Π΄Π½Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Ρ… разностСй ΠΌΠ΅ΠΆΠ΄Ρƒ прСдсказанными ΠΈ фактичСскими значСниями
    • ΠšΠΎΡΡ„Ρ„ΠΈΡ†ΠΈΠ΅Π½Ρ‚ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ†ΠΈΠΈ (RΒ²): ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, насколько Ρ…ΠΎΡ€ΠΎΡˆΠΎ модСль ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ…

Π’Ρ‹Π±ΠΎΡ€ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ бизнСс-контСкста. НапримСр, Π² мСдицинской диагностикС Π²Π°ΠΆΠ½Π΅Π΅ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство Π»ΠΎΠΆΠ½ΠΎΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², Π° Π² Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… систСмах ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π°ΠΆΠ½Π΅Π΅ качСство Π²Π΅Ρ€Ρ…Π½ΠΈΡ… Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ рассмотрСли ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ машинного обучСния, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ инструмСнтам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этих ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ Π² экосистСмС Elixir

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Elixir для машинного обучСния

ЭкосистСма машинного обучСния Π² Elixir быстро развиваСтся, прСдлагая всС Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹Π΅ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ инструмСнты для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Рассмотрим ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ML Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ BEAM

Numerical Elixir (Nx): Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚ для вычислСний

Nx β€” это основа всСй ML-экосистСмы Elixir, разработанная ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Dashbit ΠΏΠΎΠ΄ руководством Π–ΠΎΠ·Π΅ Π’Π°Π»ΠΈΠΌΠ° (создатСля Elixir). Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° прСдоставляСт высокоэффСктивныС числовыС вычислСния ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… Ρ‚Π΅Π½Π·ΠΎΡ€ΠΎΠ², Ρ‡Ρ‚ΠΎ критичСски Π²Π°ΠΆΠ½ΠΎ для машинного обучСния

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ возмоТности Nx:

  • Π’Π΅Π½Π·ΠΎΡ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: ΠŸΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для манипуляции ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΌΠΈ массивами Π΄Π°Π½Π½Ρ‹Ρ…
  • ЧислСнная ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ: Высокая Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ вычислСний с ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ числСнных ошибок
  • ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ вычислСний: ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Elixir Π² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄
  • АвтоматичСскоС Π΄ΠΈΡ„Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅: НСобходимоС для Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ распространСния ошибки

ОсобСнно ΠΌΠΎΡ‰Π½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ Nx являСтся систСма defn (опрСдСляСмых числовых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ), которая позволяСт ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вычислСния Π² эффСктивный Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ ΠΊΠΎΠ΄:

defmodule MathOps do
  import Nx.Defn

  defn multiply_and_add(a, b, c) do
    a * b + c
  end
end

# ИспользованиС
x = Nx.tensor([1, 2, 3])
y = Nx.tensor([4, 5, 6])
z = Nx.tensor([7, 8, 9])
MathOps.multiply_and_add(x, y, z)
# Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: Nx.tensor([11, 18, 27])

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ бэкСнды Nx:

Nx Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· систСму бэкСндов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚, Π³Π΄Π΅ ΠΈ ΠΊΠ°ΠΊ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ вычислСния:

  • EXLA: Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с XLA (Accelerated Linear Algebra) ΠΎΡ‚ Google, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ для CPU, GPU ΠΈ TPU
  • Torchx: Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ с PyTorch, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ Π΅Π³ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ CUDA-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
  • ONNX: ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Open Neural Network Exchange для совмСстимости с ΡˆΠΈΡ€ΠΎΠΊΠΈΠΌ спСктром ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ
  • BinaryBackend: Нативная рСализация Π½Π° Elixir, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π°Ρ Π²Π½Π΅ΡˆΠ½ΠΈΡ… зависимостСй

Π’Ρ‹Π±ΠΎΡ€ бэкСнда зависит ΠΎΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ доступного оборудования:

# Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠ΅ использованиС EXLA-бэкСнда
Nx.global_default_backend(EXLA.Backend)

# ИспользованиС PyTorch для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
Nx.backend_transfer(tensor, {Torchx.Backend, device: :cuda})

Axon: НСйронныС сСти с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ

Axon β€” это высокоуровнСвый Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для опрСдСлСния, обучСния ΠΈ ΠΎΡ†Π΅Π½ΠΊΠΈ Π½Π΅ΠΉΡ€ΠΎΠ½Π½Ρ‹Ρ… сСтСй, построСнный ΠΏΠΎΠ²Π΅Ρ€Ρ… Nx. Главная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Axon β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½, идСально ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ философии Elixir

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Axon:

  • Π”Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ: ΠŸΠΎΠ½ΡΡ‚Π½Ρ‹ΠΉ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½-ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ созданию Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€
  • ВстроСнныС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹: Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Adam, SGD, RMSProp ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²
  • Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ: Π¨ΠΈΡ€ΠΎΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ€ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ (MSE, кросс-энтропия ΠΈ Π΄Ρ€.)
  • Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ: Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ для Ρ€Π°Π½Π½Π΅Π³ΠΎ останова, Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ, ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания ΠΈ обучСния ΠΌΠΎΠ΄Π΅Π»ΠΈ классификации:

# ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ
model =
  Axon.input("input", shape: {nil, 784})
  |> Axon.dense(512)
  |> Axon.relu()
  |> Axon.dense(10)
  |> Axon.softmax()

# ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ ΠΈ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅
trained_model =
  model
  |> Axon.Loop.trainer(:categorical_cross_entropy, :adam)
  |> Axon.Loop.metric(:accuracy)
  |> Axon.Loop.run(train_data, epochs: 5, compiler: EXLA)

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ возмоТности Axon:

Axon ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ спСктр слоСв ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€:

  • Π‘Π²Π΅Ρ€Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ слои: Для Π·Π°Π΄Π°Ρ‡ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠ³ΠΎ зрСния (Axon.conv)
  • Π Π΅ΠΊΡƒΡ€Ρ€Π΅Π½Ρ‚Π½Ρ‹Π΅ сСти: LSTM, GRU для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…
  • ВрансформСры: Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠ³ΠΎΠ»ΠΎΠ²ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ для NLP
  • Нормализация: BatchNorm, LayerNorm для стабилизации обучСния
  • РСгуляризация: Dropout, L1/L2 для Π±ΠΎΡ€ΡŒΠ±Ρ‹ с ΠΏΠ΅Ρ€Π΅ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ свСрточной сСти для классификации ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

model =
  Axon.input("input", shape: {nil, 1, 28, 28})
  |> Axon.conv(32, kernel_size: 3, padding: :same)
  |> Axon.relu()
  |> Axon.max_pool(kernel_size: 2)
  |> Axon.conv(64, kernel_size: 3, padding: :same)
  |> Axon.relu()
  |> Axon.max_pool(kernel_size: 2)
  |> Axon.flatten()
  |> Axon.dense(128)
  |> Axon.relu()
  |> Axon.dense(10)
  |> Axon.softmax()

Explorer: ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…

Explorer β€” Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, вдохновлСнная Pandas ΠΈΠ· Python. Она тСсно интСгрируСтся с Nx, позволяя Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ‚Π΅Π½Π·ΠΎΡ€Ρ‹

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ возмоТности Explorer:

  • DataFrame API: ΠœΠΎΡ‰Π½Ρ‹ΠΉ интСрфСйс для манипуляций с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ
  • Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ ΠΈ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠ°: ЭффСктивная Ρ€Π°Π±ΠΎΡ‚Π° с большими Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…
  • Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ°/сохранСниС: ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° CSV, Parquet, JSON ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ²
  • Визуализация: Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Vega-Lite для создания Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:

# Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…
df = Explorer.DataFrame.from_csv!("titanic.csv")
  |> Explorer.DataFrame.filter(age > 18)
  |> Explorer.DataFrame.select(["survived", "age", "sex", "fare"])
  |> Explorer.DataFrame.mutate(fare_category: apply(fare, fn fare ->
    cond do
      fare < 20 -> "low"
      fare < 50 -> "medium"
      true -> "high"
    end
  end))

#### ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Ρ‚Π΅Π½Π·ΠΎΡ€Ρ‹ для ML
features = Explorer.DataFrame.to_nx(df, ["age", "sex", "fare"])
labels = Explorer.DataFrame.to_nx(df, ["survived"])

Bumblebee: Π“ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ для практичСского примСнСния

Bumblebee β€” это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΏΡ€Π΅Π΄ΠΎΠ±ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ инструмСнты для ΠΈΡ… использования. Bumblebee Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с соврСмСнными модСлями Π±Π΅Π· нСобходимости ΠΎΠ±ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΡ… с нуля

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ возмоТности:

  • ΠŸΡ€Π΅Π΄ΠΎΠ±ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ: BERT, GPT-2, ResNet, CLIP, Stable Diffusion ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅
  • ВстроСнныС ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ‹: Π“ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡
  • Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Hugging Face: Доступ ΠΊ тысячам ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ
  • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ инфСрСнс: Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠΈ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования для Π°Π½Π°Π»ΠΈΠ·Π° Ρ‚ΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ тСкста:

{:ok, model_info} = Bumblebee.load_model({:hf, "distilbert-base-uncased-finetuned-sst-2-english"})
{:ok, tokenizer} = Bumblebee.load_tokenizer({:hf, "distilbert-base-uncased"})

serving = Bumblebee.Text.sentiment(model_info, tokenizer, compile: [batch_size: 1])

Nx.Serving.run(serving, "I love Elixir, it's an amazing language!")
# => %{predictions: [%{label: "POSITIVE", score: 0.998}]}

Nx.Serving: Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅

Nx.Serving β€” инструмСнт для эффСктивного развСртывания ML-ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² качСствС сСрвисов. Он обСспСчиваСт:

  • Π‘Π°Ρ‚Ρ‡ΠΈΠ½Π³ запросов: АвтоматичСскоС Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для эффСктивного выполнСния
  • ΠžΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹: Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ ΠΈ распрСдСлСниС рСсурсов
  • Горячая Π·Π°ΠΌΠ΅Π½Π°: ОбновлСниС ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π±Π΅Π· простоя
  • ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³: ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ использования рСсурсов

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания сСрвиса для распознавания ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

model_info = Bumblebee.load_model({:hf, "microsoft/resnet-50"})
featurizer = Bumblebee.load_featurizer({:hf, "microsoft/resnet-50"})

serving =
  Bumblebee.Vision.image_classification(
    model_info,
    featurizer,
    compile: [batch_size: 8],  # ДинамичСский Π±Π°Ρ‚Ρ‡ΠΈΠ½Π³
    defn_options: [compiler: EXLA]  # ИспользованиС GPU
  )

# Запуск ΠΊΠ°ΠΊ процСсса OTP
{:ok, pid} = Nx.Serving.start_link(serving, name: ImageClassifier)

# ИспользованиС
{:ok, image} = Image.from_file("cat.jpg")
Nx.Serving.batched_run(ImageClassifier, image)

LiveBook: Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈ экспСримСнты

LiveBook β€” это интСрактивная срСда для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ докумСнтирования ΠΊΠΎΠ΄Π° Elixir, идСально подходящая для ML-экспСримСнтов. Она прСдоставляСт:

  • Jupyter-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ интСрфСйс: Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ ячСйки ΠΊΠΎΠ΄Π°
  • ВстроСнная визуализация: Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹, Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
  • Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с ML-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ: Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ для Nx, Axon, Explorer
  • БовмСстная Ρ€Π°Π±ΠΎΡ‚Π°: Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ°ΠΌΠΈ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π°Π΄ Π½ΠΈΠΌΠΈ вмСстС
  • Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° GPU: ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ ускорСния

LiveBook сущСствСнно ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅, экспСримСнтированиС ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ML-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° Elixir:

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ячСйки LiveBook
Mix.install([
  {:nx, "~> 0.5"},
  {:axon, "~> 0.5"},
  {:explorer, "~> 0.5"},
  {:kino, "~> 0.8"}
])

### Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄ Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²
form = Kino.Control.form(
  [
    learning_rate: Kino.Input.text("Learning rate", default: "0.001"),
    epochs: Kino.Input.range(1..100, default: 10)
  ],
  submit: "Train model"
)

Scholar: Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ машинного обучСния

Scholar Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ экосистСму Elixir ML классичСскими Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ часто Π±Ρ‹Π²Π°ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ подходящими для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, Ρ‡Π΅ΠΌ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии:

import Scholar.Linear.LinearRegression
import Nx.Defn

# ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…
x = Nx.tensor([[1.0, 1.0], [1.0, 2.0], [2.0, 2.0], [2.0, 3.0]])
y = Nx.tensor([6.0, 8.0, 9.0, 11.0])

# ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ
model = fit(x, y)

# ΠŸΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅
predict(model, Nx.tensor([[3.0, 5.0]]))
# => #Nx.Tensor
#  f32[1]
#  [17.0]
# >

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅: Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Phoenix

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, насколько ΠΎΡ€Π³Π°Π½ΠΈΡ‡Π½ΠΎ ML-ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с Π²Π΅Π±-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠΌ Phoenix, создавая ΠΌΠΎΡ‰Π½Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²Π΅Π±-прилоТСния:

defmodule MyAppWeb.MLController do
  use MyAppWeb, :controller
  alias Nx.Serving

  # Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΡ€ΠΈ стартС прилоТСния
  @serving Bumblebee.Text.sentiment(model_info, tokenizer, compile: [batch_size: 4])
  Serving.start_link(@serving, name: SentimentAnalyzer)

  def analyze(conn, %{"text" => text}) do
    # Асинхронный Π°Π½Π°Π»ΠΈΠ·
    Task.async(fn ->
      Serving.batched_run(SentimentAnalyzer, text)
    end)
    |> Task.await()
    |> case do
      %{predictions: [%{label: label, score: score}]} ->
        json(conn, %{sentiment: label, confidence: score})
      _ ->
        conn
        |> put_status(422)
        |> json(%{error: "Analysis failed"})
    end
  end
end

Вакая интСграция позволяСт Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ API для Π°Π½Π°Π»ΠΈΠ·Π° тСкста, классификации ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… систСм ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ML-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ всС прСимущСства BEAM для Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ высокой доступности

ЭкосистСма ML Π² Elixir ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ сбалансированноС сочСтаниС высокоуровнСвых инструмСнтов ΠΈ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ контроля, позволяя Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ подходящий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ абстракции для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. Π₯отя ΠΎΠ½Π° Π΅Ρ‰Π΅ Π½Π΅ Ρ‚Π°ΠΊ ΠΎΠ±ΡˆΠΈΡ€Π½Π°, ΠΊΠ°ΠΊ Python-экосистСма, ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ прСимущСства BEAM Π΄Π΅Π»Π°ΡŽΡ‚ Elixir ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… сцСнариСв машинного обучСния, особСнно связанных с высоконагруТСнными систСмами ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° для обучСния ΠΈ ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ

# ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…
train_images = train_images |> Nx.reshape({60000, 784}) |> Nx.divide(255.0)
test_images = test_images |> Nx.reshape({10000, 784}) |> Nx.divide(255.0)

# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π°Ρ‚Ρ‡Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ…
batches =
  Stream.repeatedly(fn ->
    indices = Nx.random_uniform(shape: {32}, min: 0, max: 60000) |> Nx.as_type(:s64)
    x = Nx.take(train_images, indices)
    y = Nx.take(train_labels, indices)
    {x, y}
  end)

# ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ с рСгуляризациСй ΠΈ Π΄Ρ€ΠΎΠΏΠ°ΡƒΡ‚ΠΎΠΌ
model =
  Axon.input("input", shape: {nil, 784})
  |> Axon.dense(256, activation: :relu, kernel_regularizer: :l2)
  |> Axon.dropout(rate: 0.4)
  |> Axon.dense(128, activation: :relu)
  |> Axon.dropout(rate: 0.3)
  |> Axon.dense(10, activation: :softmax)

# ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ с Ρ€Π°Π½Π½ΠΈΠΌ остановом ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π³ΠΈΠΏΠ΅Ρ€ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²
trained_model_state =
  model
  |> Axon.Loop.trainer(:categorical_cross_entropy, Axon.Optimizers.adam(learning_rate: 0.001))
  |> Axon.Loop.metric(:accuracy)
  |> Axon.Loop.validate(test_data)
  |> Axon.Loop.early_stopping("validation_loss", patience: 5)
  |> Axon.Loop.run(batches, epochs: 20, iterations: 1000)

# ΠžΡ†Π΅Π½ΠΊΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ
test_data = Stream.repeatedly(fn -> {test_images, test_labels} end) |> Stream.take(1)
eval_results =
  model
  |> Axon.Loop.evaluator()
  |> Axon.Loop.metric(:accuracy)
  |> Axon.Loop.run(test_data, trained_model_state)
ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉElixir (Nx/Axon)Python (TensorFlow/PyTorch)
Π—Ρ€Π΅Π»ΠΎΡΡ‚ΡŒ ΡΠΊΠΎΡΠΈΡΡ‚Π΅ΠΌΡ‹Π Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰Π°ΡΡΡΠ—Ρ€Π΅Π»Π°Ρ
ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΠ’Ρ‹ΡΠΎΠΊΠ°Ρ (распрСдСлСнныС систСмы)ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄ GPU/TPU
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΆΠ΅Π»Π΅Π·Π°CPU/GPU (Ρ‡Π΅Ρ€Π΅Π· EXLA)Широкая (CUDA, TPU, ROCm)
ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ’ΡΡ‚Ρ€ΠΎΠ΅Π½Π½Ρ‹ΠΉ (BEAM VM)Зависит ΠΎΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ
ДоступныС ΠΌΠΎΠ΄Π΅Π»ΠΈΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ (Bumblebee)ΠžΠ±ΡˆΠΈΡ€Π½Ρ‹Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ
Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с вСбНативная (Phoenix LiveView)Π§Π΅Ρ€Π΅Π· Flask/FastAPI/Django
Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ (микс Ρ€Π΅Π»ΠΈΠ·Ρ‹ + OTP)КомплСксноС (Docker/K8s)
Π‘ΠΎΠΎΠ±Ρ‰Π΅ΡΡ‚Π²ΠΎΠ Π°ΡΡ‚ΡƒΡ‰Π΅Π΅ΠžΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅
Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡΠšΠ°Ρ‡Π΅ΡΡ‚Π²Π΅Π½Π½Π°Ρ (hexdocs)ΠžΠ±ΡˆΠΈΡ€Π½Π°Ρ (Π½ΠΎ фрагмСнтированная)
ИспользованиС Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅Erlang-экосистСма (WhatsApp, Discord)Π›ΠΈΠ΄Π΅Ρ€ индустрии (Google, Meta)

Π›ΡƒΡ‡ΡˆΠ°Ρ стратСгия часто Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² использовании Π³ΠΈΠ±Ρ€ΠΈΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°: ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π½Π° Python ΠΈ ΠΈΡ… интСграция Π² Elixir-систСмы для инфСрСнса

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° Elixir Π² ML

  1. РаспрСдСлённыС вычислСния. BEAM позволяСт Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ обучСния ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠ·Π»Π°ΠΌΠΈ кластСра
  2. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Благодаря Π°ΠΊΡ‚ΠΎΡ€Π°ΠΌ ΠΈ OTP, Elixir эффСктивСн для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² IoT)
  3. ΠΠ°Π΄Ρ‘ΠΆΠ½ΠΎΡΡ‚ΡŒ. МодСли ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ простоя

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ ΠΈ Π²Ρ‹Π·ΠΎΠ²Ρ‹

НСсмотря Π½Π° быстроС Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅, экосистСма ML Π² Elixir ΠΈΠΌΠ΅Π΅Ρ‚ ряд ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ:

  • ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… спСциализированных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ
  • МСньшая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для ΠΎΡ‡Π΅Π½ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Python-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ
  • ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° TPU
  • МСньшС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ²
  • НС всС соврСмСнныС Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ трансформСров) ΠΈΠΌΠ΅ΡŽΡ‚ эффСктивныС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ примСнСния

Когда стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Elixir для ML:

  • Для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ML Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Elixir/Phoenix-прилоТСния
  • Π’ систСмах, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… высокой отказоустойчивости ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΠΈ
  • Для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½-обучСния
  • Π’ распрСдСлСнных систСмах, Π³Π΄Π΅ Π²Π°ΠΆΠ΅Π½ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ

Когда Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Python:

  • Для ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ прототипирования
  • ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΎΡ‡Π΅Π½ΡŒ большими модСлями (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, большими языковыми модСлями)
  • Когда Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ спСциализированныС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, доступныС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Python-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…
  • ΠŸΡ€ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈ нСобходимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Π‘ΡƒΠ΄ΡƒΡ‰Π΅Π΅ нСйросСтСй Π½Π° Elixir

ЭкосистСма Elixir для ML Π΅Ρ‰Ρ‘ ΠΌΠΎΠ»ΠΎΠ΄Π°, Π½ΠΎ пСрспСктивна. Усилия сообщСства Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π½Π°:

  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΌ ускорСниСм (GPU/TPU)
  • Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ списка Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² Axon
  • Π Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ инструмСнтов для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (Explorer, Scholar)

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ЭкосистСма ML Π² Elixir Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ развиваСтся благодаря усилиям ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Dashbit, ΠΈ сообщСства Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ Π³Π»ΡƒΠ±ΠΆΠ΅ ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡ Π² Ρ‚Π΅ΠΌΡƒ, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ рСсурсы:


ΠžΡ‚ Π°Π²Ρ‚ΠΎΡ€Π°

Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€ΡŽ вас Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅! НадСюсь, ΠΎΠ½Π° ΠΏΠΎΠΌΠΎΠ³Π»Π° Π²Π°ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ возмоТности Elixir Π² сфСрС машинного обучСния ΠΈ Π²Π΄ΠΎΡ…Π½ΠΎΠ²ΠΈΠ»Π° Π½Π° собствСнныС экспСримСнты с этой ΠΌΠΎΡ‰Π½ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ =)

ЭкосистСма ML Π² Elixir Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ развиваСтся, ΠΈ я Π±ΡƒΠ΄Ρƒ Ρ€Π°Π΄ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ вопросы, прСдлоТСния ΠΈΠ»ΠΈ замСчания. Если Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ нСточности Π² ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ ΠΈΠ»ΠΈ Ρƒ вас Π΅ΡΡ‚ΡŒ интСрСсныС дополнСния β€” поТалуйста, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΎΠ± этом Π² коммСнтариях. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΈΠ²Π½Π°Ρ обратная связь всСгда Ρ†Π΅Π½Π½Π° 😎

Для Ρ‚Π΅Ρ…, ΠΊΠΎΠΌΡƒ интСрСсно Π³Π»ΡƒΠ±ΠΆΠ΅ ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡ Π² ΠΌΠΈΡ€ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ, Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ°ΡŽ Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² ΠΌΠΎΠΉ Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π» πŸ–₯, Π³Π΄Π΅ я дСлюсь рСцСнзиями Π½Π° тСхничСскиС ΠΊΠ½ΠΈΠ³ΠΈ, ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°ΠΌΠΈ ΠΏΠΎ Elixir ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 🀀

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ части ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΈ создадим ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ ML-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° Elixir, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ пропуститС ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅!