在执行零样本学习时,以下概率为空:
topics, probs = topic_model.fit_transform(docs, embeddings)
以下配置:
from umap import UMAP
umap_model = UMAP(n_neighbors=15, n_components=5, min_dist=0.0, metric='cosine', random_state=42)
from hdbscan import HDBSCAN
hdbscan_model = HDBSCAN(min_cluster_size=200, metric='euclidean', cluster_selection_method='eom', prediction_data=True)
from sklearn.feature_extraction.text import CountVectorizer
vectorizer_model = CountVectorizer(stop_words="english")
零样本主题列表=["vitiligo"]
embedding模型名称="thenlper/gte-base"
embedding_model = SentenceTransformer(embedding模型名称)
embeddings = embedding_model.encode(docs, show_progress_bar=True)
topic_model = BERTopic(
Pipeline models
embedding_model=embedding_model,
umap_model=umap_model,
hdbscan_model=hdbscan_model,
vectorizer_model = CountVectorizer(stop_words="english")
zeroshot_topic_list=zero_shot_topics_list,
zeroshot_min_similarity=.8,
calculate_probabilities=True,
representation_model=representation_model,
Hyperparameters
top_n_words=10,
verbose=True
)
topics, probs = topic_model.fit_transform(docs, embeddings)
8条答案
按热度按时间brccelvz1#
这是正确的。概率不是用零样本主题建模计算的。相反,你需要运行
.transform
来获得概率,考虑到你已经预先计算了嵌入,这应该是快速的。vmpqdwk32#
当预测相似度为80%时,执行转换(具有更高概率)时的概率尺度不同。我想要调查一下这个问题。有什么建议吗?
我还发现,所选的概率与显示的主题不一致。例如:
topics[0] => 0
topics=> array([ 0, 0, 0, 1, 16, 2, 9, 2, 0, 2, 4, 2, 32, 24, 11, 29, 1,
5, 17, 7, 0, 5, 5, 11, 0, 16, 40, 0, 0, 1, 1, 0, 1, 3,
1, 1, 0, 0, 1, 1, 9, 28, 23, 1, 17, 0, 0, 0, 0, 0, 1,
14, 14, 2, 26, 0, 1, 34, 6, 1, 19, 1, 1, 0, 15, 1, 29, 16,
0, 16, 7, 0, 26, 10, 0, 2, 3, 0, 2, 37, 1, 42, 0, 1, 2,
0, 14, 1, 17, 11, 0, 0, 0, 7, 2, 7, 42, 0, 2, 1])
np.argmax(probs[0]) =>
probs[0] => array([0.8559377 , 0.86592937, 0.82342434, ...], dtype=float32)
在查看fit_transform的输出时看起来不错。
hec6srdp3#
当预测相似度为80%时,执行转换(概率更高)时,概率在不同的尺度上。我想开始调查这个问题。有什么建议吗?
如果你加载并保存模型,那么你应该使用
pickle
来确保使用相同的底层模型。请注意,.transform
仍然是一个近似值,因为 HDBSCAN 的训练过程中不创建概率。它只是分配后的一步来创建近似值。因此,只要你使用 HDBSCAN,它们可能不会完美地适应预测。63lcw9qa4#
@MaartenGr,
根据bertopic
0.16.2
,似乎在零样本情况下返回的概率实际上是余弦相似度,而不是真正的概率。这可以从上面amitca71的例子中看出,所有的"概率"值都接近0.8,而"概率"之和为36.9。这个方法的工作原理如下:
_combine_zeroshot_topics
方法_combine_zeroshot_topics
方法将self.hdbscan_model
设置为一个BaseCluster
self.hdbscan_model
是否是一个BaseCluster
,如果是这种情况,我们将概率设置为余弦相似度矩阵。你能确认这确实是预期的行为吗?还是我做错了什么?
dtcbnfnu5#
从bertopic 0.16.2版本开始,似乎在零样本情况下返回的概率实际上是余弦相似度,而不是真正的概率。我不确定,但这种行为不是从0.16.2版本开始就有的,而是一直存在。检查0.16.0版本的源代码,这种情况一直如此。或者你在不同版本之间看到了不同的行为吗?
这可以在@amitca71上面的示例中看到,其中所有的"概率"值都接近0.8,"概率"之和为36.9。我相信那个示例不是0.16.2版本,因为该版本是在这篇帖子发布之后发布的。
你能确认这确实是预期的行为吗?还是说我做错了什么?
确实如此。由于生成底层主题有两个不同的过程,因此它们的概率不能合并(因为它们在分布、所代表的内容等方面有所不同)。相反,使用余弦相似度来代理概率在这两个不同的过程中被很好地推广了,因为它不依赖于底层的训练过程,而聚类模型则依赖于此。
真实的概率。
如果你使用的是HDBSCAN,那么它生成的概率是近似值,而不是底层训练过程的一部分。所以无论你使用HDBSCAN还是余弦相似度,它们都是近似/代理。
l0oc07j26#
感谢您的回复@MaartenGr。这种行为确实不仅仅局限于0.16.2版本。我猜想我可能做错了什么,希望能够从一个使用零样本主题列表训练的模型中得到概率。
我明白HDBSCAN预测和预测概率都是近似值,就像所有机器学习模型一样。
然而,我不同意将余弦相似度视为概率的观点,因为它们缺乏作为概率的基本属性:它们的和不等于1(我认为可以通过将所有值除以它们的和来轻松修复这个问题),并且它们的校准也不正确(即它们的值并不代表给定样本属于某个主题的相对频率)。这在@amitca71的例子中非常明显,其中所有45个主题的归一化余弦相似度在2.1%到2.3%之间。
我在想,我们是否可以先使用零样本主题列表生成标签,然后使用监督主题模型(基于标签训练)计算主题概率。对此有什么想法吗?
lxkprmvk7#
感谢你的回复@MaartenGr。这种行为确实不仅限于0.16.2版本。我猜想我可能做错了什么,希望能够从一个零样本主题列表训练的模型中得到概率。
谢谢你的分享!那么我知道这种行为仍然是预期中的。
我理解HDBSCAN预测和预测概率是近似值,就像所有机器学习模型一样。
抱歉,这不是我的意思。通常情况下,机器学习模型的底层概率是拟合和分配过程的一部分。这意味着生成的概率直接与训练过程有关。这在HDBSCAN中不是这样,它在创建集群和相应的分配之后生成概率。因此,这些概率是底层训练过程的代理,因此与使用余弦相似度的过程相同。两者都是后验过程,试图模仿概率/相似度/分配。因此,这两种情况下的输出概率都不是训练过程的一部分,而是一种近似值,而不是本身就具有概率属性的概率。
然而,我不同意余弦相似度可以被视为概率的观点,因为它们缺乏基本的属性:它们不等于1(我认为可以通过将所有值除以它们的和来轻松修复)并且它们的值没有正确校准(即它们的值不代表给定样本属于某个主题的相对频率)。这在@amitca71的例子中非常明显,其中所有45个主题的归一化余弦相似度在2.1%到2.3%之间。
正如你提到的,余弦相似度本身为概率提供了额外的处理方式,用户可以通过这种方式进行处理。例如,应用你提到的softmax方法,或者甚至HDBSCAN中部分软聚类方法。
我在想我们是否可以先使用零样本主题列表生成标签,然后使用监督主题模型(基于标签训练)计算主题概率。对此有什么想法吗?
这是完全可能的,我相信supervised BERTopic中大部分已经实现了这一点。如果你只对分布感兴趣,还有
.approximate_distribution
的方法可供选择。hgc7kmma8#
感谢MaartenGr的澄清,这很有帮助。