π‘Elixir Π΄Π»Ρ Machine Learning. Π§Π°ΡΡΡ 1 - Π’Π΅ΠΎΡΠΈΡ
Π ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ»Ρ ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΠ° Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΡΠ΅ΡΠ°Ρ Π½Π°ΡΠΈΠ½Π°Π΅Ρ Π½Π°Π±ΠΈΡΠ°ΡΡ ΠΎΠ±ΠΎΡΠΎΡΡ. ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΡΠΆΠ΅ Π²Π½Π΅Π΄ΡΡΡΡ ΠΠ Π΄Π»Ρ ΠΏΠΎΠΌΠΎΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ Π½Π° ΡΠ²ΠΎΠΈΡ ΠΏΠΎΡΡΠ°Π»Π°Ρ , Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΠΈ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π·Π°Π΄Π°Ρ
Π ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Python Π΄ΠΎΠΌΠΈΠ½ΠΈΡΡΠ΅Ρ Π² ML-Π»Π°Π½Π΄ΡΠ°ΡΡΠ΅, Elixir Π½Π°Ρ ΠΎΠ΄ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΠΎΡΠΎΠ±ΡΡ Π½ΠΈΡΠ°Ρ : ΡΠΈΡΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (Bumblebee), ΡΠ΅ΡΠ²ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅Π½ΡΠ° ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ (Nx.Serving) ΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ. ΠΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ DockYard ΠΈ Dashbit, ΡΠΆΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π²Π½Π΅Π΄ΡΡΡΡ ML-ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° Elixir Π² ΠΏΡΠΎΠΌΡΡΠ»Π΅Π½Π½ΠΎΠΉ ΡΡΠ΅Π΄Π΅
ΠΠ°Π½Π½Π°Ρ ΡΡΠ°ΡΡΡ ΡΠ°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° 2 ΡΠ°ΡΡΠΈ β Π’Π΅ΠΎΡΠΈΡ ΠΈ ΠΡΠ°ΠΊΡΠΈΠΊΠ°. Π ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Ρ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ, ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠΌΡΡ Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌΠΈ ΠΏΠΎΠ½ΡΡΠΈΡΠΌΠΈ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΌΠΎΠ³ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Elixir
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΠΈ?
ΠΠ°ΡΠΈΠ½Π½ΠΎΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ (Machine Learning, ML) β ΡΡΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΎΠ±ΡΡΠ°ΡΡΡΡ Π½Π° Π΄Π°Π½Π½ΡΡ ΠΈ ΡΠ»ΡΡΡΠ°ΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Ρ ΠΎΠΏΡΡΠΎΠΌ Π±Π΅Π· ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠΌΠ΅ΡΡΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ, ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΈ “ΡΡΠΈΡΡΡΡ” Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΎΠΏΡΡΠ°
ΠΠ΅ΠΉΡΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΠΈ β ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ, Π²Π΄ΠΎΡ Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ°ΠΌΠΈ ΡΠ°Π±ΠΎΡΡ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠΎΠ·Π³Π°. ΠΠ½ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π²Π·Π°ΠΈΠΌΠΎΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΡΠ·Π»ΠΎΠ² (Π½Π΅ΠΉΡΠΎΠ½ΠΎΠ²), ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ Π² ΡΠ»ΠΎΠΈ:
- ΠΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ»ΠΎΠΉ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΈΠΊΡΠ΅Π»ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ)
- Π‘ΠΊΡΡΡΡΠ΅ ΡΠ»ΠΎΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π²ΡΡΠ²Π»ΡΡ Π²ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ
- ΠΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ»ΠΎΠΉ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΡΠΎΠ³ΠΎΠ²ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°)
ΠΠ°ΠΆΠ΄ΡΠΉ Π½Π΅ΠΉΡΠΎΠ½ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π²Ρ ΠΎΠ΄Π½ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΈΡ , ΠΏΡΠΈΠΌΠ΅Π½ΡΡ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΎΠ½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΊ Π²Π·Π²Π΅ΡΠ΅Π½Π½ΠΎΠΉ ΡΡΠΌΠΌΠ΅ Π²Ρ ΠΎΠ΄ΠΎΠ², ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π΄Π°Π»ΡΡΠ΅ ΠΏΠΎ ΡΠ΅ΡΠΈ. Π‘Π²ΡΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π΅ΠΉΡΠΎΠ½Π°ΠΌΠΈ ΠΈΠΌΠ΅ΡΡ Π²Π΅ΡΠΎΠ²ΡΠ΅ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π²Π°ΠΆΠ½ΠΎΡΡΡ ΡΠΈΠ³Π½Π°Π»Π°
ΠΡΠΎΡΠ΅ΡΡ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ Π½Π΅ΠΉΡΠΎΠ½Π½ΠΎΠΉ ΡΠ΅ΡΠΈ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΡΡΠΈΡ Π²Π΅ΡΠΎΠ²ΡΡ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΡ Π²ΡΠ΄Π°Π²Π°Π»Π° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ. ΠΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΡΠ΅ΠΌ:
- ΠΠΎΠ΄Π°ΡΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΎΠ±ΡΡΠ°ΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ²
- ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·Π°Π½ΠΈΡΠΌΠΈ ΡΠ΅ΡΠΈ ΠΈ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ
- ΠΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²ΠΊΠΈ Π²Π΅ΡΠΎΠ² Π΄Π»Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ (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 ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΡΡΠΎ Π±ΡΠ²Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΌΠΈ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ Π·Π°Π΄Π°Ρ, ΡΠ΅ΠΌ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅:
- ΠΠΈΠ½Π΅ΠΉΠ½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ: Π Π΅Π³ΡΠ΅ΡΡΠΈΡ, SVM, Π»ΠΎΠ³ΠΈΡΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅Π³ΡΠ΅ΡΡΠΈΡ
- ΠΠ΅ΡΠ΅Π²ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ: ΠΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠ΅ Π΄Π΅ΡΠ΅Π²ΡΡ ΠΈ Π°Π½ΡΠ°ΠΌΠ±Π»ΠΈ
- ΠΠ»Π°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ: K-means, DBSCAN
- ΠΠΎΠ½ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ½ΠΎΡΡΠΈ: PCA, t-SNE
- Π‘ΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ: ΠΠ°ΠΉΠ΅ΡΠΎΠ²ΡΠΊΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΎΡΠ΅Π½ΠΊΠ° ΠΏΠ»ΠΎΡΠ½ΠΎΡΡΠΈ
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΡΠ΅Π³ΡΠ΅ΡΡΠΈΠΈ:
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
- Π Π°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ. BEAM ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π»Π΅Π³ΠΊΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π·Π°Π΄Π°ΡΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ·Π»Π°ΠΌΠΈ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°
- ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π°ΠΊΡΠΎΡΠ°ΠΌ ΠΈ OTP, Elixir ΡΡΡΠ΅ΠΊΡΠΈΠ²Π΅Π½ Π΄Π»Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² IoT)
- ΠΠ°Π΄ΡΠΆΠ½ΠΎΡΡΡ. ΠΠΎΠ΄Π΅Π»ΠΈ ΠΌΠΎΠ³ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΏΡΠΎΡΡΠΎΡ
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈ Π²ΡΠ·ΠΎΠ²Ρ
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° Π±ΡΡΡΡΠΎΠ΅ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅, ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ° ML Π² Elixir ΠΈΠΌΠ΅Π΅Ρ ΡΡΠ΄ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ:
- ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ
- ΠΠ΅Π½ΡΡΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π»Ρ ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Python-Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ
- ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° TPU
- ΠΠ΅Π½ΡΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ ΠΎΠ±ΡΡΠ°ΡΡΠΈΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠ²
- ΠΠ΅ Π²ΡΠ΅ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΈΠ΄Ρ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ΅ΡΠΎΠ²) ΠΈΠΌΠ΅ΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ
ΠΠΎΠ³Π΄Π° ΡΡΠΎΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Elixir Π΄Π»Ρ ML:
- ΠΠ»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ML Π² ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ Elixir/Phoenix-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- Π ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , ΡΡΠ΅Π±ΡΡΡΠΈΡ Π²ΡΡΠΎΠΊΠΎΠΉ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ ΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡΠΈ
- ΠΠ»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½-ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ
- Π ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , Π³Π΄Π΅ Π²Π°ΠΆΠ΅Π½ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·ΠΌ
ΠΠΎΠ³Π΄Π° Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Python:
- ΠΠ»Ρ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΠΈ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ
- ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΡΠ·ΡΠΊΠΎΠ²ΡΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ)
- ΠΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΡΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ, Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π² Python-Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°Ρ
- ΠΡΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π³ΠΎΡΠΎΠ²ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ
ΠΡΠ΄ΡΡΠ΅Π΅ Π½Π΅ΠΉΡΠΎΡΠ΅ΡΠ΅ΠΉ Π½Π° Elixir
ΠΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ° Elixir Π΄Π»Ρ ML Π΅ΡΡ ΠΌΠΎΠ»ΠΎΠ΄Π°, Π½ΠΎ ΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Π½Π°. Π£ΡΠΈΠ»ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π° Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½Ρ Π½Π°:
- Π£Π»ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠΌ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ΠΌ (GPU/TPU)
- Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° Π³ΠΎΡΠΎΠ²ΡΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² Axon
- Π Π°Π·Π²ΠΈΡΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ (Explorer, Scholar)
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ° ML Π² Elixir Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ°Π·Π²ΠΈΠ²Π°Π΅ΡΡΡ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΈΠ»ΠΈΡΠΌ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Dashbit, ΠΈ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ². ΠΠ»Ρ ΡΠ΅Ρ , ΠΊΡΠΎ Ρ ΠΎΡΠ΅Ρ Π³Π»ΡΠ±ΠΆΠ΅ ΠΏΠΎΠ³ΡΡΠ·ΠΈΡΡΡΡ Π² ΡΠ΅ΠΌΡ, ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ΅ΡΡΡΡΡ:
- ΠΡΠΈΡΠΈΠ°Π»ΡΠ½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Nx
- Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Axon Π½Π° GitHub
- Train a Neural Network in Minutes with Elixir & Axon
- A Practical Guide to Machine Learning in Elixir - Chris Grainger
- Livebook ΠΊΠ°ΠΊ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ML-ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ²
ΠΡ Π°Π²ΡΠΎΡΠ°
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π²Π°Ρ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊ ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅! ΠΠ°Π΄Π΅ΡΡΡ, ΠΎΠ½Π° ΠΏΠΎΠΌΠΎΠ³Π»Π° Π²Π°ΠΌ Π»ΡΡΡΠ΅ ΠΏΠΎΠ½ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Elixir Π² ΡΡΠ΅ΡΠ΅ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΠΈ Π²Π΄ΠΎΡ Π½ΠΎΠ²ΠΈΠ»Π° Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ Ρ ΡΡΠΎΠΉ ΠΌΠΎΡΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠ΅ΠΉ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ =)
ΠΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ° ML Π² Elixir Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ°Π·Π²ΠΈΠ²Π°Π΅ΡΡΡ, ΠΈ Ρ Π±ΡΠ΄Ρ ΡΠ°Π΄ ΠΎΠ±ΡΡΠ΄ΠΈΡΡ Π»ΡΠ±ΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ, ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΡ. ΠΡΠ»ΠΈ Π²Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ Π½Π΅ΡΠΎΡΠ½ΠΎΡΡΠΈ Π² ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π΅ ΠΈΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ β ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, Π½Π°ΠΏΠΈΡΠΈΡΠ΅ ΠΎΠ± ΡΡΠΎΠΌ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ . ΠΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ²Π½Π°Ρ ΠΎΠ±ΡΠ°ΡΠ½Π°Ρ ΡΠ²ΡΠ·Ρ Π²ΡΠ΅Π³Π΄Π° ΡΠ΅Π½Π½Π° π
ΠΠ»Ρ ΡΠ΅Ρ , ΠΊΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π³Π»ΡΠ±ΠΆΠ΅ ΠΏΠΎΠ³ΡΡΠ·ΠΈΡΡΡΡ Π² ΠΌΠΈΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ, Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, ΠΏΡΠΈΠ³Π»Π°ΡΠ°Ρ Π·Π°Π³Π»ΡΠ½ΡΡΡ Π² ΠΌΠΎΠΉ ΡΠ΅Π»Π΅Π³ΡΠ°ΠΌ-ΠΊΠ°Π½Π°Π» π₯, Π³Π΄Π΅ Ρ Π΄Π΅Π»ΡΡΡ ΡΠ΅ΡΠ΅Π½Π·ΠΈΡΠΌΠΈ Π½Π° ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΊΠ½ΠΈΠ³ΠΈ, ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°ΠΌΠΈ ΠΏΠΎ Elixir ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ π€€
ΠΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΡΠ°ΡΡΠΈ ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΠΈ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠΉ ML-ΠΏΡΠΎΠ΅ΠΊΡ Π½Π° Elixir, ΡΠ°ΠΊ ΡΡΠΎ Π½Π΅ ΠΏΡΠΎΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅!