2.4 神经网络最优化过程

2.4 神经网络最优化过程

学习目标

  • 目标

    • 知道最优化的定义

    • 掌握神经网络的链式法则和反向传播算法

    • 掌握计算图的向量计算方式

  • 应用

    • 应用完成单神经元神经网络

2.4.1 最优化(Optimization)

2.4 神经网络最优化过程

2.4.1.1 梯度下降算法过程(复习)

2.4 神经网络最优化过程

2.4 神经网络最优化过程

2.4.2 神经网络的链式法则与反向传播算法

反向传播是训练神经网络最重要的算法,可以这么说,没有反向传播算法就没有深度学习的今天。但是反向传播算法设计一大堆数据公式概念。所以我们先复习回顾一下之前导数计算过程以及要介绍的新的复合函数多层求导计算过程。

  • 导数、导数计算图

  • 链式法则、逻辑回归的梯度下降优化、向量化编程

2.4.2.1 导数(复习)

2.4 神经网络最优化过程

2.4.2.2 导数计算理解(复习)

2.4 神经网络最优化过程

2.4 神经网络最优化过程

2.4 神经网络最优化过程

2.4.2.3 导数计算图

2.4 神经网络最优化过程

2.4.2.5 使用链式法则计算复合表达式

2.4 神经网络最优化过程

2.4.2.6 案例:逻辑回归的链式法则推导过程

2.4 神经网络最优化过程

2.4.2.7 案例:逻辑回归前向与反向传播简单计算

假设简单的模型为y =sigmoid(w1x1+w2x2+b), 我们在这里给几个随机的输入的值和权重,带入来计算一遍,其中在点x1,x2 = (-1 -2),目标值为1,假设给一个初始化w1,w2,b=(2, -3, -3),由于中间有sigmoid的计算过程,所以我们用代码来呈现刚才的过程。

# 假设一些随机数据和权重,以及目标结果1

w = [2,-3,-3]

x = [-1, -2]

y = 1

 

# 前向传播

z = w[0]*x[0] + w[1]*x[1] + w[2]

a = 1.0 / (1 + np.exp(-z))

cost = -np.sum(y * np.log(a) + (1 - y) * np.log(1 - a))

 

# 对神经元反向传播# 点积变量的梯度, 使用sigmoid函数求导

dz = a - y

# 回传计算x梯度

dx = [w[0] * dz, w[1] * dz]

# #回传计算w梯度和b的梯度

dw = [x[0] * dz, x[1] * dz, 1.0 * dz]

 

2.4 神经网络最优化过程

2.4.3 反向传播的向量化编程实现

2.4 神经网络最优化过程

 

2.4.3.1 向量化优势

2.4 神经网络最优化过程

import numpy as np

import time

a = np.random.rand(100000)

b = np.random.rand(100000)

  • 第一种方法

# 第一种for 循环

c = 0

start = time.time()

for i in range(100000):

c += a[i]*b[i]

end = time.time()

 

print("计算所用时间%s " % str(1000*(end-start)) + "ms")

  • 第二种向量化方式使用np.dot

# 向量化运算

start = time.time()

c = np.dot(a, b)

end = time.time()

print("计算所用时间%s " % str(1000*(end-start)) + "ms")

Numpy能够充分的利用并行化,Numpy当中提供了很多函数使用

函数

作用

np.ones or np.zeros

全为1或者0的矩阵

np.exp

指数计算

np.log

对数计算

np.abs

绝对值计算

np.dot

相乘

所以上述的m个样本的梯度更新过程,就是去除掉for循环。原本这样的计算

2.4.3.2 向量化反向传播实现伪代码

2.4 神经网络最优化过程

代码实现过程, 这里假设有10个样本,每个样本两个特征

# 随机初始化权重# w1,w2

W = np.random.random([2, 1])

X = np.random.random([2, 10])

b = 0.0

Y = np.array([0, 1, 1, 0, 1, 1, 0, 1, 0, 0])

 

Z = np.dot(W.T, X) + b

A = 1.0 / (1 + np.exp(-Z))

cost = -1 / 10 * np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A))

# 形状:A:[1, 10] , Y:[1, 10]

dZ = A - Y

# [2, 10] * ([1, 10].T) = [2, 1]

dW = (1.0 / 10) * np.dot(X, dZ.T)

db = (1.0 / 10) * np.sum(dZ)

2.4.5 总结

  • 导数、导数计算图

  • 链式法则、逻辑回归的梯度下降优化计算过程

2.4 神经网络最优化过程

2.4 神经网络最优化过程

2.4 神经网络最优化过程