神经网络基础
1. 二分分类
例子:识别图片中是否有猫,有输出1否则输出0。
-
计算机储存图片通过RGB,即用三个矩阵分别储存red、green和blue的像素值,以常见64*64为例,从而用一个64*64*3的矩阵储存一张图片。
计算机对图片的储存
如何用一个特征向量(列向量)来表示这个像素矩阵?按照视频中的说明,先读取red矩阵的像素,逐行读取,以上图为例,读为
,接着读取green矩阵的像素,仍是逐行读取,从而矩阵为
,最后读取blue矩阵的像素,所以整个图片存储为一个列向量
。
即表示成如下:图片的储存矩阵 -
符号约定
:一个样本,
为输入,
为输出。
个训练样本:
训练集的样本数:或
测试集的样本数:
矩阵:每一列是一个样本,从而是
维的。
样本的矩阵表示- 对应python命令X.shape输出
的维数
同样的,输出
也表示为一个
维向量
。python命令Y.shape会输出
。
- 对应python命令X.shape输出
2. Logistic回归
-
:对输出
的预测值,在二分类问题中就是
取1的概率
。
- 参数:
,
- 给出输入变量
和参数
,如何得到预测值
?
线性回归是,但并不是一个很好的二分分类方法,因为我们希望
是个介于0和1之间的数以表示概率,而
可以取任何值甚至是负数,为克服这个困难将输出做一个sigmoid函数变换
,其中sigmoid函数为
,其函数图像为
sigmoid函数图像
可以看到:- 当
取相当大的数时,
趋向于0,从而
趋向于1
- 而当
取相当大的负数时,
趋向于
,从而
趋向于0
- 当
时,
所以取值位于0和1之间。
- 当
3. Logistic 回归——cost function(成本函数/代价函数)
- 为了训练
和
需要定义cost function,用来衡量算法效果。
- 回顾:Logistic回归
,其中
,给定训练集
,希望有
。
- 先定义针对单个样本的Loss (Error) Function
:度量预测值
与实际值
之间有多接近。
- 例如,可以定义
,事实上并不这样应用,因为这样会导致函数非凸从而有多个局部最优解,所以使用梯度下降法时无法找到最优解(
)。
- 在Logistic回归中会定义一个凸的损失函数:
- 若
,则
,让损失函数尽可能小,从而
尽可能大,从而
尽可能大,而
是sigmoid函数的输出,最大就是1,所以此时是要让
;
- 若
,则
,让损失函数尽可能小,从而
尽可能大,从而
尽可能大,即
尽可能小,而
是sigmoid函数的输出,最小就是0,所以此时是要让
- 若
- 例如,可以定义
- cost function(成本函数):度量在训练集上的整体表现。
- 注:
4.梯度下降法
用来训练或学习训练集上的参数
。
回顾:
-
梯度下降法就是给定初始的
,找到当前下降最快的方向走一步,再找当前下降最快的方向走一步,一直到找到最优解为止,因为我们上面定义的Loss Function是凸函数,所以肯定能找到全局最优解。如下图所示。
梯度下降法示意图- Logistic回归基本上任意初始化方法都好用,一般初始化为0。
-
其具体过程为,针对参数
,迭代为
- 其中
是学习率,可以控制每次迭代或者说梯度下降法中的步长。
- 编程时就用
表示对
的偏导数。
-
是凸函数,因此,若
,
迭代后向着减小的方向步进,图上来看就是向左迭代;若
,
迭代后向着增大的方向步进,图上来看就是向右迭代,无论哪种情况,都会找到全局最优解,如下图所示。
w迭代示意图
- 其中
类似的,
的迭代为:
5.计算图(前向传播)及其导数计算(后向传播)
5.1 计算图
- 计算图感觉像高数里的函数复合过程用图表示出来。
- toy example
,其复合与计算过程如下图
toy example的复合和计算过程
5.2 计算图的导数计算
从右向左推导出复合函数的链式求导法则。
复合函数的链式求导法则示例
6.Logistic回归中的梯度下降
6.1 单个样本的情况
- 回顾Logistic回归
- 公式:
- 计算步骤(前向,计算loss function):
假设有两个特征,从而所需参数为
- Step1:计算
;
- Step2:计算
,其中
是sigmoid函数
;
- Step3:计算loss function:
。
即输入参数计算损失函数最小。如图所示。
单个样本的logistic流程图
- Step1:计算
- 计算步骤(后向,计算偏导数)
- Step1:
- Step2:
。所以有
;
- Step3.
- Step4.迭代公式:
- Step1:
- 公式:
6.2
个样本的训练集
- 回顾:
其中
- 计算偏导数
- 伪代码流程
# w,b一次迭代的流程
dw_1=0,dw_2=0,db=0,J=0
for i in range(m): #m个样本
z(i) = w^T*x(i)+b
a(i) = \sigma(z(i))
J+=-[y(i)log(a(i))+(1-y(i))log(1-a(i))]
dz(i) = a(i)-y(i)
dw_1 += x_1(i)[a(i)-y(i)]
dw_2 += x_2(i)[a(i)-y(i)] #假设有2个特征,即n=n_x=2
db += a(i)-y(i)
J/=m
dw_1/=m,dw_2/=m,db/=m
w_1 -=\alpha * dw_1
w_2 -=\alpha * dw_2
b -=\alpha * db
- 说明:
- 该流程有2个for循环,第一个是遍历m个样本点,第二个是遍历2个特征。
- 深度学习中有大量的数据,所以尽量避免使用显式的for循环,从而引出vectorization。
7.Vectorizaion(向量化)
7.1 向量化
- 只要有其他可能,就不要用显式for循环
Whenever possible, avoid explicit for-loops。 - numpy模块的内置函数
np.exp()
np.log()
np.abs()
- 利用向量化,前面的程序可以修改为
import numpy as np
# w,b一次迭代的流程
dw=np.zeros((n_x,1)),db=0,J=0
for i in range(m): #m个样本
z(i) = w^T*x(i)+b
a(i) = \sigma(z(i))
J+=-[y(i)log(a(i))+(1-y(i))log(1-a(i))]
dz(i) = a(i)-y(i)
dw += x(i)[a(i)-y(i)]
db += a(i)-y(i)
J/=m
dw /=m, db/=m
w_1 -=\alpha * dw_1
w_2 -=\alpha * dw_2
b -=\alpha * db
7.2 向量化Logistic回归
- 回顾:m个样本的训练集
,
,
………
,
记,既每一列是一个样本,矩阵维数为
。
既
的行向量。从而上式可写为
。A=[a{(1)},a{(2)},…,a{(m)}]。
z=np.dot(w.T,X)+b
a=\sigma(z)
7.3 向量化Logistic回归的梯度计算
- 回顾公式:
- 向量化
所以,.
- Logistic回归的向量化伪代码
z = w^T*X + b = np.dot(w^T,X) + b
a = \sigma(z)
dz = A - Y
dw = 1/m*X*dz^T db = 1/m*np.sum(dz)
dw /=m, db/=m
w := w - \alpha * dw
b = b - \alpha * db
8. Python 中的Broadcasting
8.1 Broadcasting
Broadcasting是计算中对维数要求没有那么严格,可以自己调整维度以适应计算。
-
例子
示意矩阵
问题:计算每种食物中各成分的占比
import numpy as np
A = np.array([[56,0,4.4,68],
[1.2,104,52,8],
[1.8,135,99,0.9]])
cal = A.sum(axis=0)
percentage = A/cal.reshape(1,4)
print(100 * percentage)
Broadcasting维度不必严格要求,但是行或列必须有一个是相同的,python才能自己复制成合适维度的矩阵进行计算。
- MATLAB中类似的是bsxfun函数。
8.2 编程小技巧
*尽量不要使用秩为1的数组
a = np.random.randn(5)
使用有明确维度的矩阵
a = np.random.randn(5,1)
可以使用reshape()来改变矩阵的维度
a.reshape(1,5)
可以使用assert()来声明你希望的矩阵维度
assert(a.shape == (1,5))