机器学习第二十周周报

摘要

本周学习了python中numpy的向量说明以及计算神经网络的输出以及多样本向量化的内容。逻辑回归是将各个训练样本组合成矩阵,对矩阵的各列进行计算。神经网络是通过对逻辑回归中的等式简单的变形,让神经网络计算出输出值,这种计算是所有的训练样本同时进行的。

Abstract

This week I learned about the vector description of numpy in python and the calculation of neural network output and multi-sample vectorization. Logical regression is to combine each training sample into a matrix and calculate each column of the matrix. The neural network makes the neural network calculate the output value through the simple deformation of the equation in the logical regression, which is carried out by all the training samples at the same time.

一、关于 python _ numpy 向量的说明

Python的特性允许使用广播(broadcasting)功能,这是Python的numpy程序语言库中最灵活的地方。而我认为这是程序语言的优点,也是缺点。优点的原因在于它们创造出语言的表达性,Python语言巨大的灵活性使得你仅仅通过一行代码就能做很多事情。但是这也是缺点,由于广播巨大的灵活性,有时候你对于广播的特点以及广播的工作原理这些细节不熟悉的话,你可能会产生很细微或者看起来很奇怪的bug。例如,如果你将一个列向量添加到一个行向量中,你会以为它报出维度不匹配或类型错误之类的错误,但是实际上你会得到一个行向量和列向量的求和。

在Python的这些奇怪的影响之中,其实是有一个内在的逻辑关系的。但是如果对Python不熟悉的话,我就曾经见过的一些学生非常生硬、非常艰难地去寻找bug。所以我在这里想做的就是分享给你们一些技巧,这些技巧对我非常有用,它们能消除或者简化我的代码中所有看起来很奇怪的bug。同时我也希望通过这些技巧,你也能更容易地写没有bug的Python和numpy代码。

为了演示Python-numpy的一个容易被忽略的效果,特别是怎样在Python-numpy中构造向量,让我来做一个快速示范。首先设置a=np.random.randn(5),这样会生成存储在数组a中的5个高斯随机数变量。之后输出a,从屏幕上可以得知,此时a的shape是一个(5,)的结构。这在Python中被称作一个一维数组。它既不是一个行向量也不是一个列向量,这也导致它有一些不是很直观的效果。举个例子,如果我输出一个转置阵,最终结果它会和a看起来一样,所以a和a的转置阵最终结果看起来一样。而如果我输出a和a的转置阵的内积,你可能会想:a乘以a的转置返回给你的可能会是一个矩阵。但是如果我这样做,你只会得到一个数。
在这里插入图片描述
所以当编写神经网络时,不要在它的shape是(5,)还是(n,)或者一维数组时使用数据结构。相反,如果你设置a为(5,1),那么这就将置于5行1列向量中。在先前的操作里 a和a 的转置看起来一样,而现在这样的 a变成一个新的 a的转置,并且它是一个行向量。请注意一个细微的差别,在这种数据结构中,当我们输出a的转置时有两对方括号,而之前只有一对方括号,所以这就是1行5列的矩阵和一维数组的差别。
在这里插入图片描述
如果你输出 a和a的转置的乘积,然后会返回给你一个向量的外积。所以这两个向量的外积返回给你的是一个矩阵。
在这里插入图片描述
就我们刚才看到的,再进一步说明。首先我们刚刚运行的命令是这个a=np.random.randn(5) ,而且它生成了一个数据结构 (a.shape),a.shape是(5,),一个有趣的东西。这被称作a的一维数组,同时这也是一个非常有趣的数据结构。它不像行向量和列向量那样表现的很一致,这也让它的一些影响不那么明显。所以我建议,当你在编程练习或者在执行逻辑回归和神经网络时,你不需要使用这些一维数组。
在这里插入图片描述
相反,如果你每次创建一个数组,你都得让它成为一个列向量,产生一个(5,1)向量或者你让它成为一个行向量,那么你的向量的行为可能会更容易被理解。所以在这种情况下,a.shape等同于(5,1)。这种表现很像a,但是实际上却是一个列向量。同时这也是为什么当它是一个列向量的时候,你能认为这是矩阵(5,1);同时这里a.shape将要变成(1,5),这就像行向量一样。所以当你需要一个向量时,我会说用这个或那个(column vector or row vector),但绝不会是一维数组。
在这里插入图片描述
我写代码时还有一件经常做的事,那就是如果我不完全确定一个向量的维度(dimension),我经常会扔进一个断言语句(assertion statement)。像这样,去确保在这种情况下是一个(5,1)向量,或者说是一个列向量。这些断言语句实际上是要去执行的,并且它们也会有助于为你的代码提供信息。所以不论你要做什么,不要犹豫直接插入断言语句。如果你不小心以一维数组来执行,你也能够重新改变数组维数a=reshape ,表明一个(5,1)数组或者一个(1,5)数组,以致于它表现更像列向量或行向量。
在这里插入图片描述
我有时候看见学生因为一维数组不直观的影响,难以定位bug而告终。通过在原先的代码里清除一维数组,我的代码变得更加简洁。而且实际上就我在代码中表现的事情而言,我从来不使用一维数组。因此,要去简化你的代码,而且不要使用一维数组。总是使用n1维矩阵(基本上是列向量),或者1n维矩阵(基本上是行向量),这样你可以减少很多assert语句来节省核矩阵和数组的维数的时间。另外,为了确保你的矩阵或向量所需要的维数时,不要羞于 reshape 操作。

二、计算一个神经网络的输出

在这里插入图片描述
关于神经网络是怎么计算的,从我们之前提及的逻辑回归开始,如下图所示。用圆圈表示神经网络的计算单元,逻辑回归的计算有两个步骤,首先你按步骤计算出z,然后在第二步中你以sigmoid函数为激活函数计算z(得出a),一个神经网络只是这样子做了好多次重复计算。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如上图左半部分所示为神经网络,把网络左边部分盖住先忽略,那么最后的输出单元就相当于一个逻辑回归的计算单元。当你有一个包含一层隐藏层的神经网络,你需要去实现以计算得到输出的是右边的四个等式,并且可以看成是一个向量化的计算过程,计算出隐藏层的四个逻辑回归单元和整个隐藏层的输出结果,如果编程实现需要的也只是这四行代码。

三、多样本向量化

在这个视频,将会了解到如何向量化多个训练样本,并计算出结果。该过程与你在逻辑回归中所做类似。
逻辑回归是将各个训练样本组合成矩阵,对矩阵的各列进行计算。神经网络是通过对逻辑回归中的等式简单的变形,让神经网络计算出输出值。这种计算是所有的训练样本同时进行的,以下是实现它具体的步骤:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在垂直方向,这个垂直索引对应于神经网络中的不同节点。例如,这个节点,该值位于矩阵的最左上角对应于激活单元,它是位于第一个训练样本上的第一个隐藏单元。它的下一个值对应于第二个隐藏单元的激活值。它是位于第一个训练样本上的,以及第一个训练示例中第三个隐藏单元,等等。
当垂直扫描,是索引到隐藏单位的数字。当水平扫描,将从第一个训练示例中从第一个隐藏的单元到第二个训练样本,第三个训练样本……直到节点对应于第一个隐藏单元的激活值,且这个隐藏单元是位于这m个训练样本中的最终训练样本。
从水平上看,矩阵A代表了各个训练样本。从竖直上看,矩阵A的不同的索引对应于不同的隐藏单元。

对于矩阵Z,X情况也类似,水平方向上,对应于不同的训练样本;竖直方向上,对应不同的输入特征,而这就是神经网络输入层中各个节点。

神经网络上通过在多样本情况下的向量化来使用这些等式。

四、总结

本周进行了神经网络输出以及多样本向量化的公式推导,下周将继续学习多样本向量化以及其他内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值