Основа машинного обучения для глубокого обучения Python|Вызов августовского обновления

машинное обучение Python

Эта статья — одна из серии заметок, которые я написал, изучая Deep Learning with Python (второе издание, Франсуа Шолле). Содержимое статьи конвертируется из блокнотов Jupyter в Markdown, и когда я закончу все статьи, я опубликую все написанные мной блокноты Jupyter на GitHub.

Вы можете прочитать оригинальный текст (на английском языке) этой книги онлайн на этом сайте:live book.manning.com/book/deep-come…

Автор этой книги также дает набор блокнотов Jupyter:GitHub.com/ Very OL T/…


Эта статьяГлава 4. Основы машинного обучения(Глава 4. Основы машинного обучения) Интеграция заметок.

Четыре ветви машинного обучения

4.1 Four branches of machine learning

  1. контролируемое обучение
  2. неконтролируемое обучение
  3. самоконтролируемое обучение
  4. обучение с подкреплением

Оценка модели машинного обучения

4.2 Evaluating machine-learning models

обучающий набор, проверочный набор и тестовый набор

  • Набор для обучения: используется для изучения параметров (веса узлов в сети);
  • Набор проверки: используется для изучения гиперпараметров (весов сети, таких как количество слоев и размер слоев);
  • Тестовый набор: используется для проверки результатов, чтобы убедиться, что модель никогда не видела данные.

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

Лучше всего сначала разделить все данные на обучающие и тестовые наборы. Затем часть обучающего набора делится на проверочный набор.

Вот несколько способов выбрать набор проверки:

простая проверка отпуска

SIMPLE HOLD-OUT VALIDATION

Это просто отложить часть обучающего набора в качестве проверочного набора.

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

简单留出验证的示意图

# Hold-out validation

num_validation_samples = 10000

np.random.shuffle(data)    # 洗牌,打乱数据

validation_data = data[:num_validation_samples]    #定义验证集
data = data[num_validation_samples:]

training_data = data[:]    # 定义训练集

# 在训练集训练模型,在验证集评估
model = get_model()
model.train(training_data)
validation_score = model.evaluate(validation_data)

## 然后这里可以根据结果调整模型,
## 然后重新训练、评估,然后再次调整...

# 在调整好超参数之后,用除了测试集的所有数据来训练最终模型
model = get_model()
model.train(np.concatenate([training_data, validation_data]))

# 用测试集来评估最终模型
test_score = model.evaluate(test_data)

K-кратная проверка

K-FOLD VALIDATION

Этот метод заключается в разделении данных на K равных частей. Для каждой части i обучите оставшиеся части K-1 и подтвердите оценку i. Конечным результатом проверки является среднее значение K значений проверки.

Этот метод очень эффективен, когда различные подразделения набора для обучения и проверки оказывают большое влияние на результаты (например, когда данные относительно малы).

K折验证示意图

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

# K-fold cross-validation

k = 4
num_validation_samples = len(data) // k

np.random.shuffle(data)

validation_scores = []
for fold in range(k):
    # 选择验证集
    validation_data = data[num_validation_samples * fold:
                           num_validation_samples * (fold + 1)]
    # 用剩下的做训练集
    training_data = data[:num_validation_samples * fold] + 
                    data[num_validation_samples * (fold + 1):]
    
    model = get_model()    # 注意是用个全新的模型
    
    model.train(training_data)
    
    validation_score = model.evaluate(validation_data)
    validation_scores.append(validation_score)

# 总的验证值是所有的平均
validation_score = np.average(validation_scores)

# 然后根据结果做各种超参数调整啦

# 最后在除了测试集的所有数据上训练
model = get_model()
model.train(data)
test_score = model.evaluate(test_data)

Повторная K-кратная проверка с зашифрованными данными

ITERATED K-FOLD VALIDATION WITH SHUFFLING

Это многократно запускать K-кратную проверку P раз и перемешивать карты перед каждым запуском.

Это используется, когда данные относительно малы, и требуется, чтобы они были максимально точными. Ему нужно запускать P*K раз, так что это отнимает много времени.

Код для этого в книге не приводится, просто добавьте слой цикла на основе K fold:

# ITERATED K-FOLD VALIDATION WITH SHUFFLING

p = 10

k = 4
num_validation_samples = len(data) // k

total_validation_scores = []

for i in range(p):
    np.random.shuffle(data)
    
    validation_scores = []
    for fold in range(k):
        # TODO: K折验证的那堆代码
    
    validation_score = np.average(validation_scores)
    total_validation_scores.append(validation_score)
    
# 总的验证值是所有的平均
validation_score = np.average(total_validation_scores)

# 然后根据结果做各种超参数调整啦

# 最后在除了测试集的所有数据上训练
model = get_model()
model.train(data)
test_score = model.evaluate(test_data)

Меры предосторожности при делении

  • Представление данных: И обучающие, и тестовые наборы должны быть репрезентативными для всех данных. Например, при распознавании цифр в обучающем наборе только от 0 до 7, а в тестовом наборе — от 8 до 9. Перед этим все данные следует случайным образом перетасовать, а затем разделить на обучающую и тестовую выборки.
  • стрела времени: Если это вид, который делает прогнозы, зависящие от времени (прошлое, предсказывает будущее), перед началомНе засоряйте данные, чтобы сохранить хронологический порядок данных (нарушение его приведет к утечке времени, то есть модель учится из «будущего»), а данные тестового набора позже, чем обучающий набор.
  • избыточность данных: если данные повторяются и случайным образом зашифровываются, одни и те же данные могут появиться в обучающем, проверочном и тестовом наборах одновременно. Эта ситуация влияет на результаты, а обучающая и проверочная выборки не могут иметь пересечений.

Предварительная обработка данных, разработка функций и изучение функций

4.3 Data preprocessing, feature engineering, and feature learning

предварительная обработка данных

  1. ВЕКТОРИЗАЦИЯ Векторизация: данные, подаваемые в нейронную сеть, должны быть тензорами чисел с плавающей запятой (иногда они также могут быть целыми числами), и нам нужно преобразовать все виды реальных данных, таких как текст и изображения, в тензоры.

  2. НОРМАЛИЗАЦИЯ ЗНАЧЕНИЙ СТАНДАРТИЗАЦИЯ ЗНАЧЕНИЙ: Для пользы обучения и результатов мы хотим, чтобы данные соответствовали следующим критериям:

    • Значение небольшое, обычно 0~1;
    • Однородность, то есть диапазон значений всех признаков примерно одинаков;

Если это более строго (но не обязательно), мы можем рассматривать признаки в данных как имеющие среднее значение 0 и стандартное отклонение 1. Сделать это с Numpy легко:

# x 是二维的:(samples, features)
x -= x.mean(axis=0)
x /= x.std(axis=0)
  1. ОБРАБОТКА ОТСУТСТВУЮЩИХ ЗНАЧЕНИЙ Обработка отсутствующих значений: Вообще говоря, пока 0 не является осмысленным значением, вы можете использовать 0 для замены отсутствующих значений. Сеть может узнать, что 0 отсутствует. Кроме того, если ваш тестовый набор отсутствует, а обучающий набор отсутствует, вам необходимо вручную добавить некоторые искусственные данные, чтобы сеть узнала об отсутствующих.

разработка функций

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

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

特征工程示意图

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

Clown0te("防盗文爬:)虫的追踪标签,读者不必在意").by(CDFMLR)

переобучение и недообучивание

4.4 Overfitting and underfitting

В машинном обучении есть ряд проблем:оптимизация(оптимизация) иобобщение(обобщение).

Недостаточная оптимизация — это недообучение, а неспособность обобщать — переоснащение.

За недообучением следует обучение.Сети глубокого обучения всегда можно оптимизировать с определенной точностью.Ключевая проблема — обобщение. Регуляризация используется для борьбы с переоснащением. Ниже приведены несколько методов регуляризации:

добавить тренировочные данные

Увеличьте данные обучающей выборки, эммммм, поищите еще данных, чтобы это показать, много знаете, это обобщение.

уменьшить размер сети

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

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

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

Добавить регуляризацию веса

В соответствии с бритвой Оккама, простая модель с меньшей вероятностью переобучится, чем сложная модель. Упомянутая здесь простая модель относится к модели с меньшей энтропией распределения значений параметров.

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

Есть два основных способа добавить эту стоимость:

  • Регуляризация L1: добавить значение, пропорциональное модулю весовых коэффициентов (норму весов L1);
  • Регуляризация L2: добавьте значение, пропорциональное квадрату весового коэффициента (норма L2 весов).В нейронных сетях регуляризация L2 также называется уменьшением веса.

В Keras добавление регуляризации веса может быть достигнуто путем передачи экземпляра регуляризации веса в слой:

from keras import regularizers

model = models.Sequential()

model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001), 
                       activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),
                       activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

regularizers.l2(0.001)означает добавление штрафа к функции потерь0.001 * weight_coefficient_value. Эта вещь добавляется только во время обучения, она не будет действовать при оценке с помощью тестового набора, поэтому значение потерь, которое вы видите во время обучения, намного больше, чем во время тестирования.

Вы также можете заменить L2 на L1 здесь:regularizers.l1(0.001), или L1 и L2 увеличиваются одновременно:regularizers.l1_l2(l1=0.001, l2=0.001).

добавить отсев

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

Использование отсева для определенного слоя — это случайное отбрасывание некоторых особенностей вывода слоя в процессе обучения (то есть установка значения 0).

Например:[0.2, 0.5, 1.3, 0.8, 1.1] -> [0, 0.5, 1.3, 0, 1.1], позиция, в которой он становится 0, является случайной.

Здесь есть коэффициент отсева, который указывает, сколько пропорций функций установлено на 0. Эта пропорция обычно составляет 0,2 ~ 0,5. Кроме того, во время тестирования нет отсева, но вывод во время тестирования должен быть уменьшен в соответствии с коэффициентом отсева, чтобы сбалансировать результаты во время тестирования и обучения.

То есть, например, делаем отсев равным 0,5, то есть выбрасываем половину его во время тренировки:

# training case
layer_output *= np.random.randint(0, high=2, size=layer_output.shape)

Тогда при тестировании соответствующее снижение составляет 50%:

# testing case
layer_output *= 0.5

Но обычно мы не уменьшаем масштаб во время тестирования, вместо этого мы увеличиваем масштаб во время обучения, а затем не двигаемся во время тестирования:

# training case
layer_output *= np.random.randint(0, high=2, size=layer_output.shape)
layer_output /= 0.5

训练时对激活矩阵使用 dropout,并在训练时成比例增大。测试时激活矩阵保持不变

В Keras мы можем добиться этого, добавив слой Dropout:

model.add(layers.Dropout(0.5))

Например, мы добавляем отсев в нашу сеть IMDB:

model = models.Sequential()

model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dropout(0.5))

model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dropout(0.5))

model.add(layers.Dense(1, activation='sigmoid'))

Общий рабочий процесс для машинного обучения

4.5 The universal workflow of machine learning

  1. Определите проблему, соберите набор данных: определите проблему и данные для обучения. Соберите эти данные и при необходимости пометьте данные.

  2. Выберите показатель для измерения успеха: выберите показатель для измерения успеха проблемы. Какие показатели вы хотите отслеживать на данных проверки?

  3. Определите метод оценки: отложить для проверки?Кратность проверки?Какую часть данных следует использовать для проверки?

  4. Подготовьте данные: предварительная обработка, проектирование признаков. .

  5. Разработайте лучшую модель, чем эталон (например, случайный прогноз), то есть модель со статистической мощностью.

Выбор последнего слоя и потери:最后一层和损失的选择

  1. Масштабируйте и разрабатывайте модели переобучения: добавляйте слои, добавляйте единицы, добавляйте раунды

  2. Настройка гиперпараметров, регуляризация модели: Регулировка модели и настройка гиперпараметров на основе производительности модели на данных проверки.