机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记

代价函数理解:

神经网络本质也是分类算法,但是比原来的逻辑回归复杂一点点。
所以其代价函数也只需要对逻辑回归的代价函数进行亿点点修改:
机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第1张图片
变成:
机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第2张图片
因为很长一下子接受不了,咱也是在草稿纸上演画了一会才懂:
机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第3张图片

前面一大段求和看另外的图:
机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第4张图片
机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第5张图片
不过在真实的神经网络训练和测试中,至少在下面的简单的神经网络方法内,每个输出节点不可能完全为0或完全为1,此时认定最大的为1,其余为0。
这样一来,对神经网络的代价函数应该有了直观的印象和比较深刻的理解了。
那么之后对梯度下降应该能更好理解了。

数据预处理:

  1. 导包
    在这里插入图片描述
  2. 载入训练集:(中文注释有详细解释)

机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第6张图片

  1. 写可视化函数以展示训练数据
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第7张图片

机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第8张图片
这是没有转置图片的效果:
机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第9张图片

这里有个小注意点,因为在Matlab中下标是从1开始而非0,所以对图片0的结果用10来表示。(训练论文里是这么写的,因为这一点对训练数据集产生的影响还会在后面体现)

  1. 准备数据
    每张图片的第一个位置前插入一个1,后面就知道这里其实是在添加偏置项Θ0
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第10张图片
    然后这边做了不少事情,看后面画的图
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第11张图片
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第12张图片
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第13张图片
    上面一通乱搞后,y就变成了下面的向量组形式,每一列为一个神经网络输出类别
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第14张图片

神经网络模型:

  1. 首先我们对训练模型进行一个顶层的把握:
    对于这篇笔记里面的神经网络,我稍加思索,整体把握,发现这实际上是一个隐藏层为0的神经网络,也就是读入特征后直接就能计算输出结果向量了——所以这完全就是逻辑回归嘛!改变就没有中间层。所以考虑之后自己改一改多改几个隐藏层出来。
    此外,
    开头说神经网络是一种多维的分类算法,其本质还只是二维的01分类算法(0和1都是有效分类结果)
    只不过每一次训练跑K次01分类就变成了K维分类算法。(这时每个分类结果用含有1个1的向量表示,整体表示一个有效分类结果)
    因此先要对01分类有一个把握:

  2. 这一段是计算这一坨东西的,但是其中K=1,代表就是01分类的代价函数求和项。
    在这里插入图片描述
    在这里插入图片描述

  3. 这里则是计算代价函数正则项,代码注释意思是对Θ0不进行正则限制。
    同时在返回的时候计算前面的求和项,结果加起来一起返回出去
    在这里插入图片描述
    (内l是小写L表示λ,神他妈看成1)
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第15张图片

  4. 因为没有隐藏层,所以实际上参数列表(Θ矩阵)只有一维,作为一个逻辑回归看待的话,梯度计算就很简单了:
    逻辑回归的sigmoid函数
    在这里插入图片描述
    求和的梯度:
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第16张图片
    正则化的梯度:
    中间有一句注释,表示就是其后一句语句所做事情的解释
    具体内涵就是在正则化带来的Θ改变量向量(也就是在这里插入图片描述带来的参数改变量数组)前加上一个0,表示不对Θ0进行正则化的修改。
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第17张图片

  5. 上面代价函数也有了,梯度计算也有了,可以像之前一样调用一个自动优化函数帮助我们直接降低代价函数咧:
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第18张图片

  6. 最后训练得到模型(其实就是一个Θ一维向量)
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第19张图片

  7. 写一个简单的预测函数拿来预测
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第20张图片
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第21张图片

  8. 但是这种情况下,它只能识别是否是数字0:
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第22张图片

  9. 让它从01分类变成10维分类的方法,就是直接让整个模型对每一个输出节点跑一边上述训练:
    (图中箭头的Θ参数都是不一样的。)机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第23张图片
    对应到代码里面:
    在这里插入图片描述

  10. 形成了10*401的训练参数列表,训练完后,就可以测试预测了:
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第24张图片
    这段废话就是讲在这个没有隐藏层的模型下,可以直接用X(5000,401)与参数列表(401,10)做矩阵乘法,得到5000张图片各自的神经网络输出向量。
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第25张图片
    其每一行都是一组神经网络输出向量,某一行下标为 i 的值表示该行对应图片的数字为 i 的可能性。

含有隐藏层的神经网络模型:

这里因为没有讲到反向传播,所以只先体验一下前向传播的流程,其实和上面是一样一样的

  1. 这里就是两次隐藏层
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第26张图片
    代码:
    直接读取训练好的模型,Θ1和Θ2两组。
    一个为(25401) 表示从一个400个特征的图片加一个偏置单元的图片,转化到25个特征的小一点的中间层,
    另一个为(10
    26) 表示从25个特征的中间层加一个偏置单元,转化为10个输出节点值,组成神经网络输出向量。
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第27张图片
    然后这个训练好的模型是用的没有把图片转置的原始数据,所以重新读入一下数据
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第28张图片
    跑一边第一层,原来5000张图,每张400个特征+1的数据,变成5000张图,每张特征提取到25个。
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第29张图片
    提取到25个后加一个偏置单元(适应训练好的模型中偏置单元的出度),
    然后跑一边第二层
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第30张图片
    输出结果就是这样了
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第31张图片
    对于这个数据集,用没有隐藏层的神经网络模型和有一层神经网络模型的输出结果精确度比较
    还是有一层的来的比较强一点
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第32张图片
    机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记_第33张图片

你可能感兴趣的:(机器学习笔记,神经网络,python,机器学习,人工智能)