Наивный подход к реализации онлайн-обучения с линейной регрессией и градиентным спуском с использованием Python.
Вы когда-нибудь задумывались, как приложения машинного обучения в некоторых случаях дают результаты в реальном времени? Как специалисты по машинному обучению снова и снова тренируют большие данные, используя новые образцы / или обучающие данные? Если да, то вот наивное руководство. Я собираюсь объяснить некоторые фундаментальные концепции, связанные с тем, как мы можем реализовать алгоритмы машинного обучения онлайн с использованием Python.
Ниже приведена ссылка на Github для исходного кода на python и образец набора данных в соответствии с проблемой, заданной курсом Coursera Andrew Ng по машинному обучению.
Большинство приложений машинного обучения используют следующие подходы. Это итеративный процесс, и каждый шаг может выполняться по мере необходимости. Три основных шага:
- Сбор данных и предварительная обработка
- Расчет на наборе данных
- Визуализация и анализ
В этой статье я в основном сосредоточусь на втором подмодуле, упомянутом выше - Вычисления на наборе данных.
Теперь я собираюсь объяснить концепции одновременно с кодами для лучшего понимания.
Онлайн-обучение: это метод импровизации на этапе обучения, при котором веса для используемой модели обновляются в соответствии с поступившими новыми данными, а не повторно тренируются для всей модели. По сути, это пошаговый метод обучения. Применение этого вида обучения в основном можно найти в приложениях реального времени, в которых для этой цели используются модели прогнозирования или классификации.
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 в разных точках выборки обучающих данных.
Если мы перечислим преимущества онлайн-обучения: -
- Это может быть полезно для оптимизации пространства, когда пространство является проблемой.
- Его можно использовать в приложениях реального времени, где предполагается адаптация модели к новым точкам данных.
- Наиболее важные приложения онлайн-обучения можно найти в веб-приложениях, которые основаны на принципах прогнозного моделирования, классификации и рекомендательных систем.
Благодаря лучшему пониманию алгоритмов машинного обучения и глубокому изучению математических концепций обновления весов, таких как градиентный спуск, обратное распространение, адам и т. Д., Можно легко разработать решение для онлайн-обучения, специфичное для этого конкретного алгоритма машинного обучения. Ключ в том, чтобы понять алгоритм наилучшим образом математически.
Прогресс в онлайн-обучении может внести большие изменения в внедрение методов машинного обучения для реализации в продуктах в реальном времени и сделать их удобнее для пользователей. В конце концов, это всего лишь один шаг впереди к идеальному искусственному интеллекту.
дальнейшее чтение
- Оптимизаторы - http://ruder.io/optimizing-gradient-descent/index.html
- Онлайн-обучение - https://www.coursera.org/learn/machine-learning/lecture/ABO2q/online-learning