Вопрос или проблема
Я пытаюсь создать нейронную сеть, входными данными которой является массив 3D-векторов длины m $$\vec{x}_i = [x_{i,1},x_{i,2},x_{i,3}], \hspace{5mm}i=1:m $$
а выходными данными – массив аналогичного размера:
$$\vec{h}_{\theta,i} = [h_{\theta,i1},h_{\theta,i2},h_{\theta,i3}], \hspace{5mm}i=1:m $$
НО, мои единственные обучающие данные – это не 3D-векторы, а скорее величина/норма таких векторов (без знания компонентов вектора ($\lambda’s$) сами по себе):
$$y_i= ||[\lambda_{i,1},\lambda_{i,2},\lambda_{i,3}]||, \hspace{5mm}i=1:m $$
Итак, моя концепция заключается в том, чтобы использовать функцию стоимости:
$$ J = \frac{1}{2m}\sum (||\vec{h}_{\theta,i}|| – ||y_i||)^2 $$
Обратите внимание, что разница между этим и более привычной квадратичной функцией стоимости ($ J = \frac{1}{2m}\sum (\vec{h}_{\theta,i} – \vec{y}_i)^2 $), которую я бы использовал, если бы $y_i$ имел ту же форму, что и выход.
В типичном случае функции стоимости, о котором я упомянул выше, алгоритм обратного распространения всегда начинает с вычисления ошибки выходного слоя (которая, основываясь на простой производной этой функции стоимости, просто равна $\delta^L = a^L – y_i $). Затем вы переходите к ошибке следующего слоя, которая зависит от $\delta^L$.
Моя проблема в том, какая должна быть ошибка моего выходного слоя? Я пытался просто использовать производную $J$ по отношению к $a^L$, используя мою новую функцию стоимости (я не буду записывать эту производную здесь, потому что это немного сложно), но я не могу просто вставить это как ошибку выхода и продолжить с нормальным обратным распространением с какими-либо разумными результатами?
Если вы не можете подсказать, как мне подойти к моему алгоритму обратного распространения, возможно, это потому, что вы думаете, что моя функция стоимости не имеет смысла? Как примечание: я как бы доказал концепцию для себя, используя линейную модель, а не нейронную сеть, и обучая её с использованием этого набора данных и линейных производных, а не обратного распространения. Однако точность была низкой, учитывая нелинейность данных, так что я хотел бы использовать подход нейронной сети.
Ваша функция стоимости подразумевает, что вы хотите, чтобы сеть предсказывала величину выходного вектора на основе величины входного вектора. Это именно то, что вы хотите сделать? Если нет, например, если вы хотите точно предсказать компоненты выходного вектора, вам нужно верить, что их можно предсказать только на основе величины входов. Если вы не считаете, что это возможно, то вам нужно найти новые данные. Если да, то обычная функция ошибки должна быть в порядке (например, среднеквадратичная ошибка), и вы можете использовать обычное обратное распространение, как реализовано в любой библиотеке нейронных сетей. Если вы получаете плохие результаты, вероятно, это связано с тем, что норма входного вектора не дает достаточно информации для хорошего предсказания.
В современных библиотеках, таких как TensorFlow или PyTorch, вы можете легко создавать пользовательские функции потерь и/или пользовательские слои.
Например, последний слой может быть зафиксированным слоем, который вычисляет квадрат длины своего 3D-входа. Но нет гарантии, что входы этого искусственного слоя будут сходиться к тому, что вы ожидаете, даже если финальный выход (длина) будет правильно изучен. Вам, вероятно, придется искать другие методы или дополнительную информацию, чтобы восстановить выходные векторы, а не только их длины.
Ответ или решение
Обучение нейронной сети с использованием нормы векторов: обсуждение алгоритма обратного распространения
Ваша задача заключается в построении нейронной сети (НС), принимающей на вход массив трехмерных векторов и выдающей массив, который по своей структуре идентичен входным данным, но на самом деле вы стремитесь предсказать только их нормы. Проблема, с которой вы столкнулись, связана с тем, что функция потерь, которую вы планируете использовать, не совсем соответствует классическим методам обратного распространения, так как вы работаете с величинами, а не с компонентами векторов.
Понятие задачи
Ваши входные данные обозначены как:
[
\vec{x}i = [x{i,1},x{i,2},x{i,3}], \quad i=1:m
]
Выход сети – это также массив:
[
\vec{h}{\theta,i} = [h{\theta,i1},h{\theta,i2},h{\theta,i3}], \quad i=1:m
]
Однако ваши обучающие данные представлены только в виде норм этих векторов:
[
yi = ||[\lambda{i,1},\lambda{i,2},\lambda{i,3}]||, \quad i=1:m
]
Функция потерь, которую вы предложили, выглядит следующим образом:
[
J = \frac{1}{2m}\sum (||\vec{h}_{\theta,i}|| – ||y_i||)^2
]
Подход к вычислению ошибки выходного слоя
Корректная настройка алгоритма обратного распространения требует наличия ошибок на выходном слое, поскольку это будет основой для дальнейшего распространения ошибок через сеть.
Поскольку вы учитываете только норму выходного вектора, вам необходимо будет вычислить градиенты в некотором новом контексте. Разберёмся, как это сделать:
- Производная функции потерь: Вам нужно вычислить частную производную вашей функции потерь по выходу сети ( a^L ). Вы можете сделать следующее:
[
\delta^L = \frac{\partial J}{\partial a^L} = \frac{1}{m} (||\vec{h}_{\theta,i}|| – ||yi||) \cdot \frac{\partial ||\vec{h}{\theta,i}||}{\partial a^L}
]
- Работа с нормами: Теперь для вычисления производной нормы ( ||\vec{h}_{\theta,i}|| ) вы должны учесть правило дифференцирования нормы векторов:
[
\frac{\partial ||\vec{h}{\theta,i}||}{\partial h{i,j}} = \frac{h{i,j}}{||\vec{h}{\theta,i}||}
]
Таким образом:
[
\delta^L = (||\vec{h}_{\theta,i}|| – ||yi||) \cdot \left( \frac{\vec{h}{\theta,i}}{||\vec{h}_{\theta,i}||} \right)
]
Такое выражение даст вам вектор ошибок, который можно использовать для дальнейшего обратного распространения в предыдущий слой.
Выбор функции потерь
Вы подняли важный вопрос о корректности выбора функции потерь. На ваш взгляд, ваше текущее обучение на основе величины может быть недостаточным из-за потери информации о компоненте векторов. Если вы стремитесь предсказать компоненты вектора, то следует пересмотреть используемую вами предварительно обученную модель.
Советую вам рассмотреть возможность включения дополнительных данных или изменения архитектуры модели, если это возможно. Для задач, связанных с предсказанием компонентов векторов, лучше использовать или генерировать данные с компонентами. Если это невозможно, попробуйте провести эксперимент с различными архитектурами НС, чтобы выяснить, сможет ли сеть понять структуру данных.
Заключение
Ваш подход к задаче представляет интерес, и предложенная функция потерь может работать, однако, чтобы улучшить результаты, рекомендуем фокусироваться на более широкой информации о векторах, если это возможно. Налаживание эффекта обратного распространения с учетом использования норм векторов требует тщательной настройки, как описано выше. Если вы выделите больше времени для экспериментов с архитектурой и функциями потерь, вы значительно увеличите свои шансы на успех.