深度学习之神经网络

深度学习应用发展

  • 图像方面:图像识别、手机解锁、物体识别、图片修复、目标检测、医疗影像诊断。
  • 自然语言处理:机器创作、个性化推荐、文本分类、翻译、智能音箱、自动纠错、情感分析。
  • 数值预测、量化交易

神经网络是什么?

  • 我们以房价预测的案例来说明一下,把房屋的面积作为神经网络的输入(我们称之为𝑥),通过一个节点(一个小圆圈),最终输出了价格(我们用𝑦表示)。其实这个小圆圈就是一个单独的神经元,就像人的大脑神经元一样。如果这是一个单神经元网络,不管规模大小,它正是通过把这些单个神经元叠加在一起来形成。如果你把这些神经元想象成单独的乐高积木,你就通过搭积木来完成一个更大的神经网络。
  • 大脑是由处理信息的神经元细胞和连接神经元的细胞进行信息传递的突触构成的。 树突(Dendrites)从一个神经元接受电信号,信号在细胞核(Cell Body)处理后, 然后通过轴突(Axon)将处理的信号传递给下一个神经元。神经网络来源之人的思考
  • 一个神经元可以看作是将一个或多个输入处理成一 个输出的计算单元。
  • 通过多个神经元的传递,最终大脑会得到这个信息, 并可以对这个信息给出一个合适的反馈。
    在这里插入图片描述

感知机是什么!

  • 感知器可以看作是根据权重来做出决定的一个设备/单元,只要我们可以给定一 个比较适合的权重以及阈值,那么感知器应该是能够对数据进行判断or分类预测。
  • 感知器是一种模拟人的神经元的一种算法模型,是一种研究单个训练样本的二元分类器,是SVM和人工神 经网络(ANN, Artificial Neural Networks)的基础。
  • 一个感知器接受几个二进制的输入,并产生一个二进制的输出,感知器模型的激活函数为(阶跃函数)

感知器模型:
在这里插入图片描述
o u t p u t = { 0 , i f w ⋅ x + b ≤ 0 1 , i f w ⋅ x + b > 0 output= \begin{cases} 0,if&w\cdot x+b\leq0\\ 1,if&w\cdot x+b>0 \end{cases} output={0if1ifwx+b0wx+b>0

阶跃函数:
在这里插入图片描述
感知器神经元

单个神经元模型,就是一条直线!

在这里插入图片描述

  • 单个神经元完成逻辑与(and)功能

x 1 , x 2 ∈ { 0 , 1 } y = x 1 a n d x 2 w = ( − 3 , 2 , 2 ) x_1,x_2\in\{0,1\}\\y=x_1 \quad and\quad x_2\\w=(-3,2,2) x1,x2{0,1}y=x1andx2w=(3,2,2) h w ( z ) = h ( − 3 ⋅ 1 + 2 ⋅ x 1 + 2 ⋅ x 2 ) = { 0 , z < 0 1 , z ≥ 0 h_w(z)=h(-3\cdot1+2\cdot x_1+2\cdot x_2)=\begin{cases}0,z<0\\1,z\geq0\end{cases} hw(z)=h(31+2x1+2x2)={0,z<01,z0

结果如下表:
在这里插入图片描述

x 1 x_1 x1 x 2 x_2 x2 h θ ( x ) h_\theta(x) hθ(x)
000
010
100
111
  • 单个神经元完成逻辑或(or)功能

x 1 , x 2 ∈ { 0 , 1 } y = x 1 o r x 2 w = ( − 1 , 2 , 2 ) x_1,x_2\in\{0,1\}\\y=x_1 \quad or\quad x_2\\w=(-1,2,2) x1,x2{0,1}y=x1orx2w=(1,2,2) h w ( z ) = h ( − 1 ⋅ 1 + 2 ⋅ x 1 + 2 ⋅ x 2 ) = { 0 , z < 0 1 , z ≥ 0 h_w(z)=h(-1\cdot1+2\cdot x_1+2\cdot x_2)=\begin{cases}0,z<0\\1,z\geq0\end{cases} hw(z)=h(11+2x1+2x2)={0,z<01,z0

结果如下表:
在这里插入图片描述

x 1 x_1 x1 x 2 x_2 x2 h θ ( x ) h_\theta(x) hθ(x)
000
011
101
111
  • 数据为线性不可分时:
    一条直线无法将数据进行划分,如下图:
    在这里插入图片描述对于上面数据需要多个感知器,意思就是多条直线,多重感知机(简单的神经网络)!在这里插入图片描述结构如下图:在这里插入图片描述
    w 1 = ( − 3 , 2 , 2 ) w 2 = ( − 1 , 2 , 2 ) w z = ( 1 , 3 , − 3 ) w_1=(-3,2,2)\\ w_2=(-1,2,2)\\ w_z=(1,3,-3) w1=(3,2,2)w2=(1,2,2)wz=(1,3,3) h w ( z ) = h ( W x ) = { 0 , z < 0 1 , z ≥ 0 h_w(z)=h(Wx)=\begin{cases}0,z<0\\1,z\geq0\end{cases} hw(z)=h(Wx)={0,z<01,z0
x 1 x_1 x1 x 2 x_2 x2 z 1 z_1 z1 z 2 z_2 z2 h ( x ) h(x) h(x)
00001
01010
10010
11111

神经网络-基本架构

简单的神经网络

f ( h ) = { 0 , i f h < 0 1 , i f z ≥ 0 f(h)=\begin{cases}0,if \quad h<0\\1,if \quad z\geq0\end{cases} f(h)={0,ifh<01,ifz0 h = ∑ i w i x i + b h=\sum_iw_ix_i+b h=iwixi+b在这里插入图片描述

感知器 and S型神经元

  • 感知器这种网络很难学习非线性的问题,因为激活函数是阶跃函数(不可导,不可积,不可微),所以使用sigmoid函数(可导,可积,可微来代替它,从而S型神经网络可以解决这一问题。

  • 感知器模型中,我们可以将单个神经元的计算过程看成下列两个步骤: 先

    • 计算权重w和输入值x以及偏置项b之间的线性结果值z:z=wx+b
    • 然后对结果值z进行一个数据的**sign函数(阶跃函数)**转换,得到一个离散的0/1值: y=int((sign(z)+1)/2)
  • 输入:x1、x2、x3和截距+1

  • 输出:函数hw,b(x),其中w权重和b偏置项是参数

  • S型神经元中,和感知器神经元的区别在于: 对于结果值z的转换,采用的不是sign函数进行转换,是采用平滑类型的函数进行转换,让输出的结果值y最终是一个连续的,S型神经元转指使用的是sigmoid函数

神经元模型:

  • 输入: x 1 、 x 2 、 x 3 x_1、x_2、x_3 x1x2x3和截距+1
  • 输出:函数 h w , b ( x ) h_{w,b}(x) hw,b(x),其中w权重和b偏置项是参数
    在这里插入图片描述
    h w , b ( x ) = f ( W T x , b ) = f ( ∑ i = 1 3 W i x i + b ) h_{w,b}(x)=f(W^Tx,b)=f(\sum^3_{i=1}W_ix_i+b) hw,b(x)=f(WTx,b)=f(i=13Wixi+b)

激活函数

tanh(双曲正切函数): t a n h ( z ) = f ( z ) = e z − z − z e z + z − z tanh(z)=f(z)=\frac{e^z-z^{-z}}{e^z+z^{-z}} tanh(z)=f(z)=ez+zzezzz f ′ ( z ) = 1 − ( f ( z ) ) 2 f'(z)=1-(f(z))^2 f(z)=1(f(z))2
sigmoid(逻辑 回归函数):导数介于(0,0.25)之间 s i g m i o d ( z ) = 1 1 + e − z sigmiod(z)=\frac{1}{1+e^{-z}} sigmiod(z)=1+ez1 f ′ ( z ) = f ( z ) ( 1 − f ( z ) ) f'(z)=f(z)(1-f(z)) f(z)=f(z)(1f(z))

如图:
在这里插入图片描述

  • 作用: 激活函数的主要作用是使模型获得非线性的能力。如果没有激活函数,那么该网络仅能够表达线性映射,此时即便有再多的隐藏层,其整个网络跟单层神经网 络也是等价的。因此也可以认为,只有加入了激活函数之后,深度神经网络才具 备了分层的非线性映射学习能力。 激活函数的主要特性是:可微性、单调性、输出值的范围

神经网络(DNN)

  • 神经网络主要由三个组成部分

    • 第一个是架构(architecture)或称为拓扑结构 (topology),描述神经元的层次与连接神经元的结构。
    • 第二个组成部分是神 经网络使用的激励/激活函数。
    • 第三个组成部分是找出最优权重值的学习算法。
  • 神经网络主要分为两种类型

    • 前馈神经网络(Feedforward Neural Networks) 是最常用的神经网络类型(如FC CNN),一般定义为有向无环图,信号只能沿 着最终输出的那个方向传播。
    • 另外一个是反馈神经网络(Feedback Neural Networks),也称为递归神经网络(Recurent Neural Networks),也就是网络中 环。
  • 神经网络的一般结构是由输入层、隐藏层(神经元)、输出层构成的。隐藏层可以是1层或者多层叠加,层与层之间是相互连接的

浅层神经网络结构

  • 添加少量隐层的神经网络就叫做浅层神经网络;也叫作传统神经网络,一般为2 隐层的神经网络(超过两隐层的话,效果会差很多)
    下图为全连接(前馈神经网络)一般应用于分类
    在这里插入图片描述

深度的神经网络

  • 增多中间层(隐层)的神经网络就叫做深度神经网络(DNN);可以认为深度学习是 神经网络的一个发展在这里插入图片描述

神经网络之非线性可分

  • 对线性分类器的与(and)和或(or)的组合可以完成非线性可分的问题;
  • 即通过多层的神经网络中加入激活函数的方式可以解决非线性可分的问题。
    在这里插入图片描述在这里插入图片描述

神经网络之过拟合

  • 理论上来讲,单隐层的神经网络可以逼近任何连续函数(只要隐层的神经元 个数足够的多<一个神经元将数据集分为两类>)
  • 虽然从数学表达上来讲,效果一样,但是在网络工程效果中,多隐层的神经 网络效果要比单隐层的神经网络效果好
  • 对于一些分类的问题来讲,三层的神经网络效果优于两层的神经网络,但是 如果把层次不断增加(4,5,6,7…),对于最终的效果不会产生太大的变化
  • 提升隐层层数或者神经元个数,神经网络的“容量”会变大,那么空间表达 能力会变强(模型的拟合能力变强),从而有可能导致过拟合的问题
  • 对于视频/图片识别/文本等问题,传统的神经网络(全连接神经网络)不太适 合

反向传播神经网络(BPNN)

梯度下降

  • 评判预测有多差的指标(即误差error):较通 用的指标:SSE(误差平方和),公式为: E = 1 2 ∑ μ ∑ j [ y j μ − y ^ j μ ] 2 E=\frac{1}{2}\sum_{\mu}\sum_{j}\left[y^\mu_j-\hat{y}^\mu_j\right]^2 E=21μj[yjμy^jμ]2

  • 交叉熵损失函数为(二分类): E = − 1 m ( y ln ⁡ y ^ + ( 1 − y ) ln ⁡ ( 1 − y ^ ) ) E=-\frac{1}{m}(y\ln\hat{y}+(1-y)\ln(1-\hat{y})) E=m1(ylny^+(1y)ln(1y^))

  • 梯度:就是斜率或者斜度的另一个称呼。
    在这里插入图片描述

  • 下图是一个拥有两个输入的神经网络误差 示例,相应的,它有两个权重。可以 看成 一个地形图,同一条线代表相同的误差, 较深的线对应较大的误差
    在这里插入图片描述在这里插入图片描述

反向传播

要想求反向传播先求出正向在传播
在这里插入图片描述

正向传播过程:

公式如下:
h = X ⋅ W h T = ∑ i = 1 2 x i w i δ h = s i g m o i d ( h ) o u t = δ h ⋅ W o δ o u t = s i g m o i d ( o u t ) h=X\cdot W_h^T=\sum_{i=1}^2x_iw_i \\\delta_h=sigmoid(h)\\out=\delta_h\cdot W_o\\\delta_{out}=sigmoid(out) h=XWhT=i=12xiwiδh=sigmoid(h)out=δhWoδout=sigmoid(out)
根据上图得出:
h = ( x 1 ⋅ w 1 ) + ( x 2 ⋅ w 2 ) = 0.1 ∗ 0.4 + 0.3 ∗ ( − 0.2 ) = − 0.02 (1) \begin{aligned}h&=(x_1\cdot w_1)+(x_2\cdot w_2) \\&=0.1*0.4+0.3*(-0.2) \\&=-0.02 \end{aligned}\tag 1 h=(x1w1)+(x2w2)=0.10.4+0.3(0.2)=0.02(1)
δ h = 1 1 + e − h = 1 1 + e 0.02 = 0.495 (2) \begin{aligned}\delta_h&=\frac{1}{1+e^{-h}} \\&=\frac{1}{1+e^{0.02}} \\&=0.495 \end{aligned}\tag 2 δh=1+eh1=1+e0.021=0.495(2)
o u t = δ h ⋅ w = 0.495 ∗ 0.1 = 0.0495 (3) \begin{aligned}out&=\delta_h\cdot w \\&=0.495*0.1 \\&=0.0495 \end{aligned}\tag 3 out=δhw=0.4950.1=0.0495(3)
δ o u t = 1 1 + e − o u t = 1 1 + e − 0.0495 = 0.512 (4) \begin{aligned}\delta_{out}&=\frac{1}{1+e^{-out}} \\&=\frac{1}{1+e^{-0.0495}} \\&=0.512 \end{aligned}\tag 4 δout=1+eout1=1+e0.04951=0.512(4)
δ o u t = y ^ \delta_{out}=\hat{y} δout=y^
损失函数为误差平方和:

l o s s = 1 2 ( y − y ^ ) 2 loss=\frac{1}{2}(y-\hat{y})^2 loss=21(yy^)2

反向传播过程:

δ w = ∂ l o s s ∂ δ w ⇒ ∂ l o s s ∂ y ^ ⋅ ∂ y ^ ∂ o u t ⋅ ∂ o u t ∂ w \delta_w=\frac{\partial loss}{\partial \delta_w}\Rightarrow\frac{\partial loss}{\partial \hat{y}}\cdot \frac{\partial \hat{y}}{\partial out}\cdot\frac{\partial out}{\partial w} δw=δwlossy^lossouty^wout δ w 1 = ∂ l o s s ∂ δ w 1 ⇒ ∂ l o s s ∂ y ^ ⋅ ∂ y ^ ∂ o u t ⋅ ∂ o u t ∂ δ h ⋅ ∂ δ h ∂ h ⋅ ∂ h ∂ w 1 \delta_{w_1}=\frac{\partial loss}{\partial \delta_{w_1}}\Rightarrow\frac{\partial loss}{\partial \hat{y}}\cdot \frac{\partial \hat{y}}{\partial out}\cdot\frac{\partial out}{\partial \delta _h}\cdot \frac{\partial \delta _h}{\partial h}\cdot\frac{\partial h}{\partial w_1} δw1=δw1lossy^lossouty^δhouthδhw1h δ w 2 = ∂ l o s s ∂ δ w 2 ⇒ ∂ l o s s ∂ y ^ ⋅ ∂ y ^ ∂ o u t ⋅ ∂ o u t ∂ δ h ⋅ ∂ δ h ∂ h ⋅ ∂ h ∂ w 2 \delta_{w_2}=\frac{\partial loss}{\partial \delta_{w_2}}\Rightarrow\frac{\partial loss}{\partial \hat{y}}\cdot \frac{\partial \hat{y}}{\partial out}\cdot\frac{\partial out}{\partial \delta _h}\cdot \frac{\partial \delta _h}{\partial h}\cdot\frac{\partial h}{\partial w_2} δw2=δw2lossy^lossouty^δhouthδhw2h
所以求的(这里y值为1): δ w = ( y − y ^ ) ∗ y ^ ( 1 − y ^ ) ⋅ δ h = ( 1 − 0.512 ) ∗ 0.512 ( 1 − 0.512 ) ∗ 0.495 = 0.122 ∗ 0.495 = 0.06039 \begin{aligned}\delta_w&=(y-\hat{y})*\hat{y}(1-\hat{y})\cdot\delta_h \\&=(1-0.512)*0.512(1-0.512)*0.495 \\&=0.122*0.495=0.06039 \end{aligned} δw=(yy^)y^(1y^)δh=(10.512)0.512(10.512)0.495=0.1220.495=0.06039 δ w 1 = ( y − y ^ ) ∗ y ^ ( 1 − y ^ ) ⋅ w ⋅ δ h ( 1 − δ h ) ⋅ x 1 = ( 1 − 0.512 ) ∗ 0.512 ( 1 − 0.512 ) ∗ 0.1 ∗ 0.495 ( 1 − 0.495 ) ∗ 0.1 = 0.003 ∗ 0.1 = 0.0003 \begin{aligned}\delta_{w_1}&=(y-\hat{y})*\hat{y}(1-\hat{y})\cdot w\cdot\delta_h(1-\delta_h)\cdot x_1 \\&=(1-0.512)*0.512(1-0.512)*0.1*0.495(1-0.495)*0.1 \\&=0.003*0.1=0.0003 \end{aligned} δw1=(yy^)y^(1y^)wδh(1δh)x1=(10.512)0.512(10.512)0.10.495(10.495)0.1=0.0030.1=0.0003 δ w 2 = ( y − y ^ ) ∗ y ^ ( 1 − y ^ ) ⋅ w ⋅ δ h ( 1 − δ h ) ⋅ x 2 = ( 1 − 0.512 ) ∗ 0.512 ( 1 − 0.512 ) ∗ 0.1 ∗ 0.495 ( 1 − 0.495 ) ∗ 0.3 = 0.003 ∗ 0.3 = 0.0009 \begin{aligned}\delta_{w_2}&=(y-\hat{y})*\hat{y}(1-\hat{y})\cdot w\cdot\delta_h(1-\delta_h)\cdot x_2 \\&=(1-0.512)*0.512(1-0.512)*0.1*0.495(1-0.495)*0.3 \\&=0.003*0.3=0.0009 \end{aligned} δw2=(yy^)y^(1y^)wδh(1δh)x2=(10.512)0.512(10.512)0.10.495(10.495)0.3=0.0030.3=0.0009当学习率为0.5时: △ w = 0.06 ∗ 0.5 = 0.030195 △ w 1 = 0.0003 ∗ 0.5 = 0.00015 △ w 2 = 0.0009 ∗ 0.5 = 0.00045 \vartriangle w=0.06*0.5=0.030195\\\vartriangle w_1=0.0003*0.5 =0.00015\\\vartriangle w_2=0.0009*0.5=0.00045 w=0.060.5=0.030195w1=0.00030.5=0.00015w2=0.00090.5=0.00045

DNN中的问题

  • 一般来讲,可以通过增加神经元和网络层次来提升神经网络的学习能力,使其得到的模型更加能够符合数据的分布场景;但是实际应用场景中,神经网络的层次一般情况不会太大,因为太深的层次有可能产生一些求解的问题
  • 在DNN的求解中有可能存在两个问题:梯度消失梯度爆炸;我们在求解梯度的时候会使用到链式求导法则,实际上就是一系列的连乘,如果每一层都 小于1的话,则梯度越往前乘越小,导致梯度消失,而如果连乘的数字在每层 都是大于1的,则梯度越往前乘越大,导致梯度爆炸。

为什么说神经网络是端到端的网络?

端到端学习(end-to-end)是一种解决问题的思路,与之对应的是多步骤解决问题,也就是将一个问题拆分为多个步骤分步解决,而端到端是由输入端的数据直接得到输出端的结果。就是不要预处理和特征提取,直接把原始数据扔进去得到最终结果。
特征提取包含在神经网络内部,所以说神经网络是端到端的网络。

  • 优点:

    • 通过缩减人工预处理和后续处理,尽可能使模型从原始输入到最终输出,给模型更多可以根据数据自动调节的空间,增加模型的整体契合度。
  • 缺点

    • 它可能需要大量的数据。要直接学到这个𝑥到𝑦的映射,你可能需要大量(𝑥, 𝑦)数据。
    • 它排除了可能有用的手工设计组件。

softmax分类器

在图像分类的情景中,softmax分类器输出可以是一个图像类别的离散值,和线性回归不同的是,softmax输出单元从一个变成了多个。

softmax回归和线性回归一样将输入特征与权重做线性叠加。与线性回归的一个主要不同在于,softmax回归的输出值个数等于标签里的类别数。 下图是用神经网络描绘了softmax回归,也是一个单层神经网络,由于每个输出 o 1 , o 2 , o 3 o_1,o_2,o_3 o1,o2,o3的计算都要依赖于所有的输入 x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1,x2,x3,x4,softmax回归的输出层也是一个全连接层。
在这里插入图片描述 o 1 = x 1 w 11 + x 2 w 21 + x 3 w 31 + x 4 w 41 o 2 = x 1 w 12 + x 2 w 22 + x 3 w 32 + x 4 w 42 o 3 = x 1 w 13 + x 2 w 23 + x 3 w 33 + x 4 w 43 o 4 = x 1 w 14 + x 2 w 24 + x 3 w 34 + x 4 w 44 o_1=x_1w_{11}+x_2w_{21}+x_3w_{31}+x_4w_{41} \\o_2=x_1w_{12}+x_2w_{22}+x_3w_{32}+x_4w_{42}\\o_3=x_1w_{13}+x_2w_{23}+x_3w_{33}+x_4w_{43}\\o_4=x_1w_{14}+x_2w_{24}+x_3w_{34}+x_4w_{44} o1=x1w11+x2w21+x3w31+x4w41o2=x1w12+x2w22+x3w32+x4w42o3=x1w13+x2w23+x3w33+x4w43o4=x1w14+x2w24+x3w34+x4w44

softmax的计算

一个简单的办法是将输出值 o i o_i oi当做预测类别是i的置信度,并将值最大的输出所对应的类别作为预测输出。例如,如果 o 1 , o 1 , o 3 o_1,o_1,o_3 o1,o1,o3分别为0.1 ,1.0,0.1,由于 o 2 o_2 o2最大,那么预测类别为2。
然而,直接使用输出层的输出会有两个问题:

  • 由于输出层的输出值的范围不确定,我们难以直观上判断这些值得意义。
  • 由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。

softmax运算解决了以上两个问题。它通过下面的公式将输出值变换成值为正并且和为1的概率分布: s o f t m a x ( o i ) = e x p ( o i ) ∑ i = 1 n e x p ( o i ) softmax(o_i)=\frac{exp(o_i)}{\sum^n_{i=1}exp(o_i)} softmax(oi)=i=1nexp(oi)exp(oi)

交叉熵损失函数

  • 我们已经知道,softmax运算将输出变换成一个合法的类别预测分布。实际上,真实标签也可以用类别分布表达:

  • 对于样本i,我们构造向量 y ( i ) ∈ R q y^{(i)}\in_R^q y(i)Rq,使其第 y ( i ) y^{(i)} y(i)个元素为1,其余为0。这样我们的训练目标可以设为使预测概率分布 y ^ ( i ) \hat{y}^{(i)} y^(i)尽可能接近真实的标签概率 y ( i ) y^{(i)} y(i)

  • 想要预测分类结果正确,我们其实并不需要预测概率完全等于标签概率,而平方损失则过于严格。改善这个问题的一个方法是使用更适合衡量两个概率分布差异的测量函数。其中,交叉熵(cross entropy)是一个常用的衡量方法: H ( y ( i ) , y ^ ( i ) ) = − ∑ j = 1 q y j ( i ) log ⁡ y ^ j ( i ) = − log ⁡ y ^ y ( i ) ( i ) H(y^{(i)},\hat{y}^{(i)})=-\sum_{j=1}^qy^{(i)}_j\log\hat{y}^{(i)}_j=-\log\hat{y}^{(i)}_{y^{(i)}} H(y(i),y^(i))=j=1qyj(i)logy^j(i)=logy^y(i)(i)其中带下标的 y j ( i ) y^{(i)}_j yj(i)是向量 y ( i ) y^{(i)} y(i)中非 0 即 1 的元素。也就是说,交叉熵只关心对正确类别的预测概率,因为只要其值足够大,就可以确保分类结果正确。即最小化交叉熵损失函数等价于最大化训练数据集所有标签类别的联合预测概率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

年少无为呀!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值