人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)

人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)

  • 说明
  • 一、神经网络计算过程
    • 1. 人工智能三学派
    • 2. 神经网络设计过程
      • 2.1 人脑中的神经网络形成过程
      • 2.2 计算机模仿神经网络连接关系
    • 3.神经网络设计过程
      • 3.1 数据集介绍
      • 3.2 网络搭建与训练
        • 3.2.1 神经元的计算模型
        • 3.2.2 全连接网络的搭建
        • 3.2.3 定义损失函数
          • 3.2.3.1 损失函数
          • 3.2.3.2 梯度下降法
  • 传送门


说明

本文内容整理自中国大学MOOC “北京大学-人工智能实践:Tensorflow笔记” 课程,转载请注明出处
授课老师:曹健
中国大学MOOC 人工智能实践:Tensorflow笔记课程链接
本讲目标:理解神经网络计算过程,使用基于TF2原生代码搭建第一个神经网络训练模型
本节内容:介绍神经网络相关的基本概念,剖析神经网络实际计算过程


一、神经网络计算过程

1. 人工智能三学派

人工智能:让机器具备人的思维和意识。

人工智能三学派:

  1. 行为主义:基于控制论,构建感知-动作控制系统。(如人的平衡、行走、避障等自适应控制系统)
  2. 符号主义:基于算数逻辑表达式,求解问题时先把问题描述为表达式,再求解表达式。(可用公式描述、实现理性思维,如专家系统)
  3. 连接主义:基于仿生学,模仿神经元连接关系。(仿脑神经元连接,实现感性思维,如神经网络)

2. 神经网络设计过程

2.1 人脑中的神经网络形成过程

图1展示了人脑中的一根神经元,其中紫色部分为树突,其作为神经元的输入。黄色部分为轴突,其作为神经元的输出
人脑就是由大约 860 亿个这样的神经元首尾相接组成的网络。
人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)_第1张图片

图1 神经元示意图

图2 展示了从出生到成年,人脑中神经网络的变化。
人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)_第2张图片

图2 人脑神经网络变化示意图

随着我们的成长,大量的数据通过视觉、听觉涌入大脑,使我们的神经网络连接,也就是这些神经元连接线上的权重发生了变化,有些线上的权重增强了,有些线上的权重减弱了。
如图3 所示。
人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)_第3张图片

图3 神经网络权重变化示意图

2.2 计算机模仿神经网络连接关系

要用计算机模仿刚刚说到的神经网络连接关系,让计算机具备感性思维,需要4个步骤:
数据采集->搭建网络->优化参数->应用网络

  • 数据采集:采集大量“标签/特征”数据
  • 搭建网络:搭建神经网络结构
  • 优化参数:训练网络获取最佳参数(反向传播
  • 应用网络:将网络保存为模型,输入新数据,输出分类或预测结果(前向传播
    人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)_第4张图片
    图4 神经网络权重变化示意图

3.神经网络设计过程

3.1 数据集介绍

本文中采用鸢尾花数据集,此数据集包含鸢尾花 “花萼长花萼宽花瓣长花瓣宽 ”及对应的类别。
其中前 4 个属性作为输入特征,类别作为标签,0 代表狗尾草鸢尾(Iris Setosa),1 代表杂色鸢尾(Iris Versicolour),2 代表弗吉尼亚鸢尾(Iris Virginica)。

人们通过对数据进行分析总结出了规律:通过测量花的花萼长、花萼宽、花瓣长、花瓣宽,可以得出鸢尾花的类别
(如:“花萼长>花萼宽” 且 “花瓣长/花瓣宽>2” ,则 “杂色鸢尾”)。

由上述可知,可通过 if 与 case 语句构成专家系统,进行判别分类。
在本文中,采用搭建神经网络的办法对其进行分类。即将鸢尾花花萼长、花萼宽、花瓣长、花瓣宽四个输入属性喂入搭建好的神经网络,网络优化参数得到模型,输出分类结果。

3.2 网络搭建与训练

采用搭建神经网络的办法对其进行分类,需要将鸢尾花花萼长、花萼宽、花瓣长、花瓣宽四个输入属性喂入搭建好的神经网络,网络优化参数得到模型,输出分类结果。设想中构建的神经网络如下图所示:
人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)_第5张图片

3.2.1 神经元的计算模型

1943年,英国心理学家玛卡洛克和数学家皮茨给出了神经元的计算模型,即MP模型
人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)_第6张图片

为求解简单,本文将MP模型进行简化,去掉非线性函数后MP模型如下所示。
人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)_第7张图片
由矩阵乘法,该模型可用数学表达式写为:
y = x × w + b y=x \times w+b y=x×w+b

在鸢尾花数据集中,各矩阵大小如下:

变量 行数 列数
y 1 3
x 1 4
w 4 3
b 3

3.2.2 全连接网络的搭建

搭建如图所示的全连接网络
人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)_第8张图片

1.初始化过程:搭建好基本网络后,需要输入特征数据,并对线上权重 w 与偏置 b 进行初始化。

假设搭建网络时随机初始化所有参数w和b分别如下:
人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)_第9张图片

图6 权重与偏置初始化矩阵

2.前向传播计算过程:有了输入数据与线上权重等数据,即可按照 y = x × w + b y=x \times w+b y=x×w+b 的方式进行前向传播。

假设某组鸢尾花数据为 [ 5.8 , 4.0 , 1.2 , 0.2 ](实际标签为0:狗尾草鸢尾花),则前向传播计算过程如图所示:
人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)_第10张图片

图7 前向传播计算过程示意图
在本次计算中,1类鸢尾花得分最高,为2.01分,因此该鸢尾花被判断为杂色鸢尾化(判断失误的原因是此时的w与b均为随机产生的,输出结果也就是随机数)

3.2.3 定义损失函数

3.2.3.1 损失函数

损失函数(loss function)定义预测值(y)和标准答案(标签)(y_)的差距。

损失函数可以定量的判断当前参数 w 和 b 的优劣,当损失函数最小时,即可得到最优 w 的值和 b 的值。
损失函数的定义有多种方法,均方误差就是一种常用的损失函数。

均方误差: M S E ( y , y _ ) = ∑ k = 0 n ( y − y _ ) 2 n \mathbf{MSE}(y,y\_)=\frac{\sum_{k=0}^n(y-y\_)^2}{n} MSE(y,y_)=nk=0n(yy_)2

3.2.3.2 梯度下降法

目的:寻找一组参数 w 和 b ,使得损失函数最小。
方法:梯度下降法 - 损失函数的梯度表示损失函数对各参数求偏导后的向量,损失函数梯度下降的方向,就是是损失函数减小的方向。梯度下降法即沿着损失函数梯度下降的方向,寻找损失函数的最小值,从而得到最优的参数。

梯度下降法更新参数时涉及的公式如下:
w t + 1 = w t − l r × ∂ l o s s ∂ w t b t + 1 = b − l r × ∂ l o s s ∂ b t w t + 1 × x + b t + 1 → y \boxed{ \begin{gathered} w_{t+1}=w_t-lr \times \frac{\partial{loss}}{\partial{w_t}}\\ b_{t+1}=b-lr \times \frac{\partial{loss}}{\partial{b_t}}\\ w_{t+1} \times x+b_{t+1} \rightarrow y \end{gathered} } wt+1=wtlr×wtlossbt+1=blr×btlosswt+1×x+bt+1y
其中,参数lr(learning rate)为学习率用于表征梯度下降的速度,是一个超参数。

梯度下降更新的过程为反向传播
其中如学习率lr设置过小,参数更新会很慢;
如果学习率lr设置过大,参数更新可能会跳过最小值。

eg(举例如下):
设损失函数为 l o s s = ( w + 1 ) 2 loss=(w+1)^2 loss=(w+1)2,则其对 w 的偏导数为 ∂ l o s s ∂ w t = 2 w + 2 \frac{\partial{loss}}{\partial{w_t}}=2w+2 wtloss=2w+2
该函数在平面内的图像如下所示:
人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)_第11张图片
由图像可知,该函数在w=-1时损失函数达到最小值,故最优解w=-1.
以下通过代码仿真反向传播过程中梯度下降法使损失函数减小,参数更新的过程:

import tensorflow as tf
w = tf.Variable(tf.constant(5, dtype=tf.float32))
lr = 0.2 #初始化参数
epoch = 40

for epoch in range(epoch): # for epoch 定义顶层循环,表示对数据集循环epoch次,此例数据集数据仅有1个w,初始化时候constant赋值为5,循环40次迭代。
   with tf.GradientTape() as tape:  # with结构到grads框起了梯度的计算过程。
   loss = tf.square(w + 1)
   grads = tape.gradient(loss, w)  # .gradient函数告知谁对谁求导
   w.assign_sub(lr * grads)  # .assign_sub 对变量做自减 即:w -= lr*grads 即 w = w - lr*grads
   print("After %s epoch,w is %f,loss is %f" % (epoch, w.numpy(), loss))

改变参数lr的初始值,观察程序的运行结果:

  • 当lr取0.2时,迭代31次后算法收敛,得到最优解 w=-1
  • 当lr取0.01时,迭代40次后算法未收敛,没有得到最优解
  • 当lr取0.99时,迭代40次后算法未收敛,没有得到最优解,但取值在最优解附件反复跳动

传送门

下一讲将介绍TensorFlow2.1 中的基本概念与常用函数。

人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-2)

你可能感兴趣的:(北京大学MOOC,人工智能,tensorflow,深度学习)