От стандартных уравнений градиентный спуск заглядывает в принципы обучения машинному обучению

глубокое обучение

Изучение машинного обучения должно не просто останавливаться на вызове scikit-learn или tensorflow (глубокое обучение), но должно быть сосредоточено на внутреннем мире, обучении машинному обучению в течение определенного периода времени, необходимо вернуться и разобраться, нижеследующее основано на линейной модели, чтобы увидеть

  • Стандартное уравнение
  • градиентный спуск Затем давайте посмотрим, как реализовать обучение модели на основе двух предыдущих.Основная идея та же, и по аналогии можно использовать разные модели.
Ниже мы опишем распределение

1. Стандартное уравнение

2. Градиентный спуск

3. Процесс обучения модели машинного обучения

1. Стандартное уравнение

标准方程:其实就是求算法模型成本函数最小,即为0的时候的\theta的闭式解

Это определение на самом деле вполне понятно: Давайте далее продемонстрируем линейную регрессию:

  • 1. Прогнозирующие модели для линейной регрессии
y = \theta  * X
  • 2. Тогда функция стоимости линейной регрессии равна MSE:
MSE(X,h_\theta) = 1/m  \sum_{i=0}^{m}(\theta^T * Xi  - yi)^2
  • 3. Затем мы берем производную от MSE и делаем ее равной 0, так что мы получаем решение в закрытой форме с весом тета в качестве зависимой переменной:
\theta = (X^T * X)^{-1} * X^T  * y
  • 4. С помощью стандартного уравнения модель может начать прогнозировать:
y(pred) = \theta * X

2. Градиентный спуск

Градиентный спуск: это может быть процесс нахождения самой низкой точки функции стоимости шаг за шагом, начиная с начальной тета;

\theta(next) = \theta - \eta \frac{\partial mse}{\partial \theta}
\theta:权重向量 \quad  \eta:学习率 \quad \frac{\partial mse}{\partial \theta}:梯度

Фактически, мы можем дополнительно понять градиентный спуск через приведенные выше параметры:

  • Градиентный спуск: постоянно обновляйте веса по приведенной выше формуле и постоянно обучайте модель.Когда функция стоимости достигает идеального значения, прекратите обновление весов, то есть прекратите обучение модели.
    在这里插入图片描述
2.1: Расчет вектора градиента:

Вышеприведенный примерградиентный спуск, Взяв в качестве примера линейную регрессию, вектор градиента функции стоимости также можно рассчитать с помощью замкнутого уравнения:

\frac{\partial mse}{\partial \theta} = 2/m * \sum_{i=1}^m(\theta * X^{(i)} - y^{(i)})x_j^{(i)}
\frac{\partial mse}{\partial \theta} = 2/m * X^T * (X*\theta - y)
2.2: Скорость обучения

Скорость обучения очень важна в процессе градиентного спуска, Если скорость обучения очень низкая, для сходимости алгоритма потребуется много времени; И наоборот, если скорость обучения слишком высока, функция будет быстро расходиться, и в конечном итоге оптимальное решение не будет найдено. Следовательно, скорость обучения является важным гиперпараметром, и мы должны получить наилучшую скорость обучения с помощью таких методов, как поиск по сетке, или мы можем регулярно снижать скорость обучения по мере увеличения количества тренировок: См. легенду ниже: (Во-первых, скорость обучения слишком низкая, во-вторых, скорость обучения слишком высока)

在这里插入图片描述
在这里插入图片描述

Градиентный спуск можно разделить на 3 типа, основные из которых различаются уровнем формы X, используемым для обучения:

  1. Пакетный градиентный спуск: вычисление градиента с использованием всех данных одновременно.
  2. Стохастический градиентный спуск: используйте случайный фрагмент данных для расчета градиента за раз
  3. Мини-пакетный градиентный спуск: каждый раз случайным образом брать часть данных из данных для расчета

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

3. Процесс обучения модели машинного обучения

Вставьте часть кода тензорного потока ниже (вы можете пропустить этот код, если не знаете тензорного потока):

m, n = housing.data.shape
n_epochs = 1000
learning_rate = 0.01
pipeline = Pipeline([
    ('std_scaler', StandardScaler())
])
scaled_housing_data_plus_bias = pipeline.fit_transform(housing_data_plus_bias)
serialize_data(scaled_housing_data_plus_bias,'scaled_housing_data_plus_bias')
X = tf.constant(scaled_housing_data_plus_bias, dtype=tf.float32, name='X')
y = tf.constant(housing.target.reshape(-1, 1), dtype=tf.float32, name='y')
# 获取初始的theta
theta = tf.Variable(tf.random_uniform([n + 1, 1], -1.0, 1.0), name='theta')
y_pred = tf.matmul(X, theta, name='predictions')
error = y_pred - y
mse = tf.reduce_mean(tf.square(error), name='mse')
gradients = 2 / m * tf.matmul(tf.transpose(X), error)
training_op = tf.assign(theta, theta - learning_rate * gradients)
# 开启会话
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(n_epochs):
        if epoch % 100 == 0:
            print('Epoch', epoch, 'MSE = ', mse.eval())
        sess.run(training_op)
        # training_op.eval()
    best_theta = theta.eval()

Подробно объясните принцип:

1. Инициализируйте весовой вектор\theta,здесь\thetaИнициализация требует внимания,\thetaФорма должна быть (особенности,)

2. Затем используйте\theta*XНайдите текущее значение прогноза, а затем найдитеMSE, а затем используйте следующую формулу:

\frac{\partial mse}{\partial \theta} = 2/m * X^T * (X*\theta - y)\;\;\;\;\;\;\;\theta(next) = \theta - \eta \frac{\partial mse}{\partial \theta}

возобновить\theta, Повторяйте шаги 1 и 2 несколько раз, пока значение MSE не станет оптимальным, и прекратите обновление\theta, и прекратить тренировку

Таким образом, модель непрерывно обучается на основе данных до тех пор, пока выходные данные модели не станут оптимальными: Но одно замечание: Поскольку этот процесс обучения основан на X, нам нужно использовать мини-пакетный градиентный спуск, чтобы повысить эффективность: например: каждый раз брать 50 фрагментов данных для обучения, что значительно повышает эффективность