Учебник по широте и глубокому обучению TensorFlow

TensorFlow Программа перевода самородков
Учебник по широте и глубокому обучению TensorFlow

В предыдущем учебном пособии по модели @{$wide$TensorFlow Liner} мы использовалиНабор данных переписиМодель логистической линейной регрессии была обучена прогнозировать вероятность того, что человек заработает более 50 000 долларов в год. TensorFlow также хорошо подходит для обучения глубоких нейронных сетей, поэтому вы можете подумать о том, что с ним делать, но почему бы не выбрать и то, и другое? Итак, можно ли совместить преимущества обоих в одной модели?

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

Wide & Deep Spectrum of Models
Wide & Deep Spectrum of Models

Теперь давайте рассмотрим простой пример.

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

  1. Выберите функции для сечения ширины: выберите, какое разреженное основание и поперечные столбцы использовать.

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

  3. Объедините их в модели ширины и глубины (DNNLinearCombinedClassifier).

Установить

Если вы хотите попробовать код из этого руководства:

  1. Установите ТензорФлоу,иди сюда.

  2. скачатьобучающий код.

  3. Установите библиотеку анализа данных pandas. Поскольку в этом руководстве необходимо использовать данные pandas. Хотя tf.learn не требует панд, он их поддерживает. Установить панды:

А. Получить пункт:

# Ubuntu/Linux 64-bit
$ sudo apt-get install python-pip python-dev

# Mac OS X
$ sudo easy_install pip
$ sudo easy_install --upgrade six

б) Установите панд с помощью pip

$ sudo pip install pandas

Если у вас возникли проблемы с установкой, перейдите на веб-сайт pandas по адресуинструкция.

  1. Выполните следующую команду для обучения линейной модели, описанной в руководстве:
$ python wide_n_deep_tutorial.py --model_type=wide_n_deep

Читайте дальше, чтобы узнать, как этот код строит свою линейную модель.

Определение столбцов базовых функций

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

import tensorflow as tf

gender = tf.feature_column.categorical_column_with_vocabulary_list(
    "gender", ["Female", "Male"])
education = tf.feature_column.categorical_column_with_vocabulary_list(
    "education", [
        "Bachelors", "HS-grad", "11th", "Masters", "9th",
        "Some-college", "Assoc-acdm", "Assoc-voc", "7th-8th",
        "Doctorate", "Prof-school", "5th-6th", "10th", "1st-4th",
        "Preschool", "12th"
    ])
marital_status = tf.feature_column.categorical_column_with_vocabulary_list(
    "marital_status", [
        "Married-civ-spouse", "Divorced", "Married-spouse-absent",
        "Never-married", "Separated", "Married-AF-spouse", "Widowed"
    ])
relationship = tf.feature_column.categorical_column_with_vocabulary_list(
    "relationship", [
        "Husband", "Not-in-family", "Wife", "Own-child", "Unmarried",
        "Other-relative"
    ])
workclass = tf.feature_column.categorical_column_with_vocabulary_list(
    "workclass", [
        "Self-emp-not-inc", "Private", "State-gov", "Federal-gov",
        "Local-gov", "?", "Self-emp-inc", "Without-pay", "Never-worked"
    ])

# 展示一个哈希的例子:
occupation = tf.feature_column.categorical_column_with_hash_bucket(
    "occupation", hash_bucket_size=1000)
native_country = tf.feature_column.categorical_column_with_hash_bucket(
    "native_country", hash_bucket_size=1000)

# 连续基列
age = tf.feature_column.numeric_column("age")
education_num = tf.feature_column.numeric_column("education_num")
capital_gain = tf.feature_column.numeric_column("capital_gain")
capital_loss = tf.feature_column.numeric_column("capital_loss")
hours_per_week = tf.feature_column.numeric_column("hours_per_week")

# 转换
age_buckets = tf.feature_column.bucketized_column(
    age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])

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

Модель ширины — это линейная модель с разреженными и пересекающимися столбцами признаков:

base_columns = [
    gender, native_country, education, occupation, workclass, relationship,
    age_buckets,
]

crossed_columns = [
    tf.feature_column.crossed_column(
        ["education", "occupation"], hash_bucket_size=1000),
    tf.feature_column.crossed_column(
        [age_buckets, "education", "occupation"], hash_bucket_size=1000),
    tf.feature_column.crossed_column(
        ["native_country", "occupation"], hash_bucket_size=1000)
]

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

Глубокие модели: встроенные нейронные сети

Глубокая модель представляет собой нейронную сеть с прямой связью, как показано на предыдущем рисунке. Каждый разреженный многомерный категориальный признак сначала преобразуется в низкоразмерный плотный вектор с действительным знаком, часто называемый вложенным вектором. Эти низкоразмерные плотные встроенные векторы объединяются с непрерывными функциями, которые затем передаются в скрытые слои нейронной сети при прямом проходе. Значения встраивания инициализируются случайным образом и обучаются с другими параметрами модели, чтобы свести к минимуму потери при обучении. Если вы хотите узнать больше о встраивании, ознакомьтесь с учебным пособием по адресуVector Representations of Wordsили посмотрите в википедииWord Embedding.

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

deep_columns = [
    tf.feature_column.indicator_column(workclass),
    tf.feature_column.indicator_column(education),
    tf.feature_column.indicator_column(gender),
    tf.feature_column.indicator_column(relationship),
    # 展示一个嵌入例子
    tf.feature_column.embedding_column(native_country, dimension=8),
    tf.feature_column.embedding_column(occupation, dimension=8),
    age,
    education_num,
    capital_gain,
    capital_loss,
    hours_per_week,
]

встроенныйdimensionЧем выше, тем выше степень свободы, и модель должна будет изучить представления для этих функций. Для простоты мы установили размер всех столбцов признаков равным 8. С эмпирической точки зрения лучше всего начать со значения \log_{2}(n) или k\sqrt[4]{n}, где n представляет количество уникальных признаков в столбце признаков, а k является небольшой константой (обычно менее 10).

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

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

Объединение моделей ширины и глубины в одну

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

import tempfile
model_dir = tempfile.mkdtemp()
m = tf.contrib.learn.DNNLinearCombinedClassifier(
    model_dir=model_dir,
    linear_feature_columns=wide_columns,
    dnn_feature_columns=deep_columns,
    dnn_hidden_units=[100, 50])

Обучите и оцените модель

Перед обучением модели прочитайте набор данных переписи, как в«Учебное пособие по линейной модели TensorFlow»так же, как сделано в . Код для обработки входных данных снова для вашего удобства:

import pandas as pd
import urllib

# 为数据集定义列名
CSV_COLUMNS = [
    "age", "workclass", "fnlwgt", "education", "education_num",
    "marital_status", "occupation", "relationship", "race", "gender",
    "capital_gain", "capital_loss", "hours_per_week", "native_country",
    "income_bracket"
]

def maybe_download(train_data, test_data):
  """Maybe downloads training data and returns train and test file names."""
  if train_data:
    train_file_name = train_data
  else:
    train_file = tempfile.NamedTemporaryFile(delete=False)
    urllib.request.urlretrieve(
        "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data",
        train_file.name)  # pylint: disable=line-too-long
    train_file_name = train_file.name
    train_file.close()
    print("Training data is downloaded to %s" % train_file_name)

  if test_data:
    test_file_name = test_data
  else:
    test_file = tempfile.NamedTemporaryFile(delete=False)
    urllib.request.urlretrieve(
        "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test",
        test_file.name)  # pylint: disable=line-too-long
    test_file_name = test_file.name
    test_file.close()
    print("Test data is downloaded to %s"% test_file_name)

  return train_file_name, test_file_name

def input_fn(data_file, num_epochs, shuffle):
  """Input builder function."""
  df_data = pd.read_csv(
      tf.gfile.Open(data_file),
      names=CSV_COLUMNS,
      skipinitialspace=True,
      engine="python",
      skiprows=1)
  # 移除 NaN 元素
  df_data = df_data.dropna(how="any", axis=0)
  labels = df_data["income_bracket"].apply(lambda x: ">50K" in x).astype(int)
  return tf.estimator.inputs.pandas_input_fn(
      x=df_data,
      y=labels,
      batch_size=100,
      num_epochs=num_epochs,
      shuffle=shuffle,
      num_threads=5)

Прочитав данные, вы можете обучить и оценить модель:

# 将 num_epochs 设置为 None,以获得无限的数据流
m.train(
    input_fn=input_fn(train_file_name, num_epochs=None, shuffle=True),
    steps=train_steps)
# 在所有数据被消耗之前,为了运行评估,设置 steps 为 None
results = m.evaluate(
    input_fn=input_fn(test_file_name, num_epochs=1, shuffle=False),
    steps=None)
print("model directory = %s" % model_dir)
for key in sorted(results):
  print("%s: %s" % (key, results[key]))

Первая строка вывода должна выглядеть такaccuracy: 0.84429705. Мы видим, что использование широкой и глубокой моделей повышает точность широкой линейной модели примерно с 83,6% до примерно 84,4%. Если вы хотите увидеть полный рабочий пример, вы можете скачать нашобразец кода.

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