什么是程序(Program)
计算机程序,是指为了得到某种结果而可以由计算机(等具有信息处理能力的装置)执行的代码化指令序列(或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列)。
通俗讲,计算机给人干活,但它不是人,甚至不如狗懂人的需要(《小羊肖恩》里的狗是多么聪明可爱又忠诚于主人)。那怎么让它干活呢,那就需要程序员用某种编程语言来写程序,编程语言就是计算机能理解的语言,计算机可以执行这些程序(指令),最终完成任务。下边的C++程序是完成n的阶乘:
int n = std::atoi(argv[1]);
//求n的阶乘
double result = 1.0;
for (int i = 2; i <= n; i++) {
result *= i;
}
std::cout << n << "的阶乘是:" << result << std::endl;
什么是算法(Algorithm)
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或者多个操作。举个简单的例子,并且大家生活中都能用得上的。现在做个小游戏,A在纸上随机写了一个1到100间的整数,B去猜,猜对的话游戏结束,猜错的话A会告诉B猜的小了还是大了。那么B会怎么做呢,第一次肯定去猜50,每次都猜中间数。为什么呢?因为这样最坏情况下(log2100log2100)六七次就能猜到。这就是二分查找,生活中可能就会用得到,而在软件开发中也经常会用得到。再来看一个稍微复杂一点点的算法,【快速排序】,面试中考的频率非常高非常高,甚至可以说是必考。
什么是机器学习算法(Machine Learning)
机器学习的定义
《机器学习》书中的定义:
关于某类任务 T 和性能度量P,如果一个计算机程序能在T上以P衡量的性能随着经验E而自我完善,那么我们称这个计算机程序在从经验E中学习。
比如AlphaGo:
- 任务 T :下棋
- 性能标准 P :击败对手的百分比
- 训练经验:和自己对弈或者比赛经验。再比如自动驾驶:
- 任务T : 通过视频传感器在高速公路上行驶
- 性能标准P:平均无差错行驶里程
- 训练经验E:注视人类驾驶时录制的一系列图像和驾驶指令。
百度百科的定义:
机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。
机器学习的主要任务
监督学习:(1)分类:将实例数据划分到合适的分类中。KNN(k-近邻算法)、决策树、朴素贝叶斯、Logistic回归、SVM(支持向量积)。(2)回归:预测数值型数据。
无监督学习:(1)聚类:将数据集合分成由类似的对象组成的多个类的过程。K-MEANS(K均值聚类)
神经网络(Neural Network)与深度学习(Deep Learning)
生物学启示
人工神经网络ANN的研究一定程度上受到了生物学的启发,生物的学习系统由相互连接的神经元(neuron)组成的异常复杂的网格。而人工神经网络由一系列简单的单元相互密集连接构成的,其中每一个单元有一定数量的实值输入,并产生单一的实数值输出。据估计人类的大脑是由大约10111011次方个神经元相互连接组成的密集网络,平均每个神经元与其他104104个神经元相连。神经元的活性通常被通向其他神经元的连接激活或抑制。生物的神经元:人工神经元(感知机):多层感知机:
神经网络表示
1993年的ALVINN系统是ANN学习的一个典型实例,这个系统使用一个学习到的ANN以正常的速度在高速公路上驾驶汽车。ANN的输入是一个30*32像素的网格,像素的亮度来自一个安装在车辆上的前向摄像机。ANN的输出是车辆行驶的方向。
浅层学习
20世纪80年代末期,用于人工神经网络的反向传播算法(也叫Back Propagation算法或者BP算法)的发明,给机器学习带来了希望,掀起了基于统计模型的机器学习热潮。这个热潮一直持续到今天。人们发现,利用BP算法可以让一个人工神经网络模型从大量训练样本中学习统计规律,从而对未知事件做预测。这种基于统计的机器学习方法比起过去基于人工规则的系统,在很多方面显出优越性。这个时候的人工神经网络,虽也被称作多层感知机(Multi-layer Perceptron),但实际是种只含有一层隐层节点的浅层模型。20世纪90年代,各种各样的浅层机器学习模型相继被提出,例如支撑向量机(SVM,Support Vector Machines)、 Boosting、最大熵方法(如LR,Logistic Regression)等。这些模型的结构基本上可以看成带有一层隐层节点(如SVM、Boosting),或没有隐层节点(如LR)。这些模型无论是在理论分析还是应用中都获得了巨大的成功。相比之下,由于理论分析的难度大,训练方法又需要很多经验和技巧,这个时期浅层人工神经网络反而相对沉寂。
深层学习
深度学习的实质,是通过构建具有很多隐层的机器学习模型和海量的训练数据,来学习更有用的特征,从而最终提升分类或预测的准确性。因此,“深度模型”是手段,“特征学习”是目的。区别于传统的浅层学习,深度学习的不同在于:1)强调了模型结构的深度,通常有5层、6层,甚至10多层的隐层节点;2)明确突出了特征学习的重要性,也就是说,通过逐层特征变换,将样本在原空间的特征表示变换到一个新特征空间,从而使分类或预测更加容易。与人工规则构造特征的方法相比,利用大数据来学习特征,更能够刻画数据的丰富内在信息。Deep learning本身算是machine learning的一个分支,简单可以理解为neural network的发展。
一种典型的用来识别数字的卷积网络是LeNet-5。当年美国大多数银行就是用它来识别支票上面的手写数字的。能够达到这种商用的地步,它的准确性可想而知。LeNet-5的网络结构如下:
与机器学习相关联的概念
数据挖掘(Data Mining)
数据挖掘=机器学习+数据库。数据挖掘是在大型数据存储库中,自动地发现有用信息的过程。
自然语言处理 (Natural Language Process)
自然语言处理=文本处理+机器学习。自然语言处理技术主要是让机器理解人类的语言的一门领域。在自然语言处理技术中,大量使用了编译原理相关的技术,例如词法分析,语法分析等等,除此之外,在理解这个层面,则使用了语义理解,机器学习等技术。作为唯一由人类自身创造的符号,自然语言处理一直是机器学习界不断研究的方向。按照百度机器学习专家余凯的说法“听与看,说白了就是阿猫和阿狗都会的,而只有语言才是人类独有的”。如何利用机器学习技术进行自然语言的的深度理解,一直是工业和学术界关注的焦点。
模式识别(Pattern Recognition)
模式识别=机器学习。两者的主要区别在于前者是从工业界发展起来的概念,后者则主要源自计算机学科。
统计学习(Statistical Learning)
统计学习近似等于机器学习。统计学习是个与机器学习高度重叠的学科。因为机器学习中的大多数方法来自统计学,甚至可以认为,统计学的发展促进机器学习的繁荣昌盛。例如著名的支持向量机算法,就是源自统计学科。但是在某种程度上两者是有分别的,这个分别在于:统计学习者重点关注的是统计模型的发展与优化,偏数学,而机器学习者更关注的是能够解决问题,偏实践,因此机器学习研究者会重点研究学习算法在计算机上执行的效率与准确性的提升。
计算机视觉(Computer Vision)
计算机视觉=图像处理+机器学习。图像处理技术用于将图像处理为适合进入机器学习模型中的输入,机器学习则负责从图像中识别出相关的模式。计算机视觉相关的应用非常的多,例如百度识图、手写字符识别、车牌识别等等应用。这个领域是应用前景非常火热的,同时也是研究的热门方向。随着机器学习的新领域深度学习的发展,大大促进了计算机图像识别的效果,因此未来计算机视觉界的发展前景不可估量。
语音识别(Speech Recognition)
语音识别=语音处理+机器学习。语音识别就是音频处理技术与机器学习的结合。语音识别技术一般不会单独使用,一般会结合自然语言处理的相关技术。目前的相关应用有苹果的语音助手siri等。
计算机图形学、数字图像处理、计算机视觉
- 计算机视觉( Computer Vision,简称 CV),是让计算机“看懂”人类看到的世界,输入是图像,输出是图像中的关键信息;图片 -> dog or cat?图片 -> [xyz xyz xyz ... xyz]
- 计算机图形学(Computer Graphics,简称 CG),是让计算机“描述”人类看到的世界,输入是三维模型和场景描述,输出是渲染图像;[xyz xyz xyz ... xyz] -> 图片
- 数字图像处理(Digital Image Processing,简称 DIP),输入的是图像,输出的也是图像。Photoshop 中对一副图像应用滤镜就是典型的一种图像处理。常见操作有模糊、灰度化、增强对比度等。图片 -> ps后的图片
再说联系
- CG 中也会用到 DIP,现今的三维游戏为了增加表现力都会叠加全屏的后期特效,原理就是 DIP,只是将计算量放在了显卡端。通常的做法是绘制一个全屏的矩形,在 Pixel Shader 中进行图像处理。
- CV 大量依赖 DIP 来打杂活,比如对需要识别的照片进行预处理,增强对比度、去除噪点。
- 最后还要提到今年的热点——增强现实(AR),它既需要 CG,又需要 CV,当然也不会漏掉 DIP。它用 DIP 进行预处理,用 CV 进行跟踪物体的识别与姿态获取,用 CG 进行虚拟三维物体的叠加。
面试——把自己嫁出去
面试官面的是什么
我个人的经验一次正规的面试包括几个部分:
- 基础能力:数据结构与算法通过做一些智商题、ACM,一般笔试题会从leetcode找。基础能力除了基本的数据结构与算法外,经常还会考察求职者对一门编程语言的掌握程度。
- 工作经历:在哪些公司工作过,做过哪些项目,能不能把做过的东西很清晰的很系统的讲出来。(注:哪怕不是自己做过的东西,求职者能很好的讲出来,面试官也会给加分)
- 沟通能力:性格是否比较好,是否能愉快的沟通,是不是能融入团队。其实有时就是看颜值,通俗说能否看对眼。哪怕能力不怎么好,但是面试官司觉得人不错,工作能干得了,值得培养也没问题。
求职者要的是什么
- 钱
- 成长
- 开心
面试要注意什么
- 技术能力是核心
- 谦虚谨慎诚实是打动面试官的重要因素
- 沟通也很重要
- 适当美化自己的经历,但不吹牛,也不要过分谦虚