Какой метод вы используете для отладки глубоких нейронных сетей? Вот четыре простых способа

Нейронные сети
Какой метод вы используете для отладки глубоких нейронных сетей? Вот четыре простых способа

из среды

Автор: Авеш Сингх

Сборник "Сердце машины"

Участие: Нурхачу Нулл, Чита

Авторы этой статьи обобщают четыре метода отладки глубоких нейронных сетей, а именно прогнозирование синтетических результатов, визуализацию значений активации, градиентный анализ и анализ прогнозов модели. Надеюсь, эти советы помогут вам отладить вашу модель!

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

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

Но точка зрения черного ящика указывает на очевидный вопрос для практиков машинного обучения: как вы отлаживаете модель?

В этом посте я расскажу о некоторых методах, которые мы использовали в Cardiogram для отладки DeepHeart, который предсказывает болезни, используя данные Apple Watch, Garmin и WearOS.глубокая нейронная сеть.

В Cardiogram мы считаем, что создание DNN — это не алхимия, а инженерия.

Ваше сердце раскрывает много вашей информации. DeepHeart использует данные о частоте сердечных сокращений от Apple Watch, Garmin и WearOS, чтобы прогнозировать риск развития диабета, высокого кровяного давления и апноэ во сне.

1. Предскажите синтетический результат

Тестируйте возможности модели, прогнозируя синтетические выходные задачи, созданные на основе входных данных.

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

SD (дневная частота сердечных сокращений) — стандартное отклонение (ночная частота сердечных сокращений)

Чтобы изучить эту функцию, модель должна уметь:

1. Различать день и ночь

2. Вспомните данные за последние несколько дней

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

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

2. Визуализируйте значение активации

Понять внутреннюю работу обученной модели сложно. Как вы понимаете тысячи матричных умножений?

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

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

Код для извлечения активаций из модели, написанной в Keras, прост. Следующий фрагмент кода создает функцию Keras last_output_fn, которая, учитывая некоторые входные данные, получает выходные данные слоя (т. е. его активации).

from keras import backend as Kdef extract_layer_output(model, layer_name, input_data):  layer_output_fn = K.function([model.layers[0].input],                               [model.get_layer(layer_name).output])  layer_output = layer_output_fn([input_data])  # layer_output.shape is (num_units, num_timesteps)  return layer_output[0]скопировать код

Мы визуализировали активации нескольких слоев сети. При изучении активаций второго сверточного слоя (временной сверточный слой шириной 128) мы заметили кое-что странное:

Значение активации каждой единицы сверточного слоя на каждом временном шаге. Оттенки синего представляют значения активации.

Значение активации не меняется со временем! На них не влияет входное значение, и они называются «мертвыми нейронами».

Функция активации ReLU, f (x) = max (0, x)

Эта архитектура используетReLUФункция активации, которая выводит 0, когда вход отрицательный. Хотя это относительно неглубокий слой в этой нейронной сети, именно это и происходит на самом деле.

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

Когда все выходные данные сверточного слоя равны нулю, единицы последующих слоев выводят значение своего члена смещения. Вот почему каждая единица этого слоя выводит другое значение — из-за их разных условий смещения.

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

Мы не ожидали найти в этом анализе «мертвые нейроны», но труднее всего найти ошибки, которые вы не собирались находить.

3. Градиентный анализ

Конечно, градиент делает больше, чем просто оптимизирует функцию потерь. При градиентном спуске мы вычисляем Δloss, соответствующий Δпараметру. Хотя расчет градиента в обычном понимании — это эффект изменения одной переменной на другую. Поскольку вычисление градиента необходимо в методах градиентного спуска, такие фреймворки, как TensorFlow, предоставляют функции для вычисления градиентов.

Мы используем градиентный анализ, чтобы определить, может ли наша глубокая нейронная сеть фиксировать долгосрочные зависимости в данных. Входные данные для DNN особенно длинные: 4096 временных шагов частоты сердечных сокращений или данных шагомера. Важно, чтобы архитектура нашей модели фиксировала долгосрочные зависимости в данных. Например, время восстановления сердечного ритма может предсказать диабет. Это время, необходимое для восстановления пульса в состоянии покоя после тренировки. Чтобы вычислить его, глубокая нейронная сеть должна уметь вычислять частоту сердечных сокращений в состоянии покоя и помнить, когда вы закончили тренировку.

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

Для всех временных шагов t градиент, который мы хотим вычислить, равен Δoutput, соответствующему Δinput_t. Вот пример кода для вычисления этого градиента с помощью Keras и TensorFlow:

def gradient_output_wrt_input(model, data):  # [:, 2048, 0] means all users in batch, midpoint timestep, 0th task (diabetes)  output_tensor = model.model.get_layer('raw_output').output[:, 2048, 0]  # output_tensor.shape == (num_users)  # Average output over all users. Result is a scalar.  output_tensor_sum = tf.reduce_mean(output_tensor)  inputs = model.model.inputs # (num_users x num_timesteps x num_input_channels)  gradient_tensors = tf.gradients(output_tensor_sum, inputs)  # gradient_tensors.shape == (num_users x num_timesteps x num_input_channels)  # Average over users  gradient_tensors = tf.reduce_mean(gradient_tensors, axis=0)  # gradient_tensors.shape == (num_timesteps x num_input_channels)  # eg gradient_tensor[10, 0] is deriv of last output wrt 10th input heart rate  # Convert to Keras function  k_gradients = K.function(inputs=inputs, outputs=gradient_tensors)  # Apply function to dataset  return k_gradients([data.X])скопировать код

В приведенном выше коде мы вычислили выходные данные в середине временного шага 2048 до объединения средних значений. Причина, по которой мы используем среднюю точку вместо последнего временного шага, заключается в том, что наши ячейки LSTM являются двунаправленными, а это означает, что для половины ячеек 4095 фактически является первым временным шагом. Визуализируем полученный градиент:

Δoutput_2048 / Δinput_t

Обратите внимание, что наша ось Y имеет логарифмическую шкалу. На временном шаге 2048 выходной градиент, соответствующий входу, равен 0,001. Но на временном шаге 2500 соответствующий градиент в миллион раз меньше! С помощью градиентного анализа мы обнаружили, что эта архитектура не может зафиксировать долгосрочные зависимости.

В-четвертых, прогноз модели анализа

Возможно, вы анализировали прогнозы модели, глядя на такие показатели, как AUROC и средняя абсолютная ошибка. Вы также можете использовать дополнительный анализ, чтобы понять поведение модели.

Например, нам было интересно, действительно ли DNN использовала входные данные о частоте сердечных сокращений для создания прогнозов, или ее обучение сильно зависело от предоставленных метаданных — мы инициализировали состояние LSTM пользовательскими метаданными, такими как пол, возраст. Чтобы понять это, мы сравнили модель с моделью логистической регрессии, обученной метаданным.

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

Этот график подтверждает нашу гипотезу, так как предсказания не сильно коррелированы.

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

Как только у вас есть предположения о режиме потерь, он анализирует стратификацию путем тестирования. Например, если наибольшие общие потери у Apple Watch первого поколения, мы можем рассчитать точность нашего индекса настройки централизованных пользовательских настроек Apple Watch первого поколения, и эти показатели сравнить с индексом, рассчитанным на оставшейся настройке Tuning.

Исходная ссылка: https://blog.cardiogr.am/4-ways-to-debug-your-deep-neural-network-e5edb14a12d7

Эта статья составлена ​​для сердца машины,Для перепечатки, пожалуйста, свяжитесь с этим официальным аккаунтом для авторизации .

✄------------------------------------------------

Присоединяйтесь к сердцу машины (штатный репортер/стажер): hr@jiqizhixin.com

Чтобы внести свой вклад или получить покрытие:content@jiqizhixin.com

Реклама и деловое сотрудничество: bd@jiqizhixin.com