深度学习入门(六十)循环神经网络——门控循环单元GRU

news2024/11/25 6:53:32

深度学习入门(六十)循环神经网络——门控循环单元GRU

  • 前言
  • 循环神经网络——门控循环单元GRU
    • 课件
      • 关注一个序列
      • 候选隐状态
      • 隐状态
      • 总结
    • 教材
      • 1 门控隐状态
        • 1.1 重置门和更新门
      • 1.2 候选隐状态
        • 1.4 隐状态
      • 2 从零开始实现
        • 2.1 初始化模型参数
        • 2.2 定义模型
        • 2.3 训练与预测
      • 3 简洁实现
      • 4 小结
      • 参考文献

前言

核心内容来自博客链接1博客连接2希望大家多多支持作者
本文记录用,防止遗忘

循环神经网络——门控循环单元GRU

课件

关注一个序列

不是每个观测值都是同等重要的
在这里插入图片描述
想只记住相关的观察需要:

  • 能关注的机制(更新门)
  • 能遗忘的机制(重置门)

在这里插入图片描述

候选隐状态

在这里插入图片描述

隐状态

在这里插入图片描述

总结

R t = σ ( X t W x r + H t − 1 W h r + b r ) , Z t = σ ( X t W x z + H t − 1 W h z + b z ) , tanh ⁡ ( X t W x h + ( R t ⊙ H t − 1 ) W h h + b h ) , H t = Z t ⊙ H t − 1 + ( 1 − Z t ) ⊙ H ~ t . \begin{aligned}\begin{aligned} \mathbf{R}_t = \sigma(\mathbf{X}_t \mathbf{W}_{xr} + \mathbf{H}_{t-1} \mathbf{W}_{hr} + \mathbf{b}_r),\\ \mathbf{Z}_t = \sigma(\mathbf{X}_t \mathbf{W}_{xz} + \mathbf{H}_{t-1} \mathbf{W}_{hz} + \mathbf{b}_z),\\ \tanh(\mathbf{X}_t \mathbf{W}_{xh} + \left(\mathbf{R}_t \odot \mathbf{H}_{t-1}\right) \mathbf{W}_{hh} + \mathbf{b}_h),\\ \mathbf{H}_t = \mathbf{Z}_t \odot \mathbf{H}_{t-1} + (1 - \mathbf{Z}_t) \odot \tilde{\mathbf{H}}_t. \end{aligned}\end{aligned} Rt=σ(XtWxr+Ht1Whr+br),Zt=σ(XtWxz+Ht1Whz+bz),tanh(XtWxh+(RtHt1)Whh+bh),Ht=ZtHt1+(1Zt)H~t.

在这里插入图片描述

教材

在通过时间反向传播一节中, 我们讨论了如何在循环神经网络中计算梯度, 以及矩阵连续乘积可以导致梯度消失或梯度爆炸的问题。 下面我们简单思考一下这种梯度异常在实践中的意义:

  • 我们可能会遇到这样的情况:早期观测值对预测所有未来观测值具有非常重要的意义。 考虑一个极端情况,其中第一个观测值包含一个校验和, 目标是在序列的末尾辨别校验和是否正确。 在这种情况下,第一个词元的影响至关重要。 我们希望有某些机制能够在一个记忆元里存储重要的早期信息。 如果没有这样的机制,我们将不得不给这个观测值指定一个非常大的梯度, 因为它会影响所有后续的观测值。

  • 我们可能会遇到这样的情况:一些词元没有相关的观测值。 例如,在对网页内容进行情感分析时, 可能有一些辅助HTML代码与网页传达的情绪无关。 我们希望有一些机制来跳过隐状态表示中的此类词元。

  • 我们可能会遇到这样的情况:序列的各个部分之间存在逻辑中断。 例如,书的章节之间可能会有过渡存在, 或者证券的熊市和牛市之间可能会有过渡存在。 在这种情况下,最好有一种方法来重置我们的内部状态表示。

在学术界已经提出了许多方法来解决这类问题。 其中最早的方法是”长短期记忆”(long-short-term memory,LSTM) 。门控循环单元(gated recurrent unit,GRU)是一个稍微简化的变体,通常能够提供同等的效果, 并且计算 的速度明显更快。 由于门控循环单元更简单,我们从它开始解读。

1 门控隐状态

门控循环单元与普通的循环神经网络之间的关键区别在于: 前者支持隐状态的门控。 这意味着模型有专门的机制来确定应该何时更新隐状态, 以及应该何时重置隐状态。 这些机制是可学习的,并且能够解决了上面列出的问题。 例如,如果第一个词元非常重要, 模型将学会在第一次观测之后不更新隐状态。 同样,模型也可以学会跳过不相关的临时观测。 最后,模型还将学会在需要的时候重置隐状态。 下面我们将详细讨论各类门控。

1.1 重置门和更新门

我们首先介绍重置门(reset gate)和更新门(update gate)。 我们把它们设计成 ( 0 , 1 ) (0, 1) (0,1)区间中的向量, 这样我们就可以进行凸组合。 重置门允许我们控制“可能还想记住”的过去状态的数量; 更新门将允许我们控制新状态中有多少个是旧状态的副本。

我们从构造这些门控开始。 下图描述了门控循环单元中的重置门和更新门的输入, 输入是由当前时间步的输入和前一时间步的隐状态给出。 两个门的输出是由使用sigmoid激活函数的两个全连接层给出。
在这里插入图片描述
我们来看一下门控循环单元的数学表达。 对于给定的时间步 t t t,假设输入是一个小批量 X t ∈ R n × d \mathbf{X}_t \in \mathbb{R}^{n \times d} XtRn×d (样本个数 n n n,输入个数 d d d), 上一个时间步的隐状态是 H t − 1 ∈ R n × h \mathbf{H}_{t-1} \in \mathbb{R}^{n \times h} Ht1Rn×h (隐藏单元个数)。 那么,重置门 R t ∈ R n × h \mathbf{R}_t \in \mathbb{R}^{n \times h} RtRn×h和 更新门 Z t ∈ R n × h \mathbf{Z}_t \in \mathbb{R}^{n \times h} ZtRn×h的计算如下所示:
R t = σ ( X t W x r + H t − 1 W h r + b r ) , Z t = σ ( X t W x z + H t − 1 W h z + b z ) , \begin{split}\begin{aligned} \mathbf{R}_t = \sigma(\mathbf{X}_t \mathbf{W}_{xr} + \mathbf{H}_{t-1} \mathbf{W}_{hr} + \mathbf{b}_r),\\ \mathbf{Z}_t = \sigma(\mathbf{X}_t \mathbf{W}_{xz} + \mathbf{H}_{t-1} \mathbf{W}_{hz} + \mathbf{b}_z), \end{aligned}\end{split} Rt=σ(XtWxr+Ht1Whr+br),Zt=σ(XtWxz+Ht1Whz+bz),
其中 W x r , W x z ∈ R d × h \mathbf{W}_{xr}, \mathbf{W}_{xz} \in \mathbb{R}^{d \times h} Wxr,WxzRd×h W h r , W h z ∈ R h × h \mathbf{W}_{hr}, \mathbf{W}_{hz} \in \mathbb{R}^{h \times h} Whr,WhzRh×h是权重参数, b r , b z ∈ R 1 × h \mathbf{b}_r, \mathbf{b}_z \in \mathbb{R}^{1 \times h} br,bzR1×h 是偏置参数。 请注意,在求和过程中会触发广播机制 。 我们使用sigmoid函数将输入值转换到区间 ( 0 , 1 ) (0, 1) (0,1)

1.2 候选隐状态

接下来,让我们将重置门 R t \mathbf{R}_t Rt与RNN中 H t = ϕ ( X t W x h + H t − 1 W h h + b h ) . \mathbf{H}_t = \phi(\mathbf{X}_t \mathbf{W}_{xh} + \mathbf{H}_{t-1} \mathbf{W}_{hh} + \mathbf{b}_h). Ht=ϕ(XtWxh+Ht1Whh+bh).中的常规隐状态更新机制集成, 得到在时间步 t t t候选隐状态(candidate hidden state) H ~ t ∈ R n × h \tilde{\mathbf{H}}_t \in \mathbb{R}^{n \times h} H~tRn×h
H ~ t = tanh ⁡ ( X t W x h + ( R t ⊙ H t − 1 ) W h h + b h ) , \tilde{\mathbf{H}}_t = \tanh(\mathbf{X}_t \mathbf{W}_{xh} + \left(\mathbf{R}_t \odot \mathbf{H}_{t-1}\right) \mathbf{W}_{hh} + \mathbf{b}_h), H~t=tanh(XtWxh+(RtHt1)Whh+bh),
其中 W x h ∈ R d × h \mathbf{W}_{xh} \in \mathbb{R}^{d \times h} WxhRd×h W h h ∈ R h × h \mathbf{W}_{hh} \in \mathbb{R}^{h \times h} WhhRh×h是权重参数, b h ∈ R 1 × h \mathbf{b}_h \in \mathbb{R}^{1 \times h} bhR1×h是偏置项, 符号 ⊙ \odot 是Hadamard积(按元素乘积)运算符。 在这里,我们使用tanh非线性激活函数来确保候选隐状态中的值保持在区间 ( − 1 , 1 ) (-1, 1) (1,1)中。

H t = ϕ ( X t W x h + H t − 1 W h h + b h ) . \mathbf{H}_t = \phi(\mathbf{X}_t \mathbf{W}_{xh} + \mathbf{H}_{t-1} \mathbf{W}_{hh} + \mathbf{b}_h). Ht=ϕ(XtWxh+Ht1Whh+bh).相比,上式中的 R t \mathbf{R}_t Rt H t − 1 \mathbf{H}_{t-1} Ht1的元素相乘可以减少以往状态的影响。 每当重置门 R t \mathbf{R}_t Rt中的项接近1时, 我们恢复一个如 普通RNN中的普通的循环神经网络。 对于重置门 R t \mathbf{R}_t Rt中所有接近的项0, 候选隐状态是以 X t \mathbf{X}_t Xt作为输入的多层感知机的结果。 因此,任何预先存在的隐状态都会被**重置**为默认值。

下图说明了应用重置门之后的计算流程。
在这里插入图片描述

1.4 隐状态

上述的计算结果只是候选隐状态,我们仍然需要结合更新门 Z t \mathbf{Z}_t Zt的效果。 这一步确定新的隐状态 H t ∈ R n × h \mathbf{H}_t \in \mathbb{R}^{n \times h} HtRn×h在多大程度上来自旧的状态 H t − 1 \mathbf{H}_{t-1} Ht1和 新的候选状态 H ~ t \tilde{\mathbf{H}}_t H~t。 更新门 Z t \mathbf{Z}_t Zt仅需要在 H t − 1 \mathbf{H}_{t-1} Ht1 H ~ t \tilde{\mathbf{H}}_t H~t 之间进行按元素的凸组合就可以实现这个目标。 这就得出了门控循环单元的最终更新公式: H t = Z t ⊙ H t − 1 + ( 1 − Z t ) ⊙ H ~ t . \mathbf{H}_t = \mathbf{Z}_t \odot \mathbf{H}_{t-1} + (1 - \mathbf{Z}_t) \odot \tilde{\mathbf{H}}_t. Ht=ZtHt1+(1Zt)H~t.
每当更新门 Z t \mathbf{Z}_t Zt接近1时,模型就倾向只保留旧状态。 此时,来自 X t \mathbf{X}_t Xt的信息基本上被忽略, 从而有效地跳过了依赖链条中的时间步t。 相反,当 Z t \mathbf{Z}_t Zt接近0时, 新的隐状态 H t \mathbf{H}_t Ht就会接近候选隐状态 H ~ t \tilde{\mathbf{H}}_t H~t。 这些设计可以帮助我们处理循环神经网络中的梯度消失问题, 并更好地捕获时间步距离很长的序列的依赖关系。 例如,如果整个子序列的所有时间步的更新门都接近于1, 则无论序列的长度如何,在序列起始时间步的旧隐状态都将很容易保留并传递到序列结束。

下图说明了更新门起作用后的计算流。
在这里插入图片描述

总之,门控循环单元具有以下两个显著特征:

  • 重置门有助于捕获序列中的短期依赖关系;

  • 更新门有助于捕获序列中的长期依赖关系。

2 从零开始实现

为了更好地理解门控循环单元模型,我们从零开始实现它。 首先,我们读取中时间机器数据集:

import torch
from torch import nn
from d2l import torch as d2l

batch_size, num_steps = 32, 35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)

2.1 初始化模型参数

下一步是初始化模型参数。 我们从标准差为0.01的高斯分布中提取权重, 并将偏置项设为0,超参数num_hiddens定义隐藏单元的数量, 实例化与更新门、重置门、候选隐状态和输出层相关的所有权重和偏置。

def get_params(vocab_size, num_hiddens, device):
    num_inputs = num_outputs = vocab_size

    def normal(shape):
        return torch.randn(size=shape, device=device)*0.01

    def three():
        return (normal((num_inputs, num_hiddens)),
                normal((num_hiddens, num_hiddens)),
                torch.zeros(num_hiddens, device=device))

    W_xz, W_hz, b_z = three()  # 更新门参数
    W_xr, W_hr, b_r = three()  # 重置门参数
    W_xh, W_hh, b_h = three()  # 候选隐状态参数
    # 输出层参数
    W_hq = normal((num_hiddens, num_outputs))
    b_q = torch.zeros(num_outputs, device=device)
    # 附加梯度
    params = [W_xz, W_hz, b_z, W_xr, W_hr, b_r, W_xh, W_hh, b_h, W_hq, b_q]
    for param in params:
        param.requires_grad_(True)
    return params

2.2 定义模型

现在我们将定义隐状态的初始化函数init_gru_state。 与RNN从零实现一节中定义的init_rnn_state函数一样, 此函数返回一个形状为(批量大小,隐藏单元个数)的张量,张量的值全部为零。

def init_gru_state(batch_size, num_hiddens, device):
    return (torch.zeros((batch_size, num_hiddens), device=device), )

现在我们准备定义门控循环单元模型, 模型的架构与基本的循环神经网络单元是相同的, 只是权重更新公式更为复杂。

def gru(inputs, state, params):
    W_xz, W_hz, b_z, W_xr, W_hr, b_r, W_xh, W_hh, b_h, W_hq, b_q = params
    H, = state
    outputs = []
    for X in inputs:
        Z = torch.sigmoid((X @ W_xz) + (H @ W_hz) + b_z)
        R = torch.sigmoid((X @ W_xr) + (H @ W_hr) + b_r)
        H_tilda = torch.tanh((X @ W_xh) + ((R * H) @ W_hh) + b_h)
        H = Z * H + (1 - Z) * H_tilda
        Y = H @ W_hq + b_q
        outputs.append(Y)
    return torch.cat(outputs, dim=0), (H,)

2.3 训练与预测

训练和预测的工作方式与之前完全相同。 训练结束后,我们分别打印输出训练集的困惑度, 以及前缀“time traveler”和“traveler”的预测序列上的困惑度。

vocab_size, num_hiddens, device = len(vocab), 256, d2l.try_gpu()
num_epochs, lr = 500, 1
model = d2l.RNNModelScratch(len(vocab), num_hiddens, device, get_params,
                            init_gru_state, gru)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

输出:

perplexity 1.3, 28030.1 tokens/sec on cuda:0
time traveller wetheving of my investian of the fromaticalllesp
travellery celaner betareabreart of the three dimensions an

3 简洁实现

高级API包含了前文介绍的所有配置细节, 所以我们可以直接实例化门控循环单元模型。 这段代码的运行速度要快得多, 因为它使用的是编译好的运算符而不是Python来处理之前阐述的许多细节。

num_inputs = vocab_size
gru_layer = nn.GRU(num_inputs, num_hiddens)
model = d2l.RNNModel(gru_layer, len(vocab))
model = model.to(device)
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

输出:

perplexity 1.1, 334788.1 tokens/sec on cuda:0
time traveller with a slight accession ofcheerfulness really thi
travelleryou can show black is white by argument said filby

4 小结

  • 门控循环神经网络可以更好地捕获时间步距离很长的序列上的依赖关系。

  • 重置门有助于捕获序列中的短期依赖关系。

  • 更新门有助于捕获序列中的长期依赖关系。

  • 重置门打开时,门控循环单元包含基本循环神经网络;更新门打开时,门控循环单元可以跳过子序列。

参考文献

[1] Cho, K., Van Merriënboer, B., Bahdanau, D., & Bengio, Y. (2014). On the properties of neural machine translation: Encoder-decoder approaches. arXiv preprint arXiv:1409.1259.

[2] Chung, J., Gulcehre, C., Cho, K., & Bengio, Y. (2014). Empirical evaluation of gated recurrent neural networks on sequence modeling. arXiv preprint arXiv:1412.3555.

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

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

相关文章

前端本地存储数据库 IndexedDB 存储文件

介绍 IndexedDB 是一种底层 API,用于在客户端存储大量的结构化数据。目前各浏览器都已支持,兼容性很好。 特点 IndexedDB 是一个基于 JavaScript 的面向对象数据库,IndexedDB 允许您存储和检索用键索引的对象;可以存储结构化克隆…

MySQL8.0基础篇

文章目录一、MySQL概述1、数据库概述1.1 数据库作用1.2 数据库的相关概念2、MySQL概述2.1 概述2.2 RDBMS与非RDBMS3、MySQL环境安装3.1 MySQL的下载、安装、配置(win)3.2 MySQL登录3.3 MySQL演示使用3.4 MySQL目录结构与源码二、SQL查询1、SQL详情1.1 SQL分类1.2 SQL语言的规则…

Docker和docker-compose中部署nginx-rtmp实现流媒体服务与oob和ffmpeg推流测试

场景 Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流: Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流_霸道流氓气质的博客-CSDN博客_nginx-rtmp-win64 上面讲的是在windows中搭建nginx-rtmp,如果实在centos中使用docker或…

使用Git拉取和推送到仓库

使用Git拉取和推送到仓库 0、前置工作 首先安装和配置git ,参考: git安装教程_嘴巴嘟嘟的博客-CSDN博客_全局安装gitGit上传文件代码到GitHub(超详细)_蓝布棉的博客-CSDN博客_git上传文件到github仓库 没有仓库的情况 创建仓…

项目总结篇

注意会话管理:cookie,session的作用;(Redis等) 过滤敏感词(相关算法),事务(Spring怎么管理) Redis的数据结构适合那种情况 kafka:框架背后通用的原则,模式,生…

jsp+ssm计算机毕业设计房屋租赁管理系统【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

大数据 集群测试部分

查看HDFS集群状态 在浏览器里访问http://master:9870 不能通过主机名master加端口9870的方式,原因在于没有在hosts文件里IP与主机名的映射,现在只能通过IP地址加端口号的方式访问:http://192.168.1.101:9870 修改宿主机的C:\Windows\System…

2023年大学毕业生,我有话想对你说

虽然每年都说大学毕业生有多少多少,就业难,但貌似以往的经济寒冬,互联网寒冬都不如2022年2023年这么寒冷。 可以说,2022年一整年都是在裁员的声音中度过的,有的公司逐渐取消年终奖,原本熙熙攘攘的办公室&am…

看看欧洲国际学校的IB分数排名

大家好,今天为大家整理了欧洲的国际学校IB分数排名,信息搬运自IB分数网站。如果有偏差还请好心人出来指正。 可以看到,整个榜单瑞士的国际学校数量最多。确实,其实大部分国家的一线国际学校都是集齐在首都城市。 而瑞士的国际学校…

BFS算法-leetcode java题解

BFS算法-leetcode java题解 本文目录BFS算法-leetcode java题解BFS算法思想leetcode 111. 二叉树的最小深度leetcode 1091. 二进制矩阵中的最短路径leetcode 752. 打开转盘锁leetcode 127. 单词接龙leetcode 433. 最小基因变化leetcode 1162. 地图分析leetcode 695. 岛屿的最大…

记一次Spring4shell漏洞分析

漏洞条件 1.Tomcat war包部署 Tomcat 9.60<&#xff08;Tomcat9.61已打补丁&#xff09; 1.Web应用以war包部署到Tomcat中时使用到ParallelWebappClassLoader 2.而以jar包部署的classLoader嵌套参数被解析为org.springframework.boot.loader.LaunchedURLClassLoader&#…

OFDM系统同步技术的matlab仿真,包括符号定时同步,采样钟同步,频偏估计

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 在单载波系统中&#xff0c;载波频率的偏移只会对接收信号造成一定的幅度衰减和相位旋转&#xff0c;这可以通过均衡等方法来加以克服。而对于多载波系统来说&#xff0c;载波频率的偏移会导致子…

拖动布局的两种方式

一种是弹窗的拖动布局&#xff0c;一种是非弹窗。 代码如下&#xff1a; 非弹窗&#xff1a;这里加载了一个本地的视频 import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.view.MotionEvent; import an…

Go1.19.3 map原理简析

map简析 map是一个集数组与链表(美貌与智慧)特性于一身的数据结构&#xff0c;其增删改查时间复杂度都非常优秀&#xff0c;在很多场景下用其替代树结构。关于map的特性请自行学习。 Go语言在语言层面就支持了map&#xff0c;而非其他语言(如Java)通过外置类库的方式实现。 使…

【LSSVM回归预测】基于matlab天鹰算法优化最小二乘支持向量机AO-LSSVM数据回归预测【含Matlab源码 1848期】

⛄一、天鹰算法优化最小二乘支持向量机LSSVM简介 1 最小二乘支持向量机 最小二乘支持向量机是支持向量机的一种改进算法[9,10],它将SVM算法中的不等式约束转化为等式约束,采用最小二乘线性系统作为损失函数代替支持向量机所采用的二次规划方法,以下介绍了该方法的基本原理。 …

DSPE-PEG-DBCO磷脂聚乙二醇二苯基环辛炔简介

名称 磷脂聚乙二醇二苯基环辛炔 DSPE-PEG-DBCO 中文名称 二硬脂酰基磷脂酰乙醇胺-聚乙二醇-二苯基环辛炔 英文名称 DSPE-PEG-DBCO 溶剂 部分常规有机溶剂 存储条件 -20冷冻保存&#xff0c;惰性气体保护 保存时间 1年 PEG常规分子量 2000 3400 5000 DSPE-PEG-DBCO DSPE&a…

typescript 类型运算探讨

以函数的方式来看typescript 类型运算尖括号 <>TypeScript 类型运算符1、extends2、keyof3、infer4、in题目示例对于初接触typescript的前端开发者来说&#xff0c;我们可能会对typescript的类型运算感到很陌生和难以理解。现在想说的是&#xff0c;其实我们可以换另外一…

我国服务行业体经济尽显强大韧性 2021年全年总体保持恢复性增长态势

根据观研报告网发布的《2022年中国服务行业分析报告-行业发展监测与投资潜力分析》显示&#xff0c;所谓服务业&#xff0c;不是指商品的买卖&#xff0c;而是指通过各种不同的服务工作&#xff0c;让顾客得到满足。 服务业有传统服务业与现代服务业之分。传统服务业是指为人们…

【云原生进阶之容器】第一章Docker核心技术1.7节——Docker镜像技术剖析

1 容器镜像概述 1.1 什么是镜像 镜像就是一个可执行独立运行的软件包。包含应用运行所必须的文件和依赖包;镜像可以理解为类或者模板,只要在容器的环境下开箱即用; Docker容器与镜像的关系: 1.2 bootfs和rootfs 通常而言,Linux的操作系统由两类文件系统组成:bootfs…

一、Kubernetes基本介绍和功能架构

1、kubernetes 概述 kubernetes&#xff0c;简称 K8s&#xff0c;是用 8 代替 8 个字符“ubernete”而成的缩写。是一个开源 的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes 的目标是让部署容器化的 应用简单并且高效(powerful),Kubernetes 提…