java余弦距离_使用TensorFlow实现余弦距离/欧氏距离(Euclideandistance)以及Attention矩阵的计算...

article/2025/9/18 7:13:53

最近在使用tensorflow完成句子相似度建模等任务时常常会用到各种距离的计算,而且有很多论文提出了Attention机制,所以这里就介绍一下如何使用tensorflow实现上述各种功能。

这里首先假定我们的输入是两个四维的Tensor,然后我们需要计算的是其中某个维度的距离。比如说我们的输入是batch个句子,句长是sent_len, 每个词被表示成embed_size的词向量。所以我们的输入就是一个[batch_size, sent_len, embed_size, 1]的Tensor,需要计算的就是两个句子的Attention矩阵。Aij表示句子1中第i个单词和句子2中第j个单词的距离(余弦距离,欧氏距离,L1距离等),也就是计算两个长度为embed_size的向量之间的距离。

为了方便表示和调试,我们这里使用shape为[2,3,4,1]的Tensor来表示上述句子。

1,Euclidean distance

欧氏距离很简单,以向量为例(x1, x2, x3,….,xn),(y1, y2, y3,….,yn),那么其欧氏距离的计算公式如下图所示:

fefb002c01c1d418a8bd4e7318644b3a.png

在tensorflow中如何实现呢,代码如下:

import tensorflow as tf

x3 = tf.constant([[[[1], [2], [3], [4]],

[[5], [6], [7], [8]],

[[9], [10], [11], [12]]],

[[[1], [2], [3], [4]],

[[5], [6], [7], [8]],

[[9], [10], [11], [12]]]], tf.float32)

x4 = tf.constant([[[[3], [4], [1], [2]],

[[5], [7], [8], [6]],

[[9], [12], [11], [10]]],

[[[1], [2], [3], [4]],

[[5], [6], [7], [8]],

[[9], [10], [11], [12]]]], tf.float32)

with tf.Session() as sess:

dis = sess.run(tf.square(x3-x4))

dis1 = sess.run(tf.reduce_sum(tf.square(x3-x4), 2))

euclidean = sess.run(tf.sqrt(tf.reduce_sum(tf.square(x3-x4), 2)))

print dis, dis1, euclidean

这部分代码实现的功能是:我们有x3,x4两个输入,每个有两句话,每句话有三个单词。计算的是对应单词之间的距离。下面是输出:

dis:

[[[[ 4.]

[ 4.]

[ 4.]

[ 4.]]

[[ 0.]

[ 1.]

[ 1.]

[ 4.]]

[[ 0.]

[ 4.]

[ 0.]

[ 4.]]]

[[[ 0.]

[ 0.]

[ 0.]

[ 0.]]

[[ 0.]

[ 0.]

[ 0.]

[ 0.]]

[[ 0.]

[ 0.]

[ 0.]

[ 0.]]]]

dis1:

[[[ 16.]

[ 6.]

[ 8.]]

[[ 0.]

[ 0.]

[ 0.]]]

Euclidean:

[[[ 3.99999976]

[ 2.44948959]

[ 2.82842684]]

[[ 0. ]

[ 0. ]

[ 0. ]]]

所以Euclidean距离的计算方法就是:

euclidean = tf.sqrt(tf.reduce_sum(tf.square(x3-x4), 2))

余弦距离

跟Euclidean距离相似,余弦距离也可以用来表征两个向量之间的相似度。其计算公式如下图所示:

c289ad0f86b034b3def90d5ea20c5465.png

在tensorflow中实现方法如下,这里我们仍然沿用x3,x4的定义,之写出sess.run()部分的代码:

with tf.Session() as sess:

#求模

x3_norm = tf.sqrt(tf.reduce_sum(tf.square(x3), axis=2))

x4_norm = tf.sqrt(tf.reduce_sum(tf.square(x4), axis=2))

#内积

x3_x4 = tf.reduce_sum(tf.multiply(x3, x4), axis=2)

cosin = x3_x4 / (x3_norm * x4_norm)

cosin1 = tf.divide(x3_x4, tf.multiply(x3_norm, x4_norm))

a, b, c, d, e = sess.run([x3_norm, x4_norm, x3_x4, cosin, cosin1])

print a, b, c, d, e

上述代码按照cosine的计算公式进行分步求解。最终的到了两个句子对应词之间的余弦距离。从结果会看出cosin和cosin1是一样的。结果如下所示:

x3_norm:

[[[ 5.47722483]

[ 13.19090366]

[ 21.11871338]]

[[ 5.47722483]

[ 13.19090557]

[ 21.11871147]]]

x4_norm:

[[[ 5.47722483]

[ 13.19090366]

[ 21.11871338]]

[[ 5.47722483]

[ 13.19090557]

[ 21.11871147]]]

x3_x4:

[[[ 22.]

[ 171.]

[ 442.]]

[[ 30.]

[ 174.]

[ 446.]]]

cosin:

[[[ 0.73333353]

[ 0.98275894]

[ 0.99103123]]

[[ 1.00000024]

[ 1.00000012]

[ 1.00000012]]]

cosin1:

[[[ 0.73333353]

[ 0.98275894]

[ 0.99103123]]

[[ 1.00000024]

[ 1.00000012]

[ 1.00000012]]]

Attention矩阵计算

如上面提到的那样,Attention矩阵A中的每个元素Aij表示句子1中第i个单词和句子2中第j个单词的距离。那么如何实现呢。我们先介绍一种比较简单的思路:

def input_attention(x1, x2):

#将每个句子按单词进行切分

x1_unstack = tf.unstack(x1, axis=1)

x2_unstack = tf.unstack(x2, axis=1)

D = []

for i in range(len(x1_unstack)):

d = []

for j in range(len(x2_unstack)):

#计算两个单词之间的相似度距离

dis = tf.sqrt(tf.reduce_sum(tf.square(x1_unstack[i]- x2_unstack[j]), axis=1))

d.append(dis)

D.append(d)

D1 = tf.reshape(D, [2, 3, 3])

D2 = tf.reshape(tf.transpose(D, perm=[2, 0, 1, 3]), [2,3,3])

return D1, D2

with tf.Session() as sess:

A, A1 = input_attention(x3, x4)

a, a1 = sess.run([A, A1])

print a, a1

这种方法是先将句子进行unstack,也就是“分词”。经过下面这行命令我们就得到了3个[2, 4, 1]的tensor。即3个单词

x1_unstack = tf.unstack(x1, axis=1)

所以下面这条命令之后我们就得到一个[2, 1]的tensor。在经过两个循环(3×3),我们就获得了[3, 3, 2, 1]的tensor。D是一开始我用的,当时觉得是没问题的,但是经过调试发现,他返回的结果是错误的,因为D是[3,3,2,1],2在最里面,reshape时不会被直接调到外面。结果如下所示:

dis = tf.sqrt(tf.reduce_sum(tf.square(x1_unstack[i]- x2_unstack[j]), axis=1))

A:

[[[ 4. 0. 8.36660004]

[ 8. 16.24807739 16. ]

[ 8.94427204 8. 2.44948983]]

[[ 0. 8.48528099 8. ]

[ 16.4924221 16. 8.36660004]

[ 8. 2.82842708 0. ]]]

A1:

[[[ 4. 8.36660004 16.24807739]

[ 8.94427204 2.44948983 8.48528099]

[ 16.4924221 8.36660004 2.82842708]]

[[ 0. 8. 16. ]

[ 8. 0. 8. ]

[ 16. 8. 0. ]]]

根据上面的结果,我们很明显可以看出A1才是我们想要的数据。


http://chatgpt.dhexx.cn/article/wJDCRjyJ.shtml

相关文章

点云检测--欧式聚类Euclidean Cluster

1.版本要求 版本: >PCL1.3 2.简介 欧式聚类是点云聚类的一种重要方法,利用点云中点与点之间的欧式距离进行聚类,当点与点之间的欧式距离小于设定的阈值则视为一类。欧式聚类是车辆前方障碍物检测的重要方法。 3.数据 本例中使用的点云数据&#…

Voxblox: Incremental 3D Euclidean Signed Distance Fields for On-Board MAV Planning

作者: 19届 lz 日期:2022-3-2 论文:《Voxblox: Incremental 3D Euclidean Signed Distance Fields for On-Board MA V Planning》 整个系统功能分为两部分: 将传入的传感器数据合并到 TSDF 中(第 IV 节)&…

3D点云处理:点云聚类--FEC: Fast Euclidean Clustering for Point Cloud Segmentation

文章目录 聚类结果一、论文内容1.1 Ground Surface Removal1.2 Fast Euclidean Clustering题外:欧几里得聚类Fast Euclidean ClusteringFEC利用具有点索引顺序的逐点方案的浅显理解 1.3 源码中问题说明 二、参考 聚类结果 原始代码中采用的是pcl中的搜索方式&#…

euclidean loss

个人感觉相当于L2范式开平方,也相当于针对两个向量的欧氏距离开平方 说的更直白点就是两个向量对应位置相减得到每个位置的差,然后把每个位置的差开平方再相加 前向传播cpp代码: template <typename Dtype> void EuclideanLossLayer<Dtype>::Forward_cpu(const vec…

Euclidean, Manhattan, hop-count distance 区别

欧式距离&#xff08;Euclidean Distance&#xff09; 二维空间的公式 其中&#xff0c; 为点 与点 之间的欧氏距离&#xff1b; 为点 到原点的欧氏距离。 曼哈顿距离&#xff08;Manhattan Distance &#xff09; 两点在南北方向上的距离加上在东西方向上的距离&#xff0c;…

扩展Euclidean算法求乘法逆原理详解与算法实现

【利用扩展Euclidean算法求乘法逆】 1. Equipment &#xff08;1&#xff09; operating system version &#xff1a;WIN 10 &#xff08;2&#xff09; CPU instruction set: x 64 &#xff08;3&#xff09; software &#xff1a;Visual Studio 2019 2. process Probl…

NEO4J-相似度算法04-欧几里得距离算法(euclidean)应用场景简介

说明&#xff1a;使用neo4j算法库时需引入跟neo4j数据库对应的算法库插件或自定义算法库 1.简介 欧几里德距离算法原理是计算n维坐标系中点与点之间地距离&#xff0c;如在三维坐标系中点A(p1,p2,p3),点B(q1,q2,q3),两个点之间得距离则为 &#xff1a;, 如果在n维坐标系中&…

欧几里德算法、拓展欧几里德、中国剩余定理

目录 欧几里德算法&#xff08;Euclidean algorithm&#xff09;&#xff08;辗转相除法&#xff09;拓展欧几里德算法中国剩余定理作业1&#xff1a;作业2&#xff1a; 欧几里德算法&#xff08;Euclidean algorithm&#xff09;&#xff08;辗转相除法&#xff09; 欧几里德…

logit回归模型_一文读懂条件Logistic回归

在医学研究中,为了控制一些重要的混杂因素,经常会把病例和对照按年龄,性别等条件进行配对,形成多个匹配组。各匹配组的病例数和对照人数是任意的,比如一个病例和若干个对照匹配即1:1,在医学上称作“1:1病历对照研究”,常见还有1:M(M <=3),即1个病例和1或2或3个对照…

目标检测-定位蒸馏:logit蒸馏与feature蒸馏之争

定位蒸馏 &#xff08;LD, CVPR 2022&#xff09; 先上我们文章和代码&#xff1a; 论文标题&#xff1a; Localization Distillation for Dense Object Detection 论文地址&#xff1a; https://arxiv.org/abs/2102.12252 代码地址1&#xff1a; https://github.com/HikariTJU…

biogeme-nest_logit-cnblog

biogeme-nest_logit 基础数据&#xff1a; optima.dat 变量的描述&#xff1a;出处 OccupStat&#xff1a;职业TimePT&#xff1a;公共交通通行时间TimeCar&#xff1a;小汽车通行时间MarginalCostPT&#xff1a;公共交通总成本CostCarCHF&#xff1a;小汽车的总汽油成本dis…

必看 logit回归分析步骤汇总

Logit回归分析用于研究X对Y的影响&#xff0c;并且对X的数据类型没有要求&#xff0c;X可以为定类数据&#xff08;可以做虚拟变量设置&#xff09;&#xff0c;也可以为定量数据&#xff0c;但要求Y必须为定类数据&#xff0c;并且根据Y的选项数&#xff0c;使用相应的数据分析…

PyTorch logit函数

1.PyTorch vs TensorFlow tensorflow是静态图&#xff0c;需要你把啥都准备好&#xff0c;然后它像个傻子一样执行&#xff0c;tensorflow&#xff0c;目前业界更适合部署&#xff0c;毕竟是静态图&#xff0c;infer的时候速度快。 pytorch&#xff0c;它会在执行的时候&…

logit回归模型_详解 Logit/Probit 模型中的 completely determined 问题

NEW!连享会推文专辑:Stata资源 | 数据处理 | Stata绘图 | Stata程序结果输出 | 回归分析 | 时间序列 | 面板数据 | 离散数据交乘调节 | DID | RDD | 因果推断 | SFA-TFP-DEA文本分析+爬虫 | 空间计量 | 学术论文 | 软件工具 连享会学习群-常见问题解答汇总:👉 WD 主页…

Logit Adjust

Logit Adjust BER 我们在分类问题中常用的误分类函数使得分类器最终学到的分布&#xff1a; P ( y ∣ x ) ∝ P ( y ) P ( x ∣ y ) P(y|x) \propto P(y)P(x|y) P(y∣x)∝P(y)P(x∣y) 假设在一个不平衡猫狗二分类问题中&#xff0c;狗是一个小类&#xff0c;只有整个数据集的…

logit

1.为什么需要logit回归? 线性回归不稳健 异常点对拟合直线的影响很大 so linear不适合做分类问题 2.为什么要sigmoid&#xff1f;sigmoid能做什么&#xff1f; y0&#xff0c;1是离散问题,直接建立方程 函数不连续——损失函数不可导——参数无法用梯度法优化 所以我们由 …

Logit 是怎么算的?

从知乎借几张图来描述&#xff0c;先看看odds 是什么&#xff1f; 然后Logit 就 是 Log of odds&#xff1a;

【计算机网络学习笔记】(汇总目录)

计算机网络学习笔记&#xff08;汇总目录&#xff09; 文章目录 点击以下标题&#xff0c;跳转到对应章节的详细讲解 【计算机网络学习笔记01】计算机网络概述&#xff08;上&#xff09; 【计算机网络学习笔记02】计算机网络概述&#xff08;中&#xff09; 【计算机网络学习…

计算机网络期末总结复习(全)

文章目录 第一章:概述1.1、计算机网络在信息时代的作用我国互联网发展状况1.2、因特网概述1、网络、互连网(互联网)和因特网2、因特网发展的三个阶段3、因特网的标准化工作4、因特网的组成补充:1.3 三种交换方式1、电路交换(Circuit Switching)2、分组交换(Packet Switc…

计算机网络的应用领域有那些,计算机网络应用领域

描述 计算机网络应用领域 一、计算机网络在现代企业中的应用 计算机网络的发展和应用改变了传统企业的管理模式和经营模式。在现代企业中企业信息网络得到了广泛的应用。它是一种专门用于企业内部信息管理的计算机网络,覆盖企业生产经营管理的各个部门,在整个企业范围内提供硬…