一、序

关于RBMs的文章已经有不少了,但是很多资料我在阅读的时候仍然对细节有一些疑惑。在查阅学习了大牛的视频、论文之后,很多问题豁然开朗,且在本文中记录下我对RBMs的粗浅了解。首先从玻尔兹曼机和限制玻尔兹曼机的结构和定义开始:

二、Boltmann Machines:

玻尔兹曼机(Boltmann Machines)的能量函数(Energy function)是:

E(x,h)=−h⊤Wx−c⊤x−b⊤h−x⊤Ux−h⊤Vh

\begin{equation}E(\textbf{x}, \textbf{h}) = -\textbf{h}^\top \textbf{W} \textbf{x} - \textbf{c}^\top \textbf{x} - \textbf{b}^\top \textbf{h} - \textbf{x}^\top \textbf{U} \textbf{x} - \textbf{h}^\top \textbf{V} \textbf{h} \end{equation}

分布函数:

P(x,h)=exp(−E(x,h))/Z

\begin{equation}P(\textbf{x}, \textbf{h}) = exp(-E(\textbf{x}, \textbf{h}))/Z \end{equation}

其中分母Z学名叫做partition function

Z=∑x∑hexp(−E(x,h))

\begin{equation}Z = \sum_{\textbf{x}} \sum_{\textbf{h}} exp(-E(\textbf{x}, \textbf{h})) \end{equation}

三、Restricted Boltmann Machines:

限制玻尔兹曼机(Restricted Boltmann Machines,简称RBMs)的能量函数(Energy function)是:

E(x,h)=−h⊤Wx−c⊤x−b⊤h=−∑j∑kWj,khjxk−∑kckxk−∑jbjhj

\begin{equation}\begin{split}&E(\textbf{x}, \textbf{h}) = -\textbf{h}^\top \textbf{W} \textbf{x} - \textbf{c}^\top \textbf{x} - \textbf{b}^\top \textbf{h}\\&\;\;=-\sum_j \sum_k W_{j,k}h_j x_k - \sum_k c_k x_k - \sum_j b_j h_j\\\end{split} \end{equation}

分布函数:

P(x,h)=exp(−E(x,h))/Z

\begin{equation}P(\textbf{x}, \textbf{h}) = \exp(-E(\textbf{x}, \textbf{h}))/Z \end{equation}
能量函数的能量越小,分布函数相应的概率就越大。

玻尔兹曼机和限制玻尔兹曼机都属于基于能量的模型(Energy-Based Models),从模型图和公式中很容易看出两者的区别:玻尔兹曼机隐含层(和可见层)处于同一层的任意两个节点之间有一条连线;而限制玻尔兹曼机同层变量之间是相互独立的。只要有足够的隐单元,限制玻尔兹曼机可以表示任意的离散分布,玻尔兹曼机的表示能力则更强一些。另一方面,限制玻尔兹曼机比玻尔兹曼机更容易训练。

四、模型学习:

训练RBMs就是学习能量函数的过程,变量中只有输入x\textbf{x}是已知的。

Free Energy:

为了后面计算公式的简洁,首先引入Free Energy这个概念:

P(x)=∑he−E(x,h)Z=e−FreeEnergy(x)Z,Z=∑xe−FreeEnergy(x)

\begin{equation}P(\textbf{x}) = \sum_{\textbf{h}} \frac{e^{-E(\textbf{x}, \textbf{h})}}{Z} = \frac{e^{-FreeEnergy(\textbf{x})}}{Z},\;\; Z = \sum_{\textbf{x}}e^{-FreeEnergy(\textbf{x})} \end{equation}

FreeEnergy(x)=−log∑he−E(x,h)

\begin{equation}FreeEnergy(\textbf{x}) = -log \sum_{\textbf{h}} e^{-E(\textbf{x}, \textbf{h})} \end{equation}

例如:如果hi∈{0,1}h_i\in \{0,1\}:

FreeEnergy(x)=−log∑he−E(x,h)=−log∑heh⊤Wx+c⊤x+b⊤h=−c⊤x−log∑heh⊤Wx+b⊤h=−c⊤x−log∑heh1(W1⋅x+b1)⋯ehn(Wn⋅x+bn)=−c⊤x−∑ilog(1+eWi⋅x+bi)

\begin{equation}\begin{split}&FreeEnergy(\textbf{x}) = -log \sum_{\textbf{h}} e^{-E(\textbf{x}, \textbf{h})}=-log \sum_{\textbf{h}} e^{\textbf{h}^\top \textbf{W} \textbf{x} + \textbf{c}^\top \textbf{x} + \textbf{b}^\top \textbf{h}}\\&=-\textbf{c}^\top \textbf{x}-log \sum_{\textbf{h}} e^{\textbf{h}^\top \textbf{W} \textbf{x} + \textbf{b}^\top \textbf{h}} = -\textbf{c}^\top \textbf{x}-log \sum_{\textbf{h}} e^{h_1( \textbf{W}_{1\cdot} \textbf{x} + b_1)}\cdots e^{h_n( \textbf{W}_{n\cdot} \textbf{x} + b_n)}\\&=-\textbf{c}^\top \textbf{x}- \sum_{i} log (1+e^{ \textbf{W}_{i\cdot} \textbf{x} + b_i})\\\end{split} \end{equation}
给定参数和 x\textbf{x}就可以很容易的计算出Free Energy的值,不依赖于隐单元 h\textbf{h}的具体取值。

梯度方法进行优化:

用梯度算法学习RBMs模型参数θ\theta(θ\theta包括W,c,b\textbf{W},\textbf{c},\textbf{b}),目标函数是P(x)P(\textbf{x})(这里是梯度上升,因为要求的是似然的极大值)。P(x)P(\textbf{x})取对数求偏导:

logP(x)=−FreeEnergy(x)−logZ

\begin{equation}log P(\textbf{x}) = -FreeEnergy(\textbf{x}) - log Z \end{equation}
对数似然梯度(log-likelihood gradient):

∂logP(x)∂θ=−∂FreeEnergy(x)∂θ+1Z∑x~e−FreeEnergy(x~)∂FreeEnergy(x~)∂θ=−∂FreeEnergy(x)∂θ+∑x~P(x~)∂FreeEnergy(x~)∂θ

\begin{equation}\begin{split}&\frac{\partial log P(\textbf{x})}{\partial \theta} = - \frac{\partial FreeEnergy(\textbf{x})}{\partial \theta} + \frac{1}{Z} \sum_{\tilde{\textbf{x}}} e^{-FreeEnergy(\tilde{\textbf{x}})} \frac{\partial FreeEnergy(\tilde{\textbf{x}})}{\partial \theta}\\&\;\;\;\;= - \frac{\partial FreeEnergy(\textbf{x})}{\partial \theta} + \sum_{\tilde{\textbf{x}}} P(\tilde{\textbf{x}}) \frac{\partial FreeEnergy(\tilde{\textbf{x}})}{\partial \theta}\\\end{split} \end{equation}
∂logP(x)∂θ\frac{\partial log P(\textbf{x})}{\partial \theta} 是对 ∂logP(x)∂W,∂logP(x)∂c,∂logP(x)∂b\frac{\partial log P(\textbf{x})}{\partial \textbf{W}}, \frac{\partial log P(\textbf{x})}{\partial \textbf{c}}, \frac{\partial log P(\textbf{x})}{\partial \textbf{b}} 的统一表示,编写代码时需要分别求偏导。求偏导都没有太大难度,其中 ∂E(x,h)∂W=∂−h⊤Wx∂W=−hx⊤\frac{\partial E(\textbf{x}, \textbf{h})}{\partial \textbf{W}} = \frac{\partial -\textbf{h}^\top \textbf{W} \textbf{x}}{\partial \textbf{W}} = -\textbf{h}\textbf{x}^\top。

很多文章里喜欢写成负对数似然梯度(negative log-likelihood gradient)的形式,−logP(x)-log P(\textbf{x})就应该用梯度下降方法来更新参数了:

−∂logP(x)∂θ=∂FreeEnergy(x)∂θ−∑x~P(x~)∂FreeEnergy(x~)∂θ

\begin{equation}- \frac{\partial log P(\textbf{x})}{\partial \theta} = \frac{\partial FreeEnergy(\textbf{x})}{\partial \theta} - \sum_{\tilde{\textbf{x}}} P(\tilde{\textbf{x}}) \frac{\partial FreeEnergy(\tilde{\textbf{x}})}{\partial \theta} \end{equation}

训练集上的平均负对数似然梯度等于:

EP^[∂−logP(x)∂θ]=EP^[∂FreeEnergy(x)∂θ]−EP[∂FreeEnergy(x~)∂θ]

\begin{equation}E_{\hat{P}}[\frac{\partial -log P(\textbf{x})}{\partial \theta}] = E_{\hat{P}}[\frac{\partial FreeEnergy(\textbf{x})}{\partial \theta}] - E_P[\frac{\partial FreeEnergy(\tilde{\textbf{x}})}{\partial \theta}] \end{equation}
P^\hat{P}是训练集对应的分布, PP是模型分布,EPE_P表示在模型分布上求期望。(这里顺便解释一下为什么大家都喜欢负对数似然而不是直接最大化似然,其实如果你有一台可以表示任何数值的超级计算机,那么取不取对数真的没什么关系,但是现实中的计算机表示能力有限,N个训练样本似然乘积很小很小,小到计算机都无法表示了,所以最好取log,概率的和不会有这样的问题;另外,在优化理论中,优化问题的标准形式就是最小化某个目标函数,所以最好加个负号,最小化负对数似然)。

式子的第一项称为positive phrase,通过减小对应的FreeEnergy增大训练样本的概率;第二项是negative phrase,作用是增大对应的FreeEnergy来减小模型产生的样本的概率。句话不难理解,因为两项分别是往FreeEnergy(x)FreeEnergy(\textbf{x})的梯度下降和FreeEnergy(x~)FreeEnergy(\tilde{\textbf{x}})的梯度上升方向改变。这也符合最大似然标准,在训练样本上有较大的似然而在其他样本上概率较小。从分类的角度来看,训练样本是正样本,而模型样本是负样本(Negative samples)

把训练样本代入求均值即可得到梯度公式的第一项EP^[∂FreeEnergy(x)∂θ] E_{\hat{P}}[\frac{\partial FreeEnergy(\textbf{x})}{\partial \theta}]的值,第二项EP[∂FreeEnergy(x~)∂θ]E_P[\frac{\partial FreeEnergy(\tilde{\textbf{x}})}{\partial \theta}]计算模型分布上的期望,这就比较困难了,因为这需要取遍所有可能的x\textbf{x}的值。所以接下来我们就需要用到MCMC 采样来近似估计了。用MCMC采样得到的一组样本来近似估计整体的样本分布,梯度公式第二项在采样得到的样本上求近似期望(平均值)得到估计值。在实际中,常用Gibbs采样,Gibbs 采样是MCMC 算法的一种。用Gibbs从模型分布中采样n个样本,然后负对数似然梯度在训练集上的期望就可以近似为:

EP^[∂−logP(x)∂θ]≈EP^[∂FreeEnergy(x)∂θ]−1n∑i=1n∂FreeEnergy(xi~)∂θ

\begin{equation}E_{\hat{P}}[\frac{\partial -log P(\textbf{x})}{\partial \theta}] \approx E_{\hat{P}}[\frac{\partial FreeEnergy(\textbf{x})}{\partial \theta}] - \frac{1}{n}\sum_{i=1}^n\frac{\partial FreeEnergy(\tilde{\textbf{x}_i})}{\partial \theta} \end{equation}

最后,简要概括一下RBMs模型学习方法的步骤:(1)、求偏导,(2)、采样,(3)、估计负对数似然梯度,(4)、梯度下降方法更新参数。

五、Gibbs采样:

对RBMs模型来说, Gibbs主要有两个作用:一是估计negative log-likelihood gradient;二是在训练完模型之后(如DBN,DBN是由多个RBMs叠加而成的),用Gibbs进行采样,可以看到模型对数据的拟合以及网络中间隐含层的抽象效果。

在RBMs模型训练过程中,Gibbs就是用来对negative log-likelihood gradient进行估计的。Gibbs采样分两个小步对(x,h)(\textbf{x}, \textbf{h})进行采样,第一步固定x\textbf{x}对h\textbf{h}进行采样,第二步固定h\textbf{h}对x\textbf{x}进行采样,交替进行直到收敛

x1∼P^(x)h1∼P(h|x1)x2∼P(x|h1)h2∼P(h|x2)⋮xk+1∼P(x|hk)

\begin{equation}\begin{split}&\textbf{x}_1 \sim \hat{P}(x)\\&\textbf{h}_1 \sim P(\textbf{h}|\textbf{x}_1)\\&\textbf{x}_2 \sim P(\textbf{x}|\textbf{h}_1)\\&\textbf{h}_2 \sim P(\textbf{h}|\textbf{x}_2)\\&\;\;\;\;\;\;\;\;\;\;\vdots \\&\textbf{x}_{k+1} \sim P(\textbf{x}|\textbf{h}_k)\\\end{split} \end{equation}
    因为在训练过程中,训练模型分布会逐渐逼近训练样本分布,所以第一步可以从训练样本的分布 P^\hat{P}抽取样本作为 x1\textbf{x}_1。如果第一步直接从模型 PP 中采样,Gibbs采样会迅速收敛。

例如:假设h∈{0,1}H\textbf{h} \in \{0,1\}^H,已经得到 x1\textbf{x}_1,需要对 h1\textbf{h}_1采样。 P(h|x)=∏jp(hj|x)P(\textbf{h}| \textbf{x}) = \prod_{j}p(h_j|\textbf{x})(注:条件分布的具体推导过程见下一小节内容), 由于隐单元之间是相互独立的,所以可以采用block Gibbs采样,对所有的隐单元同时进行采样,加快采样收敛。分别求 p(hj=1|x)p(h_j=1|\textbf{x}),如果 p(hj=1|x)≥U[0,1]p(h_j=1|\textbf{x})\ge U[0,1](大于等于均匀分布的一个采样),就设置 hj=1h_j = 1,否则设置 hj=0h_j = 0。

条件分布:

    Gibbs采样主要是根据条件分布迭代进行采样的,所以在采样之前要先推导出条件分布公式。

P(h|x)=P(x,h)/∑h′P(x,h′)=exp(h⊤Wx+c⊤x+b⊤h)/Z∑h′exp(h′⊤Wx+c⊤x+b⊤h′)/Z=exp(h⊤Wx+b⊤h)∑h′exp(h′⊤Wx+b⊤h′)分子分母同时约去h无关项=exp(∑hjhjWj⋅x+bjhj)∑h′exp(∑h′jh′jWj⋅x+bjh′j)Wj⋅是W的第j行=∏jexp(hjWj⋅x+bjhj)∑h′1...∑h′H∏jexp(h′jWj⋅x+bjh′j)=∏jexp(hjWj⋅x+bjhj)∏j∑h′jexp(h′jWj⋅x+bjh′j)=∏jexp(hjWj⋅x+bjhj)∑h′jexp(h′jWj⋅x+bjh′j)=∏jp(hj|x)

\begin{equation}\begin{split}&P(\textbf{h}| \textbf{x}) = P(\textbf{x}, \textbf{h})/\sum_{\textbf{h}'} P(\textbf{x}, \textbf{h}')\\&\;\;=\frac{exp(\textbf{h}^\top \textbf{W} \textbf{x} + \textbf{c}^\top \textbf{x} + \textbf{b}^\top \textbf{h})/Z}{\sum_{\textbf{h}'} exp(\textbf{h}'^\top \textbf{W} \textbf{x} + \textbf{c}^\top \textbf{x} + \textbf{b}^\top \textbf{h}')/Z}\\&\;\;=\frac{exp(\textbf{h}^\top \textbf{W} \textbf{x} + \textbf{b}^\top \textbf{h})}{\sum_{\textbf{h}'} exp(\textbf{h}'^\top \textbf{W} \textbf{x} + \textbf{b}^\top \textbf{h}')} \;\;\text{分子分母同时约去h无关项}\\&\;\;=\frac{exp(\sum_{{h}_j}{h}_j W_{j\cdot} \textbf{x} + b_j {h}_j)}{\sum_{\textbf{h}'} exp(\sum_{{h'}_j}{h'}_j W_{j\cdot} \textbf{x} + b_j {h'}_j)} \;\;W_{j\cdot}\text{是W的第j行}\\&\;\;=\frac{\prod_{j} exp({h}_j W_{j\cdot} \textbf{x} + b_j {h}_j)}{\sum_{{h'}_1}...\sum_{{h'}_H} \prod_{j} exp({h'}_j W_{j\cdot} \textbf{x} + b_j {h'}_j)} \\&\;\;=\frac{\prod_{j} exp({h}_j W_{j\cdot} \textbf{x} + b_j {h}_j)}{\prod_{j} \sum_{{h'}_j} exp({h'}_j W_{j\cdot} \textbf{x} + b_j {h'}_j)} \\&\;\;= \prod_{j} \frac{ exp({h}_j W_{j\cdot} \textbf{x} + b_j {h}_j)}{ \sum_{{h'}_j} exp({h'}_j W_{j\cdot} \textbf{x} + b_j {h'}_j)} \\&\;\;= \prod_{j}p(h_j|\textbf{x})\\\end{split} \end{equation}

如果hj∈{0,1}h_j \in \{0,1\},可以得到:

p(hj=1|x)=exp(Wj⋅x+bj)1+exp(Wj⋅x+bj)=sigm(Wj⋅x+bj)

\begin{equation}p(h_j = 1|\textbf{x}) = \frac{ exp( W_{j\cdot} \textbf{x} + b_j )}{ 1 + exp( W_{j\cdot} \textbf{x} + b_j)} = sigm(W_{j\cdot} \textbf{x} + b_j) \end{equation}

p(hj=0|x)=1−p(hj=1|x)

\begin{equation}p(h_j = 0|\textbf{x}) = 1 - p(h_j = 1|\textbf{x}) \end{equation}

类似的:

P(x|h)=∏jexp(hW⋅jxj+cjxj)∑x′jexp(hW⋅jx′j+cjx′j))=∏jp(xj|h)

\begin{equation}P(\textbf{x}| \textbf{h}) = \prod_{j} \frac{ exp(\textbf{h} W_{\cdot j} x_j + c_j x_j)}{ \sum_{{x'}_j} exp(\textbf{h} W_{\cdot j} {x'}_j + c_j {x'}_j))} = \prod_{j}p(x_j|\textbf{h}) \end{equation}

如果xj∈{0,1}x_j \in \{0,1\},可以得到:

p(xj=1|h)=exp(hW⋅j+cj)1+exp(hW⋅j+cj))=sigm(hW⋅j+cj)

\begin{equation}p(x_j = 1| \textbf{h}) = \frac{ exp(\textbf{h} W_{\cdot j} + c_j )}{ 1 + exp(\textbf{h} W_{\cdot j} + c_j))} = sigm(\textbf{h} W_{\cdot j} + c_j) \end{equation}

六、Contrastive Divergence:

    Contrastive Divergence可以加快RBMs的训练速度,随机选择一个训练样本初始化x1\textbf{x}_1,并且每一次迭代只用一个模型样本来估计negative log-likelihood gradient,而不是等到MCMC采样收敛后求期望。

    k-step Contrastive Divergence(CD-k):MCMC采样k步x1,x2,...,xk+1\textbf{x}_1,\textbf{x}_2,...,\textbf{x}_{k+1}, 用 xk+1\textbf{x}_{k+1} 估计negative log-likelihood gradient。当k=1时,就能得到比较好的近似(DBN等pre-training k取1就够用了),k增大可以得到更好的效果。Contrastive Divergence的一种理解是在训练样本x1\textbf{x}_1 附近的局部区域内估计negative log-likelihood gradient。

借用一下大神Bengio的文章”Learning Deep Architectures for AI”的算法描述:

Persistent CD:

    CD只在附近的局部区域取Negative Sample来估计negative log-likelihood gradient,很难取到其它极值区域的样本,Persistent CD可以在一定程度上解决这个问题。Persistent CD的思想很简单,它与CD的区别仅仅在与:用上一次迭代得到的 xk+1\textbf{x}_{k+1}(即Negative Sample)作为这次迭代的初始值来初始化x1\textbf{x}_1。PS:Persistent CD是2008年Tijmen发表在ICML上的文章。

七、参考资料:

[1].Youtube上Hugo Larochelle的视频讲解:https://www.youtube.com/user/hugolarochelle/videos

[2].DeepLearning tutorial:http://deeplearning.net/tutorial/rbm.html

[3].LSIA:http://www.iro.umontreal.ca/~lisa/twiki/bin/view.cgi/Public/DBNEquations

[4].Yoshua Bengio:Learning Deep Architectures for AI

限制玻尔兹曼机(RBMs)理论详解相关推荐

  1. 大数据时代 | 数据分析方法及理论详解

    大数据时代 | 数据分析方法及理论详解 1 数据分析前,我们需要思考 像一场战役的总指挥影响着整个战役的胜败一样,数据分析师的思想对于整体分析思路,甚至分析结果都有着关键性的作用. 2 分析问题和解决 ...

  2. 手机摄影中多摄融合理论详解与代码实战

    转载AI Studio项目链接https://aistudio.baidu.com/aistudio/projectdetail/3465839 手机摄影中多摄融合理论详解与代码实战 前言   从20 ...

  3. Data Guard ----理论详解(四)

    1.Data Guard 第一章详细部分阅读–传送门 2 DG Services 详解 – Redo Transport Services 第二章详细部分阅读–传送门 3 DG Services 详解 ...

  4. Python实战——VAE的理论详解及Pytorch实现

    参考的论文: Tutorial on Variational Autoencoders Auto-Encoding Variational Bayes 建议参考的文章: Pytorch里的CrossE ...

  5. TB级别分布式关系型数据库OceanBase理论详解

    OceanBase是阿里开发的分布式关系型(SQL)数据库,其目标是支持数百TB的数据量以及数十万TPS.数百万QPS的访问量,无论是数据量还是访问量,即使采用非常昂贵的小型机甚至是大型机,单台关系数 ...

  6. 【视觉SLAM十四讲】第一章理论详解

    文章目录 第一讲 概述与预备知识 SLAM是什么 室内/室外定位 稀疏-半稠密重建 稠密重建 SLAM可以用在哪些地方? **作业1.** SLAM会在哪些场合中⽤到?⾄少列举三个⽅向. SLAM: ...

  7. [PXE] Linux(centos6)中PXE 服务器搭建,PXE安装、启动及PXE理论详解

    本篇blog主要讲述了[PXE] linux(centos)PXE无盘服务器搭建,安装,启动及pxe协议详解 , Kickstart (PXE+DHCP+TFTP+HTTP). PXE环境概述 作为中 ...

  8. 集群理论详解(续一)

    扩展知识二: 使用heartbeatV2的CRM组件进行高可用集群的"集群资源管理crm" 1.更改原来haresources资源管理配置文件的方法可用通过/usr/lib64/h ...

  9. GlusterFS/GFS 分布式文件系统--理论详解

    文章目录 一.文件系统简介 1.组成 2.作用 3.文件系统的挂载使用 二.GFS分布式文件系统概述 1.GFS简介 2.GFS的特点 3.GFS专业术语 4. 模块化堆栈式架构 5. GFS 工作流 ...

  10. Vision Transformer(ViT) 1: 理论详解

    Vison Transformer 介绍 Vison Transformer论文- An Image is Worth 16x16 Words: Transformers for Image Reco ...

最新文章

  1. 2020腾讯广告算法大赛:赛题理解与解题思路
  2. swing java管理系统_Java swing实现酒店管理系统
  3. sql语句,怎么查看一个表中的所有约束
  4. php $interval,如何在PHP中使用setInterval?
  5. Java设计模式之行为型:访问者模式
  6. SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
  7. Computer Vision的尴尬
  8. java 直播_一对一直播源码开发过程中区分Java和PHP的重要性
  9. iOS开发_统计xcode代码行数
  10. Centos 6让SVN提交文件自动更新到nginx的WEB目录
  11. ios mysql 创建不同的用户表_移动端iOS系统数据库之Realm(二)表的创建增删改查(多表)...
  12. 「整理了一些让人惊艳的古文情话」
  13. 利用HY-SRF05 超声波模块实现超声波的测距避障
  14. 房屋水电煤气省钱秘籍
  15. 随笔6 崇拜轩昂神有感
  16. mysql查询条件为不等于某个值时,null 查询不到?
  17. BYOD与企业移动性的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. epoll 主从反应堆模式代码实现
  19. 提高晚上学习效率的11个方法
  20. 【Pygame实战】射击游戏推荐:入局即巅峰?精品类休闲射击游戏《无敌狙击手》等你来。

热门文章

  1. “武汉市科技小巨人”,我们入选了
  2. 准备换老古董,拟了个配置单,想征求大家的意见,谢谢!
  3. 【HTTPS】IIS服务器下设置https访问
  4. 【Java二十周年】回忆我与Java的点点滴滴
  5. 构建SpringCloud 项目初始环境(四)—Sentinel限流熔断应用实践
  6. 《MySQL是怎么运行的》阅读笔记
  7. Python 函数定义与调用
  8. 手机屏幕常见故障_换屏哥教你解决手机常见问题—声音篇
  9. 使用腾讯云轻量应用服务器搭建gitlab服务器
  10. 动手学习ResNet50