Керівництво хакера по нейронних мереж. Глава 2: Машинне навчання. Більш традиційний підхід: Функції втрат

Ми публікуємо переклад останньої з існуючих частин «книги». Обов'язково будемо стежити за блогом автора і продовжимо публікації цього матеріалу, як тільки вони з'являться.

Зміст:
Розділ 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; // сила регуляризації

cost function(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] * x[0] + w[1] * x[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, нам насправді потрібно зробити, щоб витрати були як можна менше. Звучить знайомо? Ми точно знаємо, що робити: функція витрат, записана вище — це наша схема. Ми будемо проводити всі приклади через схему, обчислювати зворотний прохід і оновлювати всі параметри таким чином, щоб схема видала нам більш низьке значення витрат в майбутньому. Зокрема, ми будемо розраховувати градієнт, після чого оновлювати параметри в зворотному напрямку від градієнта (так як ми хочемо зробити витрати низькими, а не високими).

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.