欢迎光临散文网 会员登陆 & 注册

【花师小哲】当代炼金术(神经网络)前沿(1)——新炼丹炉

2022-12-03 15:05 作者:花师小哲-中二  | 我要投稿


算是紧急加更,因为有一件比较重磅的消息:pytorch推出2.0了!(虽然稳定版还要等段时间)。作为经历过炼丹炉多年变化的炼金术师,正好趁着这个机会谈一下。

也不打草稿了,就直接想到什么就说什么吧,算是杂谈。

关于神经网络的发展历史我就不多说了,具体可以参考之前的相关专栏:

【花师小哲】面向一般大众的神经网络科普(1)-基础知识

大家只需要记住,神经网络其实是最早是好几十年前的技术了,只是12年左右重新被挖掘了出来,然后就迅速成为人工智能的主流方法,也使得人工智能能够再次流行。

我最开始了解神经网络,或者说进行神经网络编程其实是在课堂上,参考当时课程的小组展示:

【花师小哲】老二次元当初是如何学神经网络的

其实一开始,大家写神经网络都是手撸的,很正常嘛,看到什么新算法不自己写一写怎么行。当时我刚入队海韵机器人队(虽然也提到很多次了,和旧RCS合并之前我是在海韵机器人队的),视觉没人做,然后队长就挖来了一个学长,当时听说学长是手撸过神经网络(好像是用C++撸过的),就觉得非常厉害。

第2年,我们上了神经网络课,老师教我们神经网络的基本原理,教我们用matlab写神经网络。当时好像已经有些matlab的神经网络包了(matlab包也是无奇不有),不过还是手撸的。用matlab的一个好处是写矩阵运算非常方便(可能不炼金的朋友不是很清楚,看起来长成那样的神经网络在实现的时候其实就是大量的矩阵运算),不过手撸的难度其实并没有显著地减少(毕竟你用C++写无非是多从网上找些矩阵运算的库或函数嘛),只是省去了一些矩阵函数的编写。

我当时写的网络是比老师的作业要求要高的(有的小组只写了全连接网络),写了三通道两层卷积两层池化(其中三通道如何实现,两层卷积如何实现反向传播都是上课没有教的),还挺有满足感的。(其实虽然说是小组任务,但神经网络都是我一个人写的,其他人基本上是写写预处理、损失函数之类的,有一位同学在我的指导下写了全连接网络,不过有些问题,我又重新写了一遍)(哎,大学组队就是这样)。

那么,问题来了,神经网络的编程难在哪里呢?答案是反向传播

看下面这个网络:

正常来讲,我们的输入是从输入端到输出端的,这称为正向传播。我们想用一个训练好的网络进行计算就只需要完成正向传播就可以了。

但是,对于没有经过训练的网络,我们是需要根据我们的训练样本去修改神经网络权值的,而完成这个步骤就需要反向传播

简单来说,神经网络训练过程是:先正向传播(从输入到输出)->获得结果后计算损失->让损失反向传播,从输出层传递到输入层,在此期间修改每个(或者说需要修改的)权值。

具体怎么传播就是神经网络编程最困难的点,简单来说这里需要大量的导数运算,当时和学长交流手撸神经网络的心得时,学长也说:“求导快把我求爆了”。

时间来到一两年后,我注意到学长某天发了这样一条朋友圈:“用tensorflow竟然一行就能写个神经网络,调包侠(调包指的是调用工具包,因为tensorflow封装的很好,基本上调用几个包就能完成之前要写几十上百行的代码,所以当时一般戏称调包侠)太强了”。没错,各种神经网络编程工具开始被人们所使用了,神经网络编程的难度开始下降,或者说,市面上开始免费赠送精致炼金炉了。

比较著名的炼丹炉有Tensorflow、pytorch、Caffe。这里只列举了python的相关包或这些包的python版本,matlab、C++也都有不少神经网络包。之后就只谈python了。

正如师兄所说,最早大家普遍使用的是Tensorflow(之后就简称tf了)了。(这里插播一条,我们平时用python包有很多简易写法,例如import tensorflow as tf、import numpy as np、import pandas as pd等,然后某次人工智能课上就有了如下能气死很多python人的钉钉直播对话[第一句是我说的])

这就是混沌(无视小黑子)

回归正题。虽然tf好像一开始就抢占了市场,但是很快人们就不太用它了。原因有很多,例如比较麻烦的,tf2对tf1的兼容很差,或者说,很多tf1中能用的函数到了tf2就不能用了,这就导致了很严重的问题,即你从github上下载了一个神经网络模型发现它是用tf1写的而你装了tf2,那很可能是跑不起来的,可能要对代码大动刀,这严重影响了科研的效率。(虽然代码复现也算是程序员的必修课了)

于是pytorch就渐渐地成为更多人的选择,包括我也是更习惯用pytorch。

pytorch的一个很大的好处是,你不需要手写反向传播。也就是说,用pytorch写神经网络,你只需要写神经网络有哪些层、写正向传播、计算损失函数loss,然后loss.backward()一句话就可以完成反向传播。

当然,这带来的问题就是慢,真的很慢,再加上python本身就是比较慢的语言,这导致神经网络训练过程基本上是机器学习人在焦急地看机器学习(想摸鱼?想多了。服务器上跑程序,自己电脑上继续debug)。

pytorch2.0登场了!虽然还不是稳定版本,但大家总算有新的炼丹炉用了。

我浅看了几篇推送,让我印象比较深的几个新变化:

  1. 从C++回归python。pytorch之所以叫pytorch,其实是python版本的torch,所以pytorch1的很多底层实现是调用C++的(语言相互调用这很正常),在pytorch2.0中,基本上就是纯python实现了

  2. 加速。据说pytorch2.0要快很多。其实前不久python3.10版本也说自己相比3.9快了很多,说明python真的意识到自己太慢了(当然,有人预测说python3.14就比C快了,这个不太可能,毕竟解释型语言比非常底层的C更快是很难的,而且3.11也不一定比3.10快很多)

  3. 更多可供调用的神经网络层。pytorch不光让你只需要定义网络结构,甚至帮你封装了很多常用层,更加方便了神经网络编程。据说这次增加了attention之类的层结构

最后,祝炼金术师们炼金开心吧。不过新炼金炉怎么样还是要实践检验了。

【花师小哲】当代炼金术(神经网络)前沿(1)——新炼丹炉的评论 (共 条)

分享到微博请遵守国家法律