Большой обучаемый слой для встраивания замедляет обучение

Сценарий RichardTheKiwi в функции для использования в selects without cross apply также добавляется, потому что в моем случае я использую его для двойных и денежных значений в поле varchar

CREATE FUNCTION dbo.ReplaceNonNumericChars (@string VARCHAR(5000))
RETURNS VARCHAR(1000)
AS 
    BEGIN
        SET @string = REPLACE(@string, ',', '.')
        SET @string = (SELECT   SUBSTRING(@string, v.number, 1)
                       FROM     master..spt_values v
                       WHERE    v.type = 'P'
                                AND v.number BETWEEN 1 AND LEN(@string)
                                AND (SUBSTRING(@string, v.number, 1) LIKE '[0-9]'
                                     OR SUBSTRING(@string, v.number, 1) LIKE '[.]')
                       ORDER BY v.number
                      FOR
                       XML PATH('')
                      )
        RETURN @string
    END
GO

Спасибо RichardTheKiwi +1

0
задан Jonas 17 January 2019 в 13:27
поделиться

2 ответа

Если я правильно понимаю, ваша сеть использует однозначные векторы, представляющие слова, для вложений некоторого размера 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 увеличивается размер сети, поэтому обучение занимает больше времени.

0
ответ дан tomkot 17 January 2019 в 13:27
поделиться

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

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

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

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

0
ответ дан Peteris 17 January 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: