Введение
Говоря о создании алгоритмов обучения с учителем в 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.