业务系统如何引入神经网络
切入点
目前的AI其实更多就是仅仅用来从历史数据中学习到一些规律而已,在业务上,更多的只是减少人为介入工作,所以要在业务系统中引入神经网络,其实主要就是在要找到切入点。
简单来说,可以走访一线用户看他们花最多的时间在系统哪些地方,经常重复了哪些工作,也可以通过统计日志找到合适的切入点。
理解问题
业务上要解决的问题:预测某个分类。
问题涉及到的信息管道:xx。
数据源及采集方式:数据源在xx业务系统上,可由相关api获取。
数据属于定期发布还是实时:定期&实时发布。
影响模型的有价值因素:咨询业务专家提供初步模型特征。
工作量:制定项目计划。
数据预处理
过滤操作,将不符合条件的数据记录去掉。
空值填充,补0或其他填充措施。
对数据进行标准化处理。
字符串集标签化。
样本统计
对样本进行统计分析,看看可用样本数量为多少,对于一般的分类任务,每个分类的样本数一般可以从几千到上万个。另外也要检查是否存在样本不平衡问题,如果存在的话要对其进行平衡处理,比如上采样操作。
模型定义
定义模型,比如定义传统的多层神经网络,两个隐含层,每个层100个神经元。
确定输入为attribute1、attribute2、…,输出为分类编号。
损失函数可选:tanh、logistic或relu。
优化方法可选:梯度下降法或adam。
image
模型训练
将整个数据集分成两组,比例是8:2,第一组为训练集,用于调整模型参数;第二组为测试集,用于测试训练得到的模型准确性。
最大迭代数为10000。
批大小为200。
优化提升容忍程度为1e-8。
标准化初始权重。
模型迭代
模型的效果需要不断分析特征,选择或生成更有价值的特征,不断优化模型效果。比如
v0.1 凭感觉选择若干数据特征作为输入,效果可能比较差。
v0.2 咨询业务专家,结合他们的意见使用或者生成更有价值的特征,precision、recall、f1-score都提升了,因为增加了某些属性,而且还从额外的系统提取了有用的特征。
v0.3 已经无法直接找到有价值的特征,可以考虑引入自然语言处理对一些文本进行分析,使用词向量、tfidf之类的特征,precision、recall、f1-score都达到90%以上。
线上部署
有以下几种方式部署模型,需要综合考虑。
嵌入到业务系统中,将模型与业务系统耦合,需要考虑业务系统和模型开发使用的统一语言,比如业务系统一般用java开发,模型较多使用python,而java调python并发起来后性能有问题,不然就用java做模型并提供jar。
单独模型部署,将模型系统通过服务形式对外开放,由业务系统访问,达到解耦效果,但对于一些情况下会导致整个系统架构比较重。
后台部署,直接由模型系统访问业务数据层,将预测的结果回写到业务数据持久化中。
机器学习的套路
前言
这里说说机器学习问题分析的一般性过程,尽管存在各种各样的机器学习问题,但大体上的步骤及最佳实践都有一定的套路。
理解问题
首先得理解要解决的是什么问题,比如
业务上要解决什么问题
该问题涉及到的信息管道有哪些
如何采集数据,数据源在哪
数据是完整的吗,数据刻度最小是多少
数据是定期发布的还是实时获取的
确定影响模型的有价值因素
工作量
以上等等等等。
ETL处理
待收集的数据可能是表格数据、一串实时数据,N维矩阵或其他类型数据,同时也可能是多种存储介质,通过ETL处理将混合的数据源转成我们需要的格式,生成结构化数据类型。
数据预处理
对于收集的数据,可能存在缺陷,比如空值、异常值或数据产生器本身引起的偏差。这些缺陷可能导致模型效果不佳,同时为了优化更快收敛,需要做数据标准化处理,所以需要进行数据预处理。
比如缺失值可以简单设为0、列平均值、中值、最高频率值、甚至是稳健算法和knn等等。
比如标准化数据集,使数据集正态分布,平均值为0标准差为1。而且还达到了特征缩放效果。
模型定义
机器学习主要就是模型问题,我们通过机器学习来对现实进行抽象建模,以解决现实问题。所以机器学习主要工作就是使用哪种模型来建模,尽管各种大大小小模型一大堆,但大体上也有些套路。
要完成的任务是预测结果还是对数据进行分类,前者是回归问题,后者是分类问题。
对于分类问题,如果需要数据标记,则是监督学习,否则是非监督学习,使用聚类技术。
数据是否为连续的,是的话考虑序列模型,比如自回归和RNN之类的。
尽量使用简单模型,如果能用比如用单变量或多变量的线性回归或逻辑回归。
简单模型解决不了的情况,可通过多层神经网络解决,比如复杂的非线性。
使用了多少个维度的变量,将作用大的特征提取出来,并把不重要的特征去掉,比如用PCA降维。
不是监督也不是非监督?考虑强化学习?
损失函数
损失函数用于衡量模型质量,它可以度量模型预测值与实际期望之间的差距,选择不合适的函数可能会影响模型的准确性,甚至影响收敛速度。
模型训练
数据准备好了,模型定义好了,就可以开始训练模型。训练中涉及几个关键术语:迭代,表示模型计算和调整的一次过程;批,数据集每次以一批为单位输入到模型中;epoch,每当整个数据集被处理完称为一个epoch。
另外,训练模型前先调整模型的初始权重,以便能更快更好地收敛。不能初始化为0,否则将导致学习失败。一般可以使用标准化技术将权重初始化。
数据集分割
一般将整个数据集分成三组,比例是7:2:1,第一组为训练集,用于调整模型参数;第二种为验证集,用于比较多个模型直接的表现;第三组为测试集,用于测试训练得到的模型准确性。
模型效果
模型训练完后要看效果如何,要看看泛化的能力。
对于回归问题,可以通过下面几个指标来了解拟合效果。
平均绝对误差
中值绝对误差
均方误差等等
对于分类问题,可以通过下面几个指标来了解分类效果。
准确性
精确率
召回率
F值
混淆矩阵
对于聚类问题,可以通过下面几个指标来了解聚类效果。
轮廓系数
同质性
完整性
V度量
Keras与PyTorch全方位比较 哪一个深度学习框架更适合初学者?
Keras或PyTorch作为您的第一个深度学习框架
你想学习深度学习吗?无论您是想开始将其应用于您的业务,建立您的下一个项目,还是仅仅获得当下热门的技能 – 选择合适的深度学习框架来学习是实现目标的关键第一步。
我们强烈建议您选择Keras或PyTorch。这些功能强大的工具可让您学习和实验。我们从老师和学生的角度都了解他们。
介绍
Keras和PyTorch是深度学习的开源框架,深受数据科学家的欢迎。
Keras是一种高级API,可以在TensorFlow,CNTK,Theano或MXNet上运行(或者在TensorFlow中运行tf.contrib)。自2015年3月首次发布以来,它的易用性和语法简单性得到了青睐,促进了快速发展。它得到了Google的支持。
PyTorch于2016年10月发布,是一款专注于直接处理数组表达式的低级API。它在去年获得了巨大的兴趣,成为学术研究的首选解决方案,以及需要优化定制表达的深度学习应用。它受Facebook支持。
在我们讨论这两个框架的细节(在这个Reddit主题中有详细描述)之前,我们希望先发制人让你失望 – 对’哪个更好?’没有直接的答案。选择最终归结于您的技术背景,需求和期望。本文旨在让您更好地了解您应该选择哪一个作为第一个框架。
TL; DR:
以即插即用的精神,Keras可能更容易进入标准图层并进行实验。
PyTorch为更具数学倾向的用户提供了更低层次的方法和更多的灵活性。
好吧,但为什么没有其他框架?
本文不会讨论选择纯TensorFlow作为您的第一个深度学习框架的优缺点,因为我们认为与Keras(TF的官方高级库)和PyTorch相比,TensorFlow不太适合初学者。虽然您可能会找到一些Theano教程,但它不再处于积极的发展阶段。Caffe缺乏灵活性,而Torch使用Lua(虽然它的重写太棒了:))。MXNet,Chainer和CNTK目前尚未广泛流行。
Keras与PyTorch:易用性和灵活性
Keras和PyTorch在操作抽象级别方面有所不同。
Keras是一个更高层次的框架,将常用的深度学习层和操作包装成整齐的乐高大小的构建块中,让人忘掉深度学习背后的复杂性。
PyTorch为实验提供了一个相对较低级别的环境,使用户可以更自由地编写自定义图层并查看数值优化任务的底层。当您可以使用Python的全部功能并访问所使用的所有功能的内核时,开发更复杂的体系结构更为直接。自然,这是以冗长的代价。
考虑一下在Keras和PyTorch中如何定义一个简单的卷积网络的比较:
Keras
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(MaxPool2D())
model.add(Conv2D(16, (3, 3), activation='relu'))
model.add(MaxPool2D())
model.add(Flatten())
model.add(Dense(10, activation='softmax'))
PyTorch
class Net(nn.Module):def __init__(self):super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 32, 3)
self.conv2 = nn.Conv2d(32, 16, 3)
self.fc1 = nn.Linear(16 * 6 * 6, 10)
self.pool = nn.MaxPool2d(2, 2)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 6 * 6)
x = F.log_softmax(self.fc1(x), dim=-1)return x
model = Net()
上面的代码片段略微体会了两种框架之间的差异。至于模型训练本身 – 在PyTorch中需要大约20行代码,而Keras中只需要一行代码。启用GPU加速在Keras中是隐式处理的,而PyTorch要求我们指定何时在CPU和GPU之间传输数据。
如果你是初学者,Keras的高层可能看起来是一个明显的优势。Keras确实更具可读性和简洁性,使您可以更快地构建您的第一个端到端深度学习模型,同时跳过实现细节。然而,对这些细节的讨论限制了在深度学习过程中探索每个计算块的内部运作的机会。使用PyTorch可以为您提供更多关于核心深度学习概念的想法,如反向传播和其他训练过程。
也就是说,Keras比PyTorch简单得多,但它绝不是玩具 – 这是初学者和经验丰富的数据科学家都喜欢的的深度学习工具。
例如,在Dstl卫星影像特征检测Kaggle比赛中,最好的三支队伍在他们的解决方案中都使用了Keras,而deepsense.ai队(第四名)使用了PyTorch和(较少的)Keras组合。
值得考虑的是,你的深度学习的应用是否需要灵活性超过纯Keras所提供的灵活性。根据您的需求,keras可能只是 the rule of least power甜蜜点。
总结
Keras – 更简洁,更简单的API
PyTorch – 更灵活,鼓励更深入地了解深度学习概念
Keras与PyTorch:社区人气和获取学习资源
框架的普及不仅是其可用性的代表。这对于社区支持也很重要 – 教程,带有工作代码的存储库和讨论组。截至2018年6月,Keras和PyTorch在GitHub和arXiv论文上都受到越来越多的欢迎(请注意,大多数提及Keras的论文也提及其TensorFlow后端)。根据KDnuggets的调查,Keras 和 PyTorch是增长最快的数据科学工具。
虽然这两个框架都有令人满意的文档,但PyTorch享有更强大的社区支持 – 如果您遇到困难(您将陷入困境),它们的讨论板是访问的好地方,而文档或StackOverflow不会为您提供所需的答案。
有趣的是,我们在给定的网络架构上发现了具有注释的初学者级别的深度学习课程,这些课程对于Keras来说比PyTorch更容易实现,使得Keras对于初学者更容易访问。代码的可读性和Keras提供的无与伦比的实验易用性可能会使其深受广大深度学习爱好者,教师和铁杆Kaggle获奖者的广泛欢迎。
大量的Keras资源和深度学习课程的例子,请参阅 “Starting deep learning hands-on: image classification on CIFAR-10“ 和Keras 的创造者François Chollet编写的 “Deep Learning with Python” 一书。对于PyTorch资源,我们推荐官方教程,它提供了一个更具挑战性,更全面的方法来学习神经网络的内部工作。
总结
Keras – 丰富的教程和可重复使用的代码
PyTorch – 卓越的社区支持和积极的发展
Keras与PyTorch:调试与代码检查
Keras在抽象中封装了大量计算块,因此难以确定导致bug的确切代码。
PyTorch作为更为详细的框架,可以让我们逐行执行我们的脚本。这就像调试NumPy一样 – 我们可以轻松访问代码中的所有对象,并且可以使用打印语句(或任何标准的Pythonic调试)来查看运行失败的位置。
创建标准网络的Keras用户比PyTorch用户出错的机会少一个数量级。但是一旦出现问题,它就会受到很大的伤害,而且往往很难找到出错的实际代码行。无论模型的复杂性如何,PyTorch都提供了更加直接的,不绕弯的调试体验。此外,如果有疑问,您可以随时查找PyTorch repo以查看其可读代码。
总结
PyTorch – 更好的调试功能
Keras – (可能)不太需要调试简单网络
Keras与PyTorch:导出模型和跨平台可移植性
在生产中导出和部署训练的模型有哪些选择?
PyTorch将Pickles中的模型保存为基于Python的,不可移植的,而Keras利用JSON + H5文件的更安全的方法(尽管在Keras中保存自定义层通常更困难)。Keras支持R,以防需要使用R语言与数据分析师团队进行协作。
在Tensorflow上运行,Keras通过TensorFlow for Mobile和TensorFlow Lite享有更广泛的选择,可用于部署到移动平台。您可以使用TensorFlow.js或keras.js部署您的酷Web应用程序。作为一个例子,请看这个由Piotr和他的学生开发的深度学习驱动的浏览器插件,用于检测trypophobia触发器。
导出PyTorch模型由于其Python代码而导致更多的开销,目前广泛推荐的方法是首先将您的PyTorch模型转换为使用ONNX的Caffe2。
总结
Keras – 更多的部署选项(直接并且通过TensorFlow后端),更简单的模型导出。
Keras与PyTorch:性能
Donald Knuth说:
不成熟的优化是编程中所有邪恶(或至少大部分)的根源。
在大多数情况下,速度基准的差异不应该成为选择框架的主要标准,特别是正在学习时。GPU时间比数据科学家的时间便宜得多。而且,在学习的时候,性能瓶颈将由实验失败,网络未优化和数据加载造成; 而不是原始的框架速度。然而,为了完整性,我们不得不触及这个问题。我们推荐这两个比较:
TensorFlow, Keras and PyTorch comparisonby Wojtek Rosiński
Comparing Deep Learning Frameworks: A Rosetta Stone Approachby Microsoft
PyTorch速度与TensorFlow一样快,对于Recurrent Neural Networks可能更快。Keras一贯较慢。正如第一个比较的作者所指出的那样,高性能框架(即PyTorch和TensorFlow)的计算效率的提高在大多数情况下将超过快速开发环境以及Keras提供的实验易用性。
总结:
就训练速度而言,PyTorch胜过Keras
Keras与PyTorch:结论
Keras和PyTorch都是您第一个学习的深度学习框架的绝佳选择。
如果你是一位数学家,研究人员或者倾向于理解你的模型真正在做什么,那么就考虑选择PyTorch。它真的很优秀,特别是当你需要更高级的定制(及其调试)(e.g. object detection with YOLOv3 or LSTMs with attention),或者当我们需要优化除神经网络以外的数组表达式(例如矩阵分解或word2vec算法)时。
如果您需要即插即用框架,Keras毫无疑问是更简单的选择:快速构建,训练和评估模型,而无需花费太多时间在数学实现细节上。
关于深度学习的核心概念的知识是可以迁移的。一旦掌握了一个环境中的基础知识,就可以将它们应用到其他地方,并在您转换到新的深度学习库时可以立马上手。
领取专属 10元无门槛券
私享最新 技术干货