感染巨细胞瘤是什么病毒可以继续母乳喂养吗

我是如何花了一年时间来学机器学习的 | 程序师机器学习;入门方法和资料以及学习思路 - 知乎专栏
你正在使用一个过时的浏览器。请以查看此页面。
{"debug":false,"apiRoot":"","paySDK":"/api/js","wechatConfigAPI":"/api/wechat/jssdkconfig","name":"production","instance":"column","tokens":{"X-XSRF-TOKEN":null,"X-UDID":null,"Authorization":"oauth c3cef7c66aa9e6a1e3160e20"}}
{"database":{"Post":{"":{"title":"机器学习;入门方法和资料以及学习思路","author":"aylwyn-71","content":"  也许你和这个叫机器学习的家伙一点也不熟,但是你举起iphone手机拍照的时候,早已习惯它帮你框出人脸;也自然而然点开今日头条推给你的新闻;也习惯逛淘宝点了找相似之后货比三家;亦或喜闻乐见微软的年龄识别网站结果刷爆朋友圈。恩,这些功能的核心算法就是机器学习领域的内容。  套用一下大神们对机器学习的定义,机器学习研究的是计算机怎样模拟人类的学习行為,以获取新的知识或技能,并重新组织已有的知识结构使之不断改善自身。简单一点说,就是计算机从数据中学习出规律和模式,以应用在新数据上做预测的任务。近年来网际网路数据大爆炸,数据的丰富度和覆盖面远远超出人工可以观察和总结的范畴,而机器学习的算法能指引计算机在海量数据中,挖掘出有用的价值,也使得无数学习者為之著迷。  但是越说越觉得机器学习有距离感,云里雾里高深莫测,我们不是专家,但说起算有一些从业经验,做过一些项目在实际数据上应用机器学习。这一篇就我们的经验和各位同仁的分享,总结一些对於初学者入门有帮助的方法和对进阶有用的资料。  并非所有的问题都适合用机器学习解决(很多逻辑清晰的问题用规则能很高效和准确地处理),也没有一个机器学习算法可以通用于所有问题。咱们先来了解了解,机器学习,到底关心和解决什麼么的问题。  从功能的角度分类,机器学习在一定量级的数据上,可以解决下列问题:  1.分类问题  根据数据样本上抽取出的特征,判定其属于有限个类别中的哪一个。比如:  垃圾邮件识别(结果类别:1、垃圾邮件2、正常邮件)  文本情感褒贬分析(结果类别:1、褒2、贬)  图像内容识别识别(结果类别:1、喵星人2、汪星人3、人类4、草泥马5、都不是)。  2.回归问题  根据数据样本上抽取出的特征,预测一个连续值的结果。比如:  星爷《美人鱼》票房  大帝都2个月后的房价  隔壁熊孩子一天来你家几次,宠幸你多少玩具  3.聚类问题  根据数据样本上抽取出的特征,让样本抱抱团(相近/相关的样本在一团内)。比如:  google的新闻分类  用户群体划分  我们再把上述常见问题划到机器学习最典型的2个分类上。  分类与回归问题需要用已知结果的数据做训练,属于「监督学习」  聚类的问题不需要已知标签,属于「非监督学习」。  如果在IT行业(尤其是网际网路)里溜达一圈,你会发现机器学习在以下热点问题中有广泛应用:  1.计算机视觉  典型的应用包括:人脸识别、车牌识别、扫描文字识别、图片内容识别、图片搜索等等。  2.自然语言处理  典型的应用包括:搜寻引擎智能匹配、文本内容理解、文本情绪判断,语音识别、输入法、机器翻译等等。  3.社会网络分析  典型的应用包括:用户画像、网络关联分析、欺诈作弊发现、热点发现等等。  4.推荐  典型的应用包括:虾米音乐的「歌曲推荐」,某宝的「猜你喜欢」等等。  OK,不废话,直接切重点丢干货了。看似学习难度大,曲线陡的机器学习,对大多数入门者也有一个比较通用的学习路径,也有一些优秀的入门资料可以降低大家的学习门槛,同时激发我们的学习乐趣。  简单说来,大概的一个学习路径如下:  简单说一点,之所以最左边写了『数学基础』『典型机器学习算法』『编程基础』三个并行的部分,是因为机器学习是一个将数学/算法理论和工程实践紧密结合的领域,需要扎实的理论基础帮助引导数据分析与模型调优,同时也需要精湛的工程开发能力去高效化地训练和部署模型和服务。  需要多说一句的是,在网际网路领域从事机器学习的人,有2类背景的人比较多,其中一部分(很大一部分)是程式设计师出身,这类同学工程经验相对会多一些,另一部分是学数学统计领域的同学,这部分同学理论基础相对扎实一些。因此对比上图,2类同学入门机器学习,所欠缺和需要加强的部分是不一样的。  下面就上述图中的部分,展开来分别扯几句:  3.1数学基础  有无数激情满满大步向前,誓要在机器学习领域有一番作为的同学,在看到公式的一刻突然就觉得自己狗带了。是啊,机器学习之所以相对于其他开发工作,更有门槛的根本原因就是数学。每一个算法,要在训练集上最大程度拟合同时又保证泛化能力,需要不断分析结果和数据,调优参数,这需要我们对数据分布和模型底层的数学原理有一定的理解。所幸的是如果只是想合理应用机器学习,而不是做相关方向高精尖的research,需要的数学知识啃一啃还是基本能理解下来的。至于更高深的部分,恩,我非常愿意承认自己是『数学渣』。  基本所有常见机器学习算法需要的数学基础,都集中在微积分、线性代数和机率与统计当中。下面我们先过一过知识重点,文章的后部分会介绍一些帮助学习和巩固这些知识的资料。  3.1.1微积分  微分的计算及其几何、物理含义,是机器学习中大多数算法的求解过程的核心。比如算法中运用到梯度下降法、牛顿法等。如果对其几何意义有充分的理解,就能理解「梯度下降是用平面来逼近局部,牛顿法是用曲面逼近局部」,能够更好地理解运用这样的方法。  凸优化和条件最优化的相关知识在算法中的应用随处可见,如果能有系统的学习将使得你对算法的认识达到一个新高度。  3.1.2线性代数  大多数机器学习的算法要应用起来,依赖于高效的计算,这种场景下,程式设计师GG们习惯的多层for循环通常就行不通了,而大多数的循环操作可转化成矩阵之间的乘法运算,这就和线性代数有莫大的关系了  向量的内积运算更是随处可见。  矩阵乘法与分解在机器学习的主成分分析(PCA)和奇异值分解(SVD)等部分呈现刷屏状地出现。  3.1.3机率与统计  从广义来说,机器学习在做的很多事情,和统计层面数据分析和发掘隐藏的模式,是非常类似的。  极大似然思想、贝叶斯模型是理论基础,朴素贝叶斯(Na?veBayes)、语言模型(N-gram)、隐马尔科夫(HMM)、隐变量混合机率模型是他们的高级形态。  常见分布如高斯分布是混合高斯模型(GMM)等的基础。  3.2典型算法  绝大多数问题用典型机器学习的算法都能解决,粗略地列举一下这些方法如下:  处理分类问题的常用算法包括:逻辑回归(工业界最常用),支持向量机,随机森林,朴素贝叶斯(NLP中常用),深度神经网络(视频、图片、语音等多媒体数据中使用)。  处理回归问题的常用算法包括:线性回归,普通最小二乘回归(OrdinaryLeastSquaresRegression),逐步回归(StepwiseRegression),多元自适应回归样条(MultivariateAdaptiveRegressionSplines)  处理聚类问题的常用算法包括:K均值(K-means),基与密度聚类,LDA等等。  降维的常用算法包括:主成分分析(PCA),奇异值分解(SVD)等。  推荐系统的常用算法:协同过滤算法  模型融合(modelensemble)和提升(boosting)的算法包括:bagging,adaboost,GBDT,GBRT  其他很重要的算法包括:EM算法等等。  我们多插一句,机器学习里所说的「算法」与程式设计师所说的「数据结构与算法分析」里的「算法」略有区别。前者更关注结果数据的召回率、精确度、准确性等方面,后者更关注执行过程的时间复杂度、空间复杂度等方面。。当然,实际机器学习问题中,对效率和资源占用的考量是不可或缺的。  3.3程式语言、工具和环境  看了无数的理论与知识,总归要落到实际动手实现和解决问题上。而没有工具所有的材料和框架、逻辑、思路都给你,也寸步难行。因此我们还是得需要合适的程式语言、工具和环境帮助自己在数据集上应用机器学习算法,或者实现自己的想法。对初学者而言,Python和R语言是很好的入门语言,很容易上手,同时又活跃的社区支持,丰富的工具包帮助我们完成想法。相对而言,似乎计算机相关的同学用Python多一些,而数学统计出身的同学更喜欢R一些。我们对程式语言、工具和环境稍加介绍:  3.3.1python  python有著全品类的数据科学工具,从数据获取、数据清洗到整合各种算法都做得非常全面。  3.3.2R  R最大的优势是开源社区,聚集了非常多功能强大可直接使用的包,绝大多数的机器学习算法在R中都有完善的包可直接使用,同时文档也非常齐全。常见的package包括:RGtk2,pmml,colorspace,ada,amap,arules,biclust,cba,descr,doBy,e1071,ellipse等等。另外,值得一提的是R的可视化效果做得非常不错,而这对於机器学习是非常有帮助的。  3.3.3其他语言  相应资深程式设计师GG的要求,再补充一下java和C++相关机器学习package。  3.3.4大数据相关  3.3.5作业系统  mac和linux会方便一些,而windows在开发中略显力不从心。所谓方便,主要是指的mac和linux在下载安装软体、配置环境更快捷。  对於只习惯windows的同学,推荐anaconda,一步到位安装完python的全品类数据科学工具包。  3.4基本工作流程  以上我们基本具备了机器学习的必要条件,剩下的就是怎麼运用它们去做一个完整的机器学习项目。其工作流程如下:  3.4.1抽象成数学问题  明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。  这裡的抽象成数学问题,指的我们明确我们可以获得什麼样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如果划归為其中的某类问题。  3.4.2获取数据  数据决定了机器学习结果的上限,而算法只是儘可能逼近这个上限。  数据要有代表性,否则必然会过拟合。  而且对於分类问题,数据偏斜不能过於严重,不同类别的数据数量不要有数个数量级的差距。  而且还要对数据的量级有一个评估,多少个样本,多少个特徵,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使用一些降维的技巧了。如果数据量实在太大,那就要考虑分布式了。  3.4.3特徵预处理与特徵选择  良好的数据要能够提取出良好的特徵才能真正发挥效力。  特徵预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复製,收益稳定可预期,是机器学习的基础必备步骤。  筛选出显著特徵、摒弃非显著特徵,需要机器学习工程师反覆理解业务。这对很多结果有决定性的影响。特徵选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特徵有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验机率、逻辑回归权重等方法。  3.4.4训练模型与调优  直到这一步才用到我们上面说的算法进行训练。现在很多算法都能够封装成黑盒供人使用。但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的癥结,提出良好的调优方案。  3.4.5模型诊断  如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。  过拟合、欠拟合判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘製学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特徵数量和质量,增加模型复杂度。  误差分析也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差產生误差的原因:是参数的问题还是算法选择的问题,是特徵的问题还是数据本身的问题……  诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反覆叠代不断逼近的过程,需要不断地尝试,进而达到最优状态。  3.4.6模型融合  一般来说,模型融合后都能使得效果有一定提升。而且效果很好。  工程上,主要提升算法準确度的方法是分别在模型的前端(特徵清洗和预处理,不同的採样模式)与后端(模型融合)上下功夫。因為他们比较标準可复製,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。  3.4.7上线运行  这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。不单纯包括其準确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。  这些工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。这裡的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。  3.5关於积累项目经验  初学机器学习可能有一个误区,就是一上来就陷入到对各种高大上算法的追逐当中。动不动就我能不能用深度学习去解决这个问题啊?我是不是要用boosting算法做一些模型融合啊?我一直持有一个观点,『脱离业务和数据的算法讨论是毫无意义的』。  实际上按我们的学习经验,从一个数据源开始,即使是用最传统,已经应用多年的机器学习算法,先完整地走完机器学习的整个工作流程,不断尝试各种算法深挖这些数据的价值,在运用过程中把数据、特徵和算法搞透,真正积累出项目经验才是最快、最靠谱的学习路径。  那如何获取数据和项目呢?一个捷径就是积极参加国内外各种数据挖掘竞赛,数据直接下载下来,按照竞赛的要求去不断优化,积累经验。国外的Kaggle和国内的DataCastle以及阿里天池比赛都是很好的平台,你可以在上面获取真实的数据和数据科学家们一起学习和进行竞赛,尝试使用已经学过的所有知识来完成这个比赛本身也是一件很有乐趣的事情。和其他数据科学家的讨论能开阔视野,对机器学习算法有更深层次的认识。  有意思的是,有些平台,比如阿里天池比赛,甚至给出了从数据处理到模型训练到模型评  估、可视化到模型融合增强的全部组件,你要做的事情只是参与比赛,获取数据,然后使用这些组件去实现自己的idea即可。具体内容可以参见阿里云机器学习文档。  3.6自主学习能力  多几句嘴,这部分内容和机器学习本身没有关系,但是我们觉得这方面的能力对於任何一种新知识和技能的学习来说都是至关重要的。自主学习能力提升后,意味著你能够跟据自己的情况,找到最合适的学习资料和最快学习成长路径。  3.6.1信息检索过滤与整合能力  对於初学者,绝大部分需要的知识通过网络就可以找到了。  google搜寻引擎技巧——组合替换搜索关键词、站内搜索、学术文献搜索、PDF搜索等——都是必备的。  一个比较好的习惯是找到信息的原始出处,如个人站、公眾号、博客、专业网站、书籍等等。这样就能够找到系统化、不失真的高质量信息。  百度搜到的技术类信息不够好,建议只作為补充搜索来用。各种搜寻引擎都可以交叉著使用效果更好。  学会去常见的高质量信息源中搜索东西:stackoverflow(程序相关)、quora(高质量回答)、wikipedia(系统化知识,比某某百科不知道好太多)、知乎(中文、有料)、网盘搜索(免费资源一大把)等。  将搜集到的网页放到分类齐全的云端收藏夹里,并经常整理。这样无论在公司还是在家裡,在电脑前还是在手机上,都能够找到自己喜欢的东西。  搜集到的文件、代码、电子书等等也放到云端网盘裡,并经常整理。  3.6.2提炼与总结能力  经常作笔记,并总结自己学到的知识是成长的不二法门。其实主要的困难是懒,但是坚持  之后总能发现知识的共性,就能少记一些东西,掌握得更多。  笔记建议放到云端笔记里,印象笔记、為知笔记都还不错。这样在坐地铁、排队等零碎的时间都能看到笔记并继续思考。  3.6.3提问与求助能力  机器学习的相关QQ群、论坛、社区一大堆。总有人知道你问题的答案。  但是大多数同学都很忙,没法像家庭教师那样手把手告诉你怎麼做。  為了让回答者最快明白你的问题,最好该学会正确的问问题的方式:陈述清楚你的业务场景和业务需求是什麼,有什麼已知条件,在哪个具体的节点上遇到困难了,并做过哪些努力。  有一篇经典的文章告诉你怎样通过提问获得帮助:《提问的智慧》,强力推荐。话锋犀利了些,但裡面的乾货还是很好的。  别人帮助你的可能性与你提问题的具体程度和重要性呈指数相关。  3.6.4分享的习惯  我们深信:「证明自己真的透彻理解一个知识,最好的方法,是给一个想了解这个内容的人,讲清楚这个内容。」分享能够最充分地提升自己的学习水平。这也是我们坚持长期分享最重要的原因。  分享还有一个副產品,就是自己在求助的时候能够获得更多的帮助机会,这也非常重要。  文章的最后部分,我们继续放送乾货。其实机器学习的优质资源非常多。我也是翻遍瀏览器收藏夹,也问同事取了取经,整合了一部分资源罗列如下:  4.1入门资源  首先coursera是一个非常好的学习网站,集中了全球的精品课程。上述知识学习的过程都可以在上面找到合适的课程。也有很多其他的课程网站,这裡我们就需要学习的数学和机器学习算法推荐一些课程(有一些课程有中文字幕,有一些只有英文字幕,有一些甚至没有字幕,大家根据自己的情况调整,如果不习惯英文,基础部分有很多国内的课程也非常优质):  微积分相关  Calculus:SingleVariable  MultivariableCalculus  线性代数  LinearAlgebra  机率统计  IntroductiontoStatistics:DescriptiveStatistics  ProbabilisticSystemsAnalysisandAppliedProbability  程式语言  ProgrammingforEverybody:Python  DataCamp:LearnRwithRtutorialsandcodingchallenges:R  StatisticalLearning(R)  machinelearning:强烈推荐,AndrewNg老师的课程  机器学习基石  机器学习技术:林轩田老师的课相对更有深度一些,把作业做完会对提升对机器学习的认识。  自然语言处理:史丹福大学课程  日常阅读的资源  4.2进阶资源  有原始码的教程  scikit-learn中各个算法的例子  《机器学习实战》有中文版,并附有python原始码。  《TheElementsofStatisticalLearning》这本书有对应的中文版:《统计学习基础(豆瓣)》。书中配有R包。可以参照著代码学习算法。网盘中有中文版。  《NaturalLanguageProcessingwithPython》NLP经典,其实主要是讲python的NLTK这个包。网盘中有中文版。  《NeuralNetworksandDeepLearning》MichaelNielsen的神经网络教材,浅显易懂。国内有部分翻译,不全,建议直接看原版。  图书与教材  《数学之美》:入门读起来很不错。  《统计学习方法》:李航经典教材。  《PatternRecognitionAndMachineLearning》:经典中教材。  《统计自然语言处理》自然语言处理经典教材  《Appliedpredictivemodeling》:英文版,注重工程实践的机器学习教材  《UFLDL教程》:神经网络经典教材  《deeplearningbook》:深度学习经典教材。  工具书  《SciPyandNumPy》  《PythonforDataAnalysis》作者是Pandas这个包的作者  其他网络资料  机器学习(MachineLearning)与深度学习(DeepLearning)资料汇总:作者太给力,量大干货多,有兴趣的同学可以看看,我至今只看了一小部分。","updated":"T06:06:10.000Z","canComment":false,"commentPermission":"anyone","commentCount":0,"collapsedCount":0,"likeCount":3,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","titleImage":"","links":{"comments":"/api/posts//comments"},"reviewers":[],"topics":[{"url":"/topic/","id":"","name":"机器学习"},{"url":"/topic/","id":"","name":"大规模机器学习"}],"adminClosedComment":false,"titleImageSize":{"width":0,"height":0},"href":"/api/posts/","excerptTitle":"","tipjarState":"closed","annotationAction":[],"sourceUrl":"","pageCommentsCount":0,"snapshotUrl":"","publishedTime":"T14:06:10+08:00","url":"/p/","lastestLikers":[{"profileUrl":"/people/cuipeihao","bio":"","hash":"2fdf61b3590568adce5b8db2d3748ada","uid":16,"isOrg":false,"description":"","isOrgWhiteList":false,"slug":"cuipeihao","avatar":{"id":"f2d8e5492","template":"/{id}_{size}.jpg"},"name":"崔培豪"},{"profileUrl":"/people/da-da-da-zhu-gan","bio":"金融狗","hash":"1df5b7f772ca71fe152310","uid":64,"isOrg":false,"description":"","isOrgWhiteList":false,"slug":"da-da-da-zhu-gan","avatar":{"id":"3a5b4a59d4ed56e5f654","template":"/{id}_{size}.jpg"},"name":"Aaron HUANG"},{"profileUrl":"/people/lake-lee-73","bio":"invalid_syntax","hash":"1afcc1d0356ee9edf4e1acf64c23741c","uid":635200,"isOrg":false,"description":"","isOrgWhiteList":false,"slug":"lake-lee-73","avatar":{"id":"5f03f68d8d7b95f79fea7","template":"/{id}_{size}.jpg"},"name":"lake lee"}],"summary":"也许你和这个叫机器学习的家伙一点也不熟,但是你举起iphone手机拍照的时候,早已习惯它帮你框出人脸;也自然而然点开今日头条推给你的新闻;也习惯逛淘宝点了找相似之后货比三家;亦或喜闻乐见微软的年龄识别网站结果刷爆朋友圈。恩,这些功能的核心算法就…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"annotationDetail":null,"commentsCount":0,"likesCount":3,"FULLINFO":true}},"User":{"aylwyn-71":{"isFollowed":false,"name":"大数据","headline":"柠檬学院大数据,注册就能学习了。","avatarUrl":"/v2-bcdfbdccc9a52ee4db52c_s.jpg","isFollowing":false,"type":"people","slug":"aylwyn-71","bio":"柠檬学院大数据","hash":"8fb8affb8fc6f8fb2ad3c2a2","uid":999700,"isOrg":false,"description":"柠檬学院大数据,注册就能学习了。","profileUrl":"/people/aylwyn-71","avatar":{"id":"v2-bcdfbdccc9a52ee4db52c","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false,"badge":{"identity":null,"bestAnswerer":null}}},"Comment":{},"favlists":{}},"me":{},"global":{},"columns":{},"columnPosts":{},"postComments":{},"postReviewComments":{"comments":[],"newComments":[],"hasMore":true},"favlistsByUser":{},"favlistRelations":{},"promotions":{},"draft":{"titleImage":"","titleImageSize":{},"titleImageFullScreen":false,"canTitleImageFullScreen":false,"title":"","titleImageUploading":false,"error":"","content":"","draftLoading":false,"globalLoading":false,"pendingVideo":{"resource":null,"error":null}},"config":{"userNotBindPhoneTipString":{}},"recommendPosts":{"articleRecommendations":[],"columnRecommendations":[]},"env":{"isAppView":false,"appViewConfig":{"content_padding_top":128,"content_padding_bottom":56,"content_padding_left":16,"content_padding_right":16,"title_font_size":22,"body_font_size":16,"is_dark_theme":false,"can_auto_load_image":true,"app_info":"OS=iOS"},"isApp":false},"sys":{}}MNIST机器学习入门
这个教程的目标读者是对机器学习和TensorFlow都不太了解的新手。如果你已经了解MNIST和softmax回归(softmax regression)的相关知识,你可以阅读这个。
当我们开始学习编程的时候,第一件事往往是学习打印&Hello World&。就好比编程入门有Hello World,机器学习入门有MNIST。
MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1。
在此教程中,我们将训练一个机器学习模型用于预测图片里面的数字。我们的目的不是要设计一个世界一流的复杂模型 -- 尽管我们会在之后给你源代码去实现一流的预测模型 -- 而是要介绍下如何使用TensorFlow。所以,我们这里会从一个很简单的数学模型开始,它叫做Softmax Regression。
对应这个教程的实现代码很短,而且真正有意思的内容只包含在三行代码里面。但是,去理解包含在这些代码里面的设计思想是非常重要的:TensorFlow工作流程和机器学习的基本概念。因此,这个教程会很详细地介绍这些代码的实现原理。
MNIST数据集
MNIST数据集的官网是。在这里,我们提供了一份python源代码用于自动下载和安装这个数据集。你可以下载,然后用下面的代码导入到你的项目里面,也可以直接复制粘贴到你的代码文件里面。
import tensorflow.examples.tutorials.mnist.input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
下载下来的数据集被分成两部分:60000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.test)。这样的切分很重要,在机器学习模型设计时必须有一个单独的测试数据集不用于训练而是用来评估这个模型的性能,从而更加容易把设计的模型推广到其他数据集上(泛化)。
正如前面提到的一样,每一个MNIST数据单元有两部分组成:一张包含手写数字的图片和一个对应的标签。我们把这些图片设为“xs”,把这些标签设为“ys”。训练数据集和测试数据集都包含xs和ys,比如训练数据集的图片是 mnist.train.images ,训练数据集的标签是 mnist.train.labels。
每一张图片包含28X28个像素点。我们可以用一个数字数组来表示这张图片:
我们把这个数组展开成一个向量,长度是 28x28 = 784。如何展开这个数组(数字间的顺序)不重要,只要保持各个图片采用相同的方式展开。从这个角度来看,MNIST数据集的图片就是在784维向量空间里面的点, 并且拥有比较 (提醒: 此类数据的可视化是计算密集型的)。
展平图片的数字数组会丢失图片的二维结构信息。这显然是不理想的,最优秀的计算机视觉方法会挖掘并利用这些结构信息,我们会在后续教程中介绍。但是在这个教程中我们忽略这些结构,所介绍的简单数学模型,softmax回归(softmax regression),不会利用这些结构信息。
因此,在MNIST训练数据集中,mnist.train.images 是一个形状为 [6] 的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。在此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值介于0和1之间。
相对应的MNIST数据集的标签是介于0到9的数字,用来描述给定图片里表示的数字。为了用于这个教程,我们使标签数据是&one-hot vectors&。 一个one-hot向量除了某一位的数字是1以外其余各维度数字都是0。所以在此教程中,数字n将表示成一个只有在第n维度(从0开始)数字为1的10维向量。比如,标签0将表示成([1,0,0,0,0,0,0,0,0,0,0])。因此, mnist.train.labels 是一个 [60000, 10] 的数字矩阵。
现在,我们准备好可以开始构建我们的模型啦!
Softmax回归介绍
我们知道MNIST的每一张图片都表示一个数字,从0到9。我们希望得到给定图片代表每个数字的概率。比如说,我们的模型可能推测一张包含9的图片代表数字9的概率是80%但是判断它是8的概率是5%(因为8和9都有上半部分的小圆),然后给予它代表其他数字的概率更小的值。
这是一个使用softmax回归(softmax regression)模型的经典案例。softmax模型可以用来给不同的对象分配概率。即使在之后,我们训练更加精细的模型时,最后一步也需要用softmax来分配概率。
softmax回归(softmax regression)分两步:第一步
为了得到一张给定图片属于某个特定数字类的证据(evidence),我们对图片像素值进行加权求和。如果这个像素具有很强的证据说明这张图片不属于该类,那么相应的权值为负数,相反如果这个像素拥有有利的证据支持这张图片属于这个类,那么权值是正数。
下面的图片显示了一个模型学习到的图片上每个像素对于特定数字类的权值。红色代表负数权值,蓝色代表正数权值。
我们也需要加入一个额外的偏置量(bias),因为输入往往会带有一些无关的干扰量。因此对于给定的输入图片 x 它代表的是数字 i 的证据可以表示为
代表权重, 代表数字 i 类的偏置量,j 代表给定图片 x 的像素索引用于像素求和。然后用softmax函数可以把这些证据转换成概率 y:
这里的softmax可以看成是一个激励(activation)函数或者链接(link)函数,把我们定义的线性函数的输出转换成我们想要的格式,也就是关于10个数字类的概率分布。因此,给定一张图片,它对于每一个数字的吻合度可以被softmax函数转换成为一个概率值。softmax函数可以定义为:
展开等式右边的子式,可以得到:
但是更多的时候把softmax模型函数定义为前一种形式:把输入值当成幂指数求值,再正则化这些结果值。这个幂运算表示,更大的证据对应更大的假设模型(hypothesis)里面的乘数权重值。反之,拥有更少的证据意味着在假设模型里面拥有更小的乘数系数。假设模型里的权值不可以是0值或者负值。Softmax然后会正则化这些权重值,使它们的总和等于1,以此构造一个有效的概率分布。(更多的关于Softmax函数的信息,可以参考Michael Nieslen的书里面的这个,其中有关于softmax的可交互式的可视化解释。)
对于softmax回归模型可以用下面的图解释,对于输入的xs加权求和,再分别加上一个偏置量,最后再输入到softmax函数中:
如果把它写成一个等式,我们可以得到:
我们也可以用向量表示这个计算过程:用矩阵乘法和向量相加。这有助于提高计算效率。(也是一种更有效的思考方式)
更进一步,可以写成更加紧凑的方式:
实现回归模型
为了用python实现高效的数值计算,我们通常会使用函数库,比如NumPy,会把类似矩阵乘法这样的复杂运算使用其他外部语言实现。不幸的是,从外部计算切换回Python的每一个操作,仍然是一个很大的开销。如果你用GPU来进行外部计算,这样的开销会更大。用分布式的计算方式,也会花费更多的资源用来传输数据。
TensorFlow也把复杂的计算放在python之外完成,但是为了避免前面说的那些开销,它做了进一步完善。Tensorflow不单独地运行单一的复杂计算,而是让我们可以先用图描述一系列可交互的计算操作,然后全部一起在Python之外运行。(这样类似的运行方式,可以在不少的机器学习库中看到。)
使用TensorFlow之前,首先导入它:
import tensorflow as tf
我们通过操作符号变量来描述这些可交互的操作单元,可以用下面的方式创建一个:
x = tf.placeholder(tf.float32, [None, 784])
x不是一个特定的值,而是一个占位符placeholder,我们在TensorFlow运行计算时输入这个值。我们希望能够输入任意数量的MNIST图像,每一张图展平成784维的向量。我们用2维的浮点数张量来表示这些图,这个张量的形状是[None,784 ]。(这里的None表示此张量的第一个维度可以是任何长度的。)
我们的模型也需要权重值和偏置量,当然我们可以把它们当做是另外的输入(使用占位符),但TensorFlow有一个更好的方法来表示它们:Variable 。
一个Variable代表一个可修改的张量,存在在TensorFlow的用于描述交互性操作的图中。它们可以用于计算输入值,也可以在计算中被修改。对于各种机器学习应用,一般都会有模型参数,可以用Variable表示。
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
我们赋予tf.Variable不同的初值来创建不同的Variable:在这里,我们都用全为零的张量来初始化W和b。因为我们要学习W和b的值,它们的初值可以随意设置。
注意,W的维度是[784,10],因为我们想要用784维的图片向量乘以它以得到一个10维的证据值向量,每一位对应不同数字类。b的形状是[10],所以我们可以直接把它加到输出上面。
现在,我们可以实现我们的模型啦。只需要一行代码!
y = tf.nn.softmax(tf.matmul(x,W) + b)
首先,我们用tf.matmul(X,W)表示x乘以W,对应之前等式里面的,这里x是一个2维张量拥有多个输入。然后再加上b,把和输入到tf.nn.softmax函数里面。
至此,我们先用了几行简短的代码来设置变量,然后只用了一行代码来定义我们的模型。TensorFlow不仅仅可以使softmax回归模型计算变得特别简单,它也用这种非常灵活的方式来描述其他各种数值计算,从机器学习模型对物理学模拟仿真模型。一旦被定义好之后,我们的模型就可以在不同的设备上运行:计算机的CPU,GPU,甚至是手机!
为了训练我们的模型,我们首先需要定义一个指标来评估这个模型是好的。其实,在机器学习,我们通常定义指标来表示一个模型是坏的,这个指标称为成本(cost)或损失(loss),然后尽量最小化这个指标。但是,这两种方式是相同的。
一个非常常见的,非常漂亮的成本函数是“交叉熵”(cross-entropy)。交叉熵产生于信息论里面的信息压缩编码技术,但是它后来演变成为从博弈论到机器学习等其他领域里的重要技术手段。它的定义如下:
y 是我们预测的概率分布, y' 是实际的分布(我们输入的one-hot vector)。比较粗糙的理解是,交叉熵是用来衡量我们的预测用于描述真相的低效性。更详细的关于交叉熵的解释超出本教程的范畴,但是你很有必要好好。
为了计算交叉熵,我们首先需要添加一个新的占位符用于输入正确值:
y_ = tf.placeholder("float", [None,10])
然后我们可以用
计算交叉熵:
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
首先,用 tf.log 计算 y 的每个元素的对数。接下来,我们把 y_ 的每一个元素和 tf.log(y) 的对应元素相乘。最后,用 tf.reduce_sum 计算张量的所有元素的总和。(注意,这里的交叉熵不仅仅用来衡量单一的一对预测和真实值,而是所有100幅图片的交叉熵的总和。对于100个数据点的预测表现比单一数据点的表现能更好地描述我们的模型的性能。
现在我们知道我们需要我们的模型做什么啦,用TensorFlow来训练它是非常容易的。因为TensorFlow拥有一张描述你各个计算单元的图,它可以自动地使用来有效地确定你的变量是如何影响你想要最小化的那个成本值的。然后,TensorFlow会用你选择的优化算法来不断地修改变量以降低成本。
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
在这里,我们要求TensorFlow用梯度下降算法(gradient descent algorithm)以0.01的学习速率最小化交叉熵。梯度下降算法(gradient descent algorithm)是一个简单的学习过程,TensorFlow只需将每个变量一点点地往使成本不断降低的方向移动。当然TensorFlow也提供了:只要简单地调整一行代码就可以使用其他的算法。
TensorFlow在这里实际上所做的是,它会在后台给描述你的计算的那张图里面增加一系列新的计算操作单元用于实现反向传播算法和梯度下降算法。然后,它返回给你的只是一个单一的操作,当运行这个操作时,它用梯度下降算法训练你的模型,微调你的变量,不断减少成本。
现在,我们已经设置好了我们的模型。在运行计算之前,我们需要添加一个操作来初始化我们创建的变量:
init = tf.initialize_all_variables()
现在我们可以在一个Session里面启动我们的模型,并且初始化变量:
sess = tf.Session()
sess.run(init)
然后开始训练模型,这里我们让模型循环训练1000次!
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
该循环的每个步骤中,我们都会随机抓取训练数据中的100个批处理数据点,然后我们用这些数据点作为参数替换之前的占位符来运行train_step。
使用一小部分的随机数据来进行训练被称为随机训练(stochastic training)- 在这里更确切的说是随机梯度下降训练。在理想情况下,我们希望用我们所有的数据来进行每一步的训练,因为这能给我们更好的训练结果,但显然这需要很大的计算开销。所以,每一次训练我们可以使用不同的数据子集,这样做既可以减少计算开销,又可以最大化地学习到数据集的总体特性。
评估我们的模型
那么我们的模型性能如何呢?
首先让我们找出那些预测正确的标签。tf.argmax 是一个非常有用的函数,它能给出某个tensor对象在某一维上的其数据最大值所在的索引值。由于标签向量是由0,1组成,因此最大值1所在的索引位置就是类别标签,比如tf.argmax(y,1)返回的是模型对于任一输入x预测到的标签值,而 tf.argmax(y_,1) 代表正确的标签,我们可以用 tf.equal 来检测我们的预测是否真实标签匹配(索引位置一样表示匹配)。
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
这行代码会给我们一组布尔值。为了确定正确预测项的比例,我们可以把布尔值转换成浮点数,然后取平均值。例如,[True, False, True, True] 会变成 [1,0,1,1] ,取平均值后得到 0.75.
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
最后,我们计算所学习到的模型在测试数据集上面的正确率。
print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
这个最终结果值应该大约是91%。
这个结果好吗?嗯,并不太好。事实上,这个结果是很差的。这是因为我们仅仅使用了一个非常简单的模型。不过,做一些小小的改进,我们就可以得到97%的正确率。最好的模型甚至可以获得超过99.7%的准确率!(想了解更多信息,可以看看这个关于各种模型的。)
比结果更重要的是,我们从这个模型中学习到的设计思想。不过,如果你仍然对这里的结果有点失望,可以查看,在那里你可以学习如何用TensorFlow构建更加复杂的模型以获得更好的性能!
原文地址: 翻译: 校对:

我要回帖

更多关于 新生儿巨细胞病毒感染 的文章

 

随机推荐