数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
五、ResNet
ResNet
提出了一种残差学习框架来解决网络退化问题,从而训练更深的网络。这种框架可以结合已有的各种网络结构,充分发挥二者的优势。ResNet
以三种方式挑战了传统的神经网络架构:ResNet
通过引入跳跃连接来绕过残差层,这允许数据直接流向任何后续层。这与传统的、顺序的
pipeline
形成鲜明对比:传统的架构中,网络依次处理低级feature
到高级feature
。ResNet
的层数非常深,高达1202层。而ALexNet
这样的架构,网络层数要小两个量级。通过实验发现,训练好的
ResNet
中去掉单个层并不会影响其预测性能。而训练好的AlexNet
等网络中,移除层会导致预测性能损失。
在
ImageNet
分类数据集中,拥有152层的残差网络,以3.75% top-5
的错误率获得了ILSVRC 2015
分类比赛的冠军。很多证据表明:残差学习是通用的,不仅可以应用于视觉问题,也可应用于非视觉问题。
5.1 网络退化问题
学习更深的网络的一个障碍是梯度消失/爆炸,该问题可以通过
Batch Normalization
在很大程度上解决。ResNet
论文作者发现:随着网络的深度的增加,准确率达到饱和之后迅速下降,而这种下降不是由过拟合引起的。这称作网络退化问题。如果更深的网络训练误差更大,则说明是由于优化算法引起的:越深的网络,求解优化问题越难。如下所示:更深的网络导致更高的训练误差和测试误差。
理论上讲,较深的模型不应该比和它对应的、较浅的模型更差。因为较深的模型是较浅的模型的超空间。较深的模型可以这样得到:先构建较浅的模型,然后添加很多恒等映射的网络层。
实际上我们的较深的模型后面添加的不是恒等映射,而是一些非线性层。因此,退化问题表明:通过多个非线性层来近似横等映射可能是困难的。
解决网络退化问题的方案:学习残差。
5.2 残差块
假设需要学习的是映射 $ MathJax-Element-88 $ ,残差块使用堆叠的非线性层拟合残差: $ MathJax-Element-89 $ 。
其中:
$ MathJax-Element-698 $ 和 $ MathJax-Element-91 $ 是块的输入和输出向量。
$ MathJax-Element-105 $ 是要学习的残差映射。因为 $ MathJax-Element-93 $ ,因此称 $ MathJax-Element-116 $ 为残差。
+
:通过快捷连接
逐个元素相加来执行。快捷连接
指的是那些跳过一层或者更多层的连接。- 快捷连接简单的执行恒等映射,并将其输出添加到堆叠层的输出。
- 快捷连接既不增加额外的参数,也不增加计算复杂度。
相加之后通过非线性激活函数,这可以视作对整个残差块添加非线性,即 $ MathJax-Element-95 $ 。
前面给出的残差块隐含了一个假设: $ MathJax-Element-105 $ 和 $ MathJax-Element-698 $ 的维度相等。如果它们的维度不等,则需要在快捷连接中对 $ MathJax-Element-698 $ 执行线性投影来匹配维度: $ MathJax-Element-99 $ 。
事实上当它们维度相等时,也可以执行线性变换。但是实践表明:使用恒等映射足以解决退化问题,而使用线性投影会增加参数和计算复杂度。因此 $ MathJax-Element-100 $ 仅在匹配维度时使用。
残差函数 $ MathJax-Element-116 $ 的形式是可变的。
层数可变:论文中的实验包含有两层堆叠、三层堆叠,实际任务中也可以包含更多层的堆叠。
如果 $ MathJax-Element-116 $ 只有一层,则残差块退化线性层: $ MathJax-Element-103 $ 。此时对网络并没有什么提升。
连接形式可变:不仅可用于全连接层,可也用于卷积层。此时 $ MathJax-Element-116 $ 代表多个卷积层的堆叠,而最终的逐元素加法
+
在两个feature map
上逐通道进行。此时
x
也是一个feature map
,而不再是一个向量。
残差学习成功的原因:学习残差 $ MathJax-Element-105 $ 比学习原始映射 $ MathJax-Element-106 $ 要更容易。
当原始映射 $ MathJax-Element-118 $ 就是一个恒等映射时, $ MathJax-Element-116 $ 就是一个零映射。此时求解器只需要简单的将堆叠的非线性连接的权重推向零即可。
实际任务中原始映射 $ MathJax-Element-118 $ 可能不是一个恒等映射:
- 如果 $ MathJax-Element-118 $ 更偏向于恒等映射(而不是更偏向于非恒等映射),则 $ MathJax-Element-116 $ 就是关于恒等映射的抖动,会更容易学习。
- 如果原始映射 $ MathJax-Element-118 $ 更偏向于零映射,那么学习 $ MathJax-Element-118 $ 本身要更容易。但是在实际应用中,零映射非常少见,因为它会导致输出全为0。
如果原始映射 $ MathJax-Element-118 $ 是一个非恒等映射,则可以考虑对残差模块使用缩放因子。如
Inception-Resnet
中:在残差模块与快捷连接叠加之前,对残差进行缩放。注意:
ResNet
作者在随后的论文中指出:不应该对恒等映射进行缩放。因此Inception-Resnet
对残差模块进行缩放。可以通过观察残差 $ MathJax-Element-116 $ 的输出来判断:如果 $ MathJax-Element-116 $ 的输出均为0附近的、较小的数,则说明原始映射 $ MathJax-Element-118 $ 更偏向于恒等映射;否则,说明原始映射 $ MathJax-Element-118 $ 更偏向于非横等映射。
5.3 ResNet 分析
Veit et al.
认为ResNet
工作较好的原因是:一个ResNet
网络可以看做是一组较浅的网络的集成模型。但是
ResNet
的作者认为这个解释是不正确的。因为集成模型要求每个子模型是独立训练的,而这组较浅的网络是共同训练的。论文
《Residual Networks Bahave Like Ensemble of Relatively Shallow Networks》
对ResNet
进行了深入的分析。通过分解视图表明:
ResNet
可以被视作许多路径的集合。通过研究
ResNet
的梯度流表明:网络训练期间只有短路径才会产生梯度流,深的路径不是必须的。通过破坏性实验,表明:
- 即使这些路径是共同训练的,它们也不是相互依赖的。
- 这些路径的行为类似集成模型,其预测准确率平滑地与有效路径的数量有关。
5.3.1 分解视图
考虑从输出 $ MathJax-Element-119 $ 到 $ MathJax-Element-120 $ 的三个
$ \mathbf {\vec y}_3=\mathbf {\vec y}_2+f_3(\mathbf {\vec y}_2) =[\mathbf {\vec y}_1+f_2(\mathbf {\vec y}_1)]+f_3(\mathbf {\vec y}_1+f_2(\mathbf {\vec y}_1))\\ =[\mathbf {\vec y}_0+f_1(\mathbf {\vec y}_0)+f_2(\mathbf {\vec y}_0+f_1(\mathbf {\vec y}_0))]+f_3(\mathbf {\vec y}_0+f_1(\mathbf {\vec y}_0)+f_2(\mathbf {\vec y}_0+f_1(\mathbf {\vec y}_0))) $ResNet
块构建的网络。根据:下图中:左图为原始形式,右图为分解视图。分解视图中展示了数据从输入到输出的多条路径。
对于严格顺序的网络(如
VGG
),这些网络中的输入总是在单个路径中从第一层直接流到最后一层。如下图所示。分解视图中, 每条路径可以通过二进制编码向量 $ MathJax-Element-121 $ 来索引:如果流过残差块 $ MathJax-Element-128 $ ,则 $ MathJax-Element-123 $ ;如果跳过残差块 $ MathJax-Element-128 $ ,则 $ MathJax-Element-125 $ 。
因此
ResNet
从输入到输出具有 $ MathJax-Element-140 $ 条路径,第 $ MathJax-Element-619 $ 个残差块 $ MathJax-Element-128 $ 的输入汇聚了之前的 $ MathJax-Element-129 $ 个残差块的 $ MathJax-Element-130 $ 条路径。普通的前馈神经网络也可以在单个神经元(而不是网络层)这一粒度上运用分解视图,这也可以将网络分解为不同路径的集合。
它与
ResNet
分解的区别是:- 普通前馈神经网络的神经元分解视图中,所有路径都具有相同的长度。
ResNet
网络的残差块分解视图中,所有路径具有不同的路径长度。
5.3.2 路径长度分析
ResNet
中,从输入到输出存在许多条不同长度的路径。这些路径长度的分布服从二项分布。对于 $ MathJax-Element-566 $ 层深的ResNet
,大多数路径的深度为 $ MathJax-Element-132 $ 。下图为一个 54 个块的
ResNet
网络的路径长度的分布 ,其中95%
的路径只包含 19~35个块。
5.3.3 路径梯度分析
ResNet
中,路径的梯度幅度随着它在反向传播中经过的残差块的数量呈指数减小。因此,训练期间大多数梯度来源于更短的路径。对于一个包含 54 个残差块的
ResNet
网络:下图表示:单条长度为 $ MathJax-Element-415 $ 的路径在反向传播到
input
处的梯度的幅度的均值,它刻画了长度为 $ MathJax-Element-415 $ 的单条路径的对于更新的影响。因为长度为 $ MathJax-Element-415 $ 的路径有多条,因此取其平均。
下图表示:长度为 $ MathJax-Element-415 $ 的所有路径在反向传播到
input
处的梯度的幅度的和。它刻画了长度为 $ MathJax-Element-415 $ 的所有路径对于更新的影响。它不仅取决于长度为 $ MathJax-Element-415 $ 的单条路径的对于更新的影响,还取决于长度为 $ MathJax-Element-415 $ 的单条路径的数量。
有效路径:反向传播到
input
处的梯度幅度相对较大的路径。ResNet
中有效路径相对较浅,而且有效路径数量占比较少。在一个54 个块的ResNet
网络中:- 几乎所有的梯度更新都来自于长度为 5~17 的路径。
- 长度为 5~17 的路径占网络所有路径的 0.45% 。
论文从头开始重新训练
ResNet
,同时在训练期间只保留有效路径,确保不使用长路径。实验结果表明:相比于完整模型的 6.10% 的错误率,这里实现了 5.96% 的错误率。二者没有明显的统计学上的差异,这表明确实只需要有效路径。因此,
ResNet
不是让梯度流流通整个网络深度来解决梯度消失问题,而是引入能够在非常深的网络中传输梯度的短路径来避免梯度消失问题。和
ResNet
原理类似,随机深度网络起作用有两个原因:- 训练期间,网络看到的路径分布会发生变化,主要是变得更短。
- 训练期间,每个
mini-batch
选择不同的短路径的子集,这会鼓励各路径独立地产生良好的结果。
5.3.4 路径破坏性分析
在
ResNet
网络训练完成之后,如果随机丢弃单个残差块,则测试误差基本不变。因为移除一个残差块时,ResNet
中路径的数量从 $ MathJax-Element-140 $ 减少到 $ MathJax-Element-141 $ ,留下了一半的路径。在
VGG
网络训练完成之后,如果随机丢弃单个块,则测试误差急剧上升,预测结果就跟随机猜测差不多。因为移除一个块时,VGG
中唯一可行的路径被破坏。删除
ResNet
残差块通常会删除长路径。当删除了 $ MathJax-Element-415 $ 个残差块时,长度为 $ MathJax-Element-684 $ 的路径的剩余比例由下式给定: $ MathJax-Element-144 $ 。
下图中:
- 删除10个残差模块,一部分有效路径(路径长度为
5~17
)仍然被保留,模型测试性能会部分下降。 - 删除20个残差模块,绝大部分有效路径(路径长度为
5~17
)被删除,模型测试性能会大幅度下降。
- 删除10个残差模块,一部分有效路径(路径长度为
ResNet
网络中,路径的集合表现出一种类似集成模型的效果。一个关键证据是:它们的整体表现平稳地取决于路径的数量。随着网络删除越来越多的残差块,网络路径的数量降低,测试误差平滑地增加(而不是突变)。如果在测试时重新排序网络的残差块,这意味着交换了低层映射和高层映射。采用
Kendall Tau rank
来衡量网络结构被破坏的程度,结果表明:随着Kendall Tau rank
的增加,预测错误率也在增加。
5.4 网络性能
plain
网络:一些简单网络结构的叠加,如下图所示。图中给出了四种plain
网络,它们的区别主要是网络深度不同。其中,输入图片尺寸 224x224 。ResNet
简单的在plain
网络上添加快捷连接来实现。FLOPs
:floating point operations
的缩写,意思是浮点运算量,用于衡量算法/模型的复杂度。FLOPS
:floating point per second
的缩写,意思是每秒浮点运算次数,用于衡量计算速度。相对于输入的
feature map
,残差块的输出feature map
尺寸可能会发生变化:输出
feature map
的通道数增加,此时需要扩充快捷连接的输出feature map
。否则快捷连接的输出feature map
无法和残差块的feature map
累加。有两种扩充方式:
- 直接通过 0 来填充需要扩充的维度,在图中以实线标识。
- 通过
1x1
卷积来扩充维度,在图中以虚线标识。
输出
feature map
的尺寸减半。此时需要对快捷连接执行步长为 2 的池化/卷积:如果快捷连接已经采用1x1
卷积,则该卷积步长为2 ;否则采用步长为 2 的最大池化 。
计算复杂度:
VGG-19 34层 plain 网络 Resnet-34 计算复杂度(FLOPs) 19.6 billion 3.5 billion 3.6 billion 模型预测能力:在
ImageNet
验证集上执行10-crop
测试的结果。A
类模型:快捷连接中,所有需要扩充的维度的填充 0 。B
类模型:快捷连接中,所有需要扩充的维度通过1x1
卷积来扩充。C
类模型:所有快捷连接都通过1x1
卷积来执行线性变换。
可以看到
C
优于B
,B
优于A
。但是C
引入更多的参数,相对于这种微弱的提升,性价比较低。所以后续的ResNet
均采用B
类模型。模型 top-1 误差率 top-5 误差率 VGG-16 28.07% 9.33% GoogleNet - 9.15% PReLU-net 24.27% 7.38% plain-34 28.54% 10.02% ResNet-34 A 25.03% 7.76% ResNet-34 B 24.52% 7.46% ResNet-34 C 24.19% 7.40% ResNet-50 22.85% 6.71% ResNet-101 21.75% 6.05% ResNet-152 21.43% 5.71%
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论