gamit怎么利用glred生成测站时间序列_香侬读 | 按什么套路生成?基于插入和删除的序列生成方法
“香侬读”是香侬科技(Shannon.AI)推出的栏目,每周解读NLP或前沿、或经典的论文,捕捉时下最新见解,探究未来发展趋向。欢迎大家广泛讨论、交流,也欢迎推荐优秀的文章与我们一起分享。
论文标题及作者:
^1 KERMIT: Generative Insertion-Based Modeling for Sequences, from Google and UCB, William Chan, Nikita Kitaev, Kelvin Guu, Mitchell Stern
^2 Insertion Transformer: Flexible Sequence Generation via Insertion Operations, from Google and UCB, Mitchell Stern, William Chan et al.
^3 Insertion-based Decoding with automatically Inferred Generation Order, from FAIR and NYU, Jiatao Gu, Qi Liu, Kyunghyun Cho
^4 Levenshtein Transformer, from FAIR and NYU, Jiatao Gu, Changhan Wang, Jake Zhao
^5 Non-Monotonic Sequential Text Generation, from NYU, Sean Welleck, Kiante Brantley et al.
WARNING:长文预警!长文预警!长文预警!
前言
在之前这篇文章中我们提到了AR和BERT各自的优缺点,对于AR而言,它有下述的优点:
- 依赖性,可以在一定程度上建模语言符号的相关性
- 线条性,单方向生成语言符号,契合人类读、说习惯
- 简便性,使用简单的RNN模型可以非常便捷地训练和推理,并且效果较好
然而,AR的模式也具有不可避免的缺点:
- 生成方向固定,不能充分利用上下文信息,而且单方向生成的效果是否是最佳也存疑
- 缺乏可解释性,由于单一方向的生成,我们无法解释生成位置与语法特征的关系
鉴于以上的特点,我们可能会想,有没有那种Non-AR的方法,在不失较多效果的情况下,还能够满足下面尽可能多的条件:
- 能够学到最优的生成顺序,而不是单一地按照单方向进行生成
- 生成的顺序能够有可解释性,即是否在生成中具有某种模式
- 提高生成的效率,最好能够在一定程度上并行 - 模型还能在生成之后进行动态修改
可以看到,当下流行的seq2seq的AR结构(如LSTM、Transformer)不能满足上述任何一个条件,这是AR的固有缺陷决定的,因此我们有必要对Non-AR的方法进行研究,来进一步揭示深度模型的生成规律。下面,我们将一起探究近期的五篇论文,看看它们是否解决了上述问题,效果和AR相比又如何。注意,本文不会逐篇翻译论文,而是从思考的角度交叉讲解,如有疏漏,还望谅解!
背景:AR与Non-AR——狭路相逢勇者胜
按照老规矩,我们还是首先来简要回顾一下AutoRegressive和Non-AutoRegressive模型。
AutoRegressive模型
自回归模型简单地说就是“用过去预测未来”,即序列
可以看到,
可以看到,每一个时间步
这里
Non-AutoRegressive模型
非自回归模型简单来说就是不按照单一方向进行生成的模型,首次在机器翻译任务上被提出^6。而且,我们又不能丢失其中的相关性,这就要求我们需要引入一个隐变量。所以,我们现在的任务是最大化:
这里
思考:从AR到Non-AR——几时红樱吹绿荷
现在我们要思考的是,如何进行Non-AR生成。也许你会想到,我们可以同时从两个方向生成,然后让它们进行交互^7。的确,这确实是Non-AR的方法,因为一个方向在每个时间步的生成不仅依赖于本方向之前生成的结果,而且还依赖于另一个方向的生成结果。然而,这种方法是非常平凡的,因为本质上没有突破AR的框架,在训练和推理时相比AR方法也没有显著优势。
另外一个非常朴素的想法是,我们可以预先定义生成的顺序,比如先生成词典中常见的词,或者先生成标点等^8。这时候我们可以采用两趟(two-pass)生成的方法,在第一趟生成我们首先定义要生成的符号,对暂时不生成的符号产生一个占位符,然后在第二趟再填充这些占位符。如果第二趟的生成不考虑第一趟生成的符号,那么整个过程依然是AR的,尽管分为了两次。如果第二趟的生成时考虑第一趟的符号,并且考虑了位置的关系,那么整个过程就是Non-AR的。^8表明这些预定义的顺序并不比普通的AR更加优越,只是相对而言先生成标点与功能符号效果更好。在这个Non-AR过程中,由于两趟生成过程,模型的推理过程并不具备优势,虽然是Non-AR模式,但是我们还是只能一个一个生成,不可并行。
既然双向和预定义生成顺序不可行,那么我们就要另辟蹊径。回到我们的语言,我们会发现,大部分情况下我们说的句子并不是其中每个词都和其他词有关联。比如:“我和广州的张宝宝赛跑。”在这里,“我”和“张宝宝”没有直接关系,但它们都是“赛跑”的论元,在这个角度上具有间接联系,因此,假如模型能够首先生成“赛跑”,那么下面完全可以一起生成“我”和“张宝宝”,再生成“和”与“广州的”。这是因为这里的“和”实际上不是个连词,而应该是个介词,“广州的”是“张宝宝”的修饰成分。现在的问题是,如果我们只是说生成这些符号,得到了 [ 赛跑,我,张宝宝,和,广州,的 ],还不能说生成结束。因为这些符号的位置难以确定,这是一个难点。一个非常naive的想法是,排序!我们可以额外搭建一个排序网络,把这些符号统统塞进去,输出最后的句子。然而,这样做效率太低。有没有更高效的办法?当然有!这就是我们下面要隆重介绍的内容。
方法:插入与删除——把山看来旧又新
简单插入^2
上面说了,我们想要边生成边对生成符号实现排序,我们自然就想到插入操作!在生成的每一步,我们不仅要选择生成一个符号,而且要判断这个符号所在的当前序列的位置。下图是^2中的例子:
在这个例子中,我们要生成的句子是“three friends ate lunch together”,如果每次生成一个,可以从空序列 [ ] 开始,如上图左。对于有
那么显然,在推理的每一步
这里
这里
这里的
现在的问题是,我们来怎么进行训练,而且保持训练和推理过程的匹配。^2给出了三种方法:从左到右,二叉平衡树和任意顺序。
从左到右
从左到右的方法比较简单,在给定样本
二叉平衡树
从左到右的方法不能并行,因此我们想要使得生成能够并行。一个自然的想法是以平衡树的方法来生成。譬如,我们想要生成 [ A,B,C,D,E,F,G ],那么可以按照下面的顺序生成:[] -> [ D ] -> [ B,D,F ] -> [ A,B,C,D,E,F,G ]。为此,在训练阶段,对给定样本
假定现在我们选定了长度的
然后再定义
由于
任意顺序
为了鼓励模型自动学到在何位置生成何符号,我们可以使用任意顺序的生成方案。为此,我们只需要将(13)式中令
下图是二叉平衡树和任意顺序的损失分布:
可以看到,平衡树损失鼓励模型优先生成中间的符号,而任意顺序使得生成每一个符号的概率相同。
在推理的时候,我们也有两种方法:贪心推理和并行推理。贪心推理很简单,每一步选择概率最大的即可。对于并行推理,在每一步我们首先要对每一个槽计算出现在其中的最大概率的符号:
这时候,如果我们采用的是(6)的分解式,我们已经得到了
整个模型都是基于Transformer的编码-解码结构。
更强的生成模型^1
注意到上面的方法还是基于Encoder-Decoder结构的,因此不能对联合概率
对于给定的序列
这样,我们就可以进行分解:
最后的等式应用了Markov假设。对于
但是,现在问题是上式的复杂度是
现在用
然后我们把
为了计算
1. 抽样
2. 抽样
3. 计算
在推理阶段,我们按照^2,使用贪心或者并行的策略。
如果我们有序列对
可以看到,这个方法和BERT具有相似的结构,唯一不同的是,BERT输出的是输入中被Mask的部分,而该方法输出的是插入的位置和字符。而且,最关键的是,该方法还可以用于生成任务。这就在上面的Insertion Transformer的方法上得到了极大的泛化。
生成模式^5
上面的方法尽管可以并行,但是我们不能从中窥见生成模式,我们还是希望可以找到某种生成的模式或规律,探究模型在生成的时候到底经历了什么,并且同时还可以并行。
自然地,我们想要把树状生成利用起来。上面的平衡树方法是非常“整齐”的,因为我们钦定了每次都要去生成最中间的一个符号,这样一来就丢失了其中的生成模式,要是我们想让模型自动去生成这个树呢?比如,现在生成了一个根节点,然后再生成左右子节点,然后再生成子节点的子节点,以此类推,但不同的是,这棵树不一定平衡,甚至可能退化成一条链,但我们获得了模型的生成模式,如下图所示:
我们用符号<end>
表示当前子树生成结束,故当前字典为
假定我们只有一个序列
所谓Learning-to-search,就是模仿一个参考策略
用数学语言来说就是,我们用
现在我们要去选择
概率由下式给出:
同样地,我们可以预定义三种不同的策略:任意顺序、指导策略和退火指导策略。
任意顺序
同简单插入的情况,这里我们令
指导策略
任意顺序的策略会导致一个问题:难以使得
这样一来,既可以避免不合法的行为,也可以按照当前策略
退火指导策略
指导策略也有一个问题:它不会引导模型进行多样化的学习。因此,我们可以再适当加入
这里
上面说的是给定单个句子
用这种方法,我们可以根据生成的树,清晰地看到生成的模式,下图展示了一些有趣的例子。首先我们来看看
然后是
最后我们把它们放在一起进行比较:
从这些例子中可以很清楚地看到,
不受限生成^3
上面的三种方法,都需要我们自定义生成的顺序或策略,总之需要人工去干预。我们想解放和发展生产力,不用自己去干预,让模型自己学习顺序,该怎么办呢?让模型自己去搜吧!我们可以把这种方法叫做不受限的生成。
为了方便起见,我们还是沿用之前的记号,尽管这些论文中的记号都不同(苦笑)。我们还是取
且
这里
现在我们的主要任务就是,如何让模型自动去学习插入位置。注意到我们之前一直使用的是绝对位置,这个方法有一个问题:由于每一步的生成都会使得字符的位置发生改变,这就要我们进行额外的调整(至少还要多写一些代码对吧~),而且难以操作,尤其是送入单个网络的时候。我们想要避免这些麻烦,接下来我们可以用神奇的相对位置!
我们使用
你可能会问,用相对位置有什么优势呢?最大的优势就是,我们可以不用对
这样一来,我们每次就不用重新计算之前的隐状态,节省了时间,简便了计算。
假如现在我们已经生成了
这里
整个模型依旧基于Transformer,不同的是,我们不仅需要预测下一个字符,还需要预测它的相对位置,即:
我们用最后一个表示
然后再去预测其相对位置:
这里
我们还有最后一个问题:如何训练和推理。我们应该去优化(27)(28)式,但是由于高复杂度无法处理。相反,我们去优化Evidence Lower BOund(ELBO),通过引入一个近似后验分布
现在问题又又又又来了:这个
我们要这样的
其中我们假定
上面的beam search可以帮助我们找到贪心下最优的生成顺序,但是,同时也减少了生成全局最优的可能性,为此,我们可以在beam search的同时加入dropout。
在实际的实验中,用上面的方法导致模型生成很多标点和功能符号,这是因为位置预测模块的学习比字符预测模块的学习快得多。为此,我们可以用一种固定顺序如L2R去预训练整个模型,然后再用SAO去微调。
现在我们可以由模型生成任意顺序了,但是,这种方法有一个问题:不能并行。因为该方法还是需要一个一个去生成字符和位置。我们还是想要能够在此基础上并行。
同步生成与修改:加入删除操作^5
现在好了,我们可以让模型自己学习最佳的插入顺序和位置,但是,问题又来了:我们的模型生成之后不能进行修改。假如现在要生成的句子是“你跑得比广州的张宝宝快”,但是,我现在已经生成了 [ 你,张宝宝,澳门 ] ,糟糕,生成了一个“澳门”,目标句子中根本没有,我想把它删除,怎么办?这时候,我们就要进一步引出“删除”操作了,一边插入一边删除,一边生成一边修改,岂不美哉?
我们可以用一个五元组来定义
Levenshtein Distance
(是一种编辑距离)去度量。
假定我们现在有一个序列
删除
对序列
插入
对插入操作,首先对
综合
我们综合上面的行为,把“删除——插入——生成”视为一趟,那么
这里
整体模型结构依然是Transformer,解码端如下所示:
接下来的问题依旧是怎样学习策略。最简单的,我们还是可以用模仿学习。假设我们现在有一个参考策略
这里
这里
这里
现在最后的问题是如何构造参考策略。一是可以使用真值策略,返回的是最优行为
这里使用Levenshtein Distance
进行度量。
二是可以使用一个教师模型。我们首先训练一个AR模型,然后把真值序列
这个方法是上一个方法的大幅改进,既可以边生成边修改,而且可以并行,效果速度两开花。
小结
下面我们对这五种方法做一个比较,为简便起见,我们把这五种方法分别命名为:Insertion
,KERMIT
,Non-Monotonic
,InDIGO
,Levenshtein
。如下表所示:
表现:更好,更快——硕果含露待明朝
在本节我们来看看上面这些方法的实验结果,我们不会对每个实验事无巨细地呈现,而是选择具有代表性的实验及其结果。首先,我们来看看^6在MT上的结果:
可以看到,Non-AR的方法至少是AR方法速度的两倍,而且,我们还可以牺牲效果换取更高的速度。当然,这样的代价在BLEU
评估指标下显得有些过多,我们还需要减少效果代价。
由于方法上的不同,我们可以期待Insertion
可以有更好的效果,下图是在WMT 2014 English-German 验证集上的实验结果:
可以看到,使用平衡树的方法普遍优于任意顺序的方法,甚至在加入数据蒸馏后能够优于传统的L2R生成,而且令人惊讶的是,并行解码的方法可以取得更好的效果。为了进一步说明,下表展示了在测试集上的结果:
可以看到,使用平衡树的方法,无论是贪心还是并行,都能和Transformer的AR方法匹敌,而且理论上可以达到
NAT
,但是在效果上有了大幅改进。这验证了简单插入的有效性。那么,对于更加复杂的模型,如 KERMIT
又如何呢?下图依然是 WMT 2014 English-German 测试集上的结果:
可以看到,KERMIT
最优的结果甚至超过了Transformer baseline,而且可以控制复杂度至
KERMIT
特殊的模型结构(类似BERT),我们可以直接在GLUE上进行评估:
可以看到,KERMIT
比GPT
不知道效果好到哪里去了,虽然比BERT
略差,但是KERMIT
还可以用于生成任务,这一点BERT
目前还望尘莫及。
下面我们再来看看树状生成模式模型Non-Monotonic
。我们知道,AR的生成方法不能直接用于句子补齐,即扣掉句子中的一些词,要求我们进行补齐。这一点和BERT比较相似,但我们又知道BERT不能直接用于生成任务,这就在这两个任务之间造成了隔阂。最近的XLnet为消弭该隔阂提供了解决思路,但还是没有成熟的解决方案。在这里,Non-Monotonic
的方法不仅可以用来对生成模型进行解释,而且还可以消除这两种任务的隔阂。具体地,对于句子补齐任务,我们只需要将模型在LM上预训练,然后给出句子中出现的词及其位置,我们就可以得到一个初始树,然后继续在这棵树上进行生成即可。比如下面的例子:
对于MT,实验在IWSLT’16 German-English上进行,结果如下:
可以看到,该方法比AR略有不足,这是因为我们将生成强行限制在了树状上,极大减小了句子空间,这可能就是模型命运的选择吧。
下面我们要介绍的是InDIGO
在MT上的实验,结果如下:
这里,中间的若干行都是不同的AR生成策略。可以看到,在三个数据集和各种指标下,SAO
都比AR好,而且,从下表可以知道,bootstrap和dropout都有贡献:
下面给出了一个生成的例子:
我们从中可以发现,实际上SAO
并没有和L2R的方法差太多,一个明显的不同是,SAO
首先将句子分为连续的字符段序列,在每个段内按照L2R的方法进行生成,这是因为,相比L2R的方法,将句子分为小段,可以更好地收集上下文信息,不会使得与最先生成的字符相距太远而导致信息丢失
最后我们来看Levenshtein
。下表是在 WMT'16 Ro-En,WMT'14 En-De,WAT2017 Small-NMT En-Jahe Gigaword上的结果:
可以看到,Levenshtein oracle
的效果堪比Transformer
,而加了Transformer tearcher
之后表现几乎总好于Transformer
,并且还快得多。
此外,我们还想评估模型的修改效果,为此,我们还进行了APE实验,下表是实验结果:
在这里,左边的结果是BLEU值,右边的结果是TER翻译错误率。可以看到,Levenshtein
几乎承包了所有任务上的最优结果,表明了这种修改的可行性。为了更加直观地展示,下图是在MT和APE上的折线图:
图例中的D表示deletion,P表示placeholder。可以看到,LveT
已经优于Transformer,如果再加上真值deletion和placeholder,可以进一步得到巨大提升。为此,我们可以借助人工标注大幅提升纯模型效果。
经过上述的若干实验,我们可以总结一下:Non-AR并不就不AR差,因为这一方面非常符合人类的语句生成与判断,另一方面也是对深度模型的挖掘。重要的是,我们还可以利用Non-AR去并行计算,这就缓解了长期以来AR被诟病的无法并行的问题(大名鼎鼎的Transformer的一个重要成果就是可并行)。更快,更好,是Non-AR的目标。
结论:简单点,生成的方式简单点——得二其一有新绩
现在我们知道了,对于生成任务而言,目前主流的是AR模式,但是近两年来Non-AR的模式有新竹蓬勃发展之势,相比AR,Non-AR最大的优势在于可并行且不失其效果。我们知道,从并行的角度来看,Transformer的提出可谓是解决了编码端的一大痛点,但是解码端的并行一直未能有好的方案提出。在过去的很多年内,新的AR模型结构不断推陈出新,但是都始终未能实现突破,直到^6的出现。我们认为,未来一个可发展的研究点就在Non-AR上,包括:
- 如何像BERT那样进一步引入大量无标注数据进行预训练
- 如何进一步提高并行效率,甚至在不失效果的情况下复杂度达到
- 如何像Transformer那样实现任意字符表示间的交互,而且可以并行
- 如何在模型自动学习生成顺序的情况下得到可解释性
上面的五种方法都只是对上述问题进行了初步回答,还有待进一步开发。当然,这不是说AR的方法就会被淘汰,就像有了Transformer之后LSTM依然大有可为。对于AR方法,我们可能需要进一步对其进行无监督方向的扩展,就像^11一样,把语法推导和AR联系起来,甚至还可以和Non-AR联系起来(当然这都是后话了)。
总而言之言而总之,无论是AR还是Non-AR,目前都还有巨大的探索空间,庞统还是诸葛亮,值得我们一起期待。
参考文献
Chan, William & Kitaev, Nikita & Guu, Kelvin & Stern, Mitchell & Uszkoreit, Jakob. (2019). KERMIT: Generative Insertion-Based Modeling for Sequences.
Stern, M., Chan, W., Kiros, J. & Uszkoreit, J.. (2019). Insertion Transformer: Flexible Sequence Generation via Insertion Operations.
Gu, Jiatao & Liu, Qi & Cho, Kyunghyun. (2019). Insertion-based Decoding with Automatically Inferred Generation Order.
Gu, Jiatao & Wang, Changhan & Zhao, Jake. (2019). Levenshtein Transformer.
Welleck, S., Brantley, K., Iii, H.D. & Cho, K.. (2019). Non-Monotonic Sequential Text Generation.
Gu, Jiatao & Bradbury, James & Xiong, Caiming & Li, Victor & Socher, Richard. (2017). Non-Autoregressive Neural Machine Translation.
Zhou, Long & Zhang, Jiajun & Zong, Chengqing. (2019). Synchronous Bidirectional Neural Machine Translation.
Ford, Nicolas & Duckworth, Daniel & Norouzi, Mohammad & E. Dahl, George. (2018). The Importance of Generation Order in Language Modeling.
Ross, S., Gordon, G., and Bagnell, D. (2011). A reduction of imitation learning and structured prediction to no-regret online learning.
Daume, H., Langford, J., and Marcu, D. (2009). Search-based structured prediction.
Shen, Yikang and Tan, Shawn and Sordoni, Alessandro and Courville, Aaron. (2019). Ordered Neurons: Integrating Tree Structures into Recurrent Neural Networks.
亲,更多NLP干货请关注我们的知乎“香侬慧语科技”与微信公众号“香侬科技”哦~ 如果您有优秀的有关NLP的文章推荐,您可以发送至邮箱qinghong_han@shannonai.com,一经采纳,我们会在当期“香侬读”栏目中注明惹~
gamit怎么利用glred生成测站时间序列_香侬读 | 按什么套路生成?基于插入和删除的序列生成方法相关推荐
- 网页一键生成app软件_施工方案不会写?4个工程人必备的自动生成软件,一键生成超便利!...
对于工程人来说,施工方案和技术交底的编制是基本功,但对于新人来说,编制和整理起来还是有一定难度的. 今天整理了工程人必备的自动生成软件,可以自动生成技术交底.施工方案.施工横道图和施工图等,安装快速, ...
- vb不能插入png图片_收藏备用!!VBA操作图片【插入导出删除】
作者学习VBA以来搜集的操作图片的代码都在这里了.这就是我说的用到时候修修改改的源代码. ▶▶▶单元格(合并单元格)插入图片 Pictures.insert通用性不如shapes.addpicture ...
- mybatis 增删改查、批量插入和删除以及自动生成uuid主键和分页
Mapper接口: public int update(Admin admin); public Admin selectByUserName(String account); public List ...
- 目录树 删除 数据结构_数据结构:B树和B+树的插入、删除图文详解
B树 1.1B树的定义 B树也称B-树,它是一颗多路平衡查找树.我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数.当m取2时,就是我们常见的二叉搜索树. ...
- NOMAO软件测试工资,基于混合遗传算法的测试数据自动生成研究
为了提高软件测试中测试数据自动生成的效率,提出了一种基于混合遗传算法的测试数据自动生成的方法.在传统的遗传算法中引入模拟退火的思想,先利用遗传算法快速搜索到近优解,再使用模拟退火算法局部寻优,实现两种 ...
- IJCAI 2018 基于主题信息的神经网络作文生成模型
本文介绍哈尔滨工业大学社会计算与信息检索研究中心(SCIR)录用于IJCAI 2018的论文<Topic-to-Essay Generation with Neural Networks> ...
- oxygen 生成java对象_利用oxygen编辑并生成xml文件,并使用JAVA的JAXB技术完成xml的解析...
首先下载oxygen软件(Oxygen XML Editor),目前使用的是试用版(可以安装好软件以后get trial licence,获得免费使用30天的权限,当然这里鼓励大家用正版软件!!!) ...
- 异常检测时间序列_时间序列的无监督异常检测
异常检测时间序列 To understand the normal behaviour of any flow on time axis and detect anomaly situations i ...
- python图书馆管理系统实验报告_基于Python的图书馆业务报表自动生成研究
龙源期刊网 http://www.qikan.com.cn 基于 Python 的图书馆业务报表自动生成研 究 作者:辛海滨 来源:<电脑知识与技术> 2016 年第 27 期 摘要:针对 ...
最新文章
- 50行Python代码 就能轻松实现中英文对接翻译小程序
- mysql jdbc路径,mysql转存数据库后,如何修改jdbc:mysql的路径
- kafka查看topic中的数据_实战!Kafka Manager能统计出Topic中的记录条数吗?
- CF838C-Future Failure【dp,子集卷积】
- 我被跨系统的换行符折磨疯了~~~
- ubuntu pycharm mysql_ubuntu安装mysql pycharm sublime
- GEF: 图形拖拽处理
- sweetalert
- matlab按图像边缘抠图_PS抠图教程_PS抠图方法大全
- Falsy Bouncer
- 用c++随机生成10小学生算术题的课设
- java中线程池的实现原理:七参、四策
- C语言基础之14:结构和其他数据形式
- CDQZ多校集训题目--盛夏
- 论文笔记——EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES(解释和利用对抗样本)
- epic启动器在哪个文件夹_启动时|原神启动器在哪个文件中 启动器文件位置一览_234游戏网...
- html 组件化 编辑器,V14.0发布:组件化编辑器+数据透视表
- 基于jsp的酒店管理系统
- 存档用【20考研】国家线/34所自划线 集合!【计算机和软件专业】
- 2020-09-26 项目实践(一)
热门文章
- PHP+swoole 聊天窒 五子棋斗地主
- thinkphp框架的使用
- gsoap java_试图了解gsoap
- AndServer+Service 打造 Android 服务器实现 so 文件调用
- 分布式ID(唯一id-详解及教程)
- java炸弹游戏_java制作数字炸弹游戏-萌新疑点,Java语言交流,技术交流区,鱼C论坛 - Powered by Discuz!...
- js实现上拉加载更多
- GNSS基本概念(2):多路径效应
- 诗词-我儿名字藏头,你能猜出来,算你牛
- Linux系统中的软件管理详解(下)—搭建网络软件仓库及第三方软件仓库