avlasov (avlasov) wrote,
avlasov
avlasov

Categories:

Туториал по секонд-ордер методам - случай одной переменной: практика

Тиория без практики мертва, как говориццо.
Так как я пишу туториал в применении к нейросеткам, то рассмотрим простой пример с одной переменной и сигмоидной нелинейностью.
Т.е. у нас нейросетка с одним нейроном и одним весом sigm(w*x)
Пусть x = 1, y = 0.99 - тренировочный данный :).
Ну и мы будем минимизировать функцию f(w) = (sigm(w*x) - y)^2/2 либо f2(w) = -(1-y)*log(1-sigm(w*x)) - y*log(sigm(w*x))
Рассмотрим оба случая ради интереса, ибо второй выпуклый, а первый - только если w*x > 0
Ну x для простоты 1 так что его можно не учитывать.
Наша задача не сколько найти ответ, понятное дело, сколько посмотреть как работают всякие gradient descent'ы в нашем случае, особенно учитывая, что сигмоида где-то выпукла, а где-то и вогнута.

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

Вот типа я написал код, с первой и второй производной по w.

x = 1; y = 0.99;
sigm = @(x) 1./(1+exp(-x));
f = @(w,x) (sigm(w*x) - y).^2/2;
g = @(w,x) (sigm(w*x) - y).*sigm(w*x).*(1-sigm(w*x))*x;
h = @(w,x) sigm(w*x).*(1-sigm(w*x)).*((1 - 2*sigm(w*x)).*(sigm(w*x)-y) + sigm(w*x).*(1-sigm(w*x)))*x^2;
f2 = @(w,x) -(1-y)*log(1-sigm(w*x)) -y*log(sigm(w*x));
g2 = @(w,x) (sigm(w*x) - y)*x;
h2 = @(w,x) sigm(w*x).*(1-sigm(w*x))*x^2;


Рассмотрим gradient descent.
Для начала для квадратичной функции ошибки.
Правильный ответ в 4.5941 выдал где-то после 86 тыщ итераций если двигаться от w = 0.

>> w=0;for i=1:88000; w=w-g(w,x); endfor; w
w = 4.5951

Но это трудный случай для квадратичной функции ошибки.
Для cross-entropy ситуация получше - хватило чуть меньше 1000 итераций.

>> w=0;for i=1:1000; w=w-g2(w,x); endfor; w
w = 4.5951

Это я использовал lr = 1, если взять побольше, то будет пошустрее, а если поменьше - то помедленнее, понятное дело.

Посмотрим теперь секонд ордер, т.е. будем брать lr = 1/f''(w)
Десять итераций хватило для квадратичной функции.

>> w=0;for i=1:10; w=w-g(w,x)/h(w,x); endfor; w
w = 4.5951

И чуть меньше для кросс-энтропии

>> w=0;for i=1:7; w=w-g2(w,x)/h2(w,x); endfor; w
w = 4.5951


Однако, если мы возьмем отрицательное начальное значение для w, т.е. область где f(w) - вогнута, то мы пойдем в сторону максимума :)

>> w=-1;for i=1:7; w=w-g(w,x)/h(w,x); endfor; w
w = -12.287

Если мы возьмем модуль от второй производной, то ситуация исправится и даже шустрее :)

>> w=-1;for i=1:5; w=w-g(w,x)/abs(h(w,x)); endfor; w
w = 4.5951


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

Приведу пример для метода секущих тоже, хотя он наверное не очень читабелен, но думаю разобраться можно :).

>> w0=0; g0=g(w0,x); w1=w0-g0; g1=g(w1,x); for i=1:14; w=w0-g0*(w1-w0)/(g1-g0); w0=w1; w1=w; g0=g1; g1=g(w1,x); endfor; w
w = 4.5951
>> w0=0; g0=g2(w0,x); w1=w0-g0; g1=g2(w1,x); for i=1:9; w=w0-g0*(w1-w0)/(g1-g0); w0=w1; w1=w; g0=g1; g1=g2(w1,x); endfor; w
w = 4.5951


Надо сказать, что не все так плохо для gradient descent - если выбрать рейт поправильнее, то все будет пошустрее. Например, я взял в качестве рейта обратную величину ко второй производной в начальной точке:

>> w=0;i=0;do w=w-g(w,x)/h(0,1); i=i+1; until abs(w-4.5951) < 5e-5; disp([i w])
5475.0000 4.5951
>> w=0;i=0;do w=w-g2(w,x)/h2(0,1); i=i+1; until abs(w-4.5951) < 5e-5; disp([i w])
236.0000 4.5951


Вот график, как меняется ошибка (abs(w*x -4.5951)) в зависимости от номера итерации. Синие линии - это квадратичная функция ошибки, красные - кросс-энтропия. Сплошная - gradient descent с lr=1, прерывистая - gradient descent с более удачным выбором лёрнинг рейт, прерывистая с точками - метод Ньютона.
Важно, что по оси X логарифмическая шкала, иначе не влезет :).
Subscribe

  • StatMod и ML

    Рассмотрим, чем полезен StatMod в плане инженерии ML и почему "преподаваемый" ML тут проигрывает. Под "преподаваемым" ML я имею в…

  • Инженерность в DataScience

    Когда я пишу что инженерность в ML слабо развита, это не значит что ее нет вообще. Точнее будет сказать, что в DataScience (некая объемлющая…

  • Основные вопросы в инженерии МЛ

    По своему опыту я выделяю следующие основные вопросы/проблемы, которые возникают при решении практических МЛ задач. Какую задачу мы решаем? Ту ли…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 3 comments