告别Python,用神经网络编写的软件走向2.0时代

简介:

有时人们把神经网络称为“机器学习工具箱中的另一种工具”。有时你可以用它们来赢得Kaggle的比赛。但是,这种解释完全见木不见林。神经网络不只是另一种分类器,它们代表了我们如何编写软件的根本性转变的开始。可以说是软件的2.0时代。下文简称软件2.0。

我们所熟悉的软件1.0的“经典堆栈”是用Python、C++等语言编写的,它包含了程序员编写的计算机的显式指令。通过编写每行代码,程序员可以通过一些可取的行为来确定程序空间中的某个特定点。

相比之下,软件2.0是用神经网络的权重来编写的。没有人参与编写这段代码,因为有很多权重(典型的网络可能有数百万个),并且直接在权重中进行编码是很困难的。反而,我们指定了一些约束程序的行为(例如,一个输入输出对示例的数据集),并使用可自行支配的计算资源来搜索满足约束条件的程序空间。在神经网络的例子中,我们把搜索限制在程序空间的一个连续的子集上,在这个空间中,搜索过程有些出乎意料地可以使用反向传播和随机梯度下降算法。

事实证明,在现实世界中,收集数据要比明确地编写程序容易得多。过段时间以后,大部分程序员不会维护复杂的软件库,编写复杂的程序,或者分析它们的运行时间。但他们会收集、整理、操作、标签、分析和可视化馈送神经网络的数据。

011bd9c0a8f59dd4f731584f4c7021148f7297ac

软件2.0不会取代1.0(实际上,需要大量的1.0基础架构来进行“编译”2.0代码的训练和推测),但是它将会接管越来越多的软件1.0的责任。让我们来看看一些正在进行的过渡的例子,以使其更加具体:

视觉识别曾经是由一些带有机器学习的工程特性组成的(例如,SVM)。从那时起,我们开发了机器,以发现更强大的图像分析程序(在卷积架构中),并且最近我们也已经开始搜索架构。

语音识别曾经涉及大量的预处理、高斯混合模型和隐藏的马尔可夫模型,但目前几乎完全由神经网络组成。

语音合成一直以来都有各种各样的拼接(stitching)机制,但是现在,艺术模型的状态是产生原始音频信号输出的大的卷积(例如WaveNet)。

机器翻译通常是采用基于短语的统计技术的方法,但神经网络很快就会占据主导地位。我最喜欢的架构是在多语言环境中进行训练的,其中一个模型可以从任何源语言转换为任何目标语言,并且在弱监督(或完全不受监督的)环境中进行。

机器人技术将问题分解为感知、姿态估计、规划、控制、不确定性建模等,使用显式表示和算法多于中间表示。我们还没有完全做到这一点,但加州大学伯克利分校和谷歌的研究表明,软件2.0或许能够更好地代表所有这些代码。

软件2.0的好处

为什么我们更喜欢将复杂的程序移植到软件2.0中呢? 很明显,答案是因为它们在实践操作中表现得更好。但是,还有很多其他的方便的理由来选择这个堆栈。让我们来看看软件2.0(一个卷积神经网络)与软件1.0相比(一个生产级别的C++代码基数)的一些好处。软件2.0:

1.计算均匀:一个典型的神经网络,首先,由两个操作组成:矩阵乘法和在零点(ReLU函数)的阈值。将其与经典软件的指令集进行比较,后者明显更具有异构性和复杂性。因为你只需为少量的核心计算原语(例如,矩阵乘法)提供软件1.0实现,就可以更容易地做出各种正确的/性能的保证。

2.简单设置为硅:作为一个推论,由于神经网络的指令集相对较小,因此更容易实现将这些网络更靠近硅,例如自定义ASIC芯片,神经形态芯片等等。当低动力的智能变得无处不在时,情况又会发生变化。例如,小而便宜的芯片可以使用预先训练过的卷积神经网络、语音识别器和WaveNet语音合成网络,它们都集成在一个小的、可以连接到任何东西上的“原始大脑”中。

3.恒定的运行时间:典型的神经网络正向传递的每一次迭代都采用同样数量的FLOPS(即“每秒浮点运算次数”,“每秒峰值速度”)。零可变性基于你的代码的不同的执行路径,是可以通过一些庞大的C++代码库来实现的。当然,你可以拥有动态计算图,但是执行流通常仍然受到很大的限制。这样,我们几乎可以保证永远不会发现自己的操作在无意地进行无限循环。

4.持续的内存使用:与上面相关的是,在任何地方都没有动态分配的内存,因此也不大可能交换到磁盘,或是你必须在你的代码中追踪的内存泄漏。

5.它具有高度的可移植性:与经典的二进制文件或脚本相比,在任意计算配置上运行一个矩阵乘法序列要容易得多。

6.它非常敏捷:如果你有一个C++代码,并且有人想让你把它以两倍的速度为代价获得(如果需要的话),这将是非常重要的调优系统新规范。然而,在软件2.0中我们可以把我们的网络删除一半的通道,然后再次训练,——它完全是运行速度的两倍,并且运行的有些糟糕。相反地,如果你恰好得到了更多的数据/计算,你可以通过增加更多的通道和重新训练来让你的程序更好地工作。

7.模块可以融合为一个最优的整体:我们的软件经常被分解为通过公共函数,API或端点进行通信的模块。然而,如果两个最初训练的软件2.0模块相互作用,我们可以很容易地在整个过程中进行反向传播。想想看,如果你的web浏览器能够自动重新设计底层系统指令10个堆栈,直到加载web页面时获得更高的效率,那该多好。而对于2.0,这是默认的行为。

软件2.0的局限性

2.0堆栈也有一些自身的缺点。在优化的最后,我们剩下的是大型网络,它们运行得很好,但是我们很难知道它是如何运作的。在许多应用领域,我们将会选择使用我们所理解的90%的精确模型,或者99%的准确模型。

2.0堆栈可以以不直观和令人尴尬的方式失败,例如,通过在训练数据中默默地采用偏差,当它们的大小在数百万的大多数情况下,是很难正确地分析和检查的。

最后,我们还发现了这个堆栈的一些特殊属性。例如,对抗样本的存在突出了这个堆栈的不直观的本质。

如果你把神经网络看作是一个软件堆栈,而不仅仅是一个很好的分类器,那么很快就会发现,它们拥有大量的优势和很大的潜力来转换软件。

从长远来看,软件2.0的未来是光明的,因为越来越多的人认为,当我们开发了AGI时,它肯定会写入软件2.0中。

本文由AiTechYun编译,转载请注明出处。更多内容关注微信公众号:atyun_com

目录
相关文章
|
12天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
12天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
29天前
|
监控 安全 网络安全
【软件设计师备考 专题 】网络软件
【软件设计师备考 专题 】网络软件
43 0
|
5天前
|
机器学习/深度学习 Python
Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析
Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析
16 0
|
5天前
|
JSON 网络协议 API
Python网络编程面试题精讲
【4月更文挑战第15天】本文介绍了Python网络编程的面试重点,包括基础Socket编程、HTTP协议与requests库、异步编程与asyncio库。通过实例解析常见面试题,强调了非阻塞套接字、异常处理、HTTP状态码检查以及异步任务管理等关键点。提供代码示例帮助读者巩固概念,助力面试准备。
11 0
|
6天前
|
机器学习/深度学习 存储 测试技术
使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测
使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测
18 0
|
7天前
|
运维 网络架构
软件体系结构 - 网络拓扑结构
【4月更文挑战第14天】软件体系结构 - 网络拓扑结构
9 0
|
7天前
|
机器学习/深度学习 资源调度 数据可视化
使用Python和Keras进行主成分分析、神经网络构建图像重建
使用Python和Keras进行主成分分析、神经网络构建图像重建
10 1
|
10天前
|
Web App开发 测试技术 网络安全
|
11天前
|
网络协议 Java API
Python网络编程基础(Socket编程)Twisted框架简介
【4月更文挑战第12天】在网络编程的实践中,除了使用基本的Socket API之外,还有许多高级的网络编程库可以帮助我们更高效地构建复杂和健壮的网络应用。这些库通常提供了异步IO、事件驱动、协议实现等高级功能,使得开发者能够专注于业务逻辑的实现,而不用过多关注底层的网络细节。

热门文章

最新文章