00:14
然后呢,我们简单介绍一下框架,呃,还是这些big player啊,这个呃,英伟达百啊,还有这个Facebook Google啊是吧,这些公司百度呢,现在在主推那个是吧,大家可能了解,现在我们主要基于Google的那个pencil flow。Pencil flow呢,它的优点呢?呃,我们简单介绍一下,Google内部是第一个做这个人工智能学习系统,叫这个系统,但是它没有开源,后面呢,Pencil flow,其实第二版pencil这个名字的意思是什么呢?是pencil加上flow。张亮对吧,什么是张亮呢?昨天我们说过向量是吧,向量是1234这样一个数,一个向量,一个数组张量,就是讲这是一个矩阵,但是有可能比矩阵尾数更高,打个比方说,我们说一个最常见的一个三维的一个矩阵,三维矩阵我们一般怎么写呢?比如说二维矩阵会写吧,是吧,1234对不对,太太在这写吧,一。
01:23
呃,1234对吧,就是一个二维矩阵对不对,我们把每一个元素都变成一个一维矩阵,就是一个三维矩阵,明白吧。假设你这么写。这就是一个三维矩阵,明白吧。明白吧,什么是维,什么是维度呢?并不是说总共有,就这一层总共有多少个什么元素度数,你看从第一层往下索引,第一个向下索引的话,行有多少个呢?是不是两个是吧?有行有列嘛,对吧,行有两个,一列有两个对吧?行列已经索引出来了,接下来就是十,十,十字对角线中间的那个元素,对吧。
02:09
某一个出现的元素,它都是怎么样一个数组,它都是自身又是一个向量,对不对?它又有一个维度,所以它是一维。所以是这样一个三维数组。他就要一个一个张亮对吧。我们说一下这个pencil flow的一个设计的一个基本思想,我们还要回到那个Python和语言这个地方来去讲啊,Python在计算机上面,在一个操作系统上面,它有一个虚拟机,对吧。大家都知道,虽然说它不像GVM说那么多,但是Python确实有一个虚拟机的,这个虚拟机负责执行Python代码是吧,甚至是做一些Python优化对吧?就是Python的一个环境,就相当于他给你提供了一个容器,你在Python,你写代码,你写A写B,你都不是直接跟操道器打交道,都是Python去向测道系统里申请一个结构,一个内存区域是吧,然后把这个值附进去。
03:11
探测也是这样的,有人说pencil和Python的关系呢,就类似于HTML和javascript的关系。为什么这么说呢?JS是干什么的呢?JS是浏览器解释它来操作HTML元素的。明白吧,你看这网页的动画怎么做出的呢?因为因为浏览器其示GS的时候就是GS是个是个编程语言是吧,是个脚本,那么它能把浏览器上的HDRL元素不断的发生改变,甚至变属性是吧,变风格是吧,做这样的工作,而对于Python来说,很像Python里边有很多变量,对不对,它就像HP里面的标签。Pencil呢,这个程序写进去呢,它在后台就好像一个脚本一样,好像一个独立于Python以上的脚本,当然他肯定是遵循P语法的啊,这个它不会因为说它是一个库就不遵循P语法,这个库本身它操作Python的所有变量。
04:17
因为是吧。就是这个关系,那我们详细说一下啊,我们这里边涉及到的概念有graph constant operator session啊,初始化,然后和啊,Hold和device。这些概念都是做什么的呢?让我们先一个一个看啊,第一个constant在各种语言里全有constant对不对?Pth里没有,任何语言里都有constant constant的主要的作用呢,就是提供一个常量,这边什么说的?我呢,它就是一个变量,对吧,也很简单。这里面要注意的是这个variable和peasant variable是不是一个variable呢?
05:02
不是一个。为什么不是一个呢?一个Python脚本,一个Python这个脚本,你从来没有听说过PY脚本会在GPU跑对不对。没有听说在C在TPU里头,对不对,这个是可以放在TPU放在GP里的。它是一个变量,但是呢,它跟Python的变量不一样。你怎么去操作这个变量呢?你是用Python的这个变量去操作它的。这个意思大家明白吗?我回来,呃,看一下那个画一下。但是我详细换一下,现在就有一个计算机,然后呢,就是操作系统。操作系统OS是吧,在这上面呢,有一个Python一个显示器。但是。
06:00
你在Python里去写它的代码。假设你申请了一个。A等于T,假设它的简写就是TF嘛,是吧,TF点。穿上。实际上做的是什么事呢?第一件事,Python肯定是初始化的一个变量,对吧,这是肯定的,对,这个变量的类型是什么?完全看后边对吧,后面肯定是个变量对不对,你如果是A等于三,那后边可能就是个常量对吧?这是这就是个常量,但是现在我后边写的是A等于TF点5Y,所以后面肯定是个变量对吧?这个变量是由TF去管理的,这个变量是由Python去管理的。对吧,然后呢,TF会把这个变量选择放在CPU里还是GPU里,甚至是TPU里各种各样零件里,看到在那里计算。明白吧?
07:00
但是这个变量呢,你是没有办法直接去取的,比如它在GPU里放着,你没有办法直接去取,对吧,你怎么去取呢?你还得通过Python变量去取。你操作A去取它明白吧,也就是说现在A就等价于它,你对于的一切操作呢,就等价于对它的操作,对吧,这就很简单。然后这是呃,变量那部分。接下来还有一个叫operator。这个地方大家又又又觉得很糊涂了。就是说pon里边,比如说A等于三,B等于二,那么A加B就等于五,从来没有考虑过什么叫operator是吧,实际上这个家是什么东西呢?大家知道家是在里,是杠杠爱的,对吧。它其实是一个方法对吧?这个加的实现方法呢,一种情况就是说我就给你实现成语言内置的一个,因为大家知道会员原理可以有加法,对吧,我一种情况下就给你实实实现成内置的加,但是呢,Python里因为每一个对象都是一个,就每一个这个变量都是个对象,对,所以这个对象呢,对象是不可能加上嘛,对吧,对象里边有十个成员,有20个成员,它是不可能加的,你加的是他的值对不对,所以它它实现了一个加,专门把它值下在一块是吧?在tan洛里也是一样,Tan的变量的加和Python变量的加是完全不一样的一个东西,比如说现在写了A等于TF.variable叉叉和TF和B等于TF.variable叉叉,呃,你现在把A和B加到一块,它是,它并不是说A这个Python对Python那个对象和B这个P对象加在一块,它指的。
08:49
是两个TF的相加。如果这两条variable是一个一维向量的话,一维这个就就向量的话,那就是向量之和,明白吧。
09:01
至于它是向量之和还是矩阵之和,怎么定义呢?是TF里边管理的TF去定义的,这个是Python完全不知道。明白是吧。所有这个operator,所以很早就有人问,既然有加,Python里有加了,为什么不直接用A加B,而经常会用TF.i的?AB呢?为什么会用这个函数呢?其实A是TF对象,B是TF对象,当你去调用加操作符的时候,就等价于调用下面这个TF点的。明白吧?这个很好理解啊,就就像你这个A加B就等于调用杠杆艾的一样嘛,对吧,那直接去调用杠杆艾特不好看,但是直接调用TL点艾特看起来还不错,所以很多人就喜欢显示的去这么去调用。接下来有三个很重要的一个概念,很很重要啊,加上这格应该是四个。
10:01
嗯,这里边有一个,呃,比较基础的啊,就gra什么是gra呢。昨天给大家讲过什么是图对吧?图就是比如像微信好友,我们全是微信好友,我们之间就是一幅图对吧?如果我们我们现在之间没有孤岛啊,假设我们现在没有孤岛,那么你从任何人传递一个信息,让他告诉他的好朋友。他都可以顺序的把全班都告诉到。对不对,那神经网络的执行也是完全一样的,大家可以看一下刚才那个。这个里面啊。大家看这一个,这不也是一个图嘛,对吧。这就是很明很明显的一个图,对不对?只要你从任何一个节点输入一个信息,它都可以向下传递,一直传到最后面,对吧,这是一个图,这个东西就叫做graph。
11:04
呃,我们定义一个神经网络的时候,没有是肯定肯定不对的,对吧,能理解,因为肯肯至少要一个gra对吧?这就像我们同学之间的这个班级这个关系一样,我们坐在一块的这个你你是不是去明显的定义他肯定都有这一个关系在这里。对吧,所以这是gra的概念,刚才还说了一个概念,有个session对吧。三是干什么的呢?三就像个学期一样,就要开学了。就要上课了,一旦开始筛选,开始上课,大家就要按自己的图去做自己的事。现在我把这个图定义完了,就是这样的,如果现在我不启动session的话,嗯,这个这个图是没没有办法工作的,就这个图都是静态的,现在数据也没进来,只有一个空空的图在这。当我启动一个session,并且向里填充数据的时候,这个网络才会不断的把数据向下传,然后得到结果,然后反向传导再更新。
12:06
明白了吧?就是呃,Session和graph。呢是默认肯定有一个,但是session呢是需要你去创建的。然后呢,接下来还有一个,呃,这两个没有没有说的,第一个是初始化器。什么是初始化器呢?一个张量往往有成百上千维是吧,很大,我们不可能一个元素一个元素去给值,我们一般都会怎么给值呢?说这一个矩阵,1000乘100的矩阵,初始化成符合高斯分布的矩阵,对吧?就直接给这么一个条件。就符合高斯分布就行了,我们不能初始化哪一个好哪个不好,哪个值好,哪个值不好是吧,我们就全局的有一个大致的一个判断,就是高斯分布初始化或者随机初始化,或者全初始化成零,或全初始化成一。
13:04
就这么几种对吧,所以说呢,我们没有必要去举证值,所以说TF给我们提供了几个是吧,可以直接把这个初始化这个工作就做完,直接把这个初始化器添进去就OK了,然后下面一个是优化器,什么是优化器呢?打个比方说啊,现在有个外卖小哥,他把外卖送到楼下了是吧,外卖送楼下了,你定义了很多很多图,包括你的操作定了很多种东西,但是如果你他把外从楼下你拿绳么去给他,给这外卖拽住了,然后你不往上提的话,你定义的所有的东西都没有用。明白吧,所以O它的关键的作用在于什么呢?你去提它,你去对它执行它,就像这个图里边的最后一个节点一样,只要你去执行它的话,因为它依赖于前面的所有的元素,依赖于前面所有的这个节点,前面的节点就得被全部执行。
14:04
换一个比方啊,我们现班级还是一个同学,一个一个网络,我们就随便找一个同学问他刚才我跟你跟你说的信息是什么,你告诉我他肯定不知道对吧。他就可以叫做优化器,他不知道,他只要向他身边的朋友去问,他身边的朋友肯定也不知道,就要继续再向前问,对吧,一层层问到最前面那个人,他们就问到了这个信息,他们就有了,对不对,这就是这个优化器,优化器同时可以指定一个学习率,因为你问到信息以后,你可以决定自己该怎么去接受这个信息嘛,对吧,你可指定一个学习率。接下来还有两两个东西啊,这两个东西就不是很难了,第一个是place holder,我们刚才讲过啊,你这个图可以一层层往前问,然后这个,但是你问到这个input节点的时候,Input节点也不知道问谁对不对,这个时候他得怎么样,他得向数据源去问,对吧,你给我1000个数据,我来分析一下,到底这到底怎么回事,对吧?所以这个地方肯定不是一个variable,也不是一个。
15:05
这个地方类型叫做place holder,就专门从数据源接受数据的,就是place holder,然后还有个device device专门指定你要把这个东西,就是这个这个这这段区域的代码放在GPU还是放CPU上跑。然后呢,这几个呢,是它的数据类型,TF里面我们常用的呢,就是F32和INT32这三就这两个用的比较多,其他的柜用用一些,那TS用的就相对来说少一些了,有一些都是搞优化的人会用到INT8和这个FLOAT16是吧,甚至FLOAT8对,但是我们平时的基本都用不上,用在PC上跑内存呢不是个问题。然后现在我们先简单的写一段小程序啊。
我来说两句