DeepLearning.AI第一部分第四周:深层神经网络

4.1深层神经网络(Deep L-layer neural network)

接"DeepLearning.AI第一部分第三周"
在这里插入图片描述上图左边是逻辑回归,右边是一个隐层的神经网络。
在这里插入图片描述上图左边是两个隐藏层的神经网络,右边是五个隐藏层的神经网络。严格上来说逻辑回归也是一个一层的神经网络,而上边右图一个深得多的模型,浅与深仅仅是指一种程度。记住以下要点:有一个隐藏层的神经网络,就是一个两层神经网络。记住当我们算神经网络的层数时,我们不算输入层,我们只算隐藏层和输出层。但是在过去的几年中,DLI (深度学习学院 deep learning institute)已经意识到有一些函数,只有非常深的神经网络能学会,而更浅的模型则办不到。尽管对于任何给定的问题很难去提前预测到底需要多深的神经网络,所以先去尝试逻辑回归,尝试一层然后两层隐含层,然后把隐含层的数量看做是另一个可以自由选择大小的超参数,然后再保留交叉验证数据上评估,或者用你的开发集来评估。
在这里插入图片描述- 对于上图的一些,符号定义:上图是一个四层的神经网络,有三个隐藏层。我们可以看到,第一层(即左边数过去第二层,因为输入层是第 0 层)有 5 个神经元数目,第二层 5 个,第三层 3 个。我们用 L L L 表示层数,上图: L = 4 L = 4 L=4,输入层的索引为“0”,第一个隐藏层 n [ 1 ] = 5 n^{[1]}=5 n[1]=5,表示有 5个隐藏神经元,同理 n [ 2 ] = 5 , n [ 3 ] = 3 , n [ 4 ] = n [ L ] = 1 n^{[2]} = 5,n^{[3]} = 3,n^{[4]} =n^{[L]} = 1 n[2]=5,n[3]=3,n[4]=n[L]=1(输出单元为 1)。而输入层, n [ 0 ] = n x = 3 n^{[0]}=n_x = 3 n[0]=nx=3。在不同层所拥有的神经元的数目,对于每层 l l l 都用 a [ l ] a^{ [l]} a[l]来记作 l l l 层激活后结果,我们会在后面看到在正向传播时,最终会计算出 a [ l ] a^{ [l]} a[l]。通过用激活函数 g g g 计算 z [ l ] z^{[l]} z[l] ,激活函数也被索引为层数 l l l,然后我们用 w [ l ] w^{[l]} w[l] 来记作在 l l l 层计算 z [ l ] z^{ [l]} z[l] 值的权重。类似的,计算 z [ l ] z^{[l]} z[l] 的方程中的 b [ l ] b^{[l]} b[l] 也一样。最后总结下符号约定:输入的特征记作 x x x,但是 x x x同样也是 0 层的激活函数,所以 x = a [ 0 ] x = a^{ [0]} x=a[0] 。最后一层的激活函数,所以 a [ L ] a^{[L]} a[L] 是等于这个神经网络所预测的输出结果。

4.2前向传播和反向传播(Forward and backward propagation)

之前我们学习了构成深度神经网络的基本模块,比如每一层都有前向传播步骤以及一个相反的反向传播步骤,现在我们来谈谈如何实现这些步骤。先讲前向传播,输入 a [ l − 1 ] a^{[l−1]} a[l1],输出是 a [ l ] a^{[l]} a[l],缓存为 z [ l ] z^{[l]} z[l];从实现的角度来说我们可以缓存下 w [ l ] w^{[l]} w[l] b [ l ] b^{ [l] } b[l],这样更容易在不同的环节中调用函数。
在这里插入图片描述所以前向传播的步骤可写成:
z [ l ] = W [ l ] a [ l − 1 ] + b [ l ] z^{[l]} = W^{[l]}a^{[l-1]}+b^{[l]} z[l]=W[l]a[l1]+b[l] a [ l ] = g [ l ] ( z [ l ] ) a^{[l]}=g^{[l]}(z^{[l]}) a[l]=g[l](z[l])
向量化实现过程可以写成:
z [ l ] = W [ l ] ⋅ A [ l − 1 ] + b [ l ] z^{[l]} = W^{[l]} ⋅ A^{ [l−1]} + b^{ [l]} z[l]=W[l]A[l1]+b[l]
A [ l ] = g [ l ] ( Z [ l ] ) A^{ [l]} = g^{ [l]}( Z^{ [l]} ) A[l]=g[l](Z[l])
前向传播需要喂入 A [ 0 ] A^{ [0]} A[0] 也就是输入 X X X,来初始化第一层的输入值。 a [ 0 ] a^{ [0]} a[0] 对应于一个训练样本的输入特征,而 A [ 0 ] A^{ [0]} A[0] 对应于一整个训练样本的输入特征,所以这就是这条链的第一个前向函数的输入,重复这个步骤就可以从左到右计算前向传播。
反向传播的步骤:输入为 d a [ l ] da^{ [l]} da[l],输出为 d a [ l − 1 ] da^{ [l−1]} da[l1] d w [ l ] dw^{ [l]} dw[l] d b [ l ] db^{ [l]} db[l]
在这里插入图片描述所以反向传播的步骤可以写成:
(1) d z [ l ] = d a [ l ] ∗ g [ l ] ′ ( z [ l ] ) dz^{[l]} = da^{[l]} * g^{[l]}{'}(z^{[l]}) dz[l]=da[l]g[l](z[l])
(2) d w [ l ] = d z [ l ] ⋅ a [ l − 1 ] dw^{[l]} = dz^{[l]} \cdot a^{[l-1]} dw[l]=dz[l]a[l1]
(3) d b [ l ] = d z [ l ] db^{[l]} = dz^{[l]} db[l]=dz[l]
(4) d a [ l − 1 ] = ( w [ l ] ) T ⋅ z [ l ] da^{[l-1]}={(w^{[l]})}^T \cdot z^{[l]} da[l1]=(w[l])Tz[l]
(5) d z [ l ] = ( w [ l + 1 ] ) T ⋅ d z [ l + 1 ] ⋅ ( g [ l ] ) ′ ( z [ l ] ) dz^{[l]} = (w^{[l+1]})^{T} \cdot dz^{[l+1]} \cdot (g^{[l]})^{'}(z^{[l]}) dz[l]=(w[l+1])Tdz[l+1](g[l])(z[l])
式子(5)由式子(4)带入式子(1)得到,前四个式子就可以实现反响函数。其向量化实现过程可以写成:
(6) d Z [ l ] = d A [ l ] ∗ g [ l ] ′ ( Z [ l ] ) dZ^{[l]} = dA^{[l]}*{g^{[l]}}{'}(Z^{[l]}) dZ[l]=dA[l]g[l](Z[l])
(7) d W [ l ] = 1 m d Z [ l ] ⋅ ( A [ l − 1 ] ) T dW^{[l]} = \frac{1}{m}dZ^{[l]}\cdot (A^{[l-1]})^T dW[l]=m1dZ[l](A[l1])T
(8) d b [ l ] = 1 m n p . s u m ( d z [ l ] , a x i s = 1 , k e e p d i m s = T r u e ) db^{[l]} = \frac{1}{m}np.sum(dz^{[l]},axis=1,keepdims=True) db[l]=m1np.sum(dz[l],axis=1,keepdims=True)
(9) d A [ l − 1 ] = ( W [ l ] ) T ⋅ d Z [ l ] dA{[l-1]} = (W^{[l]})^{T} \cdot dZ^{[l]} dA[l1]=(W[l])TdZ[l]
在这里插入图片描述第一层你可能有一个 ReLU 激活函数,第二层为另一个 ReLU 激活函数,第三层可能是sigmoid 函数(如果你做二分类的话),输出值为,用来计算损失;这样你就可以向后迭代进行反向传播求导来求 d w [ 3 ] , d b [ 3 ] , d w [ 2 ] , d b [ 2 ] , d w [ 1 ] , d b [ 1 ] dw^{ [3]},db^{[3]} ,dw^{ [2]} ,db^{ [2]} ,dw^{ [1]} ,db^{ [1]} dw[3],db[3],dw[2],db[2],dw[1],db[1] 。在计算的时候,缓存会把 z [ 1 ] z [ 2 ] z [ 3 ] z^{ [1]} z^{ [2]} z^{ [3]} z[1]z[2]z[3] 传递过来,然后回传 d a [ 2 ] , d a [ 1 ] da^{ [2]} , da^{ [1]} da[2],da[1] ,即一个三层网络的前向和反向传播。{还有一个细节没讲就是前向递归——用输入数据来初始化,那么反向递归(使用 Logistic 回归做二分类)——对A [l] 求导。}

4.3举例说明前向传播

4.4核对矩阵的维数(Getting your matrix dimensions right)

当实现深度神经网络的时候,其中一个我常用的检查代码是否有错的方法就是拿出一张纸过一遍算法中矩阵的维数。
w w w的维度是(下一层的维数,前一层的维数),即 w [ l ] : ( n [ l ] , n [ l − 1 ] ) w^{[l]} : (n^{ [l]} ,n^{ [l−1]} ) w[l]:(n[l],n[l1])
b b b的维度是(下一层的维数,1),即: b [ l ] : ( n [ l ] , 1 ) b^{[l]} : (n^{ [l]} , 1) b[l]:(n[l],1);
z [ l ] , a [ l ] : ( n [ l ] , 1 ) z^{ [l]} ,a^{ [l]} : (n^{ [l]} , 1) z[l],a[l]:(n[l],1);
d w [ l ] dw^{ [l]} dw[l] w [ l ] w^{ [l]} w[l] 维度相同, d b [ l ] db^{ [l]} db[l] b [ l ] b^{ [l]} b[l] 维度相同,且 w w w b b b向量化维度不变,但 z , a z,a z,a以及 x x x的维度会在向量化后发生变化。
向量化后: Z [ l ] Z^{[l]} Z[l] 可以看成由每一个单独的 Z [ l ] Z^{ [l]} Z[l] 叠加而得到, Z [ l ] = ( z [ l ] ( 1 ) , z [ l ] ( 2 ) , z [ l ] ( 3 ) , . . . , z [ l ] ( m ) ) Z^{ [l]} = (z^{[l](1)} , z^{[l](2)} , z^{ [l](3)} , ... , z^{ [l](m)} ) Z[l]=(z[l](1),z[l](2),z[l](3),...,z[l](m)) m m m为训练集大小,所以 Z [ l ] Z^{ [l]} Z[l] 的维度不再是 ( n [ l ] , 1 ) (n^{ [l]} , 1) (n[l],1),而是 ( n [ l ] , m ) (n^{ [l]} , m) (n[l],m) A [ l ] : ( n [ l ] , m ) , A [ 0 ] = X = ( n [ l ] , m ) A^{[l]} :(n^{ [l]} , m),A^{ [0]} = X = (n^{ [l]} , m) A[l]:(n[l],m),A[0]=X=(n[l],m)
在这里插入图片描述
在做深度神经网络的反向传播时,一定要确认所有的矩阵维数是前后一致的,可以大大提高代码通过率。下一节我们讲为什么深层的网络在很多问题上比浅层的好。

4.5(未检查)为什么一般深层网络比浅层网络好在这里插入图片描述

首先,深度网络究竟在计算什么?如果你在建一个人脸识别或是人脸检测系统,深度神经网络所做的事就是,当你输入一张脸部的照片,然后你可以把深度神经网络的第一层,当成一个特征探测器或者边缘探测器。在这个例子里,我会建一个大概有 20 个隐藏单元的深度神经网络,是怎么针对这张图计算的。隐藏单元就是这些图里这些小方块(第一张大图),举个例子,这个小方块(第一行第一列)就是一个隐藏单元,它会去找这张照片里“|”边缘的方向。那么这个隐藏单元(第四行第四列),可能是在找(“—”)水平向的边缘在哪里。之后的课程里,我们会讲专门做这种识别的卷积神经网络,到时候会细讲,为什么小单元是这么表示的。你可以先把神经网络的第一层当作看图,然后去找这张照片的各个边缘。我们可以把照片里组成边缘的像素们放在一起看,然后它可以把被探测到的边缘组合成面部的不同部分(第二张大图)。比如说,可能有一个神经元会去找眼睛的部分,另外还有别的在找鼻子的部分,然后把这许多的边缘结合在一起,就可以开始检测人脸的不同部分。最后再把这些部分放在一起,比如鼻子眼睛下巴,就可以识别或是探测不同的人脸(第三张大图)。
你可以直觉上把这种神经网络的前几层当作探测简单的函数,比如边缘,之后把它们跟后几层结合在一起,那么总体上就能学习更多复杂的函数。这些图的意义,我们在学习卷积神经网络的时候再深入了解。还有一个技术性的细节需要理解的是,边缘探测器其实相对来说都是针对照片中非常小块的面积。就像这块(第一行第一列),都是很小的区域。面部探测器就会针对于大一些的区域,但是主要的概念是,一般你会从比较小的细节入手,比如边缘,然后再一步步到更大更复杂的区域,比如一只眼睛或是一个鼻子,再把眼睛鼻子装一块组成更复杂的部分。
在这里插入图片描述
这种从简单到复杂的金字塔状表示方法或者组成方法,也可以应用在图像或者人脸识别以外的其他数据上。比如当你想要建一个语音识别系统的时候,需要解决的就是如何可视化语音,比如你输入一个音频片段,那么神经网络的第一层可能就会去先开始试着探测比较低层次的音频波形的一些特征,比如音调是变高了还是低了,分辨白噪音,咝咝咝的声音,或者音调,可以选择这些相对程度比较低的波形特征,然后把这些波形组合在一起就能去探测声音的基本单元。在语言学中有个概念叫做音位,比如说单词 ca,c 的发音,“嗑”就是一个音位,a 的发音“啊”是个音位,t 的发音“特”也是个音位,有了基本的声音单元以后,组合起来,你就能识别音频当中的单词,单词再组合起来就能识别词组,再到完整的句子。

所以深度神经网络的这许多隐藏层中,较早的前几层能学习一些低层次的简单特征,等到后几层,就能把简单的特征结合起来,去探测更加复杂的东西。比如你录在音频里的单词、词组或是句子,然后就能运行语音识别了。同时我们所计算的之前的几层,也就是相对简单的输入函数,比如图像单元的边缘什么的。到网络中的深层时,你实际上就能做很多复杂的事,比如探测面部或是探测单词、短语或是句子。

  • Small:隐藏单元的数量相对较少
  • Deep:隐藏层数目比较多
    深层的网络隐藏单元数量相对较少,隐藏层数目较多,如果浅层的网络想要达到同样的计算结果则需要指数级增长的单元数量才能达到。

另外一个,关于神经网络为何有效的理论,来源于电路理论,它和你能够用电路元件计算哪些函数有着分不开的联系。根据不同的基本逻辑门,譬如与门、或门、非门。在非正式的情况下,这些函数都可以用相对较小,但很深的神经网络来计算,小在这里的意思是隐藏单元的数量相对比较小,但是如果你用浅一些的神经网络计算同样的函数,也就是说在我们不能用很多隐藏层时,你会需要成指数增长的单元数量才能达到同样的计算结果。
再来举个例子,用没那么正式的语言介绍这个概念。假设你想要对输入特征计算异或或是奇偶性,你可以算x 1 XORx 2 XORx 3 XOR … … x n ,假设你有n或者n x 个特征,如果你画一个异或的树图,先要计算x 1 ,x 2 的异或,然后是x 3 和x 4 。技术上来说如果你只用或门,还有非门的话,你可能会需要几层才能计算异或函数,但是用相对小的电路,你应该就可以计算异或了。然后你可以继续建这样的一个异或树图(上图左),那么你最后会得到这样的电路^ = y,也就是输入特征的异或,或是奇偶性,要计算异或关系。这种树图对来输出结果y,y应网络的深度应该是O(log(n)),那么节点的数量和电路部件,或是门的数量并不会很大,你也不需要太多门去计算异或。
但是如果你不能使用多隐层的神经网络的话,在这个例子中隐层数为O(log(n)),比如你被迫只能用单隐藏层来计算的话,这里全部都指向从这些隐藏单元到后面这里,再输出y,那么要计算奇偶性,或者异或关系函数就需要这一隐层(上图右方框部分)的单元数呈指数增长才行,因为本质上来说你需要列举耗尽2 n 种可能的配置,或是2 n 种输入比特的配置。异或运算的最终结果是 1 或 0,那么你最终就会需要一个隐藏层,其中单元数目随输入比特指数上升。精确的说应该是2 n−1 个隐藏单元数,也就是O(2 n )。
我希望这能让你有点概念,意识到有很多数学函数用深度网络计算比浅网络要容易得多,我个人倒是认为这种电路理论,对训练直觉思维没那么有用,但这个结果人们还是经常提到的,用来解释为什么需要更深层的网络。除了这些原因,说实话,我认为“深度学习”这个名字挺唬人的,这些概念以前都统称为有很多隐藏层的神经网络,但是深度学习听起来多高大上,太深奥了,对么?这个词流传出去以后,这是神经网络的重新包装或是多隐藏层神经网络的重新包装,激发了大众的想象力。抛开这些公关概念重新包装不谈,深度网络确实效果不错,有时候人们还是会按照字面意思钻牛角尖,非要用很多隐层。但是当我开始解决一个新问题时,我通常会从 logistic 回归开始,再试试一到两个隐层,把隐藏层数量当作参数、超参数一样去调试,这样去找比较合适的深度。但是近几年以来,有一些人会趋向于使用非常非常深邃的神经网络,比如好几打的层数,某些问题中只有这种网络才是最佳模型。

4.6 搭建神经网络(看作业)

4.7 (未检查)参数 VS 超参数(Parameters vs Hyperparameters)

想要你的深度神经网络起很好的效果,你还需要规划好你的参数以及超参数。
什么是超参数?
比如算法中的 learning rate α \alpha α(学习率)、iterations(梯度下降法循环的数量)、L(隐藏层数目)、 n [ l ] n^{ [l]} n[l] (隐藏层单元数目)、choice of activation function(激活函数的选择)都需要
你来设置,这些数字实际上控制了最后的参数W和b的值,所以它们被称作超参数。
实际上深度学习有很多不同的超参数,之后我们也会介绍一些其他的超参数,如momentum、mini batch size、regularization parameters 等等。
今天的深度学习应用领域,还是很经验性的过程,通常你有个想法,比如你可能大致知道一个最好的学习率值,可能说a = 0.01最好,我会想先试试看,然后你可以实际试一下,训练一下看看效果如何。然后基于尝试的结果你会发现,你觉得学习率设定再提高到 0.05 会
比较好。如果你不确定什么值是最好的,你大可以先试试一个学习率a,再看看损失函数 J
的值有没有下降。然后你可以试一试大一些的值,然后发现损失函数的值增加并发散了。然
后可能试试其他数,看结果是否下降的很快或者收敛到在更高的位置。你可能尝试不同的a
并观察损失函数J这么变了,试试一组值,然后可能损失函数变成这样,这个a值会加快学习
过程,并且收敛在更低的损失函数值上(箭头标识),我就用这个a值了。

在前面几页中,还有很多不同的超参数。然而,当你开始开发新应用时,预先很难确切
知道,究竟超参数的最优值应该是什么。所以通常,你必须尝试很多不同的值,并走这个循
环,试试各种参数。试试看 5 个隐藏层,这个数目的隐藏单元,实现模型并观察是否成功,
然后再迭代。这页的标题是,应用深度学习领域,一个很大程度基于经验的过程,凭经验的
过程通俗来说,就是试直到你找到合适的数值。

另一个近来深度学习的影响是它用于解决很多问题,从计算机视觉到语音识别,到自然
语言处理,到很多结构化的数据应用,比如网络广告或是网页搜索或产品推荐等等。我所看
到过的就有很多其中一个领域的研究员,这些领域中的一个,尝试了不同的设置,有时候这
种设置超参数的直觉可以推广,但有时又不会。所以我经常建议人们,特别是刚开始应用于
新问题的人们,去试一定范围的值看看结果如何。然后下一门课程,我们会用更系统的方法,
用系统性的尝试各种超参数取值。然后其次,甚至是你已经用了很久的模型,可能你在做网
络广告应用,在你开发途中,很有可能学习率的最优数值或是其他超参数的最优值是会变的,
所以即使你每天都在用当前最优的参数调试你的系统,你还是会发现,最优值过一年就会变
化,因为电脑的基础设施,CPU 或是 GPU 可能会变化很大。所以有一条经验规律可能每几
个月就会变。如果你所解决的问题需要很多年时间,只要经常试试不同的超参数,勤于检验
结果,看看有没有更好的超参数数值,相信你慢慢会得到设定超参数的直觉,知道你的问题
最好用什么数值。

这可能的确是深度学习比较让人不满的一部分,也就是你必须尝试很多次不同可能性。
但参数设定这个领域,深度学习研究还在进步中,所以可能过段时间就会有更好的方法决定
超参数的值,也很有可能由于 CPU、GPU、网络和数据都在变化,这样的指南可能只会在一
段时间内起作用,只要你不断尝试,并且尝试保留交叉检验或类似的检验方法,然后挑一个
对你的问题效果比较好的数值。

近来受深度学习影响,很多领域发生了变化,从计算机视觉到语音识别到自然语言处理到很多结构化的数据应用,比如网络广告、网页搜索、产品推荐等等;有些同一领域设置超
参数的直觉可以推广,但有时又不可以,特别是那些刚开始研究新问题的人们应该去尝试一
定范围内的结果如何,甚至那些用了很久的模型得学习率或是其他超参数的最优值也有可能
会改变。

在下个课程我们会用系统性的方法去尝试各种超参数的取值。有一条经验规律:经常试
试不同的超参数,勤于检查结果,看看有没有更好的超参数取值,你将会得到设定超参数的
直觉。

4.8 深度学习和大脑的关联性(What does this have to do with the brain?)

深度学习和大脑有什么关联性吗?
关联不大。
那么人们为什么会说深度学习和大脑相关呢?
当你在实现一个神经网络的时候,那些公式是你在做的东西,你会做前向传播、反向传
播、梯度下降法,其实很难表述这些公式具体做了什么,深度学习像大脑这样的类比其实是
过度简化了我们的大脑具体在做什么,但因为这种形式很简洁,也能让普通人更愿意公开讨
论,也方便新闻报道并且吸引大众眼球,但这个类比是非常不准确的。
一个神经网络的逻辑单元可以看成是对一个生物神经元的过度简化,但迄今为止连神经
科学家都很难解释究竟一个神经元能做什么,它可能是极其复杂的;它的一些功能可能真的
类似 logistic 回归的运算,但单个神经元到底在做什么目前还没有人能够真正可以解释。
深度学习的确是个很好的工具来学习各种很灵活很复杂的函数,学习到从x到y的映射,
在监督学习中学到输入到输出的映射。
在这里插入图片描述但这个类比还是很粗略的,这是一个 logistic 回归单元的 sigmoid 激活函数,这里是一
个大脑中的神经元,图中这个生物神经元,也是你大脑中的一个细胞,它能接受来自其他神
经元的电信号,比如x 1 , x 2 , x 3 ,或可能来自于其他神经元a 1 , a 2 , a 3 。其中有一个简单的临界
计算值,如果这个神经元突然激发了,它会让电脉冲沿着这条长长的轴突,或者说一条导线传到另一个神经元。

所以这是一个过度简化的对比,把一个神经网络的逻辑单元和右边的生物神经元对比。
至今为止其实连神经科学家们都很难解释,究竟一个神经元能做什么。一个小小的神经元其
实却是极其复杂的,以至于我们无法在神经科学的角度描述清楚,它的一些功能,可能真的
是类似 logistic 回归的运算,但单个神经元到底在做什么,目前还没有人能够真正解释,大
脑中的神经元是怎么学习的,至今这仍是一个谜之过程。到底大脑是用类似于后向传播或是
梯度下降的算法,或者人类大脑的学习过程用的是完全不同的原理。

所以虽然深度学习的确是个很好的工具,能学习到各种很灵活很复杂的函数来学到从 x
到 y 的映射。在监督学习中,学到输入到输出的映射,但这种和人类大脑的类比,在这个领
域的早期也许值得一提。但现在这种类比已经逐渐过时了,我自己也在尽量少用这样的说法。
这就是神经网络和大脑的关系,我相信在计算机视觉,或其他的学科都曾受人类大脑启
发,还有其他深度学习的领域也曾受人类大脑启发。但是个人来讲我用这个人类大脑类比的
次数逐渐减少了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值