Skip to content

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)

Инициализация весов и аугментация ​

Нормальное и Равномерное распределения ​

Для инициализации параметров слоев (весов) в глубоком обучении используются два базовых случайных распределения:

  1. Нормальное распределение (rng.normal(loc, scale, size)): Генерирует числа по Гауссовской кривой вокруг среднего значения loc со стандартным отклонением scale. Параметр size принимает кортеж нужной геометрии тензора.
  2. Равномерное распределение (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 bytes

7. Прямой проход слоя (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)