Руководство хакера по нейронным сетям. Глава 2: Машинное обучение. Более традиционный подход: Функции потерь

в 14:51, , рубрики: javascript, Блог компании Paysto, нейронные сети

Мы публикуем перевод последней из существующих частей «книги». Обязательно будем следить за блогом автора и продолжим публикации этого материала, как только они появятся.

Содержание:

Глава 1: Схемы реальных значений
Часть 1:

   Введение   
      Базовый сценарий: Простой логический элемент в схеме
      Цель
         Стратегия №1: Произвольный локальный поиск

Часть 2:

         Стратегия №2: Числовой градиент

Часть 3:

         Стратегия №3: Аналитический градиент

Часть 4:

      Схемы с несколькими логическими элементами
         Обратное распространение ошибки

Часть 5:

         Шаблоны в «обратном» потоке 
      Пример "Один нейрон"

Часть 6:

      Становимся мастером обратного распространения ошибки

Глава 2: Машинное обучение

Часть 7:

      Бинарная классификация

Часть 8:

      Обучение сети на основе метода опорных векторов (SVM)

Часть 9:

      Обобщаем SVM до нейронной сети

Часть 10:

      Более традиционный подход: Функции потерь

Теперь, когда мы понимаем основы того, как эти схемы работают с данными, давайте применим более традиционный подход, который вы наверняка уже видели где-нибудь в интернете и в других уроках и книгах. Вы вряд ли встретите, чтобы люди слишком много рассказывали о характеристиках силы. Вместо этого алгоритмы обучения машины обычно описывают с точки зрения функций потерь (или функций затрат, или целей).

По мере того, как я составляю эти математические формулы, я бы хотел начать относиться более внимательно к тому, как мы называем наши переменные и параметры. Я бы хотел, чтобы эти уравнения выглядели так же, как вы могли видеть их в книгах или других уроках, поэтому я начну использовать более стандартные наименования.

Пример: 2-мерный метод опорных векторов

Давайте начнем с примера двухмерного SVM. Нам дан набор данных, состоящий из N примеров (xi0,xi1) и их соответствующие метки yi, которые могут иметь значения +1/−1 для положительных и отрицательных примеров соответственно. Важней всего то, что, как вы помните, у нас есть три параметра (w0,w1,w2). Функция потерь SVM в таком случае определяется следующим образом:

Обратите внимание, что это выражение всегда положительное, ввиду определения порогового значения от нуля в первом выражении и возведении в квадрат при регуляризации. Смысл заключается в том, что нам нужно, чтобы это выражение имело как можно меньшее значение. Прежде чем мы возьмемся за его тонкости, давайте сначала представим его в виде кода:

var X = [ [1.2, 0.7], [-0.3, 0.5], [3, 2.5] ] // последовательность двухмерных данных
var y = [1, -1, 1] // последовательность меток
var w = [0.1, 0.2, 0.3] // пример: произвольные числа
var alpha = 0.1; // сила регуляризации

function cost(X, y, w) {

  var total_cost = 0.0; // L, в функции потерь SVM, приведенной выше
  N = X.length;
  for(var i=0;i<N;i++) {
    // петля через все точки ввода данных и расчет их результата
    var xi = X[i];
    var score = w[0] * xi[0] + w[1] * xi[1] + w[2];

    // суммируем все затраты на основании того, насколько совместим результат с меткой 
    var yi = y[i]; // метка
    var costi = Math.max(0, - yi * score + 1);
    console.log('example ' + i + ': xi = (' + xi + ') and label = ' + yi);
    console.log('  score computed to be ' + score.toFixed(3));
    console.log('  => cost computed to be ' + costi.toFixed(3));
    total_cost += costi;
  }

  // затраты регуляризации: нам нужны небольшие весовые значения
  reg_cost = alpha * (w[0]*w[0] + w[1]*w[1])
  console.log('regularization cost for current model is ' + reg_cost.toFixed(3));
  total_cost += reg_cost;

  console.log('total cost is ' + total_cost.toFixed(3));
  return total_cost;
}
И вот результат:
cost for example 0 is 0.440
cost for example 1 is 1.370
cost for example 2 is 0.000
regularization cost for current model is 0.005
total cost is 1.815 

Обратите внимание, как работает это выражение: оно измеряет, насколько плох наш классификатор SVM. Давайте рассмотрим это более подробно:

— Первая точка ввода данных xi = [1.2, 0.7] с меткой yi = 1 выдает результат 0.1*1.2 + 0.2*0.7 + 0.3, который равен 0.56. Обратите внимание, что это положительный пример, поэтому нам нужно, чтобы результат был больше чем +1. 0.56 – это недостаточно высокое значение. И, фактически, выражение затрат для этой точки ввода данных вычислит следующее: costi = Math.max(0, -1*0.56 + 1), что равно 0.44. Вы можете представить затраты в виде количественного выражения неудач SVM.

— Вторая точка ввода данных xi = [-0.3, 0.5] с меткой yi = -1 выдает результат 0.1*(-0.3) + 0.2*0.5 + 0.3, который равен 0.37. Это выглядит не очень хорошо: Такой результат очень высокий для отрицательного примера. Он должен быть меньше чем -1. На самом деле, когда мы вычисляем затраты: costi = Math.max(0, 1*0.37 + 1), мы получаем 1.37. Это очень высокие затраты для этого примера, так как он неправильно классифицируется.

— Последний пример xi = [3, 2.5] с меткой yi = 1 дает результат 0.1*3 + 0.2*2.5 + 0.3, то есть 1.1. В этом случае, SVM рассчитывает costi = Math.max(0, -1*1.1 + 1), что по факту равно нулю. Эта точка ввода данных классифицируется правильно, и затраты, связанные с ней, отсутствуют.

Функция затрат – это выражение, которое измеряет насколько плохо работает ваш классификатор. Если набор данных обучения классифицируется идеально, затраты (за исключением регуляризации) будут равны нулю.
Обратите внимание, что последним элементом потерь являются затраты регуляризации, что говорит о том, что параметры нашей модели должны иметь небольшие значения. Ввиду этого элемента, затраты фактически никогда не будут нулевыми (так как это будет означать, что все параметры модели, за исключением систематической ошибки, фактически равны нулю), но чем ближе мы подберемся, тем лучше будет работать наш классификатор.

Большинство функций затрат в Обучении машины состоят из двух частей:

1. Часть, которая измеряет, насколько хорошо модель соответствует данным, и 2: Регуляризация, которая измеряет принцип того, насколько сложной или удобной является модель.

Надеюсь, я убедил вас в том, что чтобы получить очень хороший SVM, нам, на самом деле, нужно сделать, чтобы затраты были как можно меньше. Звучит знакомо? Мы точно знаем, что делать: функция затрат, записанная выше – это наша схема. Мы будем проводить все примеры через схему, вычислять обратный проход и обновлять все параметры таким образом, чтобы схема выдала нам более низкое значение затрат в будущем. В частности, мы будем рассчитывать градиент, после чего обновлять параметры в обратном направлении от градиента (так как мы хотим сделать затраты низкими, а не высокими).

Автор: Irina_Ua

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js