背景
随着大模型的火爆,人工智能再次被推到高潮,其实它在众多行业领域已经落地很多应用,并给社会带来了巨大的经济价值。其中包括互联网、教育、金融、医疗、交通、物流等等。在测试领域也有一些落地的案例,作为测试人员,有必要去了解并学习人工智能,去挖掘人工智为测试领域解决痛点问题,例如自动化测试用例自动生成、视觉自动化测试、缺陷预测、智能的精准测试等等。
大家经常会听说,人工智能(ArtificialIntelligence,AI)、机器学习(MachineLearning,ML)、深度学习(DeepLearning,DL),但是他们三者是一个什么关系呢,概括来讲,人工智能、机器学习、深度学习覆盖的技术范围是逐层递减的。机器学习是人工智能的一种实现方式,深度学习又是机器学习中最热门的一个分支,并且它可以代替大多数的传统机器学习的算法。
什么是人工智能
人工智能(ArtificialIntelligence,AI)是最宽泛的概念,是用于研发模拟、延伸和扩展人的智能的理论、方法、技术及系统的一门新的技术科学。对于这个定义只阐述了目标,但是没有限定的方法,因此实现人工智能存在诸多的方法和分支。机器学习(MachineLearning,ML)是实现人工智能的一种有效的方式,深度学习(DeepLearning,DL)是机器学习算法中最重要的一个分支,并且它可以替代大多数传统机器学习的算法。
什么是机器学习
关于机器学习的定义,此处引用两位
第一位是人工智能先驱亚瑟·塞缪尔(Arthur Samuel),他在1959年创造了“机器学习”一词[1]。塞缪尔认为,所谓机器学习是指:计算机能够具备根据现有数据构建一套不需要进行显示编程的算法模型来对新数据进行预测的能力。这里所谓不需要进行显示编程是区别于传统程序算法需要人为指定程序的执行过程。
第二位是卡内基梅隆大学的计算机科学家汤姆·迈克尔·米切尔(Tom Michael Mitchell),他给出了一个相较于塞缪尔更加正式与学术的定义。米切尔认为,如果计算机程序能够在任务T中学得经验E并且通过指标P来进行评价,同时根据经验E还能够提升程序在任务T的评价指标P,那么这就是机器学习[2]。这段话对于初学者来说稍微有点拗口,其实际想要表达的就是,如果一个计算机程序能够自己根据数据样本学习获得经验并逐步提高最终的表现结果,那这个过程就被称为是机器学习。
区别于人工智能,机器学习、尤其是监督学习则有更加明确的指代。机器学习是专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构,使之不断改善自身的性能。这句话有点“云山雾罩”的感觉,让人不知所云,下面我们从机器学习的实现和方法论两个维度进行剖析,帮助读者更加清晰地认识机器学习的来龙去脉。
2.1 机器学习的实现
2.1
机器学习的实现可以分成两步:训练和预测,类似于归纳和演绎:
归纳:就是从具体案例中抽象出一般规律,如同机器学习中的训练,从一定数量的样本中(已知模型输入X和模型输出Y),学习输出Y和输入X的关系,类似于某种表达式。
演绎:从一般规律推导出具体案例的结果,如同机器学习中的预测,基于训练得到的Y和X之间的关系,如果出现新的输入X,计算出输出Y,当通过模型计算的输出Y和真实场景的输出一致时,就说明模型就是有效的,如果出现过拟合或者欠拟合的情况下,我们可能需要替换其他的模型算法,继续训练模型。
2.2 机器学习的方法论
机器学习的方法论和人类科研的过程有着异曲同工之妙,下面以“机器从牛顿第二定律实验中学习知识”为例,帮助读者更加深入理解机器学习(监督学习)的方法论本质,即在“机器思考”的过程中确定模型的三个关键要素:假设、评价、优化。
包括 监督学习、无监督学习、半监督学习
例如一个房价的预测
什么是深度学习
深度学习(Deep Learning)(也称为深度结构学习【Deep Structured Learning】、层次学习【Hierachical Learning】或者 深度机器学习【Deep Machine Learning】)是一类算法集合,是机器学习的一个分支。它是基于多层神经网络,借鉴人脑神经元的结构,设计出神经网络模型,在图像识别、绘画识别和对象侦测领域,预测数据准确性有较高的表现。
图(a)展示了神经网络基本单元-感知机的设计方案,其处理信息的方式与人脑中的单一神经元有很强的相似性;图(b)展示了几种经典的神经网络结构,类似于人脑中多种基于大量神经元连接而形成的不同职能的器官。
对于深度学习,可以在TensorFlow的playground场进行体验,它是一个通过网页浏览器训练的简单神经网络并实现可视化训练过程的工具
http://playground.tensorflow.org
如图是一个逻辑回归分类模型,通过训练,把数据分为两类。增加的每一个节点就是一个神经元,还有增加一层层的深度。
从图中可以看出,所谓深度学习其实就是将原始特征通过多层神经网络进行抽象特征提取,然后再将提取到的特征输入到最后一层进行回归或者分类处理的过程,核心就是:特征提取。
什么是卷积神经网络
深度学习模型中典型的就是卷积神经网络(convolutional neural network,CNN)。它主要应用是在图像识别方向。还有一个模型是循环神经网络(Recurrent Neural Network,RNN),通常用于自然语言的处理。本文介绍的是卷积神经网络。生成对抗网络、强化学习。
在早期的图像分类任务中,通常是先人工提取图像特征,再用机器学习算法对这些特征进行分类,分类的结果强依赖于特征提取方法,往往只有经验丰富的研究者才能完成.
在这种背景下,基于神经网络的特征提取方法应运而生
卷积神经网络是目前计算机视觉中使用最普遍的模型结构。
卷积神经网络分为:输入层、卷积层、池化层、激活层、全连接层
输入层(Input Layer)、卷积层(CONV Layer)、池化层(Pooling Layer)、ReLU激活层(ReLU Layer)、全连接层(FC Layer)五个层次。
实践Pytorch框卷积神经网络
目前常用的深度学习框架有TensorFlow和PyTorch,TensorFlow
当然,现今任何一个深度学习框架都有其缺点,PyTorch也不例外,对比TensorFlow,其全面性处于劣势,目前PyTorch还不支持快速傅里 叶、沿维翻转张量和检查无穷与非数值张量;针对移动端、嵌入式部署以及高性能服务器端的部署其性能表现有待提升;其次因为这个框 架较新,使得他的社区没有那么强大,在文档方面其C库大多数没有文档。
下面结合图像和代码介绍每一层的含义。
接下来需要安装环境,对于环境的安装,因篇幅原因,不在此介绍,可以到我的博客中查看安装步骤。
安装Anaconda
安装Pytorch及配置Pycharm
我们可以从官网查看详细的可以看官网 https://pytorch.org
输入层
卷积层
如图是一个卷积操作,它的计算方式是
输入图像55的矩阵
卷积核33的矩阵
Stride=1
1*1
接下来我们使用Pytorch框架用代码来实现。
import torch
import torch.nn.functional as F
input = torch.tensor([[0, 0, 75, 80, 80],
[0, 75, 80, 80, 80],
[0, 75, 80, 80, 80],
[0, 70, 75, 80, 80],
[0, 0, 0, 0, 0]])
# 卷积核
kernel = torch.tensor([[-1, -2, -1],
[0, 0, 0],
[1, 2, 1]])
# 进行尺寸变换:
input = torch.reshape(input, (1, 1, 5, 5))
kernel = torch.reshape(kernel, (1, 1, 3, 3))
# 进行卷积,移动步长为1(左移和下移都为1,默认是先右移后下移)
output = F.conv2d(input, kernel, stride=1)
print(output)
运行后的结果:
池化层
池化层的作用,
最大池化的目的:保留数据特征,同时能把数据量减少
import torch
import torchvision
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset = torchvision.datasets.CIFAR10("./7dataset", train=False, download=True,
transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset, batch_size=64)
class NN_MaxPool_Model(nn.Module):
def __init__(self):
super(NN_MaxPool_Model, self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3)
def forward(self, input):
output = self.maxpool1(input)
return output
maxpool_test = NN_MaxPool_Model()
writer = SummaryWriter("../learn/log")
step = 0
for data in dataloader:
imgs, targets = data
writer.add_images("input", imgs, step)
output = maxpool_test(imgs)
writer.add_images("output", output, step)
step += 1
writer.close()
print("运行完毕")
这个是池化前的输入图像
这是池化后的输出图像
经过池化后图像可以隐约的看出是之前的,它的目的是保存数据的特征,但是大大减少了数据量,是训练速度加快,所以一般在卷积之后来一层最大池化。
如果在运行过程中因为网络原因,可能会出现【Pytorch】下载CIFAR10数据集报错:
urllib.error.URLError: <urlopen error name: https>
因篇幅不在此处展开,可以看我的博客中的查看具体的解决办法,
下载CIFAR10数据集报错
激活层
非线性激活函数
非线性激活,非线性的主要目的就是给我们的网络引入一些非线性特征,非线性越多,越能训练出符合各种曲线或者说是符合各种特征的模型。
import torch
import torchvision
from torch import nn
from torch.nn import Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset = torchvision.datasets.CIFAR10("./7dataset", train=False,
transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size=64)
# 创建神经网络
class NN_Sigmoid_Model(nn.Module):
def __init__(self):
super(NN_Sigmoid_Model, self).__init__()
self.sigmoid1 = Sigmoid()
def forward(self, input):
output = self.sigmoid1(input)
return output
nn_sigmoid_mode = NN_Sigmoid_Model()
writer = SummaryWriter("../learn/log")
step = 0
for data in dataloader:
imgs, targets = data
writer.add_images("input", imgs, global_step=step)
output = nn_sigmoid_model(imgs)
writer.add_images("output", output, global_step=step)
step += 1
writer.close()
flattern展平
线性
全连接层
损失函数和反向传播
优化
经过卷积层的计算后,还要经过 池化层 激活层,最后
卷积神经网络是计算机视觉使用最普遍的模型结构,主要模块包括:
- 卷积
- 池化
- 激活函数层
- 和全连接层
- 线性层
- flattern展平
- 线性
卷积是深度学习的重要技术之一,简单点来说就是先通过多层的全连接进行特征提取,然后通过softmax层进行分类。
搭建一个CIFAR 10 model
后记
本文主要介绍了关于机器学习、深度学习的一些基本定义,本文介绍的也只是冰山的一角,后续会有一些深度学习训练的实例。保持持续学习,学习新的技术,拥抱大模型时代。
参考资料:
《跟我一起学机器学习 》
Pytorch深度学习快速入门教程