写在前面——

自 2017 年 Transformer 技术出现以来,便在 NLP、CV、语音、生物、化学等领域引起了诸多进展。

知源月旦团队期望通过“Transformer+X” 梳理清 Transformer 技术的发展脉络,以及其在各领域中的应用进展,以期推动 Transformer 技术在更多领域中的应用。

我们在前几期中,介绍了 Transformer 的基本知识,以及其在 NLP、CV 领域的研究进展。在本篇推文中,我们将介绍Transformer 在语音中的应用。

后续我们将介绍 Transformer + 生物/化学等的研究。欢迎感兴趣的同学报名来参与到后续的工作中。

Github:floatingCatty/BAAI-Monthly-

申请加入Transformer +X 研究群:

本期贡献者

赵江杰、宋彤彤

邓雯敏、周寅张皓

本文为【知源月旦】团队完成的第四期综述,后续我们会定期更新最新前沿研究进展,敬请关注。

第一期:机器学习的可解释性

第二期:Transformer+NLP

第三期:Transformer+CV

01

导言

语音识别是人工智能领域研究历史很悠久的任务之一。从上世纪80年代起,高斯混合模型-隐马尔可夫模型(GMM-HMM)一直主导了语音识别的研究,随着深度学习的再次崛起和流行,发展出了深度神经网络-隐马尔可夫模型(DNN-HMM)[1],但是这两种模型方案都需要使用HMM来进行解码识别。

LSTM与CTC的结合摆脱了对HMM的依赖实现了端到端的语音识别,随后Attention机制为NLP领域带来技术革新的同时也惠及了语音识别,BLSTM+Attention的模型组合成为新的语音识别范式。

Transformer在自然语言处理领域被提出后,陆续被引入到语音识别及计算机视觉领域,并表现非常出色。2018年Linhao Dongdeng人[2]率先将Transformer模型引入语音识别领域,提出Speech-transformer,这是一个完全依赖Attention机制学习位置依赖关系的无重复seq-seq模型。

图1. Speech-transformer结构

Speech-Transformer提出后,有研究者将Transformer和RNN在各种ASR语料库中的应用进行了比较[3]。在他们的实验中,Transformer在13/15 ASR基准中表现出比RNN更大的优越性,证明了由于Transformer的并行训练能力及强大的序列建模能力,相比循环神经网络,基于Transformer的的编解码模型在语音识别任务中表现出更大优越性。

图2. 实验中各语料库的字符/单词错误率

本篇将对Transformer模型在语音识别领域的运用特别是在流式场景下的改进方案展开探讨。

02

流式模型

语音识别模型按使用场景可以分为离线模型和流式模型,离线识别模型在用户说完一句话或一段话之后再进行识别,而流式模型则是指用户还在说话的时同步进行识别,对识别的实时率有比较高的要求。由于Transformer编码器和解码器的自注意力机制需要对全序列上下文信息进行建模,同时编码器和解码器之间的注意力机制一次需要获取整个声学编码向量,计算时间复杂度和空间复杂度会随着语音时长的增加而变大,同时Transformer的多层结构会造成累积延迟,因此不能直接用于流式语音识别的场景中,将Transformer模型改进实现低延时的流式识别就显得非常有必要性,这个方向在学术研究上更具挑战性,同时也有非常大的工业应用价值。我们对近两年Transformer相关发表的大概15篇论文进行了调研,发现其中8篇都是关于Transformer流式识别的相关模型和技术方案,说明了transformer的流式解码也是ASR领域学术关注的热点。

目前看到使用较多的Transformer流式语音识别主要包括两类:Transducer结构模型,Joint Attention/CTC模型。

2.1 Transducer

在流式语音识别,RNN-T颇受欢迎。其结构如图3所示,原始RNN-T中,Audio Encoder和Label Encoder大多采用LSTM,Joint Network一般为前馈神经网络。RNN-T是一种序列到序列模型,但与其他序列到序列模型(如LAS,Transformer)有所不同的是,RNN-T不采用注意力机制,不需要一次获取整个输入语音编码序列,而是流式的处理输入并输出预测结果,是天生的流式结构。近几年研究人员也积极探索如何将Transfromer融入RNN-T中来进行流式语音识别[4-6]。

图3. RNN-T结构 [5]

2019年Facebook提出了Transformer-Transducer[4],在实验中,在将声学特征送入Audio Encoder前,堆叠两层VGGNet,此结构也相应被称为VGG-Transformer,一方面可以降低帧率,另一方面由于卷积能够很好的对位置信息进行编码[7],因此实验中取消了额外的位置编码。

图4. VGG-Transformer [4]

同时VGGNet采用因果卷积(Causal Convolution)防止未来信息的泄露。

图5. Causal Convolution [4]

在Audio Encoder的Transformer中使用截断的自注意力(图6(b))替代原来的全序列自注意力(图6(a)),来限制上下文窗口,从而进一步降低延迟。

图6. Self-Attention: (a) Unlimited (b) Truncated [4]

最终结果显示,当Audio Encoder为Transformer,Label Encoder为LSTM时表现最好,并且当截断自注意力的R=4,L=32时达到最优。

2020年谷歌提出了Transformer Transducer[5],与[4]的思路类似,通过替换Audio Encoder和Label Encoder为Transformer,并且通过对Attention Score的Mask来限制Audio Encoder与Label Encoder自注意力的上下文信息来降低延迟,但与[4]不同的是,该论文除探究对Audio Encoder上下文信息限制外,还探究了对Label Encoder不同长度上文信息限制对模型性能的影响。

除上述两篇文章,华为也尝试了将Transformer与RNN-T融合,提出了Conv-Transformer Transducer[6]。其在Audio Encoder中通过在Transformer层之间加入卷积层来降低帧率,同时获取未来信息,该结构被称为Conv-Transformer,其不仅能显著降低训练内存需求,还不会造成精度损失。

图7. Audio Encoder of Conv-Transformer Transducer [6]

实验中卷积的设置将帧率降为80ms,未来信息窗口大小固定为140ms。由于卷积可以获取到未来信息,因此在该论文中自注意力将被限制不能获取到下文信息,只能获取到上文信息,并通过限制获取到上文信息的长度从而实现流式识别。

图8. 上下文窗口及帧率再卷积层中的变化 [6]

综上,我们可以看出,将Transformer与RNN-T融合并进行流式的改进主要有以下几个方面:

(a)将RNN-T的Aduio Encoder和Label Encoder前者或两者改为Transfomrer。

(b)限制Transformer中Self-Attention上下文信息。

(c)通过在Audio Encoder中加入卷积层来降低帧率。

(d)Aduio Encoder中自注意力和卷积层往往只有一个可以获取到下文信息。

2.2 Joint Attention/CTC

另外一种比较常用的流式语音识别的方案是Self-Attention与CTC联合使用的混合方案。端到端的语音识别模型主要分为两类:Attention-based和CTC-based,Transformer属于其中的Attention-based模型,而CTC基于条件独立性假设,每个时刻的输出仅依赖于当前时刻的输入,不需要等待完整的上文输入,通过引入空白符,保持输入与输出的单调对齐(mono-tonic alignment),使用动态规划算法实现快速解码。但也因为CTC中每帧的输出是相互独立的,而一般对于语音识别的文字结果而言,由于文本中上下文有语义依赖,而CTC输出之间相互独立,因此为了实现更好的性能,在实际中使用CTC时往往会加上语言模型。

图9. CTC语音识别过程

Attention-based通过注意力机制对音频输入的各帧进行联合建模,与CTC假设各帧之间条件独立刚好相反,如果结合两者的特点来构建一个混合模型,就能利用两种机制各自优点和差异来实现更鲁棒的识别效果。在实际应用中,一般设置CTC与Attention共享一个encoder,目标函数联合优化CTC loss和Attention loss,在训练过程中利用CTC 的对齐信息来辅助Attention的非单调对齐,加速模型训练收敛[7]。在推理阶段,同样可以结合CTC和Attention的输出概率进行联合解码。

图10. Attention-CTC 混合结构模型 [7]

Transformer模型与Lstm模型的主要区别在多头注意力机制,但同样也需要完整编码encoder的信息才能进行解码,因此联合Attention和CTC的hybrid模型要实现流式主要是通过在encoder上进行改进。其中一种方式是基于chunk-wise的Chunk-SAE(Self-Attention Encoder)[8],将长度的L的音频输入按固定长度分为N个chunk,以其中的一个chunk作为centra chunk(









)为例,左边近邻的chunk作为Historical context(









),右边近邻的chunk作为Future context(









),在训练时只有Central chunk产生输出。这样在音频的encoder编码过程中,每次编码的长度就限定在三个chunk范围内(









+









+









),通过一个滑动窗口每次往后滑动产生输入,从而不再依赖于整段音频输入再进行解码。

这样的方式存在一个问题就是在chunk滑动的过程中存在









重复计算的问题,通过将









编码区对应的隐状态保存在context中,在下一次编码时不再需要编码









,从保存的context中读取对应位置的隐状态进行复用,减少encoder编码的时间。

图11. Chunk-SAE结构 [8]

解码时以截断区域(









+









+









)的encoder输出K作为decoder的一个输入,与decoder的targets表示Q共同计算截断attention(公式1):

(1)

(1)其中




表示可训练的bias参数,




表示一个噪声值。然后在分别与encoder输出V进行截断多头注意力计算(公式2):

(2)

(2)其中cumprod为累积的乘积函数,对应的就是









之前从





















时刻对应的(1-P)的连乘结果。

基于Chunk-SAE的截断的多头注意力机制实现了更高效的流式编解码,最后将decoder的输出概率
















与CTC的输出概率


















进行联合优化(公式3)输出最终的预测结果。


其中λ和γ都是可调节参数,













为语言模型的输出概率,如果希望构建端到端的模型就不需要语言模型,可以将γ置为0。通过实验比较联合CTC解码的Chunk-SAE模型的性能,相较于离线transformer模型延时降低到320ms,但性能仅仅下降0.18%。

另外一种联合CTC的方式是对注意力机制进行改进,比较典型的一种是TriggeredAttention。其中一种方案[9]在常规的Transformer encoder 中增加2层CNN对输入的音频帧的特征进行降采样,与chunk-wise不同,这里采用的是look-ahead的方式对encoder的输入进行截断,通过CTC预测一个Trigger点,设置一个固定的look-ahead长度作为future context,在编码过程中,只有当到达trigger点加上future context长度的位置,Transformer的encoder才会将当前编码器隐状态的输出送入decoder进行解码,实现流式编解码。

图12. TriggeredSelf-Attention 联合CTC模型结构 [9]

在计算encoder的输出时使用公式4,

(4)

其中











为一个预设的固定值,就是Future context设置的的帧数,n是当前输入的帧数。关键的地方在于截断点的位置,每个时刻的输入在encoder编码后通过CTC进行预测对齐,CTC实时预测的结果中第一个出现非<blank>的位置就是第一个trigger点,随后出现非<blank>和去重后的trigger点的位置就是序列中其他的trigger点。以下图为例,音频输入包含“dog”这个词的发音,<b>表示blank,t=3,6,7就是trigger点[10]。

图13. Trigger位置预测图示

随后docoder解码时使用Triggered attention,也是使用CTC的概率输出作为attention对齐的辅助信息,计算如公式(5)所示:

(5)












&#xff1a;










表示截断的frame特征经过encoder的输出,






























为输出对应的位置,







&#xff1a;







表示解码器生成的历史结果,








































表示Transformer decoder的输出概率(公式6):

(6)

最终优化的目标函数还是联合优化CTC和Triggered attention,在 LibriSpeech数据集上进行测试,该模型(












)与整句输入(






)的Transformer相比,CER仅出现较小程度的上升,延时(






)也下降到1230ms。

CTC与self-attention的结合,以chunk-wise和look-ahead为主的两种方式对编码输入进行截断,丢失了一部分上下文的信息,但是通过CTC的同步解码能力提供辅助信息用于attention对齐,兼顾准确率和延时性,也是流式语音识别方案一种不错的选择。

03

卷积增强

Transformer由于自注意力机制,擅长捕捉长序列依赖,在序列到序列任务中表现出色,而卷积则擅长对局部特征建模,在图像领域大放异彩。Conformer [11]结合两者优势,在语音识别准确率带入到新的高度。相比于原始Transformer,其主要改进在Encoder如下图所示,具体为:

图14. Conformer encoder 结构

(1)Mutil-Head Attention Module和Feed Forward Module中间加入Convolution Module。

(2)在Mutil-Head Attention Module前再加一个Feed Forward Module。

(3)每个Feed Forward Module采用半步残差连接,即前馈输出乘以0.5再进行相加。

(4)每个模块中,将Layernorm提前。

图15. Mutil-Head Attention Module

(5)将原始Feed Forward Module中的ReLU激活函数使用Swish激活函数替代。

图16. Feed Forward Module

Convolution Module中的结构如图17所示:

图17. Convolution Module

目前主流的端到端语音识别开源工具ESPnet也支持Conformer语音识别模型的搭建,并且在众多数据集上达到SOTA[12]。同时在最近比较热门的既可流又可非流的统一ASR模型中,Conformer取得了非常出色的表现[13],并且大有商用趋势。

04

总结

流式ASR的工程化考虑的是在实现流式模型的基础上搭建服务,使得流式ASR服务可以处理实际业务的大量调用请求,可以实现对业务场景所需的ASR服务的稳定支持。在研究模型的延时性能时,线下测试仅需要参考模型的推理的实时率RTF值(Real Time Factor),但对于部署的ASR服务,还需要考量这个服务部署在单机服务器上可以实现多少量的并发,即一个CPU或GPU在性能跑满时可以支持处理多少个访问请求,并且在用户感觉不到延迟的时间内返回识别结果,然后根据实际业务量来评估需要多少硬件资源来支撑部署ASR服务。因此模型要尽可能的优化和压缩到最少的耗时,在实现高并发性能的同时降低资源的消耗量。从硬件资源的角度来看,Transfomer支持并行计算,使用GPU会带来很大的速度提升。而RNN网络计算时存在时序依赖,GPU的加速效果不是很明显,选择CPU是一种较为经济高效的方式,因此需要根据选用的模型来决定成本较低的硬件配置方案。

另外流式ASR要实现上线使用需要进行反复的优化-验证-测试的迭代,这个逐步验证的过程就是一个完整的工程项目周期,比如现在要在线上用Transfromer-base替换原有的RNN-base模型,要综合考虑硬件成本、推理延时和性能,在项目工程化完成到一定阶段经过A/B测试验证高可用后才能逐步迭代上线,因此目前看到工业界使用较多的流式模型还是以RNN-base为主[14],但以阿里为代表的企业正在积极探索Transformer在流式语音识别上的落地实践[15]。

Transformer在NLP上取得的巨大的成功,在语音领域也同样延续了它优越的性能表现,在语音识别,语音增强[16],语音合成[17],说话人识别[18],声音事件检测[19]等语音领域方向都开始有了相关的应用研究,特别是在语音识别上的应用尤为引人瞩目。本文主要从近年来的一个学术研究热点-流式语音识别的相关研究出发,分享了两种主流的基于Transformer的流式语音识别方案,Transformer-Transducer及self-attention /ctc联合模型。其它的方案还包括与MOCHA[20]的结合和其它编码截断预测方式[21],本文不再做详细介绍。最后我们也期望看到更多Transformer-base的SOTA模型出现,并在工业界得以落地实践,体现Transformer的实际使用价值,推动整个语音识别领域的跨越发展。

参考资料

[1]Hannun, Awni, et al. "Deep speech: Scaling up end-to-end speech recognition."arXiv preprint arXiv:1412.5567(2014).

[2] Linhao Dong, Shuang Xu, and Bo Xu. "Speech-transformer: a no-recurrence sequence-to-sequence model for speech recognition."2018 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2018.

[3]Karita, Shigeki, et al. "A comparative study on transformer vs rnn in speech applications."2019 IEEE Automatic Speech Recognition and Understanding Workshop (ASRU). IEEE, 2019.

[4] C.-F. Yehet al., "Transformer-Transducer: End-to-End Speech Recognition with Self-Attention,"**p. arXiv:1910.12977Accessed on: October 01, 2019[Online]. Available:https://ui.adsabs.harvard.edu/abs/2019arXiv191012977Y

[5]Q. Zhanget al., "Transformer Transducer: A Streamable Speech Recognition Model with Transformer Encoders and RNN-T Loss,"**p. arXiv:2002.02562Accessed on: February 01, 2020[Online]. Available:https://ui.adsabs.harvard.edu/abs/2020arXiv200202562Z

[6] W. Huang, W. Hu, Y. Yeung, and X. Chen, "Conv-Transformer Transducer: Low Latency, Low Frame Rate, Streamable End-to-End Speech Recognition,"*ArXiv,*vol. abs/2008.05750, 2020.

[7] Watanabe, S., Hori, T., Kim, S., Hershey, J. R., & Hayashi, T. (2017). Hybrid CTC/Attention Architecture for End-to-End Speech Recognition. IEEE Journal of Selected Topics in Signal Processing, 11(8), 1240–1253.

[8] H. Miao, G. Cheng, C. Gao, P. Zhang and Y. Yan, "Transformer-Based Online CTC/Attention End-To-End Speech Recognition Architecture," ICASSP 2020 - 2020 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)

[9] N. Moritz, T. Hori and J. Le, "Streaming Automatic Speech Recognition with the Transformer Model," ICASSP 2020 - 2020 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)

[10] N. Moritz, T. Hori and J. L. Roux, "Triggered Attention for End-to-end Speech Recognition," ICASSP 2019 - 2019 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)

[11] A. Gulatiet al., "Conformer: Convolution-augmented Transformer for Speech Recognition,"*ArXiv,*vol. abs/2005.08100, 2020.

[12] P. Guoet al., "Recent Developments on ESPnet Toolkit Boosted by Conformer,"*ArXiv,*vol. abs/2010.13956, 2020.

[13] B. Zhanget al., "Unified Streaming and Non-streaming Two-pass End-to-end Model for Speech Recognition,"*ArXiv,*vol. abs/2012.05481, 2020.

[14]http://research.baidu.com/Blog/index-view?id=109

[15] Shiliang Zhang, Zhifu Gao, Haoneng Luo,"Streaming Chunk-Aware Multihead Attention for Online End-to-End Speech Recognition",arxiv:https://arxiv.org/pdf/2006.01712.pdf

[16] Jaeyong Kim,Mostafa EI-Khamy,Jungwon Lee ,"T-GSA: Transformer with Gaussian-Weighted Self-Attention for Speech Enhancement",arxiv:https://arxiv.org/abs/1910.06762

[17]Li N , Liu S , Liu Y , et al. "Neural Speech Synthesis with Transformer Network"[J]. Proceedings of the AAAI Conference on Artificial Intelligence, 2019, 33:6706-6713.

[18]X. Chang, W. Zhang, Y. Qian, J. L. Roux and S. Watanabe, "End-To-End Multi-Speaker Speech Recognition With Transformer," ICASSP 2020 - 2020 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)

[19 ]X. Chang, W. Zhang, Y. Qian, J. L. Roux and S. Watanabe, "End-To-End Multi-Speaker Speech Recognition With Transformer," ICASSP 2020 - 2020 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)

[20] Emiru Tsunoo , Yosuke Kashiwagi , Toshiyuki Kumakura,"TOWARDS ONLINE END-TO-END TRANSFORMER AUTOMATIC SPEECH RECOGNITION",arxiv:https://arxiv.org/pdf/1910.11871.pdf

[21] Chengyi Wang, Yu Wu, Liang Lu,"Low Latency End-to-End Streaming Speech Recognition with a Scout Network". arxiv:https://arxiv.org/pdf/2003.10369.pdf

打包下载链接:

https://pan.baidu.com/s/16XuCtkF5a7VzJnk2YgJ9ow  密码: 6qsq

Transformer +X 研究群:

欢迎加入兴趣组,共同交流Transformer研究进展


推荐阅读:

点击下方图片即可阅读

前沿综述 · 机器学习的可解释性

前沿综述 · Transformer 在各学科中的应用



点击左下角“阅读原文”,了解更多!

语音中的 Transformer一文打尽!相关推荐

  1. 量化感知训练_一文速览EMNLP 2020中的Transformer量化论文

    花了几天看了三篇EMNLP 2020中关于Transformer模型量化的相关论文,快速记一下要点. Fully Quantized Transformer for Machine Translati ...

  2. 计算机视觉中的transformer模型创新思路总结

    点击上方"计算机视觉工坊",选择"星标" 干货第一时间送达 作者丨仿佛若有光 来源丨CV技术指南 编辑丨极市平台 导读 本文回顾了ViT的结构,总结了计算机视觉 ...

  3. mysql适合储存高清电影的数据类型_下列数据类型中适合存储PDF文档的是( ) (5.0分)_学小易找答案...

    [单选题]咯血的特点不正确的是 [单选题]下面关于SHOW TABLES LIKE 't%'描述错误的是( ) (5.0分) [单选题]下列删除itcast数据库的sql语句中,正确的是 (5.0分) ...

  4. 大盘点!自动驾驶中基于Transformer的单目BEV感知

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 今天自动驾驶之心很荣幸邀请到Garfield,为大家分享自动驾驶中基于Transformer的单目BEV感知! ...

  5. 【组队学习】【30期】7. CV中的Transformer

    CV中的Transformer 航路开辟者:安晟 领航员:尚育鹏 航海士:安晟.袁明坤.闫永强 基本信息 开源内容:https://github.com/datawhalechina/dive-int ...

  6. 收藏 | 计算机视觉中的Transformer

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者丨Ch ...

  7. java如何给一个链表定义和传值_如何在CUDA中为Transformer编写一个PyTorch自定义层...

    如今,深度学习模型处于持续的演进中,它们正变得庞大而复杂.研究者们通常通过组合现有的 TensorFlow 或 PyTorch 操作符来发现新的架构.然而,有时候,我们可能需要通过自定义的操作符来实现 ...

  8. Word2013中怎样设置同一文档内粘贴选项

    在用户编辑或者书写Word文档时,经常碰到需要将前面已经输入过的某一段文字拷贝粘贴到后面中的情况.用户可以根据实际工作需要预设粘贴格式的类型,可以大大减轻操作上的复杂. 在Word 2013文档中,用 ...

  9. yy直播没声音html,驱动技巧:解决YY语音中麦克风无声或者有噪音的问题

    此类问题大都是因为没有正确配置好目前所用的麦克风,如果机器上有多个麦克风,这类问题将会非常常见,我们只需要在YY语音中配置一一下即可. 1.确认目前可用的麦克风是哪个 2.在YY语音中设置这个可用的麦 ...

最新文章

  1. 中国电子学会scratch等级考试四级编程题:找出出现次数最多的数字
  2. 和至少为k的最短子数组 python_LeetCode 862. 和至少为 K 的最短子数组
  3. T-Mobile旗下网站又曝安全漏洞 允许任何人查看他人账户信息
  4. LRU缓存实现(Java)
  5. 想学好编程,别背代码!
  6. Docker学习总结(29)——Docker核心技术与实现原理
  7. MyBatis之使用XML配置SQL映射(一)
  8. java中struts2框架,概述Java的struts2框架
  9. Python【每日一问】27
  10. 词表匹配工具FlashText
  11. PLC基础知识(一)—PLC入门简介
  12. 全栈开发工程师微信小程序-中
  13. HAL-STM32-USB内部Flash虚拟U盘更新程序
  14. python实现模拟浏览器操作
  15. 20189221 2018-2019-2 《密码与安全新技术专题》第六周作业
  16. freerdp 解压安装_Linux下安装FreeRDP,连接Windows远程桌面好软件软件.doc
  17. 美团王兴要向口碑饿了么学啥?
  18. CentOS 7 wget 正在连接 127.0.0.1:8118... 失败:拒绝连接。
  19. 系统资源不住无法完成请求的服务器,windows10系统提示“系统资源不足,无法完成请求的服务”怎么办...
  20. ES集群搭建主机规划

热门文章

  1. php mssql_result 255 string,PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
  2. c语言中eof_C语言的标准 “输入输出”!今天是你学C语言的第几天?
  3. java wait for_Java p.waitfor()永远等待
  4. mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引
  5. python有哪些常用的package_python package相关机制总结
  6. python在windows和linux_python在windows和linux下获得本机本地ip地址方法小结
  7. 使用angularJs ng-repeat做表格合并行效果
  8. 关于华为虚拟操作键收起后页面高度不会刷新问题的总结
  9. 11月8日学习内容整理:js的引入方式,变量数据类型,运算符,流程控制,函数...
  10. 社区智能家居产品研发商西谷数字新三板挂牌上市