哈喽,大家好,我是强哥。
人工智能的浪潮正席卷全球,诸多词汇时刻萦绕在我们的耳边,如人工智能,机器学习,深度学习等。“人工智能”的概念早在1956年就被提出,顾名思义用计算机来构造复杂的,拥有与人类智慧同样本质特性的机器。经过几十年的发展,在2012年后,得益于数据量的上涨,运算力的提升和机器学习算法(深度学习)的出现,人工智能开始大爆发。
但目前的科研工作都集中在弱人工智能部分,即让机器具备观察和感知能力,可以一定程度的理解和推理,预期在该领域能够取得一些重大突破。
电影里的人工智能多半都是在描绘强人工智能,即让机器获得自适应能力,解决一些之前还没遇到过的问题,而这部分在目前的现实世界里难以真正实现。
弱人工智能有希望取得突破,是如何实现的,“智能”又从何而来呢?这主要归功于一种实现人工智能的方法——机器学习。
机器学习概念
机器学习是一种实现人工智能的方法。
机器学习最基本的做法,是使用算法来解析数据、从中学习,然后对真实世界中的事件做出决策和预测。与传统的为解决特定任务、硬编码的软件程序不同,机器学习是用大量的数据来“训练”,通过各种算法从数据中学习如何完成任务。器学习直接来源于早期的人工智能领域,传统的算法包括决策树、聚类、贝叶斯分类、支持向量机、EM、Adaboost等等。从学习方法上来分,机器学习算法可以分为监督学习(如分类问题)、无监督学习(如聚类问题)、半监督学习、集成学习、深度学习和强化学习。
传统的机器学习算法在指纹识别、基于Haar的人脸检测、基于HoG特征的物体检测等领域的应用基本达到了商业化的要求或者特定场景的商业化水平,但每前进一步都异常艰难,直到深度学习算法的出现。
深度学习概念
深度学习是一种实现机器学习的技术。
深度学习本来并不是一种独立的学习方法,其本身也会用到有监督和无监督的学习方法来训练深度神经网络。但由于近几年该领域发展迅猛,一些特有的学习手段相继被提出(如残差网络),因此越来越多的人将其单独看作一种学习的方法。
最初的深度学习是利用深度神经网络来解决特征表达的一种学习过程。深度神经网络本身并不是一个全新的概念,可大致理解为包含多个隐含层的神经网络结构。为了提高深层神经网络的训练效果,人们对神经元的连接方法和激活函数等方面做出相应的调整。其实有不少想法早年间也曾有过,但由于当时训练数据量不足、计算能力落后,因此最终的效果不尽如人意。
深度学习,作为目前最热的机器学习方法,但并不意味着是机器学习的终点。起码目前存在以下问题:
-
深度学习模型需要大量的训练数据,才能展现出神奇的效果,但现实生活中往往会遇到小样本问题,此时深度学习方法无法入手,传统的机器学习方法就可以处理;
-
有些领域,采用传统的简单的机器学习方法,可以很好地解决了,没必要非得用复杂的深度学习方法;
-
深度学习的思想,来源于人脑的启发,但绝不是人脑的模拟。
因此,机器学习框架和深度学习框架之间也是有区别的。本质上,机器学习框架涵盖用于分类,回归,聚类,异常检测和数据准备的各种学习方法,并且其可以或可以不包括神经网络方法。深度学习或深度神经网络(DNN)框架涵盖具有许多隐藏层的各种神经网络拓扑。这些层包括模式识别的多步骤过程。网络中的层越多,可以提取用于聚类和分类的特征越复杂。
我们常见的Caffe,CNTK,DeepLearning4j,Keras,MXNet和TensorFlow、PyTorch是深度学习框架。
Scikit-learning和Spark MLlib是机器学习框架。 Theano跨越了这两个类别。
Tensorflow 2.x VS Pytorch 1.8
PyTorch更有利于研究人员、爱好者、小规模项目等快速搞出原型。而TensorFlow更适合大规模部署,特别是需要跨平台和嵌入式部署时。
Tensorflow
TensorFlow 1 和 TensorFlow 2.x 之间有很多变化。第一个是 Tensorflow.js. 的发布。随着 Web 应用程序越来越占主导地位,在浏览器上部署模型的需求大大增加。借助 Tensorflow.js,你可以使用 Node 在浏览器中运行现有的 python 模型、重新训练现有的模型,并使用 Javascript 完全构建和训练模型(不需要 python)。
Tensorflow 2.x 中的另一个版本是 Tensorflow Lite,一个轻量级库,用于在移动和嵌入式设备上部署模型。这是因为移动和 Web 应用程序是两种最主要的应用程序类型。使用 Tensorflow Lite,你可以简单地将现有模型转换为「compressed flat buffer」,然后将 buffer 加载到移动设备或任何其他嵌入式设备中。这期间发生的主要优化过程是将 32 位浮点值转换成 8 位,这更适合于嵌入式设备(更少的内存使用)。
此外还包括 Tensorflow Extended(TFX)的发布,它是用于部署生产 ML pipeline 的端到端平台。其在机器学习的 3 个最重要领域(web 应用程序、移动应用程序和生产管理)方面做得很好。机器学习生产 pipeline 仍需要大量研究和开发。TFX 可以应对经典的软件生产挑战,例如可扩展性、可维护性和模块化。此外,它还可以帮助解决机器学习的特定挑战,例如持续在线学习、数据验证,数据管理等。
PyTorch
与 Tensorflow Lite 相似,PyTorch 改进了其现有的 Pytorch Mobile。该框架可以量化、跟踪、优化和保存适用于 Android 和 iOS 的模型。此外还发布了 Pytorch Lite Interpreter 的原型,该原型可减小移动设备上二进制运行时的大小。此外,还通过更具体的错误处理和 pipeline 并行为分布式训练提供了更多支持。Pytorch Profiler 用于分析 APP、模型的执行时间、执行流程、内存消耗等。
尽管 Pytorch lightning 不是 PyTorch 1.8 的一部分,但还是值得一提。Pytorch lightning 已发布,可以使编码神经网络更加简单。可以将其视为 Pytorch 的 Keras,使用广泛,其中的原因可归结为 Keras 显著的改进了 Tensorflow,因为它使实现模型变得更加容易和快捷。在 Pytorch 中,Pytorch lightning 起到了相同的作用。
如何选择?
PyTorch 以其 OOP(面向对象编程)风格而闻名。例如,当创建自定义模型或自定义数据集时,你很可能会创建一个新类,该类继承默认的 PyTorch 库,然后在进行代码调整。尽管 OOP 以某种方式为代码提供了一种结构,但就代码行数而言,会使代码变得很长。
另一方面,当使用 Tensorflow 时,你很可能会使用 Keras。例如在进行 Kaggle 比赛时(监督学习图像分类、目标检测、图像分割、NLP 等任务),可以发现 Keras 的代码实现比 PyTorch 短。作为初学者 / 中级人员,这是非常不错的选择,因为你不必花费大量时间阅读和分解代码行。
在某些情况下,需要在特定的机器学习领域中寻找特定的模型。例如,当进行目标检测比赛时,想要实现 DETR(Facebook 的 Data-Efficient transformer),结果发现大部分资源都是用 PyTorch 编写的,因此在这种情况下,使用 PyTorch 更加容易。另外,PyTorch 的代码实现更长,因为它们涵盖了许多底层细节。这既是优点也是缺点。当你是初学者时先学习低层级的细节,然后再使用更高层级的 API(例如 Keras)非常有帮助。但是,这同时也是一个缺点,因为你会发现自己迷失于许多细节和相当长的代码段中。因此,从本质上讲,如果你的工作期限很紧,最好选择 Keras 而不是 PyTorch。
强哥有话说
这里说明一点,科普摘录机器学习的内容,主要是因为强哥工作中会接触到相关知识,在周围同事都在提及机器学习框架的时候,如果连各种框架针对的领域一点都不了解,就会无法进行工作。
当然,现在机器学习这么火,很多能够大火的技术都离不开机器学习,就拿前一阵子稚晖君开发的让人直呼卧槽的桌面级小机器工具人来说,其中也大量使用到了机器学习相关知识。所以,一起学习和了解一些相关内容还是很有必要的。