0. 前言

    \quad\;\;本文主要对标量对向量和矩阵以及向量对向量求导三种场景进行求解,标量对向量和矩阵求导以分母布局为默认布局,向量对向量求导以分子布局为默认布局,所有向量默认为列向量。

1. 定义法

1.1 标量对向量求导

    \quad\;\;定义实值函数 f:Rn→Rf:R^n\to Rf:RnR,自变量x\mathbf{x}x是n维向量,输出yyy是标量,求解∂aTx∂x\frac{\partial \mathbf{a}^T \mathbf{x}} {\partial \mathbf{x}}xaTx
    \quad\;\;标量对向量的求导,其实就是标量对向量里的每个分量分别求导,最后把求导结果组合起来,通过向量来表示。

  1. y=aTxy=\mathbf{a}^T \mathbf{x}y=aTx,求解∂y∂x\frac{\partial y} {\partial \mathbf{x}}xy
    根据定义,我们先对x\mathbf{x}x的第i{i}i分量求导,这是一个标量对标量的求导,如下:
    ∂aTx∂xi=∂∑j=1najxj∂xi=ai\frac {\partial \mathbf{a}^T \mathbf{x}} {\partial x_i} = \frac {\partial \sum_{j=1}^n a_j x_j} {\partial x_i} = a_ixiaTx=xij=1najxj=ai
    可见,对向量x\mathbf{x}x的第iii分量求导就是向量a\mathbf{a}a的第iii个分量。根据分母布局将所有求导结果组合起来就是向量a\mathbf{a}a,即:
    ∂aTx∂x=a\frac {\partial \mathbf{a}^T \mathbf{x}} {\partial \mathbf{x}} = \mathbf{a}xaTx=a
    同样的思路可以直接得到:
    ∂xTa∂x=a  ∂xTx∂x=2x\frac {\partial \mathbf{x}^T \mathbf{a}} {\partial \mathbf{x}} = \mathbf{a} \\ \; \\ \frac {\partial \mathbf{x}^T \mathbf{x}} {\partial \mathbf{x}} = 2 \mathbf{x}xxTa=axxTx=2x

  2. y=xTAxy=\mathbf{x}^T A \mathbf{x}y=xTAx,求解∂y∂x\frac{\partial y} {\partial \mathbf{x}}xy
    对向量xxx的第kkk个分量求导可得:
    ∂xTAx∂xk=∂∑i=1n∑j=1nxiAijxj∂xk=∑i=1nAikxi+∑j=1nAkjxj\frac {\partial \mathbf{x}^T A \mathbf{x}} {\partial x_k} = \frac {\partial \sum_{i=1}^n \sum_{j=1}^n x_i A_{ij} x_j} {\partial x_k} = \sum_{i=1}^n A_{ik} x_i + \sum_{j=1}^n A_{kj} x_j xkxTAx=xki=1nj=1nxiAijxj=i=1nAikxi+j=1nAkjxj
    上式中,第一部分为矩阵AAA的第kkk列转置后和xxx相乘得到,第二部分为矩阵AAA的第kkk行和xxx相乘得到,将所有的结果组合后为:
    ∂xTAx∂xk=ATx+Ax\frac {\partial \mathbf{x}^T A \mathbf{x}} {\partial x_k}=A^T \mathbf{x} + A \mathbf{x}xkxTAx=ATx+Ax

1.2 标量对向量求导的基本法则

  1. 常量对向量求导的结果为零;
  2. 线性法则:如果f,gf, gf,g均为实值函数,c1,c2c_1, c_2c1,c2为常数,则:
    ∂(c1f(x)+c2g(x))∂x=c1∂f(x)∂x+c2∂g(x)∂x\frac {\partial (c_1 f(x) + c_2 g(x))} {\partial x}=c_1 \frac {\partial f(x)} {\partial x} + c_2 \frac {\partial g(x)} {\partial x}x(c1f(x)+c2g(x))=c1xf(x)+c2xg(x)
  3. 乘法法则:如果f,gf, gf,g均为实值函数,则:
    ∂f(x)g(x)∂x=f(x)∂g(x)∂x+∂f(x)∂xg(x)\frac {\partial f(x)g(x)} {\partial x} = f(x) \frac {\partial g(x)} {\partial x} + \frac {\partial f(x)} {\partial x} g(x)xf(x)g(x)=f(x)xg(x)+xf(x)g(x)
  4. 除法法则:如果f,gf, gf,g均为实值函数,则:
    ∂f(x)/g(x)∂x=1g2(x)(g(x)∂f(x)∂x−f(x)∂g(x)∂x)\frac {\partial f(x) / g(x)} {\partial x} = \frac {1} {g^2(x)} (g(x) \frac {\partial f(x)} {\partial x} - f(x) \frac {\partial g(x)} {\partial x})xf(x)/g(x)=g2(x)1(g(x)xf(x)f(x)xg(x))

1.3 标量对矩阵求导

    \quad\;\;标量对矩阵求导和标量对向量求导思路类似,只是最后的结果为一个和自变量同型的矩阵。
    \quad\;\;假设y=aTXby=\mathbf{a}^T \mathbf{X} by=aTXb,其中a\mathbf{a}a是m维向量,b\mathbf{b}b 为n维向量,X\mathbf{X}Xm×nm \times nm×n 的矩阵,则:
∂aTXb∂Xij=∂∑p=1m∑q=1napXpqbq∂Xij=∂aiXijbj∂Xij=aibj\frac {\partial \mathbf{a}^T \mathbf{X} b} {\partial X_{ij}} = \frac {\partial \sum_{p=1}^m \sum_{q=1}^n a_p X_{pq} b_q} {\partial X_{ij}} = \frac {\partial a_i X_{ij} b_j} {\partial X_{ij}} = a_i b_jXijaTXb=Xijp=1mq=1napXpqbq=XijaiXijbj=aibj

    \quad\;\;即在第 (i, j) 处的求导结果为向量aaa的第 iii 个分量和向量bbb 的第 jjj 个分量相乘所得,将所有的结果组合为一个 m×nm \times nm×n 的矩阵,则:
∂aTXb∂Xij=abT\frac {\partial \mathbf{a}^T \mathbf{X} b} {\partial X_{ij}} = \mathbf{a} \mathbf{b}^TXijaTXb=abT

1.4 向量对向量求导

    \quad\;\;假设y=Ax\mathbf{y}=A \mathbf{x}y=Ax,其中AAAm×nm \times nm×n 矩阵,x\mathbf{x}x 为 n 维向量,y\mathbf{y}y 为 m 维向量,先求矩阵AAA的第iii行和向量x\mathbf{x}x的内积对向量x\mathbf{x}x的第 j 个分量的求导结果,即:
∂Aix∂xj=∂Aijxj∂xj=Aij\frac {\partial A_i \mathbf{x}} {\partial x_j} = \frac {\partial A_{ij}x_j} {\partial x_j} = A_{ij}xjAix=xjAijxj=Aij
    \quad\;\;可见,矩阵AAA的第iii行和向量x\mathbf{x}x的内积对向量x\mathbf{x}x的第 j 个分量的求导结果就是矩阵AAA在 (i, j) 位置处的。根据分子布局将所有的结果组合排列后的结果为矩阵 AAA

2. 微分法

2.1 矩阵微分

    \quad\;\;在高数里我们学习过标量的微分和导数,它们之间的关系为:df=f′(x)dxdf=f^{'}(x)dxdf=f(x)dx。如果是对多变量求微分,可以写成:
df=∑i=1n∂f∂xidxi=(∂f∂x)Tdxdf=\sum_{i=1}^n \frac {\partial f} {\partial x_i}dx_i = (\frac {\partial f} {\partial \mathbf{x}})^Td \mathbf{x}df=i=1nxifdxi=(xf)Tdx
    \quad\;\;从上式可以发现,标量对向量的求导和它的向量微分之间有一个转置的关系。
    \quad\;\;推广到矩阵,矩阵微分的定义为:
df=∑i=1m∑j=1n∂f∂XijdXij=tr((∂f∂X)TdX)df=\sum_{i=1}^m \sum_{j=1}^n \frac {\partial f} {\partial X_{ij}} dX_{ij} = tr((\frac {\partial f} {\partial \mathbf{X}})^T d \mathbf{X})df=i=1mj=1nXijfdXij=tr((Xf)TdX)
    \quad\;\;上式的第二步用到了矩阵迹的性质,迹函数等于主对角线之和,即:
tr(ATB)=∑i,jAijBijtr(A^T B) = \sum_{i,j}A_{ij} B_{ij}tr(ATB)=i,jAijBij
    \quad\;\;从上式同样可以发现,标量对矩阵的求导和它的矩阵微分之间有一个转置的关系,只是外面多了一个迹函数公式。由于标量的迹函数值就是它本身,因此矩阵微分和向量微分可以统一表示:
df=tr((∂f∂X)TdX)  df=tr((∂f∂x)Tdx) df = tr((\frac {\partial f} {\partial \mathbf{X}})^T d\mathbf{X}) \\\; \\ df = tr((\frac {\partial f} {\partial \mathbf{x}})^T d \mathbf{x}) df=tr((Xf)TdX)df=tr((xf)Tdx)

2.2 矩阵微分的性质

  1. 微分加减法:d(X+Y)=dX+dY,d(X+Y)=dX−dYd(\mathbf{X} + \mathbf{Y}) = d\mathbf{X} + d\mathbf{Y}, d(\mathbf{X} + \mathbf{Y}) = d\mathbf{X} - d\mathbf{Y}d(X+Y)=dX+dY,d(X+Y)=dXdY
  2. 微分乘法:d(XY)=(dX)Y+X(dY)d(\mathbf{XY}) = (d\mathbf{X})Y + \mathbf{X} (d\mathbf{Y})d(XY)=dXY+X(dY)
  3. 微分转置:d(XT)=(d(X))Td(\mathbf{X}^T)=(d(\mathbf{X}))^Td(XT)=(d(X))T
  4. 微分的迹:dtr(X)=tr(dX)d tr(\mathbf{X})=tr(d\mathbf{X})dtr(X)=tr(dX)
  5. 微分哈达马乘积:d(X⊙Y)=X⊙dY+dX⊙Yd(\mathbf{X} \odot \mathbf{Y}) = \mathbf{X} \odot d\mathbf{Y} + d\mathbf{X} \odot \mathbf{Y}d(XY)=XdY+dXY
  6. 逐元素求导:dσ(X)=σ′(X)⊙dXd\sigma( \mathbf{X}) = \sigma ^{'}(\mathbf{X}) \odot d\mathbf{X}dσ(X)=σ(X)dX
  7. 逆矩阵微分:dX−1=−X−1dXX−1d\mathbf{X}^{-1} = -\mathbf{X}^{-1}d\mathbf{X}\mathbf{X}^{-1}dX1=X1dXX1
  8. 行列式微分:d∣X∣=∣X∣tr(X−1dX)d|\mathbf{X}| = |\mathbf{X}|tr(\mathbf{X}^{-1}d\mathbf{X})dX=Xtr(X1dX)

2.3 迹函数性质

  1. 标量的迹等于自己:tr(x)=xtr(x) = xtr(x)=x
  2. 转置不变: tr(AT)=tr(A)tr(A^T) = tr(A)tr(AT)=tr(A)
  3. 交换律:tr(AB)=tr(BA)tr(AB) = tr(BA)tr(AB)=tr(BA), 这个需要A,BTA, B^TA,BT同纬度。
  4. 加减法:tr(X+Y)=tr(X)+tr(Y),tr(X−Y)=tr(X)−tr(Y)tr(\mathbf{X} + \mathbf{Y}) = tr(\mathbf{X}) + tr(\mathbf{Y}), tr(\mathbf{X} - \mathbf{Y}) = tr(\mathbf{X}) - tr(\mathbf{Y})tr(X+Y)=tr(X)+tr(Y),tr(XY)=tr(X)tr(Y)
  5. 矩阵乘法和迹交换:tr((A⊙B)TC)=tr(AT(B⊙C))tr((A \odot B)^T C) = tr(A^T (B \odot C))tr((AB)TC)=tr(AT(BC)),需要满足 A,B,CA,B,CA,B,C 同纬度。

2.4 标量对向量矩阵求导

    \quad\;\;若标量函数fff是矩阵经加减乘除、逆、行列式、逐元素函数等运算组成,则使用相应的运算法则对fff求微分,再使用迹函数技巧给dfdfdf套上迹并将其它项交换至dXdXdX左侧,那么对于迹函数里面dXdXdX左侧的部分,只需要加一个转置就可以得到导数了。

  1. y=aTXb,  ∂y∂Xy=\mathbf{a}^T \mathbf{X} \mathbf{b}, \; \frac{\partial y} {\partial \mathbf{X}}y=aTXb,Xy
    首先,使用微分法的性质对fff求微分,得到:
    dy=d(aTXb)=aTdXbdy = d(\mathbf{a}^T \mathbf{X} \mathbf{b}) = \mathbf{a}^T d \mathbf{X} \mathbf{b}dy=d(aTXb)=aTdXb
    第二步,两边套上迹函数,即:
    dy=tr(dy)=tr(aTXb)=tr(baTdX)dy = tr(dy) = tr(\mathbf{a}^T \mathbf{X} \mathbf{b}) = tr(\mathbf{b} \mathbf{a}^T d \mathbf{X})dy=tr(dy)=tr(aTXb)=tr(baTdX)
    其中第一到第二步使用了上面迹函数性质1,第三步到第四步用到了上面迹函数的性质3。
    根据矩阵微分和导数的定义,迹函数里面在dXd\mathbf{X}dX左边的部分baT\mathbf{b} \mathbf{a}^TbaT,加上一个转置即为我们要求的导数,即:
    ∂f∂x=(baT)T=abT\frac {\partial f} {\partial x} = (\mathbf{b} \mathbf{a} ^T)^T = \mathbf{a} \mathbf{b} ^Txf=(baT)T=abT

  2. y=aTexp(Xb),  ∂y∂Xy=\mathbf{a}^T exp(\mathbf{X} \mathbf{b}), \; \frac{\partial y} {\partial \mathbf{X}}y=aTexp(Xb),Xy
    dy=tr(dy)=tr(aTdexp(Xb))=tr(aT(exp(Xb)⊙d(Xb)))=tr((a⊙exp(Xb))TdXb)=tr(b(a⊙exp(Xb))TdX)dy = tr(dy) = tr(\mathbf{a}^T dexp(\mathbf{X} \mathbf{b})) = tr(\mathbf{a}^T (exp(\mathbf{X} \mathbf{b}) \odot d(\mathbf{Xb}))) = tr((\mathbf{a} \odot exp(\mathbf{Xb}))^T d\mathbf{Xb}) = tr(b(\mathbf{a} \odot exp(\mathbf{Xb}))^T d\mathbf{X})dy=tr(dy)=tr(aTdexp(Xb))=tr(aT(exp(Xb)d(Xb)))=tr((aexp(Xb))TdXb)=tr(b(aexp(Xb))TdX)
    其中第三步到第4步使用了上面迹函数的性质5. 这样我们的求导结果为:
    ∂y∂X=(a⊙exp(Xb))bT\frac {\partial y} {\partial \mathbf{X}} = (\mathbf{a} \odot exp(\mathbf{Xb})) \mathbf{b}^TXy=(aexp(Xb))bT

3. 链式法

3.1 向量对向量求导的链式法则

    \quad\;\;假设多个向量存在依赖关系,比如三个向量 x→y→z\mathbf{x} \to \mathbf{y} \to \mathbf{z}xyz 存在依赖关系,则我们有下面的链式求导法则:
∂z∂x=∂z∂y∂y∂x\frac {\partial \mathbf{z}} {\partial \mathbf{x}} = \frac {\partial \mathbf{z}} {\partial \mathbf{y}} \frac {\partial \mathbf{y}} {\partial \mathbf{x}}xz=yzxy
    \quad\;\;该法则也可以推广到更多的向量依赖关系,但要求所有有依赖关系的变量都是向量。
    \quad\;\;从矩阵纬度相容的角度也很容易理解上面的链式法则,假设 x,y,z\mathbf{x}, \mathbf{y}, \mathbf{z}x,y,z 分别是 m,n,pm, n, pm,n,p 纬的向量,则求导结果 ∂z∂x\frac{\partial \mathbf{z}} {\partial \mathbf{x}}xz 是一个 p×mp \times mp×m 的雅克比矩阵,而右边∂z∂y\frac{\partial \mathbf{z}} {\partial \mathbf{y}}yz 是一个 p×np \times np×n 的雅克比矩阵,∂y∂x\frac{\partial \mathbf{y}} {\partial \mathbf{x}}xy 是一个 n×mn \times mn×m 的雅可比矩阵,两个雅克比矩阵的乘积纬度刚好是 p×mp \times mp×m ,和左边相容。

3.2 标量对多个向量的链式求导法则

    \quad\;\;假设 x,y\mathbf{x}, \mathbf{y}x,y 分别是 m,nm, nm,n 维向量, zzz 是一个标量, 那么 ∂z∂x\frac{\partial z} {\partial \mathbf{x}}xz的求导结果是一个 m×1m \times 1m×1 的向量, ∂y∂x\frac {\partial \mathbf{y}} {\partial \mathbf{x}}xy 是一个 n×mn \times mn×m 的雅克比矩阵,它们是没法直接相乘的。标量对多个向量求导的链式法则为:
∂z∂x=(∂y∂x)T∂z∂y\frac{\partial z}{\partial \mathbf{x}} = (\frac{\partial \mathbf{y}} {\partial \mathbf{x}})^T \frac{\partial z} {\partial \mathbf{y}} xz=(xy)Tyz
    \quad\;\;如果标量对更多的向量求导,比如 y1→y2→...→yn→z\mathbf{y_1} \to \mathbf{y_2} \to ... \to \mathbf{y_n} \to zy1y2...ynz,则其链式求导表达式可以表示为:
∂z∂y1=(∂yn∂yn−1∂yn−1∂yn−2…∂y2∂y1)T∂z∂yn\frac{\partial z}{\partial \mathbf{y_1}} = (\frac{\partial \mathbf{y_n}} {\partial \mathbf{y_{n-1}}} \frac{\partial \mathbf{y_{n-1}}} {\partial \mathbf{y_{n-2}}} \dots \frac{\partial \mathbf{y_2}} {\partial \mathbf{y_1}})^T \frac{\partial z} {\partial \mathbf{y_n}}y1z=(yn1ynyn2yn1y1y2)Tynz
    \quad\;\;举一个最常见的最小二乘法求导的例子。最小二乘法的目标是最小化如下损失函数:
J=(Xθ−y)T((Xθ−y)J = (\mathbf{X \theta} - \mathbf{y})^T((\mathbf{X \theta} - \mathbf{y})J=(Xθy)T((Xθy)
    \quad\;\;优化的目标函数 JJJ 是一个变量,而模型参数 θ\mathbf{\theta}θ 是一个向量,期望 JJJθ\mathbf{\theta}θ 求导,并求出倒数等于零时候的极值点。我们假设 z=Xθ−y\mathbf{z} = \mathbf{X \theta} - \mathbf{y}z=Xθy ,则 J=zTz,θ→z→JJ = \mathbf{z} ^T \mathbf{z}, \mathbf{\theta} \to \mathbf{z} \to JJ=zTz,θzJ 存在链式求导的关系,因此:
∂J∂θ=(∂z∂θ)T∂J∂z=XT(2z)=2XT(Xθ−y)\frac {\partial J} {\partial \mathbf{\theta}} = (\frac {\partial \mathbf{z}} {\partial \mathbf{\theta}})^T \frac {\partial J} {\partial \mathbf{z}} = \mathbf{X}^T (2\mathbf{z}) = 2\mathbf{X}^T (\mathbf{X \theta} - \mathbf{y})θJ=(θz)TzJ=XT(2z)=2XT(Xθy)

3.3 标量对多个矩阵的链式求导法则

    \quad\;\;假设有这样的依赖关系:X→Y→z\mathbf{X} \to \mathbf{Y} \to zXYz,那么我们有:
∂z∂Xij=∑k,l∂z∂Ykl∂Ykl∂Xij=tr((∂z∂Y)T∂Y∂Xij)\frac{\partial z}{\partial X_{ij}} = \sum\limits_{k,l}\frac{\partial z}{\partial Y_{kl}} \frac{\partial Y_{kl}}{\partial X_{ij}} =tr((\frac{\partial z}{\partial Y})^T\frac{\partial Y}{\partial X_{ij}})Xijz=k,lYklzXijYkl=tr((Yz)TXijY)
    \quad\;\;这里没有给出基于矩阵整体的链式求导法则,主要原因是矩阵对矩阵的求导是比较复杂的定义,目前只能给出对矩阵中一个标量的链式求导方法。这个方法并不实用,因为我们并不想每次都基于定义法来求导最后再去排列求导结果。
    \quad\;\;虽然我们没有全局的标量对矩阵的链式求导法则,但是对于一些线性关系的链式求导,我们还是可以得到一些有用的结论的。
    \quad\;\;我们来看这个常见问题:A,X,B,YA,X,B,YA,X,B,Y都是矩阵,zzz是标量,其中z=f(Y),Y=AX+Bz= f(Y), Y=AX+Bz=f(Y),Y=AX+B,我们要求出∂z∂X\frac{\partial z}{\partial X}Xz,这个问题在机器学习中是很常见的。此时,我们并不能直接整体使用矩阵的链式求导法则,因为矩阵对矩阵的求导结果不好处理。
    \quad\;\;这里使用定义法试一试,先使用上面的标量链式求导公式:
∂z∂Xij=∑k,l∂z∂Ykl∂Ykl∂Xij\frac{\partial z}{\partial X_{ij}} = \sum\limits_{k,l}\frac{\partial z}{\partial Y_{kl}} \frac{\partial Y_{kl}}{\partial X_{ij}}Xijz=k,lYklzXijYkl
    \quad\;\;我们再来看看后半部分的导数:
∂Ykl∂Xij=∂∑s(AksXsl)∂Xij=∂AkiXil∂Xij=Akiδlj \frac{\partial Y_{kl}}{\partial X_{ij}} = \frac{\partial \sum\limits_s(A_{ks}X_{sl})}{\partial X_{ij}} = \frac{\partial A_{ki}X_{il}}{\partial X_{ij}} =A_{ki}\delta_{lj}XijYkl=Xijs(AksXsl)=XijAkiXil=Akiδlj
    \quad\;\;其中δlj\delta_{lj}δljl=jl=jl=j时为1,否则为0。
    \quad\;\;那么最终的标签链式求导公式转化为:∂z∂Xij=∑k,l∂z∂YklAkiδlj=∑k∂z∂YkjAki\frac{\partial z}{\partial X_{ij}} = \sum\limits_{k,l}\frac{\partial z}{\partial Y_{kl}} A_{ki}\delta_{lj} = \sum\limits_{k}\frac{\partial z}{\partial Y_{kj}} A_{ki}Xijz=k,lYklzAkiδlj=kYkjzAki
    \quad\;\;即矩阵ATA^TAT的第i行和∂z∂Y\frac{\partial z}{\partial Y}Yz的第j列的内积。排列成矩阵即为:∂z∂X=AT∂z∂Y\frac{\partial z}{\partial X} = A^T\frac{\partial z}{\partial Y}Xz=ATYz
    \quad\;\;总结下就是:z=f(Y),Y=AX+B→∂z∂X=AT∂z∂Yz= f(Y), Y=AX+B \to \frac{\partial z}{\partial X} = A^T\frac{\partial z}{\partial Y}z=f(Y),Y=AX+BXz=ATYz
    \quad\;\;这结论在x\mathbf{x}x是一个向量的时候也成立,即:z=f(y),y=Ax+b→∂z∂x=AT∂z∂yz= f(\mathbf{y}), \mathbf{y}=A\mathbf{x}+\mathbf{b} \to \frac{\partial z}{\partial \mathbf{x}} = A^T\frac{\partial z}{\partial \mathbf{y}}z=f(y),y=Ax+bxz=ATyz
    \quad\;\;如果要求导的自变量在左边,线性变换在右边,也有类似稍有不同的结论如下,证明方法是类似的,这里直接给出结论:
z=f(Y),Y=XA+B→∂z∂X=∂z∂YATz= f(Y), Y=XA+B \to \frac{\partial z}{\partial X} = \frac{\partial z}{\partial Y}A^Tz=f(Y),Y=XA+BXz=YzAT
z=f(y),y=Xa+b→∂z∂X=∂z∂yaTz= f(\mathbf{y}), \mathbf{y}=X\mathbf{a}+\mathbf{b} \to \frac{\partial z}{\partial \mathbf{X}} = \frac{\partial z}{\partial \mathbf{y}}a^Tz=f(y),y=Xa+bXz=yzaT
    \quad\;\;使用好上述四个结论,对于机器学习尤其是深度学习里的求导问题可以非常快的解决,大家可以试一试。

参考: https://www.cnblogs.com/pinard/category/894690.html

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐