00:13
数字是吧。哦,给大家简单解释一下。这个代码是在做什么事呢?只是一个TF的入门代码,但是呢,可以给我们呃做一个基本的一个学习,第一个呃,先把贪森葫芦的包导进来,对吧,再把那派导进来。Ten森呢?他做的很聪明,他没有自己开发一套矩阵运算的后端的库,直接复用了单派,所以他们两个经常是一起出现的。而且他flow也没有自己的一套,说那个TB这种可视化,除非你在这个web上能看到了,所以你当你画图的时候,最好用MAT去画,然后呢,这里面我们用NP单派先初始化了一个X和一个Y,对吧。
01:02
这个X是什么呢?大家可以在自己的那个I里打一下NP点点二一百,后面二一百什么意思啊,是个形状。两行100列对吧,我生成两行100列的random数字0.10.20.3,生成两行100列对吧,那两行1000就这样两行100点的一个数字啊,一个矩阵,然后呢,有一个Y,这个Y是什么东西呢?现在现在我们不知道为什么,但是Y肯定是通过NP.dot dot是点的意思嘛,对吧,就是矩阵的点层NP.dot0.10.2,这是一个什么呢?一个向量对不对,大家想0.10.2,这是一个矩,一个向量也是一个矩阵吧,对吧。这个矩阵和第二个做矩阵乘法怎么乘呢?0.1乘第一列,0.2乘第二列零点乘第一行,0.2乘第二行对吧?一列列乘对不对。
02:06
对吧,乘完的结果是多少,乘完的结果的形状是多少啊。因为你这是二乘100嘛,是吧,乘完是一乘100对不对。对吧。没问题哈,一乘二的矩阵,然后面是二乘100的,那乘完的形状肯定是一乘100嘛。OK哈,一乘100这个值有了以后呢,我们呢,再构造一个线性模型。我们做了一个什么事呢?我现在有一个有,因为我现在哈,我现在这个Y乘一乘100的,这是一个确定的值,大家不要忽略了,当你每次XZ的生成以后,Y就确定了,它直接就算出来了,对不对,直接算出来了,我现在要做的事呢,是我去找。0.10.2怎么能给它学到。W和B怎么能学到是0.10.2,实际上我们现在W就是那个,呃,0.10.2这个矩阵对吧,B就是0.3对不对,实际上这就是W,这就是B,现在我是让神经网络去学,那神经网络怎么去学呢?
03:10
第一步B我不知道现在是什么对吧?B肯定是一个值,但是我不知道是什么,所以我随机给它一个TF点接给一个值是吧,就给它零,现在就是零,因为反向传导你不对的话,他就会学嘛,对吧,最开始B是零,W是什么呢?我也不知道是什么,但是我给他一个一行两列的一个数组,并且是用什么呢?随机初始化random uniform,随机初始化在负一到一之间都有可能。明白是吧?所以W和B都有了,那么现在我求出来的Y是什么呢?就是TF的TF的矩阵相乘和NP的这个函数名不一样,TF叫ma谬TF.ma谬W乘XZ加B就是Y,对吧?
04:00
所以Y和y date它肯定是不一样的。对吧,最开始肯定不一样,不一样就怎么样,就产生了一个什么损失,对不对,一个路子,但是这个路子啊,最开始肯定不是一个值,为什么呢?因为你迈之后再加B,得到的是一个一乘100的,两边全是一乘100对不对。怎么办呢?让两边一乘100,做差之后还是一乘100,怎么办呢?做一个reduce。当然在之前先做一个平方,就是说方差的平均值。就平方的平均值,应该做的就是一个方差,明白吧。是吧?先把Y和Y减y y date之后,这个一乘100的里边每个值,比如这个值是0.1 0.2 0.3,我全给它取平方。对吧,为什么取平方呢?如果你不取平方0.1负0.10.1负点一,你看起来就是零是没有意义的,对吧?是全取平方表示它的波动,表示方差定义嘛,然后再求一个平均除上100。
05:05
求平均对吧,现在如果你有损失的话,这个值肯定不等,肯定不是零对吧。不管怎么算,这个值肯定不是零,所以呢,我就用一个优化器,以0.5的步长去优化这个网络。0.5的不长去优化了网络,0.5是什么意思啊,就是这个参数一次更新是五,参数一次只能往前前进,比如说你现在梯度是100,那某些参数一次只能更新50,明白吧,就是0.5就在你的梯度基础上乘一个系数,明白吧,就很简单,然后呢,CH的CH的这个这个这个变量是什么意思呢?是要极小化这个路子,我上面是不是有路子吗?我要用optimize极小化这个路子。这是一个optimizer,它就是讲就是说呃,用梯度下降法速优化不长0.5,但是现在他什么都没见到,然后呢,这是一个路子,路子见到了我自己有这么多向量,而且有这么多值,有差距,但是我不知道该怎么优化去,就把他俩结合到一块去了,明白吧。
06:14
在这里面还有一个很重要的,就是一定要做一次global initialize。呃,全局初始化,对这个地方别人就总会问说为什么要做这么完美一个操作,难道我定义好图以后,你不能自己做一个操作吗?他这个地方的设计理念就和C加加非常像,对吧?就是什么东西你都做,都你自己做,我把所有的API尽可能详细的,尽可能底层的全提供给你,你需要什么,你做自己做什么,我什么都不管。他就不像Python是吧,那Python的话,那可能大部分活都帮你管对吧,如果是Python去设计的话,可能这本数据都跑出来了是吧,那这两个设计一定不一样,就是同学如果调试的时候调到一米的一定一定这个节点的时候呢,你会发现这个路子啊,还有像这个O,包括这所有的WB什么的都没有值。
07:05
现在是没有值的,就包括像你这种,呃,很明显的这个初始化的,现在也是没有值的。这这个概念大家一定要一定要那个要记住哈。当你调试到这个位置的时候,调试到这个位置的时候,W和B有没有值呢?一定要知道没有,这是没有,为什么没有呢?因为还没有跑格。global VI、尼斯莱。跑完之后他才有值,明白吗?OK,跑完之后呢,因为我们刚才给大家讲了,现在图这部分已经OK了,我们图也做完了,这是一个社交网络,或者是一个关系网络,也可以说是一个流水的一个数据网络,但是呢,我们没有一个session,就我们没开学,大家都静止不动,都不来上课是吧?所以我现在一定要有一个session,启动一个session。
08:00
启动一个session之后呢,我再去run,大家这里边就观察到一点啊,在pencil flow里边所有的操作你都必须得run一次。啊,你必须得run它,你不乱它,它就就就没有东西,就没有意义,就当没有一样,你得去run它一次。并不是这个地方,你写了一个这个函数,它就了。知道吧,这跟你前面是一样的,并不是你前面写了它就有值,你得写了这么一个东西,它才得他才有值,但是呢,还得是有人乱它的时候,前面才有值。明白吧,是不是有点绕是吧。能理解吗,这个。我,我再说一次啊,Pencil的设计理念是静态图,什么叫静态图呢?就是现在只有图没数据。你不管前面怎么搭这个图,这都是一个蓝图数据还没填进去,你一定要用一个global variables initialize给它填进去,但是呢,Gra global initializer呢,本身也是这个蓝图的一部分,所以即使你写的这句话,它还是没有值的。
09:13
必须得有一个人主动站出来说一个session转站出来说我要乱你,我乱了之后他就被乱掉了是吧,他被被跑起来了,他就要做他的操作嘛,对吧,他要给他们灌灌进去数据,按他们的蓝图灌数据,对不对。这个时候WB才有十明白吧,千万不要忘了,它也是蓝图的一部分,它不是一个操作啊,只要你写任何特色代码,在你没有run之前,全是蓝图的一部分,什么都没有明白。然后呢,在下面这个,我们run了这个it以后呢。这个时候全局的这个这个变量全部都初始化了之后,我们跑201步,那其他步也行,我们再跑最后一步,可能只是为了这个多一步看一下,我们还得去run,这个时候run什么呢?Run就足够了。
10:05
为什么啊,我们再退出再看一下。CH是什么东西呢?是优化器,以这样的一个优化蓝图去最小化这个路子,对不对?这就是全部的我们要做的事嘛,我们全部要做的事都在这里了,对吧?但是为什么我们要把路子也加进来呢?为什么呢?因为我们要看一下现在路子到底有没有减小。明白吧,我们要看一下现在损失值是多少,因为我刚才说了,刚开始损失值肯定非常大,对吧,越后跑损失值越小,然后它不断的比近,所以就是大家在下面看到的这个损失值的一个降低。是打印的不是特别好,但是如果把那个呃,Step打印出来的话,就能看到每一步随时都降低一些,每一步降低些等,直到最后降低到负13次幂。就可以看到了是吧。
11:01
嗯,那我们当跑完之后呢。这个30现在还存在是吧,我想看W和B的值怎么办呢?我也可以再run一次,我把W扔进去run它一下,看看这个W是多少啊,咱们看一下,我转一下W和B。然后来验证一下它是不是已经成功弥合了这个w result。先把它run出来,Run出来之后呢,再来打印出来,这是W。大家能看到哈,W是什么?0.09999973是吧。后面是0.199,然后B呢是0.30,跟我们最开始给的他这个值基本接近是吧。
12:03
这样的话,他不就把这两个参数给学到了吗?这两个我们把设定一个数字给学到了,对不对。没问题了吧,是吧。大家如果这个代码会写的话,后面我觉得问题都不是特别大的,那主要问题可能就出现在一些矩阵乘法,需要大家好好想一下啊,别的应该没有什么太大问题。
我来说两句