《深度学习算法实践》_sample


8l'Oa 由iew ® 一站式了解深度学习算法,结合实际工作快速上手! | 深度学习 算法实践 吴岸城编著 深层学习算法实践 穹二'f :I. '常也鼠祉· Publishing House of Electronics Industry 北京 •BEIJING 吴岸城编著 内容简介 本书以一位软件工程师在工作中遇到的问题为主线,阐述了如何从软件工程思维 向算 法思维 转变、如何将任 务分解 成 算法 问题, 并结合程序员在工作中经常面临的产 品 需求 ,详细阐述了应该怎样从算法的角度看待、分解 需求 , 并结合经典的任务对深 度学习算法做了清 晰的分析 。 本书在表达上深入浅出,让有志于学习深度学习的 读者,能够快速 地理解核心 所 在 ,并顺利上手实践 。 未经许可,不得以任何方式复制或抄袭本书之部分或 全部内容。 版权所有,侵权必究 。 图书在版编目( CIP )数据 深度学习算法实践/吴岸城编著 . 一北京:电子工业出版社, 2017 . 7 ISBN 978-7-121-31793-4 I .①深… II. ①吴… III. ①机器学习一算法 N ① TP181 中国版本图书馆 CIP 数据核 字( 2017 )第 129958 号 策 划编辑:刘饺 责任编辑 :郑柳 洁 印 刷: 三 河市鑫金马印装有限公司 装 订: 三 河市鑫金马印装有限公司 出版发行:电子工业出版社 北 京 市海淀区万寿 路 173 信箱 邮编: 100036 开 本: 720 × 1000 1/ 16 印张 : 13.5 字数 : 204 千字 版 次 : 2017 年 7 月第 l 版 印 次 : 2017 年 7 月第 1 次印刷 定 价: 79.00 元 凡所购买电子工业出版社图书有缺损问题,请向购 买书店调换。若书店售缺 , 请与本 社发行部联系,联系及邮购电话:( 010) 88254888, 88258888 。 质量投 诉 请发邮 件 至 zlts @ phei . com.cn ,盗版 侵权举报请发邮件至 dbqq@ phei . com .cn 。 本书咨询联系方式 : 010-51260888-819 , faq@phei.com . cn 。 目。 随着机器智能的进步,人类预测技能的价值将会降低 。 原因在于机器预测比人工 预测更为低价和优质 ,正如机器算数肯定比人力算数更为迅速准确 。 然 而,这却并不 像许多专家预言 的意味着人类工作的末日,因为人类判断技能的价值将得以凸显 。 用 经济学 语言表述就是,判断是预测的互补品,因此当预测的成本降低 ,对判断的需求 就会增大 。 一- The Simple Economics of Machine In telligence, 《 哈佛商业评论 》 当年互 联网的大潮席卷 一 切时,数字通信技术被认为将颠覆商业、改变一切 。 之 后的移动互 联网也在某种程度上被认为将颠覆商 业 。 经济学家总体上并没有被当时的 互联 网 、泡沫所忽悠 。 现如今,有关人工智能的报道铺天盖 地, 有昔日“新经济 ”也沫之势 。 这一次, 基本 的经济学原理和框架就足以帮助我 们理解和预测这 一 技术形态对商业产生的影 响 。 技术革命往往会使某些重要活动 的成本降低,比如说通信或搜索信息等活动 。 究 其实质 ,人工智能或者机器智能( Machine Intelligence )是 一 项预测技术,因此它的 经济影 响将围绕降低预测成本这个中心来展开 。 对于已经身处这个大潮中的开发者、架构师、数据分析人员等 , 只能去拥抱这项 技术。深度学习并 不是 一 项凭 空冒 出来的技术,它在机器学习之上做了很多优化 。 本 I 深度学习算法实践 质上所有的有监督学习都是在探讨怎样无限地逼近目标函数(强化学习另外讨论), 而深度网络就是让机器代替人类提取特征的工作变得更有可能真正实现。在经济学家 的眼里,现阶段人工智能的本质是从预测(或分类问题)开始,我想通过几个实际的 例子来和大家聊聊这个话题;另一方面,我的团队在工作中积累了一些实际经验,我 们也希望能将这些经验贡献出来,如果能在某种程度上对读者有所帮助那就最好不过 了 。 以上两点,促成了本书的诞生 。 我写的前一本书(《神经网络与深度学习》,电子工业出版社出版)偏向于概念 讲解,因为写的时候深度学习并不普及,让大众了解深度学习的基本概念是最急迫的 目标。本书大部分内容则偏向于应用,因为无论是降低社会成本,还是发明创造出新 算法,都离不开实践 ;如果还能从实践中思考一些东西,那就是举一反三的能力了一 一这是我们人类独特的价值 。 所以在本书后面的强化学习、股票预测等章节,我们都 会留一些问题,读者可以亲自实践 ,用深度学习这个工具创造出更多的价值,更长远 地说,为推动强人工智能贡献自己的一份力量。 我一直相信,创造具有意识的 AI ,对所有的科技人员都是一种诱惑 ,尽管有可 能造出来就意味着人类的边缘化,但仍然要憋着劲儿去研究如何把它造出来一一这简 直就不像人类的自 由意志 , 更像背后有一只手在推动着,我想上帝在造人时的心情也 不过如此吧 。 本书面向有一定基础、在工作中对深度学习有一定实际需求的读者 ;也面向那些 有志于从传统的软件工程领域转型的工程师们 。 本书一共分为 6 章 。 第 1 章,主要讲从工程思维到算法思维的转变,对于有基础的读者来说稍显咿唆, 但很重要,希望读者能仔细阅读 。 第 2 章,阐述文本分析、文本深度特征等内容,已有基础的读者可以根据 自己的 需求部分略过。 第 3 章,主要介绍对话机器人的相关技术和发展 。 第 4 章,主要介绍视觉,以人脸检测为例,从传统的 OpenCV 模式识别做人脸检 测到用 CNN 网络做人脸表情识别 。 勾勒 CNN 的传承发展,讲述做图像分类 、目标 Iii.. IV 」牛 识 别等其 他应用 。 第 5 章 , 主 要讲区别于 一般的有监督学习的另一个问题 : 强化学习和 DQN 网 络 实 践 。 第 6 章 , 主 要讲预测与推荐,以股票为例,并同时讨论了深度学习在推荐领域的 应 用 。 本 书的 完成得到了团队的大力支持 : 张帅、郭晓璐提供了图像方面的支持 ; 周维 提供了 强化 学 习内 容 上的支持,在此衷心地感谢 他们 。 下 面是本书用到的环境说明 。 为 保持一 致性,本书所有的代码如无特殊说明都基于 Python 2.7 版本,系统环境 为 Ubun tu 16 . 04 ,以及所用到的 Ke ras 、 TensorFlow 、 MXNet 、 Caffe 、 Openface 、 openAI , Open CV 、 Dlib 、 NumPy 、 S ciPy 、 Gensim 、 Theano 等均为 2016 年 9 月的 最新版本 。 本 书的部分源代码整理在: https: // github.com/wac8 l /Book_ Deep Leaming_ Practice ,仅供研 究 使用,使用时 请注 明来源,如需用作商业或其他用途,请联系作 者取得 授权 。 v ~ 目录 1 开始 1.1 从传统的软件工程思维转型..................…............. .…........ .…. ............ 1 1.2 建立算法思维......................................................... . ............ ... .... . ......... 2 1.2.1 算法的开发流程..............................……...... .….. .................. ..... 3 1.2.2 做算法的步骤·········……......................… ..... ............. . ........ . ... .... 4 1.2.3 英特的总结....................................................... ..... ........... . ... .... 8 1.3 观察!观察 ! 观察!重要的事情说 三遍… ........... . .... . .................. .. . 11 2 文本分析实战 15 2.1 第 一 个文本问题................. ... .........…………........……·… .. .......... .. . .. .. ... 15 2.1.1 邮件标题的预处理··········································· · ··············· ······ 15 2.1.2 选用算法...........................…………………...... .. .………..... ... 18 2.1.3 用 CNN 做文本分类..... . ... . ..............…................... . ...... ......... 21 2.2 情感分类...... . ................................................................ . ............... . .. ... 24 2.2.1 先分析需求.. . ..........……................….......….. .. ...….......….. .. . .... 24 2.2 .2 词法分析.. .. .. .. .. .… ..................................….. ....... . .. ........ ...... 25 2.2.3 机器学习..................................... .... .................. . ........... ..... . .... 28 2.2.4 试试 LSTM 模型........... .. …………………··…….... ..... ......…. ....... 30 2.3 文本深度特征提取..... . .............…···· ·· · ··· ·····…............................... ...... 31 2 .3 .1 词特征表示....... . . …… …··..................... .. ............ ... ... .. . .............川 2 .3.2 句子特征表示·················…….........………………………... ....... 42 J牛 2.3.3 深度语义模型········ ·····……………………........…... ..... .. .... .. .... 51 3 做一个对话机器人 53 3.1 理解人类提问.......................................... . ....... .. ...... . ........………...... ... 56 3.2 答案的抽取和选择..............…... ... . . . …..... . .......................................... 57 3.3 蕴含关系…...............…….......…........ .… .... . . ................. . ... . .....…. . ... ... ... 62 3.4 生成式对话模型( Generative Model) ............ .. ... ....………………..... 63 3.5 判断机器人说话的准确性....……..... ... . . .. . ..........….. ............ . .. …......... 69 3.6 智能对话的总结和思考 .............….......... . ..........................................协 4 视觉识别 73 4.1 从人脸识别开始....................... . . .. ...…..... . .…...................................... 74 4.1.1 OpenCV 能做什么.................….. . .. .. .. . ...... ........ .... .. .. ... .......... 74 4.1.2 检测精度的进化 : Dlib .. .......... ... …........ .... ........ ..…... ........ .... 79 4.1.3 表情识别: Openface ....……........ ...............….......... ............... 83 4.2 深度卷积网络 .......................................... .. ......................................... 87 4.2.1 CNN 的演化过程........................ . .......................................... 87 4.2.2 深度卷积和更深的卷积.........…............................................. 96 4.2.3 实现更深的卷积网络 ........... .... .. .... . ... .. .... ... ....... . ......…...... .. 103 4.2.4 残差网络的实现. .. . ... .. . ... . . .... ................................................ 108 4.2.5 十全大补药:通用的提高精度的方法..................... . ... . ... . . 111 4.2.6 图像训练需要注意的地方..... . ......…….......….........….. . .. . ..... 116 43 目标检测..... . ........ ...….............................. ........ ...............…............... 125 4.3.l 用 SSD 来实现目标检测应用...............….......….......…..... . . 133 4.3.2 SSD 训练源码提示..........….......…… ... ... . .. .. ...….. ................. 136 4.4 视觉领域的应用 . ....................... .. ................................... . ............ .. . .. 138 4.4.1 艺术风格画 ... ..... .…… ... . ...…………... ..... ………….......….... . ..... 138 4.4 .2 看图说话 :用文字描述 一 幅图像 CBiRNN+CNN) ........ 140 4.4.3 CNN 的有趣应用 : 语音识别........................................ .. ... 142 5 强化学习实践 145 5.1 吃豆子和强化学习..... . . .. ......... . .......... .. ....... .. ................. . ... . ............ . 145 5.2 马尔科夫决策过程 . ......... .................................... ....................... ...... 147 5.3 理解 Q 网 络…............. . . ... ............................................................... . . 150 VII Allll 一γ 深度学习算法实践 5.4 模拟物理世界: OpenAI ....................... . ..... . ........ ....... . ... ...... . . .........四 5.5 实现一个 DQN ............. .........………........................... .. .. ... ............... 154 5.5.l DQN 代码实现..........…....... ..... ...... ........................... . .... .. .. . . 154 5.5.2 DQN 过程的图表化 ............ . ......... ... .. ... .. .. .... ... . . .................. 160 5.6 关于强化学习的思考.............…...... . .. . ........... .... ... ....... . ...... ... . ... ... .. . 163 5.6.1 强化学习 的特殊性 .. ..... . . ... . ... .. . . . …………… .. .. . . . … . .... ......... 163 5.6.2 知识的形成要素:记忆.. . .. ....…..............… . . .... . ........… ........ 165 5.6.3 终极理想:终身学习... . ............. .. . . ... .. ..… .... . .. …. . . . ........... .. 170 6 预测与推荐 173 6.1 从 Google 的感冒预测说起 ............. ... . .. . ....... . . .. ...................... . .. ..... 173 6.2 股票预测( 一 ) ................................................…·…... ....…...... ........ 175 6.2.1 股票业务整理..........….......…. . .....… . . ........ .. ....…................... 176 6.2.2 数据获取和准备................. . ..…. ............. . ............ ....…. ........ 179 6.2.3 模型搭建..... .…… .. ............ .. …......... . .................. .. ............ ..... 183 6.2.4 优化·· · ·······…................... . ..…... ....… . .. . . . .….. .. ...….... . ......... ..... 186 6.2.5 后续.. ... . .... ..... .... .. ............................. ... ..... ... .... . ..................... 187 6.3 股票预测( 二 ) ................... .......... .. .................... .. .......................... 189 6.4 深度学习在推荐领域的应用: Lookalike 算法.... ... … .. .. ....…....... . 197 6.4.1 调研.. . ..............….........……................. . ........ ....... .. .... .. ........... 198 6.4.2 实现·· · ············…………·.. . . ... ... ......... . . .............. .. . . ........... . ... ....却 1 6.4.3 结果.. . .........……............................ ... .... ...… …… …. ........ .. ...... 205 6.4.4 总结探讨·········…………………… ···· · ··…… .. .......... . . . ... . ... ... ..... . 205 参考文献 207 ‘ VIII 开始 1.1 从传统的软件工程思维转型 2013 年的秋天,这时英特已经从中国一流学府的计算机系毕业 3 年了,他所在 的这家公司早已在 纳斯达克上市,而英特已经成为这个公司的中层 。 这 3 年来,英特 初出茅庐 的那些热情已 经 被磨耐得差不多了,但他的心底还是在隐隐渴望着什么 。 对 如今的工作 ,他总觉得缺少些激情,总觉得有点按部就班 。 从当年的研发工程师到如 今的研发管理 中 层 的位 置 ,这种感觉 一直 如影随形 。 今天英 特被总 经理 叫到办公室讨论部门以后的规划,老板看最近大数据已经开始 火了,想要英特组建一个大数据的团队,这个团队主要是通过对公司数据仓库的迁移 和计算 , 看看能不 能打造出什么新产品 。 英特接手 此事后 , 便开始调研 , 发现如今只要 内部开始做大数据的公司,都无一 例外地弄了一个算法团队。然 而这些算法团队基本上对后期的想法和规划很不清晰, 感觉大家都是在摸着石头过河。于 是,英特也想配套着弄一个算法团队 。 略去大数据团队不说,单说算法团队 ,英特的公司 里就没有这样的 人才 。 这意味 着英特需要 开始招兵买马了 。英 特先从一家知名电商公司挖来了一名高级算法人才, 一寸 深度学习算 法实 践 然后照着行业内其他一些公司的做法 , 组建了相关的数据标注员,并在公司内部挑选 出了一些有经验的 Python 、 C ++工程师 。 现在英特面 临 着一个问题 : 大部分人员都是做工程的研发工程师,现在他们的 目 标是用编程语言实现算法 , 那么实现算法与之前做一个工程项目有区别吗?如果还按 照之前那样,从工程的角度思考问题,能否实现效果或者能否达到业务部门的 要 求呢? 英特开始时很乐观,正好这时公司的业务部门给算法团队提了第 一 个需求 一一 “先把垃圾邮件给过滤下吧,最好对于正式的邮件也做一 些分类,比如根据文本内 容 推荐重要或紧急邮件,对于一般邮件不做重点过滤 。 ”英特接到这个需求后,马上做 了些调研 , 发现这个需求就是一个分类需求,用任何 一 个分类器都可以比较快地搞 定 。 那英特如 何做呢?按照现有的软件工程的思维,是需求分析 今 逻辑设计 今 详细 设 计 今 测试 ’多 上线 , 整个过程英特非常熟悉 。 然而按照这种过程,算法团队的小朋 友 们 还没有干到逻辑设计这一步 , 就已经被业务部门催促了,“我们只要 一 个功能你们 动 作怎么这么慢”。在两个月的煎熬之后,英特总算给出了第一 个可以使用的模型, 用 在对重要邮件、垃圾邮件的分类中 。 但仅仅过去 一 天,英特的电话就被打爆了, 大家 几乎都在抱怨说,重要邮件被分到垃圾邮件中,非重要邮件被推荐了 。 英特感到很 委 屈,试图去解释,却又被业务部门讽刺了 一 顿 。 重新梳理了整个流程之后,英特 得出 一个结论 : 对于算法而言应该有算法的思维。不能完全套用以前做软件工程的那 套 东西 。 1.2 建立算法思维 看看业务部门抱怨的两点 : 第一,算法团队反应太慢 。 第二 ,没有达到预期效 果 。 从中我们隐约可以感觉到传统的软件工程思维并不适合做算法 。 下面,我 们 就和英特一起来梳理下为什么传统的软件工程思维不适合做算 法, 以 及算法的开发流程和步骤应该是怎样的? Iii. 2 平!立了 1 .2.1 算法的开发流程 用算法解决项目中的问题实际上是一 种 实验思维。实验思维顾名思义,就是我们 用初始数据做实验 ,输出 一些实验产物 ,对于 算法来说就是一些向量或矩 阵,也就是 一 堆数字 ,我们 得到这些数字后可 以开始反馈到现 实 业务中,用于比较输出值和 真正 的业务需求是不是具有一致性。所 以做算法的开发流程完全可以抽象为如图 1-1 所示 的框架图 。 @→i 服 结果输出/结 果评测 实检 稳定结果 图 1-1 算法开发流程 观察 举个例子 ,我们开发 一个算法 时,一般是要用来替代人的 一 部分工作的,所以我 们会先了解人是怎么完成这部分工 作的 。 比如邮件分类,就先来看看人是如何做邮件 分类的。 ( 1 )看邮件的标题,很多信息其实在标题上就有呈现 ; ( 2 ) 注意发件 人, 看用户名是 不是一堆无意 义的字符; ( 3 ) 看邮件内容 ,邮件内 容不用看完 ,优 先去找到一些重点,对于中文的垃圾/ 重要邮 件, 会看看有没有 “发 票 ”、 “讲座”、 “小姐”之类的词; ( 4 )如果邮件带附件,要对附件名进行仔细的距别 。 了解人是怎么来完成 邮件分类的,我们就完成了邮件分类算法的前期观察 。接着 我们将观测到的重要特征 抽象出来,这个时候可以人工选择特征,也可以用机器学习 的方法抽象一些特征。针对邮件分类 问题,我们可以用特征做分类算法,可以采取的 分类算法有很多,你既可以选用普通的 机器 学 习算法,比如贝叶斯、 SVM 、随机森 3 ~ 一寸-深 度学习算法实践 林等,也可以选用神经网络来进行分类。最后我们将结果回馈到我们观察的事物中 去, 简单地说 , 这一步是一个验证和调整的过程,这一步的好坏也直接决定了我们最 后的 结果是好是坏,这其实也是区分一个有经验的算法工程师和 一 个初级的算法工程师的 标准 。 刚才我们简单地了解了算法的开发流程,下面我们再来看看英特是如何做好观察 井一步一步完成需求的 。 1.2.2 做算法的步骤 根据前文所提到的开发流程,算法组决定根据以下 4 个步骤来分解邮件分 类问题 。 步骤一:明确有哪些需求 需求部 门 直接提出了哪些需求? 我们可以发现,直接需求非常简单 : “先把垃圾邮件给过滤下吧,最好对于正式 的邮件也做一些分类,比如根据文本内容推荐重要或紧急邮件,对于 一般邮件不做 重 点过滤。” 通过分解直接需求可以得出两个需求: ( 1 )过滤垃圾邮件 。 ( 2 )分类非垃圾邮件,建议分为 重要紧急邮件和一般邮件两类。 其实一般来说 , 直接需求都不难满足 ,这里按 字 面,意思设计两个分类器也行 ,或 者设计一个分类器直接将邮件分为垃圾类、重要类、紧急类 三类 也行 。 那么,除了直接需求之外,需求部门的隐含需求有哪些呢? 再次来看看英特被需求部门抱怨的两个点: ( 1 )慢 ! ( 2 )分类错误多! 从这里我们可以看出,需求部门的第一个期望是准确率高,第二个期望是速度能 更快 。 ‘ 4 ~ “大多数需求在提出时,对于准确率都是有要求的 !” 请大家记住这句话,并默 认这个 准确率在 95% 以上 。 对于一些诸如图片分类或者预测问题,我们根本达不到 这个准 确率的时候怎么办?如果限于目前的技术水平达不到,那就尽可能多地提高准 确率 ,去尝试多种算法和模型,因为解决大多数实际问题都不只是用一种算法或者一 个模型就能完 成的 。 如果最后还是达不到,或许可以换种方式引导客户,比如微软之前推出过一个根 据人脸识别年龄的 App 。 对于工业化来说,识别要求非常高,误差也只能在 ±2 岁之 内,而由于每个人的生长环境不同,人种不同,要用一个普遍意义上的模型达到这种 区分精度 几乎不可能 。 所以微软将这个功能加到 App 上并赋予它一个娱乐属性,就 是要大家 别当 真了 ,玩玩就好 。 从这里我们可以得到启发 , 如果达不到精度,算法工 程师或许可以和产品经理或需求部门商量,在客户引导层面规避对准确度过高的要求 。 步骤二:观察需求中涉及的问题 英特观察邮件分类问题的时候,体会了一下其 他公司的产品,发现它们的产品也 有分类错误 的时候,比如企鹅公司做的邮件分类,在垃圾邮件中确实几乎 100%都是 垃圾 邮件,而正式邮件中偶尔会出现垃圾邮件 。 但这些错误却不太影响人的主观感受 。 这是怎 么回 事 呢?原来人们在浏览这些正式邮件时,会自动剔除(跳过)垃圾邮件 。 而自家 的算法组做的模型是非常严格地区分垃坡邮件,有时候把正式邮件 也 当成垃圾 邮件处理了 :这可能 会导致用户错过非常重要的 邮件,因此这种结果对于用户来说简 直是 不可接受的 ! 这种情况表现到数据观察上 , 就是精确率低了 , 而召回率高了 。 这里我们引入三个概念 : 准确率( Accuracy ) 、 召回率( Recall )、精确率 ( Precision ) 。 准确率=提取出的正确信息条数/总样本条数 精确率=提取出的正确信息条数/提取出的信息条数 召回率=提取出的正确信息条数/样本中的信息条数 比如说某人的邮箱中有 1000 封正常邮件、 500 封垃圾 邮件和 100 封 重要邮件。 现在以找垃圾邮件为目标 ,模型一共找到 400 封垃圾邮件、 5 封重要邮件和 100 封正 常邮件 ,那么 三个 指标如下 。 5 Alli 一γ 深 度学习算法实践 准确率(垃圾邮件) = 400 / ( 1000+500+ 100 ) = 0.25 = 25% 一般来讲我们的准确 率不应只针对一类邮件来说 , 应该对于所有判断正确的邮件 而 言 ,这里包 含重要 邮件、 正常 邮件,所以 准确率的计算如下 。 准确率 = ( 400+5+ 100) I ( 1000+500+ 100 ) = 0 .2 53 = 25.3% 精确率(垃圾邮件) = 40 0/ ( 400+5+ 100) = 0 .79 = 79% 召回率(垃圾邮件) = 400 1500 = 0.8 = 80% 如果有 一 种模型能同时将精确率和召回 率提高那当然是最好的 , 但如果只能选择 其一的话,在这个邮件分类的案例中,我们应该选择精确率提高作为我们的目标 。 极端情况下,如果 算法组的模型只 出了 一个结果 ,而 且是准确的,那么精确率就 是 100% ,但 是召回率就很低 ;而如 果模型把所有结果都返回,那么召回 率是 100 %, 但是精确 率就会 很低 。 因此在不同的场合中需要自己判断希望精确率比较高还是 再回 率比较高 。 如何找到 一 个比较好的比例呢?如果 是读者自己做实验研究,可以绘制 Precision-Recall 曲 线来帮助分析(如图 1-2 所示) 。 1 ' . MM RWBnv AA 0.8 0.6 0.4 0. 2 C O 刊的 咧 U @ MA 嗣 0 0 1 0.8 0.4 0 . 6 Recall 0. 2 图 1-2 Precision-Recall 曲线 步骤三:开始算法工程的实践 英特在拿到需求后就开始开发算法了,但整体的进度和需求部门期 望 的进度还是 差距很大,这是英特没有跳出传统软件思维的束缚所导致的 。 、 6 1牛 对于需求部门来说,希望算法组非常快地给他 们一个结果,这样就可以先试试怎 么样?看看 缺点在哪里?有了目标才好继续改进。而英特用软件工程的方法把算法当 成了一 个系统来做,这显然错误地估计了需求部门的隐含需求,也使得自己非常被动 。 另外,对于算法的选用,也就是到底使用哪些算法处理业务问题 ,英特还是觉得 有些力不从心,哪些算法可以真正带来效果的提升,光凭想象是没有意义的,一切都 需要实践 ! 在后面 的 工作 中,英特越来越觉得盲目地使用算法,结果往往是消耗了大量时间、 精力而效果没有显著提高 ,对自己非常不利,也对整个算法团队不公平 。 那么更加务 实的方法 ,就是去理解数据,理解用户,从分析和挖掘需求出发,先解决关键问题, 再脚踏实 地、 一步步 优化效果 。 对数据理解足够深刻之后,算法工程师模型方面的知 识才能派上用场。对数 据和业务的理解需要时间沉淀,而对于模型的灵活运用需要深 厚的理论知识背景。 虽然这本书着重写的是算沽,但请大家谨记下面两句话。 数据(业务)和算法同等重要,甚至有时候更重要。 不要为了用算法而用算法。 步骤 四:测试 测试就是如何评价这个算法。现在英特 也很 头疼测试 , 在英特观察需求的时候 , 已经知道了三个用来评价模型好坏的基本参数 。 但我们要重新来谈谈有关准确率、精确率和召回率这三个参数的问题。 也许从 最 开始评 价模型时,研究者们只发明了准确率一个参数,因为准确率是指对于给定的测 试数据集 , 分类器正确分类的样本数与总样本数之比。在逻辑上这是非常清晰的 ,这 就好比我 们 一个人区分垃圾 邮件,找出真正的垃圾邮件占总邮件的多少,也能说明这 个人寻找垃圾邮件 的能力 。 然后马上就发 现这里有问题,我们稍微修改一下上面的数据,比如说某人的邮箱 中有 1000 封正常邮件, 5 封垃圾邮件, 10 封重要邮件。假设现在的一个模型是判别 正常邮 件的,明眼人 一看就知道,即使模型毫无作用,将一共 1015 封邮件都当成正 7 ... 一寸深 度学习算法实践 常邮件处理,这样准确率也能高达 1000/1015 = 0.985 = 98.5% ,而这个“啥也没做的 ” 所谓的模型是否真正地反映了处理能力? 看 到这里,我们知道了准确 率并不能真正评价一个模型的能力,所以研究者们 发 明了另外几个评价指标来判断,那就是精确率( Precision ) 、召回率 ( R巳 call )和 F1-Measure 。 这里再稍微说下 坷, F1 就是 Precision 和 Recall 的调和均值 : 2 1 1 ---- F1 P . R 把这个式子调整一下就得 到 : 所以我们从上面的例子来看,可以得到: F1 = 2 × 0.79 × 0.8/(0.79 + 0.8) = 0.794 = 79.4% F1-Measure 默认精确率和召回率的权重是一样的,但有些场景下,我们可能认 为 精确率会更加重要 , 这时可以通过调整参数得到相应式子 。 模型的测评指标有了 , 那如何对模型进行验证呢?有很多测试方法,比如 交叉验 证等,需要英特及整个算法组在后面积极思考和 善加利用。 假设现在已经将模型验证完了,英特也拿 到了评测数据, 这个模型是否可以投入 使用则需要根据这些测评指标来判断,通过不同的 参数调整得到相关的测评指标,然 后将这些测评指标进行比较 , 最后选出一个“最为平衡”的模型。注意,是“最为 平 衡”而不一定是某几个值最高,一切的出发点都以 实际业务为准。 1.2.3 英特的总结 在整个算法项目的研发过程中,英特 也 注意到前人早已对算法的研发流程总结 了 规律 。 这些规律已经形成了标准,有两种方法论, 一 种是 SPSS1 的 C 阳 SP - DM ,另 外 l 当然 现在 S PSS 已被 IBM 收购 了 , 这里还是称为 SPSS 。 ‘ 8 1牛 一 种是 SAS 搞的 SE~也仙 。 ( 1 )先来看看 CRISP-DM 流程 ( 如图 1-3 所示 ) 。 图 1-3 C RISP-OM 流程 对这个流程图中的每个步骤有如下解释。 • 商业理解( Busine ss Understanding ) : 找问题从而确定商业目标 。 • 数据理解( Dat a Understanding ) : 确定数据挖掘所需要的数据、数据的初 步探索。 • 数据准备( Data Pre p a ration ) : 选择数据、清理数据、调整数据格式使之适 合建模 。 • 建立模型( Modellin g ) : 选择数据挖掘模型 。 • 模型评估( Evaluation ):确定下一步怎么办 , 发布模型?还是对数据挖掘 的过程进行进 一 步的调整 , 产生新的模型? • 模型发布( Deployment ) : 把数 据 挖 掘的 结果送 到 相关 人 员手上、 对 模型 9 .... 一寸 深度学习算法实践 进行日常监测维护。 ( 2 ) SAS 公司的 SEMMA ( 如图 1-4 所示)。 图 1-4 S EMMA 流程 l • 数据取样( Sample ) : 当进行数据挖掘时,首先要从企业大量数据中取出 一个与你要探索问题相关的样板数据子集,而不是动用全部企业数据。通 过数据取样 , 要把好数据的质量关 。 • 数据特征探索、分析和预处理( Explore ):这里的数据探索,就是我们通 常所进行的深入调查的过程。一开始,可以先观察众多因素之间的相关性; 再按其相关的程度,以了解它们之间相互作用的情况。这些探索、 I 分析, 并没有一成不变的操作规律性 ; 相反,是要有耐心地反复地试探,仔细地 观察 。 • 问题明确化 、 数据调整和技术选择( Modi fy ) 。. 模型的研发、知识的发现( Model ) 。 • 模型和知识的综合解释和评价( Asse ss ) : 从上述步骤中会得出一系列的分 析结果、模式或模型 。 同一个数据源可以利用多种数据分析方法和模型进 1 图片来源 : https: //www.packtpub.com/book s/content/warm ing o Iii.. 10 ~ 行分析, Assess 的目的之一就是从这些模型中自动找出一个最好的模型 , 另外就是对模型进行针对业务的解释和应用。 以上两种方法论,大同小异,都探究了模型前期准备、模型的建立以及模型的评 测上线过程,但其中有个关键问题没有被明确地提出来 : 不管做分类也好,数据挖掘 也好 ,最后都要面临一个问题,就是模型衰退 。 那么,什么是模型衰退呢? 比如我们刚训练好的模型准确率是 90% ,过了一个月再跑变成 85% ,再过一个 月变成 80% ,逐月衰退,基本到不可用的状态 。 这是因为整个环境在发生变化,训 练好的模型可能在一段时间内是管用的、可靠的,准确率的偏离值不会超过 ±2%, 但在环境变化以后,我们业务面临的数据和当时训练模型的时候有出入 l , 再用此模 型去预测或分类现有数据,就会得到较低的准确率结果 。 后面会讲到图片识别的内容, 也是同样的道理 。 所以数据分析师或算法工程师一定要结合实际业务规律给出模型更 迭的计划表 , 并且需要按时调整该计划表 。 按计划更新模型是需要时刻关注的问题 。 1.3 观察!观察!观察!重要的事情说三遍 对于英特来说最大的问题是学会如何观察 , 并让团队的其他研发工程师也具有这 种能力。这种观察既观测了事物的外在特点,又考虑到事物的本质变化。学会这种观 察并看到本质是人类最为独特的切入点,那一般的研发工程师能否依靠训练初步具备 这种能力呢?很简单,多训练,多观察 。 以一部大家熟知的美剧《越狱》为例来做些说明。片中有个情节是主角要去偷公 司的数据 ,这个数据存在卡上 ,但卡被对方随身带着,怎么偷呢?韩国人比较厉害, 做了个偷数据的工具 , 只要靠近卡就能读取数据 。 但如何找到这个人呢?警察马洪 (Mahone )说我见过这个人的司机,他先对这名司机做了分析 : 总是标准站立姿势, 手背后 ,以此推断他应该是位军人或曾经在部队服役;他总是穿着非常昂贵的西服套 装, 如果做一般工作的话是买不起的 ,所以只能是被 boss 长期雇佣的司机一一由此 推断只要找到该司丰几就能找到 boss 。 再看 boss 的车:品牌是劳斯莱斯,但比一般的 l 即使在线实时更新也不能避免模型衰退现象 ,只是能让模型衰退更晚到来 。 11 ~ I 深度学习算法实践 劳斯莱斯底盘要低,因此有可能加装了防弹等设备,而美国能加装这些设备的公司 一 共也没有几家。再从司机的身高、体重全方位估算,就把这个人的基本画像做出来了, 再去数据库里查找,就不再是大海捞针了。这说明观察或仔细观察在任何场合都是 一 项重要技能。 还记得在《神经网络与深度学习》这本书中提到过如何挑选橙子吗?下面我们将 范围缩小些,就从如何挑选出口感更甜的橙子来做说明 。 首先是能看到的信息。橙子的颜色和橙子的大小影咱橙子甜度,接下去我们深入 地想想,橙子软硬程度是不是也会有些影响?橙子的售卖时间决定了橙子的生长周期 当然也有影响 ,进一步联想到橙子的产 地 。还有哪些影响?可能同一车运过来的橙子 也有甜度的区分,那是否眼采捕的优先级有 关 ,在树上的位 置有关? 当然说来说去,橙子的品种也至关重要,出生论嘛 。 还有什么和橙子甜度相关的 信息?气味?嗯,气昧也是 一 种影响因素。 好了,有以上这些信息后,我们再看看如何获取这些信息?对于获取不到的信 息 能否推算出来。最后我们可能保留一些属性作为基本特征使用 。 颜色、大小、软硬、发售时间、品种、产地,能直接得到的也就这些,对于这些 属性,我们仔细地挑选一些橙子,并且标记出以上提到的颜色、大小、软硬等属性, 并把它们做相关度评分。用 NumPy 中的协方差( CQV) I 和相关系数( CO RRCO EF) 来衡量相关程度。 :Lf (Data1[i] - Me αn1) * (Data2[i] - Me αnz) COV= N cov CORRCOEF = STD1 * STD2 协方差的绝对值越大表示相关程度越大,协方差为正值表示正相关,为负值表 示 负相关,为 0 表示不相关。这个函数非常简单,使用 NumPy 计算协方差和相关系数 如下 。 I 协方差只从统计学角度衡量相关度关系 。 无论何种统计方法,只是给出参考,勿以此为 决定指标。 ‘ 12 ~ from numpy import array , cov , corrcoef data= array([datal , data2 . . . )) #计算两组数的相关系数 #返回结果为矩阵,第 1 行第 1 列的数据表示第 1 组数与第〕组数的相关系数。对角 线 为 1 c orrcoef(data) 我们能得到 一 个关系矩阵,这个矩阵能告诉我们哪个系数与最终的值(这里是橙 子 的甜度)相关。 这样我们从中找到相应的参数 , 先用这些有正相关或负相关的参数 作 为特征,用作下 一 步模型的输入数据 。 不同维度的观察能带来不同的思考,我们把人看问题的角度变成机器看问题的角 度 ,这就是机器 学 习的本 意。 13 ..olllll 文本分析实战 2.1 第一个文本问题 英特开始复盘第一个文本分析问题 :邮件 分类问题。 对于邮件分类问题,我们还是把该问题抽象为一个文本分类问题 ,先不 看其 他影 响 垃圾邮件判断的因素,比如邮件发送的时间,同一 IP 发送的邮件,邮件发送人等 等 。 现在我们将思维只集中在我们的文本上 ,对于邮件 来说 ,我们 有两个类型的文本 可 以提取:主题(标题)和邮件内容 。 2.1.1 邮件标题的预处理 算法团队开始检查第 一 个关键点,邮件标题。现在的目标简化为如何通过邮件标 题区 分垃圾邮件和正常邮件 。 先来看看垃圾邮件标题的特征 ,如下所 示 。 (AD )蒲公英新品 XS 首发 : 你的第一台、、 跳蛋”路由器 0 16 IBM 云计算峰会报名免费抢座 - 2016 . 10 . 19 北京国际饭店会议中心 Can We Talk? Setting the Record Straight About 4 Content Misco nceptions 欢迎参加简仪科技开源测控技术研讨会 -北京站 2016 年 9 月 22 日 一寸深 度学习算法实践 NEW! Advance your career with 19 MicroMasters pr 。 grams 10.1 元购家电! iPhone6 s -Plus 仅 4488 ,海尔热水器 699 ~ 10 亿优惠券狂撤,国 庆福利快接着→ 再看看正常邮件标题长什么样,如下所示 。 [WeLoop 社区]论坛注册地址-论坛注册地址这封信是由 We Loop 社区发送的 Fwd: [Bitbucket] SSH key added to futurenlp 您的帐户在 Linux 设备上的 Chrome 中有新的登录活动 神经网络与深度学习代码 Fw : 关于 ICP 备案申请审核通过的通知 技术部- SSL 数字加密证书 从以上例子可以看出垃圾邮件的标题特征有它的特殊性,但不能简单地通过 是否 包含什么关键词来判断是否为垃圾邮件 。 比如“云计算 ”出现在垃圾邮件中,但 这个 词很有可能也存在于正常邮件中 。 不管用什么算法,文本处理的第一步都是提取特征 。提取特征的前提是从各 个角 度观测要处理的事物 ,它们可能 是一段文本 ,也可 能是一幅图像 。 上面的示例是一段 文本 。 而对于大部分的文本处理来说,都可以将词作为文本的最小粒度 。只是单词还 无法完全说明这段文字的含义,如果非要切换成词来看的话,这个词的前后文 字也非 常重要,当然重要的还有字符出现的频率、英文、符号等 。 饭要一口一口地吃,先不要纠结这些特征,集中到最小粒度 集合上 ,这就 是读者 常常听说的“分词”了。对于人类来说,在说话或读书时,天然有断句、断词的本领, 但计算机到今天为止,还没有很好地学会这项本领 。由于本书主要讲深度 学习应用, 不涉及分词的具体原理和技术细节,在此略过 。下面 我们 直接选用 Jieba 分词包来做 分词 。 #coding=utfB import jieba title_words = jieba . lc ut(u ’ 10 . 1 元购家电! iPh o ne6s-Plus 仅 4488 , 海 尔热水器 699 ~ 10 亿优惠券狂撤,国庆福利快接着~') for x in title words: print x.encode (’ utf8 ’) .... 16 2 文本分析实战寸一 程序虽然简单,但在 P严hon2 . 7 里面总是会有字符转码的问题。 所以咱 们 花点时间来说说如何操作 Unicode 。 第一行,# c oding=utf8 或# λcoding:ut 问入 是文档的编码标识 , 这样在程序 文本 内显示的引用或操作一些中文字符就不会出 现错误 。 最后一行 , 在 print 输 出 时 注意要做 encode 。 分词后得到一个列表,为了节省篇幅,我们 把 列表横 向 展 现 出来 。 1 0 . 1 /元购/家电 I ! /iPhone6s/ - /Plus /仅/ 44 88/ , I 海尔/热 水 器/ 699 /~/ 1 0/ 亿/ 优惠券/狂撤/,/国庆/福利/快/接着/ → / 英特很快从中发现了以下问题。 ( 1 )标点较多 。 ( 2 )有 一 些词出现频率太高,就被认为是无意义的 。 下面针对以上问题分别进行处理 。 ( I )标点 : 这里我们将‘, ’ 汀’ ‘:’ ‘ 。 ’ 等标点都 删 除 , 是因为在这个 任务 中,我们认为标点符号没有字的特征有用 。 在后文情感分类 中, 有些标点就不能 在预处理时删掉,因为我们认为这些标点是有用的,比如 ‘!’ ‘ ? ’ 等 。 所以 什 么 时候去 掉标点,去掉哪些标点,都要根据你的任务来决定,总的原 则 是尽可能多 地去 除噪音 ,尽可能多地把决定性特征保留下来 。 ( 2 )对于以 一 些诸如‘仅 ’ 、 ‘元 ’ 、或者其 他 的一些 ‘ 我 ’ 、 ‘ 这 ’ 、 ‘ 那 ’ 这类 的词 , 它们经过人的粗略判断认为对于垃圾邮件的识别没有帮助,都属于在下 一 步的提 取特征时用不到的内容 , 可能还会起到噪音影响 , 因 此 可 以 连同标点一起删 除 。 在 此我们采用停词表的方式来删除 。 提醒: 在做文本处理时必须维护好两张表,第一张是你需要 删 除的停用词 表,第二张是考虑到任何分词工具都有缺陷,需要准备 的 一张新词表 ,便 于及时补充新词而适应业务发展 , 而对于大多数业务 而 言 , 在针对不同领 域时,还必须维护针对不同领域的新词表 。 17 ... 一寸深 度学习算法实践 回到停用词表,它可以用一个文本文件表示,比如 stopword s . txt 这样的文件 名, 基于这个停词表,我们使用 n ot in 将停词删除 。 words= pseg . lcu t (content) for word , flag in words: # print word.encode ( ’ utf-8 ’ ) if (word not in customstopwords) : #去停用词 result += word.encode ( ’ utf-8 ’ ) 算法组在 Windows 系统下也遇到了问题,当你将邮件的标题当做文件名 写入时, 就会报非法字符错误 。 所以,你需要去除一些非法字符 。 #去除标题中的非法 字符( Windows) def val 工 dateTitle (title): rstr = r ” [\/\\\: \ *\?\”\<\>\|]”#’/\:*?”<>| ’ import re new t i tle = re.sub(rstr ,””, title) return new title 有时也会需要去除制表符等 。 # 一 次性去除空格,换行符,制表符 ””. join (s . spl 工 t () ) 最后,我们得到一个这样的字串(根据你的停词不同可能结果不同) 。 l 10 . 1 购家电 iPhone6sPlus4488 海尔热水器 699 亿优惠券狂撤国庆福利快 这里的字串将作为下一步的输入,请继续往下看 。 2.1.2 选用算法 回到第 一步 的算法思维,请读者思考下一步我们应该做些什么?如果你还不 确定 你的思路,可以看看英特是怎么做的,英特现在己去除了停用词和 一 些不常用词, 那 么接下来就到特征抽取及选取模型的阶段了,整个文本分类的训练模型最简流程如 图 2-1 所示 。 ~ 18 2 文本分析实战 丁一 文本分类 诩炼油墨 盖自邸刽噩 图 2- 1 文本分类流程图 对于文本的特征抽取及表示 , 我 们 有很多方法 , 本小节暂不介绍 , 我 们 先把整个 算法 的流程走 完 ,现在请将曰光集中在所使用的分类器上 。 常用的分类算法,想必大家很熟悉的有贝叶斯、 SVM 、决策树等,选用哪种需 结合实 际情况来定,我们这里使用 一 种多分类算法(排除决策树) : SVM 在文本分 类上 是 一个比较好的选择 。 如果觉得直接使用 s ki earn 的 SVM 或 SVC 有点复杂 , 这里给出一个开 源的 S V M 文本分类封装包 Te xtGrocery ,该封装包集成了对文本的一些处 理,适合初学者 , 地址 : https: //g ithub.com/2shou/TextGrocery 。 下面,我们将分类输出定义成 [’ ga rbage ’ , ’ normal ’], 并将之前的邮件语料样本放进 去试试,来看 一 段代码 。 19 ..... 一寸深度学习算法实践 #coding=utf 8 from tgrocery import Grocery train src = [ (’ garbage’, ’( AD )蒲公英新品 XS 首发:你的第一 台、、跳蛋”路由器’) , (’ garbage ’, ’ 016 IBM 云计算峰会报名免费抢座- 2016.10.19 北京国际饭 店会议中心’), (’ garbage ’,’Can We Talk? Setting the Record Straight About 4 Content Misconceptions ’), (’ garbage 勺’欢迎参加简仪科技开源测控技术研讨会-北京站 2016 年 9 月 22 日 ’), (’ garbage ’,’NEW! Advance your career with 19 Mi c roMasters programs ’), (’ garbage 勺’ 0.1 元购家电! iPhone6s-Plus 仅 4488 ,海尔热水器 699 ~ 1 0 亿优惠券狂撤,国庆福利快接着~') I (’ normal ’, ’[We Loop 社区]论坛注册地址-论坛注册地址这封信是由 We Loop 社区发送的’), (’ normal ’,’Fwd: [Bitbucket] SSH key added to futurenlp’), (’ normal 勺 ’您的帐户在 L 工 nux 设备上的 Chrome 中有新的登录活动’) , (’ normal 勺 ’神经网络与深度学习代码 ’), (’ normal ’, ’ Fw : 关于 ICP 备案申请审核通过的通知 ’ ), (’normal 勺 ’技术部 - SSL 数字加密证书 ’) #创建一个 grocery , ’ mail_class ’为模型名称 grocery = Grocery (’mail class ’) grocery.train(train src) grocery. save () # Load model (和之前设的名字一样) new grocery = Grocery (’mail class ’) new _grocery . load () #预测 print new_grocery.predict (’关于神经网络与深度学习 一书源码『) 我们在准备好数据后,就可以用 TextGrocery 处理了, TextGrocery 集成了提取特 ‘ 20 2 文本分析实战丁一 征算 法,所以直接调用并存储就可以生成模型了 。 grocery.train(train src ) grocery. save () 然后我们将模型取出并预测,这里为了区分存入和取出的模型用了新的变量 new _grocery 。 new grocery = Grocery (’ mail class ’) new grocery . load () 我们尝试预测“关于神经网络与深度学习一书源码”这句话。 print new_grocery.predict (’关于神经网络与深度学习一书源码 ’) 预测结果为 normal 。 这段代码非常简单,相信大家能看懂,就不做过多解释了。但这里要注意以下三 点。 ( I )训练语料太少,准确率肯定比较低 ,可以 尝试增加语料 。 ( 2 )相信细心的读者已经看出来了,这段代码是没有做文本预处理的 。 ( 3 )在这个过程中,使用其他算法或提取特征的方法,是否会增加准确率? 这三点英特及团队后期经过改进全部解决了 , 第三点就留给大家当一个小练习吧 , 看 能把准确率提高 到多少?期待你 们的 表现 。 2.1 .3 用 CNN 做文本分类 以上我们故意忽略了文本特征提取部分,因为对于一般读者而言 ,能使 用工具或 库就可以了,但相信一些对自己有更高要求的读者想知道怎么提取文本特征 。 所以这 里稍微提一 下, TextGrocery 是怎么做特征提取的 ,以 及提取的都是哪些特征 。 我们一 起来看看源码部分 : 先分词 , 再建立一个字典数据类型(词对应着词的序 号) ,然后以 Unigram 和 Bi gram 的 方式分别提取特征 (这两种方式后文会提到), 最后 将这些特征送入 SVM 分类器 。 21 "' 一寸深 度学习算法实践 以下节选代码展示了如何做预处理 。 def preprocess( s elf, text , custom tokenize) : 工 f custom tokenize is not None: tokens =custom tokenize(text) else : tokens =self. default tokenize(text) ret = [] for 工 dx, tok in enumerate(tokens): if tok n ot in self. tok 2idx : self . tok2idx[tok] = len(self . tok2idx ret.append(self.tok2 工 dx [tok]) return ret 以下代码展示了如何用 U ni gram 和 Bi gram 提取特征,这两个方 法在类 Grocery F eatureGenerator 中 。 、 22 def unigram(self , tokens): feat= defaultdict (工 nt) NG= self . ngram2fidx for x 工口 tokens: if (x,) not in NG : NG[x , ] = l en(NG) feat[NG[x ,] ] += 1 return feat def b 工 gram(self , tokens): feat= self.u 口工 g r am (tokens) NG= self.ngram2fidx for x , y 工 n zip( t okens[: - 1], tokens[l:J): if (x, y) not in NG: NG[x , y ) = len(NG) feat[NG[x , y]] += 1 retur 口 feat 2 文本分析实战寸… 好了 , 在以上案例中我们了解了 T ex t Gro cery 怎么做特征提取,特征提取之后使 用 了一个 SVM 分类器做分类 。 那么深度学习中是否有很好的方法,同时将特征提取 和分类器都替代掉呢? 这里介绍一种深度学习 的用法一一仨NN 的文本特征提取 , 并最后输出一个一维 分类层,完成了从特征提取到分类的整体模型 。 为简 化难度,我们 可以使用 https://github .com/dennybritz/cnn-tex t- clas sification-tf.git 开源库 。 同上 , 我们仍然选取 两类特征来区分垃圾邮件和非垃圾邮件 , 步骤如下 。 ( I )选取最长的句子当作向量长度,比如最长的句子有 350 字符,接着把所有的 字符按其在字典中的序号填入,句子长度不够 350 时其他位补 0 , 生成如下的向量表 刁亏。 ([ 1 2 3 ... , 0 0 0] [ 1 3 10 .. . , 0 0 OJ [ 1 2 3 ..• , 0 0 O] [ 3 9 3 [ 9 2 2 .. . , .. . , (11 2 11 . .. , (19801, 350 ) 0 0 0] 0 0 OJ 0 0 0]] Vocabulary Size: 588 Train/Dev split : 17821/1980 ( 2 )将训练集和测试集分开并开始训练 。 2016-12- 08T20:02 : 08.710200: step 1 , loss 2 . 24919, ace 0 . 484375 2016-12-08T20 : 02 : 10 . 192376 : step 2, loss 2. 35938, ace 0. 46875 2016-12- 08T20 : 02 : 11.664114: step 3, loss 2 . 44823 , ace 0 . 484375 2016-12-08T20 : 02 : 13 . 860079: step 4, loss 2 . 52388, ace 0 . 453125 2016-12-08T20 : 02 : 15.522 624: step 5, loss 1.9896, ace 0.5 2016-12-08T20 : 02 : 17 . 005463: step 6, loss 2.12384 , ace 0.515625 2016-12-08T20 : 02 : 18. 434234 : step 7, loss 1 . 61683 , ace 0 . 59375 训练的起始阶段 ace 比较低,从 0.484 开始 7 次之后已经有 0 . 59375 ,而 lo ss 下 23 A 一寸深度学习算法实践 降到 1.6 。 继续到 589 次我们得到一个相对比较好的成绩 。 2016 -1 2 -08T 20 : 18 : 00 . 183656 : step 589 , loss 0 . 197619, ace 0.9 375 训练完成后,用得到的模型可以直接做句子的预测 。这里就不再赘述 ,感 兴趣的 读者可以自己动手试试 。 那么, C NN 是怎样提取文本特征继而做分类的呢?我们会在 2.3 小节中给出相 关解释。 2.2 情感分类 针对 邮件 分类的问题 , 英特团队在发现症结后,处理得很好 。 业务部门这次 交给 英特一个真正产品上遇到的问题 : 区分用户发帖的情感 。 根据用户的情感和用户所在 的分论坛 , 就能大概地确定有多少用户 喜欢这个论坛里讨论的东西 , 有多少用户不喜 欢 。 比如 “ 汽车之家”论坛,用户在奥迪 A4 这个论坛里面发表了“发动机有问 题, 总是烧机油”等负面评价,如果识别为负面信息,那对于奥迪 A4 而 言 ,它在网 络上 的负面信息又多了一条 。 通过这样的分析,能区分对于某个 特定车型,用户是喜欢还 是厌恶 。 这对很多行业来说都是比较基础的通用需求 。 2.2.1 先分析需求 英特看了下需求 ,发现 用户的情感是针对产品的,目前只需要对产品或产品的 某 一 个部件,某 一类品质 进行评价,这里的情感倾向只 需要三类,支持、反对、中立, 广义上 也可以说是正面、负面、无情感(中立) 。 对于另外 一些应用来 说,情感倾 向 的强弱程度也是比较重要的 。 情感倾向分 析的方 法主要分为两类 : 一 种是基于情感词典的 方法 ; 一 种 是基于机 器 学习 的方法 。 前 者需要用到标注好的情感词典,英文的词典有很多,中文的话, 主 要有知网整理的 Hownet 和台湾大学整理发布的 NTUSD 这两个情 感词典,另外,哈 工大信息检索研究 室开源 的 《同义词词林》 也可以用 于情感词典的扩充 。基 于机器学 习的方法则需要大 量 人工标 注 的语料作为训练集,通过提取 文本特征,构建分类器来 ‘ 24 2 文本分析实战丁一 实现情感 的分类 。 这两者各有什么优劣?英特团 队也进行了一番调查 。 ( I )基于情感词典 的方法,优点是非常稳定,如果一句话中包含这个词就提取出 来,然后 做正负向情感分类 ,只要有就能鉴别出来 。 而这种方法的缺陷在于,对于 一 些不在情 感词表中的单词或表示方法就完全无能为力。 比如“这个发动 机烧机油啊!”这句话没有包含常见的情感倾向词,但我们 一看 就知道他说的 是负面 消息,因为人们已经建 立 了这种知识体系,知道了烧机油=说汽 车的问 题=情感负向,进而判断出情感倾向性 。 由于只根据情感词判断,忽视了语料 语境的 作用,同 一 个词在不同的语境中表达的意思完全不同,有时候甚至会影 响情感 表达 。 ( 2 )机器学习是如何做的呢?机器学习需要人工标注语料作为 训练集,提取出文 本的特 征,用特征构建一个分类器,再做情感的分类。因为在构建特征分类器时加入 的文本特征包含 一 部分语境,部分规避了情感词典的弱点 。 但这种方式因为特征的抽 取方法不 同,而导致有噪音,通用性不好 。 假设用汽车论坛语料训练出的模型去预测 某个手 机商品评 论 ,就会出现错误率很高,根本不可用的情况 。 为了弥补这两 种方法的缺陷,现在业界通用的有三种处理方法 。 ( I ) 利用 已有知识结 构自动 学 习各种语料 。 这种处理方法的简单应用有很多,比 如利用维基 百科训练一个 w ord2vec 模型, 每个词的向量实际关联了很多意义 ,再使 用词向量表示 句子,将会规避 一 部分问题。而知识图谱的建立 、语境的感知在情感分 析中都是 非常必要的 。 ( 2 )结合 词 法分 析和机器 学习 两种方法做综合判断,以减少误差 。 ( 3 )汽车领域 的模型无法用在其他领域,某种程度上是由于训练集不够引起的, 最好的 处理办法是每个领域,每个行业都用行业的语料重新 训练一个模型,并定期更 新模型。 如果做不到,就尽可能地增加语料范围 。 2.2.2 词法分析 英特首先选择了基于情感词典的方法进行实验 。 25 ... 一γ 深 度 学习算法实践 因为评论里可能包含好几句话,情感的计算必须要选择一个最小单位 , 我们就按 照“,”为切分单位,将 一 句话或 一段话按需 切分 。 punc = [响。”,”;”,"?”,”!”] Sentence= content . split(punc) 按“,”切分成句子的最小单元 。 Group = Sente 口 ce . split (叭,”) 接下来,我们基于已有的中文情感词库,构建一 张情感词表, 然后对文本进行中 文分词处理,将处理后得到的单词依次在预先构建好的情感词表中逐个配比 查找,如 果出现在表中,则是情感词,并读取情感极性及相应权值, 否 则就不是情感 词,并进 入下 一 个候选单词,直至整句话判断结束 。 If word in senDict: senWord = ( 句中位置,情感倾向,情感强度) 由于我 们有四张词表 , 所以稍微复杂点,这 [g 张词表为别是正向词表( positive ) , 负向词表( negative ), 程度前缀词表( very _prefix )、 否定词表 ( negation ) 。 正向词表和负向词表因为没有分数,所以我们给一 个默认值,负向情感的 是- 0.08, 正向情感的是+ 0.08 o 正负向词表、前缀词表里有相应的分数,直接取分数即可, 否定词表 则取 反 。 for currWord in se t negative word: if currWord not in diet word score . keys() and currWord . endswith(u ’的 ’ ) == False and currWord ! = u '东西’: diet word score[currWord] = -0. 08 for currWord in se t positive word: if currWord not in dict_word_score.keys() and currWord.endsw 工 th ( u ’的 ’) == False: diet word score[currWord] = 0 . 08 由于汉语中存在多重否定现象,而 一旦 出现否定词后 ,和 否定词关联 的 情感词表 达的情感极性也会发生反转,比如“你穿的花裙子 真好看啊 ! ”“你穿的 花 裙子真不 ... 26 2 文本分析实战 丁一 好看 啊”,如果将“好看”做为一个情感极性词 , 我们需要找到修饰它的副词中是否 包含 否定词,第 二 句话中的“真不好看啊”就是在情感词前面加入了否定词,导致整 句话 变成负向情感 。 对于多重否定我们要做的是在否定词前面再去发现否定词 ,如 果 又 找到否定词,这就是双重否定,整句话的意思就表达了原有的情感词 的情感极性; 双重 否定还有种情况,类似于出现 “不得不”这样的双重否定词 。 下面我们来看一段 专 门处理否定问题的 伪码 。 +L C 、4 d qu o p 典词的典备词准向要 E F而A -H 丛付 # 负向词典: # 否定前缀 : neg_ diet neg prefix diet (如 : 不是 , 不算等) # 双重否定前缀 : double neg pref ix diet (如 :不能不,不 得不等) # 程度前缀: very pref ix (如 : 最 , 很等) # curr index 表示当前情感词在句子中的位置 def prefix process(curr index , sentence , score) : s eg = sentence[curr index-5 : curr index] #双重否定 for curr neg prefix in double neg prefix dict : if seg .e ndswith(curr neg prefix) : return 0.8 * score #否定前缀直接修饰情感词 for curr neg prefix in neg prefix dict : if seg.endswith (curr neg prefix ): temp_pair = pseg.lcut(sentence[O : curr 一 工 n dex]) #判断是否有双重否定修饰 for i , (w , f) in enumerate (re versed (t emp pair)): if 标点符号: break el if 代词/名词/数词(找到情感词修饰的主语) if 情感词的主语被否定(因为修饰否定的否定词己经处理过 了) : 27 ... :i$;PDF仅是将室,书籍版仪归著者和出版社所苔 , 未经允许不能在网上传锚, 如高需要, i音尽窒购买正版实体书,以表示对知识的尊重!实在育必要获 阪完整版本PDF,i青联系QQ:2415996420,谢谢! 2415996420
还剩35页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

mozai

贡献于2018-06-25

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf