深度神经网络激活函数 深度神经网络权重初始化
淘宝搜:【天降红包222】领超级红包,京东搜:【天降红包222】
淘宝互助,淘宝双11微信互助群关注公众号 【淘姐妹】
激活函数对神经网络的重要性自不必多言,机器之心也曾发布过一些相关的介绍文章,比如《一文概览深度学习中的激活函数》。本文同样关注的是激活函数。来自丹麦技术大学的 Casper Hansen 通过公式、图表和代码实验介绍了 sigmoid、ReLU、ELU 以及更新的 Leaky ReLU、SELU、GELU 这些激活函数,并比较了它们的优势和短板。
在计算每一层的激活值时,我们要用到激活函数,之后才能确定这些激活值究竟是多少。根据每一层前面的激活、权重和偏置,我们要为下一层的每个激活计算一个值。但在将该值发送给下一层之前,我们要使用一个激活函数对这个输出进行缩放。本文将介绍不同的激活函数。
在阅读本文之前,你可以阅读我前一篇介绍神经网络中前向传播和反向传播的文章,其中已经简单地提及过激活函数,但还未介绍其实际所做的事情。本文的内容将建立在你已了解前一篇文章知识的基础上。
前一篇文章地址:https://mlfromscratch.com/neural-networks-explained/
Casper Hansen
目录
- 概述
- sigmoid 函数是什么?
- 梯度问题:反向传播
- 梯度消失问题
- 梯度爆炸问题
- 梯度爆炸的极端案例
- 避免梯度爆炸:梯度裁剪/范数
- 整流线性单元(ReLU)
- 死亡 ReLU:优势和缺点
- 指数线性单元(ELU)
- 渗漏型整流线性单元(Leaky ReLU)
- 扩展型指数线性单元(SELU)
- SELU:归一化的特例
- 权重初始化+dropout
- 高斯误差线性单元(GELU)
- 代码:深度神经网络的超参数搜索
- 扩展阅读:书籍与论文
概述
激活函数是神经网络中一个至关重要的部分。在这篇长文中,我将全面介绍六种不同的激活函数,并阐述它们各自的优缺点。我会给出激活函数的方程和微分方程,还会给出它们的图示。本文的目标是以简单的术语解释这些方程以及图。
我会介绍梯度消失和爆炸问题;对于后者,我将按照 Nielsen 提出的那个很赞的示例来解释梯度爆炸的原因。
最后,我还会提供一些代码让你可以自己在 Jupyter Notebook 中运行。
我会在 MNIST 数据集上进行一些小型代码实验,为每个激活函数都获得一张损失和准确度图。
sigmoid 函数是什么?
sigmoid 函数是一个 logistic 函数,意思就是说:不管输入是什么,得到的输出都在 0 到 1 之间。也就是说,你输入的每个神经元、节点或激活都会被缩放为一个介于 0 到 1 之间的值。
sigmoid 函数图示。
sigmoid 这样的函数常被称为非线性函数,因为我们不能用线性的项来描述它。很多激活函数都是非线性或者线性和非线性的组合(有可能函数的一部分是线性的,但这种情况很少见)。
这基本上没什么问题,但值恰好为 0 或 1 的时候除外(有时候确实会发生这种情况)。为什么这会有问题?
这个问题与反向传播有关(有关反向传播的介绍请参阅我的前一篇文章)。在反向传播中,我们要计算每个权重的梯度,即针对每个权重的小更新。这样做的目的是优化整个网络中激活值的输出,使其能在输出层得到更好的结果,进而实现对成本函数的优化。
在反向传播过程中,我们必须计算每个权重影响成本函数(cost function)的比例,具体做法是计算成本函数相对于每个权重的偏导数。假设我们不定义单个的权重,而是将最后一层 L 中的所有权重 w 定义为 w^L,则它们的导数为:
注意,当求偏导数时,我们要找到 ?a^L 的方程,然后仅微分 ?z^L,其余部分保持不变。我们用撇号「'」来表示任意函数的导数。当计算中间项 ?a^L/?z^L 的偏导数时,我们有:
则 sigmoid 函数的导数就为:
当我们向这个 sigmoid 函数输入一个很大的 x 值(正或负)时,我们得到几乎为 0 的 y 值――也就是说,当我们输入 w×a+b 时,我们可能得到一个接近于 0 的值。
sigmoid 函数的导数图示。
当 x 是一个很大的值(正或负)时,我们本质上就是用一个几乎为 0 的值来乘这个偏导数的其余部分。
如果有太多的权重都有这样很大的值,那么我们根本就没法得到可以调整权重的网络,这可是个大问题。如果我们不调整这些权重,那么网络就只有细微的更新,这样算法就不能随时间给网络带来多少改善。对于针对一个权重的偏导数的每个计算,我们都将其放入一个梯度向量中,而且我们将使用这个梯度向量来更新神经网络。可以想象,如果该梯度向量的所有值都接近 0,那么我们根本就无法真正更新任何东西。
这里描述的就是梯度消失问题。这个问题使得 sigmoid 函数在神经网络中并不实用,我们应该使用后面介绍的其它激活函数。
梯度问题
梯度消失问题
我的前一篇文章说过,如果我们想更新特定的权重,则更新规则为:
但如果偏导数 ?C/?w^(L) 很小,如同消失了一般,又该如何呢?这时我们就遇到了梯度消失问题,其中许多权重和偏置只能收到非常小的更新。
可以看到,如果权重的值为 0.2,则当出现梯度消失问题时,这个值基本不会变化。因为这个权重分别连接了第一层和第二层的首个神经元,所以我们可以用
的表示方式将其记为
假设这个权重的值为 0.2,给定一个学习率(具体多少不重要,这里使用了 0.5),则新的权重为:
这个权重原来的值为 0.2,现在更新为了 0.199999978。很明显,这是有问题的:梯度很小,如同消失了一样,使得神经网络中的权重几乎没有更新。这会导致网络中的节点离其最优值相去甚远。这个问题会严重妨碍神经网络的学习。
人们已经观察到,如果不同层的学习速度不同,那么这个问题还会变得更加严重。层以不同的速度学习,前面几层总是会根据学习率而变得更差。
出自 Nielsen 的书《Neural Networks and Deep Learning》。
在这个示例中,隐藏层 4 的学习速度最快,因为其成本函数仅取决于连接到隐藏层 4 的权重变化。我们看看隐藏层 1;这里的成本函数取决于连接隐藏层 1 与隐藏层 2、3、4 的权重变化。如果你看过了我前一篇文章中关于反向传播的内容,那么你可能知道网络中更前面的层会复用后面层的计算。
同时,如前面介绍的那样,最后一层仅取决于计算偏导时出现的一组变化:
最终,这就是个大问题了,因为现在权重层的学习速度不同。这意味着网络中更后面的层几乎肯定会被网络中更前面的层受到更多优化。
而且问题还在于反向传播算法不知道应该向哪个方向传递权重来优化成本函数。
梯度爆炸问题
梯度爆炸问题本质上就是梯度消失问题的反面。研究表明,这样的问题是可能出现的,这时权重处于「爆炸」状态,即它们的值快速增长。
我们将遵照以下示例来进行说明:
- http://neuralnetworksanddeeplearning.com/chap5.html#what's_causing_the_vanishing_gradient_problem_unstable_gradients_in_deep_neural_nets
注意,这个示例也可用于展示梯度消失问题,而我是从更概念的角度选择了它,以便更轻松地解释。
本质上讲,当 0<w<1 时,我们可能遇到梯度消失问题;当 w>1 时,我们可能遇到梯度爆炸问题。但是,当一个层遇到这个问题时,必然有更多权重满足梯度消失或爆炸的条件。
我们从一个简单网络开始。这个网络有少量权重、偏置和激活,而且每一层也只有一个节点。
这个网络很简单。权重表示为 w_j,偏置为 b_j,成本函数为 C。节点、神经元或激活表示为圆圈。
Nielsen 使用了物理学上的常用表示方式 Δ 来描述某个值中的变化(这不同于梯度符号 ?)。举个例子,Δb_j 描述的是第 j 个偏置的值变化。
我前一篇文章的核心是我们要衡量与成本函数有关的权重和偏置的变化率。先不考虑层,我们看看一个特定的偏置,即第一个偏置 b_1。然后我们通过下式衡量变化率:
下面式子的论据和上面的偏导一样。即我们如何通过偏置的变化率来衡量成本函数的变化率?正如刚才介绍的那样,Nielsen 使用 Δ 来描述变化,因此我们可以说这个偏导能大致通过 Δ 来替代:
权重和偏置的变化可以进行如下可视化:
动图出自 3blue1brown,视频地址:https://www.youtube.com/watch?v=tIeHLnjs5U8。
我们先从网络的起点开始,计算第一个偏置 b_1 中的变化将如何影响网络。因为我们知道,在上一篇文章中,第一个偏置 b_1 会馈入第一个激活 a_1,我们就从这里开始。我们先回顾一下这个等式:
如果 b_1 改变,我们将这个改变量表示为 Δb_1。因此,我们注意到当 b_1 改变时,激活 a_1 也会改变――我们通常将其表示为 ?a_1/?b_1。
因此,我们左边有偏导的表达式,这是 b_1 中与 a_1 相关的变化。但我们开始替换左边的项,先用 z_1 的 sigmoid 替换 a_1:
上式表示当 b_1 变化时,激活值 a_1 中存在某个变化。我们将这个变化描述为 Δa_1。
我们将变化 Δa_1 看作是与激活值 a_1 中的变化加上变化 Δb_1 近似一样。
这里我们跳过了一步,但本质上讲,我们只是计算了偏导数,并用偏导的结果替代了分数部分。
a_1 的变化导致 z_2 的变化
所描述的变化 Δa_1 现在会导致下一层的输入 z_2 出现变化。如果这看起来很奇怪或者你还不信服,我建议你阅读我的前一篇文章。
表示方式和前面一样,我们将下一个变化记为 Δz_2。我们又要再次经历前面的过程,只是这次要得到的是 z_2 中的变化:
我们可以使用下式替代 Δa_1:
我们只计算这个式子。希望你清楚地明白到这一步的过程――这与计算 Δa_1 的过程一样。
这个过程会不断重复,直到我们计算完整个网络。通过替换 Δa_j 值,我们得到一个最终函数,其计算的是成本函数中与整个网络(即所有权重、偏置和激活)相关的变化。
基于此,我们再计算 ?C/?b_1,得到我们需要的最终式:
梯度爆炸的极端案例
据此,如果所有权重 w_j 都很大,即如果很多权重的值大于 1,我们就会开始乘以较大的值。举个例子,所有权重都有一些非常高的值,比如 100,而我们得到一些在 0 到 0.25 之间、 sigmoid 函数导数的随机输出:
最后一个偏导为
,可以合理地相信这会远大于 1,但为了方便示例展示,我们将其设为 1。
使用这个更新规则,如果我们假设 b_1 之前等于 1.56,而学习率等于 0.5。
尽管这是一个极端案例,但你懂我的意思。权重和偏置的值可能会爆发式地增大,进而导致整个网络爆炸。
现在花点时间想想网络的权重和偏置以及激活的其它部分,爆炸式地更新它们的值。这就是我们所说的梯度爆炸问题。很显然,这样的网络学不到什么东西,因此这会完全毁掉你想要解决的任务。
避免梯度爆炸:梯度裁剪/规范
解决梯度爆炸问题的基本思路就是为其设定一个规则。这部分我不会深入进行数学解释,但我会给出这个过程的步骤:
- 选取一个阈值――如果梯度超过这个值,则使用梯度裁剪或梯度规范;
- 定义是否使用梯度裁剪或规范。如果使用梯度裁剪,你就指定一个阈值,比如 0.5。如果这个梯度值超过 0.5 或 -0.5,则要么通过梯度规范化将其缩放到阈值范围内,要么就将其裁剪到阈值范围内。
但是要注意,这些梯度方法都不能避免梯度消失问题。所以我们还将进一步探索解决这个问题的更多方法。通常而言,如果你在使用循环神经网络架构(比如 LSTM 或 GRU),那么你就需要这些方法,因为这种架构常出现梯度爆炸的情况。
整流线性单元(ReLU)
整流线性单元是我们解决梯度消失问题的方法,但这是否会导致其它问题呢?请往下看。
ReLU 的公式如下:
ReLU 公式表明:
- 如果输入 x 小于 0,则令输出等于 0;
- 如果输入 x 大于 0,则令输出等于输入。
尽管我们没法用大多数工具绘制其图形,但你可以这样用图解释 ReLU。x 值小于零的一切都映射为 0 的 y 值,但 x 值大于零的一切都映射为它本身。也就是说,如果我们输入 x=1,我们得到 y=1。
ReLU 激活函数图示。
这很好,但这与梯度消失问题有什么关系?首先,我们必须得到其微分方程:
其意思是:
- 如果输入 x 大于 0,则输出等于 1;
- 如果输入小于或等于 0,则输出变为 0。
用下图表示:
已微分的 ReLU。
现在我们得到了答案:当使用 ReLU 激活函数时,我们不会得到非常小的值(比如前面 sigmoid 函数的 0.0000000438)。相反,它要么是 0(导致某些梯度不返回任何东西),要么是 1。
但这又催生出另一个问题:死亡 ReLU 问题。
如果在计算梯度时有太多值都低于 0 会怎样呢?我们会得到相当多不会更新的权重和偏置,因为其更新的量为 0。要了解这个过程的实际表现,我们反向地看看前面梯度爆炸的示例。
我们在这个等式中将 ReLU 记为 R,我们只需要将每个 sigmoid σ 替换成 R:
现在,假如说这个微分后的 ReLU 的一个随机输入 z 小于 0――则这个函数会导致偏置「死亡」。假设是 R'(z_3)=0:
反过来,当我们得到 R'(z_3)=0 时,与其它值相乘自然也只能得到 0,这会导致这个偏置死亡。我们知道一个偏置的新值是该偏置减
如何配置openfiler网络存储 openfiler多路径配置
如何配置OpenCore,如何配置OpenGL,如何配置助听器,如何配置一台好的电脑第一章?本篇总览
?
之前发布了一篇《Oracle_lhr_RAC 12cR1安装》,但是其中的存储并没有使用多路径,而是使用了VMware自身提供的存储。所以,年前最后一件事就是把多路径学习一下,本文介绍了OpenFiler、iSCSI和多路径的配置。
本文内容:
?
?
第二章?安装OpenFilerOpenFile是在rPath Linux基础上开发的,它能够作为一个独立的Linux操作系统发行。Openfiler是一款非常好的存储管理操作系统,开源免费,通过web界面对存储磁盘的管理,支持现在流行的网络存储技术IP-SAN和NAS,支持iSCSI、NFS、SMB/CIFS及FTP等协议。
本次安装OpenFiler锁需要的软件如下所示:
序号 | 类型 | 内容 |
1 | openfiler | openfileresa-2.99.1-x86_64-disc1.iso |
注:这些软件小麦苗已上传到腾讯微云(http://blog.itpub.net/26736162/viewspace-1624453/),各位朋友可以去下载。另外,小麦苗已经将安装好的虚拟机上传到了云盘,里边已集成了rlwrap软件。
详细安装过程小麦苗就不一个一个截图了,网上已经有网友贴出了一步一步的过程,OpenFiler的内存设置为1G大小或再小点也无所谓,磁盘选用IDE磁盘格式,由于后续要配置多路径,所以需要安装2块网卡。安装完成后,重新启动,界面如下所示:
?
?
注意,方框中的内容,可以在浏览器中直接打开。可以用root用户登录进行用户的维护,若进行存储的维护则只能使用openfiler用户。openfiler是在远程使用Web界面进行管理的,小麦苗这里的管理地址是https://192.168.59.200:446,其管理的初始用户名是openfiler(小写的),密码是password,可以在登录之后,修改这个密码。
?
?
?
配置静态网卡地址:
[root@OFLHR ~]# more /etc/sysconfig/network-scripts/ifcfg-eth0 # Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] DEVICE=eth0 BOOTPROTO=static BROADCAST=192.168.59.255 HWADDR=00:0C:29:98:1A:CD IPADDR=192.168.59.200 NETMASK=255.255.255.0 NETWORK=192.168.59.0 ONBOOT=yes [root@OFLHR ~]# more /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 MTU=1500 USERCTL=no ONBOOT=yes BOOTPROTO=static IPADDR=192.168.2.200 NETMASK=255.255.255.0 HWADDR=00:0C:29:98:1A:D7 [root@OFLHR ~]# ip a 1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue ? link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 ? inet 127.0.0.1/8 scope host lo ? inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 ? link/ether 00:0c:29:98:1a:cd brd ff:ff:ff:ff:ff:ff ? inet 192.168.59.200/24 brd 192.168.59.255 scope global eth0 ? inet6 fe80::20c:29ff:fe98:1acd/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000 ? link/ether 00:0c:29:98:1a:d7 brd ff:ff:ff:ff:ff:ff ? inet 192.168.2.200/24 brd 192.168.2.255 scope global eth1 ? inet6 fe80::20c:29ff:fe98:1ad7/64 scope link valid_lft forever preferred_lft forever [root@OFLHR ~]# ? |
?
添加一块100G大小的IDE格式的硬盘作为存储。
?
[root@OFLHR ~]# fdisk -l ? Disk /dev/sda: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors Units=sectors of 1 * 512=512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000adc2c ? Device Boot? Start End? Blocks Id? System /dev/sda1 *? 63? 610469? 305203+? 83? Linux /dev/sda2? 610470? 17382329 8385930 83? Linux /dev/sda3? 17382330? 19486844 1052257+? 82? Linux swap / Solaris ? Disk /dev/sdb: 107.4 GB, 107374182400 bytes 255 heads, 63 sectors/track, 13054 cylinders, total 209715200 sectors Units=sectors of 1 * 512=512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 ? Disk /dev/sdb doesn't contain a valid partition table [root@OFLHR ~]# ? |
?
为openfiler服务器配置了两块硬盘,其中10GB的硬盘已经用来安装openfiler操作系统,而200GB的硬盘则会用做数据存储。
?
登录地址:https://192.168.59.200:446
初始用户名和密码:openfiler/password
?
在独立存储设备中,LUN(Logical Unit Number)是最重要的基本单位。LUN可以被SAN中的任何主机访问,不管是透过HBA或是iSCSI。就算是软件激活的iSCSI,也可以在不同的操作系统之下,在操作系统启动之后利用软件的iSCSI initiator访问LUN。在OpenFiler之下,LUN被称为Logical Volume(LV),因此在OpenFiler下创建LUN就是创建LV。
当你安装好OpenFiler之后,接下来就是要将OpenFiler下的磁盘分享出来给虚拟机或网络上的其他主机使用了。在标准的SAN之后,这些可以在RAID层面完成,但VG的好处及弹性是RAID无法比较的,下面看看OpenFiler下的VG是如何一步一步创建的。
?创建VG的步骤:
(1)进入OpenFiler的接口,并且选择要使用的实体硬盘。
(2)将要加入的实体硬盘格式化成Physical Volume格式。
(3)创建一个VG组,并且将格式化成为PV格式的实体硬盘加入。
(4)加入完毕之后,就成为一个大的VG组,被视为系统的一个大实体硬盘。
(5)在这个VG中添加逻辑分割区LUN,在OpenFiler中称为Logical Volume。
(6)指定LUN的文件格式,如iSCSI、ext3或是NFS,并且格式化。
(7)如果是iSCSI则需要再配置,如果是其他文件格式,就可以用NAS的方式分享出去而
?
?
登录后,点击Volumes标签
为openfiler服务器配置了两块硬盘,其中10GB的硬盘已经用来安装openfiler操作系统,而200GB的硬盘则会用做数据存储。
?
?
点击create new physical volumes后点击/dev/sdb
?
点击页面右下角Reset,然后点击Create。分区类型为Physical volume
?
点击Volume Groups
?
?
输入名称,勾选复选框,单击Add volume group
?
[root@OFLHR ~]# fdisk -l ? Disk /dev/sda: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors Units=sectors of 1 * 512=512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000adc2c ? Device Boot? Start End? Blocks Id? System /dev/sda1 *? 63? 610469? 305203+? 83? Linux /dev/sda2? 610470? 17382329 8385930 83? Linux /dev/sda3? 17382330? 19486844 1052257+? 82? Linux swap / Solaris ? WARNING: GPT (GUID Partition Table) detected on '/dev/sdb'! The util fdisk doesn't support GPT. Use GNU Parted. ? ? Disk /dev/sdb: 107.4 GB, 107374182400 bytes 255 heads, 63 sectors/track, 13054 cylinders, total 209715200 sectors Units=sectors of 1 * 512=512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 ? Device Boot? Start End? Blocks Id? System /dev/sdb1 1 209715199 104857599+? ee? GPT [root@OFLHR ~]# pvs ? PV VG? Fmt? Attr PSize? PFree ? /dev/sdb1? vmlhr lvm2 a- 95.34g 95.34g [root@OFLHR ~]# ? |
?
点击Add Volume
?
?
输入内容,调整磁盘大小为10G,卷类型选择block(iSCSI,FC,etc)
?
?
依次共创建4个逻辑卷:
?
[root@OFLHR ~]# vgs ? VG? #PV #LV #SN Attr VSize? VFree ? vmlhr 1 4 0 wz--n- 95.34g 55.34g [root@OFLHR ~]# pvs ? PV VG? Fmt? Attr PSize? PFree ? /dev/sdb1? vmlhr lvm2 a- 95.34g 55.34g [root@OFLHR ~]# lvs ? LV VG? Attr LSize? Origin Snap%? Move Log Copy%? Convert ? lv01 vmlhr -wi-a- 10.00g? ? lv02 vmlhr -wi-a- 10.00g? ? lv03 vmlhr -wi-a- 10.00g? ? lv04 vmlhr -wi-a- 10.00g? [root@OFLHR ~]# fdisk -l ? Disk /dev/sda: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders, total 209715 如何下载chatgpt苹果版1首先打开浏览器2其次打开chatgpt官网3然后点击下载安装即可ChatGPT是GPT3的衍生产品,自称为“一个训练有素的语言模型”,由人工智能研究机构OpenAI研发,处于公测阶段,用户完成注册登录后即可免费进行聊天互动。 chatgpt国内通过官网入口上,具体操作步骤如下1打开chatgpt官网入口2使用邮箱注册后,绑定海外手机号3进入之后即可在下方的对话框处,输入文字和智能助手对话生成原创的文章。 网络问题,chapgpt是一个程序的官网,其中登录不了是一位网络问题,刷新网络即可ChatGPT是是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理网站。 字符,超过字符则无法生成回答6 如何稳定地调用ChatGPT的回答网页版。 ChatGPT 是由 OpenAI 公司开放的免费 AI 聊天机器人服务,这几天关于免费AI聊天机器人服务,引起了大家的高度关注就目前的现状而言,是不会开源的首先我们先要了解人工智能研究实验室,OpenAI 是由营利组织 OpenAI LP 与。 国内在2024年可以有chatgpt根据查询相关资料显示,国内在2024年会引入chatgpt软件,由于版权与开发商问题,需要作进一步交流具体可以自行上网搜索。 chatgpt登录没反应可以如下操作1检查网络连接是否正常,确保网络正常后再重新登录尝试,可使用TGP登陆游戏并进行网络加速2尽量关闭计算机其他程序,避免占用过多网络资源3此情况也可能是病毒或者第三方插件导致,对。 版权声明:除非特别标注原创,其它均来自互联网,转载时请以链接形式注明文章出处。
|