1 ai and machine learning for coders Laurence Moroney学习笔记(一)开始机器学习之旅(Getting Started with ML)

机器学习范式是这样的,你有数据,这些数据被标记,你想找出匹配数据和标签的规则。在代码中显示这一点的最简单的可能场景如下。

考虑以下两组数字:

X = –1, 0, 1, 2, 3, 4 
Y = –3, –1, 1, 3, 5, 7

X和Y值之间存在关系(例如,如果X是-1,那么Y是-3,如果X是3,那么Y是5,等等)。你能看到吗?

几秒钟后,你可能会发现这里的模式是Y = 2X - 1。你怎么弄到的?不同的人用不同的方法计算,但我经常听到这样的说法X在它的序列中增加了1,Y增加了2;因此,Y = 2X +/ -某项。当X = 0时,Y = - 1,结果是Y = 2X - 1。然后再看其他的值,发现这个假设“符合”,结果就是Y = 2X - 1。

这和机器学习过程非常相似。让我们来看看一些TensorFlow代码,你可以编写一个神经网络来帮你解决这个问题。

下面是完整的代码,使用TensorFlow Keras APIs。如果还不理解也不用担心;我们将一行一行地讨论:

import tensorflow as tf 
import numpy as np 
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense

model =Sequential([Dense(units=1,input_shape=[1])])
model.compile(optimizer='sgd',loss='mean_squared_error')

Xs=np.array([-1.0,0.0,1.0,2.0,3.0,4.0],dtype=float)
Ys=np.array([-3.0,-1.0,1.0,3.0,5.0,7.0],dtype=float)

model.fit(Xs,Ys,epochs=500)

print(model.predict([10.0]))

先说第一行。你可能听说过神经网络,你可能见过用多层互连神经元来解释它们的图表,有点像图1.1。

一种典型的神经网络
Fig1.1 一中典型的神经网络

当你看到这样一个神经网络时,把每个“圆”看成一个神经元,每个圆列看成一个层。所以,在Fig1.1中,有三层:第一层有五个神经元,第二层有四个,第三层有两个。

如果我们回头看看我们的代码,只看第一行,我们会看到我们定义了最简单的神经网络。只有一层,它只包含一个神经元:

model =Sequential([Dense(units=1,input_shape=[1])])

使用TensorFlow时,使用Sequential定义图层。在Sequential中,您可以指定每个层的外观。我们的Sequential中只有一行,所以我们只有一层。

然后,可以使用keras.layers应用编程接口定义图层的外观。有许多不同的图层类型,但这里我们使用的是Dense图层。“Dense”是指一组完全(或密集)连接的神经元,这就是你在Fig1.1中看到的,其中每个神经元都连接到下一层的每个神经元。这是最常见的图层类型。我们的密集层有指定的units=1,所以我们只有一个Dense层,在整个神经网络中有一个神经元。最后,当您指定神经网络中的第一层(在这种情况下,这是我们唯一的一层)时,您必须告诉它输入数据input_shape的形状是什么。在这种情况下,我们的输入数据是我们的X,它只是一个值,所以我们指定这是它的形状。

下一行是乐趣真正开始的地方。让我们再看一遍:

model.compile(optimizer='sgd',loss='mean_squared_error')

如果你以前对机器学习做过什么,你可能已经看到它涉及到很多数学。如果你几年没学过微积分,它可能看起来像是入学的障碍。这就是数学的作用——它是机器学习的核心。

在这种情况下,计算机不知道X和Y之间的关系是什么。所以它会猜测。比如说它猜测Y = 10X + 10。然后,它需要衡量这种猜测有多好或多坏。这是损失函数(loss)的工作。当X为–1、0、1、2、3和4时,它已经知道答案,因此损失函数可以将这些答案与猜测关系的答案进行比较。

如果猜到Y = 10X + 10,那么当X为–1时,Y为0。正确答案是–3,所以有点偏。但当X为4时,猜测答案为50,而正确答案为7。那真的很遥远。

有了这些知识,计算机就可以进行另一种猜测。这是优化器(optimizer)的工作。这是使用重微积分的地方,但是有了TensorFlow,你就不用“理会”这些数学知识。您只需为不同的场景选择合适的优化器。在本例中,我们选择了一个名为sgd的函数,它代表随机梯度下降,这是一个复杂的数学函数,当给定值、先前的猜测以及计算该猜测的误差(或损失)的结果时,可以生成另一个。随着时间的推移,它的工作是最小化损失,这样做可以使猜测的公式越来越接近正确的答案。

SGD(Gradient descent (with momentum) optimizer)

tf.keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

随机梯度下降优化器

包含扩展功能的支持: - 动量(momentum)优化, - 学习率衰减(每次参数更新后) - Nestrov 动量 (NAG) 优化

参数

  • lr: float >= 0. 学习率。
  • momentum: float >= 0. 参数,用于加速 SGD 在相关方向上前进,并抑制震荡。
  • decay: float >= 0. 每次参数更新后学习率衰减值。
  • nesterov: boolean. 是否使用 Nesterov 动量。

参考一:使用动量(Momentum)的SGD、使用Nesterov动量的SGD

参考二:比Momentum更快:揭开Nesterov Accelerated Gradient的真面目 郑华滨

接下来,我们简单地将我们的数字格式化为层所期望的数据格式。在Python中,有一个名为Numpy的库,张量流可以使用它,在这里,我们将我们的数字放入Numpy数组中,以便于处理它们:

Xs=np.array([-1.0,0.0,1.0,2.0,3.0,4.0],dtype=float)
Ys=np.array([-3.0,-1.0,1.0,3.0,5.0,7.0],dtype=float)

学习过程将从model.fit命令开始,如下所示:

model.fit(Xs,Ys,epochs=500)

你可以把它理解为“让Xs适应Ys,试500次。”因此,在第一次尝试时,计算机会猜测这种关系(即,类似Y = 10X + 10的东西),并衡量这种猜测的好坏。然后,它将这些结果反馈给优化器,优化器将生成另一个猜测。然后,这个过程将被重复,其逻辑是损失(或误差)将随着时间的推移而下降,结果“猜测”将变得越来越好。

我们可以看到,在前10个时期,损失从3.2868上升到0.9682。也就是说,仅经过10次尝试,网络的表现就比最初猜测的要好三倍。然后看看第500个批次发生了什么(Fig1.2、Fig1.3)。

Fig1.2 训练神经网络
Fig1.3 训练神经网络-最后五个批次

 

我们现在可以看到损失是2.61*10^-5。损失变得如此之小,以至于该模型已经很好地计算出数字之间的关系是Y = 2X-1。机器已经学会了它们之间的模式。

然后,我们的最后一行代码使用训练好的模型进行预测,如下所示:

print(model.predict([10.0]))

Notes:术语Prediction通常被用来处理机器学习模型问题。不过,不要把它当成展望未来!使用这个术语是因为我们在处理一定程度的不确定性。回想一下我们之前谈到的活动检测场景。当这个人以一定的速度移动时,她可能是在走路。同样,当一个模型了解了两件事情之间的模式时,它会告诉我们答案可能是什么。换句话说,就是预测答案。(稍后,您还将学习推理,其中模型从众多答案中选择一个,并推断它选择了正确的答案。)

当X = 10时让模型预测Y你们认为答案会是什么?你可能会马上想到19岁,但这是不对的。它会选择一个非常接近19的值。这有几个原因。首先,我们的损失不是零。它仍然是一个非常小的量,所以我们可以预期,任何预测的答案都会有非常小的偏差。
其次,只在少量的数据上训练神经网络——在这种情况下只有六对(X,Y)值。

这个模型只有一个神经元,这个神经元学习一个权重和一个偏差,所以Y = WX + B。这看起来就像我们想要的关系Y = 2X–1,我们希望它学习W = 2和B =–1。假设模型只在六项数据上进行训练,那么答案永远不会是这些值,而是非常接近的值。

自己运行代码看看能得到什么。当我运行它时,我得到了18.977888,但是你的答案可能略有不同,因为当神经网络第一次初始化时,有一个随机元素:你的初始猜测将与我的略有不同,也与第三个人的略有不同。

小结:

你的第一个机器学习“Hello World”到此结束。你可能会想,对于像确定两个值之间的线性关系这样简单的事情来说,这似乎是大材小用。你是对的。但是最酷的是,我们在这里创建的代码模式与用于更复杂场景的模式是一样的。你将在第二章开始看到这些,在那里我们将探索一些基本的计算机视觉技术——机器将学会“看到”图像中的模式,并识别其中的内容。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值