科学网

 找回密码
  注册
科学网 标签 深度学习 相关日志

tag 标签: 深度学习

相关日志

清华大学雨课堂主讲嘉宾邹晓辉大综合公益课直播回放 第九课 人工智能之魂
geneculture 2020-6-10 18:44
https://www.bilibili.com/video/BV1j5411W7DA/ 一键搞定视听回放
个人分类: AI系列|1280 次阅读|1 个评论
向深度学习三剑客学习四种科研精神(上)
热度 5 dwchen 2020-6-9 14:57
向深度学习三剑客学习四种科研精神(上) 陈德旺 深度学习,尤其是深度神经网络学习算法的兴起和大数据的加持,结合GPU的算力,如同 “三英战吕布”,终于搞定了人工智能这一反复无常的“吕布”, 使得人工智能得以第三次复兴。 如今,人工智能技术向各行各业渗透,智能产业的发展正如火如荼。 饮水思源,我们不能忘记,提出深度学习核心算法并于2019年获得图灵奖的三位英雄:深度学习三剑客: Hinton, LeCun 和Bengio. 尤其,是要向他们学习以下四种创新精神,以更好地实现我国创新能力的提升。 1. 坚持神经网络研究三十年的坚定执着精神 Hinton, LeCun 和Bengio虽然在不同的国家,处于不同的阶段, 从20世纪八十年代开始,不约而同就对人工神经网络,尤其是神经网络学习算法,非常感兴趣。Hinton年纪较大,在另外2位还在读上大学或读研究生的时候,Hinton已经博士毕业,到斯坦福大学做博后了。1986年,Hinton与美国科学院院士Rumelhart等在Nature 上发表论文,提出了著名的BP(反向传播)算法: 多层神经网络参数学习算法,引起了神经网络第二次复兴的浪潮。 该经典论文至今已经被引用2万多次。 这次复兴之后,基于BP算法的神经网络解决了很多问题,相关研究和论文呈现井喷状态。 可惜,好景不长在。几年后,研究人员发现:BP算法虽然好用,但也存在收敛速度慢,容易陷入局部最小值和网络的初始化参数密切相关。尤其,由于训练时间太长,训练参数太多,内存经常溢出,难以处理如图像识别这类高维度和大量样本数据问题。于是,神经网络的研究陷入了第二次低潮: 很难拿到课题,很难发表论文 ,很多研究人员就放弃了,转向别的研究方向。 但是,Hinton不气馁,始终坚持研究方向不动摇,苦思冥想破解之道不懈怠, 转移到加拿大多伦多大学继续开展研究。在共同发明BP算法20年后,2006年Hinton,通过深度思考和编程实践,终于想出了针对高维数据的破解之道,在Science上发表了用神经网络减少数据维度的新方法,为深度学习的兴起奠定了理论基础,至今被引用1万余次。 之后,深度神经网络的发展可谓波澜壮阔,气势如虹。由于篇幅关系,就不逐一描述了。 2. 合作与争论并重的和谐团队精神 1987 博士毕业后,LeCun 去加拿大多伦多大学,追随神经网络的旗手人物Hinton 做了一年的博士后。在Hinton的启发和指导下,LeCun提出卷积神经网络用于手写体识别,大幅度提高了精度,引起了关注。但好景不长,该方法的通用性不强,还是难以处理更高维的彩色图像数据。 2003 年,LeCun到纽约大学任教并发展了第三个合作者:前公司同事 蒙特利尔大学教授Yoshua Bengio,与Hinton一起组成了所谓的“深度学习的阴谋( Deep Learning Conspiracy)”。据说,Bengio 在读研究生时,读到了Hinton的一篇论文,如被电击,找到了儿时非常喜欢的科幻故事的感觉。如今有机会加入偶像领导的神秘小组,自然是喜出望外。 2004年机会终于来了,Hinton拿到了一个加拿大政府支持的大项目,很快就组建了研究组,并邀请LeCun和Bengio加入了他的项目组。至此,三剑客正式进入了蜜月期 。为了证明神经网络是有用的,他们开发了更多层的神经网络(深度神经网络),用更大的数据集来训练网络,并在更强大的计算机上运行网络参数的学习算法。 Hinton 曾开玩笑地表示:三人平均每周都要见一次,而聚会经常以吵架结束。我想Hinton2006年在Science上发表的经典论文应该和这些吵架相关,吵架和辩论使Hinton的思考更有深度(深度思考)。十年面壁思考,十年讨论争论,Hinton化了整整20年的时间,终于想出了神经网络第二次衰落的关键破解之法。 达摩面壁9年(另说10年),9年后的2015年,三剑客合作写了一篇Deep Learning(深度学习)综述论文发表在Nature, 正式给他们的研究成果和无数相关研究树立了一面旗帜,影响了这些年AI的快速发展和智能产业的快速崛起,已经被引用2.5万余次了。 作者简介:陈德旺,IEEE高级会员, IEEE Trans.on ITS 编委, 中国自动化学会混合智能专委会副主任,中国运筹学会智能计算分会副理事长,美国加州大学伯克利分校访问学者, 福州大学数学与计算机科学学院教授、博士生导师,主要研究方向为人工智能、大数据和智能交通等。至今发表论文120余篇,其中SCI检索论文40余篇,IEEE Transaction论文13篇,他引3000余次 ;获得各类科研奖励10多项。
个人分类: 人工智能|11236 次阅读|12 个评论
【AI+专题】农/工/医多领域最新应用研究
Chenfiona 2020-5-7 10:30
当前,人工智能已经应用于各行各业,在精准农业、智能医疗、工业生产、社交网络等领域发挥着重要作用。IJAC特推出AI+专题,集结了近两年相关研究成果,部分文章开放获取,IJAC公众号对话框回复AI+即可免费获取本专题所有文章PDF。 Potential Bands of Sentinel-2A Satellite for Classification Problems in Precision Agriculture Tian-Xiang Zhang, Jin-Ya Su, Cun-Jia Liu, Wen-Hua Chen 全文下载: https://link.springer.com/article/10.1007/s11633-018-1143-x http://www.ijac.net/en/article/doi/10.1007/s11633-018-1143-x 中文导读(开放获取): 拉夫堡大学陈文华:精准农业中分类问题的研究 当前,新型遥感卫星提供的高光谱、高时间、空间分辨率的遥感图像为精准农业中的分类问题提供了新的手段。很多在农业遥感中所遇到的问题和挑战都可以通过监督分类对遥感图像进行直接处理并加以解决,比如作物种类分类、疾病及胁迫(包括杂草、干旱、氮胁迫)监测。本文以不同光谱波段信息为要素提取特征,着重探讨了基于机器学习分类器的直接分类法,而不是基于特定指数的分类方法。在这篇文章中,作者以哨兵-2A卫星(Sentinel-2A image)图像进行土地覆盖分类为例,应用支持向量机算法对五类对象(包括作物、树木、土壤、水、路)进行分类,并比较了针对该问题光谱特征选择的四种方法,从而验证了所提直接分类方法的有效性。 Localization and Classification of Rice-grain Images Using Region Proposals-based Convolutional Neural Network Kittinun Aukkapinyo, Suchakree Sawangwong, Parintorn Pooyoi, Worapan Kusakunniran 全文下载: https://link.springer.com/article/10.1007/s11633-019-1207-6 http://www.ijac.net/en/article/doi/10.1007/s11633-019-1207-6 中文导读: 本文提出一种算法,借助图片即可对稻谷(rice grains)进行定位(localization)和分类(classification)。当前,相关研究均采取传统机器学习方法,然而,由于不同种类稻谷间的相似度很高,这些方法无法很好解决本文所提出的问题。在此背景下,本研究基于深度学习提出全新的解决方案,该方案包括利用分水岭算法(watershed algorithm)对数据标注(data annotation)进行预处理(pre-processing steps)、以长轴为准(major axis orientation)进行自动校正(auto-alignment)、采用对比度受限直方图均衡技术(CLAHE)完成图像增强(image enhancement)and 。而后,通过训练掩膜基于区域的卷积神经网络(the mask region-based convolutional neural networks, R-CNN)对输入稻谷图片(input image)进行定位和分类,再借助迁移学习(transfer learning)和丢弃正则化(dropout regularization)防止过度拟合(overfitting prevention),该方法的性能得到了进一步提升。 Generalized Multiscale RBF Networks and the DCT for Breast Cancer Detection Carlos Beltran-Perez, Hua-Liang Wei, Adrian Rubio-Solis 全文下载: https://link.springer.com/article/10.1007/s11633-019-1210-y http://www.ijac.net/en/article/doi/10.1007/s11633-019-1210-y 中文导读: 【专题好文】基于神经网络的新型乳腺癌检测框架 在公共健康领域,乳腺癌图像检测是一项非常重要却极具挑战的研究。此前,MSRBF网络(multiscale generalized radial basis function)尚未应用于图像处理技术及计算机辅助诊断系统(Computer-aided diagnosis, CAD)中。本文提出一种全新的图像处理框架(image processing framework),可基于升级版RBF网络(improved version of RBF networks)完成特征提取(feature extraction),同时还在框架中结合了DCT的优势来压缩信息(compress information)。最终,本研究成功将MSRBF方法用于CAD系统中并服务于乳腺癌检测。 Applying Deep Learning to Individual and Community Health Monitoring Data: A Survey 综述 Zhen-Jie Yao, Jie Bi, Yi-Xin Chen 全文下载: https://link.springer.com/article/10.1007/s11633-018-1136-9 http://www.ijac.net/en/article/doi/10.1007/s11633-018-1136-9 中文导读: 【综述专栏】华盛顿大学陈一昕: 深度学习在健康检测数据中的应用 传统的医疗数据大多通过信息系统(如:医院信息系统、实验室信息系统、图像存储与传输系统等)进行收集、标准化处理及存储。新技术的出现,如穿戴设备、医学网站、药物研发、基因测试,使得医疗数据的种类和范围进一步扩大,数据的体量也进一步增加。这些数据经过智能分析后,将给疾病诊断、治疗、决策支持、药物处方、疾病预测、疗效评价等工作带来很大帮助。华盛顿大学陈一昕教授团队集中讨论了深度学习在医疗健康各个领域(医学影像处理除外)中的应用。通过系统地回顾这些研究成果,帮助读者更好地从宏观层面把握该领域的研究现状。此外,本文作者还分享了其将深度学习应用于医疗健康领域的研究经验。 Text-mining-based Fake News Detection Using Ensemble Methods Harita Reddy, Namratha Raj, Manali Gala, Annappa Basava 全文下载: https://link.springer.com/article/10.1007/s11633-019-1216-5 http://www.ijac.net/en/article/doi/10.1007/s11633-019-1216-5 中文导读: 社交媒体是允许人们自由表达观点和态度的平台,让人与人之间的交流较以往更加简单。同样,社交媒体也为蓄意传播虚假新闻的人提供了可乘之机。网络上各类便利的新闻获取渠道让人们更易暴露于虚假信息之中,也增加了误信误传的风险。因此,检测并标记出社交媒体上的这些内容显得尤为重要。然而,按照当前新闻生产效率来看,在新闻源未知的情况下,很难区分新闻的真假。本研究主要讨论在没有任何相关元数据的基础上,仅凭新闻文本特征检测假新闻的方法。最终,研究发现:借助集成方法,综合文体风格特征和基于文本的词向量表示,可以有效检测出虚假新闻,检测准确度高达95.49%。 Recent Advances in the Modelling and Analysis of Opinion Dynamics on Influence Networks 综述 Brian D. O. Anderson,Mengbin Ye 全文下载(开放获取): https://link.springer.com/article/10.1007/s11633-019-1169-8 http://www.ijac.net/en/article/doi/10.1007/s11633-019-1169-8 中文导读: 【综述】美外籍院士Brian Anderson: 社交网络中舆论动力学研究进展 社会生活中,人与人之间的交流必不可少,无论是在公司会议室,还是在中学教室、线上社交媒体,都普遍存在着意见交流,这其中就涉及了舆论动力学研究。舆论动力学旨在构建和分析动力学模型(dynamical models),借助这些模型可得出个体在社交网络中交流及交换意见的方式;在听取他人意见后,一个人对某件事的看法可能会随着时间而不断改变。本文为控制与系统科学领域国际著名学者、美国工程院外籍院士、澳洲科学院院士、IEEE终身会士Brian D. O. Anderson教授的特约综述,该综述集中讨论了社交网络中,舆论动力学模型的最新研究进展。文章部分内容整理自Brian教授在CCC2018大会上的主题报告。 Electronic Nose and Its Applications: A Survey 综述 Diclehan Karakaya, Oguzhan Ulucan, Mehmet Turkan 全文下载: https://link.springer.com/article/10.1007/s11633-019-1212-9 http://www.ijac.net/en/article/doi/10.1007/s11633-019-1212-9 中文导读(开放获取): 一文尽览电子鼻技术 电子鼻是模拟动物嗅觉器官开发出的一种高科技产品,响应时间短、检测速度快、重复性好,其应用场合囊括环境监测、产品质量检测、医学诊断、爆炸物检测等。随着生物芯片、生物技术的发展、集成化技术的提高及一些纳米材料的应用,电子鼻还将有更广阔的应用前景。本综述尽览电子鼻技术的软件算法、硬件组件、应用领域及未来发展,全文开放获取! Toolpath Interpolation and Smoothing for Computer Numerical Control Machining of Freeform Surfaces: A Review 综述 Wen-Bin Zhong, Xi-Chun Luo, Wen-Long Chan, Yu-Kui Cai, Fei Ding, Hai-Tao Liu, Ya-Zhou Sun 全文下载(开放获取): https://link.springer.com/article/10.1007/s11633-019-1190-y http://www.ijac.net/en/article/doi/10.1007/s11633-019-1190-y 中文导读: 综述:用于自由曲面加工的新型计算机数控方法 随着制造业对功能整合的需求不断提升,越来越多新一代高附加值产品应运而生,如三维显示器、太阳能聚光器、人工晶体等,他们大多采用自由曲面(freeform surfaces)的设计,即非回转对称设计。加工这些产品的计算机数控系统通常设定了由高密度短直线节段或圆弧曲线节段组成的刀具轨迹。然而,刀位轨迹段间的不连续性易导致进给速度及加速度产生高频波动,从而降低加工效率和产品表面光洁度。受对高速高精度加工产品的需求驱动,学术界和产业界均提出了很多新型刀具轨迹插补和光滑化方法,旨在应对传统方法中产生的问题。本篇综述来自英国斯克莱德大学Luo Xichun教授团队,文章详细综述了计算机数控系统中用于加工自由曲面的刀具轨迹插补和光滑化方法,同时对技术路线进行了分类、并讨论了各自的优点和局限性,最后得出结论。 An Overview of Contour Detection Approaches 综述 Xin-Yi Gong, Hu Su, De Xu, Zheng-Tao Zhang, Fei Shen, Hua-Bin Yang 全文下载: https://link.springer.com/article/10.1007/s11633-018-1117-z http://www.ijac.net/en/article/doi/10.1007/s11633-018-1117-z 中文导读: 【综述专栏】轮廓检测方法综述 轮廓(contour)是图像目标(imagery object)的典型特征,而轮廓检测是计算机视觉领域的重要研究方向。要解决一些实际性问题,如目标识别、场景理解等,轮廓检测算法(contour detection algorithms)是基础。轮廓检测是一项非常困难的工作,在实际操作中会出现各种各样的问题和变化。通常,在只能获取局部特征时,检测仪很难得出理想结果,特别是对于那些有纹理(textures)、低对比度(low-contrast objects)、或者含有大量噪声的图像(severely noisy images)。为提升性能,研究者们研发出更加复杂的检测仪。本综述来自中科院自动化所徐德研究员团队,集中讨论了当前轮廓检测的主要方法,以及未来可深入研究的方向。 高被引Top团队综述 最新精选好文 一文尽览“电子鼻技术” 高被引Top1团队综述:图像、图形及文本领域的对抗攻击及防御 【精选好文】服务机器人物品归属关系学习新策略 【专题好文】基于神经网络的新型乳腺癌检测框架 【最新专题】智能医疗 UAV控制 情感识别 【特别策划】聚焦全球、优质成果 港科大-微众AI杨强团队:用于生成对话系统的迁移多层注意力网络 2019高被引学者论文精选 美国蒙莫斯大学:基于深度学习的手势识别及无人机控制 自动化所陶建华团队: 基于真实环境的面部表情分析 陶建华团队:基于半监督梯形网络的语音情感识别 【综述】美外籍院士Brian Anderson: 社交网络中舆论动力学研究进展 2020年国际学术会议参考列表 【最新】2020年5月会议变动汇总 一款强大的公式编辑器 【科研战”疫”】IEEE ICAC’20 征稿! 如何在不平坦的科研路上狂奔? 复杂公式转LaTex:一张图片,三步搞定! 提升科研效率的几款小工具 【主编报告】如何写好一篇学术论文?
个人分类: 好文推荐|1194 次阅读|0 个评论
基于大数据的新冠肺炎风险评估与预测
HUST5GLabs 2020-3-13 19:57
基于大数据的新冠肺炎风险评估与预测 华中科技大学 5G联创行业应用开发实验室 1.从硬性围堵到隐性预防 始于2019年12月的新冠肺炎传染病大爆发事件是2003年SARS传染病暴发以来最大规模的全球性传染病突发事件,被中国政府和全球多个国家定义为重大危机事件。截止2020年3月7日,已经造成全球超过十万人感染,其中我国已累计超过八万人感染,累计超过三千人死亡 。 我国政府于1月下旬开始采取了包括封城、全国性的医疗资源调度和医护人员支援等前所未有的措施。尽管这些措施在短时间内有效地抑制了病毒的传播和扩散,但是这些措施均不可能成为长期政策执行。此外,超过一个月的封锁也对经济和民生造成了严重影响。目前,新冠肺炎在我国部分地区和国外尚未清零。随着各省市复工复产的逐步开展,新冠肺炎的区域性传染将有很大可能会再度出现,如何采集更加先进、积极和隐蔽的手段对病毒的传播和扩散进行有效的隐性预防、预测、控制和追踪对确保复工复产的顺利开展,确保我国今年经济目标的实现至关重要。 由于新冠肺炎病毒强大的传染性、长潜伏期和高死亡率, 采用大数据和最新的信息技术对新冠肺炎的传染轨迹、扩散速度、接触人群等重要信息进行建模和数据分析对政策制定、防范措施设计和应对措施及建议具有重要意义 。 2.预测模型分类与性能比较 目前已有大量数学模型可对不同传染病扩散和传播进行预测和建模。具体来说,目前主流的传染病模型主要可以分为三类: 经典传染病传播模型、基于深度学习的传染病传播模型和其他模型 。 2.1 经典传染病传播模型 传染病的建模有很长的研究历史, 经典传染病传播模型包括SI、SIR、SEIR、SIRQ等模型 ,这些模型都是在分类的类别上进行修改从而适应于不同的传染病进行建模。例如,钟南山院士团队于2020年2月27日发表在Journal of Thoracic Disease期刊上的论文(参见参考文献 )采用了改进的SEIR(susceptible-exposed-infected-removed,即疑似-暴露-感染-治愈)模型对新冠肺炎传染病全国的蔓延情况进行了预测。其改进的SEIR模型主要采用了从2020年1月16日到1月25日总共10天的数据,对2月1日至4月15日的数据进行了预测。具体地,通过综合考虑总人口、死亡率、潜伏期等因素估算出了每日与感染人群密切接触的人总数、每日可能携带病毒的人数和感染人群中死亡和康复的概率等重要参数,采用7天为潜伏天数的中位数和3%的死亡率,文献 给出了新冠肺炎传染病在三个主要爆发省份,湖北、广东和浙江,的预测新增确认人数。我们将钟院士团队论文的SEIR模型复现如图1所示。 图1. 参考文献 中SEIR模型预测的每日新增确诊人数 表1. 参考文献 中模型预测的每日新增确诊人数和真实新增人数的误差比较 我们初步分析认为参考文献 中构建的SEIR模型可从下列几个方面进行改进: (1) 模型参数的精度可进一步改善 。如论文中直接假设在1月23日之前人均接触人数为15人,1月23日之后人均接触人数为3人; (2) 由于政策和外部情况变化, 模型需要手工分段设计和估算参数 。如表1所示,文献 和真实数据的差距非常大,其主要原因是在应对措施的不断出台和更新的情况下(包括1月23日,对武汉市采取了“封城”措施,2月12日,对新增确诊人数统计的订正,以及随着疫情的发展,核酸检查试剂的供应逐渐满足需求等等),许多更新的政策和多种环境因素对模型参数地影响并没有在模型中得到考虑; (3)疫情数据统计方法的调整以及前期的确诊困难等原因导致 数据存在更新滞后问题 ,进而使模型估计出现偏差。 基于上述思考,我们对文献 的模型做了如下改进: (1) 在建模过程中引入更多不可忽略的实际因素 ,如医院的收治能力变化、不同患病人群传染率不同等等; (2) 借助启发式算法推断模型的各个参数 ,尽可能得到良好的模型参数来降低模型输出与实际数据间的误差; (3) 分析选用现有数据中相对更具可靠性的数据对模型进行拟合 ,尽可能减小输入数据端的误差对模型预测造成的影响。 改进后的预测模型生成的每日新增数和累计新增数结果如图2和图3所示。具体结果如表2所示,我们的结果与真实数据相关性 图2. 改进模型预测的每日新增确诊人数 图3. 改进模型预测的累计确诊人数 表2. 改进后模型预测的每日新增确诊人数 尽管我们的模型在预测精度上有所提高,但是 现有SEIR模型普遍具有如下缺陷 : (1)由于缺少对空间维度的建模,SEIR无法准确分析疫情的空间扩散情况,更无法跟踪病毒的传播位置和路径; (2)模型的准确度高度依赖参数、初始值以及基础表达式,在复杂多变的实际情况中缺乏灵活性,容易出现较大偏差。 2.2 基于深度学习的传染病传播模型 最近随着深度学习方法的出现和普及,大量及与深度学习的时空预测模型不断涌现出来。例如在文献 中,除了采用SEIR模型对病毒的扩散进行了预测之外, LSTM方法也被用与训练病毒传染和扩散模型 。具体地,文献采用2003年4月到6月的SARS-CoV累计确诊感染数计算出每日新确诊病例数,并用插值法调整未更新或者数据更新异常的日期数据。通过设置长度为三天的滑动窗口,得到一系列的时间数据序列。使用所得到的数据序列作为LSTM模型的训练输入,循环训练500次,保存训练后的LSTM模型。再将2020年1月22日到2月7日在全国范围内新冠肺炎感染的人数输入到已经训练好的LSTM模型中,并对2月7号之后80天进行预测。为了防止过拟合,文献 采用了包含一个全连接层的最简单的LSTM模型。 在下面的图4中,我们对文献 中的LSTM模型进行了复现,除了复现原论文的曲线之外,我们还给出了如果增加了2020年2月7到3月6日的最新数据后的曲线,模型对3月6号后80天的预测数据。除此之外,在图5中,我们还是用同样的方法给出了采用武汉市每日的新增数据对新冠肺炎感染的人数进行的预测结果。 图4 全国新增新冠肺炎人数预测 图5. 武汉新增新冠肺炎人数预测 表3. 文献 所采用的LSTM数据预测出的数据和真实新增数据之间的误差 图4和图5考虑的数据集总结如下: SARS Dataset: Mar. 17-Jul. 11, 2003 Dataset 1: Jan. 26-Mar. 6, 2020 (wuhan) Dataset 2: Jan. 26-Feb. 11, 2020 (wuhan) Dataset 3: Jan. 26-Mar. 6, 2020 (China) Dataset 4: Jan. 26-Feb. 11, 2020 (China) 图4和图5的具体解释如下: l 图4中“ Predicted result with dataset 3 ” 预测了3月7日到5月25日(共80天)全国的新增人数变化,输入数据集为Dataset 3,即2020年1月26日到3月6日中国全国每日新冠肺炎每日新增人数。 l 图4中“ Predicted result with dataset 4 ”是对原文的复现,预测了2月12号到5月1日(共80天)全国的新增人数变化,输入数据集为Dataset 4,即2020年1月26日到2月11日中国全国每日新冠肺炎每日新增人数。 l 图5中“ Predicted result with dataset 1 ” 预测了3月7日到5月25日(共80天)武汉的新增人数变化,输入数据集为Dataset 1,即2020年1月26日到3月6日中国武汉每日新冠肺炎每日新增人数。 l 图5中“ Predicted result with dataset 2 ”预测了2月12号到5月1日(共80天)武汉的新增人数变化,输入数据集为Dataset 2,即2020年1月26日到2月11日中国武汉每日新冠肺炎每日新增人数。 我们可以观察到, LSTM能够很好地预测新增人数的整体趋势,但是并不能预测出由于国家政策实施等因素导致的某段时间新增人数的突然增多 ,主要原因有以下几点: l 使用LSTM进行预测,模型对于某一参数的变化并不敏感; l 03年SARS数据集数据量太少,对模型训练不够精确,这也是为什么不直接采用新冠肺炎数据集进行训练的主要原因之一。 2.3 其他模型 除了上述的SEIR和深度学习以外,还有其他模型也被用于预测病毒的扩散和传播。一类被广泛使用的模式是 复合群体模型 ,该类模型考虑了人类移动模式对传染病传播的影响,通过人群间的流动进行耦合而形成复杂的系统,适用于研究不同地区之间病毒的传播情况。例如Watts等人在文献 中将人群看作多层结构,不同层级之间互相流动,建立了层级结构的复合群体模型。Cross等人在文献 中建立了11×11方格模型,个体可以移动到相邻群体,而群体内部则动态采用SIR或是SIRS等基础模型。Hufnagel等人在文献 里建立了随机复合群体模型,通过将世界上500个大城市看作复合群体,每个群体采用SIR模型描述,对SARS的全球流行进行了预测。虽然复合模型在一些应用中取得了很好的效果。但是一般来说, 复合群体模型对不同群体之间的迁移数据要求非常高。任何原始数据的细微缺陷可能导致预测模型产生很大的误差 。 此外,近几年来 基于网络的微观模型 也快速发展,有针对于诸如随机网络,规则网络(元胞自动机、CA)、小世界网络、无标度网络等理想网络的模拟,也有基于现实网络数据进行的建模分析。具体来说, Halloran等人在文献 中根据真实数据,构造了2000人的社区,研究发生天花攻击时各种对策的效果,Milne等人在文献 对澳大利亚一个3万人的城镇进行了建模,采用真实的家庭、学校、医院等场所的设置,描述了流感的接触、传播过程,还有研究者构造了更大规模的网络模型,Eubank等人在文献 中开发了EpiSimS系统,构造了大城市级别的人际接触模型。虽然基于网络的微观模型能够建立较为真实的场景,但是对原始数据要求极高,需要大量的真实的社会环境数据。此外, 最终的模型也十分复杂,具有很多的属性特征,建模难度大。随着模型规模的扩大,其运行所需的计算量也会变得相当庞大 。考虑到这些因素,该方法难以短期内快速的做出对疫情的准确预测。 3.总结 目前新冠肺炎在部分国家仍处于上升期,诸多迹象显示新冠肺炎将在未来相当长的时间存在。因此做好新冠肺炎的预防和检测并及时发现和处理可能成为未来相当长时期的研究重点。 本文采用目前已经公布的公开数据集对模型进行了初步预测 ,期望能够对后续基于大数据的病毒扩散和预防起到积极的作用。 参考文献 Zifeng Yang, Zhiqi Zeng, Ke Wang, Sook-San Wong, Wenhua Liang, Mark Zanin, Peng Liu, Xudong Cao, Zhongqiang Gao, Zhitong Mai, Jingyi Liang, Xiaoqing Liu, Shiyue Li, Yimin Li, Feng Ye, Weijie Guan, Yifan Yang, Fei Li, Shengmei Luo, Yuqi Xie, Bin Liu, Zhoulang Wang, Shaobo Zhang, Yaonan Wang, Nanshan Zhong, Jianxing He, “Modified SEIR and AI prediction of the epidemics trend of COVID-19 in China under public health interventions” Journal of Thoracic Disease, no. 2, vol. 12, Feb 2020. Watts D , Muhamad R , Medina D , et al. Multiscale, resurgent epidemics in a hierarchical metapopulation model . Proceedings of the National Academy of Sciences of the United States of America, 2005, 102(32):p. 11157-11162. Cross P C , Johnson P L F , Lloyd-Smith J O , et al. Utility of R0 as a predictor of disease invasion in structured populations . Journal of The Royal Society Interface, 2007, 4(13):315-324. Hufnagel L , Brockmann D , Geisel T . Forecast and control of epidemics in a globalized world . Proceedings of the National Academy of Sciences of the United States of America, 2004, 101(42):p.15124-15129. Halloran, M. E. Containing Bioterrorist Smallpox . Science, 2002,298(5597):1428-1432. Milne G J , Kelso J K , Kelly H A , et al. A Small Community Model for the Transmission of Infectious Diseases: Comparison of School Closure as an Intervention in Individual-Based Models of an Influenza Pandemic . PLoS ONE, 2008, 3(12):e4005-. Eubank, Stephen Guclu, Hasan Kumar, Sritesh Marathe, Madhav Toroczkai, Zoltan Wang, Nan. (2004). Modeling Disease Outbreaks in Realistic Urban Social Networks . Nature, 2004, 429(6988): 180-184.
470 次阅读|0 个评论
《电子与封装》2019年12期:深度学习算法、硬件技术及其在未来军事上的应用
EPjournal 2020-1-15 09:55
魏敬和1,林军2 1. 中科芯集成电路有限公司,江苏 无锡 214072;2. 南京大学,南京 210023 摘要: 人工智能在感知和认知智能领域取得的重大进展,促进该技术向军事应用的转移。从当前深度学习算法研究重点展开论述,对其未来的技术应用、发展方向进行了系统的梳理,从延续传统架构的cpu、gpu、fpga、asic和非传统架构的神经拟态芯片两个阵营出发,依次对比分析了各个计算架构的结构特点以及对人工智能硬件未来发展带来的影响,同时以雷达红外图形处理技术和声呐信号处理技术在军事上的应用为例,阐述了人工智能技术在未来军事领域内的发展方向。 关键词: 深度学习, 硬件实现, 军事应用 引用本文: 魏敬和, 林军. 深度学习算法、硬件技术及其在未来军事上的应用 . 电子与封装, 2019, 19(12): 1-6. wei jinghe, lin jun. deep learning algorithms, hardware and their military applications . electronics and packaging, 2019, 19(12): 1-6. 点击此处免费获取全文
167 次阅读|0 个评论
深度学习在商务分析与运筹学中的应用——“大数据与智能决策”讨论班
郭崇慧 2019-12-14 09:23
深度学习 深度学习(Deep Learning)是指机器学习中一种通过模拟人脑的神经结构,对数据进行表征学习的方法。深度学习的概念源于人工神经网络的研究。人工神经网络(Artificial Neural Networks,ANN)是指从信息处理的角度,对人脑神经元网络进行抽象,建立数学模型,按不同的连接方式组成不同的网络,简称为神经网络或类神经网络。因此,深度学习又被称为深层神经网络,是从之前的人工神经网络模型发展而来的。 图1 人工智能、机器学习与深度学习之间的关系示意图 早期对人工神经网络的研究,由于受到算法理论、数据、硬件的制约,多年以来一直停留在单层或浅层的网络结构。现在的神经网络规模发生了巨大变化,它可以轻松包含多达数百个层,数百万个神经元,神经元之间还有着复杂的连接结构。这主要是由于现代科学技术的发展打破了之前的制约,使棘手的任务变得可能,具体体现在以下三个方面: (1)计算能力。计算机的算力迅速提高,特别是GPU(Graphics Processing Unit)的广泛使用,为神经网络训练所需的复杂运算提供了基础。例如,Google旗下的人工智能DeepMind公司使用176个GPU优化了40天的深度神经网络(AlphaGo),在围棋游戏中击败最优秀的人类玩家。 (2)大数据。训练深度神经网络需要大量的数据集,以防止过拟合问题和微调参数。深度神经网络的性能通常随数据量的增加而提高。实证结果表明,即使深度神经网络已经拥有数百万个数据点,也仍然可以从附加数据中受益。 (3)优化算法。在深度神经网络中优化参数是一项艰巨的任务。2006年,Hinton和Salakhutdinov提出了通过在添加新的隐含层和优化网络参数之间交替优化来逐渐增加神经网络深度的方法,被视为深度学习的开创性工作。这项稳定的优化技术为学习更深层的网络铺平了道路。庞大的数据集使人们无法直接优化整体性能。取而代之的是通过随机优化来训练深度神经网络。另外,为了改善优化性能,有许多常见的优化方法(例如Adam,Adagrad,RMSprop)作为随机梯度下降算法的变体,通常与步长的自适应调节配合使用。 深度学习的动机在于建立模拟人脑进行分析学习的神经网络,因此它能够用类似人脑的机制来解释数据,比如图像,声音和文本等。相比于传统的机器学习算法,其优势在于:它擅长发现高维数据中的复杂结构,精度也远远超过了传统的机器学习方法。另外,经典的机器学习算法通常需要复杂的特征工程,而深度网络只需直接对原始数据进行处理,通常就可以实现良好的性能。 深度学习还具有适应性强,易于转换的优势,该技术可以更容易地适应不同的领域和应用。迁移学习使得预先训练的深度网络可以适用于同一领域内的不同应用程序。例如,一旦了解了语音识别领域的基础深度学习理论,那么学习如何将深度网络应用于自然语言处理并不是太具有挑战性,因为基准知识非常相似。 深度学习在商务分析与运筹学中的应用 文献:M. Kraus, S. Feuerriegel and A. Oztekin, Deep learning in business analytics and operations research: Models, applications and managerial implications , European Journal of Operational Research, 2020, 281(3): 628-641 . 深度学习在业界中的商务分析和多个运筹学领域具有巨大的潜在应用价值,如供应链管理、风险建模,预防性维护等等。其中,商务分析由于受深度学习的冲击正在发生着根本性的转变。 商务分析是指通过大数据分析为个人、公司和组织创造价值的方法和实践。成功进行商务分析竞争的核心是建立预测模型。与传统的机器学习算法相比,深度神经网络(Deep Neural Networks,DNN)可显著改善模型的预测性能。尽管深度学习有望成为商务分析和运营管理研究中的预测分析行业标准,但是对现有文献的研究表明,在运筹学中还缺乏利用深度学习的研究工作。 论文针对这一现状,首先总结了深度学习相关的数学概念,从单个神经元的工作方式开始到权值优化和正则化方法的概述,最后还介绍了现存的最先进的网络架构及其应用场景。 然后提出了一种深度嵌入的网络架构。该架构先将类别变量进行嵌入,转化为稠密表示,然后与数值变量一同送入模型,可以实现数值稳定的优化过程以及更高的预测精度。 图2 深度嵌入的网络架构 接着从运营管理、库存管理和风险管理这三个领域各选择了一个具体的案例进行分析,验证了深度学习在运筹学实际应用中较传统机器学习算法的优势以及所提出的深度嵌入网络架构较传统深度学习方法的优势。不同案例研究的计算结果表明,深度学习是一种可行且有效的方法,在数据分析模型系列的预测和操作性能方面,深度学习可以始终如一地优于传统方法。 最后分析了深度学习的管理学意义和未来的研究路线。虽然深度学习拥有巨大的潜在价值,但在运筹学的应用中还存在三个关键挑战,文中总结了这三个挑战并且提出了可行的应对措施: (1)深度神经网络的配置是一项艰巨的任务,因为它仍然需要大量的参数调整才能获得令人满意的结果。最近,在“AutoML”框架下提出了一系列用于自动化调整过程的工具,这为DNN架构的部署提供了一条有希望的途径。 (2)深度神经网络目前仅关注点估计,而其预测通常缺乏严格的不确定性量化。因此希望为直接建模分布后者开发DNN的贝叶斯变体。 (3)尽管事后分析已使理解深度神经网络的行为迈出了一大步,但可解释性被广泛认为是深度学习中的一个弱点。通过变分推断来估计结构模型,或者在神经网络中应用注意力机制可能会增强其可解释性。 由于深度学习领域的许多创新尚未被广泛采用,因此还有进一步挖掘的潜力。对于大多数管理人员来说,如何识别预测分析(尤其是深度学习)的有价值应用案例仍然面临挑战。因此,建议未来在商务分析领域中的研究目标集中在识别珍贵的应用案例以及发现潜在的价值收益上。而这进一步需要一套更好的网络体系结构、优化方法以及参数微调体系。另外,深度学习仅提供预测性见解,而很少提出实现预期结果的实际管理策略,所以未来可以对如何将预测转化为有效的决策进行研究。此外,实际应用中的数据集通常无法保证有效使用深度学习所需的必要规模,对此可以考虑迁移学习的方法,将不同但相关的数据集用于训练模型,然后将模型应用于目标数据集,实现归纳知识迁移。 随着各类公司以越来越快的速度生成更多数据,商务分析成为影响企业生存发展的重要驱动力,商务分析的变革成为企业竞争中重要的因素。而深度学习的发展势必对商务分析的变革产生巨大影响。因为即使预测精度的微小提高也可以扩大收益,因此需要更好地了解深度学习。这篇文章的主要信息是介绍深度学习和回顾深度学习在改善商务运营核心领域的决策支持方面的适用性。其中提出的通用方法可以用来创建自动化的决策支持系统,这反过来又可以提高效率和决策质量。文中进行的案例研究是有目的地从运筹学的不同领域中选择的,以验证深度神经网络有助于改善运营绩效这一事实。同时,定制的网络体系结构通常是有益的,例如文中提出的深层嵌入式网络体系结构比默认体系结构在所有指标上的性能提高了1.56%至21.73%。 备注:2019年11月5日晚上,“糖果之家”相约星期二,“大数据与智能决策”讨论班(Seminar)继续开讲,本次讨论班以“ 深度学习在商务分析与运筹学中的应用 ”为题,共讨论了一篇文献,由硕士生进行讲解,共有青年教师、博士后、博士生和硕士生18人参加。
个人分类: 科研笔记|6631 次阅读|0 个评论
一天搞懂深度学习-李宏毅-学习笔记
SNXGT 2019-12-1 15:00
一周后要进行深度学习考试。十几周的课程下来,基础部分掌握不是很扎实,高阶应用部分更是N头雾水。 在这种情况下,我阅读了李宏毅老师的文章。通过这篇精悍之文,可以提纲挈领地把握深度学习的主体框架,可以对“深度学习到底在做什么事”有一点整体认识。 (此文通道如下) https://zhuanlan.zhihu.com/p/54483252 #知乎# https://www.slideshare.net/tw_dsconf/ss-62245351?qid=108adce3-2c3d-4758-a830-95d0a57e46bcv=b=from_search=3 #LinkedIn SlideShare# https://github.com/yuneming/DeepLearningTutorial #Github# http://speech.ee.ntu.edu.tw/~tlkagk/index.html #李老师主页# 学习后,我深深体会到,不论是在科研圈还是工业界,人工智能必定将是日后重要的技术工具。未来二十年,人工智能技术工程师(即文中所谓的“AI训练师”)将逐步起到越发重要的作用。 后来,我又结合课程讲义和《深度学习》教材,逐章复习掌握知识细节 。 5月28日,深度学习课程期末考试结束后五小时,我又回顾了过去这一周深度学习的复习情况,写下了自己的一些体会。 第一,试卷上考察的很多知识点是非常基础的,我们只需要知道每一章节中最核心的基础概念,就可以比较清楚的作答。   然而,上课时候的自己,对深度学习才刚刚接触,初来乍到,生疏感、距离感很强烈,甚至对深度学习有一种崇敬的情感,学习时有一种“先入为主”的不自信,脑海里浮现着“我到底能不能学会”这些想法。   事实上,自己到了每门课的复习阶段,才能体会到“哦,原来这门课就讲了这么回事啊!” 蓦然回首,发现要学的东西,其实就在灯火阑珊处,离自己并不遥远,也没那么高深,更不是深不可测。每个人只要搬个小板凳,拿一本最最基础的课本,老老实实看上几钟头,就能明白这门课究竟在讲些什么东西。只不过,要想产生更深刻的领悟,需要重复上三五个,甚至十来个“几钟头”。   所以,以后的学习一定要顶住最前面、最开始的10小时,20小时,50小时。不要怕概念的生疏和模糊,去查资料,一点一点地复习、回顾。不需为自己的遗忘感到自责,当发现以往学过的知识有点忘了,这是好事,因为这比你一点也找不到“抓手”,强得多。循着记忆的轨迹,重新复习,再在此基础上拾级而上,学习新知,如此往复,才是学习正道。总而言之,发现不懂不会的,是好事,这样才能学得越来越明白。   至于研究生阶段简单的课程考试,以这种学习方法来应对,显然不成问题。 第二,课程作业包括论文阅读和实践项目,论文读得不够深入,项目没有具体实践成功,对自己要求松。   综合整学期的课程,为保证其他课程顺利进行,从战略上对论文和项目没有给予足够的重视,以留给日后详细解决。 第三,课堂上老师的授课内容自己跟不上,一方面不能怪老师讲得不好(要怪宁肯怪自己水平不够),另一方面自己要课下努力跟上,只有努力跟上,才是学习最好的方法。   平常很多时间没有利用好,白白蹉跎了光阴。要养成好的工作生活习惯,克制自己的懒惰。偶尔破坏了习惯,要尽快恢复状态,找回工作的状态。  手机不能成为生活的核心,核心应是时间线。 下面是课程考试的复盘: 1.机器学习经典学习方法举例,深度学习与之相比的优势。 2.反向传播算法简单计算。深度学习网络常见问题与解决思路。 3.卷积神经网络参数计算。 4.长短时记忆和门控制循环网络的模型图和各个门的作用。 5.正则化的几种方法。随机梯度下降和Batch梯度下降的区别。 6.自编码器和生成对抗网络的模型图和简要说明。 7.强化学习的学习要素和学习算法。 8.机器翻译的编码解码机制。 9.图神经网络的正向传播。 同时,这也是本次课程的大纲内容,没有完全掌握,是自己的问题。日后要在自学过程中逐个解决。   努力修炼!
个人分类: 学习笔记|0 个评论
基于深度学习的推荐系统——“大数据与智能决策”讨论班
郭崇慧 2019-11-26 08:28
推荐系统 互联网的出现和普及给用户带来了大量的数据和信息,满足了用户在大数据时代对信息的需求,但随着网络的迅速发展而带来的网上信息量的大幅增长,使得用户在面对大量信息时无法从中获得对自己真正有用的那部分信息,对信息的使用效率反而降低了,这就是所谓的信息超载(Information Overload)问题。 解决信息超载问题的一个有效途径是个性化推荐系统(Recommender Systems)。推荐系统根据用户的信息需求、兴趣等,利用推荐算法将用户感兴趣的信息、产品等推荐给用户。和搜索引擎相比,推荐系统通过研究用户的兴趣偏好,进行个性化计算,由系统发现用户的兴趣点,从而引导用户发现自己的信息需求。一个好的推荐系统不仅能为用户提供个性化的服务,还能和用户之间建立密切关系,让用户对推荐产生依赖。作为一种信息过滤系统,推荐系统具有主动性和个性化两个最显著的特性。 多数推荐系统的结构都是由线上和线下两部分组成。线下部分通过学习用户资料和行为日志建立模型,在新的上下文背景之下,计算相应的推荐内容,呈现于线上用户页面中。 图1 推荐系统的结构 目前,推荐系统已广泛应用于诸多领域,其中最典型的便是电子商务领域。ACM RecSys会议上最常提及的应用落地场景为:电子商务、在线视频、社交网络、在线音乐、互联网广告等,这些领域是推荐系统大展身手的舞台,也是近年来业界研究和应用推荐系统的重要实验场景。 基于深度神经网络的视频推荐 文献:Covington P, Adams J, Sargin E. Deep neural networks for YouTube recommendations //Proceedings of the 10th ACM conference on recommender systems. ACM, 2016: 191-198. 论文主要介绍了YouTube使用深度神经网络进行视频推荐的相关工作。文章发表在2016年ACM RecSys会议上,是利用深度学习进行推荐这方面研究中比较经典的文章。 一、引言 在YouTube视频推荐场景中,存在的主要挑战有3个: 1 、规模大。表现在用户和视频两个方面,首先YouTube宣称坐拥十亿用户,其次视频的存量巨大,是百万量级的视频,所以那种只能处理小规模数据的模型在YouTube推荐场景中是完全不能使用的。 2 、更新快。一方面,视频更新速度快,YouTube上每秒具有小时级别的视频进行上传;另一方面,用户的实时行为切换很快。要求模型能够捕捉到这些更新的信息。 3 、噪声。首先,用户的历史行为是存在噪声的,面对百万量级的视频,每个用户只对其中一小部分视频存在观看行为,所以用户观看的相关日志是高度稀疏的。再加上用户的行为会受到外界一些推荐系统察觉不到的因素影响,比如用户受诱导点击了一个视频,但这个视频不是用户关心的内容,用户并没有进行观看,如果我们把这次点击认为是用户喜欢此视频,就引入了噪声。其次,从视频本身来看,视频内容是非结构化的。这些都对模型的鲁棒性提出了很高的要求。 二、系统概述 针对以上挑战,YouTube使用了一个两阶段的推荐模型。 第一阶段是个深度召回模型,主要作用是从百万量级的视频里粗略筛选出几百个用户很可能感兴趣的视频,这一阶段对效率要求比较高,耗费较少的资源获得用户有很大可能喜欢的视频。在召回阶段,使用神经网络模型进行召回,实际上现在召回阶段大都使用多路召回,除了模型筛选出一部分视频外,可能还要根据视频的热度、具体业务需求等通过其他途径召回,多路召回的结果进入排序模型进行更细的排序筛选。 第二阶段是深度排序模型,对召回的结果进行更细致的筛选,这时相对召回阶段,排序阶段面临的数据量已经大大减少,所以可以引入更多视频相关以及用户相关的内容来进行内容的筛选,最后展示给用户十几条推荐内容。 图2 两阶段的推荐模型 三、召回模型 在召回模型部分,作者将推荐问题转化成一个多分类问题,其中视频库中的每一个视频各自对应着一种类别,推荐问题变为:在时刻t,给定用户以及上下文(观看记录、搜索记录等),预测用户接下来会观看哪一种类别的视频。如果我们能求得用户接下来看每种类别视频的概率,那么就可以按照概率,将概率大的视频筛选出来。所以召回模型训练阶段的样本如下: 输入:用户观看的视频记录+搜索记录等;标签:某个视频。 在构建训练样本的时候, 需要注意以下几点: 1 )作者使用的是用户隐性反馈数据,就是那些没有明确地表示出用户喜恶,但可以从中推测用户喜恶的数据。比如,用户观看了某个视频,系统就认为用户喜欢这个视频,用户搜索了某个视频,系统就认为用户喜欢这个视频等,这类的用户反馈就是隐性反馈。相对于显性反馈数据(明显表示出喜恶,如点赞、差评、问卷调查到的内容等),隐性反馈数据量比较大,在深度学习这种需要大规模数据的情况下使用隐性反馈数据是很合适的。 2 )在选择样本的时候,考虑的是整个YouTube上的用户日志(甚至用户在其他网站上的观看记录),而不是只考虑YouTube推荐系统的用户日志信息,这就能够更全面地捕捉用户偏好,而不是只受推荐结果诱导。 3 )对每个用户提取等数量的训练样本,而不是使用原始用户日志,减少活跃用户对模型的过度影响。 4 )作为标签的视频所处的时间点一定要在作为特征的视频的时间点之后, 传统的随机留一法没有考虑特征与标签的时间顺序,这点是不符合认知的。 5 )用户有一种观看新视频的偏好,作者引入了“视频年龄”这个特征表示样本的新鲜度,这样模型就能够很好的表示视频上传之后随时间的点击率分布,从而捕捉到一些视频新鲜度的信息。 四、排序模型 虽然神经网络的优势是能够自动产生高维的特征表示,但一些特征还是需要人工设计之后才能较好地表示。在排序阶段,引入了更多特征来表示视频及用户与视频之间关系,比如一个视频属于某个频道,那么就构造一个特征表示“用户看了多少这个频道的视频”,如果视频属于某个主题,就可以构造一个特征表示“用户上一次观看这一主题的视频是什么时候”,甚至还考虑了视频曾经是否曝光给用户等信息。 在排序阶段,作者将排序问题转化为一个二分类问题,原意是用样本数据来预测用户会不会对某个视频进行点击,其中,用户观看了的视频作为正样本,用户没有观看的视频作为负样本。但作者考虑到用点击率来表示用户喜好具有较大的偏差,比如,误点击、骗点击等都不能表示用户对视频的喜好,所以作者通过预测用户对一个视频的预期观看时长来代表用户对视频的喜爱程度。 为了能够使用逻辑回归预测视频预期观看时长,作者使用了加权逻辑回归,对于正样本,将其观看时间作为样本权重,对于负样本,权重为1。在训练阶段,标签仍然为0、1两类,但在线上使用阶段,输出 即为视频的预期观看时长。 备注:2019年10月22日晚上,“糖果之家”相约星期二,“大数据与智能决策”讨论班(Seminar)继续开讲,本次讨论班以推荐系统为题,共讨论了一篇文献,由硕士生进行讲解,共有青年教师、博士后、博士生和硕士生16人参加。
个人分类: 科研笔记|3234 次阅读|0 个评论
深度学习交流群
iggcas010 2019-11-7 18:11
哈喽大家好,很高兴认识大家。 我是做深度学习的小菜鸟,长期以来混迹各个深度学习QQ群中,不时抛出各种低级问题,偶有大佬指点,但绝大多数都是自己解决问题。这也是做学生最基本的学习能力,没有自学能力是无法在江湖行走的。 我目前从事语音方面的深度学习落地工作,从模型到移动端,从模型构建/重构、模型转换到参数调整,各种细节问题都是我所面对的问题,这也将是我长期的工作内容。 但,不仅仅是套用个网络,github上clone个项目,搜索下最流行的Net,调整下参数,这些都远远不够。我们需要从根本上了解、认识这种需求背后的基本知识,如何设计网络?又为何设计这样的结构?不为重复,只求有意义。 AI不是高深莫测、讳莫如深的东西,如果不能将你所做的内容用PPT讲出来,那么这不算进步,这就是纯粹的模仿,当然我等菜鸟也不可能自己重构一个框架/体系,自成一派,那太难了,做这些都是百万年薪了。 从实际出发,立足于事实问题,合理运用深度学习解决问题,这才是深度学习应有的作用。不要做些没有价值和意义的工作,仅仅为了满足所谓的虚荣心则大可不必如此。 作为一个纯粹的人,一个做学问的人,我是有信仰的。做事就是认真做事,不会掺杂任何杂念,更与金钱无关。如果可以的话,我们何不并肩作战,齐心协力,共创美好世界。 来吧,深度学习未来必将光芒万丈! 希望大家转移到我的大群,语音深度学习与信号处理,这也是我目前的研究方向和工作内容,只要是深度学习均可,不限制 点击链接加入群聊【语音深度学习及信号处】: https://jq.qq.com/?_wv=1027k=5FmC5x5
5657 次阅读|0 个评论
[转载]谷歌用深度强化学习提高提高量子计算机性能
quantumchina 2019-10-10 12:58
雷锋网 AI 科技评论按:日前,谷歌在 Nature 合作期刊《npj Quantum Information》上发表了一篇论文,提出结合深度强化学习的方法来实现通用量子控制,从而能够极大地提高量子计算机的计算能力。谷歌也在官方博客上发表文章介绍了这项工作。 论文下载地址: https://www.nature.com/articles/s41534-019-0141-3.pdf 实现近期量子计算机的主要挑战之一与其最基本的组成有关:量子比特。量子位可以与任何携带与自身能量相近的东西交互,包括杂散光子(如不需要的电磁场)、声子(量子设备的机械性振荡)或量子亏损(制造期间所形成的芯片基板中的不规则性),其中,量子亏损会不可预测地改变量子比特本身的状态。 而使问题进一步复杂化的是,用于控制量子比特的工具带来了许多挑战。研究者通过经典的控制方式来操作和读取量子比特:模拟信号以电磁场的形式耦合到其中嵌入了量子比特的物理基底,例如超导电路。这些控制电子设备中的缺陷(会造成白噪声)、来自外部辐射源的干扰以及数模转换器的波动会引入更多的随机误差,从而降低量子线路的性能。这些现实问题都会影响计算的保真度,因此限制了近期量子设备的应用。 为了提高量子计算机的计算能力,并为实现大规模量子计算铺路,就必须首先建立能够准确描述这些实验性问题的物理模型。 谷歌在 Nature 合作期刊《npj Quantum Information》上发表的《通过深度强化学习实现通用量子控制》(Universal Quantum Control through Deep Reinforcement Learning)论文中,提出了一种使用深度强化学习生成的新的量子控制框架,其中可以通过单个控制成本函数来概括量子可控制优化中的各类实际问题。与标准随机梯度下降的解决方案相比,该框架可将量子逻辑门的平均误差最多降低两个数量级,并且大幅降低了来自最优门生成的副本的门时间。这一结果为使用近期量子设备来开展量子仿真、量子化学和量子霸权测试开启了更加广阔的应用空间。 这种新的量子控制范式,其创新之处在于对量子控制函数的改进以及提出的基于深度强化学习的高效优化方法。 为了创建一个全面的成本函数,首先需要为实际的量子控制过程创建一个物理模型,基于该模型,我们能够可靠地预测误差量。对量子计算的准确性最不利的误差之一就是泄漏:在计算过程中损失的量子信息量。这种信息泄漏通常发生在量子比特的量子态被激发为较高能态或通过自发辐射衰退成较低能态时。泄漏误差不仅会损失有用的量子信息,而且还会降低「量子性」,并最终使量子计算机的性能降低得与经典计算机差不多。 在量子计算过程中准确地评估泄漏信息的常见做法是,一开始就模拟整个计算。然而,这并不利于达成构建大规模量子计算机的目的,因为量子计算机的优势就在于它们能够执行经典系统所无法执行的计算。谷歌研究人员通过使用改进后的物理模型,能够让通用的成本函数对逐渐增加的泄漏误差、控制边界条件的违背情况、总的门时间和门保真度进行联合优化。 创建了新的量子控制成本函数后,下一步就是应用高效的优化工具将该函数最小化。经证实,现有的优化方法无法找到对于控制波动同样具有鲁棒性的令人满意的高保真度解决方案。相反地,谷歌研究人员则采用同步策略的深度强化学习(RL)方法,即置信域强化学习(Trusted-Region RL),因为该方法在所有基准问题中均表现出良好的性能,对样本噪声具有固有的鲁棒性,并且能够优化有着数亿个控制参数的数百种高难度的控制问题。 这种同步策略强化学习与先前研究的异步策略强化学习方法之间的显著差异在于,其对控制策略的表示独立于控制成本。另一方面,例如 Q 学习等异步策略强化学习使用单个神经网络(NN)来表示控制轨迹和相关的奖励,其中控制轨迹指定要耦合到不同时间步长的量子比特的控制信号,而相关的奖励则评估量子控制当前步长的好坏。 同步策略强化学习引人关注的一项能力在于:能够在控制轨迹中利用非本地特征。当控制领域是高维且包含大量组合的非全局解决方案时,这种能力就变得至关重要,而对于量子系统而言,这种情况经常发生。 研究人员将控制轨迹编码为一个完全连接的三层神经网络,即策略 NN,同时将控制成本函数编码为第二个神经网络(值 NN),后者可以对折扣未来奖励(Discounted Future Reward)进行编码。强化学习智能体在模拟现实中的噪音控制驱动的随机环境下训练这两个神经网络,获得了鲁棒的控制解决方案。此外,他们还为一组连续参数化的两位量子门提供了控制解决方案,这对于量子化学应用而言很重要,不过,使用传统的通用量子门集实现这一操作,成本也很高。 谷歌研究人员使用这一新框架进行的数值模拟结果表明,与通用量子门集的传统方法相比,该方法将量子门误差减少了 100 倍,与此同时,还为一系列连续参数化的模拟量子门将门时间减少了平均一个数量级。 这项工作凸显了使用创新性机器学习技术和能够利用通用量子控制方案的灵活性和附加计算能力的近期量子算法的重要性。进一步,该领域的研究者还需要做更多的实验来将机器学习技术(就比如说我们在这项工作中开发的技术)整合到实际的量子计算过程中,从而利用机器学习来充分提高量子计算机的计算能力。 雷锋网 via https://ai.googleblog.com/2019/10/improving-quantum-computation-with.html 来源: https://www.leiphone.com/news/201910/tJH7KTvVUOED9cxW.html?uniqueCode=KxLLR7JKUTzE7EVK
个人分类: 量子计算|1578 次阅读|0 个评论
“没有灵魂”的AI作诗,有啥用?
热度 3 wshuyi 2019-9-9 10:17
解决眼高手低,促进触类旁通。 作诗 如果你今天还没有被AI作的唐诗刷屏,那说明你身边的科技爱好者和尝鲜者不够多。 引爆点来自于2019 AI 开发者大会上,华为的刘群老师做了一段 AI 赋诗演示。 现场观众非常兴奋,不时发出惊呼与啧啧赞叹。 与几年前人工智能作诗的演示效果完全不是一个等级,如今机器已经能够自主学习到平仄、押韵等基本技法,使得编出来的诗在技术层面上突飞猛进。 开会归来,我也给乐府 AI 命了个题,叫做《古亭咏怀》。 这是做出来的效果。 你觉得 AI 云得怎么样? 我把它发到了朋友圈。 不出所料,褒贬不一。 评价 褒奖的,自然是觉得这种技法运用让人惊喜。这里咱们就不提了。 质疑的,主要是以下这几种评价: 缺少灵魂 明显的模仿痕迹 拿词拼凑 也有问得更直接的: 啥意思? 这些质疑评价有没有道理? 当然有。 因为从原理上讲,机器就不可能学到“灵魂”,它只是学到了一些文本规律而已。 其原理,我在《 人工智能写手,好用吗? 》一文中已经给你介绍过了。如果你已想不起来,还是得复习一下。 了解了模型训练与生成的原理,你便会清楚,其“写作”(标准叫法是“文本生成”)内容的质量上限,也无非是高考时所谓“二类文”的等级。 在体育新闻快报,或者是证券市场资讯等领域,读者更关注的是事实类信息,对于文采、情感不甚关切。这些行当里,机器早就替代了人,成为了当仁不让的作者。 对写诗 AI 来说,输入的文本里,目前只是唐宋诗词,尚未包含那形象化的自然环境,作者胸中的喜怒哀乐,亦或是大时代里的风云变幻。 要想学到李白的洒脱,苏轼的豪放,机器巧妇难为无米之炊,怕是要望洋兴叹的。 但是,如果你因为目前机器作诗“没有灵魂”就轻视甚至是全盘否定它,那恐怕是要错过许多机会的。 赋能 与前几年,人们总在担心“机器 换人 ”这个事儿不同,现在的人工智能开发者,更愿意宣称自己是为某个行业,或者某个具体人群 赋能 。 为什么? 第一可以有效减少抵触情绪。想想看,你天天闹唤着要抢人家饭碗,谁会给你好脸色看? 第二,也是更重要的,这是一种非常聪明的 预期管理 。 当人们并不认为机器可以聪明到替代人,而觉得它只是人类的助手和高参时, 容忍度 就会更高,与其合作也会更加愉快。 作诗,能给谁赋能? 当然有服务对象。 首先是 缺乏 创作古诗 基本功 的人。这种状况,俗称“眼高手低”。 他可能没有平仄押韵的训练,所以看见了一处景物,例如大瀑布,胸中一股激情奔腾,却无法吟唱出“疑是银河落九天”那样等级的 原创 诗句,又不甘心说那句人尽皆知的“口头语”,以“哇”或者“我”开头。 这时候,如果有作诗 AI 帮忙,他就可以立即把一首绝句或者律诗跟照片一起发出去,等着看无数涌来的赞,不亦乐乎? 就在刚刚,我在学校院子里溜达,看见了鲤鱼型的喷泉,觉得很有意思。 然后呢,我立即就让 AI 赋诗一首。所谓歌以咏志嘛。 这是结果: 有人觉得这纯属作弊,没有意思。但他显然忽略了一个因素——由于目前作诗 AI 的水平还不是太高,所以你看到朋友圈里的几乎每一首 AI 吟诵诗词,几乎都是 人工筛选 出来的。 差别是,前几年,为了找出一首像样的诗,你得从机器生成的几十上百个选项里面选,还不一定能找到合适的。 如今,三五个选项,兴许就会有佳句出现。 机器做的诗,不论意境还是遣词造句,难免会有疏漏。可实话实说,咱自己作一首,别说七步成诗,就是给你俩小时,质量就真能甩开 AI 好几条街吗? 选择的过程,也是对人们诗歌鉴赏水平的锻炼与提高。 不是吗? 另外一种情境,就是 激发 人们本来就很丰沛的 联想 能力。 服务对象嘛,例如我的小学数学老师。 他老人家,平时钻研数学知识,琢磨怎么把学生教好。不过一到运动会,就暴露出自己文人的癖好——爱作个诗,让学生拿上去让主持人念。 其实也不一定是什么千古名句,打油诗就行。一来为学生打气助威,二来也是满足一下自己被学生们崇拜为诗人的良好感觉。 我亲眼看见过,他老人家被煎熬的时候。 那首七绝,前三句写得一气呵成,到了最后一句,突然怎么也想不出合适的句子,学生们都眼巴巴在一旁盯着,搞得他很是狼狈。 这时候,如果有作诗 AI 暗中帮忙…… 当然,以老师的傲骨,是断然不肯让 AI 来捉刀代笔的。 不过,AI 提供的对仗功能,很可能瞬间帮助他打开思路,妙句就很可能涌现了。 应用 其他的应用场景,也颇可期待。 例如有好事者,如今已经把“黑手”伸到了学术界。 Arxiv 这个预印本平台,我给你反复介绍过的。 他们就把这些论文的内容,喂给了文本生成模型。 于是,机器一张口,就是洋八股了。 例如这里,我输入了一句话,大意是“知识图谱集成到Transformer模型,可以形成通用结构,从而达成强人工智能”。 别管我这句话看起来有多不靠谱。机器看到后,就立即开始酝酿,往后接着“云”了。 这里,你只需要不断按下去 Tab 键,就可以像编程时代码补全一样,不断有新的文字供你选择。几秒钟,一个段落就写好了。 你可能会担心人们用它作弊。没错,这确实可能发生。但是更可能发生的是,人们在写论文写不下去的时候,通过这种补全,给自己提供一些开阔思路的语句。 尤其是英文论文写作时,国内不少研究者已经想好了要说什么,却会在遣词造句上颇觉头痛。 此时,这个应用就可能发挥很大功效。 如果你想自己尝试一下机器作诗和写论文,在我的公众号“玉树芝兰”(nkwangshuyi)后台回复“aipoem”,就能看到链接。 小结 读过本文之后,希望你能够放下对 AI 文本生成质量的苛责。转而去思考,可以在它发展改进的过程中,快人一步,做些什么。 因为篇幅关系,本文只举了作诗和论文写作这两个应用场景。在你的工作或者生活中,有没有发现文本生成可以帮助你 赋能 的场景呢? 如果有的话,欢迎你在留言中,将它分享给大家。让专业研究人员了解你的需求。只要需求足够大,他们就有激励,开发出更好用的应用,让你和更多人享受科技进步的成果。 祝深度学习愉快! 喜欢别忘了 点赞 。 还可以微信关注我的公众号 “玉树芝兰”(nkwangshuyi) 。别忘了 加星标 ,以免错过新推送提示。 延伸阅读 你可能也会对以下话题感兴趣。点击链接就可以查看。 如何高效学 Python ? 如何用 Python 和深度迁移学习做文本分类? 如何用 Python 和 BERT 做中文文本二元分类? 如何用 Python 和 BERT 做多标签(multi-label)文本分类? 如何在 fast.ai 用 BERT 做中文文本分类? 题图 : Photo by Jon Tyson on Unsplash
9456 次阅读|3 个评论
人工智能写手,好用吗?
wshuyi 2019-8-23 18:37
有了这东西,作文还怎么判啊? 印象 之前给学生上课的时候,我介绍过利用循环神经网络,仿照作家风格进行创作的机器学习模型。 不过,那模型写出来的东西嘛…… He went over to the gate of the café. It was like a country bed.“Do you know it’s been me.”“Damned us,” Bill said.“I was dangerous,” I said. “You were she did it and think I would a fine cape you,” I said.“I can’t look strange in the cab.”“You know I was this is though,” Brett said.“It’s a fights no matter?”“It makes to do it.”“You make it?”“Sit down,” I said. “I wish I wasn’t do a little with the man.”“You found it.”“I don’t know.”“You see, I’m sorry of chatches,” Bill said. “You think it’s a friend off back and make you really drunk.” 我的评价是: 望之,不似人语。 因为这种限制,人们并没有把“机器写作”当成一回事儿。 总觉得机器要写成那种以假乱真的高度,可能还需要等上很久远的一段时间。 然而,这世界变化快。 工具 早上,我尝试了一个新工具。 一个在线编辑器界面里,输入或长或短的一段话,然后按一下 Tab 键。 后面的内容,机器就帮你 自动 逐步填充。 填充的过程里,系统每次给你3个备选方案,这样你可以控制写作思路的走向。 当然,你也可以根本不管其他选项,一直走默认路径。机器照样文思泉涌。 最后生成的文章,是这个样子的。 其中,第一段落是我自己随便瞎写的。后面高亮段落,都是电脑模型自己编出来的。 不但标点符号、语法修辞用得有鼻子有眼儿,就连我那段里根本没有提到过的创始人,都跳了出来长篇大论。 尝试 你可以在我的公众号“玉树芝兰”(nkwangshuyi)后台回复“aiwrite”,查看这个智能写作编辑器的链接。 不知道你尝试过后的感觉是什么。 反正我觉得,以后学校里的英文写作课,怕是没有办法判作业了。 原本需要学生花半个小时完成的任务,现在他可以轻点几下按键,就能搞定交差。 更要命的是,从原理来讲,查重系统面对这种作品,是无效的。 因为这 并非抄袭 。 机器每一次的“创作”,几乎都能保证是全新的。 原理 你一定想知道这背后的原理吧? 其实,在我们之前的教程里,我多次给你介绍过它。就是目前最火的自然语言模型架构——Transformer。 (上图来自于经典之作“Attention is All You Need”) 我们详细介绍过使用方法的 BERT ,当初用的就是这种技术,才产生了野蛮霸榜的效果。 不过咱们用的这个编辑器,底层并不是 BERT ,而是我们之前提及的 GPT 2。 大多数人提到它的时候,介绍往往不是那么正面。 并不是因为 GPT 2 这种技术不够好。而是因为它“ 太好了 ”。 好到足够让人眼馋。 好到开发者决定, 不开放 训练数据集、代码、甚至模型参数…… 要知道,在当今这样一个 开源开放 的趋势下,这么做会招致多少非议。 当时 OpenAI 做出这种决定和解释,有人便认为是出于饥饿营销的目的,赚眼球。 但是,你刚刚自己尝试过语言生成模型的威力之后,还会保持这么单纯的想法吗? 威胁 仅举一例。 互联网上,假新闻是一个非常严重的问题。 原先,用机器造假新闻出来,成本固然低,但专业人士还是很容易通过语言特征和统计规律来识别的。 而一旦,假新闻不但生产成本低廉,分分钟可搞定,还完全具备了真新闻的语言特征,要分辨出来,就不容易了。 假新闻有可能多点大规模爆发,因 从众 和 沉默螺旋 等社会心理机制,对大众轻易造成误导。 面对这种潜在威胁,我们真的已有完善的应对之策吗? 正因为这种威胁实际存在,数据伦理才愈发成为重要的研究课题。 如果你做数据科学研究,这个方向大有可为。 魔盒 风险是显著的。 而技术的进步与发展,真的能够因为一家机构决定“不开放模型”的举措,就能停滞吗? 当然不会。 OpenAI 因为压力,不断释放出更为强大的开源模型。目前开放的预训练模型版本,达到了 774M 个参数。距离完全版本模型的释放,也就是临门一脚的事儿了。 曾经,普通人即便拿到了这种开源工具,也需要一定的门槛,才能使用。 然而“有好事者”,在整合包装了若干种主流的 Transformer 模型之后,降低了 GPT2 机器写作的门槛。 于是,就有你看到的这个编辑器了。 波澜 我把 GPT2 自动写作的结果,发到了朋友圈。 惊艳之余,小伙伴想到的,主要是以下两个问题: 什么时候出中文的? 能否和写字机器人配合使用? 我看后很无语。 好在这一位的留言,让我看到了光明的一面: 以后英语老师出阅读题,可方便多了。 延伸阅读 你可能也会对以下话题感兴趣。点击链接就可以查看。 如何高效学 Python ? 如何用 Python 和深度迁移学习做文本分类? 如何用 Python 和 BERT 做中文文本二元分类? 如何用 Python 和 BERT 做多标签(multi-label)文本分类? 如何在 fast.ai 用 BERT 做中文文本分类? 喜欢别忘了 点赞 。 还可以微信关注我的公众号 “玉树芝兰”(nkwangshuyi) 。别忘了 加星标 ,以免错过新推送提示。 题图: Photo by Pereanu Sebastian on Unsplash
3032 次阅读|0 个评论
如何在 fast.ai 用 BERT 做中文文本分类?
wshuyi 2019-7-29 10:19
鱼我所欲也,熊掌亦我所欲也。 痛点 我之前用 BERT ,就 没有 痛快过。 最初,是 Google 发布的原始 Tensorflow 代码,一堆堆参数,一行行代码,扑面而来。让人看着,就眼晕。 后来,Google 把 BERT 在 Tensorflow Hub 上面打了个包。 还是需要很多行代码,许多参数设置,才能让它学习你自己提供的数据。不过我还是很兴奋地帮你重构代码,搞了个 十行代码可执行版本 。 但这其实,不过是 隐藏了大量细节 而已。 那些繁琐的代码,依然在那里。 代码越多,修改和维护就越困难。 你看人家 fast.ai ,需要什么功能,只要找到对应的 API ,输入三样东西: 数据 模型架构 损失函数 一般而言,只需要几行代码。 然后,结果就出来了。 这样,你可以很轻易尝试自己的想法,并且在不同数据集上面加以验证。 这种 快速迭代反馈 ,对于机器学习研究来说,是非常有益处的。 因此,当 Huggingface 的 Kaushal Trivedi 真的起心动念,仿照 fast.ai 搞了个 fastbert 时,我特别开心。 于是又 写了份教程 ,教你如何用它来做多标签文本分类。 但是,这个 fastbert ,与 fast.ai 比起来,差别还是太大了。 首先是设置起来依旧繁琐,你得照顾到许多参数; 其次是维护并不及时。两次更新之间的时间,竟然可能相差一个月; 第三是缺乏文档和样例。这对于新手,是非常不友好的。 几乎所有遭遇到这些问题的人,都在问一个问题: 什么时候,才能在 fast.ai 里面,方便地调用 BERT 来完成自然语言处理任务呢? 大部分人,只是动动念头,然后继续将就着使用 fast.ai 提供的 ULMfit 来处理英文文本。 毕竟,对于英文、波兰文来说,效果 也不错 。 可是,中文怎么办? ULMfit 推出1年多了,至今却没有一个公开发布、广泛使用的中文预训练模型。 这真是令人烦恼的事儿啊! 黑客 有需求,也就有人来琢磨解决。 fast.ai 结合 BERT 这问题,对研究者的要求,着实不低。至少包括: 熟悉 fast.ai 框架机制; 熟悉 BERT 工作原理; 此外,还得能够融汇贯通,把二者结合起来,这就需要对 PyTorch 的熟练掌握。 能做出这样工作的人,大约就算是黑客了。 幸好,这样的高人真的出手了。 他就是卡内基梅隆大学的研究生,Keita Kurita。 Keita 有个博客,叫 Machine Learning Explained ,干货非常多,这里一并推荐给你。 他写的 fast.ai 结合 BERT 的英文教程,地址在 这里 。 其实,有时候问题的解决,就如同窗户纸,一捅就破。 Keita 并没有尝试“重新发明轮子”,即从头去解决这个问题。 他只是巧妙地借用了第三方的力量,并且将其与 fast.ai 融合起来。 这个第三方,就是咱们前面提过的 Huggingface 。 自从 BERT 的 Tensorflow 源代码经由 Google 发布出来,他们就在 Github 上面,搞了一个 PyTorch 版本的克隆。 这个克隆,还包含了预训练的结果。 也就是说,他们提供了一个完整版的模型架构,只要配上相应的数据和损失函数, fast.ai 就可以开工了! fast.ai 文本处理一直不支持中文,是因为它其实也调用了第三方库,就是咱们介绍过的 Spacy 。 到今天为止, Spacy 也并不能完整支持中文处理,这就导致了 fast.ai 对中文无能为力。 但是, BERT 可不是这样。 它很早就有专门的中文处理工具和预训练模型。 关键是,如何在 fast.ai 中,用它替换掉 Spacy 来使用。 Keita 的文章,一举解决了上述两个问题。 便捷的 fast.ai 框架就这样和强大的 BERT 模型嫁接了起来。 变化 受 Keita 的影响,其他作者也尝试了不同的任务和数据集,并且把自己的代码和工作流程也做了发布。 例如 abhik jha 这篇 “Fastai integration with BERT: Multi-label text classification identifying toxicity in texts”(地址在 这里 ),还在 Twitter 受到了 Jeremy Howard (fast.ai 联合创始人)点赞。 蒙天放 这篇 知乎教程,更讲解了如何处理中文数据分类。 看起来,我似乎没有必要再写一篇教程了。 然而环境是在 变化 的。 Huggingface 现在,已经不仅仅做 BERT 预训练模型的 PyTorch 克隆了。 他们居然希望把所有的 Transformer 模型,全都搞一遍。 于是把原先的 Github 项目“pytorch-pretrained-BERT”,改成了“pytorch-transformers”这样一个野心勃勃的名字。 新的项目地址在 这里 。 你的想象空间,也就可以因此而开启了。 能不能用这些基于 Transformer 的预训练模型,来做自己的下游任务呢? 一如既往, Huggingface 的技术还是那么过硬。 然而,提供的接口,还是那么繁琐。虽然用户手册比之前有了较大改进,可教程样例依然不够友好。 我于是在思考,既然老版本 BERT 预训练模型可以和 fast.ai 对接,那能否把新版本的各种 Transformer,也用这种方式简化调用呢? 如果这样做可以的话,咱们就不必再眼巴巴等着 Huggingface 改进教程与用户接口了,直接用上 fast.ai ,取两者的长处,结合起来就好了。 于是,我开始了尝试。 一试才发现,新版本“pytorch-transformers”的预训练模型,与老版本还有一些变化。倘若直接迁移代码,会报错的。 所以,这篇文章里,我从头到尾,为你提供一个在新版本“pytorch-transformers” 中 BERT 预训练模型上直接能用的样例,并且加以详细讲解。 这样一来,相信我踩了一遍的坑,你就可以躲开了。这可以大量节省你的时间。 同时,我也希望你能够以这个样例作为基础,真正做到 举一反三 ,将其他的 Transformer 模型尝试迁移,并且把你的试验结果,分享给大家。 环境 本文的配套源代码,我放在了 Github 上。 你可以在我的公众号“玉树芝兰”(nkwangshuyi)后台回复“aibert”,查看完整的代码链接。 如果你对我的教程满意,欢迎在页面右上方的 Star 上点击一下,帮我加一颗星。谢谢! 注意这个页面的中央,有个按钮,写着“在 Colab 打开”(Open in Colab)。请你点击它。 然后,Google Colab 就会自动开启。 我建议你点一下上图中红色圈出的 “COPY TO DRIVE” 按钮。这样就可以先把它在你自己的 Google Drive 中存好,以便使用和回顾。 Colab 为你提供了全套的运行环境。你只需要依次执行代码,就可以复现本教程的运行结果了。 如果你对 Google Colab 不熟悉,没关系。我 这里有一篇教程 ,专门讲解 Google Colab 的特点与使用方式。 为了你能够更为深入地学习与了解代码,我建议你在 Google Colab 中开启一个全新的 Notebook ,并且根据下文,依次输入代码并运行。在此过程中,充分理解代码的含义。 这种看似笨拙的方式,其实是学习的有效路径。 代码 首先提示一下,fast.ai 给我们提供了很多便利,例如你只需要执行下面这一行,许多数据科学常用软件包,就都已经默认读入了。 from fastai.text import * 因此,你根本就不需要执行诸如 import numpy as np , import torch 之类的语句了。 下面,我们本着 fast.ai 的三元素(数据、架构、损失函数)原则,首先处理数据。 先把数据下载下来。 !wgethttps://github.com/wshuyi/public_datasets/raw/master/dianping.csv 这份大众点评情感分类数据,你应该已经很熟悉了。之前的教程里面,我多次用它为你演示中文二元分类任务的处理。 让我们用 Pandas ,读入数据表。 df=pd.read_csv( dianping.csv ) 下面是划分 训练集、验证集和测试集 。我们使用 scikit-learn 软件包协助完成。 from sklearn.model_selection import train_test_split 首先,我们把全部数据,分成训练和测试集。 注意这里我们设定 random_state ,从而保证我这儿的运行结果,在你那里可 复现 。这可是“可重复科研”的基本要件。 train,test=train_test_split(df,test_size= .2 ,random_state= 2 ) 之后,我们再从原先的训练集里,切分 20% ,作为验证集。依旧,我们还是要设置 random_state 。 train,valid=train_test_split(train,test_size= .2 ,random_state= 2 ) 之后,咱们检查一下不同数据集合的长度。 训练集: len(train) 验证集: len(valid) 测试集: len(test) 然后,来看看训练集前几行内容。 train.head() 数据预处理的第一步,已经做完了。 但是,我们都知道,机器学习模型是不认识中文的,我们必须做进一步的处理。 这时候,就需要 Huggingface 的 Transformers 预训练模型登场了。 !pipinstallpytorch-transformers 本文演示的是 BERT ,所以这里只需要读入两个对应模块。 一个是 Tokenizer ,用于把中文句子,拆散成一系列的元素,以便映射成为数字来表示。 一个是 序列分类 模块。在一堆 Transformer 的顶部,通过全连接层,来达到分类功能。 from pytorch_transformers import BertTokenizer,BertForSequenceClassification 我们指定几个必要的参数。 例如每句话,最长不能超过128个字。 每次训练,用32条数据作为一个批次。 当然,我们用的预训练模型,是中文的,这也得预先讲好。 bert_model= bert-base-chinese max_seq_len= 128 batch_size= 32 设置参数之后,我们就可以读取预置的 Tokenizer 了,并且将它存入到 bert_tokenizer 变量中。 bert_tokenizer=BertTokenizer.from_pretrained(bert_model) 我们检查一下,看预训练模型都认识哪些字。 这里我们随意选取从 2000 到 2005 位置上的 Token 来查看。 list(bert_tokenizer.vocab.items()) 这里我们看到, BERT 还真是认识不少汉字的。 我们把全部的词汇列表存储起来,下面要用到。 bert_vocab=Vocab(list(bert_tokenizer.vocab.keys())) 注意 fast.ai 在 Tokenizer 环节,实际上设计的时候有些偷懒,采用了“叠床架屋”的方式。 反正最终调用的,是 Spacy ,因此 fast.ai 就把 Spacy Tokenizer 作为底层,上层包裹,作为自己的 Tokenizer 。 我们这里做的工作,就是重新定义一个新的 BertFastaiTokenizer ,最重要的功能,就是把 Spacy 替掉。另外,在每一句话前后,根据 BERT 的要求,加入起始的 和结束位置的 ,这两个特殊 Token 。 class BertFastaiTokenizer (BaseTokenizer) : def __init__ (self,tokenizer,max_seq_len= 128 ,**kwargs) : self.pretrained_tokenizer=tokenizer self.max_seq_len=max_seq_len def __call__ (self,*args,**kwargs) : return self def tokenizer (self,t) : return ]+self.pretrained_tokenizer.tokenize(t) + ] 我们把这个类的调用,作为一个函数保存。 tok_func=BertFastaiTokenizer(bert_tokenizer,max_seq_len=max_seq_len) 然后,最终的 Tokenizer, 是把这个函数作为底层,融入其中的。 bert_fastai_tokenizer=Tokenizer( tok_func=tok_func, pre_rules= ) 我们设定工作目录为当前目录。 path=Path( . ) 之后,得把训练集、验证集和测试集读入。 注意我们还需要指定数据框里面,哪一列是文本,哪一列是标记。 另外,注意 fast.ai 和 BERT 在特殊 Token 定义上的不同。 include_bos 和 include_eos 要设定为 False ,否则两套系统间会冲突。 databunch=TextClasDataBunch.from_df(path,train,valid,test, tokenizer=bert_fastai_tokenizer, vocab=bert_vocab, include_bos= False , include_eos= False , text_cols= comment , label_cols= 'sentiment' , bs=batch_size, collate_fn=partial(pad_collate,pad_first= False ,pad_idx= 0 ), ) 让我们来看看预处理之后的数据吧: databunch.show_batch() 在 fast.ai 里面,正常出现了 BERT 风格的中文数据预处理结果,还是很令人兴奋的。 注意,前面我们指定了 pre_rules 和 post_rules 两个参数,都写成 下面,我们来用新构建的类,搭模型架构。 注意你需要说明分类任务要分成几个类别。 我们这里是二元分类,所以写2。 bert_pretrained_model=MyNoTupleModel.from_pretrained(bert_model,num_labels= 2 ) 现在,只剩下第三个元素了,那就是 损失函数 。 因为要做二元分类,输出的结果按照 fast.ai 的要求,会是 这样。所以损失函数我们选择 nn.CrossEntropyLoss 。 loss_func=nn.CrossEntropyLoss() 三大要素聚齐,我们终于可以构建学习器 Learner 了。 learn=Learner(databunch, bert_pretrained_model, loss_func=loss_func, metrics=accuracy) 有了 Learner ,剩下的工作就简单了许多。 例如,我们可以寻找一下最优的最大学习速率。 learn.lr_find() 找到后,绘制图形。 learn.recorder.plot() 读图以后,我们发现,最大学习速率的量级,应该在 e-5 上。这里我们设置成 2e-5 试试。 这里,只跑两个轮次,避免过拟合。 当然,也有省时间的考虑。 learn.fit_one_cycle( 2 , 2e-5 ) 验证集上,效果还是很不错的。 但是,我们不能只拿验证集来说事儿。还是得在测试集上,看真正的模型分类效果。 这里面的原因,我在《 如何正确使用机器学习中的训练集、验证集和测试集? 》一文中,已经为你做了详细的解释。 如果忘了,赶紧复习一下。 我们用 笨办法 ,预测每一条测试集上的数据类别。 定义一个函数。 def dumb_series_prediction (n) : preds= ) )) return preds 实际执行,结果存入到 preds 里面。 preds=dumb_series_prediction(len(test)) 查看一下前 10 个预测结果: preds 我们还是从 scikit-learn 里面读入分类报告和混淆矩阵模块。 from sklearn.metrics import classification_report,confusion_matrix 先看分类报告: print(classification_report(test.sentiment,preds)) f1-score 达到了 0.9 ,很棒! 再通过混淆矩阵,看看哪里出现判断失误。 print(confusion_matrix(test.sentiment,preds)) 基于 BERT 的中文分类任务完成! 小结 通过这篇文章的学习,希望你掌握了以下知识点: 如何在 fast.ai 中使用自定义 Tokenizer; 如何根据与训练模型要求,微调特殊 Token 设置; 如何在 fast.ai 中调用 Transformer 预训练模型; 如何把自己的数据、架构和损失函数封装在 fast.ai 学习器中。 如前文所述,希望你举一反三,尝试把 Huggingface 推出的其他 Transformer 预训练模型与 fast.ai 结合起来。 欢迎你把尝试的结果在留言区分享给其他同学。 祝深度学习愉快! 征稿 SSCI 检索 期刊 Information Discovery and Delivery 要做一期《基于语言机器智能的信息发现》( “Information Discovery with Machine Intelligence for Language”) 特刊(Special Issue)。 本人是客座编辑(guest editor)之一。另外两位分别是: 我在北得克萨斯大学(University of North Texas)的同事 Dr. Alexis Palmer 教授 南京理工大学 章成志教授 征稿的主题包括但不限于: Language Modeling for Information Retrieval Transfer Learning for Text Classification Word and Character Representations for Cross-Lingual Analysis Information Extraction and Knowledge Graph Building Discourse Analysis at Sentence Level and Beyond Synthetic Text Data for Machine Learning Purposes User Modeling and Information Recommendation based on Text Analysis Semantic Analysis with Machine Learning Other applications of CL/NLP for Information Discovery Other related topics 具体的征稿启事(Call for Paper),请查看 Emerald 期刊官网的 这个链接 (http://dwz.win/c2Q)。 作为本专栏的老读者,欢迎你,及你所在的团队踊跃投稿哦。 如果你不巧并不从事上述研究方向(机器学习、自然语言处理和计算语言学等),也希望你能帮个忙,转发这个消息给你身边的研究者,让他们有机会成为我们特刊的作者。 谢谢! 延伸阅读 你可能也会对以下话题感兴趣。点击链接就可以查看。 如何用 Python 和深度迁移学习做文本分类? 如何用 Python 和 BERT 做中文文本二元分类? 如何用 Python 和 BERT 做中文文本二元分类? 如何用 Python 和 BERT 做多标签(multi-label)文本分类? 题图 : Photo by Harley-Davidson on Unsplash
8919 次阅读|0 个评论
如何用 fast.ai 高效批量推断测试集?
wshuyi 2019-7-22 08:42
简洁和效率,我们都要。 痛点 通过咱们之前几篇 fast.ai 深度学习框架介绍,很多读者都认识到了它的威力,并且有效加以了利用。 fast.ai 不仅语法简洁,还包裹了很多实用的数据集与预训练模型,这使得我们在研究和工作中,可以省下大量的时间。 跟着教程跑一遍,你会发现做图像、文本分类,乃至推荐系统,其实是非常简单的事情。 然而,细心的你,可能已经发现了一个问题: fast.ai 训练数据体验很好;可做起测试集数据推断来,好像并不是那么 高效 。 教程里面,模型训练并且验证后,推断/预测是这么做的: 如果你只是需要对单个新的数据点做推断,这确实足够了。 但是如果你要推断/预测的是一个集合,包含成千上万条数据,那么该怎么办呢? 你可能会想到,很简单,写个循环不就得了? 从道理上讲,这固然是没错的。 但是你要真是那么实践起来,就会感觉到 等待的痛苦 了。 因为上面这条语句,实际上效率是很低的。 这就如同你要搬家。理论上无非是把所有要搬的东西,都从A地搬到B地。 但是,你比较一下这两种方式: 方法一,把所有东西装箱打包,然后一箱箱放到车上,车开到B地后,再把箱子一一搬下来。 方法二,找到一样要搬的东西,就放到车上,车开到B地,搬下来。车开回来,再把下一样要搬的东西放上去,车开走……重复这一过程。 你见过谁家是用方法二来搬家的? 它的效率太低了! 用循环来执行 predict 函数,也是一样的。那里面包含了对输入文本的各种预处理,还得调用复杂模型来跑这一条处理后的数据,这些都需要开销/成本。 怎么办? 其实,fast.ai 提供了完整的解决方案。你可以把测试集作为整体进行输入,让模型做推断,然后返回全部的结果。根本就不需要一条条跑循环。 可是,因为这个方式,并没有显式写在教程里面,导致很多人都有类似的疑问。 这篇文章里,我就来为你展示一下,具体该怎么做,才能让 fast.ai 高效批量 推断测试集数据。 为了保持简洁,我这里用的是文本分类的例子。其实,因为 fast.ai 的接口逻辑一致,你可以很方便地把它应用到图像分类等其他任务上。 划分 为了保持专注,我们这里把一个模型从训练到推断的过程,划分成两个部分。 第一部分,是读取数据、训练、验证。 第二部分,是载入训练好的模型,批量推断测试集。 我把第一部分的代码,存储到了 Github 上,你可以在我的公众号“玉树芝兰”(nkwangshuyi)后台回复“train”,查看完整的代码链接。 点击其中的“Open in Colab”按钮,你可以在 Google Colab 云端环境打开并且执行它,免费使用 Google 提供的高性能 GPU 。 如果你想了解其中每一条代码的具体含义,可以参考我的这篇《 如何用 Python 和深度迁移学习做文本分类? 》。 注意,在其中,我加入了3条额外的数据输出语句。 分别是: data_clas.save( 'data_clas_export.pkl' ) 这一条,存储了我们的分类数据(包含训练集、验证集、测试集)及其对应的标签。注意,因为 fast.ai 的特殊假设(具体见后文“解释”部分),测试集的标签全部都是0。 也正因如此,我们需要单独存储测试集的正确标签: with open(path/ test_labels.pkl , 'wb' ) as f: pickle.dump(test.label,f) 除了上述两条之外,你还需要保留训练好的模型。 毕竟,为了训练它,我们也着实是花了一番时间的。 learn.export( model_trained.pkl ) 上述 pickle 数据文件,我都存储到了 Gitlab 公共空间。后面咱们要用到。 这就是训练和存储模型的全部工作了。 第二部分,才是本文的 重点 。 这一部分,我们开启一个全新的 Google Colab 笔记本,读入上述三个文件,并且对测试集进行批量推断。 这个笔记本,我同样在 Github 上存储了一份。 你可以在后台回复“infer”,找到它的链接。 下面,我给你一一讲解每一条代码语句的作用,并且告诉你一些关键点, 避免 你在使用过程中,跟我一样 踩坑 。 代码 首先,你要读入 fast.ai 的文本处理包。 from fastai.text import * 注意这个包可不只是包含 fast.ai 的相关函数。 它把许多 Python 3 新特性工具包,例如 pathlib 等,全都包含在内。这就使得你可以少写很多 import 语句。 下面,是从 Gitlab 中下载我们之前保存的 3 个 pickle 数据文件。 !gitclonehttps://gitlab.com/wshuyi/demo_inference_ulmfit_fastai_data.git 如果你对 pickle 数据不是很熟悉,可以参考我的这篇文章《 如何用 Pandas 存取和交换数据? 》。 我们设定一下数据所在目录: path=Path( 'demo_inference_ulmfit_fastai_data' ) 下面,我们就要把训练好的模型恢复回来了。 learn=load_learner(path, model_trained.pkl ) 不过这里有个问题。 虽然 fast.ai 是高度集成的,但为了避免训练结果占用空间过大,模型和数据是分别存储的。 这时我们读取回来的,只有一个预训练模型架构。配套的数据,却还都不在里面。 我们可以通过展示学习器 learn 的内容,来看看。 learn 注意下方架构的数据是完整的,但是训练集、验证集、测试集的长度,都是0。 这时候,我们就需要自己读入之前存好的分类数据了。 learn.data=load_data(path, data_clas_export.pkl ) 数据、模型都在,我们可以进行测试集数据推断了。 predictions=learn.get_preds(ds_type=DatasetType.Test,ordered= True ) 注意这一句里,函数用的是 get_preds 。说明我们要批量推断。 数据部分,我们指定了测试集,即 DatasetType.Test 。但是默认情况下,fast.ai 是不保持测试集数据的顺序的。所以我们必须指定 ordered=True 。这样才能拿我们的预测结果,和测试集原先的标记进行比较。 测试集推断的结果,此时是这样的: predictions 这个列表里面包含了 2 个张量(Tensor)。 千万不要以为后面那个是预测结果。不,那就是一堆0. 你要用的,是第一个张量。 它其实是个二维列表。 每一行,代表了对应两个不同分类,模型分别预测的概率结果。 当然,作为二元分类,二者加起来应该等于1. 我们想要的预测结果,是分类名称,例如0还是1. 先建立一个空的列表。 preds= .tolist(): preds.append(int(item item )) 看看我们最终预测的标记结果: preds 为了和真实的测试集标记比较,我们还要读入第三个文件。 with open(path/ test_labels.pkl , 'rb' ) as f: labels=pickle.load(f) 预测结果与真实标记我们都具备了。下面该怎么评价模型的分类效果? 这时可以暂时抛开 fast.ai ,改用我们的老朋友 scikit-learn 登场。 它最大的好处,是用户界面设计得非常人性化。 我们这里调用两个模块。 from sklearn.metrics import classification_report,confusion_matrix 先来看分类报告: print(classification_report(labels,preds)) 几千条数据训练下来,测试集的 f1-score 就已经达到了 0.92 ,还是很让人振奋的。 fast.ai 预置的 ULMfit 性能,已经非常强大了。 我们再来看看混淆矩阵的情况: print(confusion_matrix(labels,preds)) 分类的错误情况,一目了然。 解释 讲到这里,你可能还有一个疑惑,以易用著称的 fast.ai ,为什么没有把测试集推断这种必要功能做得更简单和直观一些? 而且,在 fast.ai 里,测试集好像一直是个“二等公民”一般。 以文本分类模型为例。 TextDataBunch 这个读取数据的模块,有一个从 Pandas 数据框读取数据的函数,叫做 from_df 。 我们来看看它的文档。 注意这里, train_df (训练集) 和 valid_df (验证集)都是必填项目,而 test_df 却是选填项目。 为什么? 因为 fast.ai 是为你参加各种学术界和业界的数据科学竞赛提供帮助的。 这些比赛里面,往往都会预先给你训练集和验证集数据。 但是测试集数据,一般都会在很晚的时候,才提供给你。即便给你,也是 没有 标记的。 否则,岂不是成了发高考试卷的时候,同时给你标准答案了? 看过《 如何正确使用机器学习中的训练集、验证集和测试集? 》一文后,再看 fast.ai 的设计,你就更容易理解一些。 你训练模型的大部分时候,都 不会 和测试集打交道。甚至多数场景下,你根本都没有测试集可用。 所以,fast.ai 干脆把它做成了可选项,避免混淆。 然而,这种设计初衷虽然好,却也给很多人带来烦恼。尤其是那些不参加竞赛,只是想和已有研究成果对比的人们。 大量场景下,他们都需要频繁和测试集交互。 我建议 fast.ai ,还是把这部分人的需求考虑进来吧。至少,像本文一样,写个足够简明的文档或样例,给他们使用。 小结 通过这篇文章的学习,希望你掌握了以下知识点: 如何保存在 fast.ai 中训练的模型; 如何在 fast.ai 中读取训练好的模型,以及对应的数据; 如何批量推断测试集数据; 如何用 scikit-learn 进行分类测试结果汇报。 祝深度学习愉快! 征稿 SSCI 检索 期刊 Information Discovery and Delivery 要做一期《基于语言机器智能的信息发现》( “Information Discovery with Machine Intelligence for Language”) 特刊(Special Issue)。 本人是客座编辑(guest editor)之一。另外两位分别是: 我在北得克萨斯大学(University of North Texas)的同事 Dr. Alexis Palmer 教授 南京理工大学 章成志教授 征稿的主题包括但不限于: Language Modeling for Information Retrieval Transfer Learning for Text Classification Word and Character Representations for Cross-Lingual Analysis Information Extraction and Knowledge Graph Building Discourse Analysis at Sentence Level and Beyond Synthetic Text Data for Machine Learning Purposes User Modeling and Information Recommendation based on Text Analysis Semantic Analysis with Machine Learning Other applications of CL/NLP for Information Discovery Other related topics 具体的征稿启事(Call for Paper),请查看 Emerald 期刊官网的 这个链接 (http://dwz.win/c2Q)。 作为本专栏的老读者,欢迎你,及你所在的团队踊跃投稿哦。 如果你不巧并不从事上述研究方向(机器学习、自然语言处理和计算语言学等),也希望你能帮个忙,转发这个消息给你身边的研究者,让他们有机会成为我们特刊的作者。 谢谢! 延伸阅读 你可能也会对以下话题感兴趣。点击链接就可以查看。 如何高效学 Python ? 《文科生数据科学上手指南》分享 如何用 Python 和 fast.ai 做图像深度迁移学习? 如何用 Python 和深度迁移学习做文本分类? 如何用 Python 和 BERT 做中文文本二元分类? 喜欢别忘了 点赞 。 还可以微信关注我的公众号 “玉树芝兰”(nkwangshuyi) 。别忘了 加星标 ,以免错过新推送提示。 题图: Photo by Tim Evans on Unsplash
6183 次阅读|0 个评论
专题讨论班:模式识别之深度学习算法、自然语言处理(周池春)
GrandFT 2019-6-17 12:38
题目:模式识别之深度学习算法、自然语言处理及其他相关问题简介 主讲人:周池春 时间:2019年6月17号下午12:30-14:30 地点:天津大学新校区32教302 提纲: 1)模式识别中的数据问题与现有解决问题,如,冗余(高度相关)、错误、不全,缺失的特征被抹平。 2)模式识别中的算法。 机器学习算法 深度学习算法 RNN类网络 CNN类网络 其他代表网络 Tensorflow为代表的框架 3)自然语言处理的例子。 从关键词模型开始说起到n-gram统计算法 →机器学习算法→三大经典深度学习算法 模型压缩问题 语言的理解→语言模型 3)网络与linux简介。 4)web服务与python解决方案简述。 参考文献: 《深度学习》Goodfellow、Bengio和Courville 《NeuralnetworksandDeepLearning》 《DeepLearningwithPython》 《Hands-OnMachineLearningwithScikit-LearnandTensorFlow》
个人分类: 专题讨论班|2069 次阅读|0 个评论
[转载]进行深度学习时,如何选择激活函数?
dalianwang 2019-6-16 04:22
How to choose the right activation function? The activation function is decided depending upon the objective of the problem statement and the concerned properties. Some of the inferences are as follows: Sigmoid functions work very well in the case of shallow networks and binary classifiers. Deeper networks may lead to vanishing gradients. The ReLU function is the most widely used, and try using Leaky ReLU to avoid the case of dead neurons. Thus, start with ReLU, then move to another activation function if ReLU doesn't provide good results. Use softmax in the outer layer for the multi-class classification. Avoid using ReLU in the outer layer.
个人分类: 机器学习|1379 次阅读|0 个评论
如何用 Python 和 BERT 做多标签(multi-label)文本分类?
wshuyi 2019-5-21 09:08
10余行代码,借助 BERT 轻松完成多标签(multi-label)文本分类任务。 疑问 之前我写了《 如何用 Python 和 BERT 做中文文本二元分类? 》一文,为你讲解过如何用 BERT 语言模型和迁移学习进行文本分类。 不少读者留言询问: 王老师,难道 BERT 只能支持二元分类吗? 当然 不是 。 BERT 是去年以来非常流行的语言模型(包括 ELMO, Ulmfit, BERT, Ernie, GPT-2等)的一种,长期霸榜,非常强悍。 研究者已经证明,它可以很好地处理多种自然语言处理任务。甚至在部分任务上,超越了人类水平。 它处理自然语言任务,靠的是 迁移学习 的威力。 复习一下,我在《 如何用 Python 和深度迁移学习做文本分类? 》一文里,给你讲过迁移学习的范例 ULMfit (Universal language model fine-tuning for text classification)。 其原理就是首先让一个深度神经网络在海量文本上 自监督学习 (self-supervised learning)。 自监督和非监督(unsupervised)学习的区别,在于自监督学习,实际上是 有标记 的。 例如我们找到大量的语料,把常出现的词语放在一起,配对成(输入,输出)格式,例如(France, Paris)。这里 Paris 就可以看做是 France 的标记。然后学习的方式跟监督学习没有差别。 这也是著名的 word2vec 训练方式。 那问题来了,为什么不干脆叫监督学习? 因为监督学习,往往是指需要 人工参与打标记 的。例如你已经熟悉的情感分类任务,都是人阅读以后标记1或者0的。 可在语言模型这里,你利用了语料自身中词语的自然位置关系,没有主动人工打标记。所以为了区分,我们叫它“自监督学习”。 经过足够长时间的训练,这个神经网络就学会了该领域语言的特性。 然后,我们给这个神经网络,加上一个头部,就可以让它来完成特定的目标。 加上全连接层作为分类器,就可以把输入文本做分类(classification),例如我们讲解过的情感分析。 加上解码器(decoder),就可以把输入文本序列,转换成另一种序列。这就可以完成文本翻译、问答,甚至是文本转语音。 加上生成器(generator),例如卷积神经网络,就可以把序列转换成多层矩阵。这样,机器就可以根据你的文字输入,为你输出对应的图像来。 我以二元分类任务举例,仅仅是因为它 足够简单 ,便于说明。 你完全可以举一反三,直接使用它来做多类别(multi-class)分类任务,例如三分类情感分析(正向、负向、中性)之类。 这时候,《 如何用 Python 和 BERT 做中文文本二元分类? 》一文中其他的代码,都是 可以复用 的。 你只需要调整一下 测量指标 (Evaluation Metrics)。 例如说,f1 分数专门针对二分类。你用它衡量多分类任务,程序会无所适从。 把它删除,或者替换成 micro f 或者 macro f 分数,就好了。 本文,我们来看看其他同学提出的这个 更有挑战性 的问题: 老师,BERT 能否做多标签(multi-label)分类? 多标签 先来解释一下,什么叫做多标签(multi-label)文本分类问题。 这里咱们结合一个 Kaggle 上的竞赛实例。 竞赛的名字叫做:恶毒评论分类挑战(Toxic Comment Classification Challenge),链接在 这里 。 这个竞赛的数据,取自真实的网络评论。 除了序号和原始文本以外,每行数据都包含了6个维度的标注,分别是: toxic(恶毒) severe_toxic(非常恶毒) obscene(污言秽语) threat(威胁) insult(侮辱) identity_hate(憎恨) 这就是我们的任务: 对于一个样本,需要同时在6个不同维度上判断它是否属于该标签范畴。 我觉得这个竞赛的初衷非常好。 因为网上恶毒评论过多,会降低用户高质量内容贡献度,让社区变得沉寂。 而人工处理,显然效率和速度都不理想,而且成本过高。 用机器自动甄别,可以第一时间直接屏蔽恶毒评论,有助于打造良好的网络社群环境和讨论氛围。 并且,成本还很低。 你可以很容易看出,这种多标签标注和多元分类标注的区别。 多元分类任务里面,分类互斥。一个样本属于某种分类, 不能同时属于另一种 分类。 例如一条评论,不能同时属于“正向”或者“负向”情感。 一张图片,不能同时属于“哆啦A梦”或者“瓦力”。 但是这个多标签分类例子里面,我们不难看出,一个“非常恶毒”的评论,同时也必定是“恶毒”的评论。 因此一个样本,可能同时属于上述两种,甚至全部六种类别。 当然,也有可能 不属于任何 一种类别。 了解了任务后,下一个问题自然是:怎么做? 最简单的偷懒办法,是分别建立6个 独立的 模型。 第一个模型,判断是否“恶毒”。 …… 最后一个模型,判断是否“憎恨”。 这样一来,我们就可以把一个多标签分类问题,转化成6个二元分类问题。 解决了? 对。 很多论文,就是这么处理多标签分类任务的。 这样做有问题吗? 有。 因为6个独立模型,可能会判断出某条评论“非常恶毒”的同时,却认为它不“恶毒”。 这显然是个荒唐结论。 但既然模型是独立的,哪里管得了这么多? 好在,多标签分类任务,其实是可以 只用一个模型 来解决的。 一个模型的好处有很多。 例如可以对上述荒唐结论进行惩罚(penalize),从而让机器避免得出这样不合乎逻辑的判定结果。 而且,可以节省大量的时间、存储和计算资源。 本文,我们就讨论如何基于 BERT ,构造这样的多标签分类模型。 发现 本来,我是打算在之前 BERT 二元分类代码的基础上,实现多标签分类功能,然后把代码和教程提供给你的。 再次强调,我做的工作主要是 简化 (而非从头撰写)代码,使得你可以利用它学习,以及替换成你自己的数据来使用。 但是,现在正是 Tensorflow 大版本切换的过渡期。 之前分享的 BERT 二元分类原始代码采用 Tensorflow 1.X 代码编写,底层代码处理起来非常麻烦。 而且一旦 2.0 正式版推出,之前写好的 1.X 版代码需要大幅修改,甚至重来。 这种西西弗斯推石头般的 无用功 ,让人望而却步。 这时,有人 捷足先登 了。 完成这件事的,就是我的 LinkedIn 好友 Kaushal Trivedi 。 早在今年1月份,他就在 medium 发布了关于 BERT 多标签分类的文章。 那一篇文章的配套代码,他是直接基于 PyTorch 撰写的,包含了大量底层细节。 对于应用来说,源代码包含底层细节过多,可不是什么好事儿。 因为这意味着以下几个特点: 代码很长 为了适应自己的任务,找需要修改的地方很麻烦 出错之后,不容易检查 这就是为什么软件工程会强调 封装 。 所谓封装,就是把已经通过反复测试的内容包裹起来。只在更高层次上,让开发者或者用户跟输入输出接口打交道。 这样可以避免重复造轮子,而且更不容易发生错误。 受 fast.ai 的启发,Kaushal Trivedi 做了一个新的项目,叫做 fast-bert 。 看,连名字都向 fast.ai 致敬了。 这次的代码简洁明快多了。 Kaushal Trivedi 还专门写了一篇文章,讲述了如何用 fast-bert 来进行多标签分类。用的样例就是咱们刚才提到的恶毒评论分类数据。 然而,由于这个软件包刚刚研发出来,所以坑非常多,包括但不限于: 文章内的代码不完整 Github 上的样例 ipynb 文件需要特定底层 Linux 编译软件包支持 样例数据过大,导致执行时间过长 Colab 上执行,会出现内存耗尽报错 …… 把所有坑都踩过来之后,我觉得还是有必要整理出一个可以在 Google Colab 上 让你直接执行 ,并且可以 套用自己数据 的版本。 毕竟,我们都喜欢 免费的 GPU ,对吧? 现在,我已经完成了这项工作。 这篇文章就将成果 分享给你 。 数据 如果你使用恶毒评论分类数据全集的话,训练数据有十几万条。 即便用上了 Colab 的 GPU ,执行起来也会花费好几个小时的时间。 顺便说一句,Colab 的免费 GPU 最近升级了,已经从原来速度慢、内存容量小的 K80,换成了 Tesla T4 。 这里为了让你快速看到运行结果,我对数据进行了采样。 目前的训练集包含 4000 条数据,验证集只有 1000 条。比起原始数据,这只是不到20分之一而已。 同样,对于测试集,我也只采样了 1000 条。 这样做,会有不利的影响,那就是分类效果会降低。 请记住现在的结果,是在数据相对较少的基础上训练出来的。因此结果如果不理想,并不能代表 BERT 的能力不够强。 环境 本文的配套源代码,我放在了 Github 上。链接获取方式请见 本文末尾 。 如果你对我的教程满意,欢迎在页面右上方的 Star 上点击一下,帮我加一颗星。谢谢! 注意这个页面的中央,有个按钮,写着“在 Colab 打开”(Open in Colab)。请你点击它。 然后,Google Colab 就会自动开启。 我建议你点一下上图中红色圈出的 “COPY TO DRIVE” 按钮。这样就可以先把它在你自己的 Google Drive 中存好,以便使用和回顾。 Colab 为你提供了全套的运行环境。你只需要依次执行代码,就可以复现本教程的运行结果了。 如果你对 Google Colab 不熟悉,没关系。我 这里有一篇教程 ,专门讲解 Google Colab 的特点与使用方式。 为了你能够更为深入地学习与了解代码,我建议你在 Google Colab 中开启一个全新的 Notebook ,并且根据下文,依次输入代码并运行。在此过程中,充分理解代码的含义。 这种看似笨拙的方式,其实是学习的有效路径。 代码 为了让你把注意力集中在重要的环节,我这里把全部的准备工作都集中在了第一个代码段落,并且隐藏了其内容。 如果你需要查看和修改,只需要点击该代码段即可。 或者,你现在可以忽略并直接执行它。这大概需要花几分钟的时间。因为有个底层的软件包需要编译,才能支持 fast-bert 软件包。 下面,才是咱们要关注和讲解的部分。 首先,我们把数据下载下来。 !gitclonehttps://github.com/wshuyi/demo-multi-label-classification-bert.git 注意这里包含的数据,不只有采样版本,也包含了原始数据。 你在尝试过本教程后,也可以重新载入原始数据,看模型效果是否会有显著提升。 之后,是咱们的主角 fast-bert 登场。 !pipinstallfast-bert 我们需要从 fast-bert 以及它依赖的软件包 pytorch_pretrained_bert 读入一些预置函数。 from fast_bert.data import * from fast_bert.learner import * from fast_bert.metrics import * from pytorch_pretrained_bert.tokenization import BertTokenizer 之后,是参数设定。 DATA_PATH=Path( 'demo-multi-label-classification-bert/sample/data/' ) LABEL_PATH=Path( 'demo-multi-label-classification-bert/sample/labels/' ) BERT_PRETRAINED_MODEL= bert-base-uncased args = True args = 16 args = 6e-5 args = 512 args = True 这里为你解释一下各项参数的含义: DATA_PATH :数据路径。包含训练、验证和测试集的csv文件。 LABEL_PATH :标记路径。注意它只是把所有标记的类别每个一行,写在了一个 csv 中,短小精悍。 BERT_PRETRAINED_MODEL :使用的预训练模型。我们这里使用的是英文不分大小写版本 bert-base-uncased 。 args :数据处理中是否全部转换小写。这里设定为“是”。 args :训练集批次大小。这里设定为16。如果设定为32的话,Colab 的 GPU 会报告内存溢出错误。 args :学习速率。 args :最大序列长度。这里我们设定为512。当然如果你处理 Twitter 数据,140就够了。 args :以16位浮点精度来进行运算。可以加快运算速度,节省存储空间。 下面我们从预训练模型中,获得数据处理器。 tokenizer=BertTokenizer.from_pretrained(BERT_PRETRAINED_MODEL, do_lower_case=args ) 把全部的标签类别输入到列表中。 label_cols= 终于可以正式读取数据了。 databunch=BertDataBunch(DATA_PATH,LABEL_PATH,tokenizer,train_file= 'train.csv' ,val_file= 'valid.csv' , test_data= 'test.csv' ,label_file= labels.csv , text_col= comment_text ,label_col=label_cols, bs=args ,maxlen=args , multi_gpu=multi_gpu,multi_label= True ) 这里填充的参数,基本上都可以通过其名称直接了解含义。所以我这里只给你讲解以下几个重点: text_col 是指训练集、验证集和测试集里面,文本所在那一列的表头名称。 multi_gpu 是指要不要使用多 GPU 并行运算。这里前面代码已经自动获取了取值,你 不需要修改 它。 multi_label 说明了咱们要进行的是 多标签分类 任务。 读取后的数据,存在了 databunch 中。模型可以直接使用。 我们指定模型效果测量标准。 metrics= 因为是多标签分类,所以我们用的是准确率衡量指标是 accuracy_multilabel 。 我们把当前的参数设置,存入到日志记录器中。 logger.info(args) 开始构造模型了。 learner=BertLearner.from_pretrained_model(databunch,BERT_PRETRAINED_MODEL,metrics,device,logger, is_fp16=args ,loss_scale=args , multi_gpu=multi_gpu,multi_label= True ) 因为指定了 multi_label=True ,程序会自己构造模型的头部,以便正确处理 多标签分类任务 。 训练开始。 这里我们设定跑4个周期(cycle)。 learner.fit( 4 ,lr=args ,schedule_type= warmup_linear ) 根据 BERT 的设定,训练中间学习速率是要进行变化的。我们设定变化方式为 warmup_linear 。 它将在每一个周期中,把学习速率按类似下图这样的方式进行调整: 运行结果如下: 4轮周期跑下来,模型在验证集准确率达到了 0.993 。这就意味着平均每 1000 个样本,多标签分类准确数量 993 个。 这个结果怎么样? 够不够好?为什么? 这个问题作为今天的思考题。欢迎你把自己的想法记录下来写在留言区,咱们一起交流讨论。 小结 通过阅读本文,希望你已经掌握了以下知识点: 除二元分类外,语言模型(例如 BERT )的其他应用场景 多类别(multi-class)分类和多标签(multi-label)分类的区别 自监督学习(self-supervised learning)的概念 多标签分类的独立模型转化法 使用 BERT 单模型进行多标签分类 希望这些知识和技能,可以帮助你解决研究和工作中遇到的实际问题。 祝深度学习愉快! 延伸阅读 你可能也会对以下话题感兴趣。点击链接就可以查看。 如何高效学 Python ? 《文科生数据科学上手指南》分享 如何用 Python 和 fast.ai 做图像深度迁移学习? 如何用 Python 和深度迁移学习做文本分类? 如何用 Python 和 BERT 做中文文本二元分类? 喜欢别忘了点赞。 还可以微信关注我的公众号 “玉树芝兰”(nkwangshuyi) ,别忘了加星标,以免错过新推送提示。 “赞赏”一下,请我喝杯咖啡,就更好了。 如果你对 Python 与数据科学感兴趣,不妨阅读我的系列教程索引贴《 如何高效入门数据科学? 》,里面还有更多的有趣问题及解法。 题图 :Photo by Pro Church Media on Unsplash 代码链接获取方法 第一步,微信关注公众号 “玉树芝兰”(nkwangshuyi) 。 第二步,在后台回复“bert”(注意大小写)。
6084 次阅读|0 个评论
神经网络是怎么火起来的?
热度 1 yxgyylj 2019-4-19 02:33
目录: 0. 引子 1. 人工神经网络发家史 2. 深度学习——从横空出世到广泛应用 四个例子:--计算机视觉 --自然语言处理 --自动驾驶系统 --生成对抗网络 3. 神经网络背后的算法 三大要点:--反向迭代算法 --激活函数的选择 --随机梯度下降法 4. 神经网络的局限性 --要求大量训练数据 --过度拟合 --超参数选取和数学理论的缺乏 5. 笔者点评 0. 引子 近几年,“人工智能”(AI)、“深度学习”这类字眼越来越频繁地出现在我们的视野中。和十年前相比,我们的生活已经被 AI 和深度学习改变了太多太多,而今年的图灵奖得主也颁发给了深度学习领域的三位奠基人: 2019 年图灵奖得主,图片来自纽约时报(The New York Times) 正所谓几家欢喜几家愁,有人把它们当作赚钱的利器;有人对这类野蛮生长的科技深表忧虑;还有人则只愿意安静地当吃瓜群众,扔掉瓜皮吐光瓜籽后继续自己的美好或并不美好的生活。 无论您是哪类人,一个既定事实是,人工智能和深度学习已经在短短数年之内对人们的生活带来了太多的改变。近年来最为著名的一个例子也许就是 DeepMind 团队的阿尔法狗战胜李世石和柯洁 —— 尽管在国际象棋方面,人工智能在 30 年前就足以吊打所有人类大师,但由于围棋在计算复杂度吊打国际象棋,阿尔法狗的辉煌战绩依然被认为是人工智能领域的一大里程碑。 国际象棋和围棋的计算复杂度对比。两者皆为决策树模型,国际象棋使用了 α-𝛽 修剪算法,围棋则使用了蒙特卡洛决策树搜索+神经网络。图片来自 DeepMind 官网 有读者也许依然会对此不屑一顾:“围棋虽然复杂,但本质上和象棋一样,也只有有限多种可能结果啊,人工智能只需要把最佳结果意义列举并比较比较罢了!” 然而对于具有无限多种可能结果的情况,人工智能也不甘示弱,这在去年的一些电竞比赛中得到了证实。例如,在团队型即时战略游戏 Dota 2 中 (一个 5 v 5 的在线游戏),人类顶尖玩家团队被 OpenAI 团队的 OpenAI Five 战胜。 OpenAI Five(左下方)对战人类玩家(右上方) 一些资深游戏玩家或许认为 Dota 毕竟是五个人的游戏,出现“猪队友”的概率比“猪人工智能”大多了。不过在以单人竞技为主的即时战略游戏《星际争霸》中,人类顶尖玩家也败于 DeepMind 团队开发的人工智能 , 阿尔法星(AlphaStar) 之手。(关于《星际争霸》和人工智能的早期介绍,可以参考笔者的另一篇文章《 数学模型教你如何成为星际争霸高手·下 》) AlphaStar 的训练过程。动图来自 https://deepmind.com/blog/alphastar-mastering-real-time-strategy-game-starcraft-ii/ 注: 笔者表示,Dota 和星际争霸的复杂度都可以趋向于无穷,因为这类游戏的操作界面在时间和空间上都是连续的,无法用 AlphaGo 的蒙特卡洛搜索树算法来穷举。做为即时战略游戏迷,笔者以后会更加详细地介绍上面两个团队各自的算法。 不管是 DeepMind 也好,还是 OpenAI 也好,他们在训练人工智能的时候都用到了 深度学习 ,也就是有很多层的 人工神经网络 (artificial neural network,以下简称神经网络)。想必大部分读者对“神经网络”的最初印象都来自于大脑神经,顾名思义,神经网络必然和脑神经有着千丝万缕的联系。那么神经网络为什么会这么火呢?我们先来看看神经网络的发家史。 1. 人工神经网络发家史 人工神经网络的首次提出可以追溯到上世纪 40 年代,美国神经科学家 Warren McCulloch 和 Walter Pitts 提出的 神经逻辑计算模型 (Neural Logical Calculus Model, )。不过做为神经科学家,McCulloch 和 Pitts 提出该模型的初衷只是为了解释大脑是如何运行的,他们不会想到这个模型会成为神经网络的先驱,为人工智能领域带来天翻地覆的影响。 图一:McCulloch-Pitts 模型,后来的各种人工神经网络都可以归纳于这个大框架。我们会在后面的章节中详细介绍 由于受到时代的限制,McCulloch-Pitts 模型乃至于之后出现的 感知元 (Perception)都并不能体现出神经系统的特点。到了 1959 年,加拿大神经科学家 David Hubel 和瑞典神经科学家 Torsten Wiesel(两位都是诺贝尔生理学或医学奖得主,神经科学家的牛 x 是不分国界的)发现视觉神经系统中存在两种不同细胞, 复杂细胞 (complex cell)和 简单细胞 (simple cell),分别位于大脑的不同部位。受此启发,人们便在原来的神经网络中加入 隐藏层 (Hidden Layer),以体现复杂细胞可以跨层次存在。 图二 不过归根结底,人工神经网络终究是个数学模型,层数越多,模型越复杂。由于缺少有效的算法支持,在 60-80 年代期间,神经网络的研究进入一个低谷期。直到 1984 年,深度学习之父,杰弗里·辛顿(Geoffrey Hinton)等人将所谓的 反向迭代算法 (Backpropagation)引入神经网络中,神经网络的研究方才再次步入正规。例如如今炙手可热的 玻尔兹曼机 (Boltzmann machine)、 卷积神经网络 (CNN, Convolutional Neural Network)和 长短期记忆 (LSTM, Long-Short Term Memory)等,实际上在上世纪 80-90 年代就出现了。 图三:神经网络界的几大网红。笔者会在后续的文章中更加详细地介绍这些神经网络的工作原理 2. 深度学习——从横空出世到广泛应用 当神经网络真正成为网红概念时,它已经有了一个更加高大上的名字—— 深度学习 (Deep learning) 。2012 年,深度学习之父杰弗里·辛顿和他的两个学生设计了一个有 7 个隐藏层的卷积神经网络,不仅赢得了该年度计算机图像分类大赛的冠军(ILSVRC),并且其分类错误率远低于传统的图像分类方法 。 笔者注: 在计算机视觉领域,“传统”方法也是上世纪 90 年代以后才提出来的方法了,例如支持向量机、稀疏编码、SIFT方法等。该领域更新换代速度也许只略逊于生物医学的某些领域(例如癌症研究),远超其他大多数行业。 图四:你能准确分辨拖把和拖把狗吗?基于深度学习的计算机已经可以了! 从此以后,深度学习渐渐变成了越来越多领域的香饽饽。文章开头提到的阿尔法狗、阿尔法星和 OpenAI Five 就都用到了深度神经网络,以及 强化学习 (Reinforcemence Learning)的框架。 图五:新东西总是最美好的 又如在 自然语言处理 (Natural Language Processing, 一般指不同于计算机语言的人类语言)领域,2012 年,谷歌团队开发出了一种用高维向量来表示单词的方法(俗称 word2vec),于是文本变成了数据,为使用深度学习方法(例如长短期记忆 LSTM网络)提供了理论架构 。 图六:文本处理与深度学习的结合。多数聊天机器人就是用这种方式被训练出来的 再如自动驾驶系统的实现。最著名的框架也许是英伟达(NVIDIA)公司在 2016 年提出来的“端对端系统” (end-to-end system)。该系统采用三个不同相机以通过不同视角记录和随机生成路况信息,然后将这些生成的路况信息用一个卷积神经网络进行训练,并不断地用实际操纵指令来纠正神经网络产生的错误。该系统的训练过程如下所示: 图七:英伟达的“端对端系统”训练过程。原图来自 的图片 2 英伟达提出的这个架构十分类似于另一个近年来应用十分火爆的神经网络架构 —— 生成对抗网络 (Generative Adversarial Nets)。也许很多读者并不清楚这是何方神圣,所以我们先来看一下它的几个应用: 智能换脸 AI 合成表情 新华社的 AI 合成主播 也就是说,我们平常在网上看到的一些看似不可思议的视频或动图,其实都是通过生成对抗网络合成出来的!而这个网络的魔力就在于,它拥有 生成器 (Generator)和 判别器 (Discriminator)两个不同的神经网络,其中生成器通过随机输入的数据来生成图像,判别器则负责鉴别生成器生成的图像是否达到标准,以此来达到训练的目的。 3. 神经网络背后的算法 注:本节要求读者有高等数学和线性代数基础,并对梯度下降法有一定了解 到这里,相信读者们已经对神经网络的应用有了一些大体的认识。我们经常听说一个神经网络需要接受“训练”,这个“训练”到底是怎么做到的呢? 答案就是 反向迭代算法 (Backpropagation)。读者不要被这个算法高大上的名字吓到了,它的核心只有两个—— 偏导数 和 链式法则 。反向迭代算法的目的在于 通过减小输出值与实际值的差异,来不断更新神经网络里的各种参数 。这便是“训练”一个神经网络的全部内容。 听上去训练一个 AI 比训练小孩子容易多了!然而实际上,训练神经网络最大的挑战就在于 更新模型中的大量参数 。一图以蔽之,神经网络隐藏层的每个神经元本质上都是这样运作的: 图八:神经网络算法总结 从上图中我们可以看到,神经元起到的作用无非就是把一系列输入数据转化为输出,只不过需要引入一系列未知参数——权重 w_{ij} 和 偏差 b_{j} 罢了(j 表示神经网络的第 j 层,i 表示第 j-1 层的第 i 个神经元)。而 如何更新这些未知参数,则是训练神经网络的核心所在 。下面的图表明了反向迭代算法和向前迭代算法的区别,以及为什么在训练神经网络(尤其是深层神经网络)的过程中必须用到反向迭代算法的原因: 图九:反向迭代vs向前迭代 在实际训练过程中,我们需要不断地更新权重 w_{ij} 和偏差 b_{j},这可以通过不断地最小化某个损失函数 L 来完成。根据实际问题,常用的损失函数有 均方差 (L2 损失)、DL 距离和 交叉熵 (Cross Entropy)等等。确定好损失函数后,我们使用 梯度下降法 分别对 w_{ij} 和 b_{j} 求偏导数,然后利用 链式法则 计算出每一步需要更新的步长,例如对于权重参数 w_{ij},更新方法如下: 图十:上角标 t 表示训练(迭代)次数 其中“学习效率”一般取值在 0 和 1 之间。就像小孩一样,如果学习效率太高,遇到不好的输入数据时就很容易学到坏东西,但如果学习效率太低,那么学习成本又会过高。因此选取适当的学习效率值,是训练一个好神经网络的关键。 图十一:学如江流徒杠,不可鹅行鸭步,亦不可操之过急 此外值得一提的是,从数学的观点看来,神经网络中 激活函数 (Activation Function)的非线性性是神经网络的一大特色。早期的激活函数选择受到了生物神经元的影响(可参考笔者之前的文章《 读懂你的大脑——漫话神经元 》),一般选择 Sigmoid 函数或双曲正切函数(tanh): 图十二:生物神经元模型中常用的两种激活函数 不过由于当输入比较大时,上面这两兄弟关于输入的导数接近于 0 (读者可自行验证),这在反向迭代过程中并不是个好消息 —— 图十中在 L 对 s_{i} 的偏导数几乎为 0,因而在迭代过程中权重 w_{ij} 几乎不变!这在十年之前一直是一个难题,不过 2011 年以后,上面这两兄弟便很快被一种叫做 线性整流 (ReLU,Retified Linear Unit)的激活函数所取代。这个函数长这样: 图十三:ReLU 函数 容易验证,只要 u 0, 那么 f'(u) = 1, 于是损失函数 L 对 s_{i} 的偏导数不会接近 0,更新参数困难的问题得以解决! 到此为止,神经网络算法的理论基础已经被搞定了。然而在实际操作中还有另外一个问题——计算时间。试想如果要训练一个非常深层的神经网络,势必需要更新大量未知参数(未知参数的个数随着网络层数呈指数上升),如果采用图十那样的每更新一个参数都需要把 N 个训练数据(输入数据的一种)都用进去,那么当训练数据很多的时候,计算复杂度将非常高!为了解决这个方法,人们通常采用一种叫做 随机梯度下降 (Stochastic Gradient Descent)的算法,来代替常规的梯度下降法: 图十四:梯度下降 vs 随机梯度下降。其中 L_k 表示只依赖于第 k 个训练数据的损失函数, k 从 N 个总训练数据中随机取出的一个 可以看到,相比常规的梯度下降法,每一步随机梯度下降的计算量小了很多。不过由于训练数据的随机性,这样带来的后果便是收敛速度变慢,训练所需的迭代次数增加了(t 的取值上界更高)。所以如今常用的迭代方法一般是经过两者综合的 微小块梯度下降法 (Mini Batch Gradient),或者收敛速度更快的的 自适应动量估计 (Adam, Adaptive Moment Estimation) 算法等等。限于文章篇幅,具体细节在此不做介绍,有兴趣的读者可以参考一篇不错的综述 。 4. 神经网络的局限性 到此为止,我们已经对深度学习和神经网络的历史、应用,以及背后的算法有了初步的认识。但话说回来,世间万物皆有破绽,那么神经网络还存在哪些局限性呢? 也许一些读者会思考这样的问题:如果神经网络真的这么厉害,历史也不算短了,为什么直到 21 世纪以后才开始普遍投入使用呢?其中主要原因其实是硬件层面的,因为进入 21 世纪,电子硬件的成熟,尤其是通用性 GPU 的广泛使用才得以胜任深层神经网络的训练任务。换言之,神经网络和深度学习的火爆在 很大程度上依赖于芯片技术的不断更新换代 。关于 GPU 计算的更多内容,可参考笔者之前的文章《 让 GPU 也参加到计算中来 》。 CPU 和 GPU 计算力(以浮点数计算效率为测度)对比。图片来自网络 既然有了如此强大硬件的支持,如果没有足够的训练数据集的话,神经网络也并不见得比传统方法高效多少了。这是因为神经网络的一大主要特色就是,其未知参数数量可以非常多,因此在理论上可以逼近出任何函数。但这样做的代价就是需要有足够的训练和测试数据集(测试数据集用于测试训练出来的神经网络表现如何)。 另一方面,如果模型参数太多,很容易出现 过度拟合 (overfitting)的情况,反而降低模型的准确率。为了解决过度拟合,人们会采用许多不同的 正则化 (regularization)技巧,例如 随机失活 (Dropout)、加入惩罚项、自助式聚合(Bagging, Bootstrap Aggragation)等方法来达到减少参数个数的目的。限于篇幅,这里不做进一步介绍了。 神经网络的另一大特色就是架构非常灵活——如引言中所述,卷积神经网络(CNN)、长短记忆(LSTM)、玻尔兹曼机等等都是很常用的神经网络,而且每种神经网络都有大量 超参数 (Hyperparameter,例如神经网络的深度、宽度、学习效率、激活函数等等)供选择,没有一个可靠的数学定理保证应该如何选取超参数以及神经网络种类。 做为数学系出身的笔者对此表示遗憾。限于学识水平,笔者所知道的关于神经网络的数学定理都不算十分本质,例如 万有近似定理 (Universal Approximation Theorem),用本科的泛函分析工具(哈恩-巴拿赫定理 + 里兹表示定理)证明了任一连续有界的 n 维实函数可被一个至少一层的神经网络任意逼近,且该定理对不同的激活函数(Sigmoid 和 ReLU)又有不同的证明方法,尽管证明过程都非常漂亮。这个定理不算十分本质的原因在于,其他许多非神经网络系统,例如 模糊系统 (Fuzzy System),也有类似的万有近似定理。 万有近似定理的核心就是证明上面这个函数的值域在 R^N 上是稠密的 从数学上看来,还有一些其他有趣结论和神经网络有关。例如 2016 年有人严格地证明了在模型复杂度的意义下,深层的神经网络比浅层的更为高效 。不过从证明过程中可以看出,这个定理只是在渐进意义(单层神经元数目趋向于无穷)下有效,对实际应用的指导依然非常有限。笔者十分希望以后有机会能看到一个能真正具有广泛指导意义的数学定理。 5. 笔者点评 我们不难看出,深度学习虽然在很大程度上改变了我们的生活,但它依然存在不少软肋。天下没有免费的午餐,深度学习之所以有今天的火爆,很大程度上依赖于芯片技术的发展(计算力的提升),而芯片生产是一个很长的产业链,有设计、设备、材料和测封等过程,涉及到大量基础学科。因此笔者认为, 基础学科才是科技发展的重中之重,而并非盲目地追求人工智能、深度学习这些热门词汇 。 另一方面,深度学习虽然火爆至今,但这种火热能持续多久,笔者持以保留态度。其一,深度学习的理论基础,神经网络,在上世纪 90 年代就已经被研究透测,而据笔者所知,该领域至今并未出现一个如同广义相对论(可参考笔者和小伙伴合作的文章《 广义相对论 是如何被一步步构思出来的?》)或规范场论(可参考笔者和小伙伴合作的文章《 带你认识高大上的规范场 》)那样具有框架性的数学理论;其二,深度学习只是众多机器学习方法的其中一种,每种机器学习方法都有自己的优缺点,并不存在一种万能的方法。因此,笔者建议打算入行深度学习的朋友们, 要先打好微积分、线性代数、概率论与数理统计、离散数学、最优化算法和数据挖掘这些课程的基础 ,毕竟也许几年以后,便会有一种全然不同的机器学习方法凌驾于深度学习之上。 参考文献: McCulloch WS, Pitts W. A logical calculus of the ideas immanent in nervous activity. The bulletin of mathematical biophysics. 1943 Dec 1;5(4):115-33. https://www. nobelprize.org/prizes/m edicine/1981/hubel/biographical/ Ackley DH, Hinton GE, Sejnowski TJ. A learning algorithm for Boltzmann machines. Cognitive science. 1985 Jan 1;9(1):147-69. LeCun Y, Boser B, Denker JS, Henderson D, Howard RE, Hubbard W, Jackel LD. Backpropagation applied to handwritten zip code recognition. Neural computation. 1989 Dec;1(4):541-51. Hochreiter S, Schmidhuber J. Long short-term memory. Neural computation. 1997 Nov 15;9(8):1735-80. Krizhevsky A, Sutskever I, Hinton GE. Imagenet classification with deep convolutional neural networks. InAdvances in neural information processing systems 2012 (pp. 1097-1105). Mikolov T, Chen K, Corrado G, Dean J. Efficient estimation of word representations in vector space. arXiv preprint arXiv:1301.3781. 2013 Jan 16. Bojarski M, Del Testa D, Dworakowski D, Firner B, Flepp B, Goyal P, Jackel LD, Monfort M, Muller U, Zhang J, Zhang X. End to end learning for self-driving cars. arXiv preprint arXiv:1604.07316. 2016 Apr 25. Goodfellow I, Pouget-Abadie J, Mirza M, Xu B, Warde-Farley D, Ozair S, Courville A, Bengio Y. Generative adversarial nets. In Advances in neural information processing systems 2014 (pp. 2672-2680). Ruder S. An overview of gradient descent optimization algorithms. arXiv preprint arXiv:1609.04747. 2016 Sep 15. Cybenko G. Approximation by superpositions of a sigmoidal function. Mathematics of control, signals and systems. 1989 Dec 1;2(4):303-14. Eldan R, Shamir O. The power of depth for feedforward neural networks. In Conference on learning theory 2016 Jun 6 (pp. 907-940). 欢迎大家关注我的公众号“科普最前线”(id:kpzqxyxg),对话前沿科学!每篇文章都由笔者亲自完成或修改,希望和大家一起交流!
981 次阅读|2 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-19 01:42

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部