Большой обучаемый слой для встраивания замедляет обучение - PullRequest
0 голосов
/ 17 января 2019

Я обучаю сеть, чтобы классифицировать текст с помощью LSTM. Я использую случайно инициализированный и обучаемый слой для ввода слов. Сеть обучается с помощью Adam Optimizer, и слова вводятся в сеть с помощью быстрого кодирования.

Я заметил, что количество слов, представленных в слое внедрения, сильно влияет на время обучения, но я не понимаю, почему. Увеличение количества слов в сети с 200 000 до 2 000 000 почти вдвое увеличило время обучения.

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

Ответы [ 2 ]

0 голосов
/ 17 января 2019

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

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

Что может быть легко. 2 000 000 слов, умноженное на 4 байта на число с плавающей запятой, в 32 раза превышающее длину вашего вектора встраивания (что это? Давайте предположим, что 200) - это что-то вроде 1,6 гигабайта данных, к которым нужно обращаться в каждой мини-партии. Вы также не говорите, как вы тренируете это (CPU, GPU, какой GPU), что оказывает существенное влияние на то, как это должно получиться, например, из-за. эффекты кэша, так как для процессора, выполняющего одинаковое количество операций чтения / записи в несколько менее дружественной к кэш-среде форме (больше разреженности), можно легко удвоить время выполнения.

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

0 голосов
/ 17 января 2019

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

Вы правы относительно обновления весов в слое внедрения. Однако количество весов в одной ячейке LSTM зависит от размера вложения. Если вы посмотрите, например, на уравнение для ворот забывания t-й ячейки, f_t = \sigma_g(W_f x_t + U_f h_{t-1} + b_f) Вы можете видеть, что матрица весов W_f умножается на вход x_t, что означает, что одно из измерений W_f должно быть точно embedding_size. По мере роста embedding_size увеличивается размер сети, поэтому обучение занимает больше времени.

...