Керас Word2Vec реализация - PullRequest
0 голосов
/ 26 июня 2018

Я использую реализацию, найденную в http://adventuresinmachinelearning.com/word2vec-keras-tutorial/, чтобы узнать кое-что о word2Vec. Я не понимаю, почему функция потерь не уменьшается?

Iteration 119200, loss=0.7305528521537781
Iteration 119300, loss=0.6254740953445435
Iteration 119400, loss=0.8255964517593384
Iteration 119500, loss=0.7267132997512817
Iteration 119600, loss=0.7213149666786194
Iteration 119700, loss=0.6156617999076843
Iteration 119800, loss=0.11473365128040314
Iteration 119900, loss=0.6617216467857361

Сеть, насколько я понимаю, является стандартной, используемой в этой задаче:

input_target = Input((1,))
input_context = Input((1,))

embedding = Embedding(vocab_size, vector_dim, input_length=1, name='embedding')

target = embedding(input_target)
target = Reshape((vector_dim, 1))(target)
context = embedding(input_context)
context = Reshape((vector_dim, 1))(context)

dot_product = Dot(axes=1)([target, context])
dot_product = Reshape((1,))(dot_product)
output = Dense(1, activation='sigmoid')(dot_product)

model = Model(inputs=[input_target, input_context], outputs=output)
model.compile(loss='binary_crossentropy', optimizer='rmsprop') #adam??

Слова взяты из словаря размера 10000 из http://mattmahoney.net/dc/text8.zip (текст на английском языке)

Что я замечаю, так это то, что некоторые слова несколько выучены во времени, например, контекст для чисел и статей легко угадывается, однако потеря довольно сильно застряла примерно на 0,7 с начала, и по мере итерации она колеблется только случайным образом.

Тренировочная часть сделана так (что я чувствую странно из-за отсутствия стандартного метода подгонки)

arr_1 = np.zeros((1,))
arr_2 = np.zeros((1,))
arr_3 = np.zeros((1,))
for cnt in range(epochs):
    idx = np.random.randint(0, len(labels)-1)
    arr_1[0,] = word_target[idx]
    arr_2[0,] = word_context[idx]
    arr_3[0,] = labels[idx]
    loss = model.train_on_batch([arr_1, arr_2], arr_3)
    if cnt % 100 == 0:
        print("Iteration {}, loss={}".format(cnt, loss))

Я что-то упускаю из сети? То, что не написано, реализовано в точности как ссылка выше

1 Ответ

0 голосов
/ 03 сентября 2018

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

Я реализовал учебную часть со следующей строкой

model.fit([word_target, word_context], labels, epochs=5)

Имейте в виду, что это может занять много времени в зависимости от размера корпуса. Функция train_on_batch дает вам больше контроля в обучении, и вы можете изменять размер партии или выбирать образцы, которые вы выбираете на каждом этапе обучения.

...