Appearance
17. Генерация случайных тензоров и инициализация весов нейросетей
Современный генератор случайных чисел (Generator API)
Почему старый подход numpy.random.seed() объявлен Legacy
Исторически в NumPy генерация случайных чисел строилась на глобальном состоянии с использованием функций вроде numpy.random.seed() и numpy.random.normal(). В современной разработке ИИ этот подход официально объявлен устаревшим (Legacy).
Глобальный seed загрязняет состояние всего приложения, не защищен от многопоточных побочных эффектов и работает медленнее. На смену ему пришел современный объектно-ориентированный интерфейс Generator API.
Использование numpy.random.default_rng()
Современный стандарт требует явного создания независимого объекта-генератора с помощью функции numpy.random.default_rng(seed). Вы передаете фиксированное число (seed) в качестве аргумента, что гарантирует стопроцентную воспроизводимость ваших экспериментов — при каждом перезапуске кода веса нейросети будут инициализироваться абсолютно одинаково.
python
import numpy
# Creating an isolated, thread-safe random generator instance
# Using seed=42 for reproducibility
rng = numpy.random.default_rng(seed=42)Инициализация весов и аугментация
Нормальное и Равномерное распределения
Для инициализации параметров слоев (весов) в глубоком обучении используются два базовых случайных распределения:
- Нормальное распределение (
rng.normal(loc, scale, size)): Генерирует числа по Гауссовской кривой вокруг среднего значенияlocсо стандартным отклонениемscale. Параметрsizeпринимает кортеж нужной геометрии тензора. - Равномерное распределение (
rng.uniform(low, high, size)): Генерирует случайные числа, где каждое значение из диапазона отlowдоhighимеет абсолютно равную вероятность выпадения.
python
import numpy
rng = numpy.random.default_rng(seed=42)
# Initializing a 3x2 weight matrix using normal distribution (mean=0.0, std=0.01)
weights_matrix = rng.normal(loc=0.0, scale=0.01, size=(3, 2))
# Generating uniform feature scaling noise matrix
noise_matrix = rng.uniform(low=-1.0, high=1.0, size=(3, 2))Выбор и перемешивание данных для мини-батчей
В пайплайнах обучения ИИ-моделей случайность применяется для перемешивания датасетов (Shuffle) и случайного сэмплирования:
rng.shuffle(arr)— случайным образом перемешивает элементы массива на месте (in-place) вдоль первой оси (axis=0). Если передать матрицу, она перемешает строки (объекты), но сохранит внутреннюю структуру признаков.rng.choice(arr, size, replace)— совершает случайную выборку элементов из массива. Параметрreplace=Falseотключает повторение одних и тех же объектов в выборке, что идеально подходит для создания случайных сабсетов.
python
import numpy
rng = numpy.random.default_rng(seed=100)
dataset_indices = numpy.arange(10)
# Shuffling indices in-place to mix up sample sequences
rng.shuffle(dataset_indices)
print("Shuffled indices:", dataset_indices)
# Randomly picking 3 unique elements from an array
random_samples = rng.choice(dataset_indices, size=3, replace=False)Упражнения базовые (5 шт) (только с опорой на объясненную в данном уроке теорию)
1. Создание воспроизводимого генератора случайных чисел
Задача: Создайте изолированный генератор случайных чисел rng с зафиксированным значением seed=2026. Сгенерируйте с его помощью одномерный вектор из 4 случайных вещественных чисел в диапазоне от 0.0 до 1.0 (используя метод rng.random(size)). Выведите вектор.
Посмотреть решение
python
import numpy
# Initializing modern Generator API instance
rng = numpy.random.default_rng(seed=2026)
# Generating standard uniform floats
random_vector = rng.random(size=4)
print(random_vector)2. Инициализация весов слоя по Гауссу
Задача: Используя созданный ранее объект rng, инициализируйте матрицу весов полносвязного слоя размером 3 строки на 4 столбца. Числа должны быть взяты из нормального распределения со средним значением 0.0 и стандартным отклонением 0.1. Выведите полученную матрицу.
Посмотреть решение
python
import numpy
rng = numpy.random.default_rng(seed=42)
# Initializing weight distribution shapes
layer_weights = rng.normal(loc=0.0, scale=0.1, size=(3, 4))
print(layer_weights)3. Генерация матрицы шума аугментации
Задача: Сгенерируйте двумерную матрицу случайного шума размером 2x3, элементы которой равномерно распределены в диапазоне от -0.5 до 0.5 включительно. Используйте метод rng.uniform(). Выведите результат.
Посмотреть решение
python
import numpy
rng = numpy.random.default_rng(seed=42)
# Uniform bounding noise array setup
augmentation_noise = rng.uniform(low=-0.5, high=0.5, size=(2, 3))
print(augmentation_noise)4. Случайное перемешивание индексов батча
Задача: Создайте вектор индексов объектов indices = numpy.array([10, 20, 30, 40, 50]). Перемешайте этот массив случайным образом на месте (in-place) с помощью метода генератора. Выведите измененный массив.
Посмотреть решение
python
import numpy
rng = numpy.random.default_rng(seed=12)
indices = numpy.array([10, 20, 30, 40, 50])
# In-place index permutation
rng.shuffle(indices)
print(indices)5. Случайный выбор уникальных признаков (Сэмплирование)
Задача: Дан исходный массив доступных ID признаков: numpy.array([101, 102, 103, 104, 105, 106]). Случайным образом выберите из него ровно 3 уникальных признака без повторений. Выведите полученный подмассив.
Посмотреть решение
python
import numpy
rng = numpy.random.default_rng(seed=99)
feature_ids = numpy.array([101, 102, 103, 104, 105, 106])
# Sampling random unique subsets without replacements
selected_features = rng.choice(feature_ids, size=3, replace=False)
print(selected_features)Упражнения смешанные (5 шт) (включают материал прошлых уроков)
6. Генерация случайного батча и аудит его физических характеристик
Задача: С помощью rng.uniform() сгенерируйте случайную матрицу признаков размером (100, 4) в диапазоне от 0.0 до 1.0 (Урок 17). Принудительно задайте ей тип данных одинарной точности numpy.float32 (Урок 4 / Урок 11). Выведите на экран метаданные получившегося объекта: размерность .ndim, кортеж геометрии .shape и общий физический вес в байтах через .nbytes (Урок 2).
Посмотреть решение
python
import numpy
rng = numpy.random.default_rng(seed=42)
# Step 1: Generate uniform 2D matrix with specific dtype (Lesson 4, 11 & 17)
features_matrix = rng.uniform(low=0.0, high=1.0, size=(100, 4)).astype(numpy.float32)
# Step 2: Extracting structural metrics metadata (Lesson 2)
print("Dimensions:", features_matrix.ndim) # 2
print("Shape format:", features_matrix.shape) # (100, 4)
print("Physical size:", features_matrix.nbytes, "bytes") # 400 elements * 4 bytes = 1600 bytes7. Прямой проход слоя (XW) со случайно инициализированными весами
Задача: Дан детерминированный входной батч признаков X = numpy.array([[1.0, 2.0, 3.0], [0.5, 1.5, 2.5]]) (Урок 11). С помощью rng.normal() сгенерируйте случайную матрицу весов W размером (3, 2) со средним 0.0 и отклонением 0.01 (Урок 17). Выполните истинное матричное умножение X @ W (Урок 14) и выведите результирующую матрицу активаций.
Посмотреть решение
python
import numpy
rng = numpy.random.default_rng(seed=42)
X = numpy.array([[1.0, 2.0, 3.0],
[0.5, 1.5, 2.5]])
# Generating random weights matrix (Lesson 17)
W_weights = rng.normal(loc=0.0, scale=0.01, size=(3, 2))
# Matrix dot product execution (Lesson 14)
layer_activations = X @ W_weights
print(layer_activations)8. Случайное сэмплирование строк мини-батча из табличного датасета
Задача: Сгенерируйте упорядоченный базовый датасет размером (10, 2) из чисел от 0 до 19 через arange и reshape (Урок 3 / Урок 11). С помощью rng.choice() выберите случайным образом 3 уникальных индекса строк в диапазоне от 0 до 9 (Урок 17). Используя полученный вектор случайных индексов, извлеките соответствующие строки из базового датасета с помощью правил двумерного слайсинга (Урок 13). Выведите полученный случайный мини-батч.
Посмотреть решение
python
import numpy
rng = numpy.random.default_rng(seed=77)
# Step 1: Base dataset creation (Lesson 3 & Lesson 11)
main_dataset = numpy.arange(20).reshape(10, 2)
# Step 2: Sampling unique index identifiers (Lesson 17)
random_row_indices = rng.choice(numpy.arange(10), size=3, replace=False)
# Step 3: Extracting matching rows from matrix space (Lesson 13)
sampled_mini_batch = main_dataset[random_row_indices, :]
print("Sampled row indices:", random_row_indices)
print("Extracted mini-batch matrix:\n", sampled_mini_batch)9. Стандартизация случайно сгенерированной матрицы признаков
Задача: Сгенерируйте случайную матрицу признаков размером (5, 3) из нормального распределения (Урок 17). Вычислите вектор средних значений по столбцам .mean(axis=0) и вектор стандартных отклонений по столбцам .std(axis=0) (Урок 15). Проведите Z-score нормализацию всей матрицы: вычтите вектор средних и разделите результат на вектор отклонений (Урок 7). Выведите итоговую стандартизированную матрицу.
Посмотреть решение
python
import numpy
rng = numpy.random.default_rng(seed=123)
# Creating a raw features matrix block (Lesson 17)
raw_matrix = rng.normal(loc=10.0, scale=5.0, size=(5, 3))
# Column-wise statistical aggregations (Lesson 15)
column_means = raw_matrix.mean(axis=0)
column_stds = raw_matrix.std(axis=0)
# Vectorized standard scaling transformation (Lesson 7)
standardized_matrix = (raw_matrix - column_means) / column_stds
print(standardized_matrix)10. Поиск классов (Argmax) на выходе слоя со случайными смещениями
Задача: Сгенерируйте случайную матрицу сырых логитов модели размером (3, 3) с помощью rng.uniform в диапазоне от -2.0 до 2.0 (Урок 17). Создайте случайный вектор смещений bias = rng.normal(loc=0.0, scale=0.5, size=3). Прибавьте вектор смещений к матрице логитов на месте через оператор += (Урок 8). С помощью метода .argmax(axis=1) определите вектор финальных предсказанных классов для каждого из 3-х объектов (Урок 15). Выведите вектор классов.
Посмотреть решение
python
import numpy
rng = numpy.random.default_rng(seed=55)
# Setting up stochastic matrix and tensor components (Lesson 17)
logits_matrix = rng.uniform(low=-2.0, high=2.0, size=(3, 3))
bias_vector = rng.normal(loc=0.0, scale=0.5, size=3)
# Memory-efficient in-place broadcasting accumulation (Lesson 8)
logits_matrix += bias_vector
# Extracting categorical prediction label vectors (Lesson 15)
final_predictions = logits_matrix.argmax(axis=1)
print("Ffinal calculated predictions classes vector:", final_predictions)