BERTopic Negative probabilities in model.transform

4urapxun  于 5个月前  发布在  其他
关注(0)|答案(8)|浏览(71)

你好,Maarten。

如果我在拟合bertopic模型之后执行model.transform,我会得到负概率。此外,我已经设置了calculate_probabilities=True。不确定这是什么原因?

ncecgwcz

ncecgwcz1#

很难在没有看到实际代码的情况下做出判断。你能分享你的完整代码吗?另外,你使用的是哪个版本的BERTopic?

iugsix8n

iugsix8n2#

你好,Maarten,

我一直在遇到同样的问题。我在一个大数据集(200万段落)上训练了模型,将其分成30万个文档的块,并迭代地合并模型。我还减少了异常值。然后我使用最终模型在整个数据集上获得概率。问题是,我得到了一些严格为负数的结果。

这是代码:

umap_model = UMAP(n_neighbors=10,
                  n_components=5,
                  min_dist=0.0,
                  metric='cosine',
                  random_state=42)

hdbscan_model = HDBSCAN(min_cluster_size=150, metric='euclidean',
                        cluster_selection_method='eom',
                        prediction_data=True)

vectorizer_model = CountVectorizer(stop_words=stopwords, ngram_range=(1, 2), max_df=0.9, min_df=0.01)
ctfidf_model = ClassTfidfTransformer(reduce_frequent_words=True)

repr_1 = KeyBERTInspired(top_n_words=30, nr_samples=1000)
repr_2 = MaximalMarginalRelevance(diversity=0.4)

representation_model = [repr_1, repr_2]

doc_chunks = [docs[i:i + 350000] for i in range(0, len(docs), 350000)]
embedding_chunks = [embeddings[i:i + 350000] for i in range(0, len(embeddings), 350000)]

base_model = BERTopic(  n_gram_range=(1, 2),
  min_topic_size=500,
  embedding_model=embedding_model,
  umap_model=umap_model,
  hdbscan_model=hdbscan_model,
  vectorizer_model=vectorizer_model,
  ctfidf_model=ctfidf_model,
  representation_model=representation_model,

  # Hyperparameters
  top_n_words=10,
  low_memory=True,
  verbose=True,
  calculate_probabilities=True).fit(doc_chuncks[0], embedding_chuncks[0])

base_model.get_topic_info()

count = 1
for doc_chunk, embedding_chunk in zip(doc_chunks[1:], embedding_chunks[1:]):

    print(f'Chunk number {count} of {len(doc_chunks)-1}')
    new_model = BERTopic(

            n_gram_range=(1, 2),
            min_topic_size=1500,
            embedding_model=embedding_model,
            ctfidf_model=ctfidf_model,
            umap_model=umap_model,
            hdbscan_model=hdbscan_model,
            vectorizer_model=vectorizer_model,
            representation_model=representation_model,
            top_n_words=10,
            low_memory=True,
            verbose=True,
            calculate_probabilities=True).fit(doc_chunk, embedding_chunk)

    updated_model = BERTopic.merge_models([base_model, new_model])
    # Update the base model
    base_model = updated_model

    count+=1

topics, probabilities = base_model.transform(docs, embeddings)
new_topics = base_model.reduce_outliers(docs, topics, probabilities=probabilities, strategy="probabilities")
base_model.update_topics(docs, topics=new_topics, vectorizer_model=vectorizer_model)
topics, probabilities = base_model.transform(docs, embeddings)
base_model.get_topic_info()

print(probabilities)
array([[ 0.16342095,  0.14167159,  0.05409987, ...,  0.15006552,
         0.02297548,  0.04169825],
       [-0.07031705, -0.11765086, -0.04407407, ..., -0.09452424,
        -0.04852967, -0.05533055],
       [-0.09134781, -0.09422061, -0.04908133, ..., -0.08520483,
        -0.05293087,  0.01167258],
       ...,
       [ 0.13605224,  0.0481723 , -0.01568827, ...,  0.04319064,
        -0.07278067, -0.01057221],
       [-0.12851533, -0.27406732, -0.10445033, ..., -0.27359323,
        -0.18899802, -0.1821016 ],
       [ 0.02763645,  0.0091765 , -0.04612414, ...,  0.01253646,
        -0.05523241,  0.13492658]])
pzfprimi

pzfprimi3#

感谢您分享您的代码。一切看起来都很好。在减少离群值之前运行.transform(docs, embeddings)时,概率是否严格为正?如果是这样的话,我不确定这是否是HDBSCAN的bug或者是它本身的行为方式。

5kgi1eie

5kgi1eie4#

非常感谢您的稳定回复!
是的,在这种情况下也存在负概率。此外,当我跨列求和时,这些值看起来很奇怪,它应该是1,但这是我得到的结果(在减少离群值之前)。

print(probabilities.sum(axis=1))

array([-3.3041897,  5.7327676,  6.178049 , ...,  9.38357  , 11.760707 ,
        9.374776 ], dtype=float32)

这是否类似于 issue(尽管上下文不同)?
您如何建议处理此类问题?使用软-max是否有意义?
请告诉我您的想法。

ars1skjm

ars1skjm5#

使用软最大值可能会有价值,看看结果如何。另一个解决方案可能是将模型保存为 pytorchsafetensors ,加载它,然后运行 .transform 。它应该使用不同的方法重新计算概率,这可能会有所帮助。
另外,你使用的是哪个版本的 BERTopic?

ocebsuys

ocebsuys6#

我正在使用0.16.0版本。我已经尝试过保存和加载,但问题仍然存在(实际上,这就是我最初发现它的方式)。

2sbarzqh

2sbarzqh7#

关于概率问题,我在想是否使用概率作为异常值减少策略可能也不是理想的选择,c-TF-IDF可能会更有意义?

jjhzyzn0

jjhzyzn08#

啊,现在我明白了。结果概率是通过主题和文档嵌入之间的余弦相似度生成的,而不是通过HDBSCAN。因此,我认为结果值可能是负数,表示不相似。所以我相信你仍然可以使用离群值减少策略,没有任何问题。

相关问题