神经网络和深度学习WU Week2

神经网络基础

1. 二分分类

  • 例子:识别图片中是否有猫,有输出1否则输出0。

  • 计算机储存图片通过RGB,即用三个矩阵分别储存red、green和blue的像素值,以常见64*64为例,从而用一个64*64*3的矩阵储存一张图片。

    计算机对图片的储存

    如何用一个特征向量 (列向量)来表示这个像素矩阵?按照视频中的说明,先读取red矩阵的像素,逐行读取,以上图为例,读为,接着读取green矩阵的像素,仍是逐行读取,从而矩阵为 ,最后读取blue矩阵的像素,所以整个图片存储为一个列向量。
    即表示成如下:
    图片的储存矩阵

  • 符号约定
    :一个样本,为输入,为输出。
    个训练样本:
    训练集的样本数: 或
    测试集的样本数:
    矩阵:每一列是一个样本,从而是维的。

    样本的矩阵表示

    • 对应python命令X.shape输出的维数

    同样的,输出也表示为一个维向量。python命令Y.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:
      • Step2:。所以有


      • Step3.

      • Step4.迭代公式:


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))

你可能感兴趣的:(神经网络和深度学习WU Week2)