【补充】图神经网络前传——DeepWalk

news2024/11/27 2:46:25

论文阅读

论文:https://arxiv.org/pdf/1403.6652

参考:【论文逐句精读】DeepWalk,随机游走实现图向量嵌入,自然语言处理与图的首次融合_随机游走图嵌入-CSDN博客

abstract

DeepWalk是干什么的:在一个网络中学习顶点的潜在表示。这些潜在表示编码了容易被统计学模型的在联系向量空间中的社会关系。

DeepWalk怎么做到的:使用从截断的随机游走中获得的局部信息,通过将行走视为句子来学习潜在表征。

统计学模型->指ML

introduction

网络表示的稀疏性既是优点也是缺点。稀疏性使得设计高效的离散算法成为可能,但也使得推广统计学习变得更加困难。因此ML就需要做到可以处理稀疏性。

在这篇文章中,通过对一系列短随机游走(short random walks)进行建模来学习图顶点的社会表示(social representations)。社会表征是捕获邻居相似性和社区成员的顶点的潜在特征。这些潜在表征将社会关系编码在一个具有相对较少维度的连续向量空间中。

DeepWalk将一个图作为输入,并产生一个潜在的表示作为输出。空手道网络如图1a所示。图1b显示了我们的方法具有2个潜在维度的输出。

DeepWalk诞生背景和想要解决的问题
在DeepWalk诞生之前,往往是通过人工干预,创造的特征工程来进行图机器学习,在这种情况下面临两个问题:
(1)特征工程的好坏决定模型的好坏。并且特征工程并没有统一的标准,对于不同的数据集所需要做的特征工程是不一样的,因此图数据挖掘的模型的稳定性并不好。
(2)人工特征工程无非关注节点信息、边信息、图信息,且不论是否全部关注到,假设可以做到所有信息全部兼顾(实际上不可能)这样近乎完美的特征工程,但是节点的多模态属性信息无法得到关注。这意味着,即使是完美的特征工程,仍然只能兼顾到有限信息,数据挖掘的深度被严重限制。

DeepWalk想要通过这么一种算法,把图中每一个节点编码成一个D维向量(embedding过程),这是一个无监督学习。同时,embedding的信息包含了图中节点、连接、图结构等所有信息,用于下游监督学习任务。

为什么可以借鉴NLP里面的方法?
图数据是一种具有拓扑结构的序列数据。既然是序列数据,那么就可以用序列数据的处理方式。这里所谓的序列数据是指,图网络总是具有一定的指向性和关联性,例如从磨子桥到火车南站,就可以乘坐3号线在省体育馆转1号线,再到火车南站,也可以在四川大学西门坐8号线转。这都是具备指向关系。那么,我们把“磨子桥-省体育馆-倪家桥-桐梓林-火车南站”就看作是一个序列。当然,这个序列是不唯一的,我们可以“四川大学望江校区-倪家桥-桐梓林-火车南站”。也可以再绕大一圈,坐7号线。总之,在不限制最短路径的前提下,我们从一个点出发到另外一个点,有无数种可能性,这些可能性构成的指向网络,等价于一个NLP中的序列,并且在这个图序列中,相邻节点同样具备文本信息类似的相关性。

Embedding编码应该具有什么样的特性?
在前文已经有过类似的一句话,embedding的信息包含了图中节点、连接、图结构等所有信息,用于下游监督学习任务。 其实这个更是一个思想,具体而言,在NLP领域中,我们希望对文本信息,甚至单词的编码,除了保留他单词的信息,还应该尽可能保留他在原文中的位置信息,语法信息,语境信息,上下文信息等。因为只有这个基向量足够强大,用这个向量训练的模型解码出来才能足够强大。例如这么两句话:
Sentence1:今天天气很好,我去打篮球,结果不小心把新买的水果14摔坏了,但是没关系,我买了保险,我可以免费修手机。
Sentence2:我今天去修手机。
很显然,第一句话包含的信息更多,我们能够更加清晰的理解到这个事件的来龙去脉。对计算机而言也是一样,只有输入的信息足够完整,才能有更好的输出可靠性
放到图网络里,假设有两个节点u和v,他们在图空间的信息应该和在向量空间的信息保持一致,这就是embedding最核心的特征(假设u和v在图空间是邻接点,那么在向量空间他们也应该是距离相近的;如果八竿子打不着关系,那么在向量空间应该也是看不出太多联系)。把映射的向量放在二维空间或者更高维空间进行下游任务的设计,会比图本身更加直观,把图的问题转化成了不需要特征工程的传统机器学习或者深度学习问题。

什么是随机游走(Random Walk)
首先选择一个点,然后随机选择它的邻接节点,移动一步之后,再次选择移动后所在节点的邻接节点进行移动,重复这个过程。记录经过的节点,就构成了一个随机游走序列。
Question:为什么要随机游走?
Answer:一个网络图实际上可能是非常庞大的,通过无穷次采样的随机游走(实际上不可能无穷次),就可以”管中窥豹,可见一斑“。从无数个局部信息捕捉到整张图的信息
Random Walk的假设和Word2Vec的假设保持一致,即当前节点应该是和周围节点存在联系。所以可以构造一个Word2Vec的skip-gram问题。
                        
原文链接:【论文逐句精读】DeepWalk,随机游走实现图向量嵌入,自然语言处理与图的首次融合_随机游走图嵌入-CSDN博客

关于这里对为什么可以应用NLP的内容,个人理解就是,在NLP中,一句话说出来的顺序,或者说出来的方式,在一定程度上不影响句意,比如文言文里有倒装、通假、省略、互文等等,但是表达出来的意思是一样的,就像图中从A节点到达D节点,我们可以走不通的路径。

关于embedding编码这部分,简单回忆一下,关于语法信息,之前也提到过,比如位置编码:

11.6. Self-Attention and Positional Encoding — Dive into Deep Learning 1.0.3 documentation

语法信息的话,BERT里面提过LeeMeng - 進擊的 BERT:NLP 界的巨人之力與遷移學習拆解不同的token,可以把单词拆成单词本身+ing或者+s这样(我猜作者是这个意思)

之后关于图的描述里面,确实在后续GNN的模型中都指出要让相邻的节点更相似(似乎PageRank也有关于相似度的应用)

关于随机游走的部分,在后续的GNN中也有提到,这似乎是用到的一种采样方法,当然在PageRank中也有提及(是一种迭代计算PageRank值的方法,但是因为其需要模拟的游走太多了,没有被使用。

在引用的这篇文章中,也指出totally random walk并不是一个好方法,因为节点之间的权重是不一样的,但是DeepWalk就完全均匀随机游走了(还没看后续怎么改,但是想想应该也是类似于加一个系数,让能一定概率跳到某些点)

由于计算量的限制,这个随机游走的长度并不是无限,所以对于一个巨大的网络,虽然管中窥豹可见一斑,但这也注定了当前位置和距离非常远的位置是完全无法构成任何联系信息的,这和Word2Vec的局限性是一致的,在图神经网络GCN中,解除了距离限制,好像Transformer解除了RNN的距离限制一样,极大释放了模型的潜力,后续也会讲到。
                        
原文链接:【论文逐句精读】DeepWalk,随机游走实现图向量嵌入,自然语言处理与图的首次融合_随机游走图嵌入-CSDN博客

problem definition

我们考虑将社交网络的成员划分为一个或多个类别的问题。

G=(V,E),其中V表示网络中的成员,E表示边,E\subseteq (V\times V)(笛卡尔积?元素表示节点对?(v_i,v_j))。给定一个部分标记的社交网络G_L = (V,E,X,Y),其中属性X \in \mathbb{R}^{|V| \times S},这里的S表示的是每个属性向量的特征空间(即多少个特征),Y \in \mathbb{R}^{|V| \times | \boldsymbol{y} |}\boldsymbol{y}表示标签的集合。(X是特征)

在传统的ML classification中,我们的目标是学习一个假设H可以将元素X映射到标签集\boldsymbol{y}

在文中,可以利用关于G结构中嵌入的示例的依赖性的重要信息来实现优越的性能。在文献中,这被称为关系分类(或集体分类问题[37])。传统的关系分类方法将问题作为无向马尔可夫网络中的一个推理,然后使用迭代近似推理算法来计算给定网络结构的标签后向分布。

目标:学习X_E \in \mathbb{R}^{|V| \times d},这里d是少量的潜在维度,这些低维表示是分布的,也就是说,每一个社会现象都是由维度的一个子集来表达的,而每一个维度都对空间所表达的社会概念的一个子集有所贡献。利用这些结构特征,扩大属性空间以帮助分类决策。

learning social representations

一些背景介绍,可移步【论文逐句精读】DeepWalk,随机游走实现图向量嵌入,自然语言处理与图的首次融合_随机游走图嵌入-CSDN博客

method

与任何语言建模算法一样,唯一需要的输出是一个语料库和一个词汇表V。DeepWalk将一组短截断的随机行走视为自己的语料库,并将图顶点作为自己的词汇表(\boldsymbol{V} = V)。尽管在训练前知道V和频率分布是有好处的,但是对于hierarchical softmax方法而言是非必要的。

frequency distribution

频率分布:一种统计数据的排列方式,展示了变量值出现的频率。

Frequency Distribution: values and their frequency (how often each value occurs).

关于频率分布:

2.1: Organizing Data - Frequency Distributions - Statistics LibreTexts

Frequency Distribution | Tables, Types & Examples

Frequency Distributions – Math and Statistics Guides from UB’s Math & Statistics Center

Algorithm: Deep Walk

算法包含了两个主要步骤,第一个是一个随机游走生成器(random walk generator),第二个是更新过程(update procedure)。

其中,随机游走生成器拿到图G并均匀采样一个随机顶点v_i作为随机游走的根W_{v_i}。从最后访问的顶点的邻居中均匀采样,直到达到最大长度(t)。虽然我们将实验中随机游走的长度设置为固定值(这里更容易被理解成是随机游走的步数),但随机游走的长度不受限制(这里应该指的是路径的真实长度,因为可能跳回去)。这些行走可以有重新启动(即瞬间返回到根节点的概率),但是初步结果并没有显示使用重新启动的任何优势。

上图3-9行展示的是方法的核心。最外层的循环指定了在每个顶点开始随机游走的次数\gamma。将每次迭代视为对数据进行“传递”,并在此传递期间对每个节点进行一次采样。在每次“”传递开始的时候,我们生成一个随机的顺序来遍历顶点。这不是严格要求的,但众所周知,它可以加快随机梯度下降的收敛速度。

在内部循环中,我们遍历图的所有顶点。对于每个顶点v_i,我们生成一个随机游动|W_{v_i}| = t,然后使用它来更新(第7行)->采用SkipGram算法⬇️。

SkipGram

SkipGram是一种语言模型,它最大限度地提高句子中窗口w内出现的单词之间的共存概率

算法2在随机游走中遍历窗口w(第1-2行)内出现的所有可能的搭配。对于每个顶点,我们将每个顶点v_j映射到其当前表示向量\Phi(v_j) \in \mathbb{R}^d(见图⬇️)。给定v_j的表示,我们希望最大化它在游走(第3行)中的邻居的概率。可以使用几种分类器来学习这种后验分布。

这里的\Phi指的是对应的embedding

(这里没太读懂“maximize the probability of its neighbors in the walk”,按照前面的意思是SkipGram能够提高cooccurrence probability,但是为什么要提高呢?这里断一下去看看SkipGram)

参考:理解 Word2Vec 之 Skip-Gram 模型 - 知乎

Skip-gram Word2Vec Explained | Papers With Code

Skip-Gram Model in NLP - Scaler Topics

Word2Vec Tutorial - The Skip-Gram Model · Chris McCormick

(目前的理解是,对于选择的节点j我希望节点j能够出现在节点i的随机游走的路径中)

Hierarchical Softmax

对于给定u_k \in V,计算Pr(u_k | \Phi(v_j))并不可行。计算partition function(归一化因子)是昂贵的。如果我们将顶点分配给二叉树的叶子,那么预测问题就变成了最大化树中特定路径的概率(参见图⬇️)。

partition function-分区函数:在统计力学中的一种函数,用于表示系统的状态数或相关函数的生成函数。

如果到达顶点u_k的路径被一系列数节点定义(b_0,b_1,\cdot \cdot \cdot ,b_{\left \lceil log|V| \right \rceil}),(b_0 = root, b_{\left \lceil log|V| \right \rceil}=u_k),那么:

Pr(u_k| \Phi (v_j)) = \prod_{l=1}^{\left \lceil log|V| \right \rceil}Pr(b_l| \Phi (v_j))

Pr(b_l| \Phi (v_j))可以被分给其父节点的二分类器建模。

Optimization

随机梯度下降(SGD)

在Overview里,作者提出DeepWalk也需要和自然语言处理算法一样,构建自己的语料库和词库。这里的语料库就是随机游走生成的序列,词库就是每个节点本身。从这一点上看,其实图的Skip-Gram会更简单一点,因为词会涉及到分词,切词,例如”小明天天吃饭“,是小明还是明天,如果词库做不好,切割做不好,会非常影响模型性能;如果是英文单词,好一点的做法会切分#-ed -#ing这样的分词,但是节点都是一个一个单独的,不存在这样的问题。
                        

原文链接:

【论文逐句精读】DeepWalk,随机游走实现图向量嵌入,自然语言处理与图的首次融合-CSDN博客

示例代码,请参考:

论文|DeepWalk的算法原理、代码实现和应用说明 - 知乎

其他:

【论文笔记】DeepWalk - 知乎

【Graph Embedding】DeepWalk:算法原理,实现和应用 - 知乎

DeepWalk【图神经网络论文精读】_哔哩哔哩_bilibili

DeepWalk【图神经网络论文精读】_哔哩哔哩_bilibili

通过在图里随机游走,生成一连串随机游走的序列,每一个序列都类似一句话,序列中的每一个节点就类似word2vec中的单词,然后套用word2vec方法。word2vec中假设一句话中相邻的单词是相关的,deepwalk假设在一个随机游走中,相邻的节点是相关的。

比如图中,用v_j,即1,预测3和5,通过这种,用中心节点去预测周围节点,就可以捕获相邻的关联信息,最后迭代优化\Phi\Phi反映了相似关系

通过随机游走可以采样出来一个序列。

输入中心节点预测周围临近节点,那么我们就可以套用word2vec,把每一个节点编码成一个向量。

⬆️手动构造特征,⬇️学习特征 

把词汇表维度降到d维

⬅️原图,➡️deepwalk编码后到图

优点:

  1. 可扩展。来了一个新数据之后,即来即学,即建立一个新连接之后不需要从头训练,只需要把新增的节点和关联,让随机游走采样下来,然后在线训练
  2. 可以直接套用NLP中的语言模型,把随机游走当作是句子,把节点当作是单词
  3. 效果不错,尤其在稀疏标记的图分类任务上

在NLP中有一个现象,称为幂律分布/二八定律/长尾分布

有一些词出现的特别频繁(如:the, and, of, etc.),但是这些词比较少,而大部分的词出现的次数少(但是这些词数量多)

带入到图中,比如网络,很少部分的网站很多人访问,而大部分的网站都没人访问

关于各种分布,可以参考:从幂律分布到特征数据概率分布——12个常用概率分布_数据和特征怎么估计概率分布-CSDN博客

->服从同一分布->可以类比->可以用相同的方法

5个步骤:

  1. 先输入一个图
  2. 采样随机游走序列
  3. 用随机游走序列训练word2vec
  4. 为了解决分类个数过多的问题,加一个分层softmax(or 霍夫曼编码树)
  5. 得到每一个节点的图嵌入向量表示

首先来看random walk。每一个节点作为起始节点,产生\gamma个随机游走序列,每一个随机游走序列的最大长度是t

使用得到的随机游走序列去构造skip-gram,输入中心词的编码表示,预测周围词(输入1,预测3 5)

分层的softmax->比如一个八分类问题,分成三个分类任务,这里的每一个分类任务都是一个二分类的逻辑回归。

->复杂度从O(n)降低到O(log n)

有两套要学的参数:节点的表示 & 逻辑回归的权重

节点表示需要优化的是skip-gram的损失函数,逻辑回归是优化最大似然估计的交叉熵损失函数

同时优化

->最后得到每一个节点的向量

优缺点:

DeepWalk论文逐句精读_哔哩哔哩_bilibili

online learning指的是在线学习算法,是一个即来即训的算法,如果图中有新的节点出现or有新的连接出现(比如一个社交网络中有一个新的注册用户/一个新的好友关系的添加,不需要将全图重新训练一遍,而只要把新增的节点/关系构建新的随机游走序列,迭代地更新到原有的模型中。

隐式向量(编码后的结果)就编码了节点的邻域信息和社群信息。->一个连续、低维、稠密的空间。

在图数据结构中,每个节点之间是有关联的,这就违反了传统机器学习的独立同分布假设(比如iris数据集,每一条数据都是一朵独立的鸢尾花,但是都属于鸢尾花),但是图的话,每个节点之间是有关联的,所以不能用传统的机器学习方法(就像红楼梦四大家族一样,互相掣肘)。

deepwalk是无监督学习,与节点的label、特征均无关,只与节点在网络中的社群属性、连接结构相关。

后续的算法可以加上节点本身的信息(但是deepwalk本身不包含)

(弹幕:deepwalk不用,但下游任务用)

word2vec不需要标签,输入中心词,周围的词就是标签

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1668995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

039——解决室内不能使用GPS问题

目录 引入 GUI整改 client添加GPS分析 完善服务器网络通讯部分代码 添加GPS的BSW层 GPS操作部分代码(相当于驱动) 效果展示 项目管理操作 引入 最近在写论文加上出去玩了一圈所以停更了一段时间。上次咱们GPS有个室内用不了的问题,咱…

Ubuntu 24 换国内源及原理 (阿里源 清华源 中科大源 网易源)

备份原文件 sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak 编辑源文件 sudo gedit /etc/apt/sources.list.d/ubuntu.sources 粘贴到文本(其中一个即可): (阿里源&#xff09…

与 Apollo 共创生态:Apollo 七周年大会带我体会自动驾驶技术的发展

前言 自动驾驶技术作为当今科技领域的热门话题,吸引着无数开发者和企业的目光。而在这个风起云涌的行业中,Apollo开放平台作为自动驾驶领域的领军者之一,扮演着不可或缺的角色。七年前,当Apollo开放平台刚刚起步时,也…

C语言(指针)5

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

等保一体机能过三级等保吗?过等保无需再买安全设备如何做到?

等保一体机能过三级等保吗?过等保无需再买安全设备如何做到? 全云在线 2024-03-28 12:08 广东 尽管等保建设的标准是统一的,但由于不同行业和用户规模的差异,建设方案呈现出多样化的特点。 虽然重点行业过等保现象确实已经十分…

【35分钟掌握金融风控策略25】定额策略实战2

目录 基于收入和负债的定额策略 确定托底额度和盖帽额度 确定基础额度 基于客户风险评级确定风险系数 计算最终授信额度 确定授信有效期 基于收入和负债的定额策略 在实际生产中,客户的收入和负债数据大多无法直接获得,对于个人的收入和负债数据&…

中小型客户过等保,选择比努力重要!

国内谈网络安全,等保是绕不过去的话题。 作为国家网络安全保障的基本制度、基本策略、基本方法,等保经过十几年发展,其基本概念、相关标准已经深入人心,市面上各类成熟的等保方案让用户应接不暇,挑花了眼。 网络安全…

数据结构之排序(上)

片头 嗨,小伙伴们,大家好!我们今天来学习数据结构之排序(上),今天我们先讲一讲3个排序,分别是直接插入排序、冒泡排序以及希尔排序。 1. 排序的概念及其应用 1.1 排序的概念 排序&#xff1a…

R语言数据分析案例-股票可视化分析

一、数据整合的对象 # Loading necessary libraries library(readxl) library(dplyr)# Reading the data from Excel files data_1 <- read_excel("云南白药.xlsx") data_2 <- read_excel("冰山.xlsx")二、数据整合的代码 # Reading the data from…

Docker:docker在项目中常用的一些命令

简介   Docker 是一个开源的容器化平台&#xff0c;它允许开发者将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;并发布到任何安装了 Docker 引擎的机器上。这些容器是轻量级的&#xff0c;包含了应用程序运行所需的所有东西&#xff0c;如代码、系统库、系统工具…

“数字化叙事的革命:人工智能驱动的创意工具的崛起”

近年来&#xff0c;人工智能 (AI) 改变了我们生活的许多方面&#xff0c;数字故事讲述的世界也不例外。随着人工智能驱动的创意工具的出现&#xff0c;广告商、内容创作者和专业人士现在配备了创新的解决方案来简化他们的工作流程&#xff0c;增强他们的创意输出&#xff0c;并…

08.4.grafana自定义图形并直接数据库取值

grafana自定义图形并直接数据库取值 自定义添加油表图形 选择gauge图形&#xff0c;并且配置对应设定值&#xff0c;点击应用 如图所示&#xff0c;可以看到仪表盘上的值是zabbix上取得值 配置grafana直接数据库取值 添加mysql数据源 添加后进行配置&#xff0c;我这…

二分判定+选插冒排序+归并快速堆希尔+计数排序

二分力扣题 一&#xff1a;搜索二维矩阵 74. 搜索二维矩阵 按照题意&#xff1a;直接利用二维数组转换成一维数组进行求解 方法一&#xff1a;普通等于的二分查找 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {t…

websevere服务器从零搭建到上线(三)|IO多路复用小总结和服务器的基础框架

文章目录 epollselect和poll的优缺点epoll的原理以及优势epoll 好的网络服务器设计Reactor模型图解Reactor muduo库的Multiple Reactors模型 epoll select和poll的优缺点 1、单个进程能够监视的文件描述符的数量存在最大限制&#xff0c;通常是1024&#xff0c;当然可以更改数…

STM32快速入门(定时器之输入捕获)

STM32快速入门&#xff08;定时器之输入捕获&#xff09; 前言 本节主要讲解STM32利用通用定时器&#xff0c;在输入引脚出现指定电平跳变时&#xff0c;将CNT的值锁存到CCR寄存器当中&#xff0c;从而计算PWM波形的频率、占空比、脉冲间隔、电平持续时间等。其功能的应用有&…

免费思维13招之七:空间型思维

免费思维13招之七:空间型思维 本篇给你带来的是空间型思维。 空间型思维,具体分为内部空间型思维和外部空间型思维。 什么叫内部空间型思维呢? 内部空间型就是充分利用现有空间或资源为社会提供免费服务,积累人气,增加流量,从而带动消费。 为什么你生意不好?为什么你…

ubuntu中的docker记录(5)——如何使用阿里云的镜像加速配置docker镜像加速器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、镜像加速器介绍1. 什么是docker镜像加速器&#xff1f;2. 为什么要配置镜像加速器&#xff1f; 二、配置镜像加速器1. 注册阿里云账号2. 注册镜像容器服务3…

C++ int 学习

在C语言中 & 是取地址符号&#xff1b; 在C中有 int& 这样的&#xff0c;这里的&不是取地址符号&#xff0c;而是引用符号&#xff1b; 引用是C对C的一个补充&#xff1b; 变量的引用就是变量的别名&#xff0c;讲的通俗一点就是另外一个名字&#xff1b; a的值…

代码随想录算法训练营第二十七天| LeetCode39. 组合总和、LeetCode40.组合总和II、LeetCode131.分割回文串

#LeetCode 39. Combination Sum #LeetCode 39. 视频讲解&#xff1a;带你学透回溯算法-组合总和&#xff08;对应「leetcode」力扣题目&#xff1a;39.组合总和&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 当建立树的结构的时候&#xff0c;target 可以限制树的深…

Spring Boot 调用外部接口的几种方式

Spring Boot 调用外部接口的几种方式 在微服务架构中&#xff0c;服务间的调用是不可或缺的环节。Spring Boot 为开发者提供了多种方式来实现这一任务&#xff0c;这个文章将为你详细介绍这些方式。 一、使用RestTemplate RestTemplate是 Spring Boot 早期版本中常用的 REST 客…