Экспериментальное сравнение нейронной сети и линейной регрессии.

Глубокое обучение (DL) захватило почти все области применения AI / ML в промышленности, а также в исследовательских сообществах. Выйдя из академического мира 2 года назад и работая в роли Data Science (DS), у меня была возможность стать свидетелем появления и преобладания DL в обеих областях. Хотя нет сомнений в том, что DL превосходит традиционные методы ML во многих приложениях / исследованиях, все больше и больше академических ученых и практиков ML призывают признать тот факт, что модели и образ мышления DL могут быть (и продолжают оставаться) используется оскорбительным образом (https://towardsdatascience.com/the-machine-learning-crisis-in-scientific-research-91e61691ae76) как в академических, так и в промышленных сферах. Это стало модным словом, когда связанные методы используются без дальнейшего рассмотрения или просто для самоанализа: Действительно ли это лучший вариант для этой проблемы?.

У меня было несколько шансов провести собеседование с кандидатами на должность Data Scientist в моей команде, и пару раз я задавал этот вопрос:

Не могли бы вы привести пример проблемы, о которой вы думаете или знаете наверняка, что модели DL выйдут из строя?

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

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

Возвращаясь к вопросу интервью, я сконструировал себе «мысленный эксперимент» (больше похожий на эксперимент с записной книжкой Юпитера на языке DS) о случае, когда наивное применение модели DL потерпит неудачу.

Эксперимент

Давайте создадим синтетический набор данных. Мы предполагаем, что наблюдаем измерения с помощью неизвестной функции, и мы хотели бы построить модель машинного обучения, чтобы предсказать цель с учетом выбранной независимой переменной после обучения с помеченными данными. На самом деле неизвестная функция (иногда называемая функцией «Бог знает») - это естественное распределение данных, которое генерирует измерения, которые мы наблюдаем. В этом эксперименте мы используем простую линейную функцию y=a*x+b как бог знает сколько функций. Затем мы добавляем к цели немного белого шума, чтобы смоделировать неопределенность в процессе измерения.

a = 0.5
b = 100
noise_mag = 10
x = np.array(range(1000))
y = a*x + b
white_noise = noise_mag * np.random.randn(len(x))
y_noise = y + white_noise
# --- split train test
x_train, x_test, y_train, y_test = train_test_split(x, y_noise, test_size=0.30, random_state=42)
x_train = x_train.reshape(-1,1)
x_test = x_test.reshape(-1,1)
y_train = y_train.reshape(-1,1)
y_test = y_test.reshape(-1,1)
plt.figure(figsize=(10,5))
plt.plot(x,y)
plt.scatter(x_train, y_train, c='b')
plt.scatter(x_test, y_test, c='r')

Как мы видим, это простой набор данных с линейной зависимостью между независимыми и зависимыми переменными.

Чтобы ввести данные в заблуждение, мы создаем дополнительные «тривиальные» функции:

x_tri_0 = x + 10
x_tri_1 = x * 10
x_tri_2 = np.power(x, 2)
x_tri = np.concatenate((x.reshape(-1, 1), x_tri_0.reshape(-1, 1), x_tri_1.reshape(-1, 1), x_tri_2.reshape(-1, 1)), axis=1)

Итак, мы добавили еще три функции, все они просто зависимости исходной (созданной с помощью линейных и нелинейных преобразований). Любой, кто работал над моделями машинного обучения в производстве, сможет легко указать на то, что эти тривиальные функции можно отфильтровать, просто взглянув на корреляцию функций. Можно было бы увидеть очень сильную корреляцию между 4 функциями, сигнализирующую о том, что только одна функция может представлять все данные.

Проводя мысленный эксперимент, мы хотим увидеть, как модель нейронной сети работает с необработанными данными без надлежащей очистки и анализа данных. Следовательно, мы продолжаем вводить эти 4 функции напрямую в модель DL.

Мы выполняем стандартные наборы данных для обучающих тестов, разделяем и обучаем нейронную сеть Keras.

x_train, x_test, y_train, y_test = train_test_split(x_tri, y_noise, test_size=0.30, random_state=42)
y_train = y_train.reshape(-1,1)
y_test = y_test.reshape(-1,1)
model = Sequential()
model.add(Dense(50, input_dim=4))
model.add(Dense(10))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=150, batch_size=8)
pred_keras = model.predict(x_test)
print('Test error of keras = {}'.format(
    np.sqrt(mean_squared_error(pred_keras, y_test))
))

Это дает:

Test error of keras = 36.048217021416036

У нас есть среднеквадратичная ошибка (RMSE) 36,048.

Затем давайте удалим все тривиальные функции и попробуем снова с той же моделью Keras, которую мы построили выше. Другими словами, наше пространство функций теперь имеет размерность 1, а не 4, как раньше, поскольку мы сохраняем только «настоящую» функцию. На этот раз получаем:

Test error of keras = 13.52335035135193

Значительное улучшение RMSE (по сравнению с 36.048). Таким образом, мы видим, что модель DL (в данном случае нейронная сеть) не застрахована от плохих данных.

Наконец, давайте попробуем один из самых простых и длительных методов: линейную регрессию.

lm = linear_model.LinearRegression()
model = lm.fit(x_train, y_train)
pred_linear_reg = model.predict(x_test)
print('Test error of linear regression = {}'.format(
    np.sqrt(mean_squared_error(pred_linear_reg, y_test))
))
print('Linear model coefficient = {}'.format(model.coef_))
print('Linear model intercept = {}'.format(model.intercept_))

У нас получился следующий результат:

Test error of linear regression = 9.416628580704634
Linear model coefficient = [[0.49959806]]
Linear model intercept = [99.95399408]

Обратите внимание, что в приведенном выше коде x_train имеет только «истинное» свойство, т.е. имеет размерность = 1. Какой сюрприз! RMSE составляет всего 9,42. Обратите внимание, что линейная модель также хорошо справилась с оценкой коэффициента (0,4995 против 0,5) и точки пересечения (99,95 против 100). Кроме того, RMSE близок к величине белого шума (9,42 против 10), поскольку модель линейной регрессии очень близка к базовой (бог знает) функции y=a*x+b.

Заключение

  • Как и любые другие методы машинного обучения, DL терпит неудачу из-за плохой (или нулевой) подготовки функций. Возможность фиксировать абстракцию в пространстве функций не делает его невосприимчивым к нечистым данным.
  • Обратите внимание, что даже с истинной функцией модель Кераса не работает так же хорошо, как линейная регрессия (13,52 против 9,42). Модели DL превосходят традиционные методы в задачах с очень высокой размерностью пространства признаков данных, но «фактическое» пространство признаков представляет собой многообразие низкой размерности по сравнению с пространством данных. Этот момент будет рассмотрен ниже.

Давайте посмотрим на этот рисунок, скопированный из статьи Йошуа Бенджио [1]:

Представьте, что у вас есть изображение номер 4 в оттенках серого 128x128. Поскольку это изображение 128x128, размер данных составляет 128 * 128 = 16 384 (один пиксель - это одно измерение данных). Теперь предположим, что мы преобразовываем число 4 на рисунке путем поворота или перехода, каждое преобразованное состояние генерирует точку данных. Например, у нас есть 100 изображений числа 4 в разных позах. Если я нанесу эти 100 точек данных из этих 16 384-размерных данных на двухмерный график (16 384 строки по 100 тактов), очевидно, что нельзя будет распознать, что эти данные представляют собой просто разные позы числа 4. Как люди, мы не воспринимаем данные (и мир) в каждом отдельном измерении данных мы воспринимаем их на абстрактном и репрезентативном уровне.

Тот же принцип применяется к семейству методов DL.

Методы DL предназначены для распознавания репрезентативных паттернов (обычно в низкой размерности) в пространстве данных высокой размерности.

В примере, приведенном в статье, фактическая степень свободы (DOF) составляет всего 2 (вращение и переход), но размер пространства данных составляет 16 384! Это очень сложная проблема для традиционных методов, но модель DL могла бы изучать более высокий уровень абстрактных и репрезентативных функций, когда входные данные распространяются вверх по слоям.

Итак, имеет ли ваша проблема такой характер? В нашем мысленном эксперименте это определенно не так, и, выбрав правильную модель (линейная регрессия), которая соответствует характеру данных (линейная зависимость), простая линейная регрессия превосходит нейронную сеть.

Эта статья основана на моих знаниях и, конечно же, ограничена, поэтому, пожалуйста, не стесняйтесь делиться своими мыслями / комментариями.

Удачного (машинного) обучения!

Ссылка

[1] Йошуа Бенжио, Learning Deep Architectures for AI (2009), Foundations and Trends® in Machine Learning.