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

Вы когда-нибудь задумывались, как приложения машинного обучения в некоторых случаях дают результаты в реальном времени? Как специалисты по машинному обучению снова и снова тренируют большие данные, используя новые образцы / или обучающие данные? Если да, то вот наивное руководство. Я собираюсь объяснить некоторые фундаментальные концепции, связанные с тем, как мы можем реализовать алгоритмы машинного обучения онлайн с использованием Python.

Ниже приведена ссылка на Github для исходного кода на python и образец набора данных в соответствии с проблемой, заданной курсом Coursera Andrew Ng по машинному обучению.



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

  1. Сбор данных и предварительная обработка
  2. Расчет на наборе данных
  3. Визуализация и анализ

В этой статье я в основном сосредоточусь на втором подмодуле, упомянутом выше - Вычисления на наборе данных.

Теперь я собираюсь объяснить концепции одновременно с кодами для лучшего понимания.

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

import pandas as pd
import numpy as np 
data = pd.read_csv("path_to_file.csv")
Y = data["Name of the Column"]
del data["Profit"]
bias = pd.Series(1,index=range(len(Y))) 
data["Bias"] = bias
Header_X_Bias = list(data.columns.values)
Header_X_Bias = Header_X_Bias[:-1]
Header_X_Bias.insert(0,"Bias")
data = data[Header_X_Bias] 
X = np.array(data)
Y = np.array(Y)
Y = Y.reshape(len(Y),1)
Theta = [0,0]
Theta = np.array(Theta)
Theta = Theta.reshape(2,1)
#Here Theta is the global variable

Мы бы использовали библиотеку Pandas для чтения наборов данных из файла и модуль NumPy для выполнения вычислений линейной алгебры.

После импорта модулей я прочитал набор данных в переменную «data». Оттуда я отделил «Y», который является зависимой переменной (в нашем случае «Прибыль» (подробнее см. Ссылку на GitHub)) набора данных, и добавил столбец «Смещение» со значением 1 в наборе X. Данный набор данных содержит только 1 функцию.

Y: прибыль

X: Xi - это i-й вектор-строка матрицы X (размерность X равна 'm' X 2), где Xi имеет размерность 2.

X [0]: смещение; X [1]: оригинальный одиночный фильм.

И X, и Y преобразуются в правильный формат матрицы для вычисления numpy, а начальная Theta также объявляется со значением [0,0], поскольку размер объекта равен 2, включая Bias.

def cost(X,Y,Theta):    
     Hypothesis = np.dot(X,Theta)    
     Error = Y - Hypothesis    
     #Matrix method for calculating Cost    
     Cost = np.dot(Error.T,Error)/(2*len(Error))    
     return Cost[0][0]

Затем определяется функция стоимости, которая принимает на вход три параметра: первый - X, второй - Y, а третий - Theta. Внутри функции он сначала вычисляет гипотезу, а затем вычисляет стоимость векторизованным способом.

Let 
m = Total number of training examples
d = Total number of features including bias = 2
Dimension of X : (m,d)
Dimension of Y : (m,1)
Dimension of Theta : (d,1)
Dimension of Loss : (m,1)

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

alpha = 0.01
Iterations = 1500

Шаги «альфа» и «итерация» объявляются константами.

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

def gradient(X,Y,Theta,Iterations,alpha):    
     for i in range(Iterations):        
          Loss = Y - np.dot(X,Theta) + (np.dot(Theta.T,Theta)*0.001)
          Cost = cost(X,Y,Theta)        
          Loss = Loss*(-1)        
          dJ = (np.dot(X.T,Loss)*2)/len(Y)
          Theta = Theta - (alpha*dJ)
     return Theta

Выше фрагмент кода является определением функции градиентного спуска. В качестве параметров он принимает X, Y, Theta, Iterations и alpha.

Он зацикливается на шагах «Итераций» и на каждом шаге пересматривает значение Theta на основе значения Cost. Внутри каждого цикла рассчитывается убыток.

Потеря = Y-гипотеза

(np.dot (Theta.T, Theta) * 0.001) = Это термин регуляризации

Гипотеза = dot_product (X, Theta)

После вычисления потерь и в каждом цикле частная производная по каждому параметру (тета-значение, соответствующее характеристике) вычисляется в векторизованном формате как

(2 * dot_product (X.T, Loss)) / м

И, наконец, Theta обновляется как

Тета = Тета- (альфа * частичное_произвольное)

В вышеупомянутом аналогичном процессе Theta - это количество «итераций» обновления, а функция градиента возвращает окончательное обновленное Theta.

Theta = gradient(X,Y,Theta,Iterations,alpha)
#Here Theta is the global variable

До сих пор у нас есть метод вычисления обновленной Theta с учетом потерь и итераций.

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

Поскольку мы собираемся использовать обновленную и обученную Theta, которую мы получили от функции Gradient, эта Theta будет всегда обновляться в каждом экземпляре онлайн-обучения. Ниже я покажу вам фрагмент кода для определения функции онлайн-обучения.

def online_train(Xn, Yn, Theta):
     Loss = Yn - np.dot(Xn,Theta) + (np.dot(Theta.T,Theta)*0.001)
     Loss = Loss*(-1)        
     dJ = (np.dot(Xn.T,Loss)*2)/len(Y)
     Theta = Theta - (alpha*dJ)
     return Theta

Функция online_train похожа на функцию градиента, только с небольшой разницей. Разница в том, что в функцию передается тета. В случае функции градиента, переданной Theta является [0,0], которая представляет собой случайные инициализированные значения, тогда как в случае функции online_train, Theta - это предварительно обученная Theta, возвращенная из функции градиента.

K = Total number of new data (Generally K = 1)
Dimension of Xn : (K,d)
Dimension of Yn : (K,1)

И функция online_train вызывается всякий раз, когда приходят новые данные, например

#On Arrival a new single data vector
Theta = online_train(X_new, Y_new, Theta)
#X_new : new data vector
#Y_new : Y value corresponding to X_new

А для предсказания с помощью Theta можно спрогнозировать значение тестовых данных.

Лучшая часть онлайн-обучения заключается в том, что оно очень адаптируется к новому набору обучения и может обновлять Theta на основе нового набора данных без повторного обучения всего набора данных.

Одним из основных преимуществ онлайн-обучения является то, что оно занимает довольно мало места при реализации в приложениях реального времени. После первой фазы обучения можно отбросить X и Y, так как у нас есть Theta, которую можно использовать в будущем для дальнейших вычислений.

Кроме того, онлайн-обучение можно использовать и для полного обучения, передавая один вектор данных каждый раз в цикле и обновляя тета (веса) на каждом шаге цикла. Таким образом, можно визуализировать сходимость, и, если кажется, что сходимость достигнута, итерации можно остановить для оптимальности вычислений. Метод будет чем-то похож на концепцию нейронной сети.

Если вы слышали об онлайн-обучении, то, полагаю, вы тоже слышали о пакетном обучении. Пакетное обучение - это переработанная версия онлайн-обучения, где 'K' ›1 и в основном 'K' = Batch Size, который определяется по 'm' ( количество наблюдений в обучающей выборке). Оба алгоритма посещают одну и ту же точку минимума во время сходимости, просто они обновляют свои Theta в разных точках выборки обучающих данных.

Если мы перечислим преимущества онлайн-обучения: -

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

Благодаря лучшему пониманию алгоритмов машинного обучения и глубокому изучению математических концепций обновления весов, таких как градиентный спуск, обратное распространение, адам и т. Д., Можно легко разработать решение для онлайн-обучения, специфичное для этого конкретного алгоритма машинного обучения. Ключ в том, чтобы понять алгоритм наилучшим образом математически.

Прогресс в онлайн-обучении может внести большие изменения в внедрение методов машинного обучения для реализации в продуктах в реальном времени и сделать их удобнее для пользователей. В конце концов, это всего лишь один шаг впереди к идеальному искусственному интеллекту.

дальнейшее чтение