Введение
Говоря о создании алгоритмов обучения с учителем в ML, неудивительно, если подумать о том, какой метод регуляризации использовать для получения более подходящих результатов.
На этапе обучения модель может работать точно на обучающих данных, но плохо работать на тестовых данных,известная как переобучение — здесь у нас низкая ошибка в отношении обучения наборов данных и высокая ошибкав отношении тестовых наборов данных.
Взяв этот график, чтобы лучше визуализировать утверждение:

Чтобы избежать этого явления, можно использовать различные методы. В этом блоге я постараюсь поделиться с вами своими знаниями о методах метода регуляризации.
Регуляризация
Чтобы продолжить, давайте сначала разберемся в этом методе — «регуляризации».
В регрессионном анализе признаки оцениваются с использованием коэффициентов при моделировании. Кроме того, если оценки можно ограничить, сжать или упорядочить до нуля, то влияние незначительных признаков может быть уменьшено и предотвратит высокую дисперсию моделей со стабильной подгонкой.
Проще говоря, регуляризация снижает коэффициенты (в глубоком обучении весовые матрицы узлов для повышения производительности модели).
Методы регуляризации:
- Регуляризация L2 и L1
Этот метод регуляризации наказывает сложные модели ML, добавляя член регуляризации к функции потерь/затрат модели. Разница между L1 и L2 заключается в самом термине регуляризации.
Приведенная ниже функция вычисляет ошибку/потери без функции регуляризации.

функция, которая может вычислять ошибку с функцией регуляризации L1,

функция, которая может вычислять ошибку сфункцией регуляризации L2,

Зная формулы этих двух подметодов (L1 и L2), мы узнаем, что регуляризация L1 дает выходные данные в двоичных весах от 0 до 1 для признаков модели и используется для уменьшения количества признаков в огромных размерностях. наборы данных. Регуляризация второго уровня распределяет погрешности по всем весам, что приводит к более точным настраиваемым окончательным моделям.
Реализация кода L2:
В этом примере мы рассчитаем градиентный спуск с регуляризацией L2.
давайте рассмотрим этот файл l2_reg_gradient_descent.py
#!/usr/bin/env python3
"""
Gradient Descent with L2 Regularization
"""
import numpy as np
def tanh(Z):
"""
Method:
Computes the Hyperbolic Tagent of Z elemnet-wise.
Parameters:
@Z (array): output of affine transformation.
Returns:
A (array): post activation output.
"""
A = np.tanh(Z)
return A
def l2_reg_gradient_descent(Y, weights, cache, alpha, lambtha, L):
"""
Method:
updates the weights and biases of a neural network using gradient descent with L2 regularization.
Parameters:
@Y: a one-hot that contains the correct labels for the data.
@weights: a dictionary of the weights and biases.
@cache: a dictionary of the outputs of each layer of the neural network
@alpha: the learning rate
@lambtha: the L2 regularization parameter
@L: the number of layers of the network
"""
# Number of trainings
m = Y.shape[1]
# Initialization for backpropagation algorithm
dZ = cache['A' + str(L)] - Y
for i in range(L, 0, -1):
# dW is the Derivative of the cost function w.r.t W of the current layer
dW = (np.matmul(dZ, cache['A' + str(i - 1)].T)) / m
# db is the Derivative of the cost function w.r.t b of the current layer
db = (np.sum(dZ, axis=1, keepdims=True)) / m
# dA is the Derivative of the cost function w.r.t A (cache) of the current layer
dA = 1 - np.square(cache['A' + str(i - 1)])
# dZ is the Derivative of the cost function w.r.t Z of the current layer
dZ = np.multiply(np.matmul(weights['W' + str(i)].T, dZ), dA)
# Updating weight matrix and the bias vector for each layer
reg_term = 1 - ((alpha * lambtha) / m)
weights['W' + str(i)] = reg_term * weights['W' + str(i)] - alpha * dW
weights['b' + str(i)] = weights['b' + str(i)] - alpha * db
файл main.py
#!/usr/bin/env python3
import numpy as np
l2_reg_gradient_descent = __import__('1-l2_reg_gradient_descent').l2_reg_gradient_descent
def one_hot(Y, classes):
"""convert an array to a one-hot matrix"""
m = Y.shape[0]
one_hot = np.zeros((classes, m))
one_hot[Y, np.arange(m)] = 1
return one_hot
if __name__ == '__main__':
lib= np.load('../data/MNIST.npz')
X_train_3D = lib['X_train']
print(X_train_3D.shape)
Y_train = lib['Y_train']
X_train = X_train_3D.reshape((X_train_3D.shape[0], -1)).T
Y_train_oh = one_hot(Y_train, 10)
np.random.seed(0)
weights = {}
weights['W1'] = np.random.randn(256, 784)
print(weights['W1'].shape)
weights['b1'] = np.zeros((256, 1))
weights['W2'] = np.random.randn(128, 256)
weights['b2'] = np.zeros((128, 1))
weights['W3'] = np.random.randn(10, 128)
weights['b3'] = np.zeros((10, 1))
cache = {}
cache['A0'] = X_train
cache['A1'] = np.tanh(np.matmul(weights['W1'], cache['A0']) + weights['b1'])
cache['A2'] = np.tanh(np.matmul(weights['W2'], cache['A1']) + weights['b2'])
Z3 = np.matmul(weights['W3'], cache['A2']) + weights['b3']
cache['A3'] = np.exp(Z3) / np.sum(np.exp(Z3), axis=0)
print(weights['W1'])
l2_reg_gradient_descent(Y_train_oh, weights, cache, 0.1, 0.1, 3)
print(weights['W1'])
- Выбывать

Это еще один метод регуляризации для уменьшения переобучения в искусственных нейронных сетях за счет предотвращения сложной совместной адаптации обучающих данных. Это эффективный способ усреднения модели с помощью нейронных сетей — ссылка.
Другими словами, он основан на стохастическом выпадении нейронов во время обучения.
Давайте посмотрим на метод отсева с математической точки зрения — к каждому элементу обучающей сети необходимо добавить вероятностный процесс.
Формула расчета сети без Dropout:

Используя формулу расчета сети Dropout:

- Увеличение данных
Этот метод отличается от предыдущих тем, что он не добавляет термины и не применяет какую-либо вероятность к слоям, а вместо этого добавляет больше данных в обучающие наборы для повышения производительности модели!

- Ранняя остановка
Основная проблема при обучении нейронных сетей заключается в том, как долго их обучать.
Слишком малое обучение будет означать, что модель не будет соответствовать поезду и тестовым наборам. Слишком много обучения будет означать, что модель будет соответствовать набору обучающих данных и будет плохо работать на тестовом наборе.
Таким образом, решение состоит в том, чтобы остановить градиентный спуск раньше.

Итак, мы подошли к концу блога, я очень рекомендую проверить эти ресурсы, если вы хотите глубже изучить одну из этих техник.
Чтобы узнать больше о кодировании, загляните в мой каталог GitHub, чтобы узнать о Регуляризация, Ссылка на GitHub.