《人工智能产品经理的新起点》PPT

原作者:黄钊;PPT 目录大纲:

  1. AI PM 在做什么、如何做?
    AI 的时代背景及真正瓶颈
    如何选行业方向 in AI
    如何找场景痛点 in AI 应用层 (2B/2C)
    如何做体验设计 in 对话聊天产品
  2. 如何从互联网 PM 转型成 AI PM
    AI PM 能力模型
    AI 技术概念厘清
    如何转型
  3. 人工智能的本质及脑洞 AI 的过去和现在
    AI 的未来和突破口
    AI 的本质、效用和终局
  • 下载地址 1:https://pan.baidu.com/s/1mjM5PQo 密码: gxmw
  • 下载地址 2:https://pan.baidu.com/s/1brbHw7d 密码: 9t5a

本地下载:人工智能产品经理的新起点

TensorFlow 2.0 实战教程

这是一份来自 IJCAI 2019上的一个 TensorFlow 2.0 实操教程,这个教程包含 117 页 PPT,由 Google 资深开发人员 Josh Gordon 讲授,提供了最新 TensorFlow 2.0 的实操介绍,重点介绍了最佳实践。读者将学习编写几种类型的神经网络(Dense, Convolutional, 和 Recurrent),以及生成对抗网络(Generative Adversarial Network)。

Hands on TensorFlow 2.0
Hands on TensorFlow 2.0

TensorFlow 是一个基于数据流编程(Dataflow Programming)的符号数学系统,被广泛应用于各类机器学习(Machine Learning)算法的编程实现,其前身是谷歌的神经网络算法库 DistBelief。

Tensorflow 拥有多层级结构,可部署于各类服务器、PC 终端和网页并支持 GPU 和 TPU 高性能数值计算,被广泛应用于谷歌内部的产品开发和各领域的科学研究。

如果你想学习新发布的 TensorFlow 2.0 版本,那么本教程非常适合您。不过您需要事先熟悉一些基本的机器学习知识。该教程将介绍深度学习中的关键概念。本教程的目标是帮助您高效地开始使用 TensorFlow,这样您就可以继续自学了。

《Hands on TensorFlow 2.0》教程下载

《动手学深度学习》PyTorch 版

我们知道,作为 MXNet 的作者之一,李沐的这本《动手学深度学习》也是使用 MXNet 框架写成的。但是很多入坑机器学习的萌新们,使用的却是 PyTorch。如果有教材对应的 PyTorch 实现代码就更好了!今天就给大家带来这本书的 PyTorch 实现源码。最近,来自印度理工学院的数据科学小组,把《动手学深度学习》从 MXNet 『翻译』成了 PyTorch,经过 3 个月的努力,这个项目已经基本完成,并登上了 GitHub 热榜。

d2l-pytorch
d2l-pytorch

其中,每一小节都是可以运行的 Jupyter 记事本,你可以自由修改代码和超参数来获取及时反馈,从而积累深度学习的实战经验。

GitHub地址项目 GitHub 地址

滴滴开源的 AoE:工程实践中的图像处理

近期,滴滴开源了 AOE 项目,很多人还是一脸懵逼,不太清楚 AOE 到底是干什么的,所以今天我们再来听听官方工程师是怎么介绍的吧,不信你还是听不懂:近期我们开发了一个银行卡 OCR 项目。需求是用手机对着银行卡拍摄以后,通过推理,可以识别出卡片上的卡号。

工程开发过程中,我们发现手机拍摄以后的图像,并不能满足模型的输入要求。以 Android 为例,从摄像头获取到的预览图像是带 90 度旋转的 NV21 格式的图片,而我们的模型要求的输入,只需要卡片区域这一块的图像,并且需要转成固定尺寸的 BGR 格式。所以在图像输入到模型之前,我们需要对采集到的图像做图像处理,如下图所示:

OCR 案例
OCR 案例

在开发的过程中,我们对 YUV 图像格式和 libyuv 进行了研究,也积累了一些经验。下文我们结合银行卡 OCR 项目,讲一讲里面涉及到的一些基础知识:

  1. 什么是YUV格式
  2. 如何对YUV图像进行裁剪
  3. 如何对YUV图像进行旋转
  4. 图像处理中的Stride
  5. 如何进行缩放和格式转换
  6. libyuv的使用

想要对采集到的 YUV 格式的图像进行处理,首先我们需要了解什么是 YUV 格式。

什么是 YUV 格式

YUV 是一种颜色编码方法,YUV,分为三个分量:

  • 『Y』 表示明亮度(Luminance 或 Luma),也就是灰度值;
  • 『U』和『V』 表示的则是色度(Chrominance 或 Chroma)。
  • 主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。

这部分专业的知识,网络上有详细的解释。我们简单理解一下,RGB 和 YUV 都使用三个值来描述一个像素点,只是这三个值的意义不同。通过固定的公式,我们可以对 RGB 和 YUV 进行相互转换。工程里常见的 I420,NV21,NV12,都是属于 YUV420,每四个 Y 共用一组 UV 分量。YUV420 主要包含两种格式,YUV420SP 和 YUV420P。

  • YUV420SP,先排列Y分量,UV分量交替排列,例如:NV12: YYYYYYYY UVUV 和 NV21: YYYYYYYY VUVU (上文中我们在安卓上采集到的图像就是这种格式)。

    YUV420SP
    YUV420SP
  • YUV420P,先排列U(或者V)分量,再排列V(或者U)分量。例如:I420: YYYYYYYY UU VV 和 YV12: YYYYYYYY VV UU。

    YUV420P
    YUV420P

了解了 YUV 的图像格式以后,我们就可以尝试对图片进行裁剪和旋转了。我们的想法是先在图片上裁剪出银行卡的区域,再进行一次旋转。

对图片进行裁剪和旋转
对图片进行裁剪和旋转

如何对 YUV 图像进行裁剪

YUV420SP 和 YUV420P 裁剪的过程类似,以 YUV420SP 为例,我们要裁剪图中的这块区域:

YUV420SP
YUV420SP

在图上看起来就非常明显了,只要找到裁剪区域对应的 Y 分量和 UV 分量,按行拷贝到目标空间里就可以了。

我们再来看一张图,是否可以用上面的方法来裁剪图中的这块区域呢?

答案是否定的,如果你按照上面说的方法来操作,最后你会发现你保存出来的图,颜色基本是不对的,甚至会有内存错误。原因很简单,仔细观察一下,当 ClipLeft 或者 ClipTop 是奇数的时候,会导致拷贝的时候 UV 分量错乱。如果把错误的图像数据输入到模型里面,肯定是得不到我们期望的结果的。所以我们在做裁剪的时候,需要规避掉奇数的场景,否则你会遇到意想不到的结果。

如何对 YUV 图像进行旋转?

对上文裁剪后的图像做顺时针 90 度旋转,相比裁剪,转换要稍微复杂一些。

基本方法是一样的,拷贝对应的 Y 分量和 UV 分量到目标空间里。

在了解了裁剪和旋转的方法以后,我们发现在学习的过程中不可避免地遇到了 Stride 这个词。那它在图像中的作用是什么呢?

图像处理中的 Stride

Stride 是非常重要的一个概念,Stride 指在内存中每行像素所占的空间,它是一个大于等于图像宽度的内存对齐的长度。如下图所示:

Stride 是非常重要的一个概念
Stride 是非常重要的一个概念

回过头来看我们上面说到的裁剪和旋转,是否有什么问题?以 Android 上的 YV12 为例,Google Doc 里是这样描述的:

YV12 is a 4:2:0 YCrCb planar format comprised of a WxH Y plane followed by (W/2) x (H/2) Cr and Cb planes.

This format assumes
• an even width
• an even height
• a horizontal stride multiple of 16 pixels
• a vertical stride equal to the height

y_size = stride * height
c_stride = ALIGN(stride / 2, 16)
c_size = c_stride * height / 2
size = y_size + c_size * 2
cr_offset = y_size
cb_offize = y_size + c_size

所以在不同的平台和设备上,需要按照文档和 stride 来进行计算。例如计算 Buffer 的大小,很多文章都是简单的 “*3/2” ,仔细考虑一下,这其实是有问题的。如果不考虑 stride ,会有带来什么后果?如果 “运气” 足够好,一切看起来很正常。“运气”不够好,你会发现很多奇怪的问题,例如花屏,绿条纹,内存错误等等。这和我们平常工作中遇到的很多的奇怪问题一样,实际上背后都是有深层次的原因的。

经过裁剪和旋转,我们只需要把图像缩放成模型需要的尺寸,转成模型需要的 BGR 格式就可以了。

如何进行缩放和格式转换

以缩放为例,有临近插值,线性插值,立方插值,兰索斯插值等算法。YUV 和 RGB 之间的转换,转换的公式也有很多种,例如量化和非量化。这些涉及到专业的知识,需要大量的时间去学习和理解。

这么多的转换,我们是否都要自己去实现?

很多优秀的开源项目已经提供了完善的 API 给我们调用,例如 OpenCV,libyuv 等。我们需要做的是理解基本的原理,站在别人的肩膀上,做到心里有数,这样即使遇到问题,也能很快地定位解决。

经过调查和比较,我们选择了 libyuv 来做图像处理的库。libyuv 是 Google 开源的实现各种 YUV 与 RGB 之间相互转换、旋转、缩放的库。它是跨平台的,可在 Windows、Linux、Mac、Android 等操作系统,x86、x64、arm 架构上进行编译运行,支持 SSE、AVX、NEON等SIMD 指令加速。

libyuv 的使用

引入 libyuv 以后,我们只需要调用 libyuv 提供的相关 API 就可以了。在银行卡 OCR 工程使用的过程中,我们主要遇到了 2 个问题:

  1. 在Android开发的初期,我们发现识别率和我们的期望存在一定的差距。我们怀疑是模型的输入数据有问题,通过排查发现是使用libyuv的时候,没注意到它是little endian。例如这个方法:int BGRAToARGB(…),BGRA little endian,在内存里顺序实际是ARGB。所以在使用的时候需要弄清楚你的数据在内存里是什么顺序的,修改这个问题后识别率达到了我们的预期。
  2. 在大部分机型上运行正常,但在部分机型上出现了 Native 层的内存异常。

通过多次定位,最后发现是 stride 和 buffersize 的计算错误引起的。由于 libyuv 是 C/C++ 实现的,使用的时候不是那么的便捷。为了提高开发效率,我们提取了一个 AoeVision 组件,对libyuv封装了一层 JNI 接口,包括了一些基础的转换和一些 Sample,这样使用起来更加简单方便,AoeVision组件还在不断开发和完善中。

GitHub地址项目 GitHub 地址

联合国教科文组织正式发布《北京共识 – 人工智能与教育》

近日,联合国教科文组织正式发布国际人工智能与教育大会成果文件《北京共识 – 人工智能与教育》。这是联合国教科文组织首个为利用人工智能技术实现 2030 年教育议程提供指导和建议的重要文件。

2019 年 5 月,中国政府与联合国教科文组织合作在北京举办国际人工智能与教育大会。会议以『规划人工智能时代的教育:引领与跨越』为主题。国家主席习近平为大会致贺信。国务院副总理孙春兰出席会议并致辞。来自全球 100 多个国家、10 余个国际组织的约 500 位代表共同探讨智能时代教育发展大计,审议并通过成果文件《北京共识》,形成了国际社会对智能时代教育发展的共同愿景。

《北京共识》以联合国6种官方语言发布,共 44 条,从智能时代的教育政策规划、教育管理和供给、教学教师、学习评价、价值观和技能、全民终身学习、公平包容的应用、性别平等、伦理、监测评估和研究以及筹资和国际合作等方面,分别对教科文组织会员国政府和利益攸关方、国际组织及合作伙伴、教科文组织总干事提出建议。

《北京共识》提出,各国要引领实施适当的政策应对策略,通过人工智能与教育的系统融合,全面创新教育、教学和学习方式,并利用人工智能加快建设开放灵活的教育体系,确保全民享有公平、适合每个人且优质的终身学习机会,从而推动可持续发展目标和人类命运共同体的实现。

《北京共识》强调,要采用人工智能平台和基于数据的学习分析等关键技术构建可支持人人皆学、处处能学、时时可学的综合型终身学习体系。要确保人工智能促进全民优质教育和学习机会,无论性别、残疾状况、社会和经济条件、民族或文化背景以及地理位置如何。

《北京共识》倡议,要支持对与新兴人工智能发展影响相关的前沿问题进行前瞻性研究,推动探索利用人工智能促进教育创新的有效战略和实践模式,以期构建一个在人工智能与教育问题上持有共同愿景的国际社会。

序言

1. 我们 —— 国际人工智能与教育大会与会者,包括 50 名政府部长和副部长、来自 100 多个会员国以及联合国机构、学术机构、民间社会和私营部门的约 500 名代表,于 2019 年 5 月 16 –18 日齐聚中国北京。我们衷心感谢联合国教育、科学及文化组织和中华人民共和国政府合作举办此次大会,以及北京市政府的热情欢迎和盛情款待。

2. 我们重申了《2030 年可持续发展议程》中的承诺,特别是可持续发展目标 4 及其各项具体目标,并讨论了教育和培训系统在实现可持续 发展目标 4 时所面临的挑战。我们致力于引领实施适当的政策应对策略,通过人工智能与教育的系统融合,全面创新教育、教学和学习方式,并利用人工智能加快建设开放灵活的教育体系,确保全民享有公平、适合每个人且优质的终身学习机会,从而推动可持续发展目标和人类命运共同体的实现。

3. 我们回顾 2015 年通过的关于利用信息通信技术(信通技术)实现可持续发展目标 4 的《青岛宣言》,其中指出必须利用新兴技术强化教育体系、拓展全民教育机会、提高学习质量和效果以及强化公平和更高效的教育服务供给;当我步入人工智能广泛应用的时代时,我们认识到重申并更新这一承诺的迫切需要。

4. 我们研究了人工智能演变的最新趋势及其对人类社会、经济和劳动力市场以及教育和终身学习体系的深远影响。我们审视了人工智能对于未来工作和技能养的潜在影响,并探讨了其在重塑教育、教学和学习的核心基础方面的潜力。

5. 我们认识到人工智能领域的复杂性和迅猛发展速度、对人工智能的多元化理解、宽泛的外延和各种差异较大的定义、以及在不同场景中的多样化应用及其引发的伦理挑战。

6. 我们还认识到人类智能的独特性。忆及《世界人权宣言》中确立的原则,我们重申联合国教科文组织在人工智能使用方面的人文主义取向,以期保护人权并确保所有人具备在生活、学习和工作中进行有效人机合作以及可持续发展所需的相应价值观和技能。

7. 我们还申明,人工智能的开发应当为人所控、以人为本;人工智能的部署应当服务于人并以增强人的能力为目的;人工智能的设计应合乎伦理、避免歧视、公平、透明和可审核;应在整个价值链全过程中监测并评估人工智能对人和社会的影响。

我们建议,联合国教科文组织会员国政府及其他利益攸关方根据其法律、公共政策和公共惯例,考虑实施以下行动,应对人工智能带来的相关教育机遇和挑战:

规划教育人工智能政策

8. 认识到人工智能的多学科特性及其影响;确保教育人工智能与公共政策特别是教育政策有机配合;采取政府全体参与、跨部门整合和多方协作的方法规划和治理教育人工智能政策;根据本地在实现可持续发展目标 4 及其具体目标以及其他可持续发展目标的工作中遇到的挑战,确定政策的战略优先领域。从终身学习的角度规划并制定与教育政策接轨和有机协调的全系统教育人工智能战略。

9. 意识到推行教育人工智能政策和工程的巨大投资需求。审慎权衡不同教育政策重点之间的优先级,确定不同的筹资渠道,包括国家经费(公共和私人)、国际资金和创新性的筹资机制。还要考虑到人工智能在合并和分析多个数据来源从而提高决策效率方面的潜力。

人工智能促进教育的管理和供给

10. 意识到应用数据变革基于实证的政策规划方面的突破。考虑整合或开发合适的人工智能技术和工具对教育管理信息系统(EMIS)进行升级换代,以加强数据收集和处理,使教育的管理和供给更加公平、包容、开放和个性化。

11. 还考虑在不同学习机构和学习场境中引入能够通过运用人工智能实现的新的教育和培训供给模式,以便服务于学生、教职人员、家长和社区等不同行为者。

人工智能赋能教学和教师

12. 注意到虽然人工智能为支持教师履行教育和教学职责提供了机会,但教师和学生之间的人际互动和协作应确保作为教育的核心。意识到教师无法被机器取代,应确保他们的权利和工作条件受到保护。

13. 在教师政策框架内动态地审视并界定教师的角色及其所需能力,强化教师培训机构并制定适当的能力建设方案,支持教师为在富含人工智能的教育环境中有效工作做好准备。

人工智能促进学习和学习评价

14. 认识到人工智能在支持学习和学习评价潜能方面的发展趋势,评估并调整课程,以促进人工智能与学习方式变革的深度融合。在使用人工智能的惠益明显大于其风险的领域,考虑应用现有的人工智能工具或开发创新性人工智能解决方案,辅助不同学科领域中明确界定的学习任务,并为开发跨学科技能和能力所需的人工智能工具提供支持。

15. 支持采用全校模式围绕利用人工智能促进教学和学习创新开展试点测试,从成功案例中汲取经验并推广有证据支持的实践模式。

16. 应用或开发人工智能工具以支持动态适应性学习过程;发掘数据潜能,支持学生综合能力的多维度评价;支持大规模远程评价。

培养人工智能时代生活和工作所需的价值观和技能

17. 注意到采用人工智能所致的劳动力市场的系统性和长期性变革,包括性别平等方面的动态。更新并开发有效机制和工具,以预测并确认当前和未来人工智能发展所引发的相关技能需求,以便确保课程与不断变化的经济、劳动力市场和社会相适应。将人工智能相关技能纳入中小学学校课程和职业技术教育与培训(TVET)以及高等教育的资历认证体系中,同时考虑到伦理层面以及相互关联的人文学科。

18. 认识到进行有效的人机协作需要具备一系列人工智能素养,同时不能忽视对识字和算术等基本技能的需求。采取体制化的行动,提高社会各个层面所需的本人工智能素养。

19. 制定中长期规划并采取紧急行动,支持高等教育及研究机构开发或加强课程和研究项目,培养本地人工智能高端人才,以期建立一个具备人工智能系统设计、编程和开发的大型本地人工智能专业人才库。

人工智能服务于提供全民终身学习机会

20. 重申终身学习是实现可持续发展目标4的指导方针,其中包括正规、非正规和非正式学习。采用人工智能平台和基于数据的学习分析等关键技术构建可支持人人皆学、处处能学、时时可学的综合型终身学习体系,同时尊重学习者的能动性。开发人工智能在促进灵活的终身学习途径以及学习结果累积、承认、认证和转移方面的潜力。

21. 意识到需要在政策层面对老年人尤其是老年妇女的需求给予适当关注,并使他们具备人工智能时代生活所需的价值观和技能,以便为数字化生活消除障碍。规划并实施有充足经费支持的项目,使较年长的劳动者具备技能和选择,能够随自己所愿保持在经济上的从业身份并融入社会。

促进教育人工智能应用的公平与包容

22. 重申确保教育领域的包容与公平以及通过教育实现包容与公平,并为所有人提供终身学习机会,是实现可持续发展目标 4 — 2030 年教育的基石。重申教育人工智能方面的技术突破应被视为改善最弱势群体受教育机会的一个契机。

23. 确保人工智能促进全民优质教育和学习机会,无论性别、残疾状况、社会和经济条件、民族或文化背景以及地理位置如何。教育人工智能的开发和使用不应加深数字鸿沟,也不能对任何少数群体或弱势群体表现出偏见。

24. 确保教学和学习中的人工智能工具能够有效包容有学习障碍或残疾的学生,以及使用非母语学习的学生。

性别公平的人工智能和应用人工智能促进性别平等

25. 强调数字技能方面的性别差距是人工智能专业人员中女性占比低的原因之一,且进一步加剧了已有的性别不平等现象。

26. 申明我们致力于在教育领域开发不带性别偏见的人工智能应用程序,并确保人工智能开发所使用的数据具有性别敏感性。同时,人工智能应用程序应有利于推动性别平等。

27. 在人工智能工具的开发中促进性别平等,通过提升女童和妇女的人工智能技能增强她们的权能,在人工智能劳动力市场和雇主中推动性别平等。

确保教育数据和算法使用合乎伦理、透明且可审核

28. 认识到人工智能应用程序可能带有不同类型的偏见,这些偏见是训练人工智能技术所使用和输入的数据自身所携带的以及流程和算法的构建和使用方式中所固有的。认识到在数据开放获取和数据隐私保护之间的两难困境。注意到与数据所有权、数据隐私和服务于公共利益的 数据可用性相关的法律问题和伦理风险。注意到采纳合乎伦理、注重隐私和通过设计确保安全等原则的重要性。

29. 测试并采用新兴人工智能技术和工具,确保教师和学习者的数据隐私保护和数据安全。支持对人工智能领域深层次伦理问题进行稳妥、长期的研究,确保善用人工智能,防止其有害应用。制定全面的数据保 护法规以及监管框架,保证对学习者的数据进行合乎伦理、非歧视、公平、透明和可审核的使用和重用。

30. 调整现有的监管框架或采用新的监管框架,以确保负责任地开发和使用用于教育和学习的人工智能工具。推动关于人工智能伦理、数据隐私和安全相关问题,以及人工智能对人权和性别平等负面影响等问题的研究。

监测、评估和研究

31. 注意到缺乏有关人工智能应用于教育所产生影响的系统性研究。支持就人工智能对学习实践、学习成果以及对新学习形式的出现和验证产生的影响开展研究、创新和分析。采取跨学科办法研究教育领域的人工智能应用。鼓励跨国比较研究及合作。

32. 考虑开发监测和评估机制,衡量人工智能对教育、教学和学习产生的影响,以便为决策提供可靠和坚实的证据基础。

我们建议活跃在这一领域的国际组织和伙伴考虑实施下列行动:

筹资、伙伴关系和国际合作

33. 基于各国自愿提交的数据,监测并评估各国之间人工智能鸿沟和人工智能发展不平衡现象,并且注意到能够获取使用和开发人工智能和无法使用人工智能的国家之间两极分化的风险。重申解决这些忧虑的重要性,并特别优先考虑非洲、最不发达国家、小岛屿发展中国家以及受冲突和灾害影响的国家。

34. 在『2030 年教育』的全球和地区架构范围内,协调集体行动,通过分享人工智能技术、能力建设方案和资源等途径,促进教育人工智能的公平使用,同时对人权和性别平等给予应有的尊重。

35. 支持对与新兴人工智能发展影响相关的前沿问题进行前瞻性研究,推动探索利用人工智能促进教育创新的有效战略和实践模式,以期构建一个在人工智能与教育问题上持有共同愿景的国际社会。

36. 确保国际合作有机配合各国在教育人工智能开发和使用以及跨部门合作方面的需求,以便加强人工智能专业人员在人工智能技术开发方面的自主性。加强信息共享和有良好前景应用模式的交流,以及各国之间的协调和互补协作。

37. 通过联合国教科文组织移动学习周等方式并借助其他联合国机构,为各国之间交流有关教育人工智能领域的监管框架、规范文本和监管方式提供适当的平台,从而支持在发掘人工智能潜力促进可持续发展目标4方面开展南南合作和北南南合作,并从中受益。

38. 建立多利益攸关方伙伴关系并筹集资源,以便缩小人工智能鸿沟,增加对教育人工智能领域的投资。

我们请联合国教科文组织总干事努力实施下列行动:

39. 建立一个『人工智能服务于教育』的平台,作为开源人工智能课程、人工智能工具、教育人工智能政策实例、监管框架和最佳做法的信息交流中心,以期推动利用人工智能促进可持续发展目标4,支持就教育和学习的未来开展辩论,并使开源人工智能资源和课程向所有人开放。

40. 在与会员国开展咨询的基础上制定教育人工智能指导纲要并开发资源,以支持会员国制定促进教育领域有效和公平应用人工智能的政策和战略。支持对教育政策制定者的相关能力建设。

41. 通过强化相关部门及处室并动员联合国教科文组织的机构和网络,加强联合国教科文组织在教育人工智能领域的引领作用。

42. 支持将人工智能技能纳入教师信通技术能力框架,支持各国就教职人员如何在富含人工智能的教育环境下工作开展培训。

43. 在教育人工智能方面,进一步扩大联合国教科文组织与相关联合国机构和多边合作伙伴、地区开发银行和组织以及私营部门的合作。

44. 此次大会之后,采取适当的地区和国际性后续行动,与活跃在这一领域的发展伙伴合作,巩固并扩大本共识的影响。

知识图谱教程:从海量文本中挖掘和构建异构信息网络

第 25 届 ACM SIGKDD 知识发现与数据挖掘大会于  2019 年 8 月 4 日- 8 日在美国阿拉斯加州安克雷奇市举行。一年一度的 KDD 大会是最重要的跨学科会议,汇聚了数据科学、数据挖掘、知识发现、大规模数据分析和大数据等领域的研究人员和实践者。

今天整理了关于数据挖掘方面的内容:从文本中构建和挖掘异构信息网络,本文提供了一个全面的综述,总结了在这个方向最近的研究和发展。

第 25 届 ACM SIGKDD

摘要:

现实世界中的数据主要以非结构化文本的形式存在。数据挖掘研究的一个重大挑战是开发有效的、可伸缩的方法,将非结构化文本转换为结构化知识。基于我们的愿景,将这些文本转换为结构化的异构信息网络是非常有益的,可以根据用户的需求生成可操作的知识。

在本教程中,我们将全面概述这方面的最新研究和发展。首先,我们介绍了一系列从大规模、领域特定的文本语料库构建异构信息网络的有效方法。然后,我们讨论了基于用户需求挖掘这种文本丰富网络的方法。具体来说,我们关注的是可伸缩的、有效的、弱监督的、与语言无关的方法,这些方法可以处理各种文本。我们还将在实际数据集(包括新闻文章、科学出版物和产品评论)上进一步演示如何构建信息网络,以及如何帮助进一步的探索性分析。大纲:

一 .介绍

1. 动机:为什么要从大量文本中构建和挖掘异构信息网络?
2. 大量文本网络构建的综述
3. 关于构建网络应用探索的综述

二. 短语挖掘

1. 为什么短语挖掘以及如何定义高质量的短语?
2. 监督方法
2.1. 名词短语分块方法
2.2. 基于解析的方法
2.3. 如何在语料库级别对实体进行排序?

3. 无监督方法
3.1. 基于原始频率的方法
3.2. 基于协调的方法
3.3. 基于主题模型的方法
3.4. 对比方法

4. 弱/远程监督方法
4.1. 短语分词及其变体
4.2. 如何利用远程监督?

5. 系统演示和软件介绍
5.1. 一种多语言短语挖掘系统,它将 AutoPhrase,SegPhrase 和 TopMine 集成在一起,支持多种语言的短语挖掘(例如,英语,西班牙语,中文,阿拉伯语和日语)。

三. 信息抽取:实体,属性和关系

1. 什么是命名实体识别(NER)?

2. 传统的监督方法
2.1. CorNLL03 共享任务
2.2. 序列标注框架
2.3. 条件随机场
2.4 手工制作的特征

3. 现代端到端神经模型
3.1. 双向 LSTM 模型
3.2. 语言模型和语境化表示
3.3. Raw-to-end 模型

4. 远程监督的模型
4.1. 实体输入的数据编程
4.2. 学习特定领域的词典

5. 基于元模式的信息提取
5.1. 元模式挖掘
5.2. 元模式增强的 NER

6. 系统演示和软件
6.1 命名实体识别推理 Python 包:LightNER 。该模块可帮助用户以高效便捷的方式轻松地将预训练的NER 模型应用于他们自己的语料库。

四. 分类构建

1. 分类学基础
1.1. 分类法定义
1.2. 分类应用
1.3. 分类构建方法

2. 基于实例的分类构建
2.1. 使用的方法综述
2.2. 基于模式的方法
2.3. 监督方法
2.4. 弱监督方法

3. 基于聚类的分类构建
3.1. 分层主题建模
3.2. 一般图模型方法
3.3. 分层聚类

五. 挖掘异构信息网络(结构化分析)

1. 基本分析系统演示
1.1.  AutoNet 系统:它从 PubMed 论文(标题和摘要)构建了一个巨大的结构化网络,并支持在线构建(新文档)和智能探索(搜索)。

2. 概要
2.1. 基于图的总结
2.2. 聚类和排序的总结

3. 元路径引导探索
3.1. 基于元路径的相似性
3.2. 元路径引导节点嵌入

4. 链接预测
4.1. 任务引导节点嵌入
4.2. 构建网络中的链接增强

六. 总结和未来的方向

1. 摘要
1.1. 原理与技术
1.2. 优势和局限

2. 挑战和未来的研究方向

3. 与观众的互动
3.1 如何根据您的文本数据和应用需求构建和挖掘异构信息网络?

原文链接:https://shangjingbo1226.github.io/2019-04-22-kdd-tutorial/

如何阅读一份深度学习项目代码?

搞深度学习的人,两大必备日常除了读论文之外就是读代码。读论文笔者在第 4 问的时候讲了阅读路线,但如何读用什么技巧读每个人都有不同的见解,这里不多说。读代码跟读论文、读书多少有相似的地方,毕竟都是读的性质。但话又说回来,读代码又跟读 paper 读书大有不同,代码是一种将论文中的模型和算法进行实现的过程,是一种需要你思维时刻在线的过程。又因为我们读的是深度学习项目代码,不是像 Linux 内核代码那样的鸿篇巨制,所以在代码性质上多少又有些不同。

笔者这里说的一份深度学习项目代码,小到几百行的测试 demo ,大到成千万行的开源项目,读起来方法肯定各有不同。如下图 Mask R-CNN 项目代码和 PyTorch 源码的对比:

Mask R-CNN
Mask R-CNN
PyTorch
PyTorch

可以看到,Mask R-CNN 作为一个经典的实例分割框架,其代码量可以说是中规中矩,3k 的代码量在我们读完论文后集中花几天时间差不多可以过一遍。但 PyTorch 的源码对大多数人而言就不那么友善了,750k 的代码量,而且底层的 C++代码占到整个项目中的一半之多,作为深度学习研究而言,堪称巨无霸级别了。这样的代码量,就像初学者拿到一本 PRML ,往往投入巨大精力后不了了之。所以,对于这两种类型的项目代码,阅读方法肯定会有所区别。

因为我们读代码的目的、场景和对象不尽相同,下面笔者从三个方面来和大家探讨如何阅读一份深度学习项目代码。

首先读代码的一些通用方法。这一点而言不局限于深度学习项目代码,任何项目、任何语言的代码阅读都适用。我们日常读代码无非是两个工具,一是将代码下载到本地,打开 IDLE ,在 IDLE 里安静的阅读:

IDLE
IDLE

第二个就是直接在 GitHub 的 web 端直接阅读,但 GitHub 没有像编辑器那样在左侧设置阅读目录,每次进入一个代码文件就必须退出来才能进入另一个文件,用户体验极差。当然了,这都不是事。chrome 给我们提供了 Octotree 这样的辅助阅读插件,直接在 chrome 扩展程序里搜索安装即可。

Octotree
Octotree

安装后我们就可以直接在 web 端就有 IDLE 读代码的体验:

IDLE读代码的体验
IDLE读代码的体验

可以看到在页面左侧有一个类似 IDLE 的目录栏,大大方便了我们查看和阅读项目代码。这是通用方法中的工具层面,我们再来看一些基本的阅读规矩。有了 IDLE 和 Octotree 工具,我们第一点一定是仔细看代码目录,对整个项目代码结构和分布有一个整体的认识,对于深度学习而言通常目录中各个模块相对比较固定,比如是 models 目录下放着模型搭建和训练的代码,conifg 目录下放着模型的一些配置文件,data   目录下放着项目所使用的数据信息等等。如下面语义分割项目的目录结构:

IDLE的目录栏
IDLE的目录栏

对深度学习项目代码的结构熟络之后,读的多了自然就会轻车熟路起来,后面阅读效率也就提高了。

通用方法的第二个是快速找到 readme 文档。通常来说,根目录下的 readme 文档包含了这份代码的使用方法,里面有可以让你快速了解这个项目的关键信息。一般来说,开源项目的 readme 里作者都会写明如何使用代码和进行部署。下图是 DenseNet 的 readme 文档:

DenseNet的readme文档
DenseNet的readme文档

对于大型项目,可能每一个子目录下都有 readme 文档,这都是我们需要仔细阅读的部分,作者把关键信息都放里面了。所以不管这样,第一时间读找到 readme 进行阅读是你了解该项目的必备步骤和通用方法。

第三个通用方法就是具体如何读的问题。就是我们得确定一个阅读主线。这一点是针对于深度学习项目代码的通用方法,对于一个深度学习项目,我们一般想要了解的最关键点无非就是数据、模型和如何训练等几个方面。如果你想快速看看这个开源项目的测试效果,直接读 readme 看使用方法即可。如果这个项目作者提出了一个新的模型框架,比如说 bert,你想了解它的模型框架细节,直接定位到 models 目录下的带有 model 字眼的.py 文件开始读。或者是你想看这个项目是如何训练的,都用了哪些训练的 tricks ,它的参数初始化是如何做的,batchsize 用的多大,训练过程中学习率如何调整的等等,那么话不多说,直接定位到带 train 的.py 文件即可。如下图 faster-rcnn 的 3 个训练文件。

faster-rcnn的3个训练文件
faster-rcnn的3个训练文件

根据目的不管是 model 还是 train 的主线,在阅读过程中一定会涉及到其他分支,比如说数据和配置等其他分支线。在主线阅读过程中不断完善对分支的理解,久而久之,一个完整的项目就会被你消化了。

以上说的是深度学习项目代码阅读的一些通用方法。下面再具体讲两个场景的代码阅读。毕竟大家做事讲究目的性,往往带有较强的目的性去做某事效率一般会特别高。

第一个场景是在大家做研究做项目时遇到问题时。不知道这个问题如何解决,直接谷歌又找不到好合适的方法的时候。这时候我们可能会寄希望于在 GitHub 上搜罗一番。比如说我们想要知道对于极度数据不平衡时如何给损失函数加权重的方法,再比如对于多标签问题进行模型预测时如何找到最佳分类阈值等等。这些问题都是我们在做实际项目时都可能会碰上的,在这种情况下若是能在 GitHub 上找到类似场景的处理方法,相信你会瞬间来了精神。

下述基于 keras 的 CNN 多标签分类项目对于多标签分类阈值寻优使用了 matthews_corrcoef 来确定最佳分类预测阈值。至于什么是 matthews_corrcoef ,这些都是你在解决问题过程中需要学习和吸收的地方。总之,带有目的性的读某个项目的代码往往是只读某个 block 甚至是某几个关键行,数量不在多,在于能够解决你的问题。

matthews_corrcoef
matthews_corrcoef

第二个场景就是为了自我个人精进的读代码。所谓个人精进,就是有大量可支配的个人学习和研究时间,高度的自律性和超强的学习力的人进行能力跃迁的关键所在。笔者虽然平时偶尔会有去 GitHub 读一些代码,但说要达到个人精进的 level ,还远远不够。比如说前面的 PyTorch 750k 的源码,这么大的代码量,阅读策略一定是分治思想,分散包围和各个击破。把项目进行分解,设定阅读计划和目标,在超强的执行力下还是有可能完成的。这不是普通人干的事,但我相信能在深度学习领域精进的人都不会是普通人。

自我个人精进的读代码
自我个人精进的读代码

诚然,无论是读教材、读论文还是本篇所说的读代码,这些本身都是一个个人学习能力提升和知识汲取的过程。对于从事深度学习工作的我们而言,arxiv 上的论文和 GitHub 上的代码都无穷尽,关键在于保持学习的劲头,做一名终身学习者。

GitHub地址项目 GitHub 地址

特征工程系列:特征筛选的原理与实现(下)

0x00 前言

我们在《特征工程系列:特征筛选的原理与实现(上)》中介绍了特征选择的分类,并详细介绍了过滤式特征筛选的原理与实现。本篇继续介绍封装式和嵌入式特征筛选的原理与实现。

0x01 特征选择实现方法三:线性模型与正则化

1 .主要思想

当所有特征在相同尺度上时,最重要的特征应该在模型中具有最高系数,而与输出变量不相关的特征应该具有接近零的系数值。即使使用简单的线性回归模型,当数据不是很嘈杂(或者有大量数据与特征数量相比)并且特征(相对)独立时,这种方法也能很好地工作。

2 .正则化模型

正则化就是把额外的约束或者惩罚项加到已有模型(损失函数)上,以防止过拟合并提高泛化能力。损失函数由原来的 E(X,Y)变为E(X,Y)+alpha||w||,w 是模型系数组成的向量(有些地方也叫参数parameter,coefficients),||·||一般是 L1 或者 L2 范数,alpha 是一个可调的参数,控制着正则化的强度。当用在线性模型上时,L1 正则化和 L2 正则化也称为 Lasso 和 Ridge。

1)L1 正则化/Lasso regression

L1 正则化将系数w的l1范数作为惩罚项加到损失函数上,由于正则项非零,这就迫使那些弱的特征所对应的系数变成 0。因此 L1 正则化往往会使学到的模型很稀疏(系数 w 经常为 0 ),这个特性使得 L1 正则化成为一种很好的特征选择方法。

Lasso 能够挑出一些优质特征,同时让其他特征的系数趋于 0。当如需要减少特征数的时候它很有用,但是对于数据理解来说不是很好用。

2)L2 正则化/Ridge regression

L2 正则化将系数向量的 L2 范数添加到了损失函数中。

  • 由于 L2 惩罚项中系数是二次方的,这使得 L2 和 L1 有着诸多差异,最明显的一点就是,L2 正则化会让系数的取值变得平均。
  • 对于关联特征,这意味着他们能够获得更相近的对应系数。
  • Ridge 将回归系数均匀的分摊到各个关联变量上。

L2 正则化对于特征选择来说一种稳定的模型,不像 L1 正则化那样,系数会因为细微的数据变化而波动。所以 L2 正则化和 L1 正则化提供的价值是不同的,L2 正则化对于特征理解来说更加有用:表示能力强的特征对应的系数是非零。

3 .原理介绍

多元线性回归,具有 n 个特征值,

多元线性回归方程演变成求θ。

每个特征都有对应的权重系数coef,特征的权重系数的正负值代表特征与目标值是正相关还是负相关,特征的权重系数的绝对值代表重要性。

sklearn中 中LinearRegression的fit()方法就是通过训练集求出θ,LinearRegression的两个属性intercept和coef分别对应θ0和θ1-θn。
<h3>4 .代码实现</h3>
<h4>1)普通线性模型</h4>
#获取boston数据
boston=datasets.load_boston()
x=boston.data
y=boston.target
#过滤掉异常值
x=x[y&lt;50]
y=y[y&lt;50]
reg=LinearRegression()
reg.fit(x,y)
#求排序后的coef
coefSort=reg.coef_.argsort()
#featureNameSort: 按对标记值的影响,从小到大的各特征值名称
#featureCoefSore:按对标记值的影响,从小到大的coef_
featureNameSort=boston.feature_names[coefSort]
featureCoefSore=reg.coef_[coefSort]
print("featureNameSort:", featureNameSort)
print("featureCoefSore:", featureCoefSore)
# 输出:featureNameSort: ['NOX' 'DIS' 'PTRATIO' 'LSTAT' 'CRIM' 'INDUS' 'AGE' 'TAX' 'B' 'ZN' 'RAD' 'CHAS' 'RM']
featureCoefSore: [-1.24268073e+01 -1.21088069e+00 -8.38888137e-01 -3.50952134e-01
-1.05574295e-01 -4.35179251e-02 -2.36116881e-02 -1.37702943e-02 7.93577159e-03
3.52748549e-02 2.50740082e-01 4.55405227e-01 3.75411229e+00]

结果分析:

  • 正相关影响系数最大的特征值是 ”RM”:房间的平均数量,系数值为 3.75。
  • 负相关影响系数最大的特征值是 ”NOX”:一氧化氮浓度,系数值为 -1.24。

2)L1 正则化线性模型

#A helper method for pretty-printing linear models
def pretty_print_linear(coefs, names = None, sort = False):
if names == None:
names = ["X%s" % x for x in range(len(coefs))]
lst = zip(coefs, names)
if sort:
lst = sorted(lst, key = lambda x:-np.abs(x[0]))
return " + ".join("%s * %s" % (round(coef, 3), name)
for coef, name in lst)

from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston

boston = load_boston()
scaler = StandardScaler()
X = scaler.fit_transform(boston["data"])
Y = boston["target"]
names = boston["feature_names"]

lasso = Lasso(alpha=.3)
lasso.fit(X, Y)

print("Lasso model: {}".format(
pretty_print_linear(lasso.coef_, names, sort = True)))
# 输出:Lasso model: -3.707 * LSTAT + 2.992 * RM + -1.757 * PTRATIO
+ -1.081 * DIS + -0.7 * NOX + 0.631 * B + 0.54 * CHAS + -0.236 * CRIM
+ 0.081 * ZN + -0.0 * INDUS + -0.0 * AGE + 0.0 * RAD + -0.0 * TAX

许多特征具有系数 0。L1 正则化回归的稳定性与非正则化线性模型类似,这意味着当数据中存在相关特征时,系数(以及特征等级)即使在小数据变化时也会发生显着变化。

3)L2正则化线性模型

from sklearn.linear_model import Ridge
from sklearn.metrics import r2_score
size = 100

#We run the method 10 times with different random seeds
for i in range(10):
print("Random seed {}".format(i))
np.random.seed(seed=i)
X_seed = np.random.normal(0, 1, size)
X1 = X_seed + np.random.normal(0, .1, size)
X2 = X_seed + np.random.normal(0, .1, size)
X3 = X_seed + np.random.normal(0, .1, size)
Y = X1 + X2 + X3 + np.random.normal(0, 1, size)
X = np.array([X1, X2, X3]).T

lr = LinearRegression()
lr.fit(X,Y)
print("Linear model: {}".format(pretty_print_linear(lr.coef_)))

ridge = Ridge(alpha=10)
ridge.fit(X,Y)
print("Ridge model: {}".format(pretty_print_linear(ridge.coef_)))

# 输出
Random seed 0
Linear model: 0.728 * X0 + 2.309 * X1 + -0.082 * X2
Ridge model: 0.938 * X0 + 1.059 * X1 + 0.877 * X2

Random seed 1
Linear model: 1.152 * X0 + 2.366 * X1 + -0.599 * X2
Ridge model: 0.984 * X0 + 1.068 * X1 + 0.759 * X2

Random seed 2
Linear model: 0.697 * X0 + 0.322 * X1 + 2.086 * X2
Ridge model: 0.972 * X0 + 0.943 * X1 + 1.085 * X2

Random seed 3
Linear model: 0.287 * X0 + 1.254 * X1 + 1.491 * X2
Ridge model: 0.919 * X0 + 1.005 * X1 + 1.033 * X2

Random seed 4
Linear model: 0.187 * X0 + 0.772 * X1 + 2.189 * X2
Ridge model: 0.964 * X0 + 0.982 * X1 + 1.098 * X2

Random seed 5
Linear model: -1.291 * X0 + 1.591 * X1 + 2.747 * X2
Ridge model: 0.758 * X0 + 1.011 * X1 + 1.139 * X2

Random seed 6
Linear model: 1.199 * X0 + -0.031 * X1 + 1.915 * X2
Ridge model: 1.016 * X0 + 0.89 * X1 + 1.091 * X2

Random seed 7
Linear model: 1.474 * X0 + 1.762 * X1 + -0.151 * X2
Ridge model: 1.018 * X0 + 1.039 * X1 + 0.901 * X2

Random seed 8
Linear model: 0.084 * X0 + 1.88 * X1 + 1.107 * X2
Ridge model: 0.907 * X0 + 1.071 * X1 + 1.008 * X2

Random seed 9
Linear model: 0.714 * X0 + 0.776 * X1 + 1.364 * X2
Ridge model: 0.896 * X0 + 0.903 * X1 + 0.98 * X2

从示例中可以看出,线性回归的系数变化很大,具体取决于生成的数据。然而,对于 L2 正则化模型,系数非常稳定并且密切反映数据的生成方式(所有系数接近 1 )。

0x02 特征选择实现方法四:随机森林选择

随机森林具有准确率高、鲁棒性好、易于使用等优点,这使得它成为了目前最流行的机器学习算法之一。随机森林提供了两种特征选择的方法:mean decrease impurity和mean decrease accuracy。

1.平均不纯度减少(mean decrease impurity)

1)原理介绍

随机森林由多颗 CART 决策树构成,决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。
CART 利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度,对于回归问题,通常采用的是方差或者最小二乘拟合。
当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的标准。
随机森林基于不纯度的排序结果非常鲜明,在得分最高的几个特征之后的特征,得分急剧的下降。
2)代码实现

from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
import numpy as np

#Load boston housing dataset as an example
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
# 训练随机森林模型,并通过feature_importances_属性获取每个特征的重要性分数。rf = RandomForestRegressor()
rf.fit(X, Y)
print("Features sorted by their score:")
print(sorted(zip(map(lambda x: round(x, 4), rf.feature_importances_), names),
reverse=True))

2.平均精确度减少(mean decrease accuracy)

1)原理介绍

  • 通过直接度量每个特征对模型精确率的影响来进行特征选择。
  • 主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。
  • 对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大。
  • 对于重要的变量来说,打乱顺序就会降低模型的精确率。

2)代码实现

from sklearn.cross_validation import ShuffleSplit
from sklearn.metrics import r2_score
from collections import defaultdict
X = boston["data"]
Y = boston["target"]
rf = RandomForestRegressor()
scores = defaultdict(list)
#crossvalidate the scores on a number of different random splits of the data
for train_idx, test_idx in ShuffleSplit(len(X), 100, .3):
X_train, X_test = X[train_idx], X[test_idx]
Y_train, Y_test = Y[train_idx], Y[test_idx]
# 使用修改前的原始特征训练模型,其acc作为后续混洗特征值后的对比标准。r = rf.fit(X_train, Y_train)
acc = r2_score(Y_test, rf.predict(X_test))
# 遍历每一列特征
for i in range(X.shape[1]):
X_t = X_test.copy()
# 对这一列特征进行混洗,交互了一列特征内部的值的顺序
np.random.shuffle(X_t[:, i])
shuff_acc = r2_score(Y_test, rf.predict(X_t))
# 混洗某个特征值后,计算平均精确度减少程度。scores[names[i]].append((acc-shuff_acc)/acc)
print("Features sorted by their score:")
print(sorted([(round(np.mean(score), 4), feat) for feat, score in scores.items()], reverse=True))

0x03 特征选择实现方法五:顶层特征选择

顶层特征选择发建立在基于模型的特征选择方法基础之上的,例如线性回归和SVM等,在不同的子集上建立模型,然后汇总最终确定特征得分。

1.稳定性选择(Stability selection)

稳定性选择常常是一种既能够有助于理解数据又能够挑出优质特征的这种选择。

1)原理介绍

  • 稳定性选择是一种基于二次抽样和选择算法相结合较新的方法,选择算法可以是回归、SVM 或其他类似的方法。
  • 它的主要思想是在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果。比如可以统计某个特征被认为是重要特征的频率(被选为重要特征的次数除以它所在的子集被测试的次数)。
  • 理想情况下,重要特征的得分会接近 100%。稍微弱一点的特征得分会是非 0 的数,而最无用的特征得分将会接近于 0。

2)代码实现

from sklearn.linear_model import RandomizedLasso
from sklearn.datasets import load_boston
boston = load_boston()
#using the Boston housing data.
#Data gets scaled automatically by sklearn's implementation
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
rlasso = RandomizedLasso(alpha=0.025)
rlasso.fit(X, Y)
print("Features sorted by their score:")
print(sorted(zip(map(lambda x: round(x, 4), rlasso.scores_), names),
reverse=True))

2.递归特征消除(Recursive feature elimination,RFE)

1)原理介绍

递归特征消除的主要思想是反复的构建模型(如 SVM 或者回归模型)然后选出最好的(或者最差的)的特征(可以根据系数来选),把选出来的特征放到一遍,然后在剩余的特征上重复这个过程,直到所有特征都遍历了。
这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。
RFE 的稳定性很大程度上取决于在迭代的时候底层用哪种模型。
假如 RFE 采用的普通的回归,没有经过正则化的回归是不稳定的,那么 RFE 就是不稳定的。
假如 RFE 采用的是 Ridge,而用 Ridge 正则化的回归是稳定的,那么RFE 就是稳定的。

2)代码实现

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
#use linear regression as the model
lr = LinearRegression()
#rank all features, i.e continue the elimination until the last one
rfe = RFE(lr, n_features_to_select=1)
rfe.fit(X,Y)
print("Features sorted by their rank:")
print(sorted(zip(map(lambda x: round(x, 4), rfe.ranking_), names)))
结果输出
Features sorted by their rank:
[(1, 'NOX'), (2, 'RM'), (3, 'CHAS'), (4, 'PTRATIO'), (5, 'DIS'),
(6, 'LSTAT'), (7, 'RAD'), (8, 'CRIM'), (9, 'INDUS'), (10, 'ZN'),
(11, 'TAX'), (12, 'B'), (13, 'AGE')]

0xFF 总结

1.单变量特征选择可以用于理解数据、数据的结构、特点,也可以用于排除不相关特征,但是它不能发现冗余特征。

2.正则化的线性模型可用于特征理解和特征选择。相比起 L1 正则化,L2 正则化的表现更加稳定,L2 正则化对于数据的理解来说很合适。由于响应变量和特征之间往往是非线性关系,可以采用 basis expansion 的方式将特征转换到一个更加合适的空间当中,在此基础上再考虑运用简单的线性模型。

3.随机森林是一种非常流行的特征选择方法,它易于使用。但它有两个主要问题:

  • 重要的特征有可能得分很低(关联特征问题)
  • 这种方法对特征变量类别多的特征越有利(偏向问题)

4.特征选择在很多机器学习和数据挖掘场景中都是非常有用的。在使用的时候要弄清楚自己的目标是什么,然后找到哪种方法适用于自己的任务。

  • 当选择最优特征以提升模型性能的时候,可以采用交叉验证的方法来验证某种方法是否比其他方法要好。
  • 当用特征选择的方法来理解数据的时候要留心,特征选择模型的稳定性非常重要,稳定性差的模型很容易就会导致错误的结论。
  • 对数据进行二次采样然后在子集上运行特征选择算法能够有所帮助,如果在各个子集上的结果是一致的,那就可以说在这个数据集上得出来的结论是可信的,可以用这种特征选择模型的结果来理解数据。

5.关于训练模型的特征筛选,个人建议的实施流程 :

i. 数据预处理后,先排除取值变化很小的特征。如果机器资源充足,并且希望尽量保留所有信息,可以把阈值设置得比较高,或者只过滤离散型特征只有一个取值的特征。
ii. 如果数据量过大,计算资源不足(内存不足以使用所有数据进行训练、计算速度过慢),可以使用单特征选择法排除部分特征。这些被排除的特征并不一定完全被排除不再使用,在后续的特征构造时也可以作为原始特征使用。
iii. 如果此时特征量依然非常大,或者是如果特征比较稀疏时,可以使用PCA(主成分分析)和 LDA(线性判别)等方法进行特征降维。
iv. 经过样本采样和特征预筛选后,训练样本可以用于训练模型。但是可能由于特征数量比较大而导致训练速度慢,或者想进一步筛选有效特征或排除无效特征(或噪音),我们可以使用正则化线性模型选择法、随机森林选择法或者顶层特征选择法进一步进行特征筛选。

最后,特征筛选是为了理解数据或更好地训练模型,我们应该根据自己的目标来选择适合的方法。为了更好/更容易地训练模型而进行的特征筛选,如果计算资源充足,应尽量避免过度筛选特征,因为特征筛选很容易丢失有用的信息。如果只是为了减少无效特征的影响,为了避免过拟合,可以选择随机森林和 XGBoost 等集成模型来避免对特征过拟合。

最新《机器学习优化》教程

一、资源简介

普林斯顿大学在 19 年开设了 COS 598D《机器学习优化》课程的讲义,这个课程主要介绍机器学习中出现的优化问题,以及解决这些问题的有效算法。这份讲义内容详实循序渐进,非常适合想要入门机器学习优化的同学阅读。

官网:
https://sites.google.com/view/optimization4machinelearning/home

作者简介:
Elad Hazan :普林斯顿大学计算机系的教授,重点研究机器学习和优化的基本问题。曾获得贝尔实验室奖、2012 年和 2008 年 IBM 哥德堡最佳论文奖、欧洲研究理事会奖、居里夫人奖和谷歌研究奖。曾担任计算学习协会指导委员会委员,并担任 COLT 2015 项目主席。2017 年,创立了专注于高效优化与控制的In8 inc,并于 2018 年被谷歌收购。普林斯顿大学商学院的联合创始人和联合董事。

二、主要内容

下面是这份讲义的主要目录:

  1. 介绍
  2. 优化和分析的基本概念
  3. 随机梯度下降法
  4. 泛化和非光滑优化
  5. 正则化
  6. 自适应正则化
  7. 方差减少
  8. Nesterov加速度(Nesterov Acceleration)
  9. 条件梯度法
  10. 机器学习的二阶方法
  11. Hyperparameter优化(Hyperparameter Optimization)

特征工程系列:特征筛选的原理与实现(上)

前言

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。

那特征工程是什么?

特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。

特征工程又包含了Feature Selection(特征选择)、Feature Extraction(特征提取)和 Feature construction(特征构造)等子问题,本章内容主要讨论特征选择相关的方法及实现。

在实际项目中,我们可能会有大量的特征可使用,有的特征携带的信息丰富,有的特征携带的信息有重叠,有的特征则属于无关特征,如果所有特征不经筛选地全部作为训练特征,经常会出现维度灾难问题,甚至会降低模型的准确性。因此,我们需要进行特征筛选,排除无效/冗余的特征,把有用的特征挑选出来作为模型的训练数据。

特征选择介绍

1 .特征按重要性分类

  • 相关特征:对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果;
  • 无关特征:对于我们的算法没有任何帮助,不会给算法的效果带来任何提升;
  • 冗余特征:不会对我们的算法带来新的信息,或者这种特征的信息可以由其他的特征推断出;

2 .特征选择的目的

对于一个特定的学习算法来说,哪一个特征是有效的是未知的。因此,需要从所有特征中选择出对于学习算法有益的相关特征。而且在实际应用中,经常会出现维度灾难问题。如果只选择所有特征中的部分特征构建模型,那么可以大大减少学习算法的运行时间,也可以增加模型的可解释性。

3 .特征选择的原则

获取尽可能小的特征子集,不显著降低分类精度、不影响分类分布以及特征子集应具有稳定、适应性强等特点。

特征选择的方法

1 .Filter 方法(过滤式)

先进行特征选择,然后去训练学习器,所以特征选择的过程与学习器无关。相当于先对特征进行过滤操作,然后用特征子集来训练分类器。

主要思想:对每一维特征“打分”,即给每一维的特征赋予权重,这样的权重就代表着该特征的重要性,然后依据权重排序。

主要方法

  • Chi-squared test(卡方检验)
  • Information gain(信息增益)
  • Correlation coefficient scores(相关系数)

优点:运行速度快,是一种非常流行的特征选择方法。

缺点:无法提供反馈,特征选择的标准/规范的制定是在特征搜索算法中完成,学习算法无法向特征搜索算法传递对特征的需求。另外,可能处理某个特征时由于任意原因表示该特征不重要,但是该特征与其他特征结合起来则可能变得很重要。

2 .Wrapper 方法(封装式)

直接把最后要使用的分类器作为特征选择的评价函数,对于特定的分类器选择最优的特征子集。

主要思想:将子集的选择看作是一个搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个优化问题,这里有很多的优化算法可以解决,尤其是一些启发式的优化算法,如 GA、PSO(如:优化算法-粒子群算法)、DE、ABC(如:优化算法-人工蜂群算法)等。

主要方法:递归特征消除算法。

优点:对特征进行搜索时围绕学习算法展开的,对特征选择的标准/规范是在学习算法的需求中展开的,能够考虑学习算法所属的任意学习偏差,从而确定最佳子特征,真正关注的是学习问题本身。由于每次尝试针对特定子集时必须运行学习算法,所以能够关注到学习算法的学习偏差/归纳偏差,因此封装能够发挥巨大的作用。

缺点:运行速度远慢于过滤算法,实际应用用封装方法没有过滤方法流行。

3 .Embedded 方法(嵌入式)

将特征选择嵌入到模型训练当中,其训练可能是相同的模型,但是特征选择完成后,还能给予特征选择完成的特征和模型训练出的超参数,再次训练优化。

主要思想:在模型既定的情况下学习出对提高模型准确性最好的特征。也就是在确定模型的过程中,挑选出那些对模型的训练有重要意义的特征。

主要方法:用带有L1正则化的项完成特征选择(也可以结合 L2 惩罚项来优化)、随机森林平均不纯度减少法/平均精确度减少法。

优点:对特征进行搜索时围绕学习算法展开的,能够考虑学习算法所属的任意学习偏差。训练模型的次数小于 Wrapper 方法,比较节省时间。

缺点:运行速度慢。

特征选择实现方法一:去掉取值变化小的特征 (Removing features with low variance)

该方法一般用在特征选择前作为一个预处理的工作,即先去掉取值变化小的特征,然后再使用其他特征选择方法选择特征。

考察某个特征下,样本的方差值,可以认为给定一个阈值,抛弃哪些小于某个阈值的特征。

1. 实现原理

  • 离散型变量:假设某特征的特征值只有 0 和 1,并且在所有输入样本中,95% 的实例的该特征取值都是 1,那就可以认为这个特征作用不大。
    如果 100% 都是 1 ,那这个特征就没意义了。
  • 连续型变量:需要将连续变量离散化之后才能用。
    而且实际当中,一般不太会有 95% 以上都取某个值的特征存在,所以这种方法虽然简单但是不太好用。可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。

2.实现代码

from sklearn.feature_selection import VarianceThreshold
X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
sel.fit_transform(X)
array([[0, 1],
[1, 0],
[0, 0],
[1, 1],
[1, 0],
[1, 1]])

0x04 特征选择实现方法二:单变量特征选择

单变量特征选择方法独立的衡量每个特征与响应变量之间的关系,单变量特征选择能够对每一个特征进行测试,衡量该特征和响应变量之间的关系,根据得分扔掉不好的特征。该方法简单,易于运行,易于理解,通常对于理解数据有较好的效果(但对特征优化、提高泛化能力来说不一定有效);这种方法有许多改进的版本、变种。

1. Pearson相关系数(Pearson Correlation)

皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性。

1)原理介绍

  • 就是用 x_i、x_j 的协方差除以 x_i 的标准差和 x_j 的标准差,可以看成一种剔除了两个变量量纲影响、标准化后的特殊协方差。
  • 协方差是度量各个维度偏离其均值的程度,协方差的值为正值时说明两者是正相关,否则是负相关的。
    结果的取值区间为[-1,1],-1 表示完全的负相关,+1 表示完全的正相关,0 表示没有线性相关,绝对值表示相关性的强度。
  • 标准差也称均方差,是方差的算术平方根,能反映一个数据集的离散程度。

2)主要用于连续型特征的筛选,不适用于离散型特征的筛选。

3)优缺点

优点:
相关系数计算速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Pearson 相关系数能够表征丰富的关系,符合表示关系的正负,绝对值能够表示强度。

缺点:
相关系数作为特征排序机制,它只对线性关系敏感,如果关系是非线性的,即便两个变量具有一一对应的关系,相关系数系数也可能会接近 0。
4)代码实现

import numpy as np
from scipy.stats import pearsonr

np.random.seed(2019)
size=1000
x = np.random.normal(0, 1, size)
# 计算两变量间的相关系数
print("Lower noise {}".format(pearsonr(x, x + np.random.normal(0, 1, size))))
print("Higher noise {}".format(pearsonr(x, x + np.random.normal(0, 10, size))))

2. 互信息和最大信息系数(Mutual information and maximal information coefficient)

如果变量不是独立的,那么我们可以通过考察联合概率分布与边缘概率分布乘积之间的 Kullback-Leibler 散度来判断它们是否“接近”于相互独立。

1)互信息方法

熵 H(Y)与条件熵H(Y|X) 之间的差称为互信息,互信息与条件熵之间的关系:

其实,这就是 ID3 决策树的特征选择规则。

互信息法也是评价定性自变量对定性因变量的相关性的,但是并不方便直接用于特征选择:

  • 它不属于度量方式,也没有办法进行归一化,在不同的数据上的结果无法做比较。
  • 只能用于离散型特征的选择,连续型特征需要先进行离散化才能用互信息进行特征选择,而互信息的结果对离散化的方式很敏感。

2)最大信息系数方法

由于互信息法并不方便直接用于特征选择,因此引入了最大信息系数。最大信息数据首先寻找一种最优的离散方式,然后把互信息取值转换成一种度量方式,取值区间为[0,1]。

3)最大信息系数方法代码实现

x = np.random.normal(0,10,300)
z = x *x
pearsonr(x,z)
# 输出-0.1
from minepy import MINE
m = MINE()
m.compute_score(x, z)
print(m.mic())
# 输出1.0

3. 距离相关系数(Distance correlation)

距离相关系数是为了克服 Pearson 相关系数的弱点而生的。

1)原理介绍

Pearson相关系数是 0,我们也不能断定这两个变量是独立的(有可能是非线性相关)。
例如 x 和 x^2 之间的 Pearson 相关系数是 0,但是两个变量并不是独立的。

2)代码实现

from scipy.spatial.distance import pdist, squareform
import numpy as np

from numbapro import jit, float32

def distcorr(X, Y):
""" Compute the distance correlation function

&gt;&gt;&gt; a = [1,2,3,4,5]
&gt;&gt;&gt; b = np.array([1,2,9,4,4])
&gt;&gt;&gt; distcorr(a, b)
0.762676242417
"""

X = np.atleast_1d(X)
Y = np.atleast_1d(Y)
if np.prod(X.shape) == len(X):
X = X[:, None]
if np.prod(Y.shape) == len(Y):
Y = Y[:, None]
X = np.atleast_2d(X)
Y = np.atleast_2d(Y)
n = X.shape[0]
if Y.shape[0] != X.shape[0]:
raise ValueError('Number of samples must match')
a = squareform(pdist(X))
b = squareform(pdist(Y))
A = a - a.mean(axis=0)[None, :] - a.mean(axis=1)[:, None] + a.mean()
B = b - b.mean(axis=0)[None, :] - b.mean(axis=1)[:, None] + b.mean()

dcov2_xy = (A * B).sum()/float(n * n)
dcov2_xx = (A * A).sum()/float(n * n)
dcov2_yy = (B * B).sum()/float(n * n)
dcor = np.sqrt(dcov2_xy)/np.sqrt(np.sqrt(dcov2_xx) * np.sqrt(dcov2_yy))
return dcor

4. 基于学习模型的特征排序(Model based ranking)

这种方法的思路是直接使用你要用的机器学习算法,针对每个单独的特征和响应变量建立预测模型。如果特征与响应变量之间的关系是非线性的,则有许多替代方案,例如基于树的方法(决策树,随机森林)、或者扩展的线性模型等。基于树的方法是最简单的方法之一,因为他们可以很好地模拟非线性关系,不需要太多的调整。但是要避免的主要是过度拟合,因此树的深度应该相对较小,并且应该应用交叉验证。

代码实现

from sklearn.cross_validation import cross_val_score, ShuffleSplit
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor

#Load boston housing dataset as an example
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]

rf = RandomForestRegressor(n_estimators=20, max_depth=4)
scores = []
# 使用每个特征单独训练模型,并获取每个模型的评分来作为特征选择的依据。for i in range(X.shape[1]):
score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",
cv=ShuffleSplit(len(X), 3, .3))
scores.append((round(np.mean(score), 3), names[i]))
print(sorted(scores, reverse=True))

# 输出:[(0.636, 'LSTAT'), (0.59, 'RM'), (0.472, 'NOX'), (0.369, 'INDUS'),
(0.311, 'PTRATIO'), (0.24, 'TAX'), (0.24, 'CRIM'), (0.185, 'RAD'),
(0.16, 'ZN'), (0.087, 'B'), (0.062, 'DIS'), (0.036, 'CHAS'), (0.027, 'AGE')]

5.卡方检验

卡方检验是一种用途很广的计数资料的假设检验方法,由卡尔•皮尔逊提出。卡方值描述两个事件的独立性或者描述实际观察值与期望值的偏离程度。卡方值越大,表名实际观察值与期望值偏离越大,也说明两个事件的相互独立性越弱。

1)原理介绍

CHI 值(卡方值)用于衡量实际值与理论值的差异程度,除以 T 是为了避免不同观察值与不同期望之间产生的偏差因 T 的不同而差别太大,所以除以 E 以消除这种弊端。

  • 实际值与理论值偏差的绝对大小(由于平方的存在,差异被放大)
  • 差异值与理论值的相对大小

2)实现流程

CHI值越大,说明两个变量越不可能是独立无关的,也就是说CHI值越大,两个变量的相关程度也越高。
a. 对于特征变量x1,x2,…,xn,以及分类变量y。只需要计算CHI(x1,y)、CHI(x2,y)、…、CHI(xn,y),并按照CHI的值从大到小将特征排序。
b. 选择合适的阈值,大于阈值的特征留下,小于阈值的特征删除。这样筛选出一组特征子集就是输入模型训练的特征。

3)只适用于分类问题中离散型特征筛选,不能用于分类问题中连续型特征的筛选,也不能用于回归问题的特征筛选。

4)代码实现

现实方法:

  • sklearn.feature_selection.SelectKBest:
    返回k个最佳特征
  • sklearn.feature_selection.SelectPercentile:
    返回表现最佳的前r%个特征

#导入sklearn库中的SelectKBest和chi2
from sklearn.feature_selection import SelectKBest ,chi2
#选择相关性最高的前5个特征
X_chi2 = SelectKBest(chi2, k=5).fit_transform(X, y)
X_chi2.shape
输出:(27, 5)

0xFF 总结

1.去掉取值变化小的特征方法一般用在特征选择前作为一个预处理的工作,即先去掉取值变化小的特征,然后再使用其他特征选择方法选择特征。如果机器资源充足,并且希望尽量保留所有信息,可以把阈值设置得比较高,或者只过滤离散型特征只有一个取值的特征。

2.单变量特征选择可以用于理解数据、数据的结构、特点,也可以用于排除不相关特征,但是它不能发现冗余特征。

去掉取值变化小的特征方法和单变量特征选择方法都属于过滤式类特征筛选方法,但是学习算法无法向特征搜索算法传递对特征的需求。为了真正关注的是学习问题本身,我们将在《特征工程系列:特征筛选的原理与实现(下)》中继续介绍 Wrapper 方法和 Embedded 方法的原理与实现。

参考文献:

[1] Feature selection – Part I: univariate selection.
[2] Selecting good features – Part II: linear models and regularization.
[3] Feature selection.

最全面的《深度学习》精炼笔记

《深度学习》,又名『花书』。该书由三位大佬 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 撰写,是深度学习领域奠基性的经典教材,被誉为深度学习“圣经”。

深度学习
深度学习

花书怎么学?参考优秀的笔记往往能帮助你事半功倍!今天给大家推荐一份不错的花书学习笔记,挺详细的。作者是来自于谷歌的软件工程师—川陀学者。我们一起来看看!

为方便以后查阅,把深度学习花书 Deep Learning 每一章的读书笔记做个索引,完整的笔记也是根据书籍目录来的。

花书的目录如下:

目录
目录

下面我们来详细看一下完整笔记内容!

第一部分 机器学习基础

第一章 前言

1. 前言(上)

花书可以大致分为三大部分:

  • 机器学习基础知识:涵盖线性代数,概率论,数值计算和传统机器学习基础等知识。如果之前学过Andrew Ng 的 CS229 的话基本可以跳过。
  • 深度神经网络核心知识:属于本书必读部分,涵盖前馈神经网络,卷积神经网络( CNN ),递归神经网络( RNN ) 等。
  • 深度学习前沿:有一些前沿研究领域的介绍,如线性因子模型,表征学习,生成模型等。 可以按照自己的需要选读相关章节。

完整版

https://zhuanlan.zhihu.com/p/37753117

2. 前言(下)

继续总结深度学习花书第一章前言下半部分,主要内容有:

  • 深度学习历史悠久,在不同时期名字不同,代表不同的侧重点。
  • 由于训练数据的增多和软硬件性能的提高,深度学习的模型越来越准确。
  • 深度学习逐渐走向实用化。

完整版:
https://zhuanlan.zhihu.com/p/37800558

第二章 线性代数

线性代数是机器学习的数学基础之一,这里总结一下深度学习花书线性代数一章中机器学习主要用到的知识,并不囊括所有线性代数知识。

完整版:
https://zhuanlan.zhihu.com/p/38197420

第三章 概率论

概率论是研究随机性和不确定性的科学,在人工智能领域主要有两大应用:

1. 概率论可以指导人工智能模型所需模拟或近似的概率分布。

2.概率与统计可以帮助我们分析模型的预测的准确性。可以说,线性代数和概率论是人工智能系统的两大数学基石,这一章对于理解很多机器学习模型的背后驱动力是关键的。

完整版:
https://zhuanlan.zhihu.com/p/38424019

第四章 数值计算

第四章主要研究的是优化问题。

我们机器学习的目标常常是使某个目标函数(objective function)或损失函数(cost function)尽量小,即找到一个 x* = argminf(x). 对于有的问题我们可能可以得到解析解,但对于大多数问题,我们可能无法得到解析解,这时候就需要一些数值计算的方法使我们逐渐逼近最优解,这一章里就主要讲了利用一阶导数的梯度下降算法和利用二阶导数的牛顿方法,另外还有研究在给定某些限制条件下的条件极值的解法,Ian 在这一章有些解释可能略过了,在这里我加入了自己的理解使其更易懂。

完整版:
https://zhuanlan.zhihu.com/p/38644738

第五章 机器学习基础

1. 机器学习问题定义与线性回归

之前已经总结了第二到四章数学基础部分,第五章讲的是机器学习基础,内容较多,包括机器学习问题的定义,机器学习算法过拟合和验证集的概念,贝叶斯推断,经典的监督学习和非监督学习的算法等,而且Ian 很多方面一笔带过,其实每个经典的算法都可以单独出来写一篇文章详述,所以准备将第五章分几部分总结,而且争取把书中比较模糊的涉及到的概念也补充清楚。

这篇先总结一下对于机器学习问题如何定义并以线性回归来举例说明。

完整版:
https://zhuanlan.zhihu.com/p/38790135

2. 欠拟合、过拟合与正则化

继续花书第五章总结,主要内容是模型的泛化误差,过拟合与正则化方法。

完整版:
https://zhuanlan.zhihu.com/p/39035752

3. 最大似然法与最大后验概率估计

继续花书第五章总结,主要内容有最大似然法(Maximum likelihood estimation), 贝叶斯统计(Bayesian statistics)与最大后验概率估计(Maximum A Posteriori estimation简称MAP estimation)。

完整版:
https://zhuanlan.zhihu.com/p/39063974

4. 逻辑回归

继续花书第五章机器学习基础部分总结,接下来是经典监督学习算法,不过 Ian 对于逻辑回归和支持向量机一笔带过,解释的不是很详细,我准备结合 Andrew Ng 的 cs229 内容将逻辑回归(logistic regression)与支持向量机(support vector machine)分两篇详细写一下。

完整版:
https://zhuanlan.zhihu.com/p/39784376

5. 支持向量机

支持向量机(Support Vector Machine, 简称SVM)是传统监督学习中一个经典的算法,Ian 在花书中讲的比较简略,这里我结合 CS229 的内容进行补充。

完整版:
https://zhuanlan.zhihu.com/p/39815531

6. 主成分分析 PCA

接下来总结经典的无监督学习模型主成分分析(Principal component analysis , 简称 PCA )。Ian 分别在第二章和第五章从不同角度讨论了 PCA 算法,分别是在第二章线性代数中本征分解和奇异值分解 SVD 之后和第五章无监督学习模型中,这里总结在一起。

完整版:
https://zhuanlan.zhihu.com/p/39847860

第二部分 深度神经网络核心知识

第六章 前馈神经网络

1. 前馈神经网络初探

前五章总结了深度学习的数学基础及经典机器学习算法(深度学习花书读书笔记目录),第 6 到 12 章是花书的深度网络核心部分,包括如下内容:前馈神经网络,深度学习的正则方法,训练深度学习模型的优化方法,卷积神经网络,循环及递归神经网络,关于模型训练的建议与方法以及深度学习的应用,这部分的技术已经广泛应用到工业界,对于想要用深度学习来解决实际工作中的问题的从业人员很有必要。

现在就开始第六章前馈神经网络的总结,准备分为三篇:

1.初识前馈神经网络

2.前馈神经网络的基本组成与架构

3.反向传播算法。现在开始第一篇总结。

完整版:
https://zhuanlan.zhihu.com/p/40519236

2. 神经网络损失函数、输出层、隐藏层详解

神经网络的设计主要包含两方面:1)损失函数的选择 2)模型的具体架构。

完整版:
https://zhuanlan.zhihu.com/p/41194849

3. 反向传播算法

为了理解什么是反向传播(backward propagation),先要知道什么是正向传播(forward propagation)。顾名思义,正向传播就是对于前馈神经网络来说,信息从输入到隐藏层再到输出的正向流动过程,最终会得到损失函数的值。而反向传播就是从损失函数反向流入网络以计算梯度(gradient)的过程。

要注意,有个普遍的误解是反向传播就是神经网络的全部学习算法,实际上,反向传播仅指计算梯度的过程,实际上的学习过程是诸如随机梯度下降(stochastic gradient descent,SGD)更新网络的算法。

完整版:
https://zhuanlan.zhihu.com/p/41379139

第七章 正则化方法

继续总结深度学习花书,第七章主要讲了深度学习中的各种正则化方法(regularization),即为了减小泛化误差而对机器学习算法进行的修改。关于泛化、欠拟合、过拟合的基础概念,可参考之前的总结文章欠拟合、过拟合与正则化。

总体来说,一部分正则化方法使给模型施加额外的限制条件,例如限制参数值范围,有些会在目标函数中添加一些额外惩罚项,本质上也是希望限制参数值。有的时候,这些限制条件或惩罚项代表了特定的先验经验,有的时候是希望避免模型过于复杂。正则化常常会增加一些 bias 但同时会减少 variance,好的正则化方法就是在能够显著减小 variance 的情况下又不显著地增加 bias。

完整版:
https://zhuanlan.zhihu.com/p/41462329

第八章 优化方法

1. 深度学习优化算法比较

继续深度学习第八章总结,这章主要讲了深度学习的优化方法,主要涉及的内容有 Stochastic Gradient Descent (SGD) ,  Momentum ,  Adagrad ,  RMSProp ,  Adam ,模型参数初始化和 Batch Normalization,第一部分先总结 SGD 及其各种改进算法,由于这一部分内容在斯坦福 CS231n 中的解释更清晰,会结合起来一起总结。

完整版:
https://zhuanlan.zhihu.com/p/42183379

2. Batch Normalization

前面一篇(深度学习优化算法比较——深度学习第八章(一))总结了常见的优化算法 SGD 以及其改进方法Momentum ,Adagrad ,Adam 等,这篇继续总结最近优化深度神经网络的一种高效的方法——Batch Normalization ,该方法有 Ioffe 和 Szegedy 在 2015 年提出(Accelerating Deep Network Training by Reducing Internal Covariate Shift)。

完整版:
https://zhuanlan.zhihu.com/p/42982530

第九章 卷积神经网络

继续深度学习花书的读书笔记总结,这一章主要介绍了卷积神经网络(convolutional neural network, 简称CNN), 它通常适用于具有网格状结构的数据,例如时序数据可看做是在特定时间间隔上的一维网格,图像可以看做是像素构成的二维网格,医学成像如 CT 等为三维网格数据。

卷积神经网络,顾名思义,利用了数学上的卷积操作(convolution)。和前面第六章总结的基本的前馈神经网络相比,CNN 只不过是将某层或某几层中的矩阵乘法运算替换为卷积运算,其他的比如说最大似然法则,反向传播算法等等都保持不变。

完整版:
https://zhuanlan.zhihu.com/p/43143470

第十章 循环神经网络

继续深度学习花书的读书笔记总结。这一章主要介绍了循环神经网络(Recurrent neural network, 简称RNN),主要用来处理序列数据,比如一些文字序列或时序数据。对于这类数据,基本的前馈神经网络会对每一个输入的特征都训练一个单独的参数,而不能很好的进行参数的共享,而 RNN 就可以通过对不同时间点的特征共享参数而更容易的进行训练,泛化效果也更好。上一章卷积神经网络——深度学习第九章总结过 CNN 也可以实现参数共享,RNN 与其不同的地方在于其每一点的输出还依赖于之前的结果。

完整版:
https://zhuanlan.zhihu.com/p/44145288

第十一章 实战经验

前面几章我们总结了机器学习以及深度学习中一些常用的模型以及训练方法,实际应用中,我们还要知道对于一些特定的情景选择哪种模型,以及如何通过收集模型的反馈结果来不断改善模型。有时候不一定需要采用最新最复杂的模型,而是需要深入的理解一些通用的模型,并更好的应用到我们所处理的具体问题中。这一章会总结一下我们面对一个机器学习问题时的实战步骤:确立性能指标;快速建立端到端的流程;分析模型效果,并不断的对模型进行改进。下面详细解释一下每个步骤。

完整版:
https://zhuanlan.zhihu.com/p/44643887

第十二章 深度学习应用

继续《深度学习》花书笔记总结,这一章主要是结合前面几章内容简要介绍了深度学习在图像识别,自然语言处理及其他领域的应用。

完整版:
https://zhuanlan.zhihu.com/p/45225601

第三部分 深度学习前沿研究

第十三章 线性因子模型

继续深度学习花书总结,从第十三章开始,主要是一些前沿研究领域。之前总结的方法大部分是在有大量数据情况下的监督学习方法,而假如我们想减小数据量的要求,则需要一些无监督学习及半监督学习方法,虽然有很多无监督学习方法,但是目前还无法达到深度学习在监督学习问题中所达到的精度,这常常是由于我们需要解决的问题的维度过高或计算量过大造成的。

完整版:
https://zhuanlan.zhihu.com/p/45898775

第十四章 自编码器

自编码器(Autoencoder)是一种特定的神经网络结构,其目的是为了将输入信息映射到某个更低维度的空间,生成包含重要特征的编码 code,这部分称为 Encoder,可用函数 h=f(x) 表示,然后再利用 Decoder将 code 重构成为尽量能还原原输入的结果,用函数 r=g(h) 。我们的目的就是尽量使 g(f(x))=x ,当然如果只是简单的将输入复制到输出是没有任何意义的,我们需要加一定的限制条件,使我们的模型学习到数据中更重要的特征。

完整版:
https://zhuanlan.zhihu.com/p/46067799

第十五章 表示学习

这一章聚焦表示学习(Representation Learning)及其应用,主要内容有无监督及有监督预训练的作用,迁移学习及分布式表示。在前言部分(机器学习的《易筋经》:深度学习花书前言(上))提到过,机器学习的主要问题就是如何更合理高效的将特征表示出来。那么,我们怎么判定某种表示更好呢,这需要具体问题具体分析,这通常依赖于后续的学习任务是否能够得益于这种表示。通常,我们是进行某些无监督学习提取出特征,而这些特征可用来我们更好的进行监督学习,或者将这些特征迁移到其他相关任务中。我们也可以将监督学习训练的前馈神经网络看做是一种表示学习,通常神经网络的最后一层是个分类器如softmax,它之前的隐藏层可以看做是给这个分类器提供一个高效的表征。

完整版:
https://zhuanlan.zhihu.com/p/46286036

第十六章 结构化概率模型

继续《深度学习》花书总结,从第 16 章开始直到第 20 章都是在讨论概率模型,其中第 16 到 19 章着重于概率模型基础及一些近似方法,第 20 章讨论应用这些方法的生成模型。我们先来总结第 16 章概率图的主要概念。

完整版:
https://zhuanlan.zhihu.com/p/47892761

第十七章 蒙特卡洛方法

继续《深度学习》花书总结,本章主要介绍采样的蒙特卡洛方法,准备结合斯坦福 CS 228 – Probabilistic Graphical Models 课程相关内容一起总结。

完整版:https://zhuanlan.zhihu.com/p/48481980

第十八章 配分函数

继续《深度学习》花书总结,本章主要介绍了各种求配分函数的方法,准备结合斯坦福 cs228Learning in undirected models 这部分内容一起总结。

完整版:
https://zhuanlan.zhihu.com/p/48552020

第十九章 近似推断

继续《深度学习》花书总结,本章介绍了各种近似推断的方法,有 EM 算法,变分推断等,重点是变分推断,这部分内容个人感觉 Variational Inference: A Review for Statisticians 这篇论文对变分推断的解释思路更清晰,所以会主要根据这篇论文来进行总结。

完整版:
https://zhuanlan.zhihu.com/p/49401976

第二十章 生成模型

1. 生成模型综述

这是《深度学习》花书最后一章,内容也比较多,所以准备分为四篇总结:

  • 生成模型综述,比较一下常见的几种生成模型。
  • 详解玻尔兹曼机,GSN以及Fully Visible Belief Network如PixelRNN/PixelCNN。
  • 详解变分自编码器Variational Autoencoder。
  • 详解生成对抗网络Generative Adversarial Network。

另外,由于部分内容其他资料会梳理的更清晰,所以会结合 Ian 在 2016 NIPS 的 GAN tutorial NIPS 2016 tutorial: Generative Adversarial Networks 和斯坦福 Syllabus | CS 231N 中与 Generative Model 相关的内容一起总结。

这一篇先来综述一下什么是生成模型,我们为什么要研究生成模型以及常见生成模型谱系及比较。

完整版:
https://zhuanlan.zhihu.com/p/50278440

2. 玻尔兹曼机、生成随机网络与自回归网络

继续总结花书第20章,这一章花了很大的篇幅介绍玻尔兹曼机及其变种,但实际应用中主要用到的三种方法还是

  • 自回归网络 Auto-Regressive Networks,又叫做 Fully-visible Bayes networks(FVBN)。
  • 变分自解码器 Variational Autoencoder (VAE)。
  • 生成对抗网路 Generative Adversarial Networks(GAN) 。所以这篇会简要的总结一下玻尔兹曼机以及生成随机网络,然后着重总结一下自回归网络。

完整版:
https://zhuanlan.zhihu.com/p/50745191

3. 变分自编码器 VAE

继续总结花书第 20 章,这一篇我们来看另一种常用的生成模型——变分自编码器 Variational Autoencoder ,简称 VAE ,主要会结合斯坦福 Syllabus | CS 231N 中与 Generative Model 相关的内容来总结。

完整版:
https://zhuanlan.zhihu.com/p/51355416

4. 生成模型中的左右互搏术

继续总结花书第 20 章最后一部分生成对抗网络 Generative Adversarial Network,简称 GAN 。主要结合斯坦福 Syllabus | CS 231N 中与 Generative Model 相关内容以及 NIPS 2016 tutorial: Generative Adversarial Networks 来进行总结。

完整版:
https://zhuanlan.zhihu.com/p/37846221

后记与延伸

深度学习花书读书笔记后记与延伸:
https://zhuanlan.zhihu.com/p/51431332

花书完整笔记的目录可以看这里:
https://zhuanlan.zhihu.com/p/38431213

最后,希望这份资源对你有用!也感谢原作者的辛勤整理!

DeepMind 发布星际争霸强化学习课程

此前,跨象乘云介绍了:Pysc2 —— 基于 Python 的星际争霸 II 机器学习环境,这是 DeepMind 和暴雪合作开发星际争霸 II 到强化学习研究的一个丰富环境,为强化学习代理提供了与星际争霸 II 进行交互的界面,获得观察结果并发送动作。

很长时间以来,因为星际争霸这个游戏包含非常多的状态和动作空间,以及只有部分可观察和多玩家的特点,这个游戏一直被机器学习界认为是人工智能的下一个『大挑战』。

于是,一个由澳大利亚开发人员、机器学习工程师和研究人员组成的团队 —— StarAi 就基于星际争霸开发了一个机器学习课程!

课程特色

大多数强化学习课程都是采用高度数学化的方法学习的,但是这个课程使用更加人性化工具 —— 『故事』,来解释基本的强化学习概念。不能自己动手创造的东西你是不会明白的!所以课程提供了易于实际操作的练习,与步骤详解,以帮助学习。

学习方法

所有练习都在谷歌实验室中执行,直接在浏览器中就可以操作,而与硬件无关。所以你所需要的只是一个谷歌帐户和 Chrome 浏览器。学习的步骤就是先观看演讲材料,然后尝试进行练习。当然课程官方就像高中老师一样,也是要求你在自己实际操作很多遍之后如果还不能解决再看答案,不要直接看答案!

而对于基础较好的技术人员,如果想深入了解的话,课程还提供了Sutton & Bartos 的优秀教科书《An Introduction for each week’s material》中相关章节的链接。课程一共六周,每一部分都包含视频讲解、PPT、课后练习和答案,非常完善!赶紧上手进行学习吧!

课程链接

https://www.starai.io/course/

Pytorch 图神经网络(GNN)实战推荐

一、资源简介

最近以来图神经网络 (GNN) 在各个领域越来越受到欢迎,包括社交网络、知识图谱、推荐系统,甚至生命科学。GNN 在对图形中节点间的依赖关系进行建模方面能力强大,使得图分析相关的研究领域取得了突破性进展。今天给大家推荐一篇关于 Pytorch 实战图神经网络的笔记,图神经网络在最近的学术界和工业界都十分的火热,非常值得一学!

PyTorch
PyTorch

PyTorch 是什么?

PyTorch 是一个基于 Python 的科学计算工具包,它主要面向两种场景:

  1. 用于替代 NumPy ,可以使用 GPU 的计算力
  2. 一种深度学习研究平台,可以提供最大的灵活性和速度

原作者: Steeve Huang
网页链接:http://t.cn/AiKsApEM

二、主要内容

在本文中,作者将使用 PyTorch 和 PyTorch Geometry (PyG) ,这是一个构建在 PyTorch 之上的图形神经网络框架,运行速度非常快。它有多快?与另一个流行的图神经网络库 DGL 相比,它的训练时间最多快80% !除了其惊人的速度,PyG 还提供了一组在各种论文中都有说明的 GNN 模型。因此,用 PyG 重做实验是非常方便的。由于 PyG 在速度和方便方面的优势,毫无疑问,它是最受欢迎和广泛使用的 GNN 库之一。

作者主要是用 PyTorch 和 PyG 做了图神经网络的实验,更多相关,请查阅原资料~

Example graph
Example graph
Example graph2
Example graph2

三、资源分享

同时为了方便大家,我们把最新 PDF 打包好了,可以直接下载 ——

Hands on Graph Neural Networks with PyTorch & PyTorch Geometric

TensorFlow 2.0 构建和部署端到端的图像分类器

2019 年 3 月 6 日,谷歌在 TensorFlow 开发者年度峰会上发布了最新版的 TensorFlow 框架 TensorFlow 2.0 。新版本对 TensorFlow 的使用方式进行了重大改进,使其更加灵活和更具人性化。具体的改变和新增内容可以从 TensorFlow 的官网找到,本文将介绍如何使用 TensorFlow 2.0 构建和部署端到端的图像分类器,以及新版本中的新增内容,包括:

  • 使用 TensorFlow Datasets 下载数据并进行预处理
  • 使用 Keras 高级 API 构建和训练图像分类器
  • 下载 InceptionV3 卷积神经网络并对其进行微调
  • 使用 TensorFlow Serving 为训练好的模型发布服务接口

本教程的所有源代码都已发布到 GitHub 库中,有需要的读者可下载使用。

GitHub地址项目 GitHub 地址