Почему глубокому обучению нужно так много данных?

искусственный интеллект глубокое обучение алгоритм Нейронные сети

предисловие

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

Хотя у нас есть трансферное обучение, которое может соответствующим образом уменьшить количество необходимых нам данных, или мы можем удвоить наши данные за счет увеличения данных:

《深度学习为什么需要那么多的数据?》
imgua, мощный инструмент для улучшения изображений

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

Кривая распределения набора данных должна быть гладкой

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

《深度学习为什么需要那么多的数据?》

Но предположим, что наш набор данных выглядит так (верхушка айсберга):

《深度学习为什么需要那么多的数据?》

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

Что ж, если наши наборы данных все такие, то мы тренируемся, а в последующем,Возьмите легкий эталонный объект без доскиизображения (таких изображений в наборе данных нет или мало) для тестирования:

《深度学习为什么需要那么多的数据?》

Видишь, что случилось? Обученная нами нейронная сеть слишком инференциальна, думая, что пока есть этот эталонный объект, под эталонным объектом всегда есть деревянная доска, поэтому возникает такая ситуация. Для устранения этой ситуации данные планок и эталонных объектов в наборе данных должны быть диверсифицированы, и должно быть достаточно данных, что не может удовлетворить объем данных в одной ситуации, и требует данных в различных условиях и условиях.

Библия глубокого обученияЕсть поговорка: обычно используемое подразумеваемое «до» — этосгладить доилилокальная инвариантность, этот априор предполагает, что функция, которую мы изучаем, не должна сильно различаться в пределах небольшой области. То есть изученная функция должна быть гладкой и не должна быть «смещенной». Кроме того, пока имеется достаточно выборок на пиках и впадинах реальной функции для изучения, предположение о гладкости и соответствующие алгоритмы обучения без параметров работают очень хорошо, что является преимуществом большого количества данных.

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

О вращательной инвариантности нейронных сетей

Вот пример простой сети распознавания рукописных данных,LaNet5Сеть распознавания цифр, простая нейронная сеть с семью слоями, но прототип целого набора нейронных сетей.

《深度学习为什么需要那么多的数据?》

В сети распознавания рукописных цифр LeNet есть простой тест изменения изображения, после обучения данных обычными цифровыми изображениями попробуйте распознать преобразованные данные.

Ниже приведена ситуация распознавания цифрового изображения после перевода, масштабирования и поворота.Мы видим, что нейронная сеть все еще может распознавать после простого перевода (число просто перемещается примерно на 15 пикселей), масштабирования и поворота (40 градусов влево). и справа). Но если деформация слишком большая, распознавание не удастся.

《深度学习为什么需要那么多的数据?》

《深度学习为什么需要那么多的数据?》

《深度学习为什么需要那么多的数据?》

Почему это происходит Давайте рассмотрим базовую структуру LaNet5:

《深度学习为什么需要那么多的数据?》

Мы видим, что вся нейронная сеть имеет в общей сложности 7 слоев (исключая входной слой), два из которых являются слоями пула.LaNet-5 использует метод среднего пула, который уменьшает размерность в сети.

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

Например, когда мы обнаруживаем объект, нейронная сетьactivation层На краю объекта наблюдается относительно очевидное изменение.Когда объект немного вращается, а край объекта немного перемещается из-заmax-poolingИз-за этого край этого предмета все равно будет раздражать нас.activation层,Конечно,max-poolingРазмер ядра очень ограничен, для общего поворота изображения, перевода,max-poolingбольше не будет работать.

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

《深度学习为什么需要那么多的数据?》
Кто-то в комментариях нижеконтрольная работа(Обучение цифровым изображениям из первого квадранта, затем тестирование изображений из второго квадранта):

《深度学习为什么需要那么多的数据?》

Разработанный сетевой уровень также очень прост (Keras):

class Model(object):
  
  def __init__(self, num_classes, *input_shape):
    self.model = None
    self.input_shape = input_shape[0]
    self.num_classes = num_classes
  
  def create_model(self, use_fully_connected=True):
    self.model = Sequential()
    self.model.add(Conv2D(64, (3, 3), activation='relu', input_shape=self.input_shape))
    self.model.add(Conv2D(32, (3, 3), activation='relu'))
    self.model.add(MaxPooling2D((2, 2)))
    if use_fully_connected:
      self.model.add(Flatten())
      self.model.add(Dense(128, activation='relu'))
      self.model.add(Dense(self.num_classes, activation='softmax'))
    else:
      self.model.add(Conv2D(16, (3, 3), activation='relu'))
      self.model.add(Flatten())
      self.model.add(Dense(self.num_classes, activation='softmax'))
    
  def compile(self):
    self.model.compile(loss=keras.losses.categorical_crossentropy,
                        optimizer=keras.optimizers.Adadelta(),
                        metrics=['accuracy'])
  
  def train(self, train_x, train_y, num_epochs, batch_size):
    self.model.fit(train_x, train_y, verbose=1, epochs=num_epochs, batch_size=batch_size)
    
  def test(self, test_x, test_y):
    return self.model.evaluate(test_x, test_y)

Разработанная модель имеетmax-poolingслой, последний соединительный слой устанавливается как полносвязный слой или удаляется напрямую. Таким образом, цифровое изображение определенной позиции обучается, а затем тестируется с цифровым изображением другой позиции.Независимо от того, имеет ли построенная нейронная сеть полносвязный слой или нет, результаты тестирования очень «гнилые»:

Точность составляет менее 10%.

Это,max-poolingНа самом деле его роль ограничена, не стоит полагаться на эту «фичу», чтобы лениться и сокращать сбор данных.

Другие связанные исследования и мнения

Есть много подобных исследований вMulti-scale Orderless Pooling of Deep Convolutional Activation FeaturesАвтор выполняет различные операции преобразования, такие как поворот, масштабирование и перемещение изображения, и записывает точность теста при различных степенях преобразования.
《深度学习为什么需要那么多的数据?》

Видно, что большинство кривых являются «арочными» или имеют нисходящий тренд, очевидно, все ещеoriginalлучше всего работает в случае .

《深度学习为什么需要那么多的数据?》

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

CoordConv, последняя статья об Uber

Недавно компания Uber опубликовала статью, в которой добавила слой координат к операции свертки слоя нейронной сети, чтобы решить проблему нечувствительности нейронной сети к положению цели (инвариантность перевода).

Ну, оценка смешанная, если интересно, можете посмотреть по ссылке:

Сверточная нейронная сеть «потерялась», CoordConv, чтобы заполнить дыру
Чтобы спасти CoordConv CNN от насмешек, требуется обучение для перевода координат?

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

в заключении

Сказав так много, самый простой способ улучшить нейронную сеть — это не расширять наш набор данных, то есть так называемоеdata augmentation, Многие трюки на kaggle могут улучшить оценку алгоритма, усердно работая над набором данных. Этот аспект по-прежнему очень хорошо осведомлен.

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

spatial transform network
AutoAugment: Learning Augmentation Policies from Data

Ссылаться на

medium.com/nanonets/Хорошо…
блог Может ли RAS.IO/строительно-разрушающий…
Ууху. Call.com/question/30…
Exploiting Cyclic Symmetry in Convolutional Neural Networks
Ян Ни.Лекун.com/бывший представитель/Лай Ти/…

Статья взята из блога OLDPAN, добро пожаловать в гости:Блог Олдпана

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