The post 开源美图 2017 09 01 appeared first on Linuxeden开源社区.
http://ift.tt/2en9a7v2017年8月31日星期四
深度学习打造精准推荐系统,细说国美互联网 AI 发展的进击之路
作者 蔡芳芳
导语
这是一个 AI+的时代。
作为线上+线下的电商零售平台,国美互联网如何将人工智能技术嵌入到实际业务中?机器学习和深度学习技术为国美带来了哪些改变?在这火热的时局中,国美未来在前沿技术方面又将如何布局?且听下文一一分解。
正文
今年机器学习已然成为炙手可热的技术话题。深度学习与人工智能技术正在改变人们的生活,同时也给企业管理大量数据、为用户提供更精准的服务提供了一些新的思路和尝试的方向。越来越多的企业开始尝试将机器学习引入原有的大数据平台和框架中,并将公司业务与机器学习、深度学习技术相结合以寻求更优的业务价值。
2016 年 11 月国美互联网板块所属国美在线、美信、国美管家、GOME 酒窖、国美海外购整合组建国美互联网生态(分享)科技公司(下面简称国美互联网),并推出了国美 Plus APP。作为具备线上线下双重基因的新零售平台,国美互联网近年来,针对机器学习、深度学习技术与社交电商业务相结合进行了一系列尝试和创新。这次我们非常有幸对国美互联网大数据中心的副总监杨骥进行了采访,目前他主要负责搜索、推荐和深度学习三个方向的研发工作及团队管理。作为国美互联网个性化推荐团队和算法架构平台建设者,杨骥与我们分享了国美互联网在机器学习技术之路上的尝试、挑战与收获。
国美大数据中心背景
国美互联网大数据中心主要负责大数据平台运维、大数据应用、BI、搜索、推荐等相关内容,支撑国美互联网全业务线(包括大家电、百货、汽车等)的精准营销和数据变现。尤其是最近几年以来,中心在机器学习方面投入了非常多的资源,除了升级推荐和搜索相关的机器学习算法之外,还陆续推出了“国美拍照购”、“图像相似推荐”、“图像搭配推荐”等基于深度学习算法的产品。
国美个性化推荐系统面面观
对于电商来说,个性化推荐系统是不可或缺的利器,也是国美互联网应用机器学习和深度学习技术的主要战场。
推荐系统演进之路
要将机器学习技术应用到实际产品中,必然离不开一套良好的算法和平台架构。2016 年 3 月杨骥加入国美之后,对机器学习和深度学习算法以及线上服务架构进行重构,打造了全新的个性化推荐系统。目前,杨骥带领团队已经完成了三轮大规模的架构升级,最终实现了一套完整的推荐系统架构,其中包括机器学习和深度学习计算平台,并整合了 A/B 测试、线上部署和自动化监测等功能。
系统架构和流程
下面是国美互联网应用 Learning to Rank(机器学习排序,L2R)后的推荐系统流程图和架构图。采用的工具包括 Apache Storm、Kafka、Spark、Flink 等。
(点击放大图像)
图 1:流程图
(点击放大图像)
图 2:架构图
当用户在网站或者 APP 上看到“猜你喜欢”的商品后进行了点击。一方面,该点击信息通过实时数据处理系统反馈给排序引擎和在线训练模型,帮助推荐系统实时调优;另一方面,点击信息进入 Log。基于 Log 进行知识挖掘,获取相关特征和训练数据,并进行基础推荐模型的计算(如关联规则和协同过滤模型等)以及离线排序模型的训练。离线排序模型缓存到 Redis 模型服务器,而相关特征数据、基础推荐模型的粗筛结果缓存到 Hbase 和 Redis 数据服务器。
系统要向用户展示推荐商品时,数据获取模块获得用户的基本特征和推荐的初筛结果,进行交互特征和在线特征的计算,然后利用离线模型、在线模型以及业务规则进行最终的筛选与排序,返回最终推荐结果给用户。
数据收集和清理
国美使用 Apache Kafka 和 Apache Storm 系统收集和处理推荐展位上的实时数据消息,包括推荐展位每页已经展示过什么商品、用户点击了什么商品等。然后对这些数据消息进行实时分析和统计,包括用户在推荐展位展示之前已经对哪些品类的产品有过购买行为,对不同的已购买商品赋予不同的权重(比如手机买过则短期不会再买,纸巾则会隔较短时间反复购买),再计算出接下来的推荐展位应该显示哪些商品。
对于一些特殊的用户数据需要进行数据清理,以免影响算法模型的拟合效果。比如,已购买用户对同一商品的点击和查看对推荐排序模型是无用的,应该被排除;还有一些用户频繁地点击商品但却不下单,被称为“点击狂人”,可以通过统计方法将其剔除。
离线模型+在线学习
国美互联网的推荐系统中离线模型和在线学习相辅相成。
离线模型主要是为了节省计算时间、加快响应速度,当然需要消耗一些缓存空间并牺牲一定的精度。例如,召回模型中会预置一些算法模型,并根据快照信息离线进行商品的初筛,使进入实时排序模型的商品量从千万级别减少为数百个,大大提高了实时排序的效率。目前国美互联网的召回模型中有 20-30 个算法模型,既保证了召回的多样性,也不至于给维护带来太多麻烦。
而在线学习则是为了提高排序的准确度,它能根据用户实时的行为数据对模型进行实时训练,使当前模型准确地反应用户当下的兴趣和倾向。但是使用在线学习也会引入新问题,比如在电商店庆日,用户的购买行为可能是非理性的,如果一味地使用在线学习将会给算法模型引入严重的偏差,因此国美的推荐系统会定期(每天或每隔几个小时)使用离线数据进行模型训练并对在线模型进行校准。
用户画像
对于电商来说,内部收集到的用户数据用来做用户画像肯定不如社交类网站的数据丰富,可能导致做出来的用户画像不够立体。因此国美互联网通过将用户行为映射到商品信息上来构建用户画像。比如用户行为(点击、关注或收藏等)涉及的一系列商品的属性(比如品类、品牌、中心词、价格等)作为用户行为的映射,刻画出用户感兴趣的商品,然后再结合用户标签(比如有车一族、户外运动爱好者等),完成用户画像的构建。目前用户画像在国美互联网主要用于商品召回和最终商品推荐时的过滤。
算法评测
对于个性化推荐排序来说,设定可量化的目标是非常重要的。
国美对算法的评估方式包括离线评测、在线 A/B 测试和算法覆盖率测试。离线评测常用的评估指标为 AUC、Logloss 和 NDCG,其中 AUC 和 Logloss 主要评估分类的准确率,而 NDCG 则是评估排序质量的指标。
实际效果
国美互联网采用 CTR/CVR/GMV 来对推荐排序算法的实际效果进行评估。与传统的推荐方法相比,使用机器学习和深度学习技术后的个性化推荐排序给国美互联网的 GMV、点击率和转化率都带来了更为显著的提升。
2017 年以来,凭借深度学习技术,离线模型和实时排序模型的质量大幅提升,尤其是 1-5 月份与 2016 年 1-5 月份相比提升效果十分显著,推荐 GMV 提升 70%、参与转化率 CVR 提升 100%。而 CTR 也有一组数据可供参考,采用个性化排序后,PC 订单页“猜你喜欢”展位 CTR 提升幅度 30.79%,PC 首页“猜你喜欢”展位 CTR 提升幅度 14.16%。
大数据+机器学习& 深度学习技术的力量着实惊人。
深度学习在国美的应用实践
自 2012 年 ImageNet 大赛技惊四座后,深度学习已经成为近年来机器学习和人工智能领域中关注度最高的技术。
国美 Plus 拍照购
国美互联网也展开了深度学习在图像识别中的研究,并且已经应用于国美 Plus 的拍照购功能,它可以根据用户上传的图片预测品类,推荐相关商品。
(点击放大图像)
当用户拍照或者从 PC 和手机选取商品图片上传成功以后,系统就会进行特征向量的计算及匹配。然后猜测用户想要的商品,根据商品图片库的相关结果进行展示。
(点击放大图像)
图像检索流程可以分为四步,分别是图像标注、提取特征、降维和匹配检索。
- 图像标注:对国美全站的商品图像进行标注,最主要的工作是数据清洗,即把不能和品类对应的图片删除或者重新进行品类校准;先统计国美全站最近一年内各品类下商品总数的分布,然后按照分布进行图片抽样。
- 提取特征:图片的特征分为通过深度学习得到的特征和图像局部特征。可利用 caffe 对 CNN 进行训练,将倒数第二层输出作为 Feature Learning 的结果提取出来 (Deep Learning + Transfer Learning);可利用局部特征算子 (SIFT、kaze 等) 提取出图像的局部特征。
- 降维:用积量化等方法对深度学习特征和图像局部特征进行编码和降维。
- 匹配检索:采用最近邻搜索的方法找出每一个商品的相似商品集合。
图像识别与推荐
基于拍照购,国美还将图像识别融合到了个性化推荐、相似推荐和搭配购推荐中。
用户行为+商品内容=更精确的推荐
杨骥认为,电商领域传统的基于用户行为构建个性化推荐系统存在一定的局限性。
基于用户行为的推荐系统以用户的浏览、点击、收藏、关注、加入购物车、下单等行为作为数据基础,来分析用户可能的购物倾向。对于用户来说,从进入网站或 APP 开始浏览商品、到考虑是否购买、最终到下单是一个连续的过程,但对于算法工程师来说得到的只是日志中几个离散的记录,信息量严重不足,通过这些有限的信息难以推测用户完整的购物决策过程。杨骥认为,除了用户行为,还应该重点考虑商品的内容(比如商品信息主图、商品详情页图片、标题、广告用语和风格等)能够对用户产生多大的冲击。目前国美互联网推荐团队的工作更多地侧重于内容方面。
国美互联网搜索推荐团队利用深度学习技术(如 CNN 卷积神经网络、目标检测等)对商品主图、详情页图片进行分析和描述,将图片(非结构化数据)转成文字(结构化数据)并存放到数据库里,以便后续分析时调用。他们由此构建了一个基于图像识别的相似召回模型,将其与基于用户行为的召回模型融合在一起,在此基础上进行线上交互。如此一来得到了更多刻画用户、刻画商品的维度,提升了召回模型的精准度和多样性,效果优于仅仅关注用户的点击、关注、购买等行为。
“推荐系统并非 0 和 1 的问题,而是要最大化用户购买概率。先满足 80%用户的大体需求,然后再对 20%的用户进行精细的需求雕刻。”
迁移学习辅助小数据集训练
利用机器学习和深度学习构建推荐场景时,最大的难点是数据源头,而深度学习对训练数据量要求很高,并不是每个机器学习问题都有足够多的训练数据。因此国美也尝试将深度学习与迁移学习(Transfer Learning)结合起来。
仍以拍照购功能为例,拍照购涉及到图像相似性检索的问题。而已经有很多人针对已有的海量数据训练出了不同任务场景下的模型,因此我们可以借助别人训练好的模型,在国美互联网商品库中再次训练并进行精调,使模型达到应用所需的要求。
未来的挑战
目前,国美大数据中心正在进行国美深度学习云平台(Gome CloudDL)的开发,使之能够支持各业务线在风控、图像分类、自然语言处理、人脸识别、推荐、搜索、广告等场景下的需求。Gome CloudDL 基于 TensorFlow 和 Docker 搭建,能够实现多任务资源的隔离、基于 Kubernetes 的调度、模型的持久化存储、TensorFlow 与 Spark 无缝集成等功能。
拍照购项目会继续在图像分割、实拍图处理、深度学习模型压缩、分布式搜索等方面进行优化,提高召回精度。
除了在召回模型中使用 CNN,我们接下来会尝试利用 RNN 来“捕捉”用户在点击序列中的模式,即利用用户点击行为发生先后顺序进行推荐和搜索的展示排序。同时还会进行深度强化学习(Deep Reinforcement Learning)的算法开发,根据用户所处的场景,在交互的过程中动态地推荐商品、活动、主题等,将传统的“商品推荐”升级成“场景式推荐”。
国美互联网大数据中心如同人工智能技术在国美的一片试验田,还有更多创新项目将在这里孵化。未来道阻且长,但探索的脚步不会停下。
关于采访嘉宾
杨骥 ,国美互联网大数据中心副总监。毕业于中国传媒大学并获得博士学位,博士阶段研究方向主要是计算机视觉和机器学习,包括图像的目标识别和语义分割。先后任职于凡客、京东,曾是京东 PC 首页与 APP 首页个性化推荐的开发者。多年来致力于个性化推荐系统与算法的研究和实践,目前专注于社交电商领域的深度学习技术。
转自 http://ift.tt/2vNjzzC
The post 深度学习打造精准推荐系统,细说国美互联网 AI 发展的进击之路 appeared first on Linuxeden开源社区.
http://ift.tt/2wWl8A8颜值即正义,超好用的 Linux 桌面个性化工具推荐
对于系统桌面,有人追求美观,有人追求简洁,有人追求实用,也有人就是喜欢默认的设置效果。接下来,推荐几款适用于 Linux 的开源桌面个性化工具,代码敲累了的时候,换换主题,说不定也能让你更放松。
1、Arc
一款主打透明元素的扁平化主题,支持基于 GTK 3 和 GTK 2 的桌面环境,如 GNOME、Unity、Budgie、Pantheon、Xfce、MATE 等,内含 3 种不同的风格可供选择。
Arc
Arc-Darker
Arc-Dark
2、Flatabulous
一款扁平化主题,适用于 Ubuntu 以及其它基于 Gnome 的 Linux 系统。
3、Adapta
一款自适应的 Gtk+ 主题,遵循当前比较流行的 Material Design 设计风格。支持 GNOME、Budgie、Cinnamon、Unity、XFce4、Mate、LXDE 等桌面环境。
4、Numix
一款结合了明暗元素的现代化平面主题,支持 Gnome、Unity、XFCE 和 Openbox 。
5、La Capitaine
这是一个图标主题,目标是适配大部分桌面环境。里面的图标受 macOS 和 Material Design 启发,主要是使用视觉上容易吸引眼球的渐变、阴影和简单的几何形式元素。
6、Papirus
基于非开源的 Paper 主题,并有一些额外的特性(如硬编码托盘支持,kde 颜色方案支持,libreoffice 图标主题,filezilla 主题,smplayer 主题…)以及其它的修改的 SVG 图标主题。有 Papirus 、Papirus Dark、Papirus Light、ePapirus 四种风格可供选择。
7、Hardcode Tray
这是一个托盘脚本,通过在 Linux 中自动探测你的默认主题,正确的图标尺寸,硬编码内嵌图标应用,以及正确的状态图标,来修正硬编码的托盘图标。它还支持上面提到的 Numix 和 Papirus 。
The post 颜值即正义,超好用的 Linux 桌面个性化工具推荐 appeared first on Linuxeden开源社区.
http://ift.tt/2vO9Xo3如何理解分布式系统的指标和警报

作者 Beining
John Corrigan 在他的文章中对分布式系统的指标和警报进行了提纲挈领的分析。
分布式系统的指标和警报允许运维人员检测分布式系统的故障,并帮助他们快速诊断出错位置。
指标
指标是按特定时间间隔收集的系统信息;指标存储后可以进一步处理,例如进行可视化或触发警报等。
作者认为,指标可以分为 3 类:输入指标、输出指标和过程指标。
- 输入指标 对系统的入口进行度量,例如,用户请求数、请求的某个特征(资源/项目/产品)的数量,以及请求的来源、数据包大小等。
- 输出指标 对系统的输出进行度量,例如,成功订单数、不成功订单数、大家关心的用户请求响应时间等。 好的输出指标可以近似为每分钟系统赚取的利润。
- 过程指标 对系统内部操作进行度量,例如平均负载、可用内存、可用磁盘空间、可用 inode 数等,也可以对某个程序进行度量,例如某个 API 的重试次数等。
作者指出,有时指标间没有明确的界限:以 HTTP 代码为例,2xx 和 5xx 代码是输出指标,4xx 一般是输入指标,但是如果错误是对之前请求的数据进行操作后造成的,也可以当做输出指标。3xx 的类别完全取决于应用程序。在多个模块、组件、服务等组成的大型系统中,每个模块都可以有自己的 3 种指标。
作者认为,各个指标的用途不同:输出指标代表问题是否存在以及确定问题的严重程度;输入指标可以指出问题的位置是本系统还是上游系统;一旦确定故障点,可以通过过程指标深入了解问题。
作者强调,所有的指标都应该定期汇总,而且应当可以快速反映问题。 好的指标在运行正常时不会出现波动,在出现问题时应反应灵敏。
警报
如果出现故障,系统应该报警:某个指标出现了异常的变化。
作者对警报进行了分级:
- SEV 1:故障如果不及时处理会严重影响业务连续性,造成大量利润损失或者违反法律法规
- SEV 2:故障会影响业务,例如订单成功率下降 10%,客户响应慢了 10 倍,导致部分员工不能工作等
- SEV 3:故障导致系统出现严重问题,例如服务器严重过载,部分请求出现错误,但是不影响业务,输出看起来比较正常
- SEV 4:故障导致了一些异常但不严重
作者认为,对警报相对应的反应是:
- SEV 1:呼叫整个团队,立即组织人马处理,开始公关,迅速 debug,申请大量资金。这种情况下最好不需要大量人手处理
- SEV 2:呼叫有权限和经验的相关人员,将 debug 作为最高优先事项
- SEV 3:在 Slack 上记录或开工单,尽快解决问题
- SEV 4:除非资源足够否则不干预,更多关注的是导致这种事件的数量、频率等指标:这些深层次问题可以成为 SEV 3 事件
总结
作者总结道,整个系统需要至少一个输出指标,最好是每分钟赚取利润的近似值:例如,每分钟投放的广告、每分钟的页面展示数、每分钟的流量、每小时上传的图片等。在响应中包含用时也是好办法。
作者对数据的理解是:对于汇总指标,例如某些值的总和或平均值以及客户请求的平均延迟,应该生成数个指标。记得要记录指标包含的数据点数量,也可以考虑包括分位数(p0、p25、p50、p75、p90、p99 和 p100 等)。有时,众数和中位数也有用。如果输入值呈正态分布,指标应包括标准差。
作者指出,对于 SEV 1 和 SEV 2 事件应当提供可预见的警报:
- 指标干净,不会被随机噪声淹没。在更长的时间内进行平均处理有可能可以降低噪声,也可以动态修改平均值;
- 影响显著,不能由噪音引起;
- 必须人为干预才能恢复,对于短时间自动恢复的问题不需要呼叫人员;
- 和故障强相关的时序指标,例如,MySQL 的历史列表不断加长在几个小时后几乎一定会演变为故障。指标与故障的相关性必须极强,以免造成告警疲劳。在 SEV 2 的情况下,如果故障概率是 50%而工程师在睡觉,那么可以等到故障发生时再进行呼叫。
作者提醒,如果某台主机出现负载、CPU 占用、磁盘空间、内存空间等指标报警,考虑是否出现架构弱点:不要为此设置警报,在此之前就把冗余和灾备做好。
查看英文原文 :Operational Metrics and Alerts for Distributed Software Systems
转自 http://ift.tt/2gtsJiF
The post 如何理解分布式系统的指标和警报 appeared first on Linuxeden开源社区.
http://ift.tt/2eIWCrICaffe 的深度学习训练全过程
作者 冯超
本文为大数据杂谈 4 月 20 日微信社群分享内容整理。
今天的目标是使用 Caffe 完成深度学习训练的全过程。Caffe 是一款十分知名的深度学习框架,由加州大学伯克利分校的贾扬清博士于 2013 年在 Github 上发布。自那时起,Caffe 在研究界和工业界都受到了极大的关注。Caffe 的使用比较简单,代码易于扩展,运行速度得到了工业界的认可,同时还有十分成熟的社区。
对于刚开始学习深度学习的同学来说,Caffe 是一款十分十分适合的开源框架。可其他同类型的框架,它又一个最大的特点,就是代码和框架比较简单,适合深入了解分析。今天将要介绍的内容都是 Caffe 中成型很久的内容,如今绝大多数版本的 Caffe 都包含这些功能。关于 Caffe 下载和安装的内容请各位根据官方网站指导进行下载和安装,这里就不再赘述了。
一个常规的监督学习任务主要包含训练与预测两个大的步骤,这里还是以 Caffe 中自带的例子——MNIST 数据集手写数字识别为例,来介绍一下它具体的使用方法。
如果把上面提到的深度学习训练步骤分解得更细致一些,那么这个常规流程将分成这几个子步骤:
- 数据预处理(建立数据库)
- 网络结构与模型训练的配置
- 训练与在训练
- 训练日志分析
- 预测检验与分析
- 性能测试
下面就来一一介绍。
1 数据预处理
首先是训练数据和预测数据的预处理。这里的工作一般是把待分析识别的图像进行简单的预处理,然后保存到数据库中。为什么要完成这一步而不是直接从图像文件中读取数据呢?因为实际任务中训练数据的数量可能非常大,从图像文件中读取数据并进行初始化的效率是非常低的,所以很有必要把数据预先保存在数据库中,来加快训练的节奏。
以下的操作将全部在终端完成。第一步是将数据下载到本地,好在 MNIST 的数据量不算大,如果大家的网络环境好,这一步的速度会非常快。首先来到 caffe 的安装根目录——CAFFE_HOME,然后执行下面的命令:
cd data/mnist ./get_mnist.sh
程序执行完成后,文件夹下应该会多出来四个文件,这四个文件就是我们下载的数据文件。第二步我们需要调用 example 中的数据库创建程序:
cd $CAFFE_HOME ./examples/mnist/create_mnist.sh
程序执行完成后,examples/mnist 文件夹下面就会多出两个文件夹,分别保存了 MNIST 的训练和测试数据。值得一提的是,数据库的格式可以通过修改脚本的 BACKEND 变量来更换。目前数据库有两种主流选择:
- LevelDB
- LmDB
这两种数据库在存储数据和操纵上有一些不同,首先是它们的数据组织方式不同,这是 LevelDB 的内容:
这是 LMDB 的内容:
从结构可以看出 LevelDB 的文件比较多,LMDB 的文件更为紧凑。
其次是它们的读取数据的接口,某些场景需要遍历数据库完成一些原始图像的分析处理,因此了解它们的数据读取方法也十分有必要。首先是 LMDB 读取数据的代码:
其次是 LevelDB 读取的代码:
最后回到本小节的问题:为什么要采用数据库的方式存储数据而不是直接读取图像?这里可以简单测试一下用 MNIST 数据构建的这两个数据库按序读取的速度,这里用系统函数 time 进行计时,结果如下:
为了比较原始图像读入的速度,这里将 MNIST 的数据以 jpeg 的格式保存成图像,并测试它的读取效率(以 Caffe python 使用的 scikit image 为例),代码如下所示:
最终的时间如下所示:
由此可以看出,原始图像和数据库相比,读取数据的效率差距还是蛮大的。虽然在 Caffe 训练中数据读入是异步完成的,但是它还是不能够太慢,所以这也是在训练时选择数据库的原因。
至于这两个数据库之间的比较,这里就不再多做了。感兴趣的各位可以在一些大型的数据集上做一些实验,那样更容易看出两个数据集之间的区别。
2 网络结构与模型训练的配置
上一节完成了数据库的创建,下面就要为训练模型做准备了。一般来说 Caffe 采用读入配置文件的方式进行训练。Caffe 的配置文件一般由两部分组成:solver.prototxt 和 net.prototxt(有时会有多个 net.prototxt)。它们实际上对应了 Caffe 系统架构中两个十分关键的实体——网络结构 Net 和求解器 Solver。先来看看一般来说相对简短的 solver.prototxt 的内容,为了方便大家理解,所有配置信息都已经加入了注释:
为了方便大家理解,这里将 examples/mnist/lenet_solver.prototxt 中的内容进行重新排序,整个配置文件相当于回答了下面几个问题:
- 网络结构的文件在哪?
- 用什么计算资源训练?CPU 还是 GPU?
- 训练多久?训练和测试的比例是如何安排的,什么时候输出些给我们瞧瞧?
- 优化的学习率怎么设定?还有其他的优化参数——如动量和正则呢?
- 要时刻记得存档啊,不然大侠得从头来过了……
接下来就是 net.prototxt 了,这里忽略了每个网络层的参数配置,只把表示网络的基本结构和类型配置展示出来:
name: "LeNet" layer { name: "mnist" type: "Data" top: "data" top: "label" } layer { name: "conv1" type: "Convolution" bottom: "data" top: "conv1" } layer { name: "pool1" type: "Pooling" bottom: "conv1" top: "pool1" } layer { name: "conv2" type: "Convolution" bottom: "pool1" top: "conv2" } layer { name: "pool2" type: "Pooling" bottom: "conv2" top: "pool2" } layer { name: "ip1" type: "InnerProduct" bottom: "pool2" top: "ip1" } layer { name: "relu1" type: "ReLU" bottom: "ip1" top: "ip1" } layer { name: "ip2" type: "InnerProduct" bottom: "ip1" top: "ip2" } layer { name: "loss" type: "SoftmaxWithLoss" bottom: "ip2" bottom: "label" top: "loss" }
这里只展示了网络结构的基础配置,也占用了大量的篇幅。一般来说,这个文件中的内容超过 100 行都是再常见不过的事。而像大名鼎鼎的 ResNet 网络,它的文件长度通常在千行以上,更是让人难以阅读。那么问题来了,那么大的网络文件都是靠人直接编辑出来的么?不一定。有的人会比较有耐心地一点点写完,而有的人则不会愿意做这样的苦力活。实际上 Caffe 提供了一套接口,大家可以通过写代码的形式生成这个文件。这样一来,编写模型配置的工作也变得简单不少。下面展示了一段生成 LeNet 网络结构的代码:
最终生成的结果大家都熟知,这里就不给出了。
layer { name: "data" type: "Data" top: "data" top: "label" transform_param { scale: 0.00390625 mirror: false } data_param { source: "123" batch_size: 128 backend: LMDB } } layer { name: "conv1" type: "Convolution" bottom: "data" top: "conv1" convolution_param { num_output: 20 kernel_size: 5 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" } } } layer { name: "pool1" type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { pool: MAX kernel_size: 2 stride: 2 } } layer { name: "conv2" type: "Convolution" bottom: "pool1" top: "conv2" convolution_param { num_output: 50 kernel_size: 5 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" } } } layer { name: "pool2" type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { pool: MAX kernel_size: 2 stride: 2 } } layer { name: "ip1" type: "InnerProduct" bottom: "pool2" top: "ip1" inner_product_param { num_output: 500 weight_filler { type: "xavier" } bias_filler { type: "constant" } } } layer { name: "relu1" type: "ReLU" bottom: "ip1" top: "ip1" } layer { name: "ip2" type: "InnerProduct" bottom: "ip1" top: "ip2" inner_product_param { num_output: 10 weight_filler { type: "xavier" } bias_filler { type: "constant" } } } layer { name: "loss" type: "SoftmaxWithLoss" bottom: "ip2" bottom: "label" top: "loss" }
大家可能觉得上面的代码并没有节省太多篇幅,实际上如果将上面的代码模块化做得更好些,它就会变得非常简洁。这里就不做演示了,欢迎大家自行尝试。
3 训练与再训练
准备好了数据,也确定了训练相关的配置,下面正式开始训练。训练需要启动这个脚本:
然后经过一段时间的训练,命令行产生了大量日志,训练过程也宣告完成。这时训练好的模型目录多出了这几个文件:
很显然,这几个文件保存了训练过程中的一些内容,那么它们都是做什么的呢?*caffemodel*文件保存了 caffe 模型中的参数,*solverstate*文件保存了训练过程中的一些中间结果。保存参数这件事情很容易想象,但是保存训练中的中间结果就有些抽象了。solverstate 里面究竟保存了什么?回答这个问题就需要找到 solverstate 的内容定义,这个定义来自 src/caffe/proto/caffe.proto 文件:
从定义中可以很清楚的看出其内容的含义。其中 history 是一个比较有意思的信息,他存储了历史的参数优化信息。这个信息有什么作用呢?由于很多算法都依赖历史更新信息,如果有一个模型训练了一半停止了下来,现在想基于之前训练的成果继续训练,那么需要历史的优化信息帮助继续训练。如果模型训练突然中断训练而历史信息又丢失了,那么模型只能从头训练。这样的深度学习框架就不具备“断点训练”的功能了,只有” 重头再来” 的功能。现在的大型深度学习模型都需要很长的时间训练,有的需要训练好几天,如果框架不提供断点训练的功能,一旦机器出现问题导致程序崩溃,模型就不得不重头开始训练,这会对工程师的身心造成巨大打击……所以这个存档机制极大地提高了模型训练的可靠性。
从另一个方面考虑,如果模型训练彻底结束,这些历史信息就变得无用了。caffemodel 文件需要保存下来,而 solverstate 这个文件可以被直接丢弃。因此这种分离存储的方式特别方便操作。
从刚才提到的“断点训练”可以看出,深度学习其实包含了“再训练”这个概念。一般来说“再训练”包含两种模式,其中一种就是上面提到的“断点训练”。从前面的配置文件中可以看出,训练的总迭代轮数是 10000 轮,每训练 5000 轮,模型就会被保存一次。如果模型在训练的过程中被一些不可抗力打断了(比方说机器断电了),那么大家可以从 5000 轮迭代时保存的模型和历史更新参数恢复出来,命令如下所示:
这里不妨再深入一点分析。虽然模型的历史更新信息被保存了下来,但当时的训练场景真的被完全恢复了么?似乎没有,还有一个影响训练的关键因素没有恢复——数据,这个是不容易被训练过程精确控制的。也就是说,首次训练时第 5001 轮迭代训练的数据和现在“断点训练”的数据是不一样的。但是一般来说,只要保证每个训练批次(batch)内数据的分布相近,不会有太大的差异,两种训练都可以朝着正确的方向前进,其中存在的微小差距可以忽略不计。
第二种“再训练”的方式则是有理论基础支撑的训练模式。这个模式会在之前训练的基础上,对模型结构做一定的修改,然后应用到其他的模型中。这种学习方式被称作迁移学习(Transfer Learning)。这里举一个简单的例子,在当前模型训练完成之后,模型参数将被直接赋值到一个新的模型上,然后让这个新模型重头开始训练。这个操作可以通过下面这个命令完成:
执行命令后 Caffe 会像往常一样开始训练并输出大量日志,但是在完成初始化之后,它会输出这样一条日志:
这条日志就是在告诉我们,当前的训练是在这个路径下的模型上进行”Finetune”。
4 训练日志分析
训练过程中 Caffe 产生了大量的日志,这些日志包含很多训练过程的信息,非常很值得分析。分析的内容有很多,其中之一就是分析训练过程中目标函数 loss 的变化曲线。在这个例子中,可以分析随着迭代轮数不断增加,Softmax Loss 的变化情况。首先将训练过程的日志信息保存下来,比方说日志信息被保存到 mnist.log 文件中,然后用下面的命令可以将 Iteration 和 Loss 的信息提取并保存下来:
提取后的信息可以用另一个脚本完成 Loss 曲线的绘图工作:
import matplotlib.pyplot as plt x = [] y = [] with open('loss_data') as f: for line in f: sps = line[:-1].split() x.append(int(sps[0])) y.append(float(sps[1])) plt.plot(x,y) plt.show()
结果如图 1 所示,可见 Loss 很快就降到了很低的地方,模型的训练速度很快。这个优异的表现可以说明很多问题,但这里就不做过多地分析了。
除此之外,日志中输出的其他信息也可以被观察分析,比方说测试环节的精确度等,它们也可以通过上面的方法解析出来。由于采用的方法基本相同,这里有不去赘述了,各位可以自行尝试。
正常训练过程中,日志里只会显示每一组迭代后模型训练的整体信息,如果想要了解更多详细的信息,就要将 solver.prototxt 中的调试信息打开,这样就可以获得更多有用的信息供大家分析:
debug_info:true
调试信息打开后,每一组迭代后每一层网络的前向后向计算过程中的详细信息都可以被观测到。这里截取其中一组迭代后的日志信息展示出来:
如果想要对网络的表现做更多地了解,那么分析这些内容必不可少。
5 预测检验与分析
模型完成训练后,就要对它的训练表现做验证,看看它在其他测试数据集上的正确性。Caffe 提供了另外一个功能用于输出测试的结果。以下就是它的脚本:
脚本的输出结果如下所示:
除了完成测试的验证,有时大家还需要知道模型更多的运算细节,这就需要深入模型内部去观察模型产生的中间结果。使用 Caffe 提供的借口,每一层网络输出的中间结果都可以用可视化的方法显示出来,供大家观测、分析模型每一层的作用。其中的代码如下所示:
执行上面的代码就可以生成如图 2 到图 5 这几张图像,它们各代表一个模型层的输出图像:
这一组图展示了卷积神经网络是如何把一个数字转变成特征编码的。这样的方法虽然可以很好地看到模型内部的表现,比方说 conv1 的结果图中有的提取了数字的边界,有的明确了前景像素所在的位置,这个现象和第 3 章中举例的卷积效果有几分相似。但是到了 conv2 的结果图中,模型的输出就变得让人有些看不懂了。实际上想要真正看懂这些图像想表达的内容确实有些困难的。
6 性能测试
除了在测试数据上的准确率,模型的运行时间也非常值得关心。如果模型的运行时间太长,甚至到了不可用的程度,那么即使它精度很高也没有实际意义。测试时间的脚本如下所示:
Caffe 会正常的完成前向后向的计算,并记录其中的时间。以下是使一次测试结果的时间记录:
可以看出在性能测试的过程中,Lenet 模型只需要不到 1 毫秒的时间就可以完成前向计算,这个速度还是很快的。当然这是在一个相对不错的 GPU 上运行的,那么如果在一个条件差的 GPU 上运行,结果如何呢?
可以看到不同的环境对于模型运行的时间影响很大。
以上就是模型训练的一个完整过程。现在相信大家对深度学习模型的训练和使用有了基本的了解。实际上看到这里大家甚至可以扔下书去亲自实践不同模型的效果,开始深度学习的实战之旅。
最后放一张 Caffe 源代码的架构图,以方便大家研究 Caffe 源码。
(点击放大图像)
答疑环节
Q1. Caffe 和其他深度学习框度 (如 MxNet, Tensorflow 等) 比有什么优缺点?
冯超 :Caffe 作为“老一代”的深度学习框架,从架构上来说有一个很大的不同之处,那就是它不是采用符号运算的方式进行设计的,这样带来了一些优点和缺点。
优点是 Caffe 在计算过程中,在内存使用和运算速度方面都有一定的优势,内存使用较小,速度也比较有保证,相对而言,基于符号计算的框架在这两方面会稍弱一些。
缺点是 Caffe 模型灵活性较弱。对于一些新出现的网络模型结构,Caffe 适配起来需要一些技巧,需要一定的经验,而 MXNet,TensorFlow 这样的模型就简单很多。
所以一般来说,MXNet、Tensorflow 更适合实验环境,Caffe 比较适合工业界线上使用。其他方面,现在 Caffe 的社区相比 Tensorflow 可能要弱些,但依然是非常主流的开源框架。
Q2. 如何看待 facebook 新发布的 caffe2 深度学习框架?它比现有的 caffe 有什么样的改进?跟现在的 TensorFlow 相比如何?
冯超 :caffe2 最近比较热,之前我没有多看过,这两天集中看了看,大概有以下一些感受:
- 有了 Caffe2 和 Caffe 相比变化大么?prototxt 和 caffemodel 海斗可以用,基本上算向下兼容,Caffe 的一些知识技能还可以用。
- Caffe2 的操作方式?从官方文档中看,Caffe2 的 python 接口有了很大的进步。给出的示例主要是用 python 代码描述网络结构(和 tf 很像,也有 checkpoint 等概念)-> 生成内存版的网络模型-> 构建 net 和相关环境-> 执行代码,所以除了前面的 python 接口,后面的流程和 caffe1 很像。
- 内部架构上的变化?Caffe2 借鉴了 Tensorflow 的一些概念,将过去的 Net 拆成两部分:数据和网络图。数据部分是 Workspace,和 tf 的 session 很像,另外一部分是网络图 net。另外,Caffe2 内部也将 Layer 改成了 Op。
- 现在就上手 Caffe2?几乎有点早,目前官方给出的内容还比较少,大家也不必太心急。
- 最后说说 Caffe2 官方给出的一些亮点功能:跨平台。这一次的 Caffe2 可以在各种不同的平台上部署运行,这算是一个亮点。
Q3. caffee 和 pytorch 都是 facebook 在推,那这两个框架有什么不同呢?
冯超 :基本上实验环境下主要用 pytorch, 线上环境用 Caffe。
Q4. caffe 有没有提供一些 preTraining 的一些模型 方便更快地调用网络呢?
冯超 :Caffe 有自己的 Model zoo,详情可以上去看一看。
Q5. caffe 在移动端实践的实际案例吗?
冯超 :就我身边有限的了解,一些公司做移动端尝试还是使用了 Tensorflow,并没有用 Caffe。
作者介绍
冯超 ,毕业于中国科学院大学,现就职于猿辅导公司,从事视觉与深度学习的应用研究工作。自 2016 年起在知乎开设了自己的专栏——《无痛的机器学习》,发表一些机器学习和深度学习的文章,收到了不错的反响。
转自 http://ift.tt/2gsPu6u
The post Caffe 的深度学习训练全过程 appeared first on Linuxeden开源社区.
http://ift.tt/2eJ2rVX