Сценарий 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
Если я правильно понимаю, ваша сеть использует однозначные векторы, представляющие слова, для вложений некоторого размера embedding_size. Затем вложения вводятся в качестве входных данных в LSTM. Обучаемые переменные сети - это переменные уровня внедрения и самого LSTM.
Вы правы в отношении обновления весов в слое внедрения. Однако количество весов в одной ячейке LSTM зависит от размера вложения. Если вы посмотрите, например, на уравнение для ворот забвения t-й ячейки, , вы увидите, что матрица весов W_f умножается на вход x_t, что означает, что из размеров W_f должен быть точно embedding_size. По мере роста embedding_size увеличивается размер сети, поэтому обучение занимает больше времени.
Количество необходимых обновлений будет отражено в количестве эпох, необходимых для достижения определенной точности.
Если вы наблюдаете, что конвергенция занимает одинаковое количество эпох, но каждая эпоха занимает вдвое больше времени настенных часов, то это указывает на то, что простое выполнение поиска встраивания (и написание обновления таблицы встраивания) теперь занимает значительное часть вашего тренировочного времени.
Что может быть легко. 2 000 000 слов, умноженное на 4 байта на число с плавающей запятой, в 32 раза превышающее длину вашего вектора встраивания (что это? Давайте предположим, что 200) - это что-то вроде 1,6 гигабайта данных, к которым нужно обращаться в каждой мини-партии. Вы также не говорите, как вы тренируете это (CPU, GPU, какой GPU), что оказывает существенное влияние на то, как это должно получиться, например, из-за. эффекты кэширования, так как для процессора, выполняющего одинаковое количество операций чтения / записи в несколько менее удобной для кэша форме (больше разреженности), можно легко удвоить время выполнения.
Кроме того, ваша предпосылка немного необычна. Сколько у вас помеченных данных, которых было бы достаточно для примеров # 2000000-го редчайшего слова для непосредственного вычисления значимого вложения? Это, вероятно, возможно, но было бы необычно, почти во всех наборах данных, в том числе очень больших, # 2000000-е слово было бы одноразовым и, следовательно, было бы вредно включать его в обучаемые вложения. Обычный сценарий заключается в том, чтобы рассчитывать большие вложения отдельно от больших немеченых данных и использовать их в качестве фиксированного неизучаемого слоя, и, возможно, объединять их с небольшими обучаемыми встраиваниями из помеченных данных для захвата таких вещей, как предметно-ориентированная терминология.