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
// libs/v1/src/ml/activation.rs
//
//! # Функции для машинного обучения (ML).
//!
//! Модуль содержит популярные функции активации, используемые при построении
//! нейронных сетей, такие как GELU и ReLU.
//!
//! **Примечание**: rustdoc не рендерит `LaTeX`, поэтому приходится использовать unicode, и другие символы для показа формул.
use crateSQRT_2_OVER_PI;
/// # Аппроксимация GELU через tanh
///
/// **GELU** (Gaussian Error Linear Unit) — это плавная функция активации, которая взвешивает
/// входное значение по его вероятности в стандартном нормальном распределении. Часто применяется
/// в современных архитектурах вроде Transformer (BERT, GPT).
///
/// Данная реализация использует быструю и точную аппроксимацию через гиперболический тангенс.
///
/// ### Формула
/// ```text
/// GELU(x) ≈ 0.5x · (1 + tanh(√(2/π) · (x + 0.044715x³)))
/// ```
///
/// ### Примеры
/// ```
/// use v1::ml::activation::gelu_tanh;
///
/// assert!((gelu_tanh(0.0) - 0.0).abs() < 1e-6);
/// assert!((gelu_tanh(1.0) - 0.8413).abs() < 1e-3);
/// assert!(gelu_tanh(-4.0).abs() < 1e-3);
/// ```
/// # Аппроксимация GELU через сигмоиду
///
/// Более быстрая, но чуть менее точная (по сравнению с tanh) аппроксимация функции GELU.
/// Она вычисляется через масштабированную сигмоидальную функцию. Часто используется в задачах,
/// где критична максимальная скорость вычислений в ущерб минимальной точности на изгибах.
///
/// ### Формула
/// ```text
/// x
/// GELU(x) ≈ x * σ(1.702 * x) = ———————
/// 1 + e⁻¹·⁷⁰²ˣ
/// ```
///
/// ### Примеры
/// ```
/// use v1::ml::activation::gelu_sigmoid;
///
/// assert!((gelu_sigmoid(0.0) - 0.0).abs() < 1e-6);
/// assert!((gelu_sigmoid(1.0) - 0.8458).abs() < 1e-2);
/// assert!(gelu_sigmoid(-4.0).abs() < 1e-2);
/// ```
/// # Функция активации ReLU (Rectified Linear Unit)
///
/// **ReLU** — одна из самых популярных и вычислительно эффективных функций активации.
/// Она возвращает `x`, если число положительное, и `0.0`, если отрицательное или ноль.
///
/// Эффективно решает проблему затухания градиентов в глубоких сетях, однако подвержена
/// проблеме "умирающих нейронов" (Dying ReLU), когда нейроны на отрицательных диапазонах
/// перестают обновлять свои веса.
///
/// ### Формула
/// ```text
/// ReLU(x) = max(0, x)
/// ```
///
/// ### Примеры
/// ```
/// use v1::ml::activation::relu;
///
/// assert_eq!(relu(5.0), 5.0);
/// assert_eq!(relu(-3.0), 0.0);
/// assert_eq!(relu(-0.0), 0.0);
/// ```
/// # Логистическая функция (Сигмоида / Sigmoid)
///
/// Преобразует любое входное значение в диапазон от `0.0` до `1.0`.
/// Часто используется на выходном слое нейросети для предсказания вероятностей.
///
/// ### Формула
/// ```text
/// 1
/// σ(x) = —————————————
/// 1 + e⁻ˣ
/// ```
///
/// ### Примеры
/// ```
/// use v1::ml::activation::sigmoid;
///
/// assert!((sigmoid(0.0) - 0.5).abs() < 1e-6);
/// assert!((sigmoid(2.0) - 0.880797).abs() < 1e-5);
/// assert!(sigmoid(-10.0) < 1e-4);
/// ```
/// # Функция активации LeakyReLU
///
/// Модификация классической `ReLU`. Вместо полного обнуления отрицательных значений,
/// она пропускает их с небольшим коэффициентом (альфа), что предотвращает проблему
/// "умирающих нейронов" (Dying ReLU).
///
/// ### Формула
/// ```text
/// LeakyReLU(x) = max(α * x, x)
///
/// где α (alpha) обычно равен 0.01
/// ```
///
/// ### Примеры
/// ```
/// use v1::ml::activation::leaky_relu;
///
/// assert_eq!(leaky_relu(5.0, 0.01), 5.0);
/// assert_eq!(leaky_relu(-2.0, 0.01), -0.02);
/// ```
/// # Функция активации Softplus
///
/// Гладкая и непрерывная альтернатива функции `ReLU`. Преобразует любое
/// входное значение в строго положительное число в диапазоне `(0.0, +inf)`.
///
/// Первая производная этой функции математически равна стандартной Сигмоиде.
///
/// Для предотвращения численного переполнения (`f32::INFINITY`) при больших
/// значениях `x` применяется линейная стабилизация.
///
/// ### Формула
/// ```text
/// Softplus(x) = ln(1 + eˣ)
///
/// При x > 20.0: Softplus(x) ≈ x
/// ```
///
/// ### Примеры
/// ```
/// use v1::ml::activation::softplus;
///
/// // В нуле Softplus равен ln(2) ≈ 0.693147
/// assert!((softplus(0.0) - 0.693147).abs() < 1e-6);
/// // Проверка стабильности при экстремально больших x (не вызывает overflow)
/// assert_eq!(softplus(90.0), 90.0);
/// // Для больших отрицательных x из-за лимитов точности f32 значение округляется до 0.0
/// assert_eq!(softplus(-20.0), 0.0);
/// assert!(softplus(-20.0) <= 1e-5);
/// ```
/// # Функция активации SiLU (Swish)
///
/// **SiLU** (Sigmoid Linear Unit), также известная как **Swish**, взвешивает входное
/// значение по его сигмоидальной вероятности. Является стандартом де-факто в
/// современных архитектурах языковых моделей (LLaMA, Mistral).
///
/// ### Формула
/// ```text
/// SiLU(x) = x · σ(x) = x / (1 + e⁻ˣ)
/// ```
///
/// ### Примеры
/// ```
/// use v1::ml::activation::silu;
///
/// // В нуле SiLU равен строго 0.0
/// assert!((silu(0.0) - 0.0).abs() < 1e-6);
/// // В точке 1.0 значение ≈ 0.731058
/// assert!((silu(1.0) - 0.731058).abs() < 1e-5);
/// ```
/// # Функция активации ELU (Exponential Linear Unit)
///
/// Экспоненциальная линейная единица. Сглаживает отрицательную полуплоскость
/// с помощью экспоненты, что позволяет среднему значению активаций быть ближе к нулю
/// и ускоряет сходимость сети при обучении.
///
/// ### Формула
/// ```text
/// ELU(x) = x, при x > 0
/// ELU(x) = α · (eˣ - 1), при x ≤ 0
/// ```
///
/// ### Примеры
/// ```
/// use v1::ml::activation::elu;
///
/// assert_eq!(elu(5.0, 1.0), 5.0);
/// // При x <= 0 и alpha = 1.0, в точке -1.0 значение ≈ -0.63212
/// assert!((elu(-1.0, 1.0) - (-0.632120)).abs() < 1e-5);
/// ```