向商务人士推销人工智能
从银弹综合症到一线希望
在这篇文章中,我计划与你分享我们最近向商界人士推销人工智能的经验,以及我们在这一过程中吸取的教训。
作为一家人工智能专家的小公司,我们遵循认知营销方法。我们不是仅仅依赖一个营销渠道,而是参加像多伦多机器学习峰会这样的会议。虽然这是一个很好的方式来满足上升的人才,并产生线索和压力,在线游戏也很重要。
Sam and I manned the booth @ TMLS. Special thanks to Dave Scharbach for continuing to exceed expectations on organizing the 1K person annual event.
我们已经为企业客户提供人工智能咨询近 3 年了,几个月前,我们认为几个简短的营销视频是与世界分享我们所做事情的好方法。
事实证明,我们有很多东西要了解商业人士在观看视频时是如何误解人工智能技术的当前能力的。我们的内容营销方法在博客和 LinkedIn 上效果很好,但是视频营销的效果不佳。让我们来谈谈哪里出了问题,以及我们做了什么来修复它。
我们开始将我们的能力提炼成一些有趣的片段(见下文),向决策者展示我们在做什么,以及为什么这对他们很重要。第一步是建立概念:展示人工智能的各种应用,以暗示我们的专业知识。
以下是我们想要传达的 6 条关键信息:
- **适应或者死亡:**不采用 AI 的人会被采用 AI 的竞争对手和新人吹走
- **AI 分析的文档:**目前由人类执行的文档处理解决方案的自动化。更一般地说,业务流程自动化
- **我们的人工智能开发能力:**一般来说,定位我们,说我们为企业客户做人工智能的事情
- **释放数据的价值:**通过创建人工智能系统来提高收入、质量和成本等关键绩效指标,从而实现数据货币化
- **边缘计算:**将你的 ML 模型部署到移动应用中,这样你就不需要海量的 GPU 能力来做推理了
- **人工智能真正的样子:**在 tensorboard 中显示嵌入向量,因为它很酷
愿景对我们来说似乎很清晰,我们直接投入了生产。
银弹综合症——严酷的现实考验
我们对我们的新视频内容感到非常自豪,我们计划并在 LinkedIn 上发布我们的视频,但令我们惊讶的是,我们获得了很多浏览量,却很少有线索。总之,这些线索并没有改变我们人工智能产品和服务的销售。
在跳到解决方案之前,让我们先看一下我们创建的内容,让您对这个问题有个大概的了解。以下播放列表包含 10 个预告视频。花点时间看看这些短片,想想一个没有 AI 背景的 CxO 的反应,或者它是如何工作的。以下是预告视频的播放列表:
A playlist of 10 teaser videos advertising our AI services.
一旦我们了解到活动进展不顺利,我们就从广告上退一步来评估哪里出了问题。
发生的情况是,我们的“决策者”客户在 C-suite 职位上对内容做出了我们没有预料到的假设。当我们展示一个人工智能生成艺术的例子时,我们的观众认为我们有一个只进行人工智能艺术生成的产品。更狭隘的是,他们认为我们只制作日本动漫艺术。我们试图展示专业知识,但却被解释为产品特性和功能的狭窄范围。我们的目标客户认为我们在销售视频中的应用程序,而不是制作应用程序所需的功能,这是我们的错误。
问题:我们试图展示专业知识,但却被解释为产品特性和功能的狭隘范围。
有过这种经历后,我喜欢用一个类比来说明,潜在客户认为刀切肉的视频告诉他们,我们卖的刀只切肉。然而,我们卖切蔬菜、手指、费用和时间的刀。我们的结论是,为了解释先进的人工智能能力,需要更长更深入的内容。观看上面的视频,回想起来,你会发现理解一个复杂主题的短视频中的信息是多么困难。
一线希望——我们发现并修复了问题
那么,有哪些有效内容的例子?
基本上是长格式内容,高制作价值的真实媒体机会。以下是我们点击的 4 个内容示例。双关语。我选择了 4 个不同的人工智能项目来表明,推介人工智能更多的是关于价值信息,而不是人工智能本身。
详细内容:在 VanillaSoft 为 Lemay.ai 举办的人工智能网络研讨会
This one hour long webinar on AI led to a bunch of leads and conversations that we did not see from the teaser videos.
在我们的一个客户那里举行的网上研讨会是一个友好的场所,在现场观众的参与下,讨论了我对行业发展的看法。我去年曾指出,由于缺乏数据科学家,小公司比大公司更糟糕,现在我们已经成长,行业也成熟了,我觉得是时候重新讨论人工智能咨询业务的发展了。我们获得了很好的注册人数(约 150),这些人数转化成了潜在客户,然后我们还从在线观看内容的人那里获得了后续联系。
解说视频: Stallion.ai 文档理解介绍
Stallion.ai document understanding intro video (2 minutes instead of 13 seconds). Stallion.ai is our venture in the UAE, serving the MENA region.
一旦我们理解了短视频的问题所在,我们就能在视频制作中获得更多的细节。这段讲解文档处理的视频介绍了问题、解决方案、价值主张以及解决方案的一般性。新视频并没有展示一个飞过的演示,而是希望观众能明白其中的意思,而是清楚地展示了这项技术的能力,以及价值得以实现的原因。
高级别介绍:内部审计人工智能 AuditMap.ai
AuditMap.ai intro video on making sense of internal reports with AI. It is one minute long.
在这个视频中,我们决定不显示用户界面,因为它会随着我们为客户添加新功能而不断变化。我们实际上是在上述 10 个预告剪辑之前开发了这个审计图介绍视频。在播放这个视频后,我们一直在问一个主要问题,那就是“我能看看演示吗?”我对这个问题没有问题,因为我们为大约 1 小时的演示保留了好的内容。AuditMap 非常复杂,我们不想在与客户(通常在银行业)实际交谈之前展示太多内容,以便在电话直播中解决他们的问题。
激发用例:investifai.com人工智能资产管理简介
3 minute intro video to investifai
它需要大量的内部审议和客户互动,以找出什么样的信息对投资者有效。他们是与我们通常的决策者客户完全不同的细分市场。我们必须非常简单地强调关键点:人工智能不是情绪化的。没有计算机,投资组合管理对人类来说太复杂了。在这个周期结束的时间点,风险调整后的回报是必不可少的,市场变得越来越可怕,将资金投入一个资产类别不是一个明智的选择。
到目前为止,这个视频的反馈是积极的。
结论
在这篇文章中,我开始给你一个快速回顾我们在营销我们的人工智能开发能力和解决方案的道路上的坎坷。我们发现,为了解释这些人工智能能力,需要更长的内容。不管底层技术如何,内容需要向观众推销为什么解决方案更好,而不是为什么解决方案更酷。
如果你喜欢这篇文章,那就看看我过去读过最多的文章,比如“如何给人工智能项目定价”和“如何聘请人工智能顾问”我还准备了一些关于寻求采用机器学习的公司所面临的其他问题的文章,比如“没有云和 API 的机器学习”
下次见!
丹尼尔
您可能喜欢的其他文章:
张量流批量范数的缺陷和训练网络的健全性检验
在这篇文章中,我将写下我们在编写深度学习模型和一些健全性检查时犯的错误,这将帮助你缩小小守护进程的范围,并挽救你的夜晚睡眠。
I .让我们一劳永逸地完成 TensorFlow 中的批量定额
批量标准化的简要理论
这项革命性的技术是由 Sergey Ioffe,Christian Szegedy 在论文 ,中介绍的,到目前为止被引用了 4994 次。根据该论文,批量标准化减少了内部协方差移动,即,它使得网络中各层的学习更加相互独立。批量范数层的目标是向激活层输入,单位高斯,使得神经元在 sigmoid 和 tanh 的情况下不会饱和。它有助于网络的快速收敛,允许你不用关心权重的初始化,作为正则化来代替丢失和其他正则化技术。现在我不会讨论太多的理论细节,而是更多地讨论实现。我将带您了解 TensorFlow 及其数学中批处理规范的实现。
在训练的时候-
At training time. Images taken from Batch Normalization paper.
现在假设卷积层和激活层之间使用批量范数层,那么 x 是卷积层的输出, y 是批量范数层的输出,输入到激活层,可能是 ReLU,sigmoid 等。批量定额层学习参数 γ 和 β , y 取决于它们的值。因此,示出了使用 γ 和 β 来学习 x 的最佳表示。请注意另外两个统计量,即***【x】和Var【x】***、总体均值和方差。它们是通过训练期间的移动均值和移动方差来估计的。
在推断的时候-
At inference time
推理时向前通过批范数层与训练时不同。在推断时,我们不用批均值()和方差(【σ2*)而是用总体均值(e【x】)和方差(var【x】)来计算 x^ 。假设您在推断过程中给定批量大小为 1 的批,并使用批均值和批方差进行归一化,在这种情况下,为 μ=x 然后 y=β ,这表明层输出(y)对于任何输入 ( )因此,为了在推断时进行标准化,我们使用总体均值和方差,这是我们在训练期间使用移动均值和方差计算的。在下一节中,我们将介绍 TensorFlow 中批处理规范的实现。*
TF 中批量定额的注意事项
- 移动平均值和方差不更新: 张量流是基于图形的,计算按依赖关系的顺序进行。
**import tensorflow as tfa = tf.placeholder(tf.float32, shape=[1,3])
b = tf.placeholder(tf.float32, shape=[1,3])
c = tf.Variable(tf.zeros([1, 3]), dtype=tf.float32) def train(a,b):
c = tf.add(c,a)
e = some_train_op(a,b)
return eoutput = train(a,b)
loss = tf.log(output)sess = tf.Session()
saver = tf.train.Saver()
sess.run(tf.global_variables_initializer())for itr in range(1000):
ls = sess.run(loss, {a:x, b:y})saver.save(sess, some_path)#Note that this code is for reference only.**
现在,在此我们运行 损失 张量在每次迭代中,对于每次迭代 列车 函数都会被调用。 c 是一个变量,对所有迭代的 a 的值求和。因此,当我们保存模型时,我们期望变量 c 等于在每次迭代中传递给占位符的所有值的总和。
让我们详细分析一下,这个模型的图中的依赖关系。当我们运行 损失 张量, 输出 将被计算然后 输出 将调用 列车 从 e 中需要哪个值,将使用和 b 来计算在所有这些计算中 c 根本不会被计算为 损失 张量的值不依赖于 c 。解决方法是在计算e 之前加上 c 作为依赖。因此,解决方案****
**def train(a,b):
c = tf.add(c,a)
with tf.control_dependencies([c]):
e = some_train_op(a,b)
return e**
在训练网络时,我们调用优化器 op 来完成所有计算并更新所有权重,但是优化器 op 从不依赖于移动平均值或方差的计算。因此,移动平均值和方差永远不会更新,而是保持其初始值。
解决方案:TensorFlow 为批量规范化提供了三个主要函数
****tf.nn.batch_normalization()** - Never use this for training, it just compute the y = gamma*x^hat + beta where x^hat = (x-mean)/std_dev.
It doesn't account for keeping moving mean and variance. **tf.layers.batch_normalization()** -This function can be used for your model. Note: Always add batch norm dependency when using this, either on optimizer op or any other op which you sure that will execute when optimizer op is run. ex:-update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) with tf.control_dependencies(update_ops):
self.solver = tf.train.AdamOptimizer(learning_rate=1e-04)
.minimize(self.loss)Here tf.GraphKeys.UPDATE_OPS is the collections which have moving mean and variance op. **tf.contrib.layers.batch_norm()** - This function is in contrib module of TensorFlow. This function gives two ways to add dependencies as follows:
1.It has '*update*' parameter, set *update=None* while calling the function and dependency will be added inside the function itself and you don't have to anything else.
**Note:This is believed to be slow in comparison to the next method.**2\. Let the *update* parameter have it's default value which is "*tf.GraphKeys.UPDATE_OPS*". Now here also you have to manually add dependency as above with tf.layers.batch_normalization().**
因此,您可以使用TF . layers . batch _ normalization()或 TF . contrib . layers . batch _ norm()进行适当的更新依赖处理。
- 训练和测试时的不同用法:
从训练到测试时,我们要在批均值和方差或者总体均值和方差之间切换。我们在 tf.contrib.layers.batch_norm()和 tf.nn.batch_normalization()中分别有参数is_training
和training
。当其值为True
时,使用批均值&方差并更新移动均值和方差来估计总体均值和方差。在False
上,使用总体均值和方差。因此你应该为此使用一个占位符train_phase
。因此,解决方案如下所示
**def Bn(x, **is_train**):
return tf.contrib.layers.batch_norm(x, decay= 0.99,
***is_training=is_train***,center= True, scale=True,
reuse= False)*train_phase = tf.placeholder(tf.bool, name="is_training")*
data = tf.placeholder(tf.float32, shape=[None,240,240,3], name="Image") bn_layer = Bn(data, train_phase)loss = some_loss_op()solver = tf.train.AdamOptimizer().minimize(loss)# Training iteration
sess.run(solver, {data: input_data, *train_phase:True*})#Validation iteration
sess.run(loss, {data: input_data, *train_phase:False*})**
- 共享批次范数参数: 通常你在两个并行网络中共享权重,比如 siamese 或者在 GANs 的鉴别器中。当您共享您的重量时,批量定额参数也会被共享。有时候,跨两个网络共享批量定额参数也不能健康,具体什么时候我会告诉你。
假设我们正在训练一个 GAN,它将有两个具有共享参数的鉴别器实例,当训练开始时,伪图像和真实图像的分布是不同的。现在我们用两种不同的分布来更新移动平均值和方差,一种是假图像,另一种是真实图像。但是随着训练的继续和生成器学习真实数据的分布,假数据和真实数据的分布最终变得近似相同。然后我们在更新同分布的均值和方差,所以我们的总体均值和方差应该是完整训练后真实数据的估计统计量。因此,理论上,在 GANs 的情况下,共享批量定额参数可能不是一个大问题。但是我会在这两种条件下做一些实验,并在新的博客上更新实验结果。
现在 这篇博文 可以很好地解释共享批量定额参数会对模型的准确性产生不利影响的情况,并具有更好的可视化效果。
简而言之,在两个共享批次范数层的输入分布相同之前,共享批次范数参数是可以的,如果不是这种情况,请尝试在上述批次范数函数中使用reuse=False
,这将允许您在想要共享权重的两个网络中拥有独立的批次范数参数。
二。健全性检查和调试-
- 端到端图像模型:
在图像分割或深度预测等以图像为输入的任务中,我们希望输出大小相同的图像。训练您的模型以学习身份函数,即将输入图像作为目标图像。在这种情况下,网络将代表身份功能。如果这是完美的训练,但你仍然无法学习分割或深度,可能是你的模型没有足够的能力。你可以尝试添加更多的层或可能更好的损失功能为您的任务。 - 目标和输出范围:
如果您已经将目标图像归一化为 0 到 1,那么请确保在图像生成层中使用 sigmoid 作为激活函数,而不是 tanh,因为 tanh 将具有-1 到 1 的范围,这将使学习变得困难。如果归一化在-1 到 1 之间,则使用双曲正切。 - 波动损失:
最可能的原因可能是您的机型没有足够的容量。因此,权重快速改变以学习模型,但是由于容量有限,它们保持快速改变它们的权重,但是从未接近最优。你也应该试着降低学习速度。 - 超参数:
千万不要忽略超参数。一般来说,它们对于你的网络的准确性和性能可能不是非常关键,但是对于训练的收敛性和稳定性绝对是非常重要的。疏忽的权重初始化可能导致网络中的梯度或 NaNs 被利用/消失。如果你使用正态分布,检查你的权重初始化的 std_dev,范围[0.2,0.01]是可以的。如果损失表现异常,学习率和批量大小是首先要试验的。 - 顺序数据的混排:
当您的输入数据是顺序数据时,这种情况在视频中最常见,如自动驾驶中的分段、深度预测等。你应该考虑改变数据,用连续数据训练会对测试中的模型准确性产生负面影响。
注:每当任务需要时间一致性时,如光流、视觉里程计等,你应该有顺序数据。 - 缩放损耗:
如果您在网络中使用一种以上的损耗类型,例如 mse、对抗性、L1、特征损耗、 SSIM ,那么请确保所有损耗都被适当缩放到相同的阶数,即 MSE 为 1e-01,特征损耗为 1e03,然后将特征损耗缩放到相同的阶数。 - 图形可视化,这场战争中最大的武器:
如果你使用 TF 和其他有可视化工具的框架。您应该使用可视化来检查连接,它们将帮助您找出遗漏的连接、尺寸误差或重量分配误差。 - 共享批量定额参数:
如上所述,如果您在两个网络中共享批量定额参数,那么请确保两个网络的输入数据分布相同。
这篇博文还详尽列举了你的网络失败的其他原因。
感谢大家阅读这篇博客,希望它能拯救你与批量定额和培训网络的斗争。我欢迎您的所有评论,如果您想添加任何内容或觉得任何内容有误导性,请告诉我。如有疑问,可发邮件至 dishank.bansal@iitkgp.ac.in 联系我。
参考资料:
- https://arxiv.org/abs/1502.03167—批量定额纸
- https://r2rt . com/implementing-batch-normalization-in-tensor flow . html
- https://medium . com/machine-learning-world/how-to-debug-neural-networks-manual-dc2a 200 F10 f 2
- https://github . com/tensor flow/tensor flow/blob/r 1.8/tensor flow/python/layers/normalization . py
简单估计量
机器学习很棒,除非它强迫你做高等数学。机器学习的工具变得越来越好,训练你自己的模型变得前所未有的简单。
我们将利用我们对数据集的理解,而不是对原始数学的理解来编写一个模型,让我们获得洞察力。
在这一集里,我们将只用几行代码来训练一个简单的分类器。以下是我们今天要看的所有代码:
机器学习的张量流估计器
为了训练我们的分类器,我们将使用 TensorFlow,谷歌的开源机器学习库。TensorFlow 有一个相当大的 API 面,但是我们要关注的部分是高级 API,称为估计器。
评估人员为我们打包了训练循环,因此我们可以通过配置它来训练模型,而不是手工编码。这去掉了许多样板文件,允许我们在更高的抽象层次上思考。这意味着我们将开始玩机器学习的有趣部分,而不会陷入太多的细节。
由于到目前为止我们只讨论了线性模型,我们将把它放在这里。我们将在将来再次讨论这个例子,以扩展它的功能。
花卉分类:就像葡萄酒 vs 啤酒一样有趣?
本周我们将建立一个模型来区分三种不同类型的非常相似的花。我意识到这是一个小有点不如前一集的啤酒和葡萄酒令人兴奋,但这些花有点更难区分,使这成为一个更有趣的挑战。
从检测皮肤癌,到分拣黄瓜,到检测需要维修的自动扶梯,机器学习已经…
medium.com](https://medium.com/towards-data-science/the-7-steps-of-machine-learning-2877d7e5548e)
特别是,我们将对不同种类的鸢尾花进行分类。现在,我不确定我能从一片玫瑰丛中挑出一朵鸢尾花,但我们的模型旨在区分鸢尾、杂色鸢尾和海滨鸢尾。
Iris Setosa, Iris Versicolour, and Iris Virginica
我们有一个测量这些花的花瓣和萼片的高度和宽度的数据集。这 4 个栏目将作为我们的“特色”。
加载数据
导入 TensorFlow 和 NumPy 后,我们将使用 TensorFlow 的load_csv_with_header
函数加载数据集。数据或特征以浮点数表示,每行数据或目标的“标签”记录为整数:0、1 或 2,对应于 3 种花卉。
我已经打印出了我们加载的结果,我们可以看到,我们现在能够使用命名属性访问训练数据和相关联的标签或目标。
建立模型
接下来,我们将构建模型。为此,我们将首先设置特性列。要素列定义了进入模型的数据类型。我们使用一个 4 维特征列来表示我们的特征,并将其命名为“flower_features”。
使用估计量建立我们的模型非常简单。使用“tf.estimator.LinearClassifier ”,我们可以通过传入刚刚创建的特征列来实例化模型;模型预测的不同输出的数量,在本例中为 3;以及一个存储模型的训练进度和输出文件的目录。这使得 TensorFlow 可以在需要时从中断的地方继续训练。
输入功能
这个分类器对象将为我们跟踪状态,我们现在几乎准备好继续训练了。将我们的模型与训练数据联系起来还有最后一个环节,那就是输入函数。输入函数的任务是创建张量流操作,为模型生成数据。
因此,我们从原始数据到输入函数,输入函数传递数据,然后由特征列映射到模型中。请注意,我们对特性使用了与定义特性列时相同的名称。这就是数据的关联方式。
运行培训
现在是时候开始我们的训练了。为了训练我们的模型,我们只需运行 classifier.train(),将输入函数作为参数传入。这就是我们连接数据集和模型的方式。
train 函数处理训练循环并在数据集上迭代,每一步都提高其性能。就这样,我们完成了 1000 个训练步骤!我们的数据集并不大,所以完成得相当快。
评估时间
现在是时候评估我们的结果了。我们可以使用之前的相同分类器对象来实现这一点,因为它保存了模型的训练状态。为了确定我们的模型有多好,我们运行 classifier.evaluate()并传入我们的测试数据集,并从返回的指标中提取准确性。
我们得到了 96.66%的准确率!一点都不差!
评估人员:简单的工作流程
让我们在这一周暂停一下,回顾一下到目前为止我们使用估算器所取得的成果。
Estimators API 为我们提供了一个很好的工作流程:获取原始数据,通过输入函数传递数据,设置我们的特征列和模型结构,运行我们的训练,以及运行我们的评估。这个易于理解的框架允许我们考虑我们的数据及其属性,而不是数学的基础,这是一个很好的地方!
下一步是什么
今天我们看了 TensorFlow 的高级 API 的一个非常简单的版本,使用了一个固定的估计器。在未来的几集中,我们将探讨如何用更多的细节来扩充这个模型,使用更复杂的数据,并添加更多的高级功能。
喜欢这一集吗?在 YouTube 上查看整个播放列表!
行星蜂巢
Ep。1:探索我们星球的旅游活动
Our output for today; Make sure to read below how we get there; Calculate our measures and for a interactive visualization
闭上你的眼睛一秒钟,忽略外面的雨滴,新邮件的嘟嘟声,深入思考你的待办事项清单上的十项全球活动…
老实说,有多少人参加了世界上最常去的活动?这没什么不好,他们来访是有原因的。然而,它们真的值得我们花费有限的资源去那里旅行吗?或者有没有其他没有立即想到的选择?
这些问题是我们今天想要回答的问题。我们能否客观地创建一个衡量标准,不仅代表访问量最大的活动,还代表评分最高的全球活动,我们能否将这些活动可视化为一个易于发现的新珍珠地图?
我们的方法
-
我们将查看当前可用的度量,并根据需要对数据进行 转换 以增强下游分析和可视化
-
在地区、国家和个人活动水平上执行 探索性数据分析 ,以验证我们新创建的衡量标准
-
将我们的数据可视化到一个交互式图表中,我们将在接下来的几集里将这些数据修改到一个交互式仪表盘中
数据
我们今天将使用的数据包括:活动元数据、评论数量、用户评级和一些额外的地理数据。我们最初将从以下来源获得这些信息:
- :收集的活动,用户评论数和他们的评分 ,他们收集的活动将是我们的起点。在这里,我们只关注在每个国家的“首要任务”清单上的活动或有超过 750 条评论的活动。****
- Google : 通过使用 Google Places 和 Geocoding API,我们丰富了来自猫途鹰的活动数据,收集来自 Google 用户的 地理数据 (即坐标)以及。****
- CIA World Factbook : 关于国家的参考数据(大小,公民等。)我们将使用《中情局世界概况》中的综合数据库。我们从 174 个国家开始
数据转换
我们的数据集从 7,044 个活动开始,其中 5,971 个活动我们还可以得到谷歌用户评级。今天练习的良好开端。
让我们通过创建两个散点图来看看数据是什么样的,这两个散点图包含我们最关心的 4 个指标:一个包含纬度和经度,另一个包含评论数量和每项活动的平均评分
********
Fig. 1, 2 Scatter plots created with Matplotlib in Python
以下是一些初步要点:
- 欧洲的活动似乎非常多。这可能是由使用猫途鹰的用户偏见造成的。然而,总的来说,我们的地理数据看起来很干净,我们有一个适当的全球多样化。
- 我们喜欢给高收视率!几乎没有低于 6/10 的评分,显然大多数评分都高于 8/10。简单的平均综合评分甚至是惊人的 8.98/10!
- 说到评论的数量,似乎大多数活动只有 20,000 或更少的评论。与此同时,有相当多的离群值,以及超过 120,000 条评论的明确亮点活动!(你能猜出这是哪个亮点吗?)
- 评论的数量和平均评级标准都不是正态分布的
而后者是我们这里的重点。因为我们今天的目标是使用这些度量来进行比较,所以我们希望在这两种情况下获得尽可能多的正态分布度量集。图 2 告诉我们一些关于这两个度量的信息,以及它们是如何分布的。
首先来看一下评论数量,考虑到大量较小的值和非常有限的非常高的值,我们似乎正在处理一个对数正态分布。为了证实这一观察结果,我们将绘制两个 QQ 图,一个具有正常轴,另一个具有对数轴,一条直对角线将证实正态分布:
Fig. 3, 4 QQ plots with regular y-axis (left) and log y-axis (right) produced with Probscale in Python
正如所料,对数标度比常规标度更适合正态分布数据集。因此,我们将对审核措施的数量应用 LOG10 转换。我们将使用这一新方法来比较未来的评论。
**然后进行**平均评级的分配。这里的问题似乎不一定代表数据的偏斜,而是用户给出过高评级的问题。如果只看 8 分以上的评分,这种分布似乎更接近正常。
Fig. 5 Boxplots produced with Pandas in Python
我们可以用左边的方框图来证实这一观察结果。查看每个评级值以及两个来源的平均值,我们可以看到,在 8 到 10 之间的分布可以被视为正态分布,任何低于 8 的评级都有异常值。
因此,我们将把数据转换成一个新的衡量标准,其最低阈值为 0.8(意味着 0.8 等于≤ 0.8)
最后一步,我们将对这两个测量值应用最小最大归一化。
现在,我们可以在下面的 jointplot 比较中比较转换后的度量的分布与原始度量的分布:
********
Fig. 6, 7 Combined distribution plots Before and After respectively created with Seaborn in Python
由此,我们可以创建一个新的度量,它应该代表这两个度量的最佳组合。将它们相乘将得到一个值,该值代表评论数量的加权分数(即评论越多,其评级越可靠):
活动评分:
正常。平均下限。访客评级*
(规范。log10 审核计数/平均值(标准。log10 审核计数))
探索我们的活动
既然我们已经创建了评分标准,我们就可以开始研究数据了。
让我们首先将全球区域的活动评级与每项活动的平均点评数进行比较:
Fig. 8 Scatter plot generated with Seaborn in Python
现在越来越有趣了!这里有些非常特殊的事实可能会违背你的先入之见。
首先,在高水平上,这两个变量之间显然存在正相关关系。这自然是有道理的,活动评价越高,就会有越多的人来参观。当然,直到你到达一个点,访问者的数量在评级中变成一个负变量:
没人去那里了。太拥挤了。
其次,看看平均评论数量排名前三的地区,这些似乎是我们许多人都可以猜到的顺序。西欧、南欧和北美有许多著名的旅游热点,接待许多游客,因此平均每项活动也有许多评论。
排名前三的地区也是如此:澳大利亚和新西兰、中美洲和北美洲是经常被称赞的地区。我个人认为最令人惊讶的地区是东欧,排名第四,领先于任何其他欧洲地区!
最后,从大洲的角度来看:美洲和欧洲表现最好,而亚洲、大洋洲和非洲则表现得更加分化。尤其是西部和中部非洲在这两项指标上都是绝对垫底的,而南部和北部非洲也没有落后其他地区太多。
让我们转到国家视图,根据加权平均评级绘制排名前 10 位和后 10 位的国家,看看我们能从中得到什么:
俄罗斯占据了头把交椅!对于我们中的一些人来说,这可能是出乎意料的,但同时我们看到乌克兰也进入了前 5 名,与之前的地区概况完全一致,另外两个东欧国家也进入了前 15 名(白俄罗斯和斯洛文尼亚)
我想对我们大多数人来说,前 15 名中的所有其他国家都是显而易见的,它们都是非常著名的度假目的地。可能最令人惊讶的是看到辣椒击败所有其他美国南部国家。
很高兴看到前 15 名来自七大洲中的 5 个国家。但是排名最后的 15 个国家看起来没有那么多样化,而且几乎完全由非洲国家主导(更准确地说,主要是西非和中非)。朝鲜是唯一一个来自另一个大陆的国家,能够融入这个不那么有声望的名单。
为了让这些国家的热点在全球范围内更加明显,我们可以创建一个全球热图,绘制每个国家的加权平均活动得分:
Interactive Chart #1. Choropleth Map created with Plotly
这个图很大程度上证实了我们以前已经发现的东西。有明显的热点地区,包括欧洲(尤其是东欧和西南欧)、北美(尤其是加拿大和中美洲)、大洋洲和南美洲,尽管巴拉圭和北部的一些小国是这些地区的负面离群值。
“冷”点在非洲中部和西部最为明显。而南部、北部以及东部非洲的一些地区得分略高。亚洲的情况非常复杂,一些国家属于绝对寒冷地区(朝鲜、巴布亚新几内亚、吉尔吉斯斯坦),而其他国家的得分很高(泰国、土耳其、也门)。
到目前为止,我们已经很好地了解了地区和国家是如何被同路人评价的,现在是时候看看个人活动了。毕竟,我们今天的目标是在地图上标出每个活动,并使其在平均评分和评论数量上具有可比性。
因此,在下面的图中,我们看到了纯粹基于评论数量的前 15 项活动,以及基于我们新创建的评分标准的前 15 项活动:**
多么有趣的差异啊!一些关键要点:
- 在评论数前 15 名的活动,可能没有一个让任何人感到非常惊讶;完全被欧洲和北美(实际上是纽约)的著名活动所主导。
- 同时,我们新创建的加权评分指标中的前 15 项活动反映了当前各大洲的高度多样性(7 个中的 5 个),并且肯定包括了一些我个人的新列表条目。
- 令我惊讶的是,没有一个基于评论数量的顶级活动也能进入加权得分排行榜。这意味着他们在网上获得的平均评分明显低于加权评分活动的前 15 名。
- 虽然上面的图表主要是欧洲的活动,但第二个图表只包括欧洲的两项活动。因此,虽然他们收到了大量的评论(和访客),但他们的评级却比其他(较少访问的)活动稍低。
总结图表
现在是时候让我们所有人自己探索所有活动,同时能够清楚地区分每个活动的评级和评论数量了。我们现在将绘制所有活动,标记填充是最低平均评级,而标记的大小是评论的数量。当您将鼠标悬停在标签上时,每个活动的所有详细信息都会显示在标签中。
此外,您还可以在下面找到基于我们新创建的衡量标准的前 100 项活动,以供进一步参考。
一定要放大你的祖国(不要责怪地图上的细节少了点)或你的下一个旅行目的地,因为你可能会发现一些真正的好东西!
Interactive Chart #3 scatter plot with hex bins as markers with Plotly
星球,重访
用 fastai 1.0 进行卫星图像分析。
我想在xfiew数据集、 DIUx 的卫星图像竞赛上工作。我已经有一段时间没有做计算机视觉工作了,随着 fastai 和 PyTorch 的 1.0 发布和预发布,我认为重温星球亚马逊 Kaggle 竞赛将是一个很好的热身。
我的目标是在继续前进之前打破最高分。那个位置由最合适的占据,他现在是 Kaggle 上排名第二的竞争者,之前是第一。所以我的第一站是查看他的采访——因为 Kaggle 在其博客上采访比赛获胜者。实际上,我有几次回想起这件事:第一次很困惑,感觉“哦,就这样了?”最后一次。
有件事。当你阅读一个知道自己在做什么的人写的新的技术- 任何东西时,真的很容易失去平衡。你一遍又一遍地发现,那些看起来很重要的事情,其实并不重要。机器学习(或任何领域)任务的基本概念通常非常简单。能够从低级细节到高级概述进行上下文切换是非常有价值的。
所以第一个命令是,看看胜利者是如何做到的。xView 将有创新的空间;我的目标是尽快度过难关,比赛结束。所以让我们看看什么有效。
我想我把采访看了三遍,并写了两遍,画了一个关于 bestfitting 所说的图表,以便在整个过程中帮助我。它的要点是这样的:
- 使用去雾算法预处理图像(使模糊→清晰)
- 使用大约一打模特的组合
- 将每个模型的输出馈送到其自己的岭回归模型/层以学习数据中的相关性
- 将集合的输出提供给最终的岭回归模型。
- 也使用 F2 损失函数
什么是岭回归?几天到一周的迷茫 阅读 后来,我得到的是:‘岭回归’是损失函数中加入平方和项的线性回归。Anuja Nagpal 的帖子是我理清事情的关键。因此… ’ 岭回归’将 L2 正则化添加到损失函数中…(并有一个 L1 对应项,添加了一个幅度和项,称为’拉索回归’)。
from Nagpal’s post
还有一件事。当我听说某个工具被用来“寻找数据中的相关性”和“选择最强的模型来预测每个标签”时,我的想法是进城,尤其是当这个工具有自己的名字时。因为第一次,我很难想象带有平方和项的回归会做一些听起来很聪明的事情。它不可能是你可以从 scikit-learn 导入的东西,或者作为一个层编码到神经网络中,对吗?
但还是。那 怎么办?“选择一个模型”等等。我到了那里会告诉你的。然而,事物的内部名称增加了进入一个领域的摩擦。就叫它是什么吧。
在这一点上,我对“岭回归”或“L2 回归”等的唯一困惑。,就是通过做才能得到答案的东西。当 bestfitting 说他们使用一个模型时,他们是指他们在 PyTorch 中编写了一个迷你神经网络,还是从 scikit-learn 中导入的?或者只是一个神经网络的线性层(比方说,附加在 CNN 模型的分类器头上)与 L2 正则化?最后一个更有道理…但是你怎么训练它呢?看,模型回归器是有意义的:把它做成一层,然后正常训练。但是整体回归器…你不能一次就建立一个巨大的神经网络。即使你有资源,不同的模型也会有不同的训练方案。所以最后一个回归变量要么是 PyTorch 要么是 scikit-learn 模型,对吗?听起来像是必须的。然后你也拟合它,在“原始”预测和实际标签之间,对吗?
…不幸的是,你必须被列为“贡献者层”才能被允许在 Kaggle 上联系其他人,所以我不能轻易要求。到了那里就知道了。
这留下了工作前的最后一个细节:去雾。去雾就像它听起来的那样:它只是从模糊的图像中去除薄雾。
from: anhenghuang/dehaze
Bestfitting 使用了一种基于论文的算法:使用暗通道先验的单幅图像去雾。它显示了令人印象深刻的结果。我决定不去实现它——我在玩这样一个想法:快速完成一个项目包括选择在哪个山头插上你的剑。我就找了个好的外挂-&-玩版。我还是花了一天时间在这上面。我找到了一个 Python 版本的,但运行起来需要一秒钟,所以我找到了一个 C++版本的,在我完成了与 Xcode 的战斗并重新学习了如何在其中构建一个项目之后,运行起来需要更长的时间。所以我想,“让我们用神经网络来做这件事吧”。但是我想知道如何正确地做这件事?我不想沉溺于设置一个环境来运行一个我只作为预处理器使用过一次的模型。于是找了个现成的 Caffe 型号!从来没有使用过编译过的神经网络,最好学一段时间。一个陷阱。如何安装Caffe?最好不要因为你打算用一次的东西而改变你的系统。啊,有一种方法可以将 Caffe 转换成 Caffe 2(T18)(它来自 PyTorch 的 conda 安装)……这涉及到caffe
导入,因此需要Caffe——你知道我对 python 版本的看法。**
——我还在 github 上找到了几个其他的 dehazers。 DCPDN & AOD 网。—
现在我准备好实际做一些深度学习了。嗯,还没有,因为在玩 Xcode 和 HomeBrew 以及其他东西的时候,我设法破坏了我的 Mac 的 Python 2 安装——顺便提一下,这就是谷歌使用的,因此为什么 gcloud 不能连接到我的 GCP 实例;而是抛出一个令人困惑的“找不到模块 zlib”导入错误。我忘了我是怎么修好那个的。从苹果开发者网站下载 Xcode 命令行工具有问题,因为它不能从命令行运行。然后是自制的东西。那花了一天时间。可能是同一天。
像这样的噩梦是我使用清单的原因。
**现在我准备好开始使用 fastai 。我将在下一篇文章中讨论这个问题。
星球,重访 2
fastai 1.0 卫星影像分析
[ 第一部分
这篇文章有点像实验。莱斯利·史密斯和杰瑞米·霍华德等研究人员的工作质量和数量一直给我留下深刻印象,也让我感到困惑——他们的实验从外表看起来是多么复杂。学习人工智能的最大挑战之一就是简单地跟踪我在做什么以及为什么。当你同时进行多个实验并且还有其他事情要做的时候,你如何组织一个项目?记笔记可能是个好主意……
为了做更好的实验,这篇文章主要是边工作边记笔记的结果。它已经帮助我发现了一些错误,并磨练了一些想法。首先,回顾一下自上次以来一些重要的工作基础设施的发展。
第 1.5 部分:
这是对第 1 部分的一点跳跃。长话短说:为了把行星数据下载到虚拟机上,发生了很多冲突,为了让 Kaggle 的 API 工作,又发生了更多的冲突。这一切都被新的 fast.ai 课程笔记本里的几行代码代替了。稍微修改一下,使设置过程非常快速(这些是在 Linux 机器上的 Jupyter 笔记本中完成的):
在您的环境中安装 Kaggle API:
! pip install kaggle --upgrade
创建 Kaggle API 密钥后,将其移动到需要的位置:
! mkdir -p ~/.kaggle/
! chmod 600 kaggle.json
! mv kaggle.json ~/.kaggle/
制作一个数据目录(在from fastai import *
之后):
path = Config.data_path()/'planet'
path.mkdir(parents=True, exist_ok=True)
下载数据:
! kaggle competitions download -c planet-understanding-the-amazon-from-space -f train-jpg.tar.7z -p {path}
(&对test-jpg.tar.7z
、train_v2.csv
和test_v2_file_mapping.csv
做同样的事情)
拉开拉链。zip 是这样的:
! unzip {path}/train_v2.csv.zip -d {path}
像这样解压. tar.7z 文件:
! 7za -bd -y x {path}/train-jpg.tar.7z -o{path}
! tar -xf {path}/train-jpg.tar -C {path}
并清除存档文件(这将删除所有。zip、. 7z 和。{path}
中的 tar 文件,无需确认):
! rm -rf {path}/*.zip
! rm -rf {path}/*.7z
! rm -rf {path}/*.tar
大概就是这样。其他大的收获是学习如何在 fastai 库中做一些基本的事情,并找到更好的方法来实现快速实验(如指定分类截止阈值,基于这些自动创建提交文件,并上传到 Kaggle)。我想我会就此写一个小帖子,因为机械/基础设施之类的东西在你让它们工作之前是项目中最难的部分,之后看起来如此简单,你几乎会忘记它们。我这样做的时候会在这里放一个链接。
第二部分:
我们的目标是在继续进入xfiew数据集之前,赢得行星亚马逊 Kaggle 竞赛。我的想法是使用获胜的解决方案作为起点。但在此之前,我想用 ResNet34 击败一个人工基准: 0.93 (私人排行榜),只是为了确保我有一个可靠的模型在工作。
起初,我无法在 fast.ai 课程实现上有太多改进。我尝试了“渐进式重新冻结”,这是在解冻模型后锁定层,尽管验证指标看起来不错,但两次都失败了。这导致排行榜分数从大约 0.92 下降到 0.3——如果我玩有门槛的游戏,则为 0.5。从第 100 名下降到第 920 名,总共 938 名。像这样的崩溃通常是由于搞乱了提交文件,但是我还没有测试出到底发生了什么。
我正要继续前进,直到我在一个晚上得到了我的第四个最好成绩两次。其中一个分数只训练了 80%的数据。目前是 0.92638 。但是为什么是第四呢?因为在 2017 年跟随该类的一个早期版本,我用 ResNet34 得到了 0.92873 。我是如何用同样的模型和 fastai 库更有限的版本(0.7)得到更好的成绩的?
看着那本笔记本,有一个重要的直觉:
https://github.com/WNoxchi/Kaukasos/blob/master/FADL1/L3CA_lesson2-image-models.ipynb
卷积层的训练比正常情况下更加积极,因为它们是在 ImageNet 上预先训练的 ImageNet 不包含任何卫星图像。嗯,有道理。我使用了一个 3 倍的学习速率,而不是典型的每层组 10 倍的变化。以及非常大的初始学习率(lr=0.2
)。(看起来你也微调线性层更多,但我一开始错过了这一点)
第二天(实际上是今天)我回来测试这个想法。与旧的学习率相比,似乎更积极的区别学习率(DLRs)在早期做得更好。损失下降得很快…但它似乎从一个更高的值下降到另一个更高的值。
**注意:**我将提到以几种不同方式训练的同一个模型。这样就不那么令人困惑了:
norm-1
在我开始研究更大的学习率之前,这个模型是否经过了“正常”的训练。aggr-n
是第 n 个训练有素的模特。通常情况下,aggr
的层组之间的幂差为-3(比如:LR/9,LR/3,LR),而norm-1
的幂差为-10。除非另有说明,所有运行总共训练 24 个周期:每个阶段长度为 6±1 个周期(1:线性,2:全 conv),每个尺寸。
第二阶段积极运行的规模图 128:
f1. the aggressive model experiences a sharp loss drop, but froma higher starting point
并将其与第一轮(norm-1)的大小 128 第二阶段进行比较:
f2. the ‘normally-trained’ model has a shallower loss drop, but from and too lower values
积极运行的最终损失图(橙色表示验证):
f3. final loss plot of the aggressive run, aggr1
与正常运行相比:
f4. final loss plot of the normally-trained run, norm1
你想要的是类似后者的东西。 OneCycle 探索“解决方案空间”,给出一个损耗突增,然后稳定在一个接近恒定的低值。这不太符合新一轮的情况…所以要么是我太过于咄咄逼人,要么是我需要更长时间的训练来让事情稍微稳定下来;因为上面的图表看起来像是在不断变化。
此外,如果你想知道的话,我在 jupyter 实验室使用了材质黑暗主题。我发现自己使用 jupyter lab 比使用 notebook 多,因为虽然它的有用扩展比 notebook 少,但它内置了视图,所以你可以同时查看多个笔记本或笔记本的多个部分。
向 Kaggle 提交预测后…新模型并没有做得更好。我有一种预感,这是因为我把学习率——所有的学习率— 定得太激进了。对于尺寸为 128 的第二阶段,我使用了learn.lr_range(slice(lr/2/9, lr/2))
= lr/2/9, lr/2/3, lr/2
,但是在尺寸为 256 的第二阶段,我使用了:lr/9, lr/3, lr
。
将结果转换成可读的形式:
f5. results for norm-1 and aggr-1
norm-1
是继 fastai 课程笔记本之后的 ResNet 机型。aggr-1
是第一款‘进取型’车型。我认为我在新型号中用我的 DLRs 做得太过分了。在某些情况下,我在比以前高 3 个数量级的LRs 训练。
但这里有另一个想法:在第一次尝试之后,有多少“积极的微调”需要完成?你能从现实世界到卫星图像“模式”的艰难转向开始调整重量,然后回到“更平静”的训练计划吗?我现在要试试。
中场休息
我试过了(aggr-2),它比 norm-1 或 aggr-1 都差…损失图看起来不错,但我认为它只是没有得到足够的训练。从数字上看,这款车型看起来不足。训练损失比验证高 1.8%:0.083386 对 0.081870,阈值准确度下降了百分之一,fbeta 得分从 0.924608 上升了约 0.3%,达到 0.927831。
注:看起来和原装笔记本最大的区别就是增加了。除此之外,它似乎遵循每个阶段 6 个时期,每个大小 2 个阶段(冻结,解冻),训练格式。
旧笔记本从 64 号开始,然后是 128 号,然后是 256 号。我可能想试试这个。
但是在那之前…关于 aggr2 的额外训练…LRs 减半的额外 6 长度 256 阶段 2 循环…实际上比 aggr2 执行得更好,而不是崩溃。最终的损失图看起来就像你预期的那样:
f6. final losses of aggr2 trained for an extra cycle at 1/2 DLR
嗯,这很有意思
这里有一些注释。我最初认为aggr1
的表现优于norm1
,因为我混淆了这两个值(我在 f5 处向上修正了结果)。事实证明并非如此,但是额外的训练确实对aggr2x
有持续的帮助。
f7. private leaderboard results for all models
积极的训练正在起作用,看起来我并没有对 LRs 表现得太积极。尽管过去的经历令人困惑,但在最后训练第二阶段实际上对模型有一点帮助。
现在是时候训练aggr1
(因为我保存了重量,我可以重新加载)一个额外的周期,看看会发生什么。接下来,我将尝试通过 64–128–256 逐步调整大小。
中场休息 …
f8. That’s an interesting looking plot…
有趣的是,在 96%的准确率下,我们实际上只是在追逐一个数字。这是 96%的准确度,计算方法如下:
((preds>thresh).float()==targs).float().mean()
这就创建了一个独热编码张量(例如[0.,1.,1.,0.,..]
),只要预测与目标匹配,张量就为 1,其他地方为零。平均值作为精度值返回。
预测是有阈值的:任何更大的概率转换为 1,否则为 0。这与目标(也是 1-hot)相比较。
这也隐藏了一个事实,即模型可以通过学习忽略罕见的类(0==0)
= 1
来获得非常高的精度。尽管如此,排行榜上的 F2 分数仍然是+0.92。
不幸的是模型没有改进。我想知道重新加载一个模型,然后进一步训练——正如我在这里所做的——是否会有不同于继续训练你已经在工作的模型的结果。我现在没时间测试这个。相反,是时候用最佳工作模式逐步调整大小了。这至少需要一个小时。我真正喜欢人工智能工作的一点是它如何推动你变得有条理。如果你安排好你的工作,为等待时间做好计划,你会有很多空闲时间。
我认为这是这篇文章的一个很好的结束点。接下来将是从 64 码开始逐步调整大小的结果,将 6 周期模型与 7 周期模型以及两倍长度的第 6 周期模型进行比较。之后,就是“在整个数据集上训练最好的一个,看看你得到了什么”。*之后:*用 ResNet50 再做一次,注意看更大的模型是否能更好地处理更大的学习率。
完成所有这些后,实现去模糊器,看看添加 L2 回归是否值得,这将是一件迫在眉睫的事情。我的目标是后天,也就是周一开始使用 xView,所以我们会看看进展如何。
在查看更长或多个周期(这给了我一些不好的结果)之前,或者参考 2017 年的笔记本,我要看看如果我在 LR/2 和 LR/5(这是“正常”模型的最大值)训练 size256 模型会发生什么。
动态规划规划:强化学习
第三部分:解释动态规划、策略评估、策略迭代和价值迭代的概念
在这篇博文中,我将解释如何使用动态编程来评估和寻找最优策略。这一系列的博客文章包含了 David Silver 在强化学习简介中解释的概念总结。
我们现在将使用前面部分中讨论的 MDPs 和 Bellman 方程等概念来确定给定策略有多好,以及如何在马尔可夫决策过程中找到最优策略。
动态规划
动态规划是一种通过将复杂问题分解为子问题来解决复杂问题的方法。子问题的解决方案被组合以解决整体问题。
动态编程的两个必需属性是:
- 最优子结构 :子问题的最优解可以用来解决整体问题。
- 重叠子问题 :子问题多次重复出现。子问题的解决方案可以被缓存和重用
马尔可夫决策过程满足这两个性质:
- 贝尔曼方程给出了递归分解,它告诉我们如何将最优值函数分解成两部分。即一个步骤的最佳行为,然后是剩余步骤的最佳值。
- 价值函数存储并重用解决方案。缓存所有 MDP 的好信息,告诉你从那个状态开始你能得到的最佳回报。
动态规划规划
当有人告诉我们 MDP 的结构(即当我们知道转移结构、奖励结构等)时,动态规划可以用来解决强化学习问题。).因此用动态规划对 规划 中的一个 MDP 进行求解:
- 预测问题 (政策评估):
给定一个 MDPS,一个 P,一个 R,一个γ>和一个策略 π 。求价值函数 v_π (它告诉你在每种状态下你将要得到多少奖励)。也就是说,目标是找出一个政策 π 有多好。**
- 控制问题(找到在 MDP 最好做的事情):
给定 MDP *< S,A,P,R,γ >。*求最优值函数 v_π和最优策略 π。*也就是说,我们的目标是找到能给你带来最大回报的政策,并选择最佳行动。
政策评价
问题 : 评估一个给定的策略 π 和 MDP。(找出一个政策 π 有多好)
解 :贝尔曼期望备份的迭代应用。
方法: 从初始值函数v₁(MDP 中所有状态的一个值)开始。例如以值 0 开始。因此没有奖励。然后用贝尔曼期望方程计算 v₂ ,重复多次,最终收敛到 v_π。
实现这种收敛的一种方法是使用同步备份,其中我们在每一步都考虑所有状态。
- 在每次迭代 k+1 时,对于所有状态 s ∈ S
- 更新 vₖ₊₁(s) 从vₖ(s’),其中*s’*是 s 的继承状态
vₖ(s’) 使用第 2 部分中讨论的贝尔曼期望方程进行更新。
Bellman Expectation Equation
举例: 假设我们有一个有 14 个状态的网格世界,其中每个方块代表一个状态。我们还有 2 个终端状态,一个在网格世界的右下角,另一个在左上角。我们可以采取将向上、向下、向左和向右的动作,我们采取的每一个过渡都会给我们一个 -1 的即时奖励,直到达到一个终止状态。由于折扣因子为 γ=1 ,我们给定的代理策略 π 遵循统一的随机策略:
我们需要计算处于每个状态的值,以确定我们定义的策略 π 有多好。
1.按照我们上面描述的方法,我们可以从初始值函数 v₀开始,所有值都是 0。
v₀
2.接下来,我们通过应用一步前瞻,使用贝尔曼期望方程来计算新的价值函数 v₁。
v₁: Blue block is calculated using the Bellman Expectation Equation such that 0.25(-1+1(0))+0.25(-1+1(0))+0.25(-1+1(0))+0.25(-1+1(0)) = -1
3.重复使用 v₁计算 v₂的过程
v₂: Blue block is calculated using the Bellman Expectation Equation such that 0.25(-1+1(-1))+0.25(-1+1(-1))+0.25(-1+1(-1))+0.25(-1+1(0))=-1.75
4.用 k=∞ 重复这个过程,最终将我们的价值函数收敛到 v_π。
vπ
因此,对于我们的策略 π ,我们计算了 MDP 中每个州的相关值。
如何完善一项政策? 在上面的方法中,我们已经评估了一个给定的策略,但是没有在我们的环境中找到最佳的策略(要采取的行动)。为了改进给定的策略,我们可以评估给定的策略 π 并通过*相对于 v_π贪婪地行动来改进策略。*这可以使用 策略迭代 来完成。
策略迭代
问题 : 为给定的 MDP 寻找最佳策略*【π*】*。
解法 :贝尔曼期望方程政策迭代与行事贪婪。
方法: 以给定策略开始 π
- 使用策略评估来评估策略 π (如上所述)
- 通过 对 v_π 的贪婪 行为来改进 π 的策略,得到新的策略π’。
- 重复直到新策略*π’收敛到最优策略 π 。
为了贪婪地行动,我们使用一步前瞻来确定给予我们最大 行动值函数 (在第 2 部分中描述)的行动:
回想动作值函数有以下等式:
action-value function
值迭代
控制问题的另一种方法是使用贝尔曼最优方程进行数值迭代。首先,我们需要定义如何使用 最优性原则将一个最优策略分成几个部分。
最优性原理 任何 最优策略 都可以细分为使整体行为最优的两个组成部分:
-最优的第一个动作A∫
-随后是后续状态的最优策略 S
定理(最优性原理) A 策略 π(a|s) *从状态 s 达到最优值,*v _π(s)= v∫(s)当且仅当:
- 对于从s*-*-可达的任意状态 s '达到最优值
值迭代(应用)
问题 : 求给定 MDP 的最优策略*【π*】*。
解 :贝尔曼最优备份的迭代应用
方法: 利用同步备份更新价值函数,直到计算出最优价值函数而不计算动作价值函数。
- 在每次迭代 k+1 时,对于所有状态 s ∈ S
- 更新 vₖ₊₁(s) 从vₖ(s’),其中*s’*是 s 的后继状态
vₖ(s’) 使用第 2 部分中讨论的贝尔曼最优方程进行更新:
Bellman Optimality Equation
通过重复上述过程,最终收敛到 v。*注意,该过程不同于策略迭代,因为中间值函数可能不对应于任何策略。
摘要
这篇文章中描述的所有算法都是强化学习中规划问题的解决方案(这里我们给出了 MDP)。这些规划问题(预测和控制)可以使用同步动态规划算法来解决。
预测问题可以用贝尔曼期望方程迭代 ( 政策评估 )来解决。
控制问题可以用贝尔曼期望方程策略迭代&贪婪 ( 策略改进 )或贝尔曼最优方程 ( 值迭代 )来解决。
参考
- 关于 RL 的 UCL 课程——第 3 讲
- 《强化学习导论》,萨顿和巴尔托,1998 年
如果你喜欢这篇文章,并想看到更多,不要忘记关注和/或留下掌声。
为高速公路上的自动驾驶汽车规划路径
用数据做酷事!
Car deciding to make a lane change
路径规划是自动驾驶汽车的大脑。这个模块试图复制我们人类在驾驶时的思维和决策——阅读地图,分析我们的环境(其他车辆和行人),并根据安全、速度和交通规则决定最佳行动。
对于我在 Udacity 自动驾驶汽车工程师 Nanodegree 项目第三学期的第一个项目,我实现了一个高速公路路径规划器,以在模拟的多车道和交通的高速公路上驾驶汽车。见下面的 gif 和视频。模拟器为我们提供汽车和交通的当前位置和速度,然后我们将下一个 x 和 y 位置发送给模拟器,这样它就可以将汽车开到那里。目标是驾驶汽车成功地避免任何碰撞,安全地改变车道,保持低于速度限制,但不要太慢,并尽量减少对乘客的冲击。
你可以在我的 Github repo 上找到完整的代码
Highway Path Planning
这是汽车启动,改变速度和车道,避免碰撞的视频。请注意终端是如何为用户显示所有有用信息的。
路径规划是怎么做的?
第一步:分析传感器融合数据,并对其进行有意义的分类
从模拟器中,我们获得模拟器中其他车辆的数据。这些数据包括汽车 id、汽车位置(x 和 y)、汽车速度(vx 和 vy)、汽车 s(沿车道的距离)和汽车 d(沿车道宽度的距离)…我获取了数据,并将模拟器中的所有汽车分为我自己的车道、我的左车道或我的右车道(如果这些车道存在的话)。然后,我计算出决策所需的重要指标。这些是
- 在我的车道上-到我前面最近的车的距离和最近的车的速度
- 相邻车道-左侧车道前后最近车辆的距离,右侧车道也是如此
我还确保了——如果我在最左边的车道上,那么我设置 violate_left = 1 来确保我不会左转。类似地,如果我在最右边的车道,那么我设置 violate_right = 1。如果我的车道是空的或者任何其他车道是空的,那么最近的车距被设置为 999
第二步:计算决策成本,选择成本最低的行动
我想到了我的汽车在任何情况下都可能做出的 4 个决策:
1.继续在我的车道上以最大速度行驶
2.继续在我的车道上行驶,但是减速到和前面的车差不多的速度
3.换到左侧车道
4.向右转
我决定为所有这些不同的功能分配成本:
成本功能—在我的车道上继续
- 如果我的车道上没有车辆,那么成本= 0(记住,我们希望最小化成本,所以这是最好的结果)
- 如果有交通,但前面最近的汽车>缓冲区(设置为距离差> 50 个单位),则成本= 0
- 如果前面最近的汽车比缓冲器更近(距离差≤ 50 个单位),则可能发生碰撞,因此成本增加到 50
成本函数—变更为左车道/右车道
- 如果我们可以转弯的车道不存在,那么碰撞是可能的,因此成本增加到 500
- 如果车道存在并且可以安全转弯,那么成本= 150(安全转弯定义为最近的汽车前方距离单位为 50,最近的汽车后方距离单位为 12。我通过在模拟器中玩来决定这些数字)
- 如果车道存在,但转弯不安全,则可能发生碰撞。所以成本= 500
- 我补充的一个额外条件是,如果前面最近的车是 200+的距离单位(前面的车道有点空),那么这条车道的成本稍微低一些。我这样做是为了让程序可以选择一条车道,如果两条车道都可以安全转弯的话
代价函数——慢行于我的车道
我设定减速的代价= 200。这样做是为了使这个动作不如变道好,但比碰撞好。
在每个实例中,计算与所有决策相关的成本,并且最优决策是具有最小成本的决策
第 3 步:一旦做出决定,确定该决定的目标速度和车道
为了在模拟器中驾驶汽车,我采用了使用其 d 值(指示沿车道宽度的距离的参数)来决定目标车道的方法。通道 1 的目标差值为 2,通道 2 的目标差值为 6,通道 3 的目标差值为 10。因此,根据决定(留在车道上,或左转或右转),我决定了目标 d 值
来控制模拟器中的速度,我使用了 s 增量(表示沿车道长度的距离的参数)…我发现 s 增量越小,汽车越慢,而 s 增量越大,汽车越快。为了以最大速度驾驶,我选择了 0.415 的 s 增量。当我需要在我的车道上刹车时,我根据我前面汽车的速度减少 s 增量。
步骤 4:创建加加速度最小化轨迹
为了获得平稳的驾驶体验,我们应该将加速度的导数——加加速度最小化。本质上,我们应该有更平滑的加速度增加和减少。我这样做是通过存储 s 和 d 参数的先前值,并在许多时间步长内逐渐改变它们。最后,我用样条拟合地图和目标 s 和 d 来决定 next_x 和 next_y 值。这些被发送到模拟器,汽车移动到这个位置。对参数做了一些调整后,汽车在模拟器中平稳地行驶了。
总的来说,这是一次奇妙的经历!
后续步骤
我的代码大部分时间都在模拟器中工作,但仍有一些改进的机会
- 在程序中包含行为预测。我们可以通过观察他们相对于车道宽度的 d 位置来预测模拟器中其他汽车的计划吗?
这个想法是,如果另一辆车正在接近其当前车道的右侧,那么它很有可能正计划右转。诸如此类。
2.有时我的车在最左边的车道,中间的车道有车辆,转弯不安全,但最右边的车道是空的。一种更好的逻辑是识别出这一点,并执行一系列快速变道,以到达最右边的车道,而不是在当前车道减速。本质上,该逻辑当前在做出决定时仅查看紧邻的通道
3.我希望有更好的方法来设计加加速度最小化的轨迹,使用讲座中建议的一些数学方法
给我一个❤️,如果你喜欢这个职位:)希望你拉代码,并尝试自己。
其他著述:【https://medium.com/@priya.dwivedi/】T2
PS:我住在多伦多,我希望将职业生涯转向深度学习。如果你喜欢我的帖子,并能把我联系到任何人,我将不胜感激:)。我的电子邮件是 priya.toronto3@gmail.com
参考文献:
乌达城无人驾驶汽车纳米学位——我感谢乌达城、巴斯蒂安·特龙、大卫·西尔弗和其他参与开发这门课程的人给我机会成为他们新的无人驾驶汽车项目的一部分。这是一次非常有趣的旅程。这里的图片和视频参考在课堂上被分享了
植物人工智能—部署深度学习模型
所以在我的上一篇中,我谈到了我是如何构建植物 AI 的——一个使用卷积神经网络的植物病害检测模型。最后,我们有了一个模型,将在本文中部署。工厂 AI 的代码可以在这里找到,输出这里找到。
但是一个不能用的模型有什么好?因此,在这篇文章中,我将讲述我是如何通过 API 将这个模型部署到 Android 应用程序中的。
为了通过 API 部署我们训练好的模型,我们将做一些类似于下面的事情:
- 加载我们的训练模型
- 接受传入数据并对其进行预处理
- 使用我们加载的模型进行预测
- 处理预测输出。
我们可以在生产中以多种方式使用我们的模型,例如:
- 将它直接加载到我们的应用程序中:这里我们假设您的模型可以与其他应用程序文件一起保存。这允许我们直接加载模型。我们可以通过简单的编写来加载我们的模型
model _ file = pickle . load(open(" CNN _ model . pkl ",’ rb '))
或者 model _ file = load _ model(’ my _ model . H5 ')
- 通过 API 使模型可用。这就是我为植物人工智能所做的。有许多方法可以让我们通过 API 获得一个模型。其中一些包括:
用 Django 或 Flask 定制 REST-API:在这种情况下,我们用 Flask 的 Django 之一构建一个定制 REST-API。这样,我们必须使我们的模型在我们的项目文件夹中可用,如上所述,加载它并执行预测,然后将结果作为 JSON 响应发送回来。
Tensorflow :我们也可以使用 Tensorflow 部署我们的机器学习模型,使用 Tensorflow 服务。Tensorflow Serving 是为将机器学习模型部署到生产中而开发的,因此它包含用于与 Tensorflow 模型或任何其他模型集成的开箱即用工具。你可以看看这篇关于如何用 Tensorflow 机器学习模型的文章。
AWS Lambda/无服务器:这涉及到使用 AWS Lambda 使你的深度学习模型可用。你可以查看 AWS 文档关于用 Tensorflow 部署深度学习模型的帮助。
另一个选择是利用 Kubernetes 来部署你的模型。你可以查阅 Kubernetes 文档或这篇中型文章来获得如何使用 Kubernetes、Docker 和 Flask 部署深度学习模型的指导
我用 Django — Python Web 框架开发了 Plant AI 的 API。无论您决定使用哪种 Python 框架,过程都应该是相同的。
- 首先确保您已经安装了这些软件包
Django :一个 python web 框架。使用 Flask 或者你选择的任何其他 Python web 框架都没问题。
Django-Heroku(仅当您将在 Heroku 上托管您的应用时需要)
Django-rest framework**😗*构建 web APIs 的强大工具。
guni corn:是一个用于 UNIX 的 WSGI HTTP 服务器。
Numpy:Python 编程语言的库,增加了对大型多维数组和矩阵的支持,以及对这些数组进行操作的大量高级数学函数。(来源:维基百科)
Keras : Keras 是用 Python 编写的开源神经网络库。它能够在 TensorFlow、微软认知工具包或 Theano 上运行。旨在实现深度神经网络的快速实验,它专注于用户友好、模块化和可扩展。(来源:维基百科)
Sklearn :一款免费软件 机器学习 库为 Python 编程语言。它具有各种分类、回归和聚类算法,包括支持向量机、随机森林、梯度推进、、 k -means 和 DBSCAN ,旨在与 Python 数值和科学库 NumPy 和互操作(来源:维基百科)
Django-cors-headers:一款 Django App,为响应添加 CORS(跨源资源共享)头。
- 设置您的 Django 项目。
- 接下来,确保您的模型在项目文件的一个文件夹中。你可以在这里下载植物 AI 的模型
- 下面是我的代码的样子
像往常一样,在线 1–7上,我导入了所需的必要包。
在的第 33 行**,我将通过 API 端点发送的数据(base64 中患病植物的图像)保存在 request_data 中。然后在第 34 行我分割数据,只得到图像。然后使用下面的 convert_image 函数将图像转换成一个数组。该函数将返回一个图像数组,或者不返回任何图像数组,如果有错误消息,则返回一条错误消息。**
在下面的第 38 行,我使用 Pickle 加载了生成的模型。然后在第 39 行,我将图像数组传递给模型。这将返回一个二进制化的标签。在我们的项目中加载的标签二进制化器的帮助下,我能够将模型预测转换成任何可用的标签(在这种情况下是各种植物疾病)。
****第 41–43 行包含一个 Python 字典,该字典包含该 API 将要传递的输出。在第 60 行上,这个 dict 作为 JSON 响应被发送回来。是的,就是这样!!!
使用 Postman 测试我的 API,在大约 47312.525 毫秒(47.3 秒)内给出了我想要的结果。
这个项目可以在 Github 这里获得。感谢阅读。
柏拉图、亚里士多德和机器学习
雅典学院是世界上最著名的壁画之一。这是一幅描绘古典时代伟大哲学家的文艺复兴杰作,由拉斐尔于 1509-1511 年间创作。
The School of Athens, Fresco by Raphael, 1509–11.
虽然这幅壁画中有很多值得讨论的地方,但我想请大家注意其中的两个中心人物:指向天空的柏拉图和指向大地的他的学生亚里士多德。
Plato (left) and Aristotle (right)
拉斐尔为什么要这样描绘他们?
柏拉图认为我们生活的这个世界,物质世界,只是理想世界的一个影子。例如,我们在这个世界上看到的苹果是理想世界中完美苹果的不完美反映。柏拉图称这些完美或理想的事物为它们的形式,因此有了他的形式理论。形式论不限于对象,我们还可以谈教育的形式,友谊的形式等等。然而,亚里士多德反对他的老师,声称物质世界是真实的。他认为形式存在于正在讨论的事物内部,存在于物质世界中。如果没有苹果,就没有苹果身份。他们都相信形式,但不同意它们是否存在于另一个世界(柏拉图)或这个世界(亚里士多德)。
现在你可能会猜到拉斐尔想要传达的信息,柏拉图指出天空是因为他相信形体在另一个世界,相反亚里士多德指出地球说形体实际上可以在物质世界中找到。
这个讨论属于形而上学中的共相问题的范畴。共性是两个或两个以上的实体所共有的东西(例如,根据柏拉图,是一只猫或理想的猫),一个共性有称为细节的实例。加菲猫是一只特别的猫。他有所有猫共有的属性,像试图适应一个盒子,以及其他属性,不是每只猫都有,如懒惰,愤世嫉俗和橙色。哲学家讨论共相是否真的存在,如果真的存在,它们存在于何处。
但是这一切和机器学习有什么关系呢?在回答这个问题之前,我将尝试从数据、信号和噪声方面解释什么是机器学习。让我们首先澄清这些术语:
数据:您观察或测量的值。
**信号:**观察或测量的期望值。
**噪声:**导致期望值和观察值不同的缺陷。
基于这些定义,我们可以说数据=信号+噪声。让我试着用一个具体的例子来解释这个概念。
你如何绘制一个 m = 2 kg 的物体的力(N)与加速度(m/s)的关系曲线?理想情况下,它应该遵循牛顿第二定律,F = ma。然而,在我们生活的世界中,我们知道事情并不完美。因此,观察到的行为将类似于 F = ma +噪声。下面您可以看到这些图以及用于生成这些图的代码:
m=2 #mass of the object
a=10*np.random.rand(50,1) #50 random acceleration values
F_ideal=m*a #Ideal F
F_observed=m*a+np.random.randn(50,1) #Observed F
Ideal vs. Observed behavior
Data = Signal + Noise
本质上,机器学习算法试图学习数据内部的信号。需要强调的是,给了这些算法数据,但它们不知道数据的哪一部分是信号,哪一部分是噪声。
例如,让我们对上面生成的数据应用线性回归。可以看到拟合度几乎等于信号。机器学习算法不知道我用来生成这些数据的信号,但它能够找到一个非常接近的近似值。
import sklearn
from sklearn import linear_model
model = linear_model.LinearRegression()
model.fit(a, F_observed)
Fit tries to find the signal
现在,我们可以看到机器学习和共性问题之间的对应关系。
**机器学习:**数据=信号+噪声
**共相问题:**我们所见=共相+特殊性质
假设您的朋友要求您构建一个孟加拉猫分类器。您收集孟加拉猫图像(数据),并为此任务训练卷积神经网络(CNN)。该算法查看数据,将信号(通用孟加拉猫)与噪声(特定事物,例如一只猫有伤疤,在另一幅图像中背景处有一棵树等)分开。)因此学会了一只理想的孟加拉猫应该是什么样子。该算法将学习到的内容存储为称为“权重”的参数。换句话说,训练后的 CNN 的权重对应于通用的孟加拉猫——信号。
Blueprint of a Bengal cat (the ideal Bengal cat), is captured by the weights of a CNN. Edges are captured by the first layer, the second layer learns the contours, the third layer learns the eyes, ears, and the tail. Source
这篇文章的关键是,机器学习算法的目标是学习数据中的共性(也称为形式或信号)。希望这能帮助你从不同的角度看待机器学习中的一些概念,并更容易掌握它们。
你可以在推特 @malicannoyan 上找到我。
数据的魔力|泰坦尼克号生存预测
在我以前的文章中,我们讨论了数据特征以及与之相关的常见问题和挑战,还简要讨论了应该遵循什么方法来处理它。
这些文章从总体上给出了一些关于数据清理过程的想法,让我们尝试一下对真实数据集的理解。为了让事情变得简单有趣,我选择了 Kaggle 下的 泰坦尼克号:机器从灾难中学习竞赛 下的泰坦尼克号生存数据集。
在这个挑战中,我们需要使用 ML 技术来分析人们的生存状况。我将在这个实验中使用 iPython Jupyter 笔记本,人们可以根据自己的舒适度选择使用 R 或其他。
我们先来了解一下可用于预测的目标和数据集。我建议大家阅读下面快照中提到的数据定义或者直接从 Kaggle 页面 中获取。
简而言之,我们有两个数据集,一个用于训练,一个用于测试。 数据集中的生存属性是目标属性。 生存归因在训练数据集中可用,但在测试中不可用,因为我们需要预测同样的结果。最后,我们需要得出一个结果集,其中给定一个来自测试集的 PassengerId,我们应该有生存预测。**
加载训练数据
Loading Training Data
Training Data Set
数据集由 12 个混合了定性(分类)和定量(数字)的属性组成。
定性属性: PassengerId,幸存,Pclass,性别,车票,客舱&上船。
数量属性: SlibSp,Parch &车费。
加载测试数据
这只是为了对测试数据集有个大概的了解。 我们可以观察到,它没有目标属性。
Loading Test Data Set
结果集
Result Set (Need to be produced)
特色工程
让我们检查缺失值上下文中的所有属性。
**
很明显,年龄、船舱和船只是我们唯一缺少价值的属性。
让我们逐一检查每个属性,看看它对训练数据的影响。
PassengerId 是一个名义属性,这意味着如果我们重新分配所有乘客 Id,对数据集没有任何影响,因此我们现在可以忽略它。
幸存下来的是目标属性。
Pclass 是数字属性,它没有任何缺失值,让我们检查它对目标属性的影响。
这里我们取了平均值,这个数据代表 Pclass=1 存活率是 62.96%。
性别属性是值为男性或女性的分类属性,没有缺失值。
雌性更安全 ,雌性存活率比雄性多。
SibSp 是代表兄弟姐妹/配偶的数值属性。
Parch 也是代表孩子/父母的数值属性。
家庭规模
基于 SibSp & Parch 的影响,让我们创建一个名为“家庭规模”的新属性。
这似乎对我们的预测有很好的影响,让我们看看独自在这艘船上会有什么影响。
艾索隆
至少有时独处是好的:)
着手进行
已装载的属性缺少值,填充该属性的最佳方式是使用最常出现的值。在该数据集中,已装载属性最常出现值是’ S’。
Fare 是一个数字属性,它也有缺失值。对于票价,用中位数填充缺失值将是比平均值更好的选择。它是一个数值属性,因此我们需要将其转换为分类属性,以便为我们将要使用的 ML 算法做好准备。在这里,我们将票价分为 4 类。
年龄也是一个数字属性,并且有缺失值。填充年龄属性中缺失的值是一件棘手的事情。我们正在生成(平均值 — std)和(平均值 + std)之间的随机数,并对其进行填充。我们把年龄分成 5 个范围。
***Name,*我首先想到的是忽略 Name 属性,但是如果仔细观察,就会发现 names 有可能对目标属性产生影响的标题。让我们交叉检查相同的。
到目前为止,我们已经研究了所有的属性,引入了一些新的属性,并填充了缺失的值。现在是准备数据并为 ML 算法做好准备的时候了。
数据清理
在我们当前的数据集中,我们很少有非数字的属性/特征。这是将它们转换成数值的时候了。
- 性别属性有值(女性/男性),我们分别将其映射到 0/1。
- 标题新生成的属性被映射到 1/2/3/4/5 值,缺少的值用 0 填充。
- 基于站台上车,已上车属性被映射到 0/1/2。
- 四个票价类别映射到四个分类值(0/1/2/3)
- 五个年龄类别映射到五个分类值(0/1/2/3/4)
- 删除预测不需要的属性,如乘客 Id、姓名、机票、舱位、SibSp、Parch 等。
下面是结果,现在数据看起来干净。
应用分类器
人们可以对这些数据应用多分类器,在本练习中,我将使用scikit learn内置库。以下是我现在想到的分类器列表。
- 邻居分类器(3)
- SVC(概率=真)
- 决策树分类器()
- RandomForestClassifier()
- AdaBoostClassifier()
- GradientBoostingClassifier()
- 高斯安 b()
- 线性判别分析()
- QuadraticDiscriminantAnalysis()
- 物流回归()
让我们从 KNeighborsClassifier 开始,并检查其准确性以供参考,我们将使用分层洗牌分裂交叉验证器来分裂训练和测试数据。
KNN Accuracy on Titanic Data Set
拥有 scikit 使所有的工作变得简单,您可以通过编写 3-4 行代码来应用大多数分类器。类似地,我们可以应用分类器列表并比较不同模型的准确性,请查看我的笔记本此处查看 titanic 数据集上分类器列表的完整代码。结果表明,在下表提到的分类器中,SVM 是该数据的最佳分类器。
魔法:预言
现在我们已经准备好了模型,是变魔术的时候了。我们可以使用 SVM 分类器,并通过编写下面的代码来预测测试数据集的存活。
Scikit 你真棒!
由于我们有预测结果,我们可以将其加载到数据框中,并生成所需的输出格式。
C 如果你在这个练习中观察,我们大部分时间花在分析和清理数据上。一旦数据准备好了,就很容易使用不同的分类器,因为市场上有标准的库,一个很好的例子就是 scikit 。
感谢您的阅读,请在评论中分享您的想法、反馈和想法。你也可以通过推特上的@ simplykk87 和 linkedin 联系我。
R 参考文献
使用泰坦尼克号的数据:灾难中的机器学习
www.kaggle.com](https://www.kaggle.com/borntomine/titanic-survival-prediction/notebook)*
操场地球
Ep。2:使用分类数据挖掘对活动进行分类
Part of our output today; Network chart visualizing the co-occurrences between our categorical data
你同样喜欢瀑布、海滩、博物馆、食物、山脉、自然、游乐园、水族馆和城市地标还是你对假期有一些偏好?或许你知道。然而,在第一集中,我们客观地将世界上排名第一和第二的活动设定为瀑布…但是如果你不喜欢瀑布呢?你可能已经完成了这篇文章,并且完全不同意我们得出的任何结论。
为了管理我们的主观偏好,我们将需要我们的算法能够按照用户的期望处理类别的有限子集 的输入。由于活动的描述有很多种,我们今天的主要目标是将所有这些种类归纳为“核心”活动的子集。例如上面描述的那些。
很好,听起来我们今天要深入文本分类数据挖掘了!
我们的方法
- 首先,我们必须将来自源数据的类别之间的关系创建到一个 共现矩阵中。 这将帮助我们建立最常提到的活动。
- 将 这个矩阵可视化成一个 网络图 并检索每一个共现组合的权重。
- 通过查看最高加权类别和(如果需要)人工干预,检索根类别子集
- 转换为父子层次 并为每个存在的子类别派生父根类别。从每个孩子开始,每次都是到它的最大权重的父母,直到我们到达一个根类别变量。
数据
对于今天的练习,我们可以完全依靠在第 1 集中已经准备好的数据。来自猫途鹰和谷歌的数据都包括每个活动的一个或多个分类值。这些组合成一个列表,构成我们每个活动的总类别集。
此时,没有必要从其他外部数据源进一步丰富这些数据,我们完全可以从第 1 集停止的地方开始。
概括我们的类别
Fabrica La Aurora, San Miguel de Allende, Mexico — image source http://fabricalaaurora.com
让我们从一个为什么我们的分类数据需要一般化的例子开始:墨西哥圣米格尔德阿连德的 Fabrica La Aurora。从网站上的图片(如上)和信息来看,这是一个很棒的艺术中心,由多个画廊、一些购买艺术相关物品的商店以及一些吃喝场所组成。听起来像是我假期绝对想去的地方,但它在我们的数据中属于哪一类呢:
美术馆;美术馆;咖啡馆;珠宝店;家具店;家居用品店;存储;餐厅;食物;
这些是许多不同的类别,许多重叠的类别(即艺术画廊与艺术画廊),而且类别太广泛,不足以作为我们算法的输入过滤器。而且还有泛化的需要!
在我们 7,044 项活动中,共有 235 个不同类别的 14,806 次提及。这意味着平均每个活动有 2.1 个不同的类别。有了这些数字,我们也可以非常有把握地假设这 235 个类别的多种组合将在多个活动中同时出现(即最有可能的是美术馆将经常与美术馆同时出现)
为了探索当前类别之间的关系,我们将使用一种业余爱好者的方法来研究网络理论。最终目标是导出根值(最常发生的活动)和它们与较少发生的活动的链接(将它们作为叶子映射到它们的根)。
为此,我们首先需要创建一个共生矩阵。顾名思义,这意味着我们为 235 个类别中的两个类别的所有可能组合创建一个出现次数矩阵。
这种共现矩阵在网络图中最直观,该图将显示我们的类别之间的联系,还将显示最常见的共现活动和联系:
Fig. 1 Network chart of all our activities’ mentioned categories; Created with Gephi
从这张图表中,我们可以立即看到一些最常出现的关键类别:食物、公园、博物馆、商店、餐馆、历史遗迹、自然景观等等。
还有一些联系相当清楚:‘礼拜场所’显然与’教堂’、清真寺’、'印度教寺庙、神圣的&宗教场所’联系在一起,但也与’建筑’联系在一起;而’商店’、餐厅’、咖啡馆’、酒吧’和’美食’也经常齐头并进。
目标是定义一个可管理的根类别子集,通过这些共现,所有其他类别都可以与之相关联。
Fig. 2 Root categories
为了建立这些初始根类别,我们将使用图表后面返回的相关表,该表包括每个可能的类别组合的出现权重。
查看每个活动聚集的权重值的分布,我们将从筛选权重> 200 的类别开始。这将把我们带到图 2 左侧显示的根活动。
我们将这些类别中的每一个都映射到一个友好的名称,这个名称为我们提供了 12 个不同的类别,我们现在将这些类别视为我们的根类别子集,以进行进一步的分析。
下一步是为上面列表中的而不是的所有 235 个类别导出相关的根类别。为此,我们可以构建一个父子层次结构,并基于权重遍历所有类别,直到我们到达第一个根值。
换句话说,让我们寻找不在上面列表中的每个类别,根据权重它与哪个类别最同时出现,如果该活动不在根中,我们将再次寻找它最同时出现的类别,并且继续,直到我们找到在根中的类别。
下面的例子将告诉你这是如何工作的。在这种情况下,我们希望找到类别“露营地”的根类别。结果是’朴’(注意,当应用相等的权重时,以字母顺序为准):
Fig. 3 relation tree for category ‘Campground’ ending into root category ‘Park’
将这个转换应用到每一个类别,将会为每一个活动提供一个(或者多个)根类别。
所以回到 Fabrica la Aurora 为例;最初,我们看到谷歌/猫途鹰联合推出了以下类别:
美术馆;美术馆;咖啡馆;珠宝店;家具店;家居用品店;存储;餐厅;食物;
上述实施转换的结果分别概括为以下根类别:
博物馆和画廊;博物馆和画廊;食物和饮料;购物;购物;购物;购物;食物和饮料;食物和饮料;
或者说,应用唯一性的时候:博物馆&画廊,购物和美食&饮品。还不错!这意味着,只要上述三个类别中的*任何一个(或全部)*作为输入给出,该活动就会包含在算法的输出中。
在这一步之后,让我们为这些自动派生的根活动中的每一个补充将被过滤的活动数量的平衡:
Fig. 4 number of activities per root category, produced with Seaborn
手动干涉
这种做法显然不防水,所以这里我想手动干预一些类别。让我们更详细地看看四个主要类别和’其他’类别(我们希望尽可能小)的子类别。
Fig. 5 Overview of all remaining categories to be mapped
在左边我们看到这些子类别;我想手动修改的,我在这里突出显示了。
首先,让我们将“海滩”和“山脉”从“自然”中分离出来,分别放入新的根类别中。尽管这种分配可以被认为是准确的(对自然而言),但它们是假日如此重要的特征,以至于它们本身应该是根类别。
第二,我们看到一些错误分配的类别,这些类别可以归为一个新的类别’地标,包含子类别:‘名胜古迹&地标’,‘建筑’,‘城堡’和’古迹&雕像’
最后,在’ other ‘中的子类别’ neighborhood '具有足够的权重来单独作为一个类别而不是其他类别。所以我们也将单独映射它。
做了这些调整后,我们最终得到了 16 个最终根类别,并由此产生了以下数量的与之相关的活动:
Fig. 6 final number of activities per root category, produced with Seaborn
因此,从我们的 235 个不同的类别中,我们成功地将它们归纳为 16 个不同的类别。我们只需手动干预这 235 项活动中的 7 项!我对结果很满意,让我们的最终算法能够轻松地过滤输入类别中的旅游活动。
把我们的分数加进去
现在我们有了我们的活动,我们可以回到我们在第 1 集中创建的评分标准,并将两者结合起来。我们已经了解了按地区、国家和个人活动划分的加权平均分,现在让我们来看看哪些是评分最高的类别:
Fig. 7 score per category barplot produced with Seaborn
山脉绝对是我们最喜欢的(我个人非常同意)。紧随其后的是稍远处的水体、历史遗迹和自然景观。
由于图片胜过千言万语,让我们来看看每个类别中的前 3 项活动:
Top 3 mountains: #1 Table Mountain, Capetown, South Africa | #2 Serra de Tramuntara, Mallorca, Spain | #3 Aguille du Midi, Chamonix, France
Top 3 bodies of water: #1 Jokulsarlon Lagoon, Iceland | #2 Lagunas Miscanti y Miniques, San Pedro de Atacama, Chile | #3 Moraine Lake, Lake Louise, Canada
Top 3 historic sites: #1 Jerusalem Old City, Jerusalem, Israel | #2 Angkor Wat, Siem Reap, Cambodia | #3 St. Peter’s Basilica, Vatican City, Italy
Top 3 nature: #1 Niagara Falls, Canada | #2 Iguazu Falls, Foz do Iguacu, Brazil | #3 Table Mountain, Capetown, South Africa (yes, again)
嗯,我刚刚用这些发现更新了我的遗愿清单!
乍一看,对我们的概括结果的准确性感到非常惊喜。以及就地区和大陆而言,顶级类别中的巨大多样性。
结论
今天,我们已经成功地利用网络理论的基本形式,将我们所有的 235 个不同类别归纳为 16 个。为了以简化的方式过滤活动,同时仍然能够让算法只选择相关的活动,这是非常重要的。
下一篇文章,我们将关注聚集我们在实际度假目的地的活动!
要进一步了解,请查看下面的热图,比较每个地区的最佳得分活动:
Fig. 8 Heat map produced with Seaborn in Python
关于我自己的更多信息,请随时查看我的 LinkedIn
用 6 个神经元玩雅达利|开源代码
#2 研究论文讲解
这篇论文为机器学习社区打开的大门是惊人的。这个微小的网络实际上玩的是 Atari 游戏,只有 6 个神经元相当,偶尔还会更胜一筹,让以前的网络看起来像笑话。最棒的是,代码在 GitHub 上是开源的,每个人都可以玩。所以,让我们开始吧…
怎么可能!!!
我们已经知道,玩 atari 游戏的深度强化学习网络基本上是一个密集的深度神经网络既有又有的职责,通过将像素映射到中间表示(也称为特征提取)内部学习从图像中提取特征,允许最后(少数)层将这些表示映射到动作和策略或决策。
因此,两者是同时学习的,这使得分开研究政策几乎是不可能的。
因此,仅仅通过将表示学习部分从策略学习部分中分离出来,就可以使网络免于构建中间表示,从而使其能够专注于策略逼近,该策略逼近是根据通过交互获得的观察结果在线训练的。
本文有助于在复杂 RL 设置中同时学习功能而分别学习功能。
这使得一个较小的政策网络更具竞争力,并以更复杂的方式解决问题。
我们可以通过将它们分成两个不同的网络来更好地控制学习。
学习特征提取
本文采用了两种新的方法来训练网络:基于矢量量化的方法称为增加字典(VQ) 和基于稀疏编码的方法称为直接残差 SC 。
让我们看一些命令行程序来快速理解基本概念,然后我会在文章的后面解释新的东西。
矢量量化是一种神经网络算法,用于通过使用称为字典的矢量列表来学习二元或多元分类。
**注:**我鼓励你进一步学习 矢量量化 和 稀疏编码 以便更好的理解。
学习决策政策
使用能够应对维度增长的专门版本的指数自然进化策略来训练策略。
让我们建立系统💻
现在让我们了解一下他们是如何实现这篇论文的。我们的系统可以编码成 4 的简单步骤:
1.环境👾
该系统建立在 Atari 2600 的 OpenAI 框架上,具有原始控制台的所有限制。观测值由一个[210×180×3]张量组成,代表屏幕输入的 RBG 像素。
网络的输出被解释为 18 个离散动作中的一个,代表来自操纵杆的潜在输入。跳帧次数固定为 5。
2.压缩机💼
你也可以称之为预处理器。
压缩器是一个神经网络,当与环境交互时,它以一种在线方式从观察中提取低维代码。
为了获得在线学习的最佳性能,本文采用了两种新的方法,并将它们结合在一起。
增加字典矢量量化
这个版本的 VQ 增加了字典的大小,不像矢量量化有固定的字典大小。
字典大小的增长由阈值δ调节,指示被认为是有意义的增加的最小聚集残差。
直接残差稀疏编码
基于字典的算法的性能更多地取决于编码而不是字典训练。因此,为了提高 IDVQ 的性能,使用了直接剩余 SC。详细解释请点击此处。
3.控制器🎮
所有实验的控制器都是单层全连接递归神经网络(RNN)。
每个神经元通过加权连接接收以下输入:网络的输入、来自先前激活的所有神经元的输出(最初为零)和恒定偏置(总是设置为 1)。
输入的数量在任何给定的时间点都等于来自压缩机变化输出的代码的大小。
在输出层中的神经元数量保持等于每个游戏的动作,如 ALE 模拟器所定义的。这在一些游戏中低至 6,最多 18。
4.【计算机】优化程序🚀
优化器是我们的学习算法,随着时间的推移提高网络的性能,在这种情况下,一种称为…
指数自然进化策略💁论文
自然进化策略是一个进化算法家族,它控制着个体的显式种群参数。
结果
下面给出了在 OpenAI 的 ALE 框架上,从数百个可用游戏中选出的 10 个 Atari 游戏的比较结果。
他们将他们的工作与最近的两篇论文进行了比较,这两篇论文提供了 Atari 游戏的广泛结果。
RESULTS
结论
我们提出了一种在强化学习任务(如 Atari 游戏)中学习视觉控制有效策略的方法,该方法使用比通常用于这些问题的深度神经网络小两个数量级的微小神经网络。
这是通过将策略学习与特征构建分离来实现的。
特征构造是在网络外部通过一种被称为递增字典矢量量化的新颖且有效的矢量量化算法来执行的,该算法是根据网络与环境的交互所获得的观测值来在线(即沿着网络)训练的。
如果你喜欢拍拍和与社区分享这个的解释。关注我的 Medium 和 Twitter 以获取更多# 研究论文解释通知…
如果你对这篇论文有任何疑问,或者想让我解释你最喜欢的论文,请在下面评论。
你会喜欢的以前的故事:
2018 年 6 月发布的研究论文解释
hackernoon.com](https://hackernoon.com/deepminds-amazing-mix-match-rl-techique-a6f8ce6ac0b4) [## 纪元与批量大小与迭代次数
了解您的代码…
towardsdatascience.com](/epoch-vs-iterations-vs-batch-size-4dfb9c7ce9c9) [## 50 tensor flow . js API 5 分钟讲解| TensorFlow.js Cheetsheet
TensorFlow API Cheetsheet
towardsdatascience.com](/50-tensorflow-js-api-explained-in-5-minutes-tensorflow-js-cheetsheet-4f8c7f9cc8b2) [## 激活函数:神经网络
Sigmoid,tanh,Softmax,ReLU,Leaky ReLU 解释!!!
towardsdatascience.com](/activation-functions-neural-networks-1cbd9f8d91d6) [## 手机上的 TensorFlow:教程
在 Android 和 iOS 上
towardsdatascience.com](/tensorflow-on-mobile-tutorial-1-744703297267)
华盛顿特区自行车共享需求的预言家游戏(上)
更新:此处 勾选本文第二部分 。
最近,我发现脸书发布了一个名为 Prophet 的时间序列预测工具。它对 R 和 Python 都可用。
Prophet 是一个用 R 和 Python 实现的预测程序。它速度很快,并提供完全自动化的预测…
facebookincubator.github.io](https://facebookincubator.github.io/prophet/)
根据官方网站:
“它(Prophet)基于一个加法模型,非线性趋势与每年和每周的季节性以及假期相适应。它最适用于具有至少一年历史数据的每日周期数据。Prophet 对缺失数据、趋势变化和较大的异常值具有稳健性。”
我想尝试一下这个新包,并决定使用两年前在华盛顿特区举行的与预测自行车共享需求相关的 Kaggle 比赛的数据集
这个项目的所有代码都可以在这个 repo 中获得。
数据
数据集包含几个特征,包括:
- 日期-时间
- 假日(作为一个二元变量,表示该日是否被视为假日)
- 天气状况(一个有 4 类的分类变量)
- 温度
- 湿度
- 风速
- 自行车租赁总数
该数据集提供了跨越两年(2011 年和 2012 年)的每小时租金数据。对于比赛来说,训练集由每月的前 19 天组成,而测试集则是每月的第 20 天到月底。目标是仅使用租赁期之前的可用信息,预测测试集覆盖的每小时租赁的自行车总数。
因为数据来自一场比赛,测试集不包含租赁自行车的总数,所以对于这个实验,它不能用于评估模型的性能。另一个问题是,Prophet 最适合每日周期数据,所以我必须将数据从每小时转换为每天。
从上面的特性中,我们感兴趣的是日期时间、假期和自行车租赁的总数。
设置
我用的是 r 的 Prophet 包。文档写得很好,提供了几个学习如何使用 Prophet 的例子。据此,有几个易于解释的参数,允许用户改进或调整预测。虽然默认的参数值可以很好地开始工作,但是我想使用非穷举的网格搜索来确定最佳的参数值。
首先,我决定将竞赛网站提供的训练集分成三部分:2011 年全年用于模型拟合,2012 年上半年作为参数调优的验证集,2012 年下半年作为检验所选模型性能的测试集。虽然我们没有整个月的数据,但这似乎不是 Prophet 软件包的问题,因为它对丢失的数据很健壮。
假日特性是一个二元变量,它只告诉我们日期是否是假日,但不提供它所指的是哪个假日的信息。我不得不做一些研究来确定这些日期,因为 Prophet 使用这些信息来正确地确定特定节日的贡献(这是非常有用的)。我使用了这个网站,它包含了美国联邦假日的详细信息。
最后,需要一些调整的参数与我们希望给予模型的灵活性有关,以适应变化点、季节性和节假日。进行非详尽的网格搜索只是为了对参数的最佳值有一个模糊的概念。如果用户对手头的任务有一些专业知识,可以跳过这一步。
模型
使用平均绝对误差(MAE)作为性能度量来执行网格搜索,以识别最佳参数。
找到的最佳参数是:
- 运载能力:8000 人
- 改变点先验比例:0.5
- 季节性先验标度:10
- 假日优先比例:1
然后,在训练集和验证集上使用这些参数重新训练该模型。
确定的最佳模型的建模和预测自行车共享需求时间序列如下所示。可见大势已被捕捉。
Modeled and predicted bike sharing demand time series using the Prophet package.
此外,Prophet 还提供了绘制时间序列中不同部分的功能。这些显示如下,可以观察到一些有趣的事情。首先,似乎有些节日会增加租赁数量(如独立日-7 月 4 日),而其他节日则会减少(如元旦)。第二,租金记录较少的一天是星期三。此外,随着周末的临近,租金往往会上涨,周六达到最高。最后,一年中,夏季月份的租赁次数往往高于冬季月份。
Time series components identified using the Prophet package.
最后,剩下的唯一事情是在测试集上观察模型的性能。下面显示了用于绘制它的代码。总的来说,我们可以说这个模型在预测方面做得很好。
Modeled and predicted bike sharing demand time series using the Prophet package. The black points correspond to the training set, the green ones to the validation set, and the red ones to the testing set.
评论
经过训练的最终模型似乎能够很好地捕捉总体趋势。我对 Prophet 软件包的易用性和用户可获得的灵活性印象深刻。
这只是一个小项目,有几件事可以考虑改进它:
- 使用原始的每小时数据集,而不是每天数据集。
- 将其余特征(天气和环境变量)纳入模型。这可以提供额外的信息,用于做出更好的预测。
- 纳入 NARX 建模方法,以包括外生变量。
- 为参数调整执行贝叶斯优化。
- 为正确的模型选择执行模拟历史预测。
更新:查看本文第 2 部分 此处 。
在 python 中处理时间序列数据
时间序列是日常生活中最常见的数据类型之一。股票价格、销售额、气候数据、能源使用量甚至个人体重都是可以定期收集的数据示例。几乎每个数据科学家都会在工作中遇到时间序列,能够有效地处理这些数据是数据科学工具箱中的一项重要技能。
这篇文章是开始使用 python 处理时间序列的快速介绍。这包括时间序列的小定义和一些数据操作,使用熊猫访问伦敦家庭的智能电表能耗数据。这篇文章中使用的数据可以在这里检索。我在我认为有用的地方添加了代码。
让我们从基础知识开始,时间序列的定义:
*时间序列是按时间顺序索引、列出或绘制的数据点的集合。*最常见的是,时间序列是在连续的等间隔时间点获取的序列。因此它是一个离散时间数据序列。
时间序列数据是围绕相对确定的时间戳组织的;因此,与随机样本相比,可能包含我们试图提取的额外信息。
装载和处理时间序列
数据集
举个例子,让我们用 2011 年 11 月至 2014 年 2 月间参与英国电力网络领导的低碳伦敦项目的伦敦家庭为样本,使用一些以千瓦时(每半小时)为单位的能耗数据。我们可以从制作一些探索性的图开始,最好是了解结构和范围,这也将使我们能够寻找最终需要纠正的缺失值。
在这篇文章的剩余部分,我们将只关注日期时间和千瓦时列。
重采样
让我们从简单的重采样技术开始。重采样包括更改时间序列观测的频率。您可能对时间序列数据的重采样感兴趣的一个原因是要素工程。事实上,它可以用来为监督学习模型的学习问题提供额外的结构或洞察力。pandas 中的重采样方法与其 groupby 方法类似,因为本质上是按特定的时间跨度进行分组。然后,您可以指定重新采样的方法。让我们通过看一些例子来使重采样更加具体。我们将从每周总结开始:
- data.resample()将用于对数据帧的 kWh 列进行重新采样
- “W”表示我们希望按周重新取样。
- sum()用于表示我们需要这段时间内的总千瓦时。
对于每日摘要,我们可以做同样的事情,对于每小时摘要,我们可以使用 groupby 和 mean 函数:
为了进一步进行重采样,pandas 提供了许多内置选项,您甚至可以定义自己的方法。以下两个表分别显示了表周期选项和一些可用于重采样的常用方法。
附加探索
以下是您可以利用这些数据进行的一些探索:
用先知造型
脸书 Prophet 于 2017 年发布,可用于 Python 和 r。Prophet 旨在通过显示不同时间尺度上的模式的日常观察来分析时间序列。Prophet 对缺失数据和趋势变化非常稳健,通常能够很好地处理异常值。它还具有高级功能,可以对节假日对时间序列的影响进行建模,并实现自定义的变点,但我将坚持使用基本功能来建立并运行模型。我认为 Prophet 可能是快速预测的好选择,因为它有直观的参数,可以由具有良好领域知识但缺乏预测模型技术技能的人调整。关于先知的更多信息,读者可以在这里查阅官方文档。
在使用 Prophet 之前,我们将数据中的列重命名为正确的格式。日期列必须名为’ ds ,我们要预测的值列必须名为’ y '。在下面的例子中,我们使用了每日汇总数据。
然后我们导入 prophet,创建一个模型并拟合数据。在 prophet 中,change point _ prior _ scale参数用于控制趋势对变化的敏感程度,数值越高越敏感,数值越低越不敏感。在试验了一系列值之后,我将这个参数从默认值 0.05 设置为 0.10。
为了进行预测,我们需要创建一个所谓的未来数据框架。我们指定要预测的未来时间段的数量(在我们的例子中是两个月)和预测的频率(每天)。然后我们用我们创建的预言家模型和未来的数据框架进行预测。
这很简单!未来数据框架包含未来两个月的估计家庭消费。我们可以用一个图来形象化这个预测:
黑点代表实际值,蓝线表示预测值,浅蓝色阴影区域表示不确定性。
如下图所示,不确定性区域随着我们未来的进一步发展而增长,因为初始的不确定性会随着时间的推移而传播和增长。
Prophet 还允许我们轻松地可视化整体趋势和组件模式:
年度模式很有趣,因为它似乎表明家庭消费在秋季和冬季增加,在春季和夏季减少。直觉上,这正是我们期望看到的。从每周趋势来看,周日的消费似乎比一周中的其他几天多。最后,总体趋势表明,在缓慢下降之前,消费增长了一年。需要进一步的调查来试图解释这一趋势。在下一篇文章中,我们将尝试找出这是否与天气有关。
LSTM 预测
长短期记忆递归神经网络有希望学习长序列的观察结果。这篇名为“理解 LSTM 网络”的博客文章以一种简单易懂的方式很好地解释了潜在的复杂性。这是描绘 LSTM 内部细胞结构的图像。
Source: Understanding LSTM Networks
LSTM 似乎非常适合时间序列预测,事实也可能如此。让我们再次使用我们的每日汇总数据。
LSTMs 对输入数据的比例很敏感,特别是在使用 sigmoid 或 tanh 激活函数时。通常,将数据重新调整到[0,1]或[-1,1]的范围内是一种好的做法,也称为规范化。我们可以使用 scikit-learn 库中的 MinMaxScaler 预处理类轻松地规范化数据集。
现在,我们可以将有序数据集分为训练数据集和测试数据集。下面的代码计算拆分点的索引,并将数据分成训练数据集,其中 80%的观察值可用于训练我们的模型,剩下的 20%用于测试模型。
我们可以定义一个函数来创建新的数据集,并使用该函数来准备用于建模的训练和测试数据集。
LSTM 网络期望输入数据具有特定的数组结构,其形式为:[样本、时间步长、特征]。
我们的数据目前以[样本,特征]的形式出现,我们将每个样本的问题框定为两个时间步。我们可以将准备好的训练和测试输入数据转换成预期的结构,如下所示:
仅此而已!现在,我们已经准备好为我们的示例设计和安装我们的 LSTM 网络。
从损失图中,我们可以看到,该模型在训练和测试数据集上都具有相当的性能。
在下图中,我们看到 LSTM 在拟合测试数据集方面做得非常好。
集群
最后但同样重要的是,我们还可以对样本数据进行聚类。有相当多不同的方式来执行集群,但是一种方式是分层地形成集群。您可以通过两种方式形成层次结构:从顶部开始并拆分,或者从底部开始并合并。我决定在这篇文章中看看后者。
让我们从数据开始,我们简单地导入原始数据并添加两列,分别表示一年中的某一天和一天中的某一小时。
连锁和树状图
链接函数获取距离信息,并基于相似性将对象对分组到聚类中。这些新形成的集群接下来相互连接,形成更大的集群。重复该过程,直到原始数据集中的所有对象在分层树中链接在一起。
要对我们的数据进行聚类:
搞定了。!!这很简单,不是吗?
嗯,当然是,但是“病房”是什么意思,它实际上是如何工作的?正如 scipy linkage 文档告诉我们的,ward 是可以用来计算新形成的星团之间距离的方法之一。关键字“ward”使链接功能使用 Ward 方差最小化算法。其他常见的链接方法,如单一、完整、平均和不同的距离度量,如欧几里德、曼哈顿、汉明、余弦,也可以使用。
现在让我们来看看这种层次聚类的所谓树状结构。树状图是聚类的层次图,其中条形的长度表示到下一个聚类中心的距离。
哇哦。!!!!!如果这是你第一次看到树状图,那看起来很吓人,但是不要担心,让我们来分析一下:
- 在 x 轴上你可以看到标签。如果你没有指定其他的东西(比如我),它们就是你的样本在 x 轴上的索引。
- 在 y 轴上你可以看到距离(在我们的例子中是沃德方法的距离)。
- 水平线是聚类合并
- 垂直线告诉您哪些分类/标签是形成新分类的合并的一部分
- 水平线的高度告诉您形成新的集群需要“桥接”的距离
即使有了解释,之前的树突还是不明显。我们可以切掉一点,以便更好地查看数据。
好多了,不是吗?查阅凝聚集群文档以了解更多信息并使用不同的参数。
参考资料和进一步阅读:
- https://joernhees . de/blog/2015/08/26/scipy-hierarchical-clustering-and-trendgram-tutorial/# Selecting-a-Distance-Cut-Off-aka-Determining-the-Number-of-Clusters
- https://medium . com/open-machine-learning-course/open-machine-learning-course-topic-9-time-series-analysis-in-python-a 270 CB 05 E0 b 3
- https://PE tolau . github . io/ts repr-clustering-time-series-re presentations/
- https://www . analyticsvidhya . com/blog/2016/02/time-series-forecasting-codes-python/
- 【http://colah.github.io/posts/2015-08-Understanding-LSTMs/
- http://docs . scipy . org/doc/scipy/reference/cluster . hierarchy . html
- https://facebook.github.io/prophet/docs/quick_start.html
季后赛勒布朗
近年来,NBA 球队在比赛的许多方面变得更加聪明,一个主要的例子是球员在漫长而艰苦的常规赛中休息和调节的重要性。
这导致越来越多的人猜测,NBA 的一些大牌球星在整个常规赛中都处于“巡航控制”状态,在季后赛“按下开关”之前等待时机。自我标榜的“季后赛-P”角色(俄克拉荷马雷霆队的保罗·乔治)表明,球员们意识到了这种看法,但真正让我质疑的是勒布朗·詹姆斯迄今为止在东部季后赛中的主导表现——推动一支看似毫无生气的骑士队进入了东部决赛——勒布朗是否真的在季后赛中比常规赛运转得更好,这是最近的现象还是球员们在职业生涯后期可能会做的事情,以延长他们的寿命。
那么,“季后赛勒布朗”是真的吗?为了进一步调查,我在数据中做了一些挖掘。
将一些基本的和高级的统计数据分为常规赛和季后赛,然后只限制给定球员进入季后赛的赛季,我们可以从职业生涯的平均数据开始。绘制一组选定球员的常规赛和季后赛 PER ( 球员效率等级)的差异(注意:不是所有球员!),我们看到以下内容:
看来季后赛对球员效率的要求很苛刻!应该指出的是,有许多更先进的方法来区分常规赛和季后赛之间的差异,但这些是球员在常规赛和季后赛之间的 PER 的原始差异。
如果我们看看另一个高级统计,BPM ( 框加减),我们可以开始看到一些明显的区别:
从这几个图表来看,勒布朗、迈克尔·乔丹和拉塞尔·维斯特布鲁克真的会出现在季后赛中!也许与流行的观点相反,克里斯·保罗在我们的季后赛排名中也有很高的评价——事实上,他有历史上最高的季后赛 per,但一些高调的失误玷污了他的季后赛声誉。
原始得分数据呢?嗯,你可能已经猜到了,乔丹在这里是一个非常明显的领跑者,在季后赛中每场得分比常规赛多 3 分以上:
尽管一些球员得分上升,他们的得分效率在季后赛中如何转化?为此,我选择了 eFG% ( 有效投篮命中率),尽管真实投篮命中率可能会得出类似的结果:
有一种普遍的看法认为,比赛在季后赛中会变慢,变得“更丑”。这是因为团队有更多的时间和动力去侦察和制定游戏计划,特别是去关闭他们的对手人员和最喜欢的场景。对方球队甚至可以刺激明星球员只采用效率最低的投篮类型,导致整体投篮效率下降。有趣的是,常规赛的效率之王——克里斯·保罗——在季后赛中奇迹般地拥有稍高的eFG %!上帝,这才是重点。
对于其他人来说,效率的下降也可能是由于单个玩家工作量的变化。我们知道,在季后赛中,轮换时间大大缩短,明星球员尽可能多地留在场上。让我们看看这在数据中是否突出:
看起来一些有史以来最好的球员在季后赛中被更多的使用,乔丹和勒布朗每场比赛都获得了更高的上场时间。
球员处理球的时间有多长,或者他们在球场上消耗了多少财产?这可以在 USG% ( 使用率)中说明:
虽然勒布朗的使用率在季后赛中没有明显增加,但这可能是因为他在常规赛中的使用率已经非常高了,因为他在职业生涯的大部分时间里一直担任名义上的“控球后卫”。有趣的是,我们看到在我们的球员组合中,传统控卫(即克里斯·保罗、拉塞尔·维斯特布鲁克和史蒂夫·纳什)的使用量大幅上升——这是他们试图作为球队的首席调解人来做所有事情,还是季后赛期间进攻或防守理念战略差异的结果?有趣的是,许多得分后卫(如科比、詹姆斯·哈登、韦德、斯蒂芬库里)的使用率都下降了。在季后赛中,对手会更有效地阻止他们吗?像往常一样,蒂姆邓肯仍然是一致性的典范,无论在一年中的哪个季节,他都几乎没有改变他那令人难以置信的发挥!
最后,我想看看他们在整个职业生涯中,季后赛表现和常规赛表现之间的差异是如何演变的,而不是看球员的职业生涯平均值。人们常说,年轻球员在季后赛中挣扎,而老将被认为在季后赛中茁壮成长。我们对明星球员的分析证明了这一点吗?让我们先来看看 PER 数字:
尽管由于单个球员在一个赛季中参加的季后赛次数相对较少,数据存在较大差异,但随着球员的发展,似乎有明显的上升趋势。对于我们选择的超级巨星来说,他们 27-28 岁的赛季似乎代表了一个转折点,他们在季后赛的表现开始超过他们在常规赛的表现。这可能是因为季后赛的舒适度增加了,常规赛的方式更放松了,或者更有可能是两者的结合!然而,迈克尔·乔丹 22 岁的季后赛和勒布朗·詹姆斯 24 岁的季后赛真的很突出。让我们看看 BPM 数字来证实这一影响:
根据这个标准,看起来 MJ 在季后赛中一直都很棒——没有什么好惊讶的!不像飘忽不定的“Vino”,看起来勒布朗像一瓶好酒一样老化,自从他 27 岁的赛季以来,他的季后赛平均 BPM 通常超过他的常规赛数字。
他能保持这种状态多久还有待观察,但与此同时,看起来“季后赛勒布朗”绝对还活着&很好!(季后赛)王者万岁!
用于分析的完整代码可用 此处 。
在 3D 中绘制决策边界—逻辑回归和 XGBoost
View from Mt. Timpanogos trail, UT, photo by myself
把机器学习模型想象成一个函数——数据帧的列是输入变量;预测值是输出变量。这个函数的水平集(或 coutour)在 ML 术语中称为决策边界。
有很多关于划分决策界限的在线学习资源。比如下面这张取自 sklearn 文档的图,就挺受欢迎的。图中 x 轴和 y 轴变量代表数据帧的两个特征(变量),颜色代表预测值。
http://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html
最近,来自脸书的 Brandon Rohrer 制作了一个视频展示决策树是如何工作的。看完之后,读者可能会对决策界限有更好的认识。
虽然已经有相当多的学习资源了,但我相信一个好的互动 3D 情节肯定会帮助读者获得对 ML 模型的直觉。这里我挑选两个模型进行分析: Logistic 回归,易于训练和部署,在很多领域都是常用的; XGBoost ,梯度增强树家族(gradient boosting,LightGBM 等)领先的 ML 算法之一。).
(这次跳过了随机森林,因为只有两个特征被用作可视化目的的模型输入,我不知道如何从仅有的两列中随机选择任何有意义的列。)
开始之前的一些注意事项
Dataset 1, 2, and 3
- 红点是标签为 1 的行,蓝点是标签为 0 的行。
- 表面图是由相应的 ML 模型生成的函数。
- x 轴和 y 轴变量都用作输入变量(要素),z 轴变量表示散点图的真实值或表面图的预测值。
- 在下面的交互式可视化中,圆点不会显示,直到你拖动图形。
- 为了了解这些情节是如何创造的,一个不错的学习资源是斯特凡·尼克的 d3 积木:https://bl.ocks.org/Niekes
数据集 1
对于逻辑回归图,点击此处。
对于 XGBoost 图,点击此处的。
对于这个玩具数据集,两个模型都非常适合训练集。但实际上,数据永远不会是这个样子。
数据集 2
对于逻辑回归图,点击此处。
对于 XGBoost 图,点击此处。
逻辑回归可以捕捉线性,但不能捕捉单调性。另一方面,许多基于树的模型可以在这个数据集中表现良好。
数据集 3
对于逻辑回归图,点击这里。
对于 XGBoost 图,点击这里。
这些数据更加混乱,看起来更像真实世界的数据。在这种情况下,逻辑回归只能捕获数据分布的大致趋势,但不能识别阳性或阴性病例密集的关键区域。另一方面,XGBoost 可以识别关键区域,并且还可以避免在正反例都密集的区域上过度拟合。
为什么 XGBoost 决策边界看起来像这样?
XGBoost 算法是梯度提升树算法的一种。它首先生成一个优化目标函数的决策树(更准确地说,是目标函数的二阶泰勒近似,带有额外的正则化项),然后将每棵树乘以一个常数(学习率)。下一棵树如何生长是基于所有先前的树,加上目标函数的效果。
因为每个决策树是特征空间的一个分区,其中每个区域具有不同的输出值,所以这些树的任何线性组合仍然是特征空间的一个分区。当模型中使用更多的树时,我们将得到更好的划分。
曲线拟合
许多机器学习专家表示,ML 只是曲线拟合(1-D 中的曲线,更高维度中的曲面)。从这些例子中,我们可以看到模型是以“适合”这些点的方式创建的。
模型性能不仅取决于“曲线”与训练数据集的拟合程度,还取决于测试数据的分布与训练数据的分布有多接近。如果训练数据和测试数据差异很大,并且您有一个非常“适合”训练数据的模型,这意味着该模型“过度适合”。
感谢阅读。
误用雷达图来区分多维数据
常见的图表以二维或三维的形式显示数据,但除此之外呢?(对于不耐烦的人:滚动到底部观看演示和一些代码)。
一位同事最近带着一个问题来找我:他们正在开发一个点击式工具,通过将一组节点放置和连接在一起并创建一个图表,帮助用户可视化地设计系统。每个节点有许多(大约 30–40 个)不同的可配置设置,通常有不同的可能值:一些是数字,一些是布尔,一些是分类。
How is “Da” different than the other “Da”s?
问题是,查看每个节点并不能告诉您任何关于它的设置的信息,并且查看每个节点的许多设置的列表是非常耗时和令人沮丧的。我们如何让不同类型设置的节点一眼就能区分开来?
当我们有更多的维度,并且数据点具有不可比较的特征时(例如,每个变量可能有不同的最小值/最大值,一些可能是分类的,一些是数字的,等等),视觉上区分数据变得更加困难。
下面是用条形图网格绘制多维图的样子:
Source: “Visualization of Food-Based Dietary Guidelines”, Koening
在我们的例子中不同的是,我们的远不止 3 个参数,也就是说,每个图表中有更多的条形。最重要的是,我们并不总是能够将迷你图表排列成整齐的网格(也称为“小倍数”),这使得发现模式和差异变得更加困难。
Source: “The Semiology of Graphics”, Bertin
数据可视化理论认为,人们可以使用“通道”对信息进行可视化编码(阅读更多关于 Bertin 的视网膜变量)。但是这对我们没有太大的帮助:工具已经牺牲了位置和大小(我们必须将节点放在图中),而且一开始就没有那么多变量。
戴上我的数据科学帽子,首先想到的是降维(例如 PCA 或 t-SNE )。这是一种数学方法,它获取你的数据集,并神奇地吐出一个新的数据集,它具有更少的维度,以便于绘图。尽管很容易发现相似和不相似的数据点,但通常很难描述这些减少的维度意味着什么。
我同事的第一个建议完全不同——雷达图!这让我大吃一惊。雷达图得到很多高射炮火,而且往往有充分的理由。
Source: https://commons.wikimedia.org/wiki/File:Spider_Chart.svg
不过,我越想,就越觉得值得一试。通常在雷达图中,所有的轴都有相同的域(例如 1 到 10),但事实并非如此。我们可以将每个轴重新想象为一个单独的维度,然后它可以作为一个 n 维的图。
雷达图的一个问题是,它们对形状进行了过度编码,这意味着对于人类来说,每个轴上的微小差异并不突出,但单个数据点的怪异多边形形状却很突出。但在这种情况下,我们可以利用这一点!
Source: https://commons.wikimedia.org/wiki/File:Spider_SSI2008.gif
方法如下:人类擅长注意形状之间的差异。我们试图做的是一眼就注意到广泛的差异,所以也许我们可以使形状本身更加突出,而单独的数据点不那么突出。最后,我们得到的是不同节点看起来不同的多边形形状,以及相似节点看起来相似的多边形形状。
解决这个问题的另一种方法是平行坐标图,它是我们假设的图表的近似展开版本:
Source: https://en.wikipedia.org/wiki/Parallel_coordinates#/media/File:ParCorFisherIris.png
我更喜欢雷达版本的一个原因是因为它产生了一种紧凑的表示形式——径向线形成的多边形几乎就像是数据生成的符号。这允许您使用类似于迷你图的压缩表示,可以在另一个应用程序中使用。另一个原因是,我认为单独的线条不如多边形形状容易记忆。
另一个有趣的选择是切尔诺夫的脸,它们有相似的脉络,很搞笑,但人们很难认真对待:
Multivariate data abound!
显然,还有切尔诺夫鱼。无论如何,这个想法让我很兴奋,我开始工作。我从使用 d3 的 Nadieh Bremer 的优秀雷达图文章和示例代码开始:
The code was so nicely commented!
我移除了径向网格圆,以消除轴之间的连续性感觉——毕竟,它们现在代表不同的量。我还去掉了大部分美学上的细微差别,当你缩小图表的尺寸时,这些细微差别并不真正相关。
类似地,我也考虑过完全移除轴之间的径向线/区域,只在每个轴上有大点,但最终这些线作为视觉辅助工具帮助生成了一个整体多边形,似乎比彩色点更容易比较。
我不得不修改大量代码来支持多个不同的轴。此外,基于数据集逐个配置每个轴听起来很痛苦,所以我添加了一些代码来基于数据集本身自动生成刻度和轴:使用一些简单的标准(当前变量的类型——是字符串、布尔还是数字?),你就可以半知半解的决定用什么样的轴了。您还可以查找最小值和最大值(在线性刻度的情况下)或所有唯一值(在分类变量的情况下)。你可以表面上更聪明地扩展它,例如,你可以测量一个变量的偏斜度,然后决定用对数轴来绘图。
这是一个中间结果,在同一组轴上绘制多个数据点,有些是分类的,有些是线性的:
当然,对于多个数据点来说,这并不实际,因为多边形开始重叠。更重要的是,让我们用一些实际数据来看一个小倍数的例子。我的同事试图为一个研究项目可视化数据结构的不同配置参数。因为我对这个数据集的主题有所了解,所以我希望看到不同的图形组,它们看起来彼此相似,但与其他的不同。
我认为它基本上实现了我们设定的主要目标:具有完全不同设置的节点看起来完全不同(例如,Trie 与范围划分),而具有相似设置的节点看起来相似(例如,所有 B 树变体、所有数据页变体、链表和跳过列表)。
会扩大到 40 吗?我认为这是可疑的:
这并不奇怪——40 是很多。我怀疑这取决于你所看到的数据的结构。删除维度确实有点像作弊,但是我们仍然显示了比大多数其他可视化类型更多的维度。
要考虑的一件事是轴的顺序:因为变量之间没有特定的关系,所以不清楚什么顺序是最佳的。但是,保持相关的轴彼此靠近可能有助于生成更容易区分的形状。或者,先对分类轴进行分组,然后对附近的顺序轴进行分组可能会有所帮助。
另一个方面是颜色——使相似的形状看起来颜色相似可能是一个很大的改进,例如,像链表和跳表这样的南北向重的实例可以看起来不同于像 datapage 和 trie 这样的东西向重的实例。如何最好地做到这一点并不明显。
我不喜欢这个图表是因为它让分类变量看起来是有序的。无论如何,你必须在轴线上有一个定义好的类别选项顺序。这更像是语义上的吹毛求疵——因为目的是让不同的数据点看起来不同,这不一定那么重要:单个值不如成功的比较重要。
我们可以做一些更聪明的事情:最不常见的选项可以最接近原点,而最常见的选项可以最远,这意味着最“平均”的数据点将类似于一个大的等半径多边形,而该数据点的不常见变量将显示为易于区分的“倾斜”。
Slightly subtler styling. The first 4 shapes remind me of Darwin’s finches for some reason.
总的来说,这对于相对较少的努力来说是不错的!如果你想试试,这里有一些演示和代码:
[## 不同坐标轴的多元雷达图
Mehmet Ali “Mali” Akmanalp 区块 9cb 99571 ee 74 b 169 DC 109 EC 3 fc 3d 4920
bl.ocks.org](http://bl.ocks.org/makmanalp/9cb99571ee74b169dc109ec3fc3d4920)
它不是防弹的,因为我没有花太多时间在它上面(“最后的 20%花费了 80%的时间”),但它只是几行代码来画一个图表,它应该可以完成工作!
鸣谢 :感谢 Nicky Case、John Christian、Katherina Nguyen、Will Strimling 和 Justin Woodbridge 提供的宝贵帮助、建议和反馈!
播客片段:与 StitchFix 的首席算法官在第 9 集的背景中
语境播客的最新一集是机器学习领域任何人的必听内容。Context 的主持人, integrate.ai 的凯瑟琳·休姆,总是向一群令人印象深刻的客人提出商业和技术问题的完美平衡。
如果你以前没有听过语境中的,我强烈推荐订阅!另一个很棒的剧集是第 7 集的“了解数据产品市场”,由 Clare Corthell 和 Sarah Catanzaro 主演。
埃里克·科尔森目前是在线订阅个人购物服务公司 StitchFix 的首席算法官,他最近首次公开募股。在 Stitch Fix 之前,Eric 是网飞数据科学&工程副总裁,这是另一家将机器学习深度融入客户体验的公司。不用说,StitchFix 肯定是以切实的方式利用机器学习来影响其商业目标的顶级公司之一,其他公司还有优步、谷歌、Airbnb 和苹果。
虽然播客的标题专注于为 autonomy 招聘,但实际上这一集涵盖了许多有趣的主题——从构建数据科学团队到在组织中脱颖而出,“fullstack 数据科学家”,以及 StitchFix 自己的机器学习项目。
Stitch Fix’s Algorithms team has a dedicated website that shows algorithms are integrated into every step of the Stitch Fix customer experience — highly recommend!
在本帖中,我将提供这一集的摘要,以及我的主要观点和听完后需要考虑的开放性问题。
注意事项:
1:24–1:34 >开始播客的关键问题:“你如何发展一种促进问责制和自主权的文化?在数据科学+机器学习的背景下,自治是否面临特定的挑战?”
3:30–4:37缝合修复允许用户记录他们的偏好,然后将填充他们的选择。
4:50–7:26 > Kathryn 提出了这样一个问题:“人工智能是否会夺走我们意外发现的能力?”(减少自我决定)Eric 用他使用 Stitch Fix 的经验来回应,他声称让人们在服装选择上有更多的发现和信心。
9:30–10:30 > Eric 谈到了 Stitch Fix 机器学习团队使用的不同算法:它们通过人类处理者(造型师)的判断来扩展经典的推荐系统。他指出,机器学习已经取得了进步,但仍然缺乏移情和建立关系的特定技能。
10:31-12:18 > Stitch Fix 有超过 85 名算法开发人员,其中只有 5 人从事推荐算法方面的工作。库存管理、需求管理、物流和服装设计算法是 Stitch Fix 管道中的一些其他算法,有助于该公司相对于其他零售商的可持续竞争优势。
12:26–12:56 >根据 Kathryn 指出的两个趋势,围绕 ML 算法作为可防御护城河的讨论:(1)开源的兴起和(2)工业和学术界之间权力动态的转移。
12:58 -14:42 >数据作为杠杆。组织结构实际上作用于/拉动杠杆,因此公司实际上可以有效地利用数据和算法。 Stitch Fix 的组织结构将数据科学与其他关键业务职能相提并论。
15:34–17:55 > Eric 描述了 Stitch Fix algorithms 团队的部门如何与营销或造型等其他合作伙伴业务部门保持一致,以创造一种持续的主动性,而不仅仅是一个项目。合作模式允许思想的双向流动。
18:07- 19:00 > Kathryn 注意到这种合作关系如何为清晰的**“想象力的地平线”**-本质上,就是关于机器学习的可行性的知识。
19:03–21:34 >数据科学团队如何工作的两个特性: (1)构思概念和(2)构思概念。Eric 主张让数据科学家参与其中,尤其是因为人们可能仍然没有清晰的想象力。
22:00–24:18 > Kathryn 关于 Stitch Fix 是否有专门从事基础研究的人员的问题引发了围绕移交风险的全面讨论。 Eric 描述了 Stitch Fix 算法团队如何通过拥有端到端流程来实现“自主、精通和有目的”。凯瑟琳将这种方法与其他公司的专业角色(商业分析师、数据科学家和工程师)进行了对比。
24:20 -29:35 > Eric 提出需要全栈数据科学家进行更多迭代流程,避免协调成本+等待时间的噩梦!🦄
32:05–36:35 > Stitch Fix 数据科学候选人来自广泛的学术领域,但通常都具有定量思维和基础,并且偏向于行动。埃里克还强调了从理论到实践的经验过渡的必要性。
41:29 -43:20 > Eric 认为已经专业化的组织可以转向更通用的自治结构。
要考虑的要点和问题:
播客中最引人注目的部分是 Eric 提出组织需要脱离专业角色,支持数据科学通才。Stitch Fix 似乎在这种模式下取得了成功,因为他们的文化、与其他业务部门的关系以及招聘流程有助于这种成功——看不出没有这些其他组件的公司会轻易改变结构。
老实说,我能看到在一个人领导下做事情的好处,让事情变得更快。我很想知道我们如何改善交流和分享,这样人们在拥有自主权和责任的同时还能合作。
需要思考的一些问题—
- 数据科学家愿意做全栈数据科学家吗?雇佣这些“独角兽”真的像看起来那么难吗?
- Stitch Fix 的组织结构与您的团队/公司有何不同?您认为这对于完成工作和推动业务影响会更有效吗?
- 数据产品在目标和需求方面与其他产品有何不同?
- 你和你的团队正在做任何需求未知的任务吗?
- 专业化和让多个利益相关者参与进来有什么好处?这些是否超过了让一个人在整个过程中完全自主的好处?
- Eric 描述了 Stitch Fix 算法团队如何针对“差异化能力的快速开发”进行优化——您的团队针对什么进行了优化?
觉得这篇文章有用?在 Medium 上关注我们( Comet.ml )!
Cecelia Shao 是 Comet.ml 的产品负责人。🚀🚀🚀
在 Comet.ml 之前,她是 IBM Watson 的机器学习平台的产品经理,并在包括 Mattermark 和 Gemini 在内的几家初创公司运营。作为一名用户驱动的项目经理,交流数据的结果和建议是她的专长。
PoetBot:一个推荐诗歌的电报聊天机器人
从头开始构建你的第一个诗意聊天机器人
谁不需要生活中的一点诗意来度过呢?谁不想找一点代码让它发光呢?本教程的目的是为 Telegram 中的诗歌推荐建立一个全功能的聊天机器人,这是一个类似于 WhatsApp 的即时通讯平台,除了比好得多、好得多。我们将把工作流程分成三大块:
- 在网上搜索浪漫,输入我们的数据库。
- 编写一个 Python 脚本来处理文本处理和标记。
- 将聊天机器人嵌入电报。
你准备好了吗?现在,在我们开始之前,让我给你介绍一个人…
Hey, please meet PoetBot.
第一步:爬行
首先:在我们开始构思诗歌推荐引擎之前,我们必须有一些很酷的诗歌要分发。由于找不到符合我们需要的诗歌数据库,我们决定从网上搜集资料,建立自己的数据库。人们的目光很快停留在 Pomemhunter.com,这是一个提供来自世界各地酸甜苦辣的内容的门户网站。我们花了一些时间研究网站的架构,发现用户排名的前 500 首诗存储在 20 个相邻的网页上,其逻辑如下:
https://www.poemhunter.com/p/m/l.asp?a=0&l = top 500&order = title**&p = 1**首诗 1 至 25 首
https://www.poemhunter.com/p/m/l.asp?a=0&l = top 500&order = title**&p = 2**首诗 26 至 50 首https://www.poemhunter.com/p/m/l.asp?a=0&l = top 500&order =首随着 p 从 1 增加到 20
实际上,我们可以循环 p 属性来获得包含 500 首诗的 20 个页面的 URL 列表。这用 Python 来翻译(警告:代码开始):
我们现在知道指向每首诗的超链接存储在哪里,我们需要做的就是检索它们。回到这里并按下 ctrl+U ,我们注意到各个诗歌的 URL 包含在一个标签为‘title’的< td >元素中。根据这些信息,我们使用 requests 和 BeautifulSoup 编写一个代码来创建一个收集 500 个 URL 的列表(代码中的“链接”)。
所以,工作完成了一半。我们现在可以一首接一首地连接到诗歌,并保存每个作者、标题和全文。最后,我们将结果保存在一个 csv 表中供以后使用。
太好了,我们把所有的数据都放在一个地方。**辛苦工作之后,我们可以放松一下,享受一点诗歌,不是吗?**浏览我们刚刚创建的表格(顺便说一句,你会在这里找到它和所有其他代码),第 13 首最受欢迎的诗是罗尔德·达尔著名的“电视”,在这首诗中,这位英国作家对现代技术并不轻松(我一直同意你的观点)。关于孩子看电视,它是这样的:
他们坐着,凝视着,凝视着,坐着
直到他们被它催眠,
直到他们被那些令人震惊的可怕的垃圾完全灌醉。
哦,是的,我们知道它让他们保持安静,
他们不会爬出窗台,
他们从不打架或踢或打,
他们让你自由地做午饭
和在水槽里洗碗—
但是你有没有停下来想一想,
想知道这对你心爱的孩子到底有什么影响?
The culprit.
第二步:锁定目标
在开始锁定目标之前,我们需要清理我们的数据。我们的策略如下:我们从刚刚创建的表上传原始文本,对于每首诗,我们将标题和文本连接在一起,我们删除停用词、标点符号和数字,我们标记,我们计算平均标记长度,我们截断太长的诗,我们扩展太短的诗以获得等长的行。‘Pfiu!,我试着尽可能快地说出来。如果你想详细了解这是如何做到的,请参考下面的笔记本。如果没有(谁怪你),就在’ tokenized_poems.csv '随便看看,继续下一段。
好了,我们现在准备写我们的定位算法。当用户与机器人互动时,他们将被要求输入一个句子和/或一系列单词来描述他们想要的诗歌是什么样子的。依靠如此小的数据集,尝试将诗歌聚类成主题并使用它们作为目标是没有意义的。然后我们选择了一个简单得多的解决方案,老一套:“给我一袋单词,我会还给你包含最多单词的那首诗!“我们是有想象力的人,我们设计了一个 Python 类,它将优雅地接受一个字符串并返回我们的目标诗歌的全文。把刚才说的重新组织成子句和循环,代码看起来很庞大,如果你感兴趣的话,看看这里的。否则就继续读吧,在教程的最后,我会解释如何在不知道里面有什么的情况下使用这个机器人。
为了利用我们的类(对不起,Karl 不是那个意思),我们写了一个‘main . py’程序,它为 Poet_class 创建了一个实例,并在其上调用‘get _ poem’方法。非常简单快捷:
第三步:将聊天机器人嵌入电报
最后,我们都在等待的时刻。我们有我们的数据,我们有如何选择诗歌的规则,我们知道如何从数据库中提取它们。我们所需要的是创建我们的机器人,并附上一套指令!为了做到这一点,我们首先导入相关的库并启动一个记录器,在错误发生时向终端显示错误。
然后我们定义一组机器人能够处理的指令。下面,每个函数对应一个方法。告诉机器人类似“/poem about cactus and roses”的内容将激活“poem”方法,该方法将处理输入并调用 Poet_class 来选择目标诗歌及其文本。
好了,一堆台词就给不出思路了。让我们试试机器人直播吧!从终端启动脚本并连接到 PoetBot,我们发出第一个请求:
工作正常!我们可以给机器人一个更简单的表达式,看看会有什么结果。
Guess what the word is…
机器人似乎再次做出了很好的反应,搜索“爱”这个词出现最多的诗歌(在这种情况下,它出现了很多)。
现在,完成了。你可以用更复杂的查询来测试这个算法,并希望从中获得一些奇怪和有趣的东西!注意:PoetBot 还没有部署,所以如果你想使用它,你必须自己获得它(说明如下)。万一有(烧瓶?)开发者正在看这个,想帮我们放到云上,请给我们喊一声,我们提供电子啤酒作为交换(互联网第 0 法则:如果你能想到,大概它已经存在了)。感谢大家的阅读。
建立你自己的机器人
安装你自己的机器人的步骤如下:
- 下载电报应用到你的手机。
- 问候 BotFather(默认情况下他会在你的联系人列表中),然后告诉他你想创建一个新的 bot。命令: /newbot
- 给你的机器人一个名字(将显示什么)和一个用户名(将用于识别)。在我的例子中,我选择了 PoetBot 和 VioletsAreBlueBot 。请不要问。
- 爸爸会给你一个令牌。把它保存在某个地方。
- 从这个 github repo,克隆到你的本地机器’ bot.py ‘,’ poet_class.py ‘,’ tokenized_poems.csv ‘,’ poems_collection.csv ‘和’ requirements.txt '。
- 在 bot.py 中,插入 BotFather 给你的令牌。
- 通过访问您的本地文件夹,后跟命令“pip install -r requirements.txt”来安装要求
- 运行“python3 bot.py”
- 通过使用用户名作为搜索标准在 Telegram 上找到您的机器人,并享受它:)
【poet bot 图片鸣谢:Ivan Kershner。】
口袋妖怪代沟?(Python 数据分析)第 1 部分:清理,EDA
Photo by Thimo Pedersen on Unsplash
我一直在通过网络课程学习 Python 进行数据分析,有时也会学习 Youtube 视频等。我知道我只迈出了第一步,但我忍不住想把我学到的东西付诸实践。我坚信,知识不是你的,直到你实际应用和使用它。我没有那种“美丽心灵”类型的大脑,我不能仅仅通过观看来理解我头脑中的事物。考虑到我目前的 Python 流畅程度,我先从一些简单的基础分析开始。
我不是口袋妖怪极客,但我确实玩过口袋妖怪 Go。不幸的是,我是那些提前离开的人之一。我想我升到了 25 级,就这样了。我确实看过几集电视剧,但只是偶然。那么,为什么是口袋妖怪呢?我想从轻松、不太严肃也不太复杂的地方开始。当我在浏览 Kaggle 的数据集时,我发现了口袋妖怪数据集!数据的大小对我来说是可管理的,不包含太多的列,每一列对我来说都很容易理解。还有口袋妖怪很可爱…
我首先浏览了口袋妖怪数据集中的所有内核,许多很酷的分析有些对我来说太高级了,有些我能理解。所以我先从一个简单的问题开始。“不同年代的口袋妖怪有区别吗?”(从 1996 年到 2017 年跨越了 7 个不同的世代)
首先,我下载了数据集并保存在我的电脑中,以便用 Python 阅读和查看。
import pandas as pd
df = pd.read_csv('Pokemon.csv')
df.head()
通过查看前 5 项数据,我已经发现了两个问题。第一,’ # '列有重复,并且似乎口袋妖怪的巨型进化形式与其原始形式具有相同的 ID 号(巨型进化是口袋妖怪的终极形式,并不适用于所有口袋妖怪)。但是大进化前后肯定是不一样的。不仅他们的统计数据会改变,他们的长相也会改变。例如,第三个条目 Vensaur 的总属性点是 525,而第四个条目 Mega Venusaur 的总属性点是 625。外观如下。
Left: Venusaur, Right: Mega Venusaur (and No! they are not the same, take a closer look)
第二个问题是第四个条目 Mega Venusaurs 在名称列值的前面重复了 venus aur;“VenusaurMega Venusaur”。这需要处理。
只看前五个条目并不能给我完整的数据。所以为了看到更广阔的图景,我称之为“info”方法。
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 800 entries, 0 to 799
Data columns (total 13 columns):
# 800 non-null int64
Name 800 non-null object
Type 1 800 non-null object
Type 2 414 non-null object
Total 800 non-null int64
HP 800 non-null int64
Attack 800 non-null int64
Defense 800 non-null int64
Sp. Atk 800 non-null int64
Sp. Def 800 non-null int64
Speed 800 non-null int64
Generation 800 non-null int64
Legendary 800 non-null bool
dtypes: bool(1), int64(9), object(3)
memory usage: 75.9+ KB
我可以看到有 800 个条目,列的值是“object”或“int64”或“bool”,意思是字符串或整数或布尔值。对于“Type 2”变量,只有 414 个非空条目,这意味着缺少 386 个值。需要谨慎处理缺失值。它们丢失可能是有原因的,通过找出原因,您可能会发现一些有用的见解。有时缺失的部分甚至会扭曲整个数据。但在这种情况下,这只是因为一些口袋妖怪没有二级类型。对于我的分析,我不会使用“Type 2”属性,所以我会让它保持原样。
现在是时候来点 EDA(探索性数据分析)了!EDA 有两个方面,数字汇总和一些可视化方法,如图表。在 Python 中,只需一种方法“describe”就可以轻松提取汇总统计数据。
df.describe()
我可以在一个表中看到计数、平均值、标准差、最小值、四分位距、最大值,现在我对数据有了更好的理解。(“描述”方法只从数值中抓取结果。因此,具有字符串、布尔值:“名称”、“类型 1”、“类型 2”、“传奇”的列没有在此处显示。)尽管这个数据集很容易看出每一列的含义,但有时查看数据集的原始文档是非常有帮助的。根据上传数据集到 Kaggle 的 Alberto Barradas 的说法,描述如下。
#:每个口袋妖怪的 ID
名称:每个口袋妖怪的名字
类型 1:每个口袋妖怪都有一个类型,这决定了弱点/对攻击的抵抗力
类型 2:一些口袋妖怪是双重类型,有 2 个
总计:在此之后所有统计数据的总和,一个口袋妖怪有多强的一般指南
生命值,或者生命值,定义了一个口袋妖怪在晕倒前可以承受的伤害
攻击:普通攻击的基础调整值(例如抓伤,猛击)
防御:对普通攻击的基础伤害抗性
特殊攻击,特殊攻击的基础调整值(例如火焰冲击,气泡光束)
SP Def:对特殊攻击的基础伤害抗性
速度:决定每轮哪个口袋妖怪先攻击
我猜‘世代’和‘传奇’变量是后来加上的。只是为了帮助你理解,“一代”变量是关于它是哪一代的口袋妖怪,“传奇”是口袋妖怪是否是一个传奇类。
我们继续吧。我首先想解决我在调用“df.head()”时看到的两个问题。“#”列的重复项和“名称”列的陌生名称。
df = df.drop(['#'],axis=1)
import re # importing regex library to use in below line
df.Name = df.Name.apply(lambda x: re.sub(r'(.+)(Mega.+)',r'\2', x))
df.head()
好的。我完全删除了“#”栏,也删除了超级进化形态前面重复的口袋妖怪名字。现在看起来好多了。让我们通过调用“tail”方法来查看条目的结尾。
df.tail()
哦等等。有些事情看起来不太对劲。条目编号 797,798 似乎在名字前面有重复。供您参考,胡帕是正确的名称,而不是胡帕胡帕,他们看起来像下面。
Left: Hoopa Confined, Right: Hoopa Unbound
我最好为胡帕整理一下这个名字。所以我写了另一个代码来修复两个胡帕条目。
df.Name = df.Name.apply(lambda x: re.sub(r'(HoopaHoopa)(.+)','Hoopa'+r'\2',x))
df.tail()
老实说,为了弄清楚是否还有其他奇怪的名字需要修改,我还打开了 csv 文件,并扫描了所有 800 个条目的“名称”列。我想我不能为 10,000 或 100,000 个条目这样做,可能需要考虑更聪明的方法来解决这个问题。但无论如何,我发现只有超级进化形态的口袋妖怪或胡帕在他们的“名称”列值中有这种问题。
最后,我准备好继续进行一些可视化 EDA。既然我想弄清楚口袋妖怪一代比一代有什么不同,那么把参赛作品按不同代分组,看看它们在剧情上的样子是个不错的主意。
“总计”栏是所有统计值的总和,我认为这是一个口袋妖怪整体统计的良好指标。所以,让我们看看’总’值是如何在同一代口袋妖怪中分布的。
根据 Seaborn 的文件记载,“小提琴情节扮演着与盒子和胡须情节相似的角色。它显示了一个(或多个)分类变量的几个水平上的定量数据的分布,以便这些分布可以进行比较“”。violin 图的优势在于,你可以从图中看到分布形状。有了箱线图,你永远无法知道分布是单峰还是多峰。
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
sns.violinplot(x='Generation',y='Total',data=df)
看起来第 1 代和第 3 代比其他代更分散,而第 4 代看起来最短,有两个明显的峰值。至少,从情节来看,几代人之间可能会有一些显著的差异,但现在说还为时过早。
当我在寻找小提琴情节的定义和解释时,我发现了一件有趣的事情。虽然小提琴图显示了更多的信息,但它们可能比盒子图更嘈杂。嗯嗯是这样吗?我想我必须画一个方框图,看看它们有什么不同。
我觉得帖子太长了。我就讲到这里,继续讲第二部分。
下面是我用上面的代码创建的要点的链接。请随时查看,如果您有任何建议或反馈,请告诉我。
简而言之,政策梯度
本文旨在对强化学习中最重要的一类控制算法——策略梯度——提供简明而全面的介绍。我将依次讨论这些算法,从头开始得出众所周知的结果。它针对的是对机器学习中的任何其他主题有合理背景的读者。最后,我希望你能够阅读大量(如果不是全部)强化学习文献。
介绍
强化学习(RL)指的是学习问题和机器学习的子领域,它最近在新闻中有很大的原因。基于 RL 的系统现在已经击败了围棋世界冠军,帮助更好地操作数据中心,掌握了各种各样的雅达利游戏。研究界看到了更多有希望的结果。有了足够的动力,现在让我们来看看强化学习的问题。
强化学习是对学习问题的最一般的描述,其目的是最大化一个长期目标。系统描述由一个代理组成,该代理通过其在离散时间步骤的动作与环境交互,并接收奖励。这将代理转换到新的状态。下图描述了一个典型的代理-环境反馈循环。
The Canonical Agent-Environment Feedback Loop
学习问题的强化学习味道与人类如何有效地行为惊人地相似——体验世界、积累知识并利用学到的知识处理新的情况。像许多人一样,这个问题的吸引人的本质(尽管更难表述)让我兴奋,并希望它也能让你兴奋。
背景和定义
RL 背后的大量理论基于奖励假设的假设,该假设概括地说,一个主体的所有目标和目的都可以用一个称为奖励的单一标量来解释。这仍然是一个争论的话题,但是已经很难反驳了。更正式的说法是,奖励假设如下
奖励假说:我们所说的目标和目的都可以被认为是接收到的标量信号的累积和的期望值的最大化(称为奖励)。
作为一名 RL 实践者和研究人员,一个人的工作是为一个已知的问题找到正确的奖励集,称为奖励形成。
代理必须通过一个被称为马尔可夫决策过程的理论框架正式工作,该过程包括一个决策(采取什么行动?)在每个州进行。这产生了一系列的状态、行动和奖励,被称为轨迹
目标是最大化这些奖励。更正式地说,我们看马尔可夫决策过程框架。
马尔可夫决策过程:一个(贴现)马尔可夫决策过程(MDP)是一个元组(S,A,R, p , γ ,这样
其中S _ t,S _(t+1)∈S(状态空间), A_(t +1) ∈ A(行动空间), R_(t +1), R_t ∈ R(报酬空间), p 定义过程的动态, G_t 为贴现收益。
简而言之,MDP 定义了转换到一个新状态的概率,在给定当前状态和执行一个动作的情况下获得一些奖励。这个框架在数学上令人满意,因为它是一阶马尔可夫链。这只是一种奇特的说法,即接下来发生的任何事情都只取决于现在,而不是过去。只要你做到了,你如何到达当前状态并不重要。这个框架的另一个重要部分是贴现因子 γ 。随着时间的推移,将这些回报与来自未来的回报的不同程度的重要性相加,导致了贴现回报的概念。正如人们所料,较高的 γ 会导致对未来回报的更高敏感度。而 γ =0 的极端情况,完全不考虑来自未来的奖励。
环境 p 的动态在代理的控制之外。为了内化这一点,想象一下站在一个有风的环境中的一块地上,每秒钟向四个方向中的一个方向迈一步。风是如此之大,以至于你很难朝着与北、东、西或南完全一致的方向前进。这种下一秒降落在新状态的概率是由风场的动力学 p 给出的。这当然不是你(代理人)能控制的。
然而,如果你以某种方式理解了环境的动态,并朝着除了东、西、南、北之外的方向移动,那该怎么办呢?这个策略就是代理控制的。当一个代理遵循一个策略 π 时,它生成一系列的状态、动作和奖励,称为轨迹。
策略:策略被定义为给定状态下动作的概率分布
记住所有这些定义,让我们看看 RL 问题的形式。
政策梯度
强化学习代理的目标是在遵循策略 π 时最大化“预期”回报。像任何机器学习设置一样,我们定义了一组参数 θ (例如,复杂多项式的系数或神经网络中单元的权重和偏差)来参数化该策略— π_θ (为了简洁,也写为 π )。如果我们用 r ( τ )来表示给定轨迹 τ 的总回报,我们会得到下面的定义。
强化学习目标:遵循参数化策略,最大化“预期”回报
所有有限 MDP 至少有一个最优策略(能给出最大回报),并且在所有最优策略中,至少有一个是稳定的和确定的。
像任何其他机器学习问题一样,如果我们能找到使 J 最大化的参数 θ ⋆,我们就解决了这个任务。在机器学习文献中,解决这种最大化问题的标准方法是使用梯度上升(或下降)。在梯度上升中,我们使用以下更新规则来逐步通过参数
挑战来了,我们如何找到上面包含期望的目标的梯度。积分在计算环境中总是不好的。我们需要找到绕过它们的方法。第一步是从期望值的扩展开始重新制定梯度(稍微滥用符号)。
保单梯度定理:期望报酬的导数是保单对数的报酬与梯度乘积的期望 π_θ 。
现在,让我们扩展一下 π_θ ( τ )的定义。
为了理解这个计算,让我们把它分解一下——P 代表在某个状态下开始的遍历分布 s_ 0。从那时起,我们应用概率的乘积法则,因为每个新的行动概率都独立于前一个(还记得马尔科夫吗?).在每一步,我们使用策略πθ和环境动力学 p 来采取一些行动,以决定转换到哪个新状态。这些乘以代表轨迹长度的 T 时间步长。相当于,取日志,我们有
这个结果本身就很漂亮,因为它告诉我们,我们不需要知道状态 P 的遍历分布,也不需要知道环境动力学 p 。这是至关重要的,因为对于大多数实际目的来说,很难对这两个变量建模。摆脱他们,当然是好的进步。因此,所有使用这个结果的算法都被称为“无模型算法”,因为我们没有对环境进行“建模”。
“期望”(或者相当于一个积分项)仍然存在。一个简单但有效的方法是对大量轨迹进行采样(我真的是指大量!)然后平均一下。这是一种近似,但却是无偏的,类似于用区域中的一组离散点来近似连续空间上的积分。这种技术在形式上被称为马尔可夫链蒙特卡罗(MCMC),广泛用于概率图形模型和贝叶斯网络中以近似参数概率分布。
在我们上面的讨论中,有一项没有涉及到,那就是轨迹 r ( τ )的回报。尽管参数化政策的梯度不依赖于报酬,但这一项在 MCMC 抽样中增加了许多方差。实际上,有 T 个方差源,每个 R_t 都有贡献。然而,我们可以利用回报 G_t ,因为从优化 RL 目标的角度来看,过去的回报没有任何贡献。因此,如果我们用贴现回报 G_t 代替 r ( τ ),我们就得到经典算法策略梯度算法,称为加强。当我们进一步讨论时,这并不能完全缓解问题。
强化(和基线)
再次重申,增强算法计算策略梯度的方式如下
加固坡度
我们仍然没有解决采样轨迹的方差问题。认识到这个问题的一个方法是重新设想上面定义的 RL 目标为似然最大化(最大似然估计)。在 MLE 设置中,众所周知,数据压倒了先验——换句话说,无论初始估计多么糟糕,在数据的限制下,模型都会收敛到真实参数。然而,在数据样本具有高方差的设置中,稳定模型参数可能是众所周知的困难。在我们的背景下,任何不稳定的轨迹都可能导致政策分配的次优转变。奖励的规模加剧了这个问题。
因此,我们试图通过引入另一个称为基线 b 的变量来优化报酬差异。为了保持梯度估计的无偏性,基线独立于政策参数。
用基线加固
要了解原因,我们必须表明,随着附加项的增加,梯度保持不变(略有滥用符号)。
在理论和实践中,使用基线可以减少方差,同时保持梯度不偏不倚。一个好的基线是使用状态值当前状态。
状态值:状态值定义为给定一个状态遵循策略 π_θ 的期望收益。
演员-评论家方法
找到一个好的基线本身是另一个挑战,计算它又是另一个挑战。相反,让我们用参数 ω 来近似计算 V^ω_ ( s )。我们使用可学习的 V^ω_ ( s )引导梯度的所有算法都被称为行动者-批评家算法,因为这个价值函数估计的行为就像一个“批评家”(好的 v/s 坏的值)到“行动者”(代理的策略)。然而这一次,我们必须计算演员和评论家的梯度。
单步 Bootstrapped Return :单步 Bootstrapped Return 获取直接回报,并通过使用轨迹中下一个状态的 bootstrapped value-estimate 来估计回报。
演员-评论家政策梯度
不言而喻,我们还需要更新评论家的参数 ω 。这里的目标通常是均方损失(或不太苛刻的 Huber 损失)和使用随机梯度下降更新的参数。
评论家的目标
确定性政策梯度
通常,在机器人学中,可微分的控制策略是可用的,但是动作不是随机的。在这种环境下,很难像以前那样建立随机政策。一种方法是将噪声注入控制器。此外,随着控制器维数的增加,以前看到的算法性能开始变差。由于这种情况,让我们直接学习给定状态的确定性动作,而不是学习大量的概率分布。因此,最简单的形式,贪婪的最大化目标是我们所需要的
确定性动作
然而,对于大多数实际目的来说,这种最大化操作在计算上是不可行的(因为除了搜索给定动作值函数的整个空间之外没有其他方法)。相反,我们可以渴望做的是,建立一个函数近似器来近似这个 argmax ,因此被称为确定性政策梯度 (DPG)。
我们用下面的等式来总结这个。
DPG 目标
确定性政策梯度
这个值变成了另一个期望值,我们可以使用 MCMC 采样再次估算,这应该不足为奇了。
通用强化学习框架
我们现在可以得出一个通用算法,看看我们所学的所有部分在哪里组合在一起。所有新算法通常是下面给出的算法的变体,试图攻击问题的一个(或多个)步骤。
密码
对于熟悉 Python 的读者来说,这些代码片段是对上述理论思想的更具体的表达。这些都是从真实代码的学习循环中提取出来的。
政策梯度(同步行动者-批评家)
深度确定性政策梯度
完成实施
可在activatedgeek/torch rl查看完整流水线的完整模块化实现。
参考
**【萨顿和巴尔托,1998】**萨顿,R. S .和巴尔托,A. G. (1998)。强化学习导论。麻省理工学院出版社,美国马萨诸塞州剑桥,第一版。
**【迪米特里,2017】**迪米特里,P. B. (2017)。动态规划与最优控制。雅典娜科学
**【Lilli crap 等人,2015】**Lilli crap,T. P .、Hunt、J. J .、Pritzel,a .、Heess,n .、Erez,t .、Tassa,y .、Silver,d .和 Wierstra,D. (2015)。深度强化学习的连续控制。ArXiv 电子印花。
**【沃特金斯和达扬,1992】**沃特金斯,C. J. C. H .和达扬,P. (1992)。q-学习。机器学习,8(3):279–292。
**【威廉姆斯,1992】**威廉姆斯,R. J. (1992)。联结主义强化学习的简单统计梯度跟踪算法。强化学习,第 5-32 页。斯普林格。
**【西尔弗等人,2014】**西尔弗,d .,利弗,g .,赫斯,n .,德格里斯,t .,维斯特拉,d .,里德米勒,M. (2014)。确定性策略梯度算法。Xing,E. P .和 Jebara,t .编辑,第 31 届机器学习国际会议论文集,机器学习研究论文集第 32 卷,第 387-395 页,北京,中国。PMLR。
本文原载此处。