Как использовать k-кратную перекрестную проверку в нейронной сети

Каждый раз, когда создается действие onChildAdded, вызывается для всех данных в ссылке. Возможно ли, чтобы onChildAdded и onChildRemoved вызывались только для «diff» между моим локальным кешем и данными на сервере firebase?

blockquote>

Нет, это невозможно. Из документации по типам событий :

child_added запускается один раз для каждого существующего дочернего элемента, а затем снова каждый раз, когда новый ребенок добавляется к указанному пути

blockquote>

Теперь вернемся к вашему первоначальному вопросу:

, какой обратный вызов мне нужно использовать, чтобы он запускался только для 5 новых элементов, которые были добавлены?

blockquote>

Это будет:

ref.limitToLast(5)...

Но для этого вам нужно знать, сколько элементов было добавлено в список, поскольку вы в последний раз слушали.

более обычное решение - отслеживать последний элемент, который вы уже видели, а затем использовать startAt(), чтобы начать стрельбу с того места, где вы были в последний раз:

ref.orderByKey().startAt("-Ksakjhds32139")...

Затем вы сохранили бы последний ключ вы видели в общих предпочтениях.

Аналогичным образом вы можете сохранить последний раз, когда активность была видна с помощью:

long lastActive = new Date().getTime();

Затем добавьте timestamp с Firebase.ServerValue.TIMESTAMP к каждому элементу, а затем:

ref.orderByChild("timetstamp").startAt(lastActive+1)...
29
задан JoErNanO 15 April 2016 в 12:56
поделиться

2 ответа

Вы, кажется, немного смущены (я помню, я тоже), поэтому я собираюсь упростить вещи для вас. ;)

Пример сценария нейронной сети

Всякий раз, когда вам дают задание, такое как разработка нейронной сети, вам часто также дают образец набора данных для использования в учебных целях. Предположим, вы обучаете простую систему нейронной сети Y = W · X, где Y - это результат, вычисленный из расчета скалярного произведения (·) вектора весов W с данным вектором выборки X. Теперь наивный способ сделать это - использовать весь набор данных, скажем, 1000 образцов для обучения нейронной сети. Предполагая, что обучение сходится и ваш вес стабилизируется, вы можете с уверенностью сказать, что ваша сеть правильно классифицирует данные тренировки. Но что происходит с сетью, если она представлена ​​ранее невиданными данными? Очевидно, что целью таких систем является возможность обобщать и правильно классифицировать данные, отличные от тех, которые используются для обучения.

Объяснение чрезмерного соответствия

Однако в любой реальной ситуации ранее невидимые / новые данные доступны только после развертывания вашей нейронной сети в, скажем так, производственной среде. Но так как вы не проверили это должным образом, вы, вероятно, будете иметь плохое время. :) Явление, при котором любая система обучения почти идеально соответствует своему обучающему набору, но постоянно терпит неудачу с невидимыми данными, называется переоснащением .

Три набора

Сюда входят части проверки и проверки алгоритма. Давайте вернемся к исходному набору данных из 1000 образцов. Что вы делаете, вы разбиваете его на три набора - обучения , проверки и тестирования (Tr, Va и Te) - используя тщательно подобранные пропорции. (80-10-10)% обычно является хорошей пропорцией, где:

  • Tr = 80%
  • Va = 10%
  • Te = 10%

Обучение и проверка

Теперь происходит то, что нейронная сеть обучается на наборе Tr и ее веса корректно обновляются. Затем проверочный набор Va используется для вычисления ошибки классификации E = M - Y с использованием весов, полученных в результате обучения, где M - ожидаемый выходной вектор, взятый из проверочного набора, а Y - вычисленный выходной результат, полученный из классификация (Y = W * X). Если ошибка выше, чем определенный пользователем порог, то повторяется вся эпоха обучения-проверки . Эта фаза обучения заканчивается, когда ошибка, вычисленная с использованием набора проверки, считается достаточно низкой.

Интеллектуальное обучение

Теперь умный хитрость заключается в том, чтобы случайным образом выбрать, какие выборки использовать для обучения и проверки из общего набора Tr + Va на каждой итерации эпохи. Это гарантирует, что сеть не будет превышать тренировочный набор.

Тестирование

Затем тестовый набор Te используется для измерения производительности сети. Эти данные идеально подходят для этой цели, поскольку они никогда не использовались на этапе обучения и проверки. По сути, это небольшой набор ранее невидимых данных, который должен имитировать то, что произойдет, когда сеть будет развернута в производственной среде.

Производительность снова измеряется в терминах ошибки классификации, как объяснено выше. Производительность также можно (или, возможно, даже следует) измерить с точки зрения точности и вспомнить , чтобы знать, где и как возникает ошибка, но это тема для другого Q & A.

Перекрестная проверка

Поняв этот механизм обучения-проверки-проверки, можно еще больше укрепить сеть от перенапряжения, выполнив K-кратную перекрестную проверку . Это в некоторой степени эволюция хитрого уловки, которую я объяснил выше. Этот метод включает в себя выполнение K раундов обучения-валидации-тестирования на различных, не перекрывающихся, одинаково пропорциональных Tr, Va и Te наборах .

Учитывая k = 10, для каждого значения K вы разделите свой набор данных на Tr+Va = 90% и Te = 10% и запустите алгоритм, записывающий результаты тестирования.

k = 10
for i in 1:k
     # Select unique training and testing datasets
     KFoldTraining <-- subset(Data)
     KFoldTesting <-- subset(Data)

     # Train and record performance
     KFoldPerformance[i] <-- SmartTrain(KFoldTraining, KFoldTesting)

# Compute overall performance
TotalPerformance <-- ComputePerformance(KFoldPerformance)

Показана перегрузка

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

Overfitting reduced by validating neural network

Ссылки

Для получения дополнительных ссылок эта превосходная книга даст вам как хорошее знание машинного обучения, так и несколько мигреней. Вам решать, стоит ли это того. :)

79
ответ дан Community 15 April 2016 в 12:56
поделиться
  1. Разделите ваши данные на K непересекающихся сгибов. Пусть каждый сгиб K содержит одинаковое количество предметов из каждого из m классов (многослойная перекрестная проверка; если у вас есть 100 предметов из класса A и 50 из класса B, и вы делаете 2-кратную проверку, каждая складка должна содержать случайные 50 предметов из А и 25 из В).

    1. Для i в 1..k:

      • Обозначить сгиб в тестовом сгибе
      • Указать один из оставшихся k-1 сгибов проверки Свернуть (это может быть случайным или функцией i, на самом деле не имеет значения)
      • Укажите все оставшиеся сгибы тренировочной складки
      • Выполните поиск по сетке для всех свободных параметров (например, скорость обучения, количество нейронов в скрытом слое, обучение вашим данным обучения и вычислительные потери ваших данных проверки. Выберите параметры, минимизирующие потери
      • Используйте классификатор с параметрами выигрыша для оценки потерь при тестировании. Накопление результатов

Теперь вы собрали совокупные результаты по всем сгибам. Это ваше последнее выступление. Если вы собираетесь применить это по-настоящему, в дикой природе, используйте лучшие параметры из сетки поиска, чтобы тренироваться на всех данных.

4
ответ дан Ben Allison 15 April 2016 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: