人工智能这个词,现在已经家喻户晓。人工智能在人们日常生活中的应用无处不在,极大地方便了人们的生活。人工智能是一个很大的领域,我们最常见的像智能聊天机器人、自动驾驶、智能推荐,而这些功能的实现,又离不开语音信息处理、自然语言处理、计算机视觉、模式识别、决策规划、数据处理、机器学习等基础技术的应用。
本文会从人工智能最为基础的一个维度——“机器学习”进行讲述。如果在网上搜索“机器学习”会出现很多相关于此内容的文章。但个人总觉得内容太多太复杂,对于初学者看起来,反而不知所措。机器学习入门,如果一开始就以图像识别为例,进行手写的数字识别,起点太高了。很多时候,培养学习和解决问题的思路更为重要。
所以,今天这篇文章主要是面向机器学习的初学者,从机器学习的基础知识出发,先讲解TensorFlow中的数据流图,之后会以一个简单的案例:机器通过数据学习来预测数字,进行机器学习实战。通过理论结合实战,相信大家看完后,一定会有收获。
2、机器学习概述
机器学习,简单来讲,就是给定机器一个输入,获得机器的一个输出。类似于构建一个映射函数。例如:f(一张猫的图片)=猫。如何通过一张图片的输入,机器就可以识别出来是什么内容,就需要学习模型的建立。
常见的机器学习模型有三类:监督学习、无监督学习和强化学习。简单理解:
(1)监督学习:我们在给机器的学习样本中,同时也包含了答案,目的是为了让机器通过学习标准输入和标准答案之间的联系,从而对于我们给机器的其他输入,使机器为我们提供更为标准的答案。
(2)无监督学习:我们在机器的一组数据,不告诉机器有关数据的任何正确答案。让机器自己去找规律。例如:可以使机器自己利用输入的数据,将数据聚类。
(3)强化学习:我们不仅要给机器提供正确的数据,还要告诉机器哪些数据是错的。类似于“在犯错中成长”。
3、机器学习入门
3.1 学习工具
生产活动离不开生产工具的使用。机器学习也一样。对于机器学习而言,我们需要做的就是选择适合自己的机器学习框架。目前机器学习框架有很多,例如:TensorFlow、Chainer、CNTK、Keras 等。本文选择使用TensorFlow。主要是TensorFlow目前相对比较流行,版本更新相对也快,可以满足不断发展的机器学习需要。软件环境使用的是Anaconda3。Anaconda3中不但包含Python开发环境,还提供了很多Python需要使用的常用函数库,并且在各种资源包管理上,也比较方便。环境的搭建,网上的案例太多了,在此就不多讲了。
3.2 数据流图
数据流图的实战,主要是为了方便大家对机器学习有一个更为基础直观的认识,更好地理解TensorFlow的工作原理。我们先看如下数据流图,比较容易理解。10和18作为输入,经过结点C两数相加,经过结点D两数相乘后,C和D的结果在E继续相乘,最后输出结果。
如果使用TensorFlow来进行计算,如何实现呢?请看以下代码。结果是5040。
接下来,我们要显示TensorFlow的TensorBoard,以便于进行更加直观的数据流图显示。
writer = tf.summary.FileWriter('D:\MyPython',sess.graph)
打开命令提示窗口。如果是Anaconda3的环境,直接在程序菜单中,进入软件自带的“Anaconda Prompt”就可以。
输入>tensorboard --logdir "D:/MyPython"
文件目录可以自行根据自己的文件进行修改。不一定要按文中的文件名称。要注意的是工作路径要与Python代码的路径一致。
成功启动TensorBoard,系统会默认分配一个端口号为6006的网址。
打开浏览器,输入“http://localhost:6006/”就可以显示出TensorBoard面版。有的机器,并不是localhsot,而机器名称加端口6006,我们在命令行中启动TensorBoard后,TensorBoard会告诉你一个实际的访问地址。启动后的TensorBoard如下图所示。
3.3 API使用
我们使用的是TensorFlow作为机器学习的工具,TensorFlow的接口非常多。大家有兴趣可以到TensorFlow的官方网站上查阅。在这里出于本文实战需要,为了方便大家更好理解,将本文用到的几个API进行简单说明。
(1)tf.matmul(x, w) 矩阵
(2)tf.square(error) 平方
(3)tf.reduce_mean(error) 均值
(4)tf.train.GradientDescentOptimizer(learning_rate) 梯度下降优化
4、机器学习实战
4.1 原理说明
学习的数据比较简单,我们假设定义一个公式 y=ax+b。这个公式我们知道,而机器不知道。通过给机器输入和这个公式相关的学习数据,来让机器自己学习这个公式,从而使我们给机器一个x值,机器可以告诉我们y值。
很明显,这是一个线性回归的学习。而Tensorflow仅是一个计算工具而已。不用Tensorflow其实直接用Python、R语言,或是Java、C#去写计算方法也可以。最重要的是,我们要知道基础的计算逻辑。
因为我们这个实战,生成的数据就是线性的,很容易表示。而现实中的数据,往往没有这么明确的线性关系,往往数据与线性是有偏差的。我们将上述的数据进行一些微调后,如下图所示:
所以,我们本文的机器学习实战是希望通过通过线性回归找到这条直线,从而能以最小的误差(Loss)来拟合数据。
如果我们去找每个点同这个直线的距离,如下公式所示:
我们可以把绝对值变为平方,那么这个误差可以表示为:
这时候,我们大学时学的高等数学就派上用场了。求极值,其实就是使公式中变量的偏导数为零,即:
机器学习,其实就是通过解这个方程组,来求出a和b。
我们要求的最小值,就是这个曲线底部的这个值。不论我们目前计算的起始值在这个曲线的哪个位置,只要是能到曲线底部就可以了。是不是有种阶度的感觉?而这个过程,就是机器学习中常说的一个术语——梯度下降。
4.2 案例实战
(1)数据准备。我们根据本文的Excel样例数据,准备10个数据。用来机器学习。
xi =[[1.1,], [1.2,], [1.8,], [2.15,], [2.33,], [2.37,], [3.33,], [4.33,], [5.23,],[5.38,]]
yi =[[5.2,], [5.4,], [6.6,], [7.3,], [7.66,], [7.74,], [9.66,], [11.66,], [13.46,], [13.76,]]
fig = plt.figure()
ax=fig.add_subplot(1,1,1)
ax.scatter(xi,yi)
(3)建立线性模型:y=W·X+b,随机初始化W和b
x = tf.placeholder(tf.float32, shape=[None, 1])
y_true = tf.placeholder(tf.float32, shape=[None, 1])
weights = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)))
bias = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)))
y_pred = tf.matmul(x, weights) + bias
(4)确定损失函数,也就是文章中理论部分讲的原理。
loss = tf.losses.mean_squared_error(labels=y_true, predicti style="margin-bottom: 15px;line-height: 1.75em;text-indent: 2em;">(5)梯度下降优化
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for i in range(2000):
sess.run((train, loss),feed_dict={x:xi,y_true:yi})
(8)进行预测,x=30时,正确结果应该输出 63
print(sess.run(y_pred,feed_dict={x:[[30,]],y_true:[[None]]}))
运行结果如下图所示,预测的结果是63.00613022,可以说是相当准确了。
正如本文之前所说的,现实中的数据不可能是完全线性的。我们把yi的值,进行一些调整,变成不是完全线性,我们看一下机器学习的结果。
yi =[[5.7,], [5.4,], [6.9,], [7,], [8,], [7.2,], [9.99,], [11.01,], [13.65,], [12.99,]]
结果如下图所示,预测结果是59.12093735。我们相信,如果样本的数据量足够大,最后的结果仍然会更加接近真实值。
4.3 源代码
为了方便大家代码调试,这里直接把代码发在这里。
5、结语
机器学习是一个非常庞大且非常复杂的领域,需要具备的知识点非常多。本文主要简单介绍了机器学习的几个类型,机器学习的工具TensorFlow的基本用法,并通过一个简单的机器学习案例实战,使大家对机器学习有个初步的认识。对于机器学习体系而言,我的文章显得非常的微不足道,也仅是抛砖引玉。如果对机器学习有兴趣的同学,可以
再去
系统地学习。机器学习的关键,还是对基础知识的理解,基础知识掌握熟练了,用任何工具都是手到擒来。大家可以先学习一些数据结构与算法的基础知识,例如:二叉树、搜索、动态规划、分组、排序、链表等。再学习一些数学与统计学的知识。在此基础上,需要对机器学习的一些理论进行掌握,例如:模型评估、ROC曲线、PR曲线、CNN、RNN、特征工程等。当然,对编程语言的学习(例如:Python),也是必不可少的。同时选取自己喜欢并适合计算框架(例如:TensorFlow),掌握其API的用法。理论结合实践,坚持下来,相信大家一定会有所收获,并体会到学习的乐趣。
作者:王佳亮,中国计算机学会(CCF)会员。微信公众号:佳佳原创