文章目录

    • BPTT
      • BPTT前向传播
  • 长序列循环神经网络
    • LSTM
  • 序列到序列的模型
    • 集束搜索——近似搜索
    • 改进的集束搜索
    • 集束搜索的误差分析
      • 图到文本
  • 注意力模型
  • 序列数据建模

    • 输入序列–>输出序列
    • 预测序列的下一项(监督)
      • 模糊了监督和非监督
  • 有的cnn对序列不适用:
    • cnn假设:离得远的关系远,有关系的都在附近
    • 序列:可能长距离也有相关的(一段文字的代词)
      RNN结构
  • RNN
    • 结构:

      • 层间全连接
      • 层内全连接?
      • 自连接
    • 功能强大
      • 计算力够且单元数够的情况下
    • 每个时间点的输入输出不同–
      • 参数共享:一个序列的从前到后逐个输入到网络中(矩阵)(每个时间点不同的字进的都是同一个神经元–参数一样的)
      • 矩阵:行(时间,一行一个字的表达),列(神经元数目)
    • 特点(展开后的(可认为是:
      • 权值约束(共享
      • 多层
      • 前向网络
    • 损失函数:
      • 平方损失
      • 交叉熵
    • 训练:采用权值一致的BP算法(更新也一致
      • BP容易实现权值的线性约束

        • 约束w1=w2,令Δw1=Δw2=∂E∂w1+∂E∂w2约束w^1=w^2,令\Delta w^1=\Delta w^2=\frac{\partial E}{\partial w^1}+\frac{\partial E}{\partial w^2}约束w1=w2,令Δw1=Δw2=∂w1∂E​+∂w2∂E​
      • BPTT(时间域上的BP
        1. 前向

          • 输入层:(常用tanhat=g1(Waaat−1+Waxxt+ba)=g1(Wa[at−1,xt]+ba),zat=Waaat−1+Waxxt+baa^t=g_1(W_{aa}a^{t-1}+W_{ax}x^t+b_a)=g_1(W_a[a^{t-1},x^t]+b_a),z_a^t=W_{aa}a^{t-1}+W_{ax}x^t+b_aat=g1​(Waa​at−1+Wax​xt+ba​)=g1​(Wa​[at−1,xt]+ba​),zat​=Waa​at−1+Wax​xt+ba​
          • 输出层:(softmaxy^t=g2(Wyaat+by),zyt=Wyaat+by\hat{y}^t=g_2(W_{ya}a^{t}+b_y),z_y^t=W_{ya}a^{t}+b_yy^​t=g2​(Wya​at+by​),zyt​=Wya​at+by​
        2. 计算每一个时间的链式导数∂E∂wi\frac{\partial E}{\partial w^i}∂wi∂E​
          • ΔW=−η∂L∂W,η学习率\Delta W=-\eta \frac{\partial L}{\partial W}, \eta学习率ΔW=−η∂W∂L​,η学习率
          • δt=∂L∂zt\delta^t=\frac{\partial L}{\partial z^t}δt=∂zt∂L​
          • ∂Lt∂Wya=∂Lt∂y^t∂y^t∂zyt∂zyt∂Wya=∂Lt∂y^tg2′(zyt)at=δytat\frac{\partial L^t}{\partial W_ya}=\frac{\partial L^t}{\partial \hat{y}^t}\frac{\partial \hat{y}^t}{\partial z_y^t}\frac{\partial z_y^t}{\partial W_ya}=\frac{\partial L^t}{\partial \hat{y}^t}g_2'(z_y^t)a^t=\delta_y^ta^t∂Wy​a∂Lt​=∂y^​t∂Lt​∂zyt​∂y^​t​∂Wy​a∂zyt​​=∂y^​t∂Lt​g2′​(zyt​)at=δyt​at
          • δat=g1′(zat)(WyaTδyt+Waa′Tδa′t+1)\delta_a^t=g_1'(z_a^t)(W_{ya}^T\delta_y^t+W_{aa'}^T\delta_{a'}^{t+1})δat​=g1′​(zat​)(WyaT​δyt​+Waa′T​δa′t+1​)
            • 前一项:WyaTδyt:当前层的y传来的W_{ya}^T\delta_y^t:当前层的y传来的WyaT​δyt​:当前层的y传来的
            • 后一项:Waa′Tδa′t+1:其他隐层(上一时刻的)传递而来的W_{aa'}^T\delta_{a'}^{t+1}:其他隐层(上一时刻的)传递而来的Waa′T​δa′t+1​:其他隐层(上一时刻的)传递而来的
        3. 将所有时间的导数加在一起约束w1=w2,令Δw1=Δw2=∂E∂w1+∂E∂w2约束w^1=w^2,令\Delta w^1=\Delta w^2=\frac{\partial E}{\partial w^1}+\frac{\partial E}{\partial w^2}约束w1=w2,令Δw1=Δw2=∂w1∂E​+∂w2∂E​
          • ∂Lt∂Wya=Σt=1Tyδytat\frac{\partial L^t}{\partial W_ya}=\Sigma_{t=1}^{T_y}\delta_y^ta^t∂Wy​a∂Lt​=Σt=1Ty​​δyt​at
          • ∂Lt∂Waa=Σt=1Txδatat\frac{\partial L^t}{\partial W_aa}=\Sigma_{t=1}^{T_x}\delta_a^ta^t∂Wa​a∂Lt​=Σt=1Tx​​δat​at
          • ∂Lt∂Wya=Σt=1Txδatxt\frac{\partial L^t}{\partial W_ya}=\Sigma_{t=1}^{T_x}\delta_a^tx^t∂Wy​a∂Lt​=Σt=1Tx​​δat​xt
          • 这里的x、y、W都是向量、矩阵,可以视作一个向量中一个元素一个神经元
      • 交叉熵loss:
        • Lt(y^t,yt)=−ytlog(y^t)−(1−yt)log(1−y^t)L^t(\hat{y}^t,y^t)=-y^tlog(\hat{y}^t)-(1-y^t)log(1-\hat{y}^t)Lt(y^​t,yt)=−ytlog(y^​t)−(1−yt)log(1−y^​t)
        • 用这个损失函数:L(y^,y)=Σt=1TyLt(y^t,yt)用这个损失函数:L(\hat{y},y)=\Sigma_{t=1}^{T_y}L^t(\hat{y}^t,y^t)用这个损失函数:L(y^​,y)=Σt=1Ty​​Lt(y^​t,yt)
    • 结构
      • 多对多1
      • 多对多2(encoder+decoder)
        • 机器翻译
      • 多对1
        • 情感分析
      • 1对多
      • 一对一
  • 语言模型(多对多1)
    • 计算P(sentence),大的好=P(y1,y2,...,yn)=P(cats在开头)P(average∣cats)P(15∣average,cats)P(y^1,y^2,...,y^n)=P(cats在开头)P(average|cats) P(15|average,cats)P(y1,y2,...,yn)=P(cats在开头)P(average∣cats)P(15∣average,cats)

      • RNN的每个时刻的输出y^1==第一个单词在开头的概率P(cats在开头)P(cats在开头)P(cats在开头)
      • 第二个词的输出:给定第一个词,第二个词出现的概率P(average∣cats)P(average|cats)P(average∣cats)
      • 第三个的输出:给定前两个词,第三个词出现的概率P(15∣average,cats)P(15|average,cats)P(15∣average,cats)
    • 标记
      • 句子结尾:/< E O S/>
      • 不名词:/< U N K />
    • 采样可以知道学到了什么)
    • 也可以在字符级别建立语言模型–
      • 不会有UNK,但序列很长很长(会梯度下降,计算要求大)
      • 会用在专业词陌生词多的i情况下
    • 不同语料可以训练出不同的文风

BPTT

BPTT前向传播



  • 1对多模型–序列生成任务

长序列循环神经网络

  • BP的困难–回传是线性的

    • error双倍,则回传的错误也是双倍的–>梯度爆炸或消失

      • δat=g1′(zat)(WyaTδyt+Waa′Tδa′t+1),忽略第一项,看第二项可以知道是线性的\delta_a^t=g_1'(z_a^t)(W_{ya}^T\delta_y^t+W_{aa'}^T\delta_{a'}^{t+1}),忽略第一项,看第二项可以知道是线性的δat​=g1′​(zat​)(WyaT​δyt​+Waa′T​δa′t+1​),忽略第一项,看第二项可以知道是线性的
    • 梯度膨胀(容易发现:
      • (梯度修剪)限制梯度(好解决点
    • 梯度消失(难以发现难以处理–GRU可以解决
  • GRU单元
    • 为了保留远时刻的信息
    • 门限循环单元
    • RNN的:
      • 输入层:(常用tanhat=g1(Waaat−1+Waxxt+ba)=g1(Wa[at−1,xt]+ba),zat=Waaat−1+Waxxt+baa^t=g_1(W_{aa}a^{t-1}+W_{ax}x^t+b_a)=g_1(W_a[a^{t-1},x^t]+b_a),z_a^t=W_{aa}a^{t-1}+W_{ax}x^t+b_aat=g1​(Waa​at−1+Wax​xt+ba​)=g1​(Wa​[at−1,xt]+ba​),zat​=Waa​at−1+Wax​xt+ba​
      • 输出层:(softmaxy^t=g2(Wyaat+by),zyt=Wyaat+by\hat{y}^t=g_2(W_{ya}a^{t}+b_y),z_y^t=W_{ya}a^{t}+b_yy^​t=g2​(Wya​at+by​),zyt​=Wya​at+by​
    • GRU(简单版本):
      • ct=atc^t=a^tct=at
      • 输入:c~t=tanh(Wc[ct−1,xt]+bc)输入:\tilde{c}^t=tanh(W_c[c^{t-1},x^t]+b_c)输入:c~t=tanh(Wc​[ct−1,xt]+bc​)–和RNN的输入一样
      • 激活门/更新门:Γu=σ(Wu[ct−1,xt]+bu)激活门/更新门:\Gamma_u=\sigma(W_u[c^{t-1},x^t]+b_u)激活门/更新门:Γu​=σ(Wu​[ct−1,xt]+bu​)–sigmoid–0/1
      • ct=Γu∗c~t+(1−Γu)∗ct−1,Γu=1,更新并遗忘过去c^t=\Gamma_u*\tilde{c}^t+(1-\Gamma_u)*c^{t-1},\Gamma_u=1,更新并遗忘过去ct=Γu​∗c~t+(1−Γu​)∗ct−1,Γu​=1,更新并遗忘过去–决定遗忘还是记住过去
    • GRU(完全):
      • ct=atc^t=a^tct=at
      • 输入:c~t=tanh(Wc[Γr∗ct−1,xt]+bc),输入:\tilde{c}^t=tanh(W_c[\Gamma_r*c^{t-1},x^t]+b_c),输入:c~t=tanh(Wc​[Γr​∗ct−1,xt]+bc​),–和RNN的输入一样
      • 输入门:Γr=σ(Wr[ct−1,xt]+br)输入门:\Gamma_r=\sigma(W_r[c^{t-1},x^t]+b_r)输入门:Γr​=σ(Wr​[ct−1,xt]+br​)–sigmoid–0/1,备选状态和前一时刻状态是否相关
      • 激活门/更新门:Γu=σ(Wu[ct−1,xt]+bu)激活门/更新门:\Gamma_u=\sigma(W_u[c^{t-1},x^t]+b_u)激活门/更新门:Γu​=σ(Wu​[ct−1,xt]+bu​)–sigmoid–0/1
      • ct=Γu∗c~t+(1−Γu)∗ct−1,Γu=1,更新并遗忘过去c^t=\Gamma_u*\tilde{c}^t+(1-\Gamma_u)*c^{t-1},\Gamma_u=1,更新并遗忘过去ct=Γu​∗c~t+(1−Γu​)∗ct−1,Γu​=1,更新并遗忘过去–决定遗忘还是记住过去
    • 有两个门,比LSTM更快、可以扩大模型的规模
  • LSTM长短时记忆
    • 利用逻辑和线性运算来求乘法?
    • BPTT训练
      • 前向

        • 写门(输入门)

          • aLt=WLTxt+WLTbt−1+WLTst−1,b是输出,x是输入,s是状态(隐层)a^t_L=W_{L}^Tx^t+W_{L}^Tb^{t-1}+W_{L}^Ts^{t-1},b是输出,x是输入,s是状态(隐层)aLt​=WLT​xt+WLT​bt−1+WLT​st−1,b是输出,x是输入,s是状态(隐层)
          • bLt=f(aLt)b^t_L=f(a^t_L)bLt​=f(aLt​)
        • 遗忘门
          • aϕt=WϕTxt+WϕTbt−1+WϕTst−1,b是输出,x是输入,s是状态(隐层)a^t_\phi=W_{\phi}^Tx^t+W_{\phi}^Tb^{t-1}+W_{\phi}^Ts^{t-1},b是输出,x是输入,s是状态(隐层)aϕt​=WϕT​xt+WϕT​bt−1+WϕT​st−1,b是输出,x是输入,s是状态(隐层)
          • bϕt=f(aϕt)b^t_\phi=f(a^t_\phi)bϕt​=f(aϕt​)
        • cell
          • aCt=WCTxt+WCTbt−1,b是输出,x是输入,s是状态(隐层)a^t_C=W_{C}^Tx^t+W_{C}^Tb^{t-1},b是输出,x是输入,s是状态(隐层)aCt​=WCT​xt+WCT​bt−1,b是输出,x是输入,s是状态(隐层)
          • sCt=bϕtsCt−1+bLtg(aCt)s_C^t=b^t_\phi s_C^{t-1}+b_L^tg(a_C^t)sCt​=bϕt​sCt−1​+bLt​g(aCt​)
        • 读门(输出门)
          • aωt=WωTxt+WωTbt−1+WωTst−1,b是输出,x是输入,s是状态(隐层)a^t_\omega=W_{\omega}^Tx^t+W_{\omega}^Tb^{t-1}+W_{\omega}^Ts^{t-1},b是输出,x是输入,s是状态(隐层)aωt​=WωT​xt+WωT​bt−1+WωT​st−1,b是输出,x是输入,s是状态(隐层)
          • bωt=f(aωt)b^t_\omega=f(a^t_\omega)bωt​=f(aωt​)
    • 和GRU比:更强大和灵活,有三个门
  • 双向RNN
    • 上下文都用上
  • 深层RNN

LSTM





序列到序列的模型

(many to many

GRU或者LSTM/RNN都可以
采样可能得到多个句子,选择可能性最大的那个


单词表很大,词很多,每一个句子的获得都要搜索很多单词,都产生也不划算
以BFS/DFS搜索效果都不大好—》集束搜索
贪婪搜索会受到常用词影响而不一定是最好的

集束搜索——近似搜索

  1. 利用P(y1∣x)P(y^1|x)P(y1∣x)找到最可能的三个单词(集束宽度B=3)
  2. 对这三个单词再看第二个单词有没有合适的
    • 对每个单词分别计算P(y1,y2∣x)=P(y1∣x)P(y2∣y1,x),P(y2∣y1,x)是神经网络计算出来的P(y^1,y^2|x)=P(y^1|x)P(y^2|y^1,x),P(y^2|y^1,x)是神经网络计算出来的P(y1,y2∣x)=P(y1∣x)P(y2∣y1,x),P(y2∣y1,x)是神经网络计算出来的,单词表,10000,这里有30000个组合,再从这里挑出三个最大的组合
  3. 重复2

* 集束搜索宽度B=1:退化到贪婪搜索

  • B=∞B=\inftyB=∞:穷举、宽度优先搜索BFS
  • 实际应用中:B=10或者50

改进的集束搜索

  • 长度归一化

    • 以前的:P(y1,y2,...,yTy∣x)=P(y1∣x)P(y2∣y1,x)...P(yTy∣y1,y2,...,yTx−1,x)=Πt=1TyP(yt∣y1,y2,...,yt−1,x)P(y^1,y^2,...,y^{T_y}|x)=P(y^1|x)P(y^2|y^1,x)...P(y^{T_y}|y^1,y^2,...,y^{T_x-1},x)=\Pi_{t=1}^{T_y} P(y^{t}|y^1,y^2,...,y^{t-1},x)P(y1,y2,...,yTy​∣x)=P(y1∣x)P(y2∣y1,x)...P(yTy​∣y1,y2,...,yTx​−1,x)=Πt=1Ty​​P(yt∣y1,y2,...,yt−1,x)

      • argmaxyΠt=1TyP(yt∣y1,y2,...,yt−1,x)=argmaxyP(y1,y2,...,yTy∣x)argmax_y \Pi_{t=1}^{T_y} P(y^{t}|y^1,y^2,...,y^{t-1},x) =argmax_y P(y^1,y^2,...,y^{T_y}|x)argmaxy​Πt=1Ty​​P(yt∣y1,y2,...,yt−1,x)=argmaxy​P(y1,y2,...,yTy​∣x)
      • 乘积导致越来越小
    • 解决:log
      • argmaxyΣt=1TylogP(yt∣y1,y2,...,yt−1,x)argmax_y \Sigma_{t=1}^{T_y} log P(y^{t}|y^1,y^2,...,y^{t-1},x)argmaxy​Σt=1Ty​​logP(yt∣y1,y2,...,yt−1,x)

        • 是负数,所以以乘积或者求和得到的结果,序列越长则数值越小—趋向于选择短序列
      • 所以要归一化:argmaxy1TyαΣt=1TyP(yt∣y1,y2,...,yt−1,x)argmax_y \frac{1}{T_y^\alpha}\Sigma_{t=1}^{T_y} P(y^{t}|y^1,y^2,...,y^{t-1},x)argmaxy​Tyα​1​Σt=1Ty​​P(yt∣y1,y2,...,yt−1,x)
  • 目标函数:归一化的对数似然函数
    • argmaxy1TyαΣt=1TyP(yt∣y1,y2,...,yt−1,x)argmax_y \frac{1}{T_y^\alpha}\Sigma_{t=1}^{T_y} P(y^{t}|y^1,y^2,...,y^{t-1},x)argmaxy​Tyα​1​Σt=1Ty​​P(yt∣y1,y2,...,yt−1,x)

集束搜索的误差分析

  • y∗−−人的选择(最优,y^−−算法的选择y^*--人的选择(最优,\hat{y}--算法的选择y∗−−人的选择(最优,y^​−−算法的选择
  • P(y∗∣x)>P((^y)∣x)P(y^*|x)>P(\hat(y)|x)P(y∗∣x)>P((^​y)∣x):集束搜索错误了(因为他选的应该是概率最大的
    • 解决:增加B
  • P(y∗∣x)<=P((^y)∣x),y∗最优,但却预测的小,RNN有问题,P(y∗∣x)<P((^y)∣x)P(y^*|x)<=P(\hat(y)|x) ,y^*最优,但却预测的小,RNN有问题,P(y^*|x)<P(\hat(y)|x)P(y∗∣x)<=P((^​y)∣x),y∗最优,但却预测的小,RNN有问题,P(y∗∣x)<P((^​y)∣x)

–>以上结果是多个句子结果比较之后才能判别到底是RNN还是集束搜索的问题

图到文本

一到多
x是图的特征表示

注意力模型

  • 对长序列的问题(句子长或短性能都会变差)

    • 长序列不好记忆
    • 每次只考虑一部分,看一部分翻译一部分
  • 结构
    • 输入:低层仍是原来的双向RNN,但是输出层不要了(不直接产生输出),只保留隐层输出的向量(表示)
    • 输出,换成了另一个RNN
    • 产生系数的小神经网络也加进去
    • –》一起训练(BP)


每个c是所有低层输出的线性组合(并非只有图中的三个)

  • c1=Σt′α<1,t′>a<t′>,Σt′α<1,t′>=1,a是低层的隐藏层的输出c^1=\Sigma_{t'}\alpha^{<1,t'>}a^{<t'>},\Sigma_{t'}\alpha^{<1,t'>}=1,a是低层的隐藏层的输出c1=Σt′​α<1,t′>a<t′>,Σt′​α<1,t′>=1,a是低层的隐藏层的输出
  • α<t,t′>=softmax(et,t′)=exp(e<t,t′>)Σt′=1Txexp(e<t,t′>\alpha^{<t,t'>}=softmax(e^{t,t'})=\frac{exp(e^{<t,t'>}) }{\Sigma_{t'=1}^{T_x}exp(e^{<t,t'>}}α<t,t′>=softmax(et,t′)=Σt′=1Tx​​exp(e<t,t′>exp(e<t,t′>)​—保证和为1
  • e<t,t′>=g(st−1,at)e^{<t,t'>}=g(s^{t-1},a^t)e<t,t′>=g(st−1,at)–用一个小的神经网络产生

国科大高级人工智能5-RNN/LSTM/GRU/集束搜索/attention相关推荐

  1. 国科大高级人工智能2020-2021年期末试题回顾

    国科大高级人工智能2020-2021年期末试题回顾 题型 选择题 简答题 应用题 附件 题型 题型没有变,仍然为选择题(20道,每道1分),简答题(3道,每道10分),综合应用题(3道,15,15,2 ...

  2. 国科大高级人工智能-总结

    文章目录 1.概论 2. 搜索 A\*最优性 三个传教士与野人 3.神经网络 RBM DBN DBM hopfield比较 结构及特性 逐层贪婪训练与CD BP GAN 4.逻辑 一个永远无法归结结束 ...

  3. 国科大高级人工智能6-GAN

    文章目录 生成式模型的基础:极大似然估计 GANs 最终版本 问题 非饱和博弈 DCGAN 不同类型的GAN conditional GAN 无监督条件GAN--cycle GAN 对抗学习 http ...

  4. 国科大.高级人工智能.2022期末考试真题回忆版

    选择 通过图灵测试意味着? 图神经网络 因果中的条件独立性判断 GAN tanh的曲线 哪一个是时序差分? 判断 启发函数的可采纳.一致的含义 广搜是代价一致搜索的特例 贪心搜索是A星算法的特例 爬山 ...

  5. 国科大 - 高级人工智能(沈华伟等)- 期末复习 - 试卷

    历年考点 2016 2017 2018 2019 2020 简答题 蚁群.粒子 蚁群.粒子 蚁群.粒子 蚁群.粒子 简答题 A* 最优性 BP GAN 感知机 BP BP 激活函数 简答题 语义网络 ...

  6. 国科大高级人工智能12-博弈

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...

  7. 国科大高级人工智能10-强化学习(多臂赌博机、贝尔曼)

    文章目录 多臂赌博机Multi-armed bandit(无状态) 马尔科夫决策过程MDP(markov decision process 1.动态规划 蒙特卡罗方法--不知道环境完整模型情况下 2. ...

  8. 国科大高级人工智能9-模糊数学和遗传算法

    文章目录 1.模糊计算 笛卡尔积.关系 模糊集 连续的隶属度函数 运算 2.evolution 遗传算法 1.模糊计算 why模糊 取得精确数据不可能或很困难 没有必要获取精确数据 模糊性概念:对象从 ...

  9. 国科大高级人工智能8-归结原理和horn子句

    只有一条规则的推理 resolution(消解,归结) CNF(conjunction normal form合取范式 (A∨B)∧(B∨C)(A∨B)∧(B∨C)(A∨B)∧(B∨C) 任何逻辑式都 ...

最新文章

  1. Chrome开发者工具中Elements(元素)断点的用途
  2. golang string切片解析json
  3. 学习分布式不得不会的CAP理论
  4. ecshop flow.php?step=checkout,【原创文章】推荐两种调试ecshop php程序日志记录的方法...
  5. java容器遍历_高效遍历Java容器详解
  6. RealProxy AOP的实现
  7. FANUC主板图纸 电路图
  8. 小夜灯离线语音识别芯片IC 声控小夜灯IC
  9. 海康威视工业相机驱动下载地址
  10. SAT数学解题方法介绍
  11. SLAM学习(SL)基于特征的前度匹配(LOAM系列)
  12. 熟女姿态:完美女人必备的十个资本!
  13. QT下的几种透明效果
  14. 什么是大数据?以及大数据的5V特性
  15. create-react-app之构建应用
  16. 如何在JavaScript中循环遍历JSON响应
  17. 2022年山东省安全员A证考试题库及山东省安全员A证新版试题
  18. OpenGL学习: 投影矩阵和视口变换矩阵(math-projection and viewport matrix)
  19. 若川的2019年度总结,波澜不惊
  20. 同花顺行情服务器在哪个文件夹,同花顺的文件目录(文件结构)

热门文章

  1. 深入掌握Linux操作系统,其实也没你想象那么难
  2. 你知道用git打补丁吗?
  3. Linux内核中的GPIO系统
  4. Moblin MID开发学习笔记 - application launcher安装过程
  5. mkimage command not found
  6. android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...
  7. 怎么做批注_BIM平台是什么?有何用?怎么用?
  8. javascript option 菜单图标_苹果电脑上神奇的Option键 巧用option键提升效率
  9. Vuex在项目中使用
  10. LeetCode 2136. 全部开花的最早一天(贪心)