Как использовать множественные входы в кератах, токенах и предварительно вычисленных вложениях BERT? - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь построить модель keras с несколькими входами для задачи маркировки последовательности.В частности, я подаю предложения различной длины и предварительно вычисленные вложения BERT для каждого токена в предложении.

Вложения BERT (каждый токен в предложении, представляемом массивом из 1024 операций с плавающей запятой) вычисляются во времяшаг предварительной обработки, а затем сохраняется с каждым предложением в виде словаря в формате:

{'tokens':['The', 'dog', 'barked'],
'BERT_embedding':[[float1,float2,...,float1024],
                  [float1,float2,...,float1024],
                  [float1,float2,...,float1024]]}

{'tokens':['A', 'cat', 'purred', 'softly'],
 'BERT_embedding':[[float1,float2,...,float1024],
                   [float1,float2,...,float1024],   
                   [float1,float2,...,float1024],
                   [float1,float2,...,float1024]]}

Для модели keras я отправляю токены в качестве входных данных и соединяю эти входные данные со слоем внедрения Word2Vec, который превращает каждый токенв его 300-мерном представлении word2vec.Итак, в моей сводке модели, которую я печатаю, у меня есть:

Layer (type)               Output Shape        Param #    Connected to
token_input (InputLayer)   (None, None)        0          
token_embed (Embedding)    (None, None, 300)   59268000   token_input[0][0]

Мне нужен совет / помощь по определению входного слоя для вложений BERT, которые я предварительно вычислил, так, чтобы я мог затем объединить двавходные данные в связанном слое, который будет выглядеть примерно так:

Layer (type)                 Output Shape        Param #    Connected to
token_input (InputLayer)     (None, None)        0          
token_embed (Embedding)      (None, None, 300)   59268000   token_input[0][0]
BERT_input (InputLayer)      (None, None, 1024)     0
merged_input (Concatenate)   (None, None, 1324)  0          token_embed[0][0]
                                                            BERT_input[0][0]

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

Моя основная путаница связана с каждым входным токеном, с которым связан объект списка BERT_embedding.

Как я могу структурировать свой слой BERT для встраивания так, чтобы для каждого токена ввода я передавал 1024 числа с плавающей точкой, связанных с ним, а не сам объект списка (поскольку keras, очевидно, не принимает тип списка)сами объекты в качестве входных данных)?

Буду признателен за ответы, относящиеся к правильной настройке форм ввода модели, а не, например, за предложения по вычислению вложений BERT в качестве слоя в самой модели (т. е. при изменении характеравходные данные).Я вычисляю и сохраняю вложения BERT в качестве шага предварительной обработки, поскольку хочу, чтобы мои входные данные могли использоваться другими, даже если они имеют аппаратные ограничения, которые могут помешать им быстро вычислить вложения BERT сами.

...