人工智能实践:Tensorflow2.0笔记 北京大学MOOC(1-1)
说明
本文内容整理自中国大学MOOC “北京大学-人工智能实践:Tensorflow笔记” 课程,转载请注明出处
授课老师:曹健
中国大学MOOC 人工智能实践:Tensorflow笔记课程链接
本讲目标:理解神经网络计算过程,使用基于TF2原生代码搭建第一个神经网络训练模型
本节内容:介绍神经网络相关的基本概念,剖析神经网络实际计算过程
一、神经网络计算过程
1. 人工智能三学派
人工智能:让机器具备人的思维和意识。
人工智能三学派:
- 行为主义:基于控制论,构建感知-动作控制系统。(如人的平衡、行走、避障等自适应控制系统)
- 符号主义:基于算数逻辑表达式,求解问题时先把问题描述为表达式,再求解表达式。(可用公式描述、实现理性思维,如专家系统)
- 连接主义:基于仿生学,模仿神经元连接关系。(仿脑神经元连接,实现感性思维,如神经网络)
2. 神经网络设计过程
2.1 人脑中的神经网络形成过程
图1展示了人脑中的一根神经元,其中紫色部分为树突,其作为神经元的输入。黄色部分为轴突,其作为神经元的输出。
人脑就是由大约 860 亿个这样的神经元首尾相接组成的网络。
图1 神经元示意图
图2 展示了从出生到成年,人脑中神经网络的变化。
图2 人脑神经网络变化示意图
随着我们的成长,大量的数据通过视觉、听觉涌入大脑,使我们的神经网络连接,也就是这些神经元连接线上的权重发生了变化,有些线上的权重增强了,有些线上的权重减弱了。
如图3 所示。
图3 神经网络权重变化示意图
2.2 计算机模仿神经网络连接关系
要用计算机模仿刚刚说到的神经网络连接关系,让计算机具备感性思维,需要4个步骤:
数据采集->搭建网络->优化参数->应用网络
- 数据采集:采集大量“标签/特征”数据
- 搭建网络:搭建神经网络结构
- 优化参数:训练网络获取最佳参数(反向传播)
- 应用网络:将网络保存为模型,输入新数据,输出分类或预测结果(前向传播)
图4 神经网络权重变化示意图
3.神经网络设计过程
3.1 数据集介绍
本文中采用鸢尾花数据集,此数据集包含鸢尾花 “花萼长、花萼宽、花瓣长、花瓣宽 ”及对应的类别。
其中前 4 个属性作为输入特征,类别作为标签,0 代表狗尾草鸢尾(Iris Setosa),1 代表杂色鸢尾(Iris Versicolour),2 代表弗吉尼亚鸢尾(Iris Virginica)。
人们通过对数据进行分析总结出了规律:通过测量花的花萼长、花萼宽、花瓣长、花瓣宽,可以得出鸢尾花的类别
(如:“花萼长>花萼宽” 且 “花瓣长/花瓣宽>2” ,则 “杂色鸢尾”)。
由上述可知,可通过 if 与 case 语句构成专家系统,进行判别分类。
在本文中,采用搭建神经网络的办法对其进行分类。即将鸢尾花花萼长、花萼宽、花瓣长、花瓣宽四个输入属性喂入搭建好的神经网络,网络优化参数得到模型,输出分类结果。
3.2 网络搭建与训练
采用搭建神经网络的办法对其进行分类,需要将鸢尾花花萼长、花萼宽、花瓣长、花瓣宽四个输入属性喂入搭建好的神经网络,网络优化参数得到模型,输出分类结果。设想中构建的神经网络如下图所示:
3.2.1 神经元的计算模型
1943年,英国心理学家玛卡洛克和数学家皮茨给出了神经元的计算模型,即MP模型。
为求解简单,本文将MP模型进行简化,去掉非线性函数后MP模型如下所示。
由矩阵乘法,该模型可用数学表达式写为:
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 全连接网络的搭建
搭建如图所示的全连接网络:
1.初始化过程:搭建好基本网络后,需要输入特征数据,并对线上权重 w 与偏置 b 进行初始化。
假设搭建网络时随机初始化所有参数w和b分别如下:
图6 权重与偏置初始化矩阵
2.前向传播计算过程:有了输入数据与线上权重等数据,即可按照 y = x × w + b y=x \times w+b y=x×w+b 的方式进行前向传播。
假设某组鸢尾花数据为 [ 5.8 , 4.0 , 1.2 , 0.2 ](实际标签为0:狗尾草鸢尾花),则前向传播计算过程如图所示:
图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_)=n∑k=0n(y−y_)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=wt−lr×∂wt∂lossbt+1=b−lr×∂bt∂losswt+1×x+bt+1→y
其中,参数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 ∂wt∂loss=2w+2。
该函数在平面内的图像如下所示:
由图像可知,该函数在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 中的基本概念与常用函数。