Вопрос или проблема
Я читал о пользовательских функциях активации, автоматическом дифференцировании и так далее, пытаясь во всем этом разобраться. Теперь, кажется, я немного разобрался, но прямо после закрытия книги я подумал: “А что насчет неэлементарных интегралов”?
Таким образом, как я понимаю, TensorFlow работает: он вычисляет производную функции активации, графически ее изображая (деккомпозируя на куски элементарных функций), затем делает прямой проход, и обратный проход, чтобы определить производную.
Поэтому я попробовал этот простой код:
from keras.datasets import mnist
(X_train, y_train), (X_val, y_val) = mnist.load_data()
test_model = keras.models.Sequential([
keras.layers.Flatten(input_shape = X_train.shape[1:]),
keras.layers.Dense(100, activation=tf.math.erf),
keras.layers.Dense(10, input_shape = [100], activation="softmax")
])
test_model.compile(loss = "sparse_categorical_crossentropy", optimizer="nadam", metrics=["sparse_categorical_accuracy"])
Я использовал функцию ошибки в качестве активации по двум причинам:
- Она напоминает сигмоидальные функции по форме, так что это может сработать.
- Это неэлементарный интеграл, так что его невозможно декомпозировать на простые, элементарные функции.
К моему удивлению, вызов test_model.fit прошел без ошибок, и обучение даже увеличивало точность модели. Но есть одна вещь – теоретически это не должно сработать, потому что неэлементарный интеграл нельзя разложить на элементарные функции и, следовательно, нельзя графически изобразить.
Это оставляет у меня вопрос – как TensorFlow справляется с этим?
Вычислительный граф создается для сложной функции. Таким образом, все шаги – это просто элементарные шаги.
Например – Ниже функция -.
Становится –
$\hspace{4cm}$Кредит изображения – leonardoaraujosantos.gitbook.io/artificial-inteligence/
Для дальнейшего изучения –
- Прикладное машинное обучение от Орелена Жерона – Приложение-D
- Wikipedia Автоматическое дифференцирование
Ответ или решение
TensorFlow использует автоматическое дифференцирование (autodiff) для вычисления градиентов, что позволяет эффективно обрабатывать функции, включая те, которые могут включать неэлементарные интегралы, как в случае функции ошибки (error function, или erf
), которую вы применили в своем коде.
Как TensorFlow обрабатывает неэлементарные интегралы?
-
Создание вычислительного графа: TensorFlow работает, создавая вычислительный граф, который представляет собой набор узлов (операций) и рёбер (данных). Каждый узел отвечает за базовую арифметическую операцию или функцию, включая сложные функции, такие как
erf
. Когда вы используетеtf.math.erf
, TensorFlow обрабатывает его как элементарную операцию, создает соответствующий узел в графе и связывает его с другими узлами. -
Элементарные операции и их производные: Хотя функция
erf
является неэлементарной, это не мешает TensorFlow использовать автоматическое дифференцирование. Каждая базовая операция (например, сложение, умножение, функции активации и т. д.) имеет заранее определенные производные, и TensorFlow может применять правила дифференцирования по цепочке (цепное правило). Это значит, что даже если функция сложная и не может быть выражена только через элементарные функции, если она разбивается на элементарные операции, производные этих операций могут быть вычислены. -
Бэктрек (Backward pass): Во время обратного прохода (backward pass) TensorFlow вычисляет производные, начиная с выходных узлов и возвращаясь к входным. Для функции
erf
он предполагает, что вы найдете соответствующую производную (которая, как правило, также доступна в библиотеках, таких как SciPy или TensorFlow, и может быть использована в автодифференцировании). Производнаяerf
доступна и имеет известное математическое выражение:[
\frac{d}{dx} \operatorname{erf}(x) = \frac{2}{\sqrt{\pi}} e^{-x^2}
] -
Обработка неэлементарных интегралов: Несмотря на то что
erf
и прочие функции могут быть представлены неэлементарными интегралами, они все равно могут быть оценены численно и использоваться в качестве элементов в вычислительном графе. Это происходит благодаря тому, что для многих известных функций можно определить их производные, что позволяет использовать их в нейронных сетях.
Заключение
Использование неэлементарных функций, таких как erf
, в TensorFlow возможно благодаря применению автоматического дифференцирования, которое опирается на элементарные операции и существование производных. Вы можете использовать такие функции в нейронных сетях без необходимости ручного вычисления производных, так как TensorFlow сам будет управлять этим процессом через вычислительный граф.
Этот механизм делает TensorFlow мощным инструментом для работы с различными функциями и сложными моделями, позволяя достигать высоких результатов в обучении нейронных сетей.