第二周 神经网络基础
- 2.1 二分类
计算机保存图片通常是保存RGB三个通道,假设图片为64*64像素,则有三个64*64的矩阵。
将所有的像素强度都输入进特征向量x,则x的长度为64*64*3,输入向量维度为
符号表示:(x,y)
用X表示所有训练集,则,一共
行,m列
Python命令:X.shape 输出结果:
- 2.2 Logistic 回归
给定x,希望得到
逻辑回归
在课程的神经网络编程中,通常将w,b分开表示,b对应一个拦截器
- 2.3 Logistic回归的损失函数和代价函数
Loss Function: 针对单样本
若y = 1,需要,需要Loss Function尽量小,则
变大,又Sigmoid函数不会超过(0,1)的范围,所以
接近1
Cost Function: 针对全部训练样本
- 2.4 梯度下降法
Cost Function衡量了w, b在训练集上的性能,找出最优参数值,使得J(w, b)最小,代价函数是一个凸函数。
对于Logistic函数来说,无论初始值在哪里,理论上都可以找到最优值,但是一般都初始化为0.
梯度下降是朝下降最陡的方向前进一步。
更新公式为:
- 2.5 导数
导数代表斜率。
本节中给出了一个直线的例子,高中数学可以知道,一条直线上,任何点的斜率都相同。所以,直线上任何点的导数都相同。
- 2.6 更多导数的例子
这节中给出了导数在每个点不同的例子,如
- 2.7 计算图
通过一个从左向右的过程,计算出代价函数J的值,相当于神经网络中的前向传播的过程。
本节中举的例子是J=3(a+bc)
u = b*c; v = a+u; J = 3*v
- 2.8 计算图的导数计算
流程图和2.7中一样
在反向传播中,算出只是做了一步的反向传播求导。
链式法则:,这个法则要闹记,在神经网络中经常使用
实际上,就是a的变化,引起了v的变化,进而引起了J的变化。
在后续的Python编程题中,有一个统一的命名规则,把定义为dvar
本节的要点是:对于反向传播时,计算所有导数,最有效率的方法是从右到左的计算。
- 2.9 Logistic回归中的梯度下降
根据2.7和2.8节中的内容,画出LR的计算图(流程图)。
分别求出下面五个偏导方程结果。有兴趣的同学可以自己推导一下
最后得出权重更新公式
- 2.10 m个样本的梯度下降
上一节中提到的是对于单个样本的梯度下降,本节介绍的是针对全部训练集m个样本的梯度下降。
全局梯度值:
根据课程提供的伪代码,单次梯度下降的代码如下:
# 单次梯度下降.py
# 对代价函数,需要进行更新的参数值进行更新,假设这里的参数个数与2.9节中的流程图相同
import numpy as np
dJ = 0
dw1 = 0
dw2 = 0
db = 0
# 遍历m次训练样例,对相应的值进行累加
for ind in range(0,m):
zi = W.T * x[:,ind] + b
ai = sigmoid(zi)
J += -[yi*np.log(ai)+(1-yi)*np.log(1-ai)]
dzi = ai - yi
dw1 += x1i*dzi
dw2 += x2i*dzi
db += dzi
# 对所有m个样本的累积梯度值,求平均
J /= m
dw1 /= m
dw2 /= m
db /= m
# 进行一次参数更新
w1 -= alpha * dw1
w2 -= alpha * dw2
b -= alpha * db
缺点:这样计算全部样本的梯度下降,会有两次循环,第一次在遍历所有的训练样例,第二次在更新所有参数的权重。
因此,在深度学习中,需要引入向量化表示。