利用基于对比学习的半监督聚类算法进行意图挖掘 《Semi-Supervised Clustering with Contrastive Learning for Discovering New Intents》

论文地址:https://arxiv.org/pdf/2201.07604.pdf

相关博客:
【自然语言处理】【聚类】基于神经网络的聚类算法DEC
【自然语言处理】【聚类】基于对比学习的聚类算法SCCL
【自然语言处理】【聚类】DCSC:利用基于对比学习的半监督聚类算法进行意图挖掘
【自然语言处理】【聚类】DeepAligned:使用深度对齐聚类发现新意图
【自然语言处理】【聚类】CDAC+:通过深度自适应聚类发现新意图
【计算机视觉】【聚类】DeepCluster:用于视觉特征无监督学习的深度聚类算法
【计算机视觉】【聚类】SwAV:基于对比簇分配的无监督视觉特征学习
【计算机视觉】【聚类】CC:对比聚类
【计算机视觉】【聚类】SeLa:同时进行聚类和表示学习的自标注算法
【自然语言处理】【聚类】ECIC:通过迭代分类增强短文本聚类
【自然语言处理】【聚类】TELL:可解释神经聚类

一、简介

1. 意图挖掘

​ 任务导向的对话系统依赖于自然语言理解(NLU\text{NLU}NLU),用于将对话分类到一个已知的意图,并利用预先准备好的答案进行回复。如果能够尽可能的发现新意图,那么聊天机器人就能够回答更多种类的问,从而改善用户体验。通常会使用聚类算法将意图相同的样本聚在同一个簇中,每个簇可以看作是一个意图。此外,聚类的准确率对于意图识别模型也很重要,因为聚类后的样本会被用于训练分类模型。因此,一个好的聊天机器人不仅依赖NLU\text{NLU}NLU能力,还依赖聚类这种前期准备的工作。

2. 聚类

​ 意图挖掘这个领域有很多的工作被提出。早期主要是聚焦在无监督聚类算法,基础的方法是合并一个编码器模型和聚类模型。一般来说,特征抽取编码器使用BERT\text{BERT}BERT及SBERT\text{SBERT}SBERT这样的语言模型,聚类模型则使用K-Mean++\text{K-Mean++}K-Mean++和HDBSCAN\text{HDBSCAN}HDBSCAN等机器学习方法。但是,这种分离编码步骤和聚类步骤的方法,并不能通过聚类损失函数来优化编码器的向量表示。为了解决这个问题,早期的一些工作使用基于深度学习的距离方法,例如DEC\text{DEC}DEC和DCN\text{DCN}DCN。这些方法将向量表示和无监督聚类合并至同一优化过程,并改善了最终的效果。近期,一些研究尝试引入对比学习损失函数来进一步改善效果。模型DeepCluster\text{DeepCluster}DeepCluster和SwAV\text{SwAV}SwAV通过使用对比学习和基于深度学习的聚类极大的改善了下游任务的图像表示。模型SCCL\text{SCCL}SCCL则使用对比学习改善DEC\text{DEC}DEC,在无监督文本聚类任务上取得了相当好的效果。

  • 半监督聚类

    一般来说,在真实场景中存在着少量已知意图的样本可以使用,但是还存在着大量的无标注语料等待着被分类到已知或者未知的意图。无监督聚类方法无法从这些标注数据中获益从而指定聚类过程,因此近期的研究尝试使用半监督模型来利用这些有限的监督信息。模型CDAC+\text{CDAC+}CDAC+使用成对相似标注样本来指定聚类过程;DeepAligned\text{DeepAligned}DeepAligned则通过标注样本先训练一个效果更好的编码器,然后使用K-Mean\text{K-Mean}K-Mean产生的伪标签来迭代训练这个编码器。

3. 模型DCSC\text{DCSC}DCSC

​ 总体来说,存在两个途径来改善聚类。

  • 利用标注好的意图样本来更好的初始化文本向量表示;
  • 构建一个联合优化向量表示和聚类的模型;

​ 论文提出了基于深度对比的半监督聚类算法DCSC\text{DCSC}DCSC,该算法使用BERT\text{BERT}BERT作为主干网络,并通过两阶段任务来训练。第一阶段,DCSC\text{DCSC}DCSC使用交叉熵和监督对比学习来利用标注样本,并利用无监督对比损失来利用未标注样本。第二阶段,我们通过分类器构建伪标签,然后使用交叉熵和监督对比损失函数来在真实标签和伪标签上进行训练。

​ 此外,论文在公开数据集Clinc\text{Clinc}Clinc和Banking\text{Banking}Banking上进行了实验,且实验设置与DeepAligned\text{DeepAligned}DeepAligned保持一致。此外,论文使用Accuarcy(ACC)\text{Accuarcy(ACC)}Accuarcy(ACC)、Adjusted Rand Index(ARI)\text{Adjusted Rand Index(ARI)}Adjusted Rand Index(ARI)、Normalized Mutual Infomation(NMI)\text{Normalized Mutual Infomation(NMI)}Normalized Mutual Infomation(NMI)作为评估指标。

二、相关工作

1. 对比学习

​ 对比学习从不同的视角对样本进行增强,然后令模型区分相同样本的不同视角下的增强。例如SimCLR\text{SimCLR}SimCLR通过对比学习在下游任务中实现了很好的效果。SimCSE\text{SimCSE}SimCSE则使用简单有效的方法实现了NLP\text{NLP}NLP任务的数据增强,并在语义相似度任务上实现了非常好的效果。此外,对比学习被扩展至监督任务上,在嵌入空间中将相同类别的样本拉近,将不同类别的样本拉远。

2. 深度聚类

​ 使用深度网络联合优化向量表格和聚类,可以使向量表示更加适合聚类空间。DEC\text{DEC}DEC这样的早期工具,使用神经网络替换K-Means\text{K-Means}K-Means,然后迭代优化神经网络。但是,这种方法可能会导致平凡解,即大多数的实例可能被分配至同一个簇。SwAV\text{SwAV}SwAV则将聚类问题转换为运输问题,然后使用Sinkhorn-Knopp\text{Sinkhorn-Knopp}Sinkhorn-Knopp算法来产生软、伪分配。

3. 半监督聚类

​ 一些研究尝试利用半监督聚类算法进行意图发现。DeepAligned\text{DeepAligned}DeepAligned提出了两阶段训练策略,骨干网络使用分类标签获取更好的向量表示,然后通过K-Mean\text{K-Mean}K-Mean产生的伪标签训练分类模型。

三、方法

​ DCSC\text{DCSC}DCSC的目标是从原始语料中发现新意图,主要包括两个阶段:warm up阶段和聚类阶段。

1. Warm Up阶段

​ DCSC\text{DCSC}DCSC的主干网络是语言模型,其使用语言模型的隐藏层输出,然后使用mean pooling聚合出维度为DDD的文本向量表示,并使用全连接层获取最终的向量表示。在数据增强阶段,使用SimCSE\text{SimCSE}SimCSE相同的策略,也就是使样本输入具有dropout骨干网络来获得2个不同视角的样本。给定一个batch的样本X={x1,x2,…,xN}X=\{x_1,x_2,\dots,x_N\}X={x1​,x2​,…,xN​},然后通过骨干网络得到的两个不同视角的输出为Z={z1,z2,…,zN}Z=\{z_1,z_2,\dots,z_N\}Z={z1​,z2​,…,zN​}和Z′={zN+1,zN+2,…,z2N}Z'=\{z_{N+1},z_{N+2},\dots,z_{2N}\}Z′={zN+1​,zN+2​,…,z2N​},其中索引I={1,2,…,2N}I=\{1,2,\dots,2N\}I={1,2,…,2N}。

​ 对于那些有标注样本,其具有标注Y={y1,y2,…,yN}Y=\{y_1,y_2,\dots,y_N\}Y={y1​,y2​,…,yN​}。DCSC\text{DCSC}DCSC会计算交叉熵损失函数Lcewarmup\mathcal{L}_{ce}^{warmup}Lcewarmup​:
Lcewarmup=−1N∑i=1Nlogexp(wyi⋅zi)∑j=1Kexp(wj⋅zi)\mathcal{L}_{ce}^{warmup}=-\frac{1}{N}\sum_{i=1}^Nlog\;\frac{\text{exp}(w_{y_i}\cdot z_i)}{\sum_{j=1}^K\text{exp}(w_j\cdot z_i)} Lcewarmup​=−N1​i=1∑N​log∑j=1K​exp(wj​⋅zi​)exp(wyi​​⋅zi​)​
其中,KKK是已知意图的数量,W={w1,w2,…,wn}W=\{w_1,w_2,\dots,w_n\}W={w1​,w2​,…,wn​}形状为(K,D)(K,D)(K,D)的分类器权重。这个warm up 步骤类似于DeepAligned\text{DeepAligned}DeepAligned,但是作者认为这种分类任务并不能为聚类产生理想的向量表示。为此,本文添加了另一个监督对比学习损失函数,用于调整同一类别和不同类别样本间的距离。监督对比损失函数为
Lscwarmup=∑i=12N−1∣P(i)∣∑p∈P(i)logexp(zi⋅zp/τ)∑j∈A(i)exp(zi⋅zj/τ)\mathcal{L}_{sc}^{warmup}=\sum_{i=1}^{2N}\frac{-1}{|P(i)|}\sum_{p\in P(i)}\text{log}\;\frac{\text{exp}(z_i\cdot z_p/\tau)}{\sum_{j\in A(i)}\text{exp}(z_i\cdot z_j/\tau)} Lscwarmup​=i=1∑2N​∣P(i)∣−1​p∈P(i)∑​log∑j∈A(i)​exp(zi​⋅zj​/τ)exp(zi​⋅zp​/τ)​
其中,A(i)≡I∖{i},P(i)≡{p∈A(i):y~p=y~i}A(i)\equiv I\setminus \{i\},P(i)\equiv\{p\in A(i):\tilde{y}_p=\tilde{y}_i\}A(i)≡I∖{i},P(i)≡{p∈A(i):y~​p​=y~​i​},且τ∈R+\tau\in\mathcal{R}^+τ∈R+。因此,最终的有监督损失函数Lsupwarmup\mathcal{L}_{sup}^{warmup}Lsupwarmup​:
Lsupwarmup=Lcewarmup+Lscwarmup\mathcal{L}_{sup}^{warmup}=\mathcal{L}_{ce}^{warmup}+\mathcal{L}_{sc}^{warmup} Lsupwarmup​=Lcewarmup​+Lscwarmup​
此外,DCSC\text{DCSC}DCSC会在所有的样本上应用传统的对比损失函数,从而进一步改进骨干网络的初始化表示。无监督对比损失函数Lunsupwarmup\mathcal{L}_{unsup}^{warmup}Lunsupwarmup​:
Lunsupwarmup=−∑i=12Nlogexp(zi⋅zm(i)/τ)∑j∈A(i)exp(zi⋅zj)/τ\mathcal{L}_{unsup}^{warmup}=-\sum_{i=1}^{2N}\text{log}\;\frac{exp(z_i\cdot z_{m(i)}/\tau)}{\sum_{j\in A(i)}exp(z_i\cdot z_j)/\tau} Lunsupwarmup​=−i=1∑2N​log∑j∈A(i)​exp(zi​⋅zj​)/τexp(zi​⋅zm(i)​/τ)​
其中,zm(i)z_{m(i)}zm(i)​是实体ziz_izi​另一个视角的增强样本。在warm up阶段,交替进行有监督和无监督训练。

2. 聚类Stage

​ warm up阶段后,使用训练好的骨干网络为所有实例抽取向量表示,并在向量表示上应用K-Mean++\text{K-Mean++}K-Mean++来获取簇中心C′C'C′,其中C′C'C′的形状为(G,D)(G,D)(G,D),GGG是真实意图的数量。然后,使用Hungarian\text{Hungarian}Hungarian算法来完成WWW和C′C'C′进行对齐,WWW包含了已知意图的向量表示(K<GK<GK<G),C′C'C′是所有的真实意图向量表示。经过对齐后得到C={c1,c2,…,cK}C=\{c_1,c_2,\dots,c_K\}C={c1​,c2​,…,cK​},其索引顺序同WWW。简单起见,对C′C'C′进行重新排序C′={c1,c2,…,cK,cK+1,…,CG}C'=\{c_1,c_2,\dots,c_K,c_{K+1},\dots,C_G\}C′={c1​,c2​,…,cK​,cK+1​,…,CG​}。

​ 同warm up阶段一样,聚类阶段也会输出一个batch的数据来获取成对输入Z={z1,z2,…,zN}Z=\{z_1,z_2,\dots,z_N\}Z={z1​,z2​,…,zN​}和Z′={zN+1,zN+2,…,z2N}Z'=\{z_{N+1},z_{N+2},\dots,z_{2N}\}Z′={zN+1​,zN+2​,…,z2N​}。

​ 论文参考SwAV\text{SwAV}SwAV的自监督聚类算法。具体来说,使用聚类头对ZZZ和Z′Z'Z′进行预测并得到logit\text{logit}logit,即Q={q1,q2,…,qN}Q=\{q_1,q_2,\dots,q_N\}Q={q1​,q2​,…,qN​}和Q′={qN+1,qN+2,…,q2N}Q'=\{q_{N+1},q_{N+2},\dots,q_{2N}\}Q′={qN+1​,qN+2​,…,q2N​}
qij=cj⋅zi,∀i∈{1,…,2N},j∈{1,…,G}q_{ij}=c_j\cdot z_i,\forall i\in\{1,\dots,2N\},j\in\{1,\dots,G\} qij​=cj​⋅zi​,∀i∈{1,…,2N},j∈{1,…,G}
即qijq_{ij}qij​表示样本ziz_izi​与簇中心cjc_jcj​的相似度。

​ 然后使用Sinkhorn-Knopp\text{Sinkhorn-Knopp}Sinkhorn-Knopp为QQQ和Q′Q'Q′生成软伪簇分配,称为A={a1,a2,…,aN}A=\{a_1,a_2,\dots,a_N\}A={a1​,a2​,…,aN​}和A′=aN+1,aN+2,…,a2NA'={a_{N+1},a_{N+2},\dots,a_{2N}}A′=aN+1​,aN+2​,…,a2N​,形状为(N,G)(N,G)(N,G)。此外,还会使用argmax\text{argmax}argmax获取硬分配B={b1,b2,…,bN}B=\{b_1,b_2,\dots,b_N\}B={b1​,b2​,…,bN​}和B′={bN+1,bN+2,…,b2N}B'=\{b_{N+1},b_{N+2},\dots,b_{2N}\}B′={bN+1​,bN+2​,…,b2N​},形状为NNN。Sinkhorn-Knopp\text{Sinkhorn-Knopp}Sinkhorn-Knopp会为每个实体设置一个软分配的分数,其分配是不仅考虑本身的logit\text{logit}logit,也会考虑同一batch中其他的logit\text{logit}logit,从而计算出所有意图的最优分布并避免平凡解。基于软伪分配,计算交叉熵损失函数Lsinkhorncluster\mathcal{L}_{sinkhorn}^{cluster}Lsinkhorncluster​:
Lleftcluster=−1N∑i=1N∑j=1G(a(i+N)j⋅logexp(qij)∑r=1Gexp(qir))Lrightcluster=−1N∑i=N+12N∑j=1G(a(i−N)j⋅logexp(qij)∑r=1Gexp(qir))Lsinkhorncluster=(Lleftcluster+Lrightcluster)/2\mathcal{L}_{left}^{cluster}=-\frac{1}{N}\sum_{i=1}^N\sum_{j=1}^G\Big(a_{(i+N)j}\cdot log\;\frac{exp(q_{ij})}{\sum_{r=1}^G exp(q_{ir})}\Big) \\ \mathcal{L}_{right}^{cluster}=-\frac{1}{N}\sum_{i=N+1}^{2N}\sum_{j=1}^G\Big(a_{(i-N)j}\cdot log\;\frac{exp(q_{ij})}{\sum_{r=1}^G exp(q_{ir})}\Big) \\ \mathcal{L}_{sinkhorn}^{cluster}=(\mathcal{L}_{left}^{cluster}+\mathcal{L}_{right}^{cluster})/2 Lleftcluster​=−N1​i=1∑N​j=1∑G​(a(i+N)j​⋅log∑r=1G​exp(qir​)exp(qij​)​)Lrightcluster​=−N1​i=N+1∑2N​j=1∑G​(a(i−N)j​⋅log∑r=1G​exp(qir​)exp(qij​)​)Lsinkhorncluster​=(Lleftcluster​+Lrightcluster​)/2
其中,c∈C′c\in C'c∈C′。

​ 此外,为了使向量表示空间中相同簇样本更加接近,从而获得更好的聚类表现。论文也根据产生的伪标签BBB和B′B'B′,添加了监督对比损失函数Lpseudocluster\mathcal{L}_{pseudo}^{cluster}Lpseudocluster​:
Lpseudocluster=∑i=12N−1∣H(i)∣∑h∈H(i)log⁡exp(zi⋅zp/τ)∑j∈A(i)exp(zi⋅zj/τ)\mathcal{L}_{pseudo}^{cluster}=\sum_{i=1}^{2N}\frac{-1}{|H(i)|}\sum_{h\in H(i)}\log\;\frac{exp(z_i\cdot z_p/\tau)}{\sum_{j\in A(i)}exp(z_i\cdot z_j/\tau)} Lpseudocluster​=i=1∑2N​∣H(i)∣−1​h∈H(i)∑​log∑j∈A(i)​exp(zi​⋅zj​/τ)exp(zi​⋅zp​/τ)​
其中,H(i)≡{h∈A(i):b~p=b~i}H(i)\equiv \Big\{h\in A(i):\tilde{b}_p=\tilde{b}_i\Big\}H(i)≡{h∈A(i):b~p​=b~i​}。这样,深度聚类的最终损失函数为
Lmaincluster=Lsinkhorncluster+Lpseudocluster\mathcal{L}_{main}^{cluster}=\mathcal{L}_{sinkhorn}^{cluster}+\mathcal{L}_{pseudo}^{cluster} Lmaincluster​=Lsinkhorncluster​+Lpseudocluster​

  • 知识遗忘

    在上面的聚类阶段,在几个epoch后已知意图分类的准确率会下降,似乎是模型遗忘了warm up阶段学习到的信息,这可能导致聚类效果变差。为了保持在已知意图上的分类准确率,我们让模型继续在标注样本上进行训练。此外,为了让标注样本更好的指导聚类过程,令分类层和聚类层共享相同的参数CCC。监督损失函数为
    Lcecluster=−1N∑i=1Nlogexp(cyi⋅zi)∑j=1Kexp(cj⋅zi),∀c∈CLsccluster=∑i=12N−1∣P(i)∣∑p∈P(i)logexp(zi⋅zp/τ)∑j∈A(i)exp(zi⋅zj/τ)Lsupcluster=Lcecluster+Lsccluster\mathcal{L}_{ce}^{cluster}=-\frac{1}{N}\sum_{i=1}^Nlog\;\frac{exp(c_{y_i}\cdot z_i)}{\sum_{j=1}^K exp(c_j\cdot z_i)},\forall c\in C \\ \mathcal{L}_{sc}^{cluster}=\sum_{i=1}^{2N}\frac{-1}{|P(i)|}\sum_{p\in P(i)}\text{log}\;\frac{\text{exp}(z_i\cdot z_p/\tau)}{\sum_{j\in A(i)}\text{exp}(z_i\cdot z_j/\tau)} \\ \mathcal{L}_{sup}^{cluster}=\mathcal{L}_{ce}^{cluster}+\mathcal{L}_{sc}^{cluster} Lcecluster​=−N1​i=1∑N​log∑j=1K​exp(cj​⋅zi​)exp(cyi​​⋅zi​)​,∀c∈CLsccluster​=i=1∑2N​∣P(i)∣−1​p∈P(i)∑​log∑j∈A(i)​exp(zi​⋅zj​/τ)exp(zi​⋅zp​/τ)​Lsupcluster​=Lcecluster​+Lsccluster​

聚类阶段也采用监督学习和聚类学习交替的方式。

【自然语言处理】【聚类】DCSC:利用基于对比学习的半监督聚类算法进行意图挖掘相关推荐

  1. UCL-Dehaze: Towards Real-world Image Dehazing via Unsupervised Contrastive Learning 基于对比学习的无监督真实图像去雾

    概述 本文提出了一种有效的无监督对比学习范式 --ucl-dehaze.未配对的真实世界清晰图像和模糊图像很容易获取,在训练UCL-Dehaze网络时分别作为 重要的正样本和负样本.为了更有效地训练网 ...

  2. NAACL 2021 | AWS AI 提出基于对比学习的端到端无监督聚类方法

    ©PaperWeekly 原创 · 作者 | 李婧蕾 学校 | 北京邮电大学硕士生 研究方向 | 自然语言处理 Abstract 无监督聚类的目的是根据在表示空间中的距离发现数据的语义类别.然而,在学 ...

  3. AAAI 2021 | 基于对比学习的聚类工作

    ©PaperWeekly 原创 · 作者|李云帆 学校|四川大学博士生 研究方向|聚类,无监督表示学习 论文标题: Contrastive Clustering 论文来源: AAAI 2021 论文链 ...

  4. 【自然语言处理】【对比学习】SimCSE:基于对比学习的句向量表示

    相关博客: [自然语言处理][对比学习]SimCSE:基于对比学习的句向量表示 [自然语言处理]BERT-Whitening [自然语言处理][Pytorch]从头实现SimCSE [自然语言处理][ ...

  5. ACL 2021 | ConSERT:基于对比学习的句子语义表示迁移框架

    ©PaperWeekly 原创 · 作者 | 张琨 学校 | 中国科学技术大学博士生 研究方向 | 自然语言处理 Motivation 从 BERT,GPT 被提出来之后,自然语言处理领域相关研究进入 ...

  6. PCL-SISR:基于对比学习的单幅图像超分辨率重建方法

    ©作者 | 高帆 学校 | 北京邮电大学 研究方向 | 计算机视觉 随着 Transformer 的提出以及在底层任务上应用的进一步探索,相信在很多底层任务数据集上可以取得新的 SOTA 成绩.但是不 ...

  7. 中科院张士峰:基于深度学习的通用物体检测算法对比探索

    https://www.toutiao.com/a6674792954369933838/ 人工智能论坛如今浩如烟海,有硬货.有干货的讲座却百里挑一.由中国科学院大学主办,中国科学院大学学生会承办,读 ...

  8. 基于对比学习的目标检测预训练方法

    基于对比学习的目标检测预训练方法 参考链接:目标检测预训练模型(基于对比学习)相关论文梳理 本文主要记录以下几片论文: 1.DenseCL(CVPR21 oral) 2.DetCo(ICCV21) 3 ...

  9. MICCAI 2022 | CLFC:基于对比学习的多模态脑肿瘤分割与单模态正常脑图像的特征比较

    MICCAI 2022 | CLFC基于对比学习的多模态脑肿瘤分割与单模态正常脑图像的特征比较 Multimodal Brain Tumor Segmentation Using Contrastiv ...

  10. ECCV 2022 | 浙大快手提出CoText:基于对比学习和多信息表征的端到端视频OCR模型...

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 点击进入-> CV 微信技术交流群 转载自:CSIG文档图像分析与识别专委会 本文是对快手和浙大联合研 ...

最新文章

  1. LeetCode Best Time to Buy and Sell Stock with Cooldown(动态规划)
  2. 关于Android中Service的手动、自动以及其在特殊条件下的重启
  3. UVA - 12083 Guardian of Decency (二分匹配)
  4. 12如何隐藏dock栏_一键隐藏 iPhone 刘海和底部 Dock 栏,简洁又好看
  5. 哪些是常用的数据分析方法
  6. DBMS_SQL使用
  7. 下面的代码能确定参数是否为奇数吗?
  8. 干货 | 一文弄懂机器学习中偏差、方差
  9. 中山大学计算机学院离散数学,《离散数学》课程习题与解答(2011级使用)中山大学计算机科学系_推荐.pdf...
  10. NRD Studio在线导入Excel模板文件,自动生成人物关系图
  11. 转:Windows Azure Platform体验(3):Azure AppFabric
  12. 《C++ Primer 第5版》源码下载地址
  13. 老生常谈!数据库如何存储时间?你真的知道吗?
  14. 蜂巢网格生态护坡材料,我们一直在努力
  15. poi导出excel在单元格内画斜线
  16. C++模拟与高精度——乒乓球
  17. 常见的Transforms的使用方法
  18. 头条 上传图片大小_如何解决小说封面上传失败(不符合网站标准、缺少信息)的问题?...
  19. 【cocos2dx】卡牌记忆游戏(2)——游戏场景
  20. 群晖监控备份方案,为金融企业信息安全保驾护航

热门文章

  1. iOS非常全的三方库、插件、大牛博客
  2. oracle创建完成 sys密码怎么修改,如何重置密码 oracle sys和system
  3. matlab special,matlab的special函数用法
  4. 父节点使用transform,子节点fixed定位失效
  5. 扫描仪显示计算机繁忙或故障,打印机无法扫描怎么回事 游戏设备问题解决分享!...
  6. mac虚拟机搭建设置静态ip
  7. 【工具】PPT插入高清图片保存后图片变模糊的解决方法
  8. (蓝图)虚幻4重制俄罗斯方块(四)移动方块
  9. tensorflow2系类知识-4 :RNN
  10. 开启和关闭android移动网络