GitChat Автор: Ли Цзясюань
оригинал:Как прочитать статью об искусственном интеллекте с нуля и построить реализацию статьи и кода
Обратите внимание на публичный аккаунт: технический разговор GitChat, серьезные технологии
Первая часть этого чата:
Сначала я объясню, как читать статью в направлении машинного обучения с нуля и как решать математические задачи в статье. Затем начните с классической статьи, чтобы объяснить, как быстро разобраться и понять структуру и модель глубокого обучения.
В последнее время появилось много статей об искусственном интеллекте и машинном обучении, так как же инженеру с инженерным образованием, меньшим академическим опытом или некоторым опытом прочитать статью, связанную с искусственным интеллектом?
В начальных академических исследованиях я, как правило, интенсивно читал полный текст, особенно классические статьи в области глубокого обучения, но обнаружил, что этот метод занимает слишком много времени и сжимает мою настоящую цель — инженерную реализацию и инженерную интеграцию. Более того, из-за слишком многих вещей, которые нужно понять, вместо того, чтобы понять суть статьи, легко забыть, например, статью, которую я прочитал вчера, забыли, как питьевую воду.
Я буду обсуждать с вами с двух сторон.
1. Начните с нуля и прочитайте уровень статьи
Начать с нуля здесь означает, что нам нужно с нуля понять, что эта статья сделала, какие методы были использованы и какие результаты были получены, и несут ли такие методы и результаты какие-либо уроки для меня.
Вместо того, чтобы говорить, чтобы войти в контакт с совершенно новой областью, начните с чтения статей. Для незнакомых областей, которые никогда не были затронуты. Мой метод заключается в том, чтобы сначала прочитать китайский обзор, китайскую докторскую диссертацию, а затем английский обзор. С помощью китайского обзора вы можете сначала понять основные существительные и общие экспериментальные методы в этой области.
В противном случае, если мы начнем прямо с бумаги, высота авторской стоянки не соответствует нашему уровню, и ее легко принять как данность или просто не выдержать. Поэтому, прежде чем читать эту статью, для базовых знаний, изложенных в этой статье, необходимо полностью понять соответствующие основы китайского языка.
На этот раз вернитесь к состоянию понимания этой статьи с нуля.
Чтение статьи, как правило, имеет 3 возрастающих уровня:
Уровень 1. Прочтите общую информацию статьи (5-10 минут)
-
Внимательно прочитайте заголовок, аннотацию и введение.
-
Заголовки разделов и подразделов, доступные только для чтения, с пропуском определенного содержимого.
-
Прочитайте заключение и обсуждение (здесь автор обычно обсуждает недостатки и недостатки этого исследования, а также дает предложения и направления для будущих исследований).
-
Просмотрите ссылки и отметьте, какие из них вы уже читали.
Поэтому после первого уровня вы должны быть в состоянии ответить на следующие 5 вопросов:
-
Классификация статей: Статьи о методах реализации? Для статьи анализа существующей системы? Для описательного эссе по исследовательской теории?
-
Содержание: Есть ли соответствующая бумага? На какой основной теории основана эта статья? (теоретические основы)
-
Верны ли предположения статьи?
-
Вклад: Является ли эта статья значительным улучшением уровня техники? Или есть новшество в методе? Или завершить базовую теорию?
-
Ясность: Это статья с четким описанием?
После того, как первый уровень пройден, вы можете решить, стоит ли углубляться во второй уровень.Достаточно быть запасом знаний, когда вы хотите использовать его когда-нибудь, вместо того, чтобы начинать сразу.
Уровень 2. Усвоить содержание статьи и игнорировать детали статьи (1 час)
Второй уровень необходимо внимательно прочитать и усвоить ключевые моменты:
-
Понимать значение рисунков и таблиц и выводы, которые они подтверждают.
-
Запишите непрочитанные ссылки в библиографии, которые вы считаете важными, чтобы дать вам четкое представление о контексте статьи.
Для завершения второго уровня знать, какие доказательства используются в статье, как доказывать, какой вывод.
Особенно на этом уровне, если вы столкнулись с непониманием (причин много: слишком много формул, непонимание терминологии, незнакомство с методами эксперимента, слишком много ссылок). Это показывает, что мы не на той же основе, что и автор, и рекомендуется начать с нескольких важных ссылок, чтобы дополнить базовые знания.
Уровень 3. Детальное понимание статьи (5-6 часов)
Если вы хотите применить эту статью к своему текущему проекту, вам нужен уровень 3. Цель состоит в том, чтобы иметь возможность повторно реализовать документ с теми же предположениями.
В то же время обратите внимание на соответствующий код статьи на GitHub, и переход к программе может ускорить понимание.
Сравнивая ваши воспроизведенные результаты с оригинальной статьей, вы можете по-настоящему понять, что является инновационным в статье, а также ее неявные предпосылки или предположения. И вы можете получить некоторое направление для своей будущей работы из процесса воспроизведения.
Преимущество выполнения этих трех уровней заключается в том, что вы можете иметь разумную оценку времени, необходимого для чтения статьи, и вы даже можете настроить глубину статьи в соответствии со временем и вашими рабочими потребностями.
2. Как читать документы по машинному обучению, содержащие много математики
Это часто встречается во многих работах по ИИ, поэтому, вообще говоря, на первом уровне нет необходимости понимать все шаги формулы. Старайтесь пропускать формулы, читать текстовые описания, читать результаты экспериментов и читать выводы.
С накоплением математики в вашей обычной работе на втором уровне вы сможете по-настоящему понять цель и шаги автора, непосредственно взглянув на формулу.
Если вам нужно перейти на третий уровень, вам может потребоваться следовать статье, чтобы сделать некоторые выводы. Но на самом деле, если есть готовая реализация кода, она может дать лучшее понимание математического процесса с инженерной точки зрения.
Наконец, я предлагаю вам использовать этот метод, чтобы попытаться прочитать интересующие вас области из 128 статей в соответствии с вашими потребностями и отрегулировать уровень чтения, чтобы закончить чтение. (Я только что закончил читать, пожалуйста, поделитесь с нами)
128 статей, статей по машинному обучению в 21 основных областях.
Ниже приведена комбинация архитектуры TensorFlow и документа по проектированию системы «TensorFlow:
Крупномасштабное машинное обучение в гетерогенных распределенных системах», чтобы объяснить следующие два момента:
####Модель программирования TensorFlow и основные концепции
Объясните модели статического графа менее чем в 20 строках кода.
TensorFlow работает в следующие 4 этапа:
-
Загружать данные и определять гиперпараметры;
-
построить сеть;
-
обучающая модель;
-
Оценивайте модели и делайте прогнозы.
Давайте возьмем нейронную сеть в качестве примера, чтобы объяснить, как работает TensorFlow. В этом примере мы строим необработанные данные, удовлетворяющие унарной квадратичной функции y = ax2+b, а затем строим простейшую нейронную сеть только с одним входным слоем, одним скрытым слоем и одним выходным слоем. Используйте TensorFlow, чтобы узнать значения весов и смещений скрытого слоя и выходного слоя, и посмотрите, продолжает ли уменьшаться значение потерь по мере увеличения количества тренировок.
Создание и загрузка данных
Сначала сгенерируйте входные данные. Предположим, что окончательное уравнение, которое нужно выучить, равно y = x2 − 0,5, давайте построим группу x и y, которые удовлетворяют этому уравнению, и добавим несколько шумовых точек, которые не удовлетворяют уравнению.
import tensorflow as tf
import numpy as np
# 编造满足一元二次方程的函数
x_data = np.linspace(-1,1,300)[:, np.newaxis] # 为了使点更密一些,我们构建了300个点,分布在-1到1区间,直接采用np生成等差数列的方法,并将结果为300个点的一维数组,转换为300×1的二维数组
noise = np.random.normal(0, 0.05, x_data.shape) # 加入一些噪声点,使它与x_data的维度一致,并且拟合为均值为0、方差为0.05的正态分布
y_data = np.square(x_data) - 0.5 + noise # y = x^2 – 0.5 + 噪声
Затем определите заполнители для x и y как переменные, которые будут переданы в нейронную сеть:
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])
Построить сетевую модель
Здесь нам нужно построить скрытый слой и выходной слой. В качестве слоя в нейронной сети входные параметры должны иметь 4 переменные: входные данные, размерность входных данных, размерность выходных данных и функция активации. Каждый слой обрабатывается векторизацией (y = веса × x + смещения), и после нелинейности функции активации окончательно получаются выходные данные.
Давайте определим скрытый слой и выходной слой, Пример кода выглядит следующим образом:
def add_layer(inputs, in_size, out_size, activation_function=None):
# 构建权重:in_size×out_size大小的矩阵
weights = tf.Variable(tf.random_normal([in_size, out_size]))
# 构建偏置:1×out_size的矩阵
biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
# 矩阵相乘
Wx_plus_b = tf.matmul(inputs, weights) + biases
if activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
return outputs # 得到输出数据
# 构建隐藏层,假设隐藏层有10个神经元
h1 = add_layer(xs, 1, 20, activation_function=tf.nn.relu)
# 构建输出层,假设输出层和输入层一样,有1个神经元
prediction = add_layer(h1, 20, 1, activation_function=None)
Затем необходимо построить функцию потерь: вычислить ошибку между прогнозируемым значением и фактическим значением выходного слоя, просуммировать квадраты разницы между ними, а затем взять среднее значение, чтобы получить функцию потерь. Используйте градиентный спуск, чтобы минимизировать потери с эффективностью 0,1:
# 计算预测值和真实值间的误差
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
Обучите модель
Мы позволяем TensorFlow обучаться 1000 раз и выводим значение потерь при обучении каждые 50 раз:
init = tf.global_variables_initializer() # 初始化所有变量
sess = tf.Session()
sess.run(init)
for i in range(1000): # 训练1000次
sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
if i % 50 == 0: # 每50次打印出一次损失值
print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))
####Базовая реализация TensorFlow
В том числе: оборудование, механизм распределенной работы, связь между устройствами, расчет градиента.
TensorFlow имеет два режима распределения: параллелизм данных и параллелизм моделей, наиболее часто используемый — параллелизм данных. Принцип параллелизма данных очень прост, как показано на рисунке. ЦП в основном отвечает за усреднение градиента и обновление параметров, а ГП1 и ГП2 в основном отвечают за реплики обучающей модели. Здесь это называется «реплики модели», потому что все они обучаются на основе подмножества обучающих примеров, и между моделями существует определенная степень независимости.
Конкретные этапы обучения следующие.
-
Определите структуру сети модели на GPU1 и GPU2 соответственно.
-
Для одного GPU разные блоки данных считываются из конвейера данных, затем выполняется прямое распространение, вычисляются потери и вычисляется градиент текущей переменной.
-
Передайте все данные градиента, выведенные графическим процессором, в ЦП, сначала выполните операцию усреднения градиента, а затем обновите переменные модели.
-
Повторяйте шаги с 1 по 3, пока переменные модели не сойдутся.
Целью параллелизма данных является главным образом повышение эффективности SGD. Например, если размер мини-партии каждого SGD составляет 1000 образцов, то если его разрезать на 10 копий, каждый по 100, а затем копировать модель 10 копий, то можно рассчитывать на 10 моделей одновременно.
Однако из-за того, что скорость расчета 10 моделей может быть непоследовательной, некоторые из них быстрые, а некоторые медленные, когда ЦП обновляет переменные, он должен дождаться завершения всех вычислений этого мини-пакета, а затем суммировать и усреднять для обновить его.Или пусть сначала обновится часть выполненного расчета, а предыдущий расчет будет перезаписан?
Это поднимает вопрос о синхронных и асинхронных обновлениях.
Распределенный стохастический градиентный спуск означает, что параметры модели могут храниться на разных серверах параметров распределенным образом, а рабочие узлы могут параллельно обучать данные и обмениваться данными с серверами параметров для получения параметров модели. Параметры обновления также делятся на синхронные и асинхронные методы, а именно асинхронный стохастический градиентный спуск (Async-SGD) и синхронный стохастический градиентный спуск (Sync-SGD). Как показано на рисунке:
Смысл метода синхронного стохастического градиентного спуска (также называемого синхронным обновлением и синхронным обучением) заключается в том, что во время обучения рабочие задачи на каждом узле должны считывать общие параметры и выполнять параллельные вычисления градиента.После расчета градиента все общие параметры объединяются и накапливаются, а затем за один раз обновляются до параметров модели, в следующем пакете все рабочие узлы перед обучением получают обновленные параметры модели.
Преимущество этой схемы в том, что для каждой обучающей партии рассматривается ситуация обучения всех рабочих узлов, а потери относительно стабильны; недостаток в том, что узкое место производительности приходится на самый медленный рабочий узел. В разнородных устройствах производительность рабочих узлов часто разная, и этот недостаток очень очевиден.
Смысл асинхронного стохастического градиентного спуска (также известного как асинхронное обновление, асинхронное обучение) заключается в том, что задача на каждом рабочем узле самостоятельно вычисляет локальный градиент и асинхронно обновляет параметры модели без выполнения операций согласования и ожидания.
Преимущество этой схемы в том, что нет узких мест в производительности, недостаток в том, что значение градиента, рассчитанное каждым рабочим узлом, отправляется обратно на сервер параметров, возникнет конфликт обновления параметров, что повлияет на скорость сходимости алгоритм в определенной степени, и в процессе снижения потерь дрожание велико.
Как выбрать между синхронным обновлением и асинхронным обновлением? Есть ли способ оптимизировать его?
Разница между реализацией синхронного обновления и асинхронного обновления в основном заключается в стратегии обновления параметров сервера параметров. Когда объем данных невелик и вычислительная мощность каждого узла относительно сбалансирована, рекомендуется синхронный режим; когда объем данных велик и вычислительная производительность каждой машины различается, рекомендуется асинхронный режим. Какой из них использовать, зависит от результатов эксперимента. Как правило, если объем данных достаточно велик, эффект асинхронного обновления будет лучше.
Ниже показано, как создать кластер серверов TensorFlow и как распределить статический граф в кластере.
Все узлы распределенного кластера TensorFlow выполняют один и тот же код. Код распределенной задачи имеет фиксированную структуру:
# 第1步:命令行参数解析,获取集群的信息ps_hosts和worker_hosts,
以及当前节点的角色信息job_name和task_index。例如:
tf.app.flags.DEFINE_string("ps_hosts", "", "Comma-separated list of hostname:port pairs")
tf.app.flags.DEFINE_string("worker_hosts", "", "Comma-separated list of hostname:port
pairs")
tf.app.flags.DEFINE_string("job_name", "", "One of 'ps', 'worker'")
tf.app.flags.DEFINE_integer("task_index", 0, "Index of task within the job")
FLAGS = tf.app.flags.FLAGS
ps_hosts = FLAGS.ps_hosts.split(",")
worker_hosts = FLAGS.worker_hosts(",")
# 第2步:创建当前任务节点的服务器
cluster = tf.train.ClusterSpec({"ps": ps_hosts, "worker": worker_hosts})
server = tf.train.Server(cluster, job_name=FLAGS.job_name, task_index=FLAGS.task_index)
# 第3步:如果当前节点是参数服务器,则调用server.join()无休止等待;如果是工作节点,则执行第4步
if FLAGS.job_name == "ps":
server.join()
# 第4步:构建要训练的模型,构建计算图
elif FLAGS.job_name == "worker":
# build tensorflow graph model
# 第5步:创建tf.train.Supervisor来管理模型的训练过程
# 创建一个supervisor来监督训练过程
sv = tf.train.Supervisor(is_chief=(FLAGS.task_index == 0), logdir="/tmp/train_logs")
# supervisor负责会话初始化和从检查点恢复模型
sess = sv.prepare_or_wait_for_session(server.target)
# 开始循环,直到supervisor停止
while not sv.should_stop()
# 训练模型
Возьмите приведенную выше структуру кода для выполнения распределенного обучения набору данных MNIST, см. код:
Вторая часть этого чата: Объясните, как преобразовать ваши требования в описание статьи и реализовать это.
Возьмем в качестве примера рекомендательную систему: обратитесь к статье:
woohoo.textkernel.com/building-pull…
Мы берем построение базы знаний в рекомендательной системе подбора персонала в качестве примера, чтобы объяснить, где и как внедрить метод НЛП и граф знаний.
(1) Зачем создавать базу знаний? Ниже приведен поиск по базе знаний:
То есть мы хотим структурировать соответствующее описание работы в граф знаний:
Мы знаем, что граф знаний включает сущности и отношения сущностей, поэтому в сочетании со сценарием найма база данных сущностей должна включать: базу данных вакансий, базу данных занятий, базу данных резюме и тезаурус сущностей. Отношения сущностей могут иметь отношения атрибуции, иерархические отношения и отношения ассоциации.
Давайте выполним структурированное извлечение описаний должностей для разработки системы маркировки отношений сущностей следующим образом:
Как его извлечь?
-
Ищите якоря и знаки препинания, чтобы разбивать короткие предложения.
Должность
内容:
(Продавец/Ученик):负责
В баре следуйте за мастером, чтобы приготовить напитки, нарезать фруктовые тарелки и закуски;待遇:
Базовая зарплата штатного сотрудника 3000-3500 юаней/мес + премия + пять страховок и один жилищный фонд, компания включает проживание и питание工作地点:
Компания подбирает ближайшее рабочее место по месту жительства сотрудника -
Найдите основной контент в коротких предложениях на основе характерных слов/слов.
(Продавец/Ученик)
В баре следуйте за мастером, чтобы приготовить напитки,切配
фруктовая тарелка, перекус
Базовая заработная плата штатных сотрудников3000-3500
Юань/мес+бонус+五
риск一
золото
Компания организует по месту жительства сотрудников最近
Работа地点
-
Извлечение основного слова
Ученик продавца
Барная смесь Напитки Нарезка Компот Закуски
Базовая заработная плата 3000-3500 юаней в месяц, бонусы, пять страховок и один жилищный фонд.
Ближайшее место работы
Итак, в этом процессе, как найти слова позиционирования? Обычно делится на 3 этапа:
(1) Позиционные слова -> начальные слова -> позиционирующие слова. Например:
(2) На основе маркировки частей речи. Например:
Сегментируйте текст, выполняйте тегирование частей речи и находите动词、数词、量词
, как термин позиционирования
(3) На основе грамматики. Например:
Имена существительные подряд, сокращения после глаголов
Частота совпадения фраз высокая. Глагол + прилагательное, Глагол + комбинации наречия
Информацию о тегах частей речи см. в разделе Набор тегов частей речи для китайского языка:
Наконец, создается база знаний по подбору персонала:
Наконец, я надеюсь, что вы сможете прочитать больше документов, обобщить и просмотреть статьи, которые вы прочитали, объединить с реализацией с открытым исходным кодом на GitHub и больше попрактиковаться в TensorFlow. При накоплении большого количества работ в какой-либо области можно обнаружить множество существующих проблем и возможностей.
Запись: «Ли Цзясюань: как изучить TensorFlow из документов по искусственному интеллекту»