返回介绍

数学基础

统计学习

深度学习

工具

Scala

六、ResNet 变种

发布于 2023-07-17 23:38:25 字数 22069 浏览 0 评论 0 收藏 0

6.1 恒等映射修正

  1. 在论文《Identity Mappings in Deep Residual Networks》中,ResNet 的作者通过实验证明了恒等映射的重要性,并且提出了一个新的残差单元来简化恒等映射。

6.1.1 新残差块

  1. 新的残差单元中,恒等映射添加到ReLU 激活函数之后。它使得训练变得更简单,并且提高了网络的泛化能力。

  2. 假设 $ MathJax-Element-333 $ 是第 $ MathJax-Element-642 $ 个残差单元的输入特征; $ MathJax-Element-335 $ 为一组与第 $ MathJax-Element-642 $ 个残差单元相关的权重(包括偏置项), $ MathJax-Element-689 $ 是残差单元中的层的数量; $ MathJax-Element-338 $ 代表残差函数。则第 $ MathJax-Element-642 $ 个残差单元的输出为(它也等价于第 $ MathJax-Element-645 $ 个残差单元的输入):

    $ \mathbf{\vec x}_{l+1}=\mathbf{\vec x}_l+\mathcal F(\mathbf{\vec x}_l,\mathcal W_l) $

    考虑递归,对于任意深的残差单元 $ MathJax-Element-696 $ ,则有:

    $ \mathbf{\vec x}_{L}=\mathbf{\vec x}_{L-1}+\mathcal F(\mathbf{\vec x}_{L-1},\mathcal W_{L-1})\\ =\mathbf{\vec x}_{L-2}+\mathcal F(\mathbf{\vec x}_{L-1},\mathcal W_{L-1})+\mathcal F(\mathbf{\vec x}_{L-2},\mathcal W_{L-2})\\ \vdots\\ =\mathbf{\vec x}_{l}+\sum_{i=l}^{L-1}\mathcal F(\mathbf{\vec x}_i,\mathcal W_i) $

    因此,对任意深的单元 $ MathJax-Element-696 $ ,其输入特征 $ MathJax-Element-165 $ 可以表示为浅层单元 $ MathJax-Element-642 $ 的特征 $ MathJax-Element-333 $ 加上一个形如 $ MathJax-Element-158 $ 的残差函数。

    这意味着:任意单元 $ MathJax-Element-696 $ 和 $ MathJax-Element-642 $ 之间都具有残差性。

  3. 对于任意深的单元 $ MathJax-Element-696 $ ,其输入特征 $ MathJax-Element-165 $ 可以表示为: $ MathJax-Element-163 $ 。即:之前所有残差函数输出的总和,再加上 $ MathJax-Element-164 $ 。

    与之形成鲜明对比的是常规网络中,输入特征 $ MathJax-Element-165 $ 是一系列矩阵向量的乘积。即为: $ MathJax-Element-166 $ (忽略了激活函数和 BN )。

  4. 新的残差单元也更具有良好的反向传播特性。对于损失函数 $ MathJax-Element-167 $ ,有:

    $ \frac{\partial \mathcal L}{\partial \mathbf{\vec x}_l}= \left(\frac{\partial \mathbf{\vec x}_L}{\partial \mathbf{\vec x}_l}\right)^T\frac{\partial \mathcal L}{\partial \mathbf{\vec x}_L}=\left(1+\frac{\partial \sum_{i=l}^{L-1}\mathcal F(\mathbf{\vec x}_i,\mathcal W_i)}{\partial \mathbf{\vec x}_l}\right)^T\frac{\partial \mathcal L}{\partial \mathbf{\vec x}_L} $

    可以看到:

    • 梯度 $ MathJax-Element-168 $ 可以分解为两个部分:

      • $ MathJax-Element-169 $ :直接传递信息而不涉及任何权重。它保证了信息能够直接传回给任意浅层 $ MathJax-Element-642 $ 。
      • $ MathJax-Element-171 $ :通过各权重层来传递。
    • 在一个mini-batch 中,不可能出现梯度消失的情况。

      可能对于某个样本,存在 $ MathJax-Element-173 $ 的情况,但是不可能出现mini-batch 中所有的样本满足 $ MathJax-Element-173 $ 。

      这意味着:哪怕权重是任意小的,也不可能出现梯度消失的情况。

    对于旧的残差单元,由于恒等映射还需要经过ReLU 激活函数,因此当 $ MathJax-Element-174 $ 时饱和,其梯度为0 。

  5. 根据3.4. 的讨论表明:在前向和反向阶段,信号都能够直接传递到任意单元。

6.1.2 快捷连接验证

  1. 假设可以对快捷连接执行缩放(如线性的1x1 卷积),第 $ MathJax-Element-642 $ 个残差单元的缩放因子为 $ MathJax-Element-177 $ ,其中 $ MathJax-Element-177 $ 也是一个可以学习的参数。此时有: $ MathJax-Element-178 $ ,以及: $ MathJax-Element-179 $ 。

    令: $ MathJax-Element-180 $ ,则有:

    $ \mathbf{\vec x}_{L}=\left(\prod_{i=l}^{L-1}\lambda_i\right)\mathbf{\vec x}_l+\sum_{i=l}^{L-1}\hat { \mathcal F}(\mathbf{\vec x}_i,\mathcal W_i)\\ \frac{\partial \mathcal L}{\partial \mathbf{\vec x}_l}= \left(\frac{\partial \mathbf{\vec x}_L}{\partial \mathbf{\vec x}_l}\right)^T\frac{\partial \mathcal L}{\partial \mathbf{\vec x}_L}=\left( \prod_{i=l}^{L-1}\lambda_i +\frac{\partial \sum_{i=l}^{L-1}\hat {\mathcal F}(\mathbf{\vec x}_i,\mathcal W_i)}{\partial \mathbf{\vec x}_l}\right)^T\frac{\partial \mathcal L}{\partial \mathbf{\vec x}_L} $

    对于特别深的网络:如果 $ MathJax-Element-181 $ , 则 $ MathJax-Element-184 $ 发生梯度爆炸;如果 $ MathJax-Element-183 $ , 则 $ MathJax-Element-184 $ 发生梯度消失。这会丧失快捷连接的好处。

  2. 如果对快捷连接执行的不是线性缩放,而是一个复杂的函数 $ MathJax-Element-185 $ ,则上式括号中第一部分变成: $ MathJax-Element-186 $ 。其中 $ MathJax-Element-187 $ 为 $ MathJax-Element-188 $ 的导数。

    这也会丧失快捷连接的好处,阻碍梯度的传播。

  3. 下图所示为对快捷连接进行的各种修改:

    为了简化,这里没有画出BN 层。每个权重层的后面实际上都有一个BN 层。

    • (a):原始的、旧的残差块。

    • (b):对所有的快捷连接设置缩放。其中缩放因子 $ MathJax-Element-189 $ 。

      残差有两种配置:缩放(缩放因子 0.5)、不缩放。

    • (c):对快捷连接执行门控机制。残差由 $ MathJax-Element-582 $ 来缩放,快捷连接由 $ MathJax-Element-191 $ 来缩放。

      其中 $ MathJax-Element-192 $ , $ MathJax-Element-193 $ 。

    • (d):对快捷连接执行门控机制,但是残差并不进行缩放。

    • (e): 对快捷连接执行1x1 卷积。

    • (f):对快捷连接执行dropout,其中遗忘比例为0.5 。

      在统计学上,它等效于一个缩放比例为0.5的缩放操作。

    CIFAR-10 上利用ResNet-110 的测试误差如下:(fail 表示测试误差超过 20% )

    on shortcuton F 列分别给出了快捷连接、残差块上的缩放比例。

  4. 最终结果表明:快捷连接是信息传递最直接的路径,快捷连接中的各种操作都会阻碍信息的传递,以致于对优化造成困难。

  5. 理论上,对快捷连接执行1x1 卷积,会引入更多的参数。它应该比恒等连接具备更强大的表达能力。

    事实上,其训练误差要比恒等连接的训练误差高的多。这意味着模型退化是因为优化问题,而不是网络表达能力的问题。

6.1.3 激活函数验证

  1. 设残差块之间的函数为 $ MathJax-Element-200 $ ,即:+ 之后引入 $ MathJax-Element-200 $ :

    $ \mathbf{\vec y}_l=\mathbf{\vec x}_l+\mathcal F(\mathbf{\vec x}_l,\mathcal W_l),\quad \mathbf{\vec x}_{l+1} = f(\mathbf{\vec y}_l) $

    前面的理论推导均假设 $ MathJax-Element-200 $ 为恒等映射 $ MathJax-Element-207 $ ,而上面的实验中 $ MathJax-Element-198 $ 。因此接下来考察 $ MathJax-Element-200 $ 的影响。

  2. 如下图所示,组件都相同,但是不同的组合导致不同的残差块或 $ MathJax-Element-200 $ 。

    • (a):原始的、旧的残差块, $ MathJax-Element-201 $ 。

    • (b):将BN 移动到addition 之后, $ MathJax-Element-202 $ 。

    • (c):将ReLU 移动到addition 之前, $ MathJax-Element-207 $ 。

      这种结构问题较大,因为理想的残差块的输出范围是 $ MathJax-Element-204 $ 。这里的残差块经过个ReLU 之后的输出为非负,从而使得残差的输出为 $ MathJax-Element-205 $ ,从而使得前向信号会逐级递增。这会影响网络的表达能力。

    • (d):将ReLU 移动到残差块之前, $ MathJax-Element-207 $ 。

    • (e): 将BNReLU 移动到残差块之前, $ MathJax-Element-207 $ 。

  3. 最终结果表明:full pre-activation 效果最好。有两个原因:

    • 快捷连接通路是顺畅的,这使得优化更加简单。

    • 对两个权重层的输入都执行了BN

      所有其它四组结构中,只有第二个权重层的输入的到了标准化,第一个权重层的输入并未的到标准化。

6.1.4 网络性能

  1. ILSVRC 2012 验证集上的评估结果:

    方法数据集增强train croptest croptop-1 误差top-5 误差
    ResNet-152,原始残差块scale224x224224x22423.0%6.7%
    ResNet-152,原始残差块scale224x224320x32021.3%5.5%
    ResNet-152,full pre-activationscale224x224320x32021.1%5.5%
    ResNet-200,原始残差块scale224x224320x32021.8%6.0%
    ResNet-200,full pre-activationscale224x224320x32020.7%5.3%
    ResNet-200,full pre-activationscale + asp ratio224x224320x32020.1%4.8%
    Inception v3scale + asp ratio299x299299x29921.2%5.6%

6.2 ResNeXt

  1. 通常提高模型准确率的方法是加深网络深度或者加宽网络宽度,但这些方法会增加超参数的数量、参数数量和计算量。

    ResNeXt 网络可以在不增加网络参数复杂度的前提下提高准确率,同时还减少了超参数的数量。

  2. ResNeXt 的设计参考了VGGInception 的设计哲学。

    • VGG:网络通过简单地层叠相同结构的层来实现,因此网络结构简单。其缺点是网络参数太多,计算量太大。

    • Inception:通过执行分裂-变换-合并策略来精心设计拓扑结构,使得网络参数较少,计算复杂度较低。这种分裂-变换-合并行为预期能够达到一个大的dense 层的表达能力,但是计算复杂度要低的多。

      其缺点是:

      • 每个“变换”中,滤波器的数量和尺寸等超参数都需要精细的设计。
      • 一旦需要训练新的任务(如新任务是一个NLP 任务),可能需要重新设计网络结构。因此可扩展性不高。
    • ResNeXt 结合了二者的优点:

      • 网络结构也是通过简单地层叠相同结构的层来实现。
      • 网络的每一层都执行了分裂-变换-合并策略。
  3. 在相同的参数数量和计算复杂度的情况下,ResNeXt 的预测性能要优于ResNet

    • 它在ILSVRC 2016 分类任务中取得了第二名的成绩。
    • 101 层的ResNeXt 就能够获得超过200ResNet 的准确率,并且计算量只有后者的一半。
  4. ResNeXt 改进了ResNet 网络结构,并提出了一个新的维度,称作“基数”cardinality。基数是网络的深度和网络的宽度之外的另一个重要因素。

    作者通过实验表明:增加基数比增加网络的深度或者网络的宽度更有效。

6.2.1 分裂-变换-合并

  1. 考虑全连接网络中的一个神经元。假设输入为 $ MathJax-Element-208 $ ,为一个一度的输入向量(长度为 $ MathJax-Element-212 $ )。假设对应的权重为 $ MathJax-Element-210 $ 。不考虑偏置和激活函数,则神经元的输出为: $ MathJax-Element-211 $ 。

    它可以视作一个最简单的“分裂-变换-合并”:

    • 分裂:输入被分割成 $ MathJax-Element-212 $ 个低维(维度为零)嵌入。
    • 变换:每个低维嵌入通过对应的权重 $ MathJax-Element-213 $ 执行线性变换。
    • 合并:变换之后的结果通过直接相加来合并。
  2. Inception 的“分裂-变换-合并”策略:

    • 分裂:输入通过1x1 卷积被分割成几个低维嵌入。
    • 变换:每个低维嵌入分别使用一组专用滤波器(3x35x5 等) 执行变换。
    • 合并:变换之后的结果进行合并(沿深度方向拼接)。
  3. 对一个ResNeXt 块,其“分裂-变换-合并”策略用公式表述为:

    $ \mathcal F(\mathbf{\vec x}) = \sum_{i=1}^C\mathcal T_i(\mathbf{\vec x}),\quad \mathbf{\vec y}=\mathbf{\vec x}+\mathcal F(\mathbf{\vec x}) $

    其中:

    • $ MathJax-Element-220 $ 为任意函数,它将 $ MathJax-Element-221 $ 映射为 $ MathJax-Element-221 $ 的一个低维嵌入,并对该低维嵌入执行转换。
    • $ MathJax-Element-712 $ 为转换的数量,也就是基数cardinality
  4. ResNeXt 中,为了设计方便 $ MathJax-Element-220 $ 采取以下设计原则:

    • 所有的 $ MathJax-Element-220 $ 具有相同的结构。这是参考了VGG 的层叠相同结构的层的思想。

    • $ MathJax-Element-220 $ 的结构通常是:

      • 第一层:执行1x1 的卷积来产生 $ MathJax-Element-221 $ 的一个低维嵌入。
      • 第二层 ~ 倒数第二层:执行卷积、池化等等变换。
      • 最后一层:执行1x1 的卷积来将结果提升到合适的维度。

6.2.2 ResNeXt 块

  1. 一个ResNeXt 模块执行了一组相同的“变换”,每一个“变换”都是输入的一个低维嵌入,变换的数量就是基数 C

    如下所示:左图为ResNet 块;右图为ResNeXt 块。

  2. ResNeXt 模块有两种等效的形式:图(a) 为标准形式,图(b)类似Inception-ResNet 模块。其中图(b) 的拼接是沿着深度方向拼接。

    • 等效的原因是:输入通道数为1281x1 卷积可以如下拆分:( 设输入张量为 $ MathJax-Element-222 $ ,输出张量为 $ MathJax-Element-223 $ ,核张量为 $ MathJax-Element-499 $ )

      $ \mathbf O_{i,j,k}=\sum_{s=1}^{128} \mathbf I_{s,j,k}\times \mathbf K_{i,s}\\ =\left(\sum_{s=1}^{4} \mathbf I_{s,j,k}\times \mathbf K_{i,s}\right)+\left(\sum_{s=5}^{8} \mathbf I_{s,j,k}\times \mathbf K_{i,s}\right)+\cdots+\left(\sum_{s=124}^{128} \mathbf I_{s,j,k}\times \mathbf K_{i,s}\right)\\ i = 1,2,\cdots,256 $

      经过这种拆分,图(b) 就等效于图(a)。其中: $ MathJax-Element-619 $ 表示输出单元位于 $ MathJax-Element-619 $ 通道, $ MathJax-Element-323 $ 表示输入单元位于 $ MathJax-Element-323 $ 通道, $ MathJax-Element-229 $ 表示通道中的坐标。

      本质原因是1x1 卷积是简单的对通道进行线性相加。它可以拆分为:先将输入通道分组,然后计算各组的子通道的线性和(1x1 卷积);然后将所有组的和相加。

    • (b)Inception-ResNet 模块的区别在于:这里每一条路径都是相同的。

    • (c) 是一个分组卷积的形式,它就是用分组卷积来实现图(b)。它也是图(b) 在代码中的实现方式。

  3. 通常ResNeXt 模块至少有三层。事实上它也可以有两层,此时它等效于一个宽的、密集模块。

    • 此时并没有通过 1x1 卷积进行降维与升维,而是在降维的过程中同时进行变换,在升维的过程中也进行变换。
    • 如下图所示,它等价于图(c) 中,去掉中间的变换层(128,3x3,128 层),同时将第一层、第三层的 1x1 替换为3x3 卷积层。

6.2.3 网络性能

  1. ResNeXt 的两种重要超参数是:基数C 和颈宽d

    • 基数 C:决定了每个ResNeXt 模块有多少条路径。
    • 颈宽(bottleneck widthd:决定了ResNeXt 模块中第一层1x1 卷积降维的维度。

    这二者也决定了ResNeXt 模块等价形式中,通道分组卷积的通道数量为 Cxd

  2. ResNeXt 的网络参数和计算量与同等结构的ResNet 几乎相同。以ResNet-50 为例(输入图片尺寸224x224 ):

    ResNeXt-50(32x4d) 意思是:基数C=32,颈宽d=4

  3. ImageNet 上进行的对比实验(验证集误差,single crop ):

    • 基数 vs 颈宽:基数越大越好。

      模型配置top-1 error(%)
      ResNet-50C=1,d=6423.9
      ResNeXt-50C=2,d=4023.0
      ResNeXt-50C=4,d=2422.6
      ResNeXt-50C=8,d=1422.3
      ResNeXt-50C=32,d=422.2
      ResNet-101C=1,d=6422.0
      ResNeXt-101C=2,d=4021.7
      ResNeXt-101C=4,d=2421.4
      ResNeXt-101C=8,d=1421.3
      ResNeXt-101C=32,d=421.2
    • 基数 vs 深度/宽度:基数越大越好。

  4. 与其它模型的预测能力比较(验证集误差,single crop):

    ResNet/ResNeXt 的图片尺寸为224x224320x320Inception 的图片尺寸为299x299

6.3 随机深度网络

  1. 随机深度网络提出了训练时随机丢弃网络层的思想,从而能够让网络深度增加到超过1000层,并仍然可以减少测试误差。

    如图所示:在CIFAR-10 上,1202 层的ResNet 测试误差要高于 110 层的ResNet ,表现出明显的过拟合。而 1202 层的随机深度网络(结合了ResNet )的测试误差要低于 110 层的ResNet

  2. 神经网络的表达能力主要由网络深度来决定,但是过深的网络会带来三个问题:反向传播过程中的梯度消失、前向传播过程中的feature 消失、训练时间过长。

    • 虽然较浅的网络能够缓解这几个问题,但是较浅的网络表达能力不足,容易陷入欠拟合。

    • 随机深度网络解决这一矛盾的策略是:构建具有足够表达能力的深度神经网络(具有数百层甚至数千层),然后:

      • 在网络训练期间,对每个mini batch 随机地移除部分层来显著的减小网络的深度。

        移除操作:删除对应的层,并用跳跃连接来代替。

      • 在网络测试期间,使用全部的网络层。

  3. 随机深度的思想可以和ResNet 结合。因为ResNet 已经包含了跳跃连接,因此可以直接修改。

6.3.1 随机深度

  1. 假设ResNet 有 $ MathJax-Element-696 $ 个残差块,则有: $ MathJax-Element-231 $ 。其中:

    • $ MathJax-Element-232 $ 表示第 $ MathJax-Element-642 $ 个残差块的输出, $ MathJax-Element-333 $ 为第 $ MathJax-Element-642 $ 个残差块的输入(它也是第 $ MathJax-Element-236 $ 个残差块的输出)。
    • $ MathJax-Element-335 $ 为一组与第 $ MathJax-Element-642 $ 个残差单元相关的权重(包括偏置项), $ MathJax-Element-689 $ 是残差单元中的层的数量。
    • $ MathJax-Element-338 $ 代表残差函数。
  2. 假设第 $ MathJax-Element-642 $ 个残差块是否随机丢弃由伯努利随机变量 $ MathJax-Element-242 $ 来指示:当 $ MathJax-Element-243 $ 时,第 $ MathJax-Element-642 $ 个残差块被丢弃;当 $ MathJax-Element-245 $ 时,第 $ MathJax-Element-642 $ 个残差块被保留。

    因此有: $ MathJax-Element-247 $ 。

    对随机变量 $ MathJax-Element-248 $ ,令:

    $ P(b_l)=\begin{cases} p_l,&b_l=1\\ 1-p_l ,&b_l=0 \end{cases} $

    其中 $ MathJax-Element-259 $ 称做保留概率或者存活概率,它是一个非常重要的超参数。

  3. $ MathJax-Element-259 $ 的选择有两个策略:

    • 所有残差块的存活概率都相同: $ MathJax-Element-251 $ 。

    • 所有残差块的存活概率都不同,且根据残差块的深度进行线性衰减:

      $ p_l=1-\frac {l+1}L(1-p_L),\quad l=0,1,\cdots,L-1 $

      其背后的思想是:靠近输入的层提取的是被后续层使用的低级特征,因此更应该被保留下来。

  4. 给定第 $ MathJax-Element-642 $ 个残差块的保留概率 $ MathJax-Element-259 $ ,则网络的深度 $ MathJax-Element-254 $ 的期望为(以残差块数量为单位): $ MathJax-Element-255 $ 。

    • 对于均匀存活: $ MathJax-Element-256 $

    • 对于线性衰减存活:

      $ \mathbb E(\tilde L)=\frac{(1+p_L)\times L-(1-p_L)}{2} $

      当 $ MathJax-Element-257 $ 时,无论是均匀存活还是线性衰减存活,都满足 $ MathJax-Element-258 $ 。因此随机深度网络在训练时具有更短的期望深度,从而节省了训练时间。

  5. $ MathJax-Element-259 $ 的选择策略,以及 $ MathJax-Element-268 $ 的大小的选取需要根据实验仔细选择。

    • 根据作者的实验结果,作者推荐使用线性衰减存活概率,并选择 $ MathJax-Element-266 $ 。此时有: $ MathJax-Element-262 $
    • 如果选择更小的 $ MathJax-Element-268 $ 将会带来更大的测试误差,但是会更大的加速训练过程。

  6. 测试时,需要调整残差块的输出: $ MathJax-Element-264 $ 。

  7. 随机深度网络能够大大减少训练时间和测试误差。

    • 训练时间减小是因为:网络训练时,期望深度减小。

    • 测试误差减小是因为:

      • 网络训练时期望深度的减少,使得梯度链变短,从而加强了反向传播期间靠近输入层的梯度。
      • 随机深度网络可以被理解为一系列不同深度的网络的隐式集成的集成模型。
  8. 随机深度网络可以视作 $ MathJax-Element-265 $ 个隐式的神经网络的集成,这些被集成的网络都是权重共享的,类似于Dropout

    • 在训练时,对每个mini batch,只有其中之一得到了权重更新。
    • 在测试时,取所有被集成的网络的平均。
  9. 随机深度网络和 Dropout 都可以被理解为一系列网络的隐式集成。

    • 随机深度集网络成了一系列具有不同深度的神经网络,而 Dropout集成了一系列具有不同宽度的神经网络。
    • DropoutBN配合使用时会失效,而随机深度可以和BN 配合使用。
  10. 在随机深度网络中,由于训练时的随机深度,模型的测试误差的抖动相对于ResNet 会偏大。

6.3.2 网络性能

  1. ResNet (固定深度和随机深度)在三个数据集上进行比较,测试误差的结果如下:

    • + 表示执行了数据集增强。

    • 随机深度网络采用 $ MathJax-Element-266 $ 。

    • CIFAR10/100 采用 110 层 ResNetImageNet 采用 152 层 ResNet

    • 虽然在 ImageNet 上随机深度模型没有提升,但是作者表示这是因为网络本身比较简单(相对 ImageNet 数据集)。如果使用更深的ResNet,则容易看到随机深度模型的提升。

      虽然这里模型的测试误差没有提升,但是训练速度大幅提升。

    网络CIFAR10+CIFAR100+ImageNet
    ResNet(固定深度)6.4127.7621.78
    ResNet(随机深度)5.2524.9821.98
  2. CIFAR-10 上,ResNet 随机深度网络的深度 $ MathJax-Element-696 $ 、概率 $ MathJax-Element-268 $ 与测试集误差的关系:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文