Ученые, не занимающиеся данными, часто используют слово Модель для ошибочного обозначения того, что в машинном обучении мы канонически называем Модельной архитектурой. И это не могло быть более неправильным!

Хотите время от времени рассуждать о Tensorflow, Keras, DeepLearning4J, Python и Java?

Присоединяйтесь ко мне в твиттере @ twitter.com/hudsonmendes!

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

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

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

Модель = Архитектура (он же алгоритм) + Вес (он же параметры)

Давайте посмотрим, как это работает:

Одна и та же функция «архитектура» (или «уравнение») f (x) = tanh (w × x) создала очень разные материальные функции с разной физической формой из-за разного веса (или «коэффициентов»).

Неуместная терминология

В приведенном выше утверждении я намеренно использовал неподходящую терминологию:

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

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

Мысленный эксперимент: функция как физическая стена

Представьте, что у вас в саду большая группа людей. Есть люди в красных рубашках и люди в синих рубашках.

К вам приходит император сада и приказывает:

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

Затем вы начинаете пытаться делать свое дело. Сначала вы попробуете эту функцию здесь:

f(x) = tanh(tanh(-1x + -0.14905)x + 0.2514)

И эта функция с треском не справляется со своей работой. Такая стена неправильно разделяла бы людей.

Но вы продолжаете работать, усердно работаете над этой функцией и, в конце концов, придете к следующему уравнению:

f(x) = tanh(tanh(1x + -0.14905)x + 0.2514)

Ура! Эта стена теперь кажется идеальной!

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

Если вы внимательно посмотрите, все, что нам нужно было сделать, это изменить один коэффициент x ', и именно сюда мы вложили весь наш «учебный процесс».

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

Модель глубокого обучения - это функция

Учитывая входное значение «x», наша модель может что-то предсказать об этом; другими словами, это дает нам некоторое «y».

Другими словами, наша модель отображает входной элемент x из набора X в что-то еще, что можно было бы наблюдать как элемент "y" из набора "Y".

Приведенное выше определение очень напоминает определение функции в Дискретной математике.

Следовательно, модель может быть представлена ​​как f (x) = y.

Важно отметить, что W (веса) не указаны явно в этой функции, и потребители этого API не знают, что программист жестко запрограммировал внутри функции f.

Модель Архитектура

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

Эта функция представляет собой не более чем последовательность шагов (следовательно, алгоритм), которую часто можно представить как DAG (направленный ациклический граф) с целью сопоставления 'x 'на' y 'успешно.

Однако этот алгоритм полагается на w (веса), которые не указаны явно во входных данных f (x) = y.

Это аналог того, что W (веса) жестко запрограммированы внутри f.

Вес модели (жестко запрограммирован в функции f)

Действительно? В определенном смысле ДА!
Веса жестко запрограммированы внутри функции f.

Кто жестко запрограммировал веса?

Пришло время написать в Твиттере о том, насколько ИИ представляет собой преувеличенную последовательность операторов if / else? НЕТ, потому что if / else - НЕ совсем то, что происходит внутри модели глубокого обучения.

Но прежде всего: Кто жестко запрограммировал веса в модели глубокого обучения? И это следующий вопрос, на который мы должны ответить.

Кто жестко запрограммировал веса?

Этот вопрос действительно раскрывает, что такое глубокое обучение: Речь идет об изучении весов (W), из которых будет составлена ​​модель и которые будут включены в архитектуру (уравнение)!

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

# let "example_person" be an array with the following information:
example_person = [
    100 # wages per week,
    70 # age
]

Теперь давайте создадим 2 функции, первая с жестко запрограммированным if / else:

def likelihood_low_income_youth_1(X):
    wages_per_week, age = X
    if age <= 18 and wages_per_week <= 100:
      return 1
    else:
      return 0

И еще один с более математическим подходом:

def likelihood_low_income_youth_2(X):
    X = np.array(X)
    W = np.array([ 0.01388, 0.0025 ])
    return 1 - X.dot(W)

Эти две функции работают аналогично, и если мы установим простой порог, например 0,5 процента, они дадут нам такой же вывод.

Это будет, по крайней мере, для 100% точек данных, которые мы ему предоставили, а это одна точка данных, описанная нашим example_person.

likely_low_income_youth_1 = likelihood_low_income_youth_1(example_person) > 0.5
likely_low_income_youth_2 = likelihood_low_income_youth_2(example_person) > 0.5
assert likely_low_income_youth_1 == likely_low_income_youth_2

Если оба жестко запрограммированы (if / else и веса), зачем использовать веса? Их труднее читать!

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

Но все же есть причина: пример if / else требует, чтобы кодировщик запрограммировал его, а второе можно узнать из данных!

Можно сказать, что машина может научиться кодировать явные инструкции if / else, и это правда.

Однако узнать веса намного проще, чем инструкции if / else или любой другой синтаксис. И даже для того, чтобы получить модель Seq2Seq, способную генерировать код, некоторые веса придется узнавать по ходу дела.

Сам процесс обучения в этом посте не рассматривается.

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

Заключение

Модель - это функция, составленная из ее архитектуры (уравнения) и ее весов (изученных коэффициентов).

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

Следовательно, их следует рассматривать и обсуждать как единое целое.

Хотите оставаться на связи? Твиттер!

Меня зовут Хадсон Мендес (@hudsonmendes), мне 36 лет, я программист, муж, отец и инженер по машинному обучению.

Я занимаюсь разработкой программного обеспечения более 19 лет и иногда публикую тирады о Tensorflow, Keras, DeepLearning4J, Python и Java.

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