神经网络为什么迅速take off的原因:
随着数据量的增大,神经网络的表现也更好
神经网络的实际工作原理
例一需求预测:预测一件T恤是否畅销
之前我们采用f(x)表示输出,这里为了我们建立一个神经网络,我们将f(x)称为a,用来表示这里逻辑回归算法的输出。
对于更复杂的需求,比如有price、shipping cost等四个输入特征
输入层中的四个特征以向量的形式输入给隐藏层,然后隐藏层输出三个数字(affordability、awareness和quality),这三个值也叫做激活值,并以此输入给输出层,输出这个T恤是否为畅销书的概率,而这里神经网络不需要你像之前的特征工程那样,手动的设计特征x1*x2这样的,它可以自己学习影响预测的几个重要特征affordability、awareness和quality这样的,你事先无须知道这三个因素,这都是由算法自己学习到的,所以也叫做隐藏层。而这一自动学习的特性也成为了神经网络能够有很好的学习特性的一大因素。
对于构建大型的神经网络,决定哪些特征与隐藏层中的哪些单元有关系是比较困难的,于是我们把隐藏层和输入层直接弄成全连接,就是说隐藏层它可以访问输入层的所有特征
以上是只有一个隐藏层的示例,接下来我们看一下多个隐藏层的问题
当你构建一个神经网络时,需要多少隐藏层和每个隐藏层你需要多少神经元(即神经网络架构的问题)是你要决定的事情之一,这也会对你的神经网络性能产生影响。
在文献中有时会看到这样的表达,像上面这样拥有多个隐藏层的神经网络称之为多层感知器multilayer perception,这只是指一个神经网络
例二图像感知:人像识别
可以看出第一个隐藏层试图利用很小的方框去找到图像的边缘和短线,第二个隐藏层是用再大一点的方框去找到眼睛啊鼻子啊这些,第三个隐藏层是用最大的那个方框去尝试检测是否存在较大、较粗糙的面部形状,这些小的神经元可视化实际上对应于图像中不同的大小区域。
而这些不需要我们去提出哪一层需要做哪些事情,这些都是由神经网络自己figure out,都可以自己从数据中自行找出。
检测how much脸对应不同脸型的程度creates一组很多很丰富的特征,这些特征帮助输出层try to 确定图片中人物的身份
当我们更换为识别汽车时,可以发现其过程基本相近,这也说明了只需要我们向神经网络提供不同的数据,神经网络自己就会自动学习检测特征,即使这些特征是差别很大(人跟车)
这里注意一个:激活值是高层次的特征(个人理解是激活值对预测影响更大的一些特征)
本次的学习,我们主要是在intuition的层次上去直觉上理解神经网络的工作,接下来我们将会把目光集聚到神经网络工作的具体数学和如何实际构建一个神经网络的具体细节
神经网络工作原理
每一层都输入一个数字向量并对其应用一堆逻辑回归单元然后计算出另一个数字向量,这样一层到一层,直到你得到输出层的计算也即神经网络的预测,然后根据你设置的阈值来得出y-hat的值
这里我们采用示例一需求预测的数据,关注并放大第一层隐藏层的计算:
这里我们需要注意的是一个notation,层数的表示用[l]方括号来表示,所以根据第一层隐藏层的计算会输出一个激活值的向量a到第二层隐藏层(也即输出层),作为第二层隐藏层的输入,而由于输出层的神经元只有一个,所以其输出的是一个数字(标量),区别于第一层输出的向量
假设输出层输出的数字为0.84,根据阈值(你可以将阈值设为0.5或者其他,以此去得出最终预测)去判断y-hat是0还是1
构建更复杂的神经网络
当我们说神经网络的层数时不包括输入层
这里的g是激活函数(输出激活值的函数),通过这个公式我们可以在给出上一层的激活值后计算出任何层的激活值,我们将这个放入神经网络的推理算法中
如何让神经网络进行推理或预测
这里我们采用手写数字识别0或1的例子:
由于这个计算是从左到右进行的,传播神经元的激活值所以也被称为前向传播forward propagation,随着靠近输出层,隐藏层单元的数量也会减少,这就是使用前向传播的神经网络推理,通过这个你就可以下载别人训练过的神经网络参数,并使用这些参数训练你自己的网络
tensorflow实现
可以看出layer1的组成:三个隐藏单元并且激活函数时sigmod函数dense只是这个隐藏层的名称(或者说类型),以上是利用TensorFlow计算a1,a2的关键步骤,加载TensorFlow库以及参数w,b的代码并未展示
以上就是利用TensorFlow进行推理的语法
TensorFlow中的数据形式
了解TensorFlow以某种方式去处理数据,这对于TensorFlow的应用很重要。当我们实施或构建新的神经网络时,可以有一个一致的框架来考虑如何表示数据,但在Numpy和TensorFlow中数据的表示方式之间存在差异
我们在使用线性回归和逻辑回归的时候,我们使用这样的一维向量来表示输入特征x而对于TensorFlow来说,惯例是使用矩阵来表示数据,因为TensorFlow旨在处理的是非常大的数据集,并通过在矩阵而不是一维数组中表示数据,可以使得TensorFlow在内部更高效地计算
回到我们用于在神经网络中传播或影响的代码
如果你print a1会得到类似tf.Tensor([[0.2 0.7 0.3]],shape=(1,3),dtype=float32)的形式,这里的张量Tensor是TensorFlow团队创建的一种数据类型,用于有效存储和执行矩阵计算,从技术上讲张量一般要比矩阵更通用些,事实上如果你想获取一个张量a1并将其转换回Numpy数组,可以使用a1.numpy()来实现,在第二层隐藏层也同样如此:
我们习惯在Numpy中加载和操作数据,但是当您将Numpy数组传递给TensorFlow时,TensorFlow喜欢将其转换为张量tensor的形式,当你要读回数据的时候你可以选择保留tensor的形式或者转换成Numpy的形式