обновления векторов документов в doc2vec (PV-DM) в gensim

Пытаюсь понять реализацию PV-DM с усреднением в gensim. В функции train_document_dm в doc2vec.py возвращаемое значение ("ошибки") train_cbow_pair в случае усреднения (cbow_mean=1) не делится на количество входных векторов (count). Согласно этому пояснению должно быть разделение по количеству документов в случае усреднения входных векторов: Объяснение обучения параметрам word2vec, уравнение (23). Вот код от train_document_dm:

l1 = np_sum(word_vectors[word2_indexes], axis=0)+np_sum(doctag_vectors[doctag_indexes], axis=0)  
count = len(word2_indexes) + len(doctag_indexes)  
if model.cbow_mean and count > 1:  
    l1 /= count  
neu1e = train_cbow_pair(model, word, word2_indexes, l1, alpha,
                                learn_vectors=False,  learn_hidden=learn_hidden)  
if not model.cbow_mean and count > 1:  
    neu1e /= count  
if learn_doctags:  
    for i in doctag_indexes:  
        doctag_vectors[i] += neu1e * doctag_locks[i]  
if learn_words:  
    for i in word2_indexes:  
        word_vectors[i] += neu1e * word_locks[i]  

person саша    schedule 31.08.2016    source источник


Ответы (1)


Допустим, V определяется как среднее значение A, B и C:

V = (A + B + C) / 3

Давайте установим A = 5, B = 6 и C = 10. И допустим, мы хотим, чтобы V равнялось 10.

Мы запускаем вычисление (прямое распространение), и значение V, среднее из трех чисел, равно 7. Таким образом, поправка, необходимая для V, равна +3.

Чтобы применить эту поправку к A, B и C, мы также должны разделить эту поправку на 3, чтобы получить +1 против каждой? В этом случае A = 6, B = 7 и C = 11 — и теперь V — это всего лишь 8. Все равно потребуется еще +2, чтобы соответствовать цели.

Итак, нет. Правильная поправка ко всем компонентам V в случае, когда V является средним, такая же, как и поправка к V — в данном случае +3. Если бы мы применили это, мы бы достигли нашего правильного целевого значения 10:

A = 8, B = 9, C = 13
V = (8 + 9 + 13) / 3 = 10

То же самое происходит с gensim обратного распространения. В случае усреднения полное корректирующее значение (умноженное на скорость обучения alpha) применяется к каждому из составляющих векторов.

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

person gojomo    schedule 19.01.2017