Ученые, не занимающиеся данными, часто используют слово Модель для ошибочного обозначения того, что в машинном обучении мы канонически называем Модельной архитектурой. И это не могло быть более неправильным!
Хотите время от времени рассуждать о 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.
Присоединяйтесь ко мне там, и я буду держать вас в курсе моих ежедневных усилий по доведению моделей машинного обучения до производства!