У меня есть три предложения, в зависимости от того, сколько мыслей и работы вы хотите сделать.
Во-первых, при градиентном спуске / подъеме вы каждый раз перемещаете на градиент, умноженный на некоторый коэффициент, который вы называете «фактором скорости обучения». Если, как вы описываете, это движение приводит к тому, что x становится отрицательным, есть две естественные интерпретации: либо градиент был слишком велик, либо коэффициент скорости обучения был слишком велик. Поскольку вы не можете контролировать градиент, возьмите вторую интерпретацию. Проверьте, не приведет ли ваш ход к тому, что x станет отрицательным, и если это так, уменьшите коэффициент скорости обучения пополам и попробуйте снова.
Во-вторых, для уточнения ответа Анико, пусть x будет вашим параметром, а f (x) вашей функцией. Затем определите новую функцию g (x) = f (e ^ x) и обратите внимание, что хотя область f равна (0, бесконечность), область g равна (-infinity, бесконечность). Таким образом, г не может страдать от проблем, от которых страдает е. Используйте градиентный спуск, чтобы найти значение x_0, которое максимизирует g. Тогда e ^ (x_0), что положительно, максимизирует f. Чтобы применить градиентный спуск на g, вам нужна его производная, которая по правилу цепочки f '(e ^ x) * e ^ x.
В-третьих, похоже, что вы пытаетесь максимизировать только одну функцию, а не пишете общую процедуру максимизации. Вы можете рассмотреть вопрос о градиентном спуске и
метод оптимизации к особенностям вашей конкретной функции. Нам нужно было бы узнать намного больше об ожидаемом поведении f, чтобы помочь вам сделать это.