Как да измерим несигурността в невронните мрежи.

Когато техниките за машинно обучение се използват в „критични за мисията“ приложения, допустимата граница на грешка става значително по-ниска.

Представете си, че вашият модел шофира кола, помага на лекар или дори просто взаимодейства директно с (може би лесно раздразнен) краен потребител. В тези случаи ще искате да се уверите, че можете да сте уверени в прогнозите, които вашият модел прави, преди да действате спрямо тях.

Измерването на несигурността на прогнозите става все по-важно с всеки изминал ден, тъй като размитите системи стават все по-голяма част от нашия размит живот.

Ето добрата новина: Има няколко техники за измерване на несигурността в невронните мрежи и някои от тях са много лесни за изпълнение! Първо, нека усетим какво ще измерваме.

Поставяне на число на несигурността.

Когато правите модели на света, вашите модели не винаги дават точни отговори.

Това отчасти се дължи на факта, че моделите са опростяване на един сериозно сложен свят. Тъй като част от информацията е неизвестна, прогнозите от вашия модел са обект на известна степен на несигурност.

Части от нашия свят (и начините, по които го измерваме) са просто хаотични. Някои неща се случват на случаен принцип и тази случайност също е източник на несигурност в прогнозите на вашия модел.

„Несигурността на прогнозата може да бъде разделена на 3 категории“:

1. Неопределеност на модела

Несигурността на модела идва от „непознаването“ на проблема. Тоест несигурността на модела определя количествено нещата, които могат да бъдат правилно уловени от модела, но не са.

„Йоел и Инбар от Taboola дават забавен пример:“

Понякога се нарича още епистемичнаили структурна несигурност. Измерването на несигурността на модела е област от статистиката, която се „счита за особено предизвикателна“. Една от причините за това е, че принципни техники като усредняване на байесов модел стават много скъпи, тъй като моделите стават по-сложни.

2. Грешна спецификация на модела

Ако вашият модел създава добри прогнози по време на обучение и валидиране, но не и по време на оценка (или в производство), той може да е грешно определен.

Несигурността на грешната спецификация на модела улавя сценарии, при които вашият модел прави прогнози за нови данни с много различни модели от данните за обучение.

3. Присъщ шум.

Това е несигурност, причинена от шума, присъстващ в набора от данни. Може да се дължи на несъвършени техники за измерване или на присъща произволност на измерваното нещо.

Присъщият шум също понякога се нарича алеаторична или статистическа несигурност. Количеството присъщ шум е свързано с коефициента на грешка на Bayes, който е най-ниският достижим процент на грешка на даден класификатор. Както можете да си представите, най-ниският възможен процент грешки, който един модел може да постигне, е тясно свързан с размера на грешките, причинени от шума в самите данни.

Тези концепции се основават до голяма степен на байесовската статистика. Очертах тези идеи по прост начин, но това е само надраскване на повърхността на тези дълбоки теми.

За да научите повече за мерките за несигурност в байесовите невронни мрежи, препоръчвам да разгледате тази статия от Felix Laumann. За задълбочено обяснение на байесовската статистика в контекста на науката за данните, Ankit Rathi написа поредица от страхотни статии по темата.

Внедряване на несигурност.

В този момент може би си мислите: „Звучи добре, но как да внедря несигурност в моя модел?“.

„Байесовата невронна мрежа“ интегрира несигурността по подразбиране в допълнение към това, че като цяло е по-стабилна за пренастройване и обработка на по-малки масиви от данни. Въпреки това инструменталната верига за изграждане на байесови невронни мрежи все още се появява и моделите са склонни да бъдат по-скъпи от изчислителна гледна точка, както по време на обучение, така и когато се правят прогнози.

Освен това мигрирането на вашата работа към вероятностен модел (като Bayesian невронна мрежа) ще бъде досадно.

В дългосрочен план вероятностното дълбоко обучение вероятно ще стане стандартно. Засега обаче практическите техники за интегриране на вероятностната перспектива в съществуващата ни работа са добра първа стъпка!

Отпадане от Монте Карло.

Преди няколко години „Ярин и Зубин от университета в Кеймбридж намериха начин“ да приближат несигурността на модела, без да променят структурата или техниките за оптимизация на невронната мрежа.

Ето кратката версия: като използвате отпадане преди всеки тегловен слой по време на теста и изпълнявате прогнозите си за няколко итерации, можете да приближите байесовата несигурност. Те наричат ​​този процес отпадане от Монте Карло:

  1. Вие подавате вход към вашия модел.
  2. Вие предвиждате за няколко итерации на този единствен вход, като всеки път дезактивирате малки части от невронната мрежа на случаен принцип.
  3. Вземате средната изходна стойност. Това е вашата прогноза. Накрая измервате вариацията между повторенията. Това е несигурността на модела.

Интуитивно мисля за това по следния начин: Колкото повече прогнозата ви се колебае с малки структурни промени в модела, толкова по-несигурна е тази прогноза.

Прилагането на отпадане от Монте Карло е наистина лесно. Тук започвам с проста плътна мрежа за проблема MNIST, изграден с Keras. По подразбиране слоевете за отпадане са активирани само по време на обучение. За да активирате отпадащите слоеве по време на тест, задайте training=True за всеки слой.

img_dim = 28
x_in = Input(shape=(img_dim, img_dim,))
x = Dropout(0.2)(x_in, training=True)
x = Dense(500, activation="relu")(x)
x = Dropout(0.2)(x, training=True)
x = Dense(250, activation="relu")(x)
x = Dropout(0.2)(x, training=True)
x_out = Dense(10, activation="softmax")(x)
model = Model(inputs=x_in, outputs=x_out)
model.compile(loss="categorical_crossentropy", optimizer="rmsprop")

След това се нуждаем от персонализирана функция за прогнозиране, която може да прогнозира итеративно и да върне средната стойност и дисперсията на тези повторения. В този пример измерваме стандартното отклонение вместо дисперсията, тъй като то е изразено в същите единици като средната стойност.

def predict_with_uncertainty(model, 
                             X, 
                             batch_size=None, 
                             num_iterations=100):
    last_layer = model.layers[-1]
    results = np.zeros((num_iterations,
                       X.shape[0],
                       last_layer.output_shape[1]), 
                       dtype="float")
    for i in range(num_iterations):
        results[i] = model.predict(X, batch_size=batch_size)
    
    predictions = results.mean(axis=0)
    uncertainty = results.std(axis=0)
    
    return predictions, uncertainty

Сега сте готови да прогнозирате с приблизителна несигурност:

predictions, uncertainty = predict_with_uncertainty(model,your_data)

Проблеми и критика.

Както видяхме, използването на Monte Carlo dropout е наистина лесно. Може би дори твърде лесно. „Техниката беше критикувана от Иън Осбанд от Deepmind“, който отбеляза, че прогнозната несигурност на прост модел с отпадане на Монте Карло не намалява с повече данни. Това повдига въпроса дали това е неточно приближение на байесовската несигурност или има някакви основни предположения, които трябва да бъдат изяснени.

За повече от този брой, Себастиан Шьонер е написал страхотна публикация в блога, обобщаваща критиката.

На работното ми място в Kanda имахме смесен опит с ефективността на отпадането в Монте Карло.

За прост напълно свързан модел, обучен на MNIST като предишния ми пример, приближенията на несигурността се държаха според очакванията: когато бяха представени с шум вместо ръкописна цифра, приблизителната несигурност беше по-висока. Установихме, че 50–100 итерации на отпадането на Монте Карло дават задоволителни резултати.

По-късно имахме сценарий, при който трябваше да изпълним задача за разпознаване на изображения локално на смартфон като част от AR приложение. Използвахме трансферно обучение, като изградихме класификатор върху „NASNet Mobile архитектурата“.

Изпълнението на 100 итерации на NASNet на смартфон не е добра идея.

Дори и с тежко паралелизиране, реалистично бяхме в състояние да изпълним ~20 итерации на устройството, за да предоставим прогноза навреме.

Второ, оценките на несигурността бяха неточни. Когато се захрани картина на случаен шум, несигурността беше изненадващо ниска. Струва си да се отбележи, че внедрихме отпадане само в плътно свързаната част на класификатора, която се намираше върху NASNet. Ако искате да споделите интуиция за това какво се е объркало тук, ще ми е много интересно да прочета отговор от вас!

Заключение.

Първо, разгледахме защо е важно да се определи количествено несигурността в моделите на машинно обучение. След това ви запознах с 3 различни начина на мислене за несигурността на прогнозата: Несигурност на модела, грешна спецификация на модела и присъщ шум.

Отпадането по Монте Карло е лесна за прилагане техника за приближаване на байесовата несигурност, но има известно несъгласие дали приближението наистина е точно. На практика установих, че отпадането на Монте Карло е ефективно за по-прости модели, но имах някои проблеми с подхода за сложни модели, както по отношение на точността, така и на производителността.

Иинтегрирането на байесовската вероятност в машинното обучение ще става все по-важно в бъдещеи очаквам с нетърпение да видя повече вероятностни техники да станат част от инструменталната верига.