使用张量流的 LSTM 示例
在深度学习中,递归神经网络(RNN)是一个神经网络家族,擅长从序列数据中学习。已经找到实际应用的一类 RNN 是长短期记忆(LSTM ),因为它对长期依赖的问题是稳健的。解释 LSTM 的文章和参考资料并不缺乏。推荐的两个参考文献是:
Goodfellow 等人的《深度学习》一书的第十章。艾尔。
也不缺乏好的库来构建基于 LSTM 的机器学习应用。在 GitHub 中,谷歌的 Tensorflow 在撰写本文时已经有超过 50,000 颗星,这表明它在机器学习从业者中非常受欢迎。
似乎缺少的是关于如何基于 LSTM 构建易于理解的 Tensorflow 应用程序的良好文档和示例。这是这篇文章背后的动机。
假设我们想训练 LSTM 使用一个简单的小故事伊索寓言来预测下一个单词:
很久以前,老鼠们开了一个全体会议,考虑采取什么措施来智取它们共同的敌人——猫。有些人这样说,有些人那样说,但最后一只年轻的老鼠站起来说,他有一个建议,他认为会满足的情况。你们都会同意,他说,我们的主要危险在于敌人向我们逼近的狡猾和奸诈的方式。现在,如果我们能收到一些她接近的信号,我们就能轻易地逃离她。因此,我斗胆提议买一个小铃铛,用丝带系在猫的脖子上。通过这种方式,我们应该总是知道她在哪里,当她在附近时,我们可以很容易地退休。这个提议得到了普遍的掌声,直到一只老老鼠站起来说,这一切都很好,但是谁来给猫系上铃铛呢?老鼠们面面相觑,谁也不说话。然后老老鼠说,很容易提出不可能的补救措施。
清单 1。一个来自伊索寓言的小故事,有 112 个独特的符号。单词和标点符号都被认为是符号。
如果我们将来自 3 个符号作为输入和 1 个标记符号的文本的正确序列输入给 LSTM,最终神经网络将学会正确预测下一个符号(图 1)。
图一。具有三个输入和一个输出的 LSTM 单元。
从技术上讲,LSTM 输入只能理解实数。将符号转换为数字的一种方法是根据出现的频率为每个符号分配一个唯一的整数。例如,在上面的文本中有 112 个独特的符号。清单 2 中的函数用以下条目构建了一个字典[“,”:0 ] [ “the” : 1 ],…,[ “council” : 37 ],…,[ “spoke” : 111 ]。还生成反向字典,因为它将用于解码 LSTM 的输出。
**def** build_dataset(words):
count = collections.Counter(words).most_common()
dictionary = dict()
**for** word, _ **in** count:
dictionary[word] = len(dictionary)
reverse_dictionary = dict(zip(dictionary.values(), dictionary.keys()))
**return** dictionary, reverse_dictionary
清单 2。建立字典和反向字典的功能。
类似地,预测是唯一的整数,标识预测符号的反向字典中的索引。比如预测是 37,预测的符号其实是“理事会”。
输出的生成听起来可能很简单,但实际上 LSTM 为下一个由 softmax()函数归一化的符号生成一个 112 元素的预测概率向量。具有最高概率的元素的索引是符号在反向字典中的预测索引(即一个热码向量)。图 2 显示了这个过程。
图二。每个输入符号被其分配的唯一整数替换。输出是识别反向字典中预测符号的索引的独热向量。
该应用程序的核心是 LSTM 模型。令人惊讶的是,在 Tensorflow 中实现非常简单:
**def** RNN(x, weights, biases):
*# reshape to [1, n_input]* x = tf.reshape(x, [-1, n_input])
*# Generate a n_input-element sequence of inputs
# (eg. [had] [a] [general] -> [20] [6] [33])* x = tf.split(x,n_input,1)
*# 1-layer LSTM with n_hidden units.* rnn_cell = rnn.BasicLSTMCell(n_hidden)
*# generate prediction* outputs, states = rnn.static_rnn(rnn_cell, x, dtype=tf.float32)
*# there are n_input outputs but
# we only want the last output* **return** tf.matmul(outputs[-1], weights[**'out'**]) + biases[**'out'**]
清单 3。具有 512 单位 LSTM 单元的模型
最棘手的部分是以正确的格式和顺序输入。在这个例子中,LSTM 以 3 个整数的序列为食(例如 int 的 1x3 向量)。
常数、权重和偏差是:
vocab_size = len(dictionary)
n_input = 3*# number of units in RNN cell* n_hidden = 512*# RNN output node weights and biases* weights = {
**'out'**: tf.Variable(tf.random_normal([n_hidden, vocab_size]))
}
biases = {
**'out'**: tf.Variable(tf.random_normal([vocab_size]))
}
清单 4。常数和训练参数
在训练过程中,在每一步,从训练数据中检索 3 个符号。这 3 个符号被转换成整数以形成输入向量。
symbols_in_keys = [ [dictionary[ str(training_data[i])]] **for** i **in** range(offset, offset+n_input) ]
清单 5。符号到 int 的向量作为输入
训练标签是来自 3 个输入符号之后的符号的独热向量。
symbols_out_onehot = np.zeros([vocab_size], dtype=float)
symbols_out_onehot[dictionary[str(training_data[offset+n_input])]] = 1.0
清单 6。一键向量作为标签
在重新调整以适合提要字典后,优化运行:
_, acc, loss, onehot_pred = session.run([optimizer, accuracy, cost, pred], feed_dict={x: symbols_in_keys, y: symbols_out_onehot})
清单 7。训练步骤优化
累积准确度和损失以监控训练的进度。50,000 次迭代通常足以达到可接受精度。
...
Iter= 49000, Average Loss= 0.528684, Average Accuracy= 88.50%
['could', 'easily', 'retire'] - [while] vs [while]
Iter= 50000, Average Loss= 0.415811, Average Accuracy= 91.20%
['this', 'means', 'we'] - [should] vs [should]
清单 8。每次训练的样本预测和准确性数据(1000 步)
成本是使用 RMSProp 以 0.001 的学习率优化的 label 和 softmax()预测之间的交叉熵。在这种情况下,RMSProp 的性能通常优于 Adam 和 SGD。
pred = RNN(x, weights, biases)
*# Loss and optimizer* cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
optimizer = tf.train.RMSPropOptimizer(learning_rate=learning_rate).minimize(cost)
清单 9。损失和优化器
LSTM 的精确度可以通过附加层来提高。
rnn_cell = rnn.MultiRNNCell([rnn.BasicLSTMCell(n_hidden),rnn.BasicLSTMCell(n_hidden)])
清单 10。改进的 LSTM
现在,有趣的部分。让我们通过反馈预测的输出作为输入中的下一个符号来生成一个故事。这个示例输出的输入是“had a general ”,它预测正确的输出是“council”。“理事会”作为新输入的一部分反馈给“总理事会”,以预测新的输出“到”,以此类推。令人惊讶的是,LSTM 创造了一个莫名其妙的故事。
had a general council to consider what measures they could take to outwit their common enemy , the cat . some said this , and some said that but at last a young mouse got
清单 11。示例故事生成的故事。被截断为最多 32 个预测。
如果我们输入另一个序列(例如“老鼠”,“老鼠”,“老鼠”),但不一定是故事中的序列,另一个叙事就会自动产生。
mouse mouse mouse , neighbourhood and could receive a outwit always the neck of the cat . some said this , and some said that but at last a young mouse got up and said
清单 12。故事中找不到带有序列的输入。
最终注释:
- 使用 int 对符号进行编码很容易,但是单词的“含义”却丢失了。Symbol to int 用于简化关于使用 Tensorflow 构建 LSTM 应用程序的讨论。Word2Vec 是将符号编码为矢量的更优方式。
- 输出的一键向量表示是低效的,尤其是当我们有一个真实的词汇量时。牛津词典有超过 17 万个单词。上面的例子有 112 个。同样,这只是为了简化讨论。
- 这里使用的代码是受 Tensorflow-Examples 的启发。
- 本例中的输入数是 3,看看使用其他数字(例如 4、5 或更多)时会发生什么。
- 每次运行代码可能会产生不同的结果和预测能力,因为准确性取决于参数的初始随机值。更高的训练步数(超过 150,000)可以获得更好的精度。预计每次运行也会有不同的字典。
- Tensorboard 在调试中非常有用,尤其是在判断代码是否正确构建了图形时。
- 尝试使用另一个故事,尤其是使用不同的语言。
LSTM——实际应用的金块
keras functional API 中的代码示例
什么是 LSTM?
LSTM 代表长短期记忆,意思是短期记忆在长时间内保持在 LSTM 细胞状态。LSTM 通过克服 simpleRNN 架构中典型的消失梯度问题实现了这一点。
LSTM 的记忆单位和细胞状态是什么?
LSTMs 是递归网络,其中每个神经元由一个 存储单元 代替。存储单元包含一个具有循环自连接的实际神经元。记忆单元内那些神经元的激活被称为 LSTM 网络的 细胞状态 。
那么 LSTM 是如何维持其细胞状态和隐藏状态的呢?
随着更多的新信息输入到 LSTM,LSTM 的门控结构允许它学习三个基本的东西(即,在每个时间步,存储单元接收来自其他存储单元的输入,并计算以下内容)
Cell state of LSTM
- 需要保留的记忆(即,保留多少神经元先前的激活)。该信息在 单元状态 中更新
- 由于新信息的到来,它的内存需要更新多少(也就是说——将多少输入转发给实际的神经元——注意,这些信息也在 细胞状态 中得到更新
Hidden state computed from its cell state
- 下一个时间步需要读取多少内存(也就是说,需要输出多少激活)。正如我们从下图中看到的,我们计算内存单元的输出,方法是获取其状态,应用激活函数,然后将结果乘以表示输出多少激活的输出门。来自所有存储单元的输出向量是 LSTM 网络的输出。这就是通常所说的LSTM 的隐藏状态。 简单来说——细胞状态和隐藏状态不过是利用神经元的权重、偏置和激活计算出来的向量。
GRU ( outputs its memory state directly)
顺便提一下,在类似的 GRU 网络中,存储单元直接输出它们的状态。
我们在定义 LSTM 时指定的超参数是 存储单元数量(也称为单元大小) 。
我们可以在任何时间步长从 LSTM 获得以下输出——当前单元格状态、当前隐藏状态及其当前隐藏状态作为其当前输出。我们在 Keras 中这样做的方法是指定—
- return_states = True 用于获取单元格状态和隐藏状态
- return_sequences = True 用于获取当前时间步的输出
some_LSTM = LSTM(256,return_sequences=True,return _ state = True) 输出,隐藏 _ 状态,单元格 _ 状态 = some_LSTM(输入)
要送入 LSTM 的输入数组应该是三维的。让我们在将几行句子输入到 LSTM 的上下文中来看这个问题,其中每个句子都是单词的集合,句子的大小可以是固定的/可变的。
- 第一个维度是我们语料库中的句子数量。
- 第二维指定时间步长的数量。在这种情况下,时间步长可以被视为特定句子中的单词数*(假设每个单词都被转换为一个向量)。否则可以是句子中的字符数(假设每个字符都转换成一个向量)*。还要注意,这可以是固定长度或可变长度,因为每个句子可以有不同数量的单词/字符。我们可以通过在任何需要的地方用零填充所有的序列来使这个长度固定。
- 第三维指定特征的数量。例如,它可以是语料库中的单词数,或者在我们进行字符级翻译的情况下,它可以是字符数。
但是当我们定义 LSTM 的输入形状时,我们只将其定义为 2D,而不是 3D — 我们没有指定样本的数量或批次大小 。我们只指定时间步长的数量和特征的数量。在 keras 中,我们将其定义为—
- 输入(shape=(nb_timesteps,nb_features))。如上所述,nb_timesteps 可以对应于输入数组的固定或可变序列长度。如果我们希望它是一个可变长度,那么我们指定这个为 None。 那样的话,就要 输入(shape=( None ,nb_features))。
当时间步长的数量为 无、 时,LSTM 将动态展开时间步长,直到到达序列的末尾。这是典型的涉及编码器-解码器网络的神经机器翻译架构。
我们可以在输入时用初始状态初始化 LSTM。这也是典型的编码器-解码器架构,其中解码器 LSTM 需要用最终的编码器单元状态和隐藏状态进行初始化。在这种情况下,我们将 intial_state 参数与输入一起传递。
- 解码器 _LSTM(解码器 _ 输入,初始 _ 状态=编码器 _ 状态)
琉米爱尔伦敦 2018(第三部分):计算机视觉
第三部分:用计算机视觉分析 5000 张 Flickr 图片
介绍
在这一系列的最后一篇博客文章中,我应用计算机视觉技术来理解 5000 张关于琉米爱尔伦敦 2018 的 Flickr 图像,这是今年 1 月初在伦敦举行的一场大型灯光节。
在 2018 年伦敦琉米爱尔展期间,53 位艺术家的 50 多件公共艺术品在伦敦的六个区展出,为期四天,从 1 月 18 日星期四到 1 月 21 日星期日,超过 100 万人参加了这个节日!
在本系列的第二部分和第一部分中,我展示了自然语言处理和对 11000 条关于这个节日的推文的探索性数据分析。
本文的目的是使用计算机视觉分析来理解我从 Flickr 上传的 5000 张图片,并把它们放在上下文中。
请向下滚动查看分析!
An image of Lumiere London 2018. Source: Flickr
数据和方法
使用 Flickr API ,它使用起来相当简单,我收集了包含文本“琉米爱尔伦敦”的图像,这些图像是在 2018 年 1 月 1 日至 4 月 1 日之间上传到 Flickr 上的。总共有 5047 张图片。
然后,使用谷歌云的视觉 API 提取每张图像的标签。Cloud Vision API 利用“谷歌庞大的机器学习专业知识网络”(g reat article 作者 Sara Robinson )来检测图像的特征和标签。总共,5047 张图片被赋予了 487 个不同的标签。
被称为特征提取和反向图像搜索的机器学习技术然后使用基因科岗的代码来基于视觉相似性找到图像。首先,使用预训练的卷积神经网络来提取每幅图像的“特征”,然后,计算这些特征的余弦相似度,以“搜索”少量与查询图像相似的图像。
特征在计算机视觉中的主要作用是“将视觉信息转换到向量空间”。相似的图像应该产生相似的特征,我们可以利用这些特征进行信息检索。基于这些特征,我们还可以通过使用一种叫做 t-SNE 的方法来对图像进行相似性聚类。
An image of Lumiere London 2018. Source: Flickr
图像分析
在这一节中,我将展示我的计算机视觉分析的结果。下面,我报告以下三个指标:
- 图像的标签检测;
- 基于视觉相似性的图像搜索:
- 基于视觉相似性的图像聚类。
标签检测
每张照片的标签都是使用谷歌云视觉 API 生成的。这背后的想法是将图片分类,这样我就可以识别相似的图片。下面的条形图显示了 5,000 幅图像的前 10 个标签。
我们看到“夜”和“光”出现的次数最多。这些标签很有意义,因为这是一个灯光装置的夜晚节日!然而,它们没有明确描述艺术品本身,这突出了一些标签检测技术的缺点。
Figure 1: label count of 5,000 images of Lumiere London 2018. Source: Flickr
为图像生成标签在各种其他应用程序中非常有用,例如训练机器学习模型或构建推荐系统,但对于这篇文章来说,它们没有那么有用。
不可否认,我没有最大限度地使用 vision API 这篇由 Sara Robinson 撰写的文章突出了 API 的许多伟大特性——这可能是因为调用 API 是有成本的!
图像搜索—视觉相似度
我们可以通过编程让计算机学习图像之间的视觉相似性,而不是使用标签来理解图像。一种叫做特征提取和反向图像搜索的技术就是这样做的。
使用在 TensorFlow 后端上运行的 Keras VGG16 神经网络模型,我首先为数据集中的每张图像提取了一个特征。一个特征是每个图像的 4096 元素的数字数组。我们的期望是“该特征形成图像的非常好的表示,使得相似的图像将具有相似的特征”(吉恩·科岗,2018 )。
然后使用主成分分析(PCA)降低特征的维度,以创建一个嵌入,然后计算一个图像的 PCA 嵌入到另一个图像的距离余弦距离。我终于能够向计算机发送随机查询图像,它选择并返回数据集中具有相似特征向量的五个其他图像。
下面是三个例子:
A reverse image search for Reflecktor by Studio Roso at Lumiere London 2018
A reverse image search for Illumaphanium by Michael David and Cosmoscope by Simeon Nelson at Lumiere London 2018
当试图从一个有一百万张图片的相册中找到相似的图片时,这种技术非常有用!
图像聚类—相似性
既然我们在向量空间中嵌入了每个图像,我们可以使用一种流行的叫做 t-SNE 的机器学习可视化算法来聚类,然后在二维空间中可视化向量空间。
“tSNE 的目标是聚集相似数据点的小“邻域”,同时减少数据的整体维度,以便更容易可视化”(谷歌人工智能博客,2018 年)
下面我们看到基于视觉相似性的聚类形成。
The clustering of images of Lumiere London 2018. Source: Flickr
在下图中,我重点展示了三件艺术品——圣詹姆斯教堂的克里斯·普兰特的 Harmonic Portal,粮仓广场的金奎大·鲁斯加德的 Waterlicht,威斯敏斯特教堂的帕特里斯·沃伦纳的The Light of The Spirit——以及它们的集群剖面。
The clustering of images of three art installations at Lumiere London 2018. Source: Flickr
结论
所以你有它!我只是刚刚涉足计算机视觉的奇妙世界。还有很多东西需要我去学习,但这对我来说是很好的第一步。
我的发现表明,使用机器学习和计算机视觉技术来理解和联系琉米爱尔伦敦 2018 灯光节的图像是可能的。
对我来说,下一步显然是计算在数据集中出现了多少艺术装置,以衡量“受欢迎程度”。我将继续研究这个数据集。
An image of Lumiere London 2018. Source: Flickr
结束了!
这是我关于琉米爱尔伦敦 2018 系列博客的结尾!这个系列是我正在进行的关于使用数据科学来理解和衡量城市文化影响的长期讨论的一部分。
明年,我将开始新的项目,在那里我将主要使用 JavaScript。敬请期待!
感谢阅读!
Vishal
Vishal 是伦敦 UCLThe Bartlett的文化数据科学家和研究生。他对城市文化的经济和社会影响感兴趣。
演示中的登月
深度强化学习算法在许多问题上取得了显著的成果,这些问题曾经被认为在没有人类直觉和创造力的帮助下无法解决。RL 代理可以在没有任何事先指导的情况下学习掌握像象棋和复古视频游戏这样的任务——通常超过甚至最伟大的人类专家的表现。但是这些方法效率很低,并且依赖于在取得任何进展之前从数百甚至数千次完全失败中学习。当任务简单或可以模拟时,这是我们可以负担得起的奢侈品,如 Atari 屏幕或棋盘,但至少是 RL 相对较短的现实世界应用程序列表的部分原因。例如,让自动驾驶算法通过将一辆真正的汽车撞上一堵真正的墙来学习,可能需要 1000 次迭代才能弄清楚刹车的作用,或者通过撞毁前 500 次来学习着陆火箭,这将是极其危险、昂贵和时间效率低下的。
如果我们能够快速度过灾难性失败的早期阶段,让代理从第一次尝试就开始在真实世界中学习,那就太好了。一种方法是让代理在任务的模拟版本中度过它的失败阶段,其中它的行为不会产生后果。这很好,但大多数应用程序没有完美的模拟器,将学习从简化的类似游戏的环境转移到现实世界会带来许多问题(源于神经网络没有我们喜欢给它们的信用那样好的概括,并且经常不能理解两个领域之间的微妙差异)。然而,许多任务确实有近乎完美的控制者的例子——一个可以提供演示数据来指导代理尽早并经常成功的专家。
这就是 深度 Q-示范学习 中给出的解决方案。他们的算法是一种叫做 DQfD 的深度 Q 网络(DQN)的模仿学习变体。
DQfD 的工作原理是在标准 TD 误差的基础上增加一个模拟损耗。在预训练 *阶段,*代理从专家的演示中取样转换,并被激励在任何给定状态下复制专家的动作。
The large-margin classification loss used to push the agent’s actions towards the expert. l(ae, a) is a zero matrix with positive entries where the agent chooses an action that the expert did not recommend.
一旦预训练完成,代理开始自己与环境交互,生成自己的转换并探索更大的状态空间。因此,损失是监督、单步和n-步 TD 误差的组合。这是这项技术相对于其他模仿学习方法的真正优势;大多数模仿者只是希望成为演示者的淡化版本,但 DQfD 将学习加速到专家的水平,然后利用标准 DQN 的成功,试图超越这一基准。
代理将自己的经验和专家的经验一起存储在重放缓冲区中,使用优先经验重放来使演示的权重高于自己的数据。在每一个训练步骤中,它都按照优先级进行采样,确保将自生成过渡的模仿损失设置为 0。当重放缓冲区填满时,它只覆盖自己的数据,而演示则保持不变。
示例:月球着陆器中更安全的初始控制
我们可以用一个玩具问题来思考这个研究方向可能产生的潜在影响。
LunarLander-v2
LunarLander Gym 环境要求一个装备有主、左、右侧引擎的航天器在一个被随机生成的地形包围的目标区域着陆。状态空间是连续的,是ℝ⁸中的一个向量,有一个离散的动作空间{什么都不做,左引擎,右引擎,主引擎}。回报是到目标的距离、速度和燃油消耗的函数,着陆成功或不成功都有一个正(或负)常数。
起动性能
这里的想法是使用可用于训练新的 ML 代理的专家控制器,并且在大多数真实世界应用中,这将意味着使用人类专家。但它也可能是另一个人工代理,在这种情况下,是一个优先双决斗(PDD) DQN 给予足够的时间来训练:
Prioritized Double Dueling performance over the first 15k episodes. Note that the reward is modified from the raw environment using a log scale that overcomes some of the shortcomings of DQN’s reward clipping approach. (See the DQfD paper for details).
虽然它的最终性能可能足够好,但 PDD DQN 花费了前几千次尝试将着陆器粉碎。这是处于试错优化问题核心的探索/开发冲突的产物。该实验使用了一种e-贪婪方法,该方法将贪婪(当前最佳)行为的概率指定为:
Where |A(s)| is the size of the action space
根据以下因素选择次优措施:
这保证了探索…和彻底的失败。这就是演示数据如此有价值的原因:DQfD 可以快速了解专家的政策,而无需自己去摸索。代替从 1.0 开始的退火的ε值,我们可以使用一个仅仅 0.01 的常量值,这让它探索刚好足以超过演示者的性能。
DQfD 从它与“真实”环境的第一次交互中成功着陆——绕过了伴随成千上万次重复失败而来的所有障碍。预训练阶段的采样效率也非常高:初始差距是在大约 50k 的演示样本上仅进行 15k 预训练步骤的结果。即使是雅达利上使用的大型卷积网络,也只需要 750k 步。
DQfD in action
这种方法带来的一个挑战是,在预训练过程中,演示内容往往会过多。此时,网络开始牺牲其在整个输入空间中进行归纳的能力,以支持训练集中特定示例的高准确性。从语音识别到语言建模和图像分类,这几乎是每个监督学习应用中的一个问题。显而易见的答案是扩大训练集,在大数据世界中,大多数时候这就像听起来那么简单。但是我们不太可能有同样源源不断的数据用于模仿学习,尤其是当我们需要人类示范者的时候;这些数据并不便宜。DQfD 必须找到另一个答案,这是一个精心调整的数量 l2 正则化,惩罚大的权重变化,以努力防止网络在演示集的损失中追逐每个局部最小值。
l2 regularization over the first 15K episodes
这里,调整正则化项,而其他超参数是固定的。高系数导致不适合,损害初始性能并减缓/破坏整体学习进度,而适当调整的值让网络紧密结合演示数据,而不会在有机会驾驶着陆器时崩溃。
样品效率和难探索问题
Pretraining length makes almost no difference on a problem of this difficulty; DQfD learns the expert’s actions in as few as 15 thousand steps.
月球着陆器是使用 DQfD 几乎瞬间解决相对简单的探索问题的一个例子,但它也可以用于在真正的回报信号很少时通过给网络一些东西来最小化,从而在传统方法无望的问题上取得进展。这实际上是这篇文章的主要焦点,在像 Pitfall 这样的游戏上运行测试!和英雄。事实上,一种更先进的算法叫做 Ape-X DQfD 是第一个完成著名的艰苦探索游戏蒙特祖马的复仇的 RL 代理。
(Video originally posted here on YouTube)
( 有趣读一读有多大关系 )
这种 TD/模仿混合技术的另一个影响是它加速训练周期的能力。预训练阶段可以从每次训练中节省数百万个时间步和几个 GPU 小时,这将超过超参数网格搜索或扫描大型问题集(就像 ALE 中的所有 60 款 Atari 游戏)。例如,论文发现,在他们测试的 Atari 游戏上,DQfD 比 DQN 节省了大约8300 万帧。
DQfD saving millions of timesteps in Asteroids
一个足够大的重放缓冲区将把模仿损失推到接近 0,基本上将 DQfD 降低到一个超采样效率的 DQN。DeepMind 甚至表明,该算法可以快速启动人类演示,并且仍然足够灵活,可以转向它从零开始时会发现的非人类策略——这意味着这种方法甚至可以在已知演示者的策略不太完美的情况下工作。
Agents typically beat Road Runner using a very non-human gameplay strategy. DQfD uses human demonstrations to increase learning speed, but is still able to find that ‘exploit’. (Demo data average was ~20k.)
你也可以让重放缓冲覆盖演示,在这种情况下,你会有一个更复杂版本的重放缓冲峰值技术。
你可以在 Github 上访问这个项目的源代码。
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
弗吉尼亚大学骑士机器学习
M2M 第 185 天:我试图直观地解释自动驾驶汽车算法是如何工作的
这篇文章是为期 12 个月的加速学习项目月掌握的一部分。今年五月,我的目标是打造无人驾驶汽车的软件部分。
昨天,我想出了如何在道路的前向图像中识别车道线。嗯……我至少知道了如何运行能做到这一点的代码。
The output from yesterday
老实说,我不明白代码实际上是如何工作的,所以今天我试图改变这一点。
下面是我昨天使用的主要代码块。特别是,我复制了主要的函数,这个函数叫做**“draw _ lane _ lines”**。基本上,函数是一个代码块,它接受一些输入(在本例中是一张照片),以某种方式操作输入,然后输出操作(在本例中是车道线)。
这个主函数使用了一些在代码中其他地方定义的其他辅助函数,但是这些辅助函数大多只是使用我昨天下载的库中的预制函数(例如 OpenCV)的稍微干净的方式。
def draw_lane_lines(image): imshape = image.shape
** # Greyscale image**
greyscaled_image = grayscale(image)
**# Gaussian Blur**
blurred_grey_image = gaussian_blur(greyscaled_image, 5)
** # Canny edge detection**
edges_image = canny(blurred_grey_image, 50, 150)
**# Mask edges image**
border = 0
vertices = np.array([[(0,imshape[0]),(465, 320), (475, 320),
(imshape[1],imshape[0])]], dtype=np.int32)
edges_image_with_mask = region_of_interest(edges_image,
vertices)
**# Hough lines**
rho = 2
theta = np.pi/180
threshold = 45
min_line_len = 40
max_line_gap = 100
lines_image = hough_lines(edges_image_with_mask, rho, theta,
threshold, min_line_len, max_line_gap) **# Convert Hough from single channel to RGB to prep for weighted**
hough_rgb_image = cv2.cvtColor(lines_image, cv2.COLOR_GRAY2BGR)
**# Combine lines image with original image**
final_image = weighted_img(hough_rgb_image, image)
return final_image
粗体注释是对图像处理流水线主要部分的描述,这基本上意味着这是为了输出车道线而对输入图像顺序执行的七个操作。
今天,我的目标是了解这七个步骤中的每一个都做了什么,以及为什么要使用它们。
实际上,我只关注前五个,它们输出车道线的数学表示。最后两个操作只是创建了视觉效果,因此我们人类可以在视觉上欣赏数学(换句话说,当自动驾驶汽车实际消耗输出的数据时,这些步骤是不必要的)。
因此,基于我今天的研究,我现在将试图解释以下图像处理事件的顺序:输入图像→ 1。灰度图像,2。高斯模糊,3。Canny 边缘检测,4。遮罩边缘图像,5。霍夫线→车道线输出
输入图像
这是开始的输入图像。
重要的是要记住,图像只不过是一堆排列成矩形的像素。这个特殊的矩形是 960 像素乘 540 像素。
每个像素的值是红色、绿色和蓝色的某种组合,由三个一组的数字表示,其中每个数字对应一种颜色的值。每种颜色的值可以从 0 到 255,其中 0 表示完全没有颜色,255 表示 100%强度。
例如,白色表示为(255,255,255),黑色表示为(0,0,0)。
因此,这个输入图像可以用 960 x 540 = 518,400 个三元组数字来描述,范围从(0,0,0)到(255,255,255)。
现在这个图像只是一个数字的集合,我们可以开始使用 math 以有用的方式操作这些数字。
1.灰度图像
第一个处理步骤是将彩色图像转换为灰度,有效地将彩色空间从三维降级为一维。只在一维上操作图像更容易(也更有效):这一维是像素的“暗度”或“强度”,0 代表黑色,255 代表白色,126 代表某种中间灰色。
凭直觉,我认为灰度过滤器只是一个将红色、蓝色和绿色值平均在一起得到灰度输出的函数。
举个例子,这是原始照片中天空的颜色:
它可以在 RGB(红、绿、蓝)空间中表示为(120,172,209)。
如果我将这些值平均在一起,我得到(120 + 172 + 209)/3 = 167,或者灰度空间中的这个颜色。
但是,事实证明,当我使用上述函数将这种颜色转换为灰度时,实际输出的颜色是 164,这与我使用简单的平均方法生成的颜色略有不同。
虽然我的方法本身并不“错误”,但常用的方法是计算一个更符合我们眼睛感知颜色的加权平均值。换句话说,由于我们的眼睛有比红色或蓝色受体更多的绿色受体,绿色的值应该在灰度函数中占更大的权重。
一种常见的方法,称为色度转换,使用这种加权和: 0.2126 红色+ 0.7152 绿色+ 0.0722 蓝色。
通过灰度过滤器处理原始图像后,我们得到以下输出…
2。高斯模糊
下一步是模糊图像使用高斯模糊。
通过应用轻微的模糊,我们可以从图像中移除最高频率的信息(也就是噪声),这将为我们提供“更平滑”的颜色块,以便我们进行分析。
同样,高斯模糊的基本数学是非常基本的:模糊只是取更多像素的平均值(这种平均过程是一种类型的内核卷积,对于我将要解释的内容来说,这是一个不必要的花哨名称)。
基本上,要生成模糊,您必须完成以下步骤:
- 选择照片中的像素并确定其值
- 查找所选像素的局部相邻像素的值(我们可以任意定义这个“局部区域”的大小,但它通常相当小)
- 取原始像素和相邻像素的值,并使用某种加权系统对它们进行平均
- 用输出的平均值替换原始像素的值
- 对所有像素都这样做
这个过程本质上是在说*“让所有的像素和附近的像素更相似”*,直观上听起来像是模糊。
对于高斯模糊,我们简单地使用高斯分布(即钟形曲线)来确定上面步骤 3 中的权重。这意味着像素离所选像素越近,其权重就越大。
无论如何,我们不想让图像变得太模糊,但只要足够让我们可以从照片中移除一些噪声即可。以下是我们得到的结果…
3。Canny 边缘检测
现在我们有了一个灰度和高斯模糊的图像,我们将试着找到这张照片中所有的边缘。
边缘仅仅是图像中值突然跳跃的区域。
例如,在灰色道路和虚白线之间存在清晰的边缘,因为灰色道路可能具有类似 126 的值,白线具有接近 255 的值,并且在这些值之间没有逐渐过渡。
同样,Canny 边缘检测滤波器使用非常简单的数学方法来寻找边缘:
- 选择照片中的像素
- 确定所选像素左侧和右侧像素组的值
- 取这两组之间的差值(即从另一组中减去一组的值)。
- 将所选像素的值更改为步骤 3 中计算的差值。
- 对所有像素都这样做。
所以,假设我们只看到了所选像素左边和右边的一个像素,并想象这些是值:(左像素,所选像素,右像素)= (133,134,155)。然后,我们将计算左右像素之间的差值,155–133 = 22,并将所选像素的新值设置为 22。
如果所选像素是边缘,则左右像素之间的差值将更大(接近 255),因此在输出的图像中将显示为白色。如果所选像素不是边缘,差值将接近 0,并显示为黑色。
当然,您可能已经注意到,上述方法只能找到垂直方向的边缘,因此我们必须执行第二个过程,比较所选像素上方和下方的像素,以处理水平方向的边缘。
这些差异被称为梯度,我们可以通过本质上使用毕达哥拉斯定理来计算总梯度,以相加来自垂直和水平梯度的单独贡献。换句话说,我们可以说总梯度=垂直梯度+水平梯度。
所以,比如说垂直渐变= 22,水平渐变= 143,那么总渐变= sqrt(22 +143 ) = ~145。
输出看起来像这样…
Canny 边缘检测滤波器现在又完成了一步。
Canny 边缘检测过滤器并不仅仅显示所有边缘而是试图识别重要边缘。**
为此,我们设置了两个阈值:高阈值和低阈值。假设高门槛 200,低门槛 150。
对于任何值大于高阈值 200 的总梯度*,该像素自动被视为边缘并转换为纯白(255)。对于任何小于低阈值 155 的总渐变,该像素自动被视为“不是边缘”,并转换为纯黑色(0)。*
对于 150 到 200 之间的任何渐变,只有当像素直接接触另一个已经被计为边缘的像素时,该像素才被计为边缘。
这里的假设是,如果这个软边连接到硬边*,那么它很可能是同一个对象的一部分。*
在对所有像素完成这个过程后,我们得到一个看起来像这样的图像…
4。掩模边缘图像
下一步非常简单:创建一个遮罩,消除照片中我们认为没有车道线的所有部分。
我们得到了这个…
这似乎是一个相当激进和放肆的面具,但这是目前在原始代码中写的。所以,继续前进…
5。霍夫莱恩斯
最后一步是使用霍夫变换找到车道线的数学表达式。
霍夫变换背后的数学比我们上面做的所有加权平均的东西稍微复杂一点,但仅仅是一点点。
这是基本概念:
直线的等式是 y = mx + b,其中 m 和 b 是常数,分别表示直线的斜率和直线的 y 截距。
本质上,为了使用霍夫变换,我们确定 m 和 b 的一些二维空间。此空间代表我们认为可能为车道线生成最佳拟合线的 m 和 b 的所有组合。
然后,我们在 m 和 b 的空间中导航,对于每一对(m,b ),我们可以为 y = mx + b 形式的特定线确定一个方程。此时,我们希望测试这条线,因此我们找到照片中位于这条线上的所有像素,并要求他们投票这是否是对车道线的良好猜测。如果像素是白色的(也就是边的一部分),它会投“是”,如果是黑色的,它会投“否”。
获得最多投票的(m,b)对(或者在这种情况下,获得最多投票的两对)被确定为两条车道线。
这是霍夫变换的输出…
我跳过了这一部分,霍夫变换不是使用公式 y = mx + b 来表示直线,而是使用极坐标/三角式表示,使用 rho 和 theta 作为两个参数。
这种区别不是非常重要(对我们的理解来说),因为空间仍然是二维参数化的,逻辑完全相同,但这种三角表示法确实有助于解决我们无法用 y = mx + b 方程表达完全垂直线的事实。
无论如何,这就是为什么在上面的代码中使用了 rho 和 theta 的原因。
最终输出
我们结束了。
程序输出两个参数来描述两条车道线(有趣的是,这些输出被转换回 m,b 参数化)。该程序还提供了每条车道线端点的坐标。
车道线 1
斜率:-0.740605727717;截距:6640 . 666866666667
第一点:(475,311)第二点:(960,599)
车道线 2
coef:-0.740605727717;截距:6640 . 666866666667
第一点:(475,311)第二点:(0,664)
将这些线叠加在原始图像上,我们看到我们已经使用基本的数学运算有效地识别了车道线。
Max Deutsch 是一名痴迷的学习者、产品制造者、为期个月以掌握的试验品,以及 Openmind 的创始人。
如果你想跟随 Max 长达一年的加速学习项目,请确保跟随这个媒介账户。
M2M 第 189 天:我想我教会了我的电脑如何驾驶自动驾驶汽车。但是,我就是想不出如何证实这个事实。
这篇文章是为期 12 个月的加速学习项目月掌握的一部分。今年五月,我的目标是打造无人驾驶汽车的软件部分。
昨晚,在“绝望的编码坑”中溺死了几个小时后,我终于取得了一些前进的进展。
作为一个提醒,在过去的几天里,我一直在试图找到并运行可以根据道路的输入图像生成转向指令(为我的自动驾驶汽车)的代码。
经过几个小时的搜索和摆弄,我找到了一篇由英伟达(一家制造自动驾驶汽车硬件和软件的公司)的研究人员撰写的学术论文。
正如论文摘要中所述,他们设计的系统可以*“将单个前置摄像头的原始像素直接映射到转向命令”*。
这正是我需要的!
我随后在 Github 上找到了英伟达系统的 TensorFlow 实现,经过几次尝试,我实际上已经能够根据英伟达的一些数据来“训练模型”。
快速澄清一些术语:1。“模型”是描述如何将像素转换成转向指令的函数,以及 2。“训练模型”意味着使用机器学习技术迭代地改进这个函数。我将在以后的文章中更详细地解释这个过程。
无论如何,NVIDIA 的数据集包括 25 分钟逐帧分解的视频,其中每一帧都标有真实转向角度(即人类驾驶员使用的转向角度)。
Frame 45,522
在终端,我运行程序来训练模型,尽管有一些警告,它开始工作了:
在这个屏幕截图中,一个“步骤”描述了每次通过系统输入一部分数据进行训练。“纪元”只是一个包含多个步骤的更广泛的类别。
为了训练这个模型,我使用了 30 个时期,每个时期几十步。
截图中的“损失”描述了型号(或功能)的准确程度。从概念上讲,为了计算损失,将真实转向角与模型预测的转向角进行比较。差额越大,损失越大。
最终,当训练模型时,程序使用一些数学技巧(我将在以后的帖子中描述)来试图通过每个迭代步骤减少损失。
于是,“训练模型”不过是“减少损失”。
这是一个曲线图,X 轴是步长,Y 轴是损耗。(昨晚,使用一种叫做 Tensorboard 的东西,我的电脑在训练时绘制了这个)。
例如,在步骤 126,损失的值为 5.708。
而在步骤 3,241,几乎 6 小时后,损失具有明显更好的值 0.1615。
现在训练已经正式完成,模型现在理论上已经可以驾驶汽车了,超级酷。
当我今天下班回家时,我试图测试这个模型(又名“驾驶汽车”),看看它的表现如何。可悲的是,当我试图运行程序时,我得到了这个错误…
我花了整整一个小时试图克服这个问题,但似乎我下载的一些代码无法在 Mac 上运行(即使可以,我也找不到让它运行的方法)。
我有一个解决办法的想法,但它必须等到明天。
与此同时,我可以庆祝这样一个事实,即我(很可能)已经有了一个功能合理、经过训练的自动驾驶汽车模型,可以随时投入使用。希望明天,我能弄清楚如何实际使用它…
马克斯·多伊奇是一名痴迷的学习者、产品建造者、为期个月以掌握的试验品,以及 Openmind 的创始人。
如果你想跟随 Max 长达一年的加速学习项目,请确保跟随这个媒介账户。
M2M 第 191 天:解构自动驾驶汽车模型(基于我目前的知识)
这篇文章是为期 12 个月的加速学习项目月掌握的一部分。今年五月,我的目标是打造无人驾驶汽车的软件部分。
现在我已经有了可以工作的无人驾驶汽车代码(见昨天的视频),在接下来的几天里,我计划解构代码,并试图理解它到底是如何工作的。
今天,我将特别关注“模型”,它可以被认为是代码的部分:模型定义了如何将输入图像转换成转向指令。
今天我没有太多的时间,所以我不会完整地描述代码是如何工作的(因为我还不知道,还需要做大量的研究)。相反,我会对代码行的含义做一些假设,然后记录我需要进一步研究的开放性问题。
这将使我有条理地学习材料。
这是自动驾驶模型的完整代码。它只有 50 行代码加上注释和空格(这是相当疯狂的,因为它在驾驶汽车和其他东西……)
import tensorflow as tf
import scipydef weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)def conv2d(x, W, stride):
return tf.nn.conv2d(x, W, strides=[1, stride, stride, 1], padding='VALID')x = tf.placeholder(tf.float32, shape=[None, 66, 200, 3])
y_ = tf.placeholder(tf.float32, shape=[None, 1])x_image = x**#first convolutional layer**
W_conv1 = weight_variable([5, 5, 3, 24])
b_conv1 = bias_variable([24])h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1, 2) + b_conv1)**#second convolutional layer**
W_conv2 = weight_variable([5, 5, 24, 36])
b_conv2 = bias_variable([36])h_conv2 = tf.nn.relu(conv2d(h_conv1, W_conv2, 2) + b_conv2)**#third convolutional layer**
W_conv3 = weight_variable([5, 5, 36, 48])
b_conv3 = bias_variable([48])h_conv3 = tf.nn.relu(conv2d(h_conv2, W_conv3, 2) + b_conv3)**#fourth convolutional layer**
W_conv4 = weight_variable([3, 3, 48, 64])
b_conv4 = bias_variable([64])h_conv4 = tf.nn.relu(conv2d(h_conv3, W_conv4, 1) + b_conv4)**#fifth convolutional layer**
W_conv5 = weight_variable([3, 3, 64, 64])
b_conv5 = bias_variable([64])h_conv5 = tf.nn.relu(conv2d(h_conv4, W_conv5, 1) + b_conv5)**#FCL 1**
W_fc1 = weight_variable([1152, 1164])
b_fc1 = bias_variable([1164])h_conv5_flat = tf.reshape(h_conv5, [-1, 1152])
h_fc1 = tf.nn.relu(tf.matmul(h_conv5_flat, W_fc1) + b_fc1)keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)**#FCL 2**
W_fc2 = weight_variable([1164, 100])
b_fc2 = bias_variable([100])h_fc2 = tf.nn.relu(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)h_fc2_drop = tf.nn.dropout(h_fc2, keep_prob)**#FCL 3**
W_fc3 = weight_variable([100, 50])
b_fc3 = bias_variable([50])h_fc3 = tf.nn.relu(tf.matmul(h_fc2_drop, W_fc3) + b_fc3)h_fc3_drop = tf.nn.dropout(h_fc3, keep_prob)**#FCL 4**
W_fc4 = weight_variable([50, 10])
b_fc4 = bias_variable([10])h_fc4 = tf.nn.relu(tf.matmul(h_fc3_drop, W_fc4) + b_fc4)h_fc4_drop = tf.nn.dropout(h_fc4, keep_prob)**#Output**
W_fc5 = weight_variable([10, 1])
b_fc5 = bias_variable([1])y = tf.mul(tf.atan(tf.matmul(h_fc4_drop, W_fc5) + b_fc5), 2)
逐行评论
现在,我将分块研究代码,并描述我认为每个块的意思/作用。
import tensorflow as tf
import scipy
前两行很简单。
我们正在导入 TensorFlow 库(我们将在代码的其他地方将其称为“tf ”)和 SciPy 库。TensorFlow 是由 Google 编写的 python 库,它将帮助抽象出大多数地面级机器学习实现。SciPy 会在数学方面帮忙。
这里没什么新东西可学。
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)
好的,这里我认为我们正在定义新的对象,这基本上意味着我们可以在代码的其他地方使用“weight_variable”和“bias_variable”的概念,而不必一次重新定义它们。
在机器学习中,我们试图求解的函数通常表示为 Wx+b = y,其中给定了 x(输入图像列表)和 y(对应的转向指令列表),想要找到 W 和 b 的最佳组合,使方程平衡。
w 和 b 实际上不是单一的数字,而是系数的集合。这些集合是多维的,并且这些集合的大小对应于机器学习网络中的节点数量。(至少,我现在是这么理解的)。
所以,在上面的代码中, weight_variable 对象代表 W, bias_variable 对象代表 b,在广义上。
这些对象接受一个称为“形状”的输入,它基本上定义了 W 和 b 的维数。
这些 W 和 b 对象由一个名为“normal”的函数初始化。我很确定这意味着…当最初创建 W 和 b 的集合时,单个系数的值应该基于标准偏差为 0.1 的正态分布(即钟形曲线)随机分配。标准偏差或多或少定义了我们希望初始系数有多随机。
所以,令人惊讶的是,我想我基本上理解了这段代码。乍一看,我不确定这是怎么回事,但写出来有助于我整理思绪。
**我还需要学习的:**我需要学习更多关于 Wx + b = y 结构的知识,为什么使用它,它是如何工作的,等等。,但我理解代码的基本原理。
def conv2d(x, W, stride):
return tf.nn.conv2d(x, W, strides=[1, stride, stride, 1], padding='VALID')
我相信这个 conv2d 是一个对某些输入执行核卷积的函数。内核卷积是我几天前在中学到的一种更通用的图像操作。
就我而言,核卷积操纵图像来突出图像的某些特征,无论是图像的边缘、角落等等。
这个特殊的特征是由“内核”定义的,它似乎是用上面的步幅=[1,步幅,步幅,1] 定义的。虽然,我不知道大步是什么意思,也不知道这到底是怎么回事。
这个图像处理函数似乎有三个输入:1 .内核/步幅(说明如何操作图像);2.x(也就是图像本身);第三。w(我猜它是一组系数,用于在某种程度上将不同的图像操作混合在一起)。
我必须更多地了解 W 在这一切中的角色。
不过,在高层次上,该函数以某种方式操纵图像,以自动将图像缩减为更有助于训练模型的独特特征。
**我还需要学习的:**卷积函数在数学上到底是如何定义的,W 在其中又是如何发挥作用的?
x = tf.placeholder(tf.float32, shape=[None, 66, 200, 3])
y_ = tf.placeholder(tf.float32, shape=[None, 1])x_image = x
接下来的几行看起来很简单。我们再一次回到等式 Wx + b = y。
这里我们本质上是为 x 和 y 变量定义了占位符*。这些占位符设置了变量的维度(记住:这些变量代表一个值的集合,而不仅仅是一个数字)。*
我们将 x 设置为接收特定尺寸的图像,将 y 设置为输出一个数字(即转向角)。
然后我们把 x 改名为“x_image”来提醒自己,x 是一个图像,因为……为什么不是。
这里没什么新东西可学。
**#first convolutional layer**
W_conv1 = weight_variable([5, 5, 3, 24])
b_conv1 = bias_variable([24])h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1, 2) + b_conv1)
好了,我们现在进入第一个卷积层。
我们定义 W_conv1 ,它只是我上面解释的 weight_variable 的一个具体实例(用 shape [5,5,3,24])。我不确定这个形状是如何或为什么以这种特殊的方式设置的。
然后我们定义 b_conv1 ,它只是我上面解释的 bias_variable 的一个具体实例(具有形状[24])。这个 24 可能需要匹配 W_conv1 形状的 24,但我不确定为什么(除了这将有助于使矩阵乘法工作)。
h_conv1 是一个中间对象,它将卷积函数应用于输入 x_image 和 W_conv1,将 bconv1 添加到卷积的输出,然后通过一个名为 relu 的函数处理一切。
这个 relu 的东西听起来很熟悉,但是我不记得它到底是做什么的了。我的猜测是,这是某种“squasher”或规范化功能,在某种程度上平滑一切,无论这意味着什么。我得调查一下。
虽然我可以阅读大部分代码,但我不太确定为什么“卷积层”要以这种方式设置。
**我还需要学习的:**什么是卷积层,它应该做什么,它是如何做到的?
**#second convolutional layer**
W_conv2 = weight_variable([5, 5, 24, 36])
b_conv2 = bias_variable([36])h_conv2 = tf.nn.relu(conv2d(h_conv1, W_conv2, 2) + b_conv2)**#third convolutional layer**
W_conv3 = weight_variable([5, 5, 36, 48])
b_conv3 = bias_variable([48])h_conv3 = tf.nn.relu(conv2d(h_conv2, W_conv3, 2) + b_conv3)**#fourth convolutional layer**
W_conv4 = weight_variable([3, 3, 48, 64])
b_conv4 = bias_variable([64])h_conv4 = tf.nn.relu(conv2d(h_conv3, W_conv4, 1) + b_conv4)**#fifth convolutional layer**
W_conv5 = weight_variable([3, 3, 64, 64])
b_conv5 = bias_variable([64])h_conv5 = tf.nn.relu(conv2d(h_conv4, W_conv5, 1) + b_conv5)
我们继续有四个以上的卷积层,其功能与第一层完全相同,但不是使用 x_image 作为输入,而是使用来自前一层的输出(即 h_conv 的东西)。
我不确定我们是如何决定使用五层的,也不知道为什么每个 conv 的形状都不一样。
**我还需要学习的是:**为什么有五层,我们如何为每一层选择形状?
**#FCL 1**
W_fc1 = weight_variable([1152, 1164])
b_fc1 = bias_variable([1164])h_conv5_flat = tf.reshape(h_conv5, [-1, 1152])
h_fc1 = tf.nn.relu(tf.matmul(h_conv5_flat, W_fc1) + b_fc1)keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)**#FCL 2**
W_fc2 = weight_variable([1164, 100])
b_fc2 = bias_variable([100])h_fc2 = tf.nn.relu(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)h_fc2_drop = tf.nn.dropout(h_fc2, keep_prob)**#FCL 3**
W_fc3 = weight_variable([100, 50])
b_fc3 = bias_variable([50])h_fc3 = tf.nn.relu(tf.matmul(h_fc2_drop, W_fc3) + b_fc3)h_fc3_drop = tf.nn.dropout(h_fc3, keep_prob)**#FCL 4**
W_fc4 = weight_variable([50, 10])
b_fc4 = bias_variable([10])h_fc4 = tf.nn.relu(tf.matmul(h_fc3_drop, W_fc4) + b_fc4)h_fc4_drop = tf.nn.dropout(h_fc4, keep_prob)
接下来,我们有四个 fcl,我相信它们代表“全连接层”。
这些层的设置似乎类似于卷积步骤,但我不确定这里发生了什么。我认为这只是普通的神经网络的东西(我写它是为了假装我完全理解“普通的神经网络的东西”)。
不管怎样,我会更深入地调查这件事。
**我还需要学习的:**什么是 FCL,每个 FCL 步骤中发生了什么?
**#Output**
W_fc5 = weight_variable([10, 1])
b_fc5 = bias_variable([1])y = tf.mul(tf.atan(tf.matmul(h_fc4_drop, W_fc5) + b_fc5), 2)
最后,我们采用最终 FCL 层的输出,进行一些疯狂的三角运算,然后输出 y,即预测的转向角。
这一步似乎只是“把数学算出来”,但我不确定。
我还需要学习的:产量是如何以及为什么以这种方式计算的?
完成了。
这比预期的要长——主要是因为我能够解析的东西比预期的多。
TensorFlow 库抽象出了多少实现,而构建一个完全有能力的自动驾驶汽车模型所需的底层数学知识又是如此之少,这有点疯狂。
对于我们作为模型构造者来说,似乎唯一重要的事情就是如何设置模型的深度(例如层数)、每层的形状以及层的类型。
我的猜测是,这可能更像是一门艺术,而不是科学,但很可能是一门受过教育的艺术。
我明天开始钻研我的开放式问题。
马克斯·多伊奇是一名痴迷的学习者、产品建造者、为期个月以掌握的试验品,以及 Openmind 的创始人。
如果你想跟随 Max 长达一年的加速学习项目,请确保跟随这个媒介账户。
M2M 第 197 天:掉进兔子洞的悲伤旅程…
这篇文章是为期 12 个月的加速学习项目月掌握的一部分。今年五月,我的目标是打造无人驾驶汽车的软件部分。
今天是一个错误和障碍的可悲集合(没有快乐的结局)。当我试图挽回自己时,我在兔子洞里越陷越深。
昨天开始——我成功地重新格式化了 Udacity 数据,并开始训练自动驾驶汽车模型。
在模型完成训练后,我快速看了一下损失图(损失衡量模型的“准确性”——损失越低,模型越好……在大多数情况下)。
经过 30 个时期的训练,损失甚至没有下降到 1.00 以下,而当我根据英伟达的数据训练模型时,损失大幅下降到 1.00 以下,一直到大约 0.16。
我不确定为什么我期望发生一些不同的事情——我使用的 Udacity 数据集只有 NVIDIA 数据集的 1/8 大小。
这是我的第一个错误:我不小心使用了测试数据集来训练模型。相反,我应该使用大得多的训练数据集,然后在测试数据集上测试训练好的模型。
问题不大:我去了 Udacity Github 页面,下载了更大的数据集用于训练。或者,至少我尝试过。
下载到一半,我的电脑完全崩溃了。
原来我电脑的本地存储/启动盘完全满了。太满了,以至于我的电脑拒绝运行任何程序。甚至 Finder 也意外崩溃。
我插上我的外部硬盘,开始把我一个月的主文档从我的本地机器上转移出去。
顺便说一句,我不得不用手机给我的电脑屏幕拍照,因为我的电脑没有足够的空间来截图……
总之,前六个月的 M2M 文档超过了 132GB,其中 70.8 GB 在我的本地机器上,所以,一旦传输完成,我就可以将 70 GB 的本地文件转移到垃圾桶。
然后,在试图清空我的垃圾时,我的电脑死机了…
重启电脑几次后,我的垃圾终于清空了,30 分钟后,我又开始工作了。
现在我的电脑上有了空间,我回到 Udacity Github 页面下载训练数据集。
训练数据集实际上是在 torrent 中压缩的,所以我需要安装 BitTorrent 来下载数据集。
种子下载后,我解压文件。我期望看到一堆 JPEG 图像和一个 data.txt 文件,就像我们之前看到的一样,但是相反,我看到了这个…
显然,Udacity 认为将数据打包在中是个好主意。包文件。我实际上从未听说过。之前的包文件,但似乎是自动驾驶汽车(或者其他“机器人”保存数据的原生方式。
因此,我需要找出如何从个人中提取 JPEGs 和 CSV。袋装文件。
有一个叫做 ROS(机器人操作系统)的库需要使用。包文件,所以我试图安装它。
但是,这是我在 ROS 安装页面上发现的…
换句话说,制作 ROS 的人基本上是在说*“这是行不通的。会失败的。不好意思。”*
他们是对的,它确实失败了。
然而,我花了更多的时间试图解决这个错误,最终看起来我已经成功地安装了我需要的所有东西。但是,后来我尝试运行提取脚本,仍然失败。
此时,我不得不停下来过夜。
明天,希望我能取得一些进步。
Max Deutsch 是一名痴迷的学习者、产品建造者、为期个月以掌握的试验品,以及 Openmind 的创始人。
如果你想跟随 Max 长达一年的速成学习项目,请确保跟随这个媒介账户。
M2M 第 90 天——我如何使用人工智能来自动化 Tinder
这篇文章是杰夫为期 12 个月的加速学习项目“掌握的一个月”的一部分对于 March,他正在下载构建人工智能的能力。
如果你有兴趣了解更多关于我的信息,请查看我的 网站 。
介绍
前几天,当我坐在马桶上拉屎时,我拿出手机,打开了所有马桶应用之王:Tinder。我点击打开应用程序,开始无意识滑动。左 右 左 右 左。
现在我们有了约会应用程序,与应用程序出现之前的时代相比,每个人突然都有机会与更多的人约会。湾区倾向于男性多于女性。湾区也吸引了来自世界各地的超级成功的聪明男人。作为一个额头很大、身高 5 英尺 9 英寸、不怎么拍照的亚洲男人,旧金山约会领域的竞争非常激烈。
通过使用约会应用程序与女性朋友交谈,旧金山的女性几乎每刷一次就能匹配到一次。假设女性在一小时内有 20 场比赛,她们没有时间去和每个给她们发信息的男人约会。显然,他们会根据个人资料+最初的信息来挑选他们最喜欢的男人。
我是一个相貌出众的人。然而,在亚洲男人的海洋中,纯粹基于长相,我的脸不会出现在页面上。在股票交易所,我们有买家和卖家。顶级投资者通过信息优势赚取利润。在牌桌上,如果你比牌桌上的其他人有技能优势,你就变得有利可图。如果我们认为约会是一个“竞争市场”,你如何给自己竞争优势?竞争优势可能是:惊人的外表、事业成功、社交魅力、冒险精神、接近、巨大的社交圈等等。
在约会应用上,在照片和短信技能上具有竞争优势的男性和女性将从应用中获得最高的投资回报率。因此,我将约会应用的奖励系统分解为一个公式,假设我们将消息质量从 0 到 1 标准化:
Credit: Me
你的照片越漂亮,你就越不需要写高质量的信息。如果你有糟糕的照片,不管你的信息有多好,没有人会回应。如果你有很棒的照片,一条机智的信息会显著提高你的投资回报率。如果你不刷卡,你的投资回报率为零。
虽然我没有最好的照片,但我的主要瓶颈是我没有足够高的点击量。我只是认为这种无意识的刷卡是在浪费我的时间,我更喜欢亲自去见人。然而,这样做的问题是,这种策略严重限制了我可以约会的人的范围。为了解决这个刷卡量问题,我决定建立一个自动化 tinder 的人工智能,名为:THE DATE-A MINER。
日期-矿工是一个人工智能,它学习我喜欢的约会配置文件。一旦它学习完我喜欢什么,约会矿工就会自动在我的 Tinder 应用程序上的每个个人资料上向左或向右滑动。因此,这将显著增加刷卡量,从而增加我的预计 Tinder 投资回报率。一旦我找到匹配,人工智能会自动给匹配者发送信息。
虽然这并没有给我照片方面的竞争优势,但这确实给了我点击量和初始信息方面的优势。让我们深入研究一下我的方法:
数据收集
为了建立一个日期-一个矿工,我需要喂她很多图像。结果,我使用 pynder 访问了 Tinder API。这个 API 允许我通过我的终端界面而不是应用程序来使用 Tinder:
我写了一个脚本,我可以在每个配置文件中滑动,并将每个图像保存到“喜欢”或“不喜欢”的文件夹中。我花了几个小时刷,收集了大约 10,000 张图片。
我注意到的一个问题是,我向左滑动了大约 80%的个人资料。结果,我有大约 8000 个不喜欢的文件夹和 2000 个喜欢的文件夹。这是一个严重不平衡的数据集。因为我的“喜欢”文件夹中的图片很少,所以约会达人不会训练有素地知道我喜欢什么。它只会知道我不喜欢什么。
为了解决这个问题,我在谷歌上找到了一些我觉得有吸引力的人的图片。然后我收集了这些图像,并在我的数据集中使用它们。
数据预处理
现在我有了图像,但还有一些问题。Tinder 上有各种各样的图片。有些个人资料有多位朋友的照片。一些图像被缩小。有些图像质量很差。很难从如此多种多样的图像中提取信息。
为了解决这个问题,我使用了一个 Haars 级联分类器算法从图像中提取人脸,然后保存下来。分类器本质上使用多个正/负矩形。让它通过预先训练的 AdaBoost 模型来检测可能的面部尺寸:
Credit: OpenCV
该算法在大约 70%的数据中未能检测到人脸。这使我的数据集缩减到 3000 张图片。
建模
为了对这些数据进行建模,我使用了一个卷积神经网络。因为我的分类问题非常详细&主观,所以我需要一种算法来提取足够多的特征,以检测我喜欢和不喜欢的简档之间的差异。cNN 也是为图像分类问题而建立的。
为了对这些数据建模,我使用了两种方法:
三层模型:我没想到三层模型会表现得很好。每当我构建任何模型时,我的目标都是让一个笨模型先工作起来。这是我的笨模型。我使用了一个非常基本的架构:
model = Sequential()
model.add(Convolution2D(32, 3, 3, activation=’relu’, input_shape=(img_size, img_size, 3)))
model.add(MaxPooling2D(pool_size=(2,2)))model.add(Convolution2D(32, 3, 3, activation=’relu’))
model.add(MaxPooling2D(pool_size=(2,2)))model.add(Convolution2D(64, 3, 3, activation=’relu’))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(128, activation=’relu’))
model.add(Dropout(0.5))
model.add(Dense(2, activation=’softmax’))adam = optimizers.SGD(lr=1e-4, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss=’categorical_crossentropy’,
optimizer= adam,
metrics=[‘accuracy’])
最终的准确度约为 67%。
**使用 VGG19 进行迁移学习:**三层模型的问题是,我正在一个超小的数据集上训练 cNN:3000 张图像。在数百万张图片上表现最好的 cNN 列车。
因此,我使用了一种叫做“迁移学习”的技术迁移学习,基本上就是把别人建立的模型用在你自己的数据上。当你有一个非常小的数据集时,这通常是可行的方法。我在 VGG19 上冻结了前 21 层,只训练了后两层。然后,我展平并在它上面拍了一个分类器。下面是代码的样子:
model = applications.VGG19(weights = “imagenet”, include_top=False, input_shape = (img_size, img_size, 3))top_model = Sequential()top_model.add(Flatten(input_shape=model.output_shape[1:]))
top_model.add(Dense(128, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(2, activation='softmax'))new_model = Sequential() #new model
for layer in model.layers:
new_model.add(layer)
new_model.add(top_model) # now this worksfor layer in model.layers[:21]:
layer.trainable = Falseadam = optimizers.SGD(lr=1e-4, decay=1e-6, momentum=0.9, nesterov=True)
new_model.compile(loss='categorical_crossentropy',
optimizer= adam,
metrics=['accuracy'])new_model.fit(X_train, Y_train,
batch_size=64, nb_epoch=10, verbose=2 )new_model.save('model_V3.h5')
结果是:
准确度 : 73%
精度: 59%
召回率: 44.61%
准确性只是正确地预测我是喜欢还是不喜欢这张图片。
Precision 告诉我们“在我的算法预测为真的所有配置文件中,我真正喜欢的有多少?”低精度分数意味着我的算法没有用,因为我得到的大多数匹配都是我不喜欢的简档。
回忆,告诉我们“在所有我实际上喜欢的配置文件中,算法正确预测了多少?”如果这个分数很低,这意味着算法过于挑剔。
你可以看到斯嘉丽·约翰逊的算法预测:
运行机器人
现在我已经建立了算法,我需要把它连接到机器人上。制造这个机器人并不太难。在这里,你可以看到机器人的动作:
我故意在每次滑动时添加了 3 到 15 秒的延迟,这样 Tinder 就不会发现这是一个在我的个人资料上运行的机器人。不幸的是,我没有时间给这个程序添加 GUI。
未来工作
我只给自己一个月的兼职来完成这个项目。事实上,我还可以做无数其他的事情:
**对个人资料文本/兴趣的自然语言处理:**我可以提取个人资料描述和 facebook 兴趣,并将其纳入评分标准,以开发更准确的点击。
**创建一个“总个人资料得分”😗*我可以让算法查看每张照片,并将累积的滑动决策汇编成一个得分指标,以决定她应该向右还是向左滑动,而不是从第一张有效照片中做出滑动决策。
**更多数据:**我只对 3000 张图片进行了训练。如果我可以在 150,000 张 Tinder 图片上训练,我相信我会有 80–90%的算法执行率。此外,我还可以改进面部提取程序,这样我就不会丢失 70%的数据。
**适应铰链,咖啡遇上百吉饼,邦布尔:**为了拓宽我的量,适应算法击中多个频道。
**A/B 测试:**有一个框架来 AB 测试不同的消息,剖析图片,并有分析支持这些不同的决策。
谷歌的 Inception,VGG16: 这些都是不同的预先训练好的 cNN 的。我想试试这些,但是我没有时间了。
**添加 GUI/Turn 成为一个用户友好的应用:**这将允许非技术人员使用它。
现在,该刷卡了!
如果您有兴趣查看代码或为自己重新创建这个项目,请单击此处的。如果你有兴趣了解更多关于我的信息,请查看我的网站。
演职员表:
看下一个帖子。
杰夫·李正在通过将矩阵技术下载到他的大脑中来拯救世界。他是……“超级收入者”
如果你爱我和这个项目,关注这个媒介账号或者查看我的网站。讨厌我,你还是应该关注这个中等账号。这里有一个选择……
MachinaNova:一个个人新闻推荐引擎
MachinaNova Logo
几个月前,我订购了一个叫做 Paper.li 的工具,我可以把它添加到我的网站上。它的承诺是“收集相关内容,并把它发送到你想去的任何地方”——这正是我早上工作时需要的。
让我解释一下…我喜欢我的早晨惯例。它包括吃早餐、喝咖啡和坐下来浏览数字新闻和内容的丛林。我的目标:带着我还没有的珍闻出现在新闻丛林的另一边;希望我打算吃的一些咖啡和百吉饼能在我嘴里落地。
说真的,我点击了几十个书签,浏览了标题,最终还是屈服于点击疲劳。每天早上,我都会看久经考验的《哈佛商业评论》 …因为它们每次都很棒。
如果 Paper.li 照他们说的做了,我的日常工作时间就会减少,我终于可以享受我的百吉饼了,而不是把它往我脸上推。我需要这个解决方案!
The image above is a real picture of a portion of the bookmarks saved on my Google Chrome browser.
新闻聚合现实:它烂透了百吉饼。
坦白地说,李的方案很糟糕。它在推荐文章方面很有效;但是它们很少有趣。通常,被推荐的文章都是推广个人项目的博客帖子或推文,我很少能找到任何可以应用到我职业生涯中的真正内容。
李(以及其他新闻聚合网站——看看你,Flipboard,Medium 和其他所有解决方案)是糟糕的。它只是不适合我想读的内容。如果你不是像我一样的完美主义者,这很好…
然而,我是一个完美主义者…
我有能力解决这个问题。
是时候建造 MachinaNova 了。
MachinaNova,新闻机|解决方案概述
MachinaNova 是一个应用程序,它可以找到我感兴趣的新闻,并以我每天都可以阅读的格式呈现出来。这就引出了一个问题…它怎么知道我想读什么?
这是一个神奇的新闻推荐系统。
嗯,其实是我训练的识别我喜欢的文章的软件。我将把解决方案分解成几个部分,这样就容易理解了,但是在高层次上,MachinaNova 是一个推荐系统。
就我而言,MachinaNova 预测了我通过阅读“喜欢”一篇文章的可能性。除了预测之外,它还会产生一个置信度得分,告诉我有多确信我会喜欢这篇文章。每天,它都会呈现根据可信度排序的前 12 篇“赞”文章。
解决方案相对简单,而且非常有用。我已经用了几个星期了——我喜欢它!
MachinaNova 查看文章的来源、标题和摘要来预测“喜欢”或“不喜欢”
谢谢你,机械诺娃!你其实知道我喜欢什么。
为了理解文章的内容,MachinaNova 使用自然语言处理来阅读文章。我一会儿会谈到这是什么,但是把它想象成我在早晨例行公事中可能做的事情。我浏览来源,阅读标题,也许还有文章的摘要。在我的日常生活中,如果我不喜欢某篇文章,我会继续看下一篇;如果我喜欢,我可能会点击阅读。唯一不同的是,MachinaNova 可以在几秒钟内阅读和评分数千篇文章。
我很嫉妒…我一年可能会读几千篇文章…人工智能正在接管。
MachinaNova,新闻机器|采集新闻
为了建立 MachinaNova,我需要做的第一件事就是抓取我喜欢的文章。幸运的是,有一种预置的方法可以轻松地从网络上获取新闻。RSS 源。RSS 源是新闻提供商提供的服务,允许快速分发他们的内容。在 RSS 提要中,您可以找到诸如文章名称、作者、链接、图片等内容。
为了捕获有价值的 RSS 数据,我构建了一个 Python 脚本来调用我最喜欢的 RSS 提要,并将信息存储在我的本地机器 Ocean 上的数据库中。(海洋这个名字是因为它的 3TB 固态硬盘。)
海洋自 2018 年 6 月以来一直愉快地捕捉文章。在撰写本文时,我的本地数据库包含来自华尔街日报、芝加哥论坛报和哈佛商业评论等来源的 20,000 多篇文章。
作为最终 MachinaNova 解决方案的一部分,我需要在 Amazon Web Services 上复制 Postgres 数据库。我还需要在 AWS Lambda 中复制我的 Python 脚本,并使用 Cloudwatch 服务从 RSS 提要中获取数据,并将它们存储在我的 Amazon Postgres RDS 解决方案中。
与此同时,Lambda 还将来自 RSS 提要的徽标存储在亚马逊 S3 中,这样 MachinaNova web 应用程序就可以将这些图像作为源呈现给最终用户。
在我将 Python 脚本和 Postgres dB 迁移到 AWS 之后,我的本地 Python 脚本于 2018 年 10 月初退役。
MachinaNova,新闻机器|网络应用
在构建了捕获新闻文章的方法之后,我需要告诉我的应用程序我喜欢和不喜欢哪些文章。在我的本地计算机(Ocean)上,我构建了一个 Django 应用程序,它可以读取我存储在 Amazon RDS 中的文章。
这个 Django 应用程序,并没有对公众开放,它是一个界面,在我的电脑屏幕上显示一篇随机的未经训练的文章。在应用程序中,我可以看到两个按钮“喜欢”和“不喜欢”。如果我喜欢这篇文章,我会选择“喜欢”,如果不喜欢,我会选择“不喜欢”。在我的数据库中,0 代表“不喜欢”,1 代表“喜欢”
喝了几杯酒,经过几个晚上的打分,我已经根据自己的喜好训练出了大约 1200 篇文章。
现在,我们有了一个真正的数据科学项目的开端——机器学习!
MachinaNova,新闻机器|机器学习
这部分可以自成一篇。所以,我要把它保持在一个很高的水平。这是一个家庭友好的博客帖子。
记得我之前说过,我的解决方案可以使用自然语言处理来阅读文章。为此,MachinaNova 使用一种叫做空间的解决方案来“阅读”每个单词(和标点符号)。) Spacy 与生俱来的对单词在邻近的其他单词的上下文中的含义的理解(例如,“苹果”是一家公司,而不是一种水果,当伴随着其他商业单词时。)
使用 Spacy 和它的 NLP 功能,我建立了一个单词包模型,计算一篇文章、标题甚至来源中使用的单词数。然后,它会查看这些单词,并将其与我过去喜欢的文章的常用单词和字数的训练数据集进行比较。
本质上,MachinaNova 会寻找那些与我以前喜欢的文章有相似文字的文章。
为了给每篇文章打分,我使用了一种叫做支持向量机的算法,用核心技巧在“N”维中表示这些单词,以便在我“喜欢”和“不喜欢”的文章之间划出一条线。这在一开始还不错,但需要优化。为了优化算法,我使用了 TF-IDF(术语频率,逆文档频率)等其他技巧,甚至使用 n 元语法创建了一些短语。
还和我在一起吗?
一旦我的机器学习算法达到预期,我就使用 Docker、亚马逊 ECR、亚马逊 ECS 和使用亚马逊 Fargate 的自动缩放计算资源将其部署到 AWS。机器学习算法使用 Cloudwatch 和 Cron 调度在每天早上 5:45 运行。
MachinaNova,新闻机器|用户界面和演示
在这一点上,我们在 Amazon Web Services 上有一个数据库,每天更新数千篇新闻文章。现在是时候向最终用户展示这些信息了。
我爱 Django,Jinja2 和 Materialize CSS!
在这个项目中,我爱上了一个超级易用的软件,它允许我使用我最喜欢的语言 Python 来构建漂亮的 web 应用程序。解决方案 Django 创建了一个数据库,给了我一些安全特性,并允许我引入模板和 CSS 来使我的应用程序漂亮、更新并与我收集的数据集成。
所以,我建立的解决方案已经准备好了,可以在我的网站上找到,地址是courtneyperigo.com/news;但肮脏的事实是,该解决方案实际上由亚马逊的 Route 53 安全托管在 newsml.machinanova.ninja 。
我很自豪完成了这个项目。它挑战我学习新工具,迫使我学习 AWS,并彻底击败了其他新闻推荐服务。
吮吸面包圈、纸团的李!
这个项目的代号是基多项目。因为一旦我完成了这样一个项目,我会奖励自己一个假期。看来我需要温习一下我的西班牙语。
机器共情:机器学习如何给 UX 设计带来真正的洞察力
Created on iPhone6s with Prisma
将同理心和数据挖掘结合起来,打造更好的 UX
移情已经理所当然地成为良好用户体验(UX)设计的前提。但是设计师用来达到共鸣的手段——比如人物角色——并没有达到他们的预期目的。
虽然使用人物角色的动机是高尚的,但是他们经常是建立在人口统计资料上的理想化用户的产品,而不是来源于真实用户行为的原始洞察力。
人物角色的局限性是众所周知的。这个最近的视频很好地分析了局限性,而 2010 年的这篇论文描述了开发人物角色的各种陷阱,从过程不科学到倾向于群体思维和确认偏差。
但是人物角色应该被完全抛弃吗?如果没有确定要服务的群体,通过什么方法可以确定设计的优先级?如果不知道也不考虑用户的动机或心态,那么 UX 的设计怎么能像经常被引用的那样具有同理心呢?
移情的另一种方法——渐进主义——使用行为数据来渐进地改变设计,以达到优化的 UX。但是这种注重转换而非体验质量的方法,通过渐进式改进而不是整体解决方案来抑制创新。
我们相信,通过将设计师的需求与正确的数据和分析工具相匹配,有一种更好的方法来应对 UX 的挑战。
问题的根源
在我们深入研究解决方案之前,有必要了解一下我们为什么会走到这一步:
- 过度依赖一个工具,谷歌分析
- UX 网站只使用网络数据的孤岛式思维
- 对可用数据的肤浅分析使河马效应成为可能,并导致人物角色的主观创造
第一点是其他两点的根本原因。谷歌分析的专业知识被错误地认为是网站分析的专业知识。当其他来源和分析工具可用时,对于网站数据来说,这是马兹洛的锤子。简而言之,错误的工具和不充分的信息导致设计的任意起点。
让我们举一个交通信息网站的简单例子,其中一个关键的性能指标——在网站上的时间——可能与相反的动机和对体验的错误理解有关。有一次,一条火车线路瘫痪,通勤者需要使用该网站寻找替代路线。长时间在网站上与用户在寻找相关信息时的摩擦和挫折有关。相反,在旅游旺季规划城市路线的游客需要更多的时间来考虑如何最好地游览景点。
如果不了解不同用户想要达到的目标,善意的网站目标可能会成为性能的错误标志。
理解用户行为的更好方法
在 UX 设计中,对用户进行分组仍然是开发优先级的关键,但是如何进行呢?其实就是收集更有意义的用户数据,使用正确的分析工具和方法这么简单。
下面是我们发展丰富而有意义的用户群的 4 个步骤:
1.掌控您的网络用户数据
早在 2005 年,当谷歌收购顽童软件时,网络分析的选择有点有限,而且都是付费的或者非常简单。很难想象无处不在的顽童一旦免费并更名为谷歌分析会变得怎样。值得称赞的是(也是有益的),谷歌给了每个运营网站的人一个以简单有效的方式衡量其表现的机会,但除非你支付 10 万美元购买高级版本,否则你无法获得原始数据用于外部分析。
你也不需要投资像 Adobe 或 Webtrends 这样的商业级系统。虽然这些系统很强大,但你只是用不必要的花费和时间,把一个围墙花园换成另一个。
相反,有一些低成本或免费的系统可以提供丰富的访问者数据,这些数据可以导出供外部分析。我们使用的系统有:
- Piwik —开源免费分析软件
- Opentracker —提供访客身份识别的低成本软件
这些可以很容易地作为代码片段安装在网站主页模板或标签管理器中,与 Google Analytics 并行运行。
所有权超越了由一个公司实体控制您的信息的陈腐概念。虽然随着时间的推移,数字媒体的双头垄断可能会使这种担忧更加主流,但主要的威胁是,分析工具与谷歌和/或脸书认为对他们最有利可图的功能优先级相关联,而不是对你。
2.考虑所有影响用户对你的网站的动机和心态的外部因素
通常情况下,我们会举办客户研讨会,在用户到达网站之前绘制他们的旅程,并对所有可用的相关数据进行分类,包括网络分析之外的来源。例如,在上面引用的旅行示例中,我们收集了与天气异常和服务中断相关的数据集。
发现的场景和用户旅程越多,可以利用的外部数据就越多。
3.收集所有数据并进行分析
这就是事情开始变得有趣的地方。分析需要正确的工具和技能。幸运的是,这两者都相当丰富。
我们的选择通常是:
要分析的数据应该尽可能的平坦和整洁,这意味着每一行都是一次访问(观察),每一列都是一个描述符(变量)。如果您来自关系数据库领域,当用于分析的数据可能有数百万行和数十列时,这看起来可能是浪费。r 是为大规模工作而设计的;在笔记本电脑上分析几十万行可能需要几秒钟。对于大型数据集,可以在个人电脑上使用数据样本开发原型,然后相同的分析代码可以在整个数据集上运行。
一旦数据整理好,我们就可以通过 r 中的“Cluster”包使用无监督机器学习,这种类型的分析被用于从医学研究到手机套餐定价等各种领域。这听起来可能真的很复杂,有点吓人,但事实并非如此。数学很复杂,但原理和实际执行很简单:机器学习算法通过同时最大化和最小化描述访问的所有变量之间的距离,将每次访问分配到一个组(集群)中。
首先,我们需要知道聚类的最佳数量。试错法可以在视觉上评估得到的聚类是过于相似、过于不同还是恰到好处。或者,factoextra 包中的 fviz_nbclust 函数可以给出最佳数字:
k 统计峰值在 4 左右,因此我们将针对 4 个集群的目标运行函数。
有许多可视化输出;一种流行的方法是使用雷达图来了解每个星团的变量大小。
该图的每个雷达段显示了每个聚类中每个变量的相对重要性。数字输出还将告诉我们每个聚类代表整个样本的多少比例,从而给出客观的优先级。
4.将集群应用于用户组
从上面的雷达图中,我们可以将星团解释成有意义的部分。即使只有两个外部因素,天气和服务,也给三个网络分析指标带来了更大的背景。
对于上面的示例,分段可能是:
- 千夫所指 —恶劣天气和现场低时段;他们急需信息
- 通才——不太确定他们需要什么信息,但会在网站上逛逛
- 考虑者 —高参与度
- 恐慌者 —从另一个站点转介来检查服务
上述示例仅使用了五个变量,变量越多,最终用户的信息就越多,但是从可用的集群中,我们可以直观地了解设计的一些优先事项:
- 如何最好地标示出恐慌者和管理者所需的特定旅行和服务状态内容?
- 我们能否为多面手提供一个逻辑导航结构,让他们更高效地到达需要的地方?
- 什么样的行动号召最能满足考虑者渴望的参与度?
由于每次访问都被分配到一个集群中,如果我们服务于这些优先事项,那么就没有什么需要解决的了。
重申一下,我们从每次用户访问中获取的变量越有意义,集群的描述性就越强,关于细分和设计简报的结论就越好。
Created on iPhone6s with Prisma
合成创造力还是机器共情?
机器学习的数学可以通过将用户数据与上下文因素结合起来,消除对网络分析意味着什么的任意概念。但是仍然需要人类的解释和创造力来为数字之间的巨大空白着色。为了取得成功,设计师和数据科学家需要合作开发有意义的见解和目的驱动的细分市场。
人工智能能够弥合分析和创造力之间的差距吗?还没有,但随着每一天和每一个改进的算法,我们朝着真正的机器移情又迈进了一步。
最初发表于T5【www.deducive.com】。
旅游和运输行业的机器智能
Photo by Tomasz Frankowski on Unsplash
滑道 每季度发行一本名为 观光客 的旅游营销杂志。这篇文章的一个版本将出现在第三季度。
TL;博士:
努力在人工和自动与客户互动之间找到正确的平衡。方便和同理心同样重要。
在流程自动化之前关注流程改进。自动化糟糕的流程增加了糟糕事情发生的速度。
技术史
几代人以来,机器智能一直在改变我们的旅行方式。1946 年,美国航空公司发布了第一个自动订票系统。到 1976 年,联合航空公司向旅行社部署了他们的计算机化预订系统。20 世纪 90 年代,孤独星球的第一个网站 Expedia 和 Priceline 诞生了。在整个 21 世纪初,全球分销系统和互联网使得 Kayak 和 Hotwire 通过聚合创新了 OTA 模式。今天,几乎每个航空公司都有一个“智能的”(或者至少是动态的)应用程序;大型连锁酒店正在部署自动化礼宾顾问;美国运输安全管理局利用无数的扫描和视觉识别安全技术;旅行者的偏好和数字行为被用来提供量身定制的产品,他们甚至可以在机场的航站楼之间购买行李。
然而,在过去的几十年里,对于发明并没有一致的坚持。20 世纪 60 年代机器翻译取得的进步和 20 世纪 80 年代“专家系统”的激增都让位于他们自己的研究经费的崩溃。这几十年的创新休眠通常被称为“人工智能冬天”。虽然有些人认为我们很容易再经历一次,但许多人断言过去几代人的人工智能冬天现在完全是后知后觉。无论你持哪种观点,最近的上涨都可以追溯到几个关键的技术和基础设施促成因素:
集中和分散计算
高级数据操作技术需要强大的计算能力。像亚马逊网络服务和谷歌的云部门这样的公司将服务器(和 GPU 集群)集中化,以允许软件应用程序在外部或“云”上运行,并传输到设备。与此同时,在我们的手掌中,今天移动设备中使用的硬件非常先进,使得大量计算可以在设备本身或“边缘”进行。
移动“应用”和应用间服务
手机是人类历史上最大的经济平台。因此,数以百万计的应用程序被创建出来。如今,终端用户手动浏览这些应用程序,通常85%的设备使用时间只花在五个应用程序上。随着不太普及和小众的消费者服务作为应用程序上线,它们之间的运营结构变得越来越重要。 Button 是这种服务的一个很好的例子——使最终用户能够在应用程序之间无缝导航,以完成诸如安排优步之旅以获得 OpenTable 预订等任务。
自然语言处理
互联网上(以及企业内部)大约 80%的信息被认为是非结构化数据,即既没有预定义也没有组织的信息。非结构化信息通常以文本为主,包含日期、数字和事实等数据。NLP 领域的进步有助于通过解释意义、意图和情感来理解这些数据,使公司能够更好地了解受众对产品或服务的感受。
计算机视觉
部署算法来学习视觉线索的最新技术开辟了自动化工作流和业务流程的途径,包括标记和/或解释图像。Chute 内置了自己的视觉识别引擎,名为 IRIS 。它可以根据场景类型、徽标和对象过滤和标记图像。capricity是另一个很好的例子—在保险工作流程中处理扫描的文档和图像。
训练、优化和预测
机器学习算法通过训练数据和反馈回路来提高性能。搜索引擎优化(SEO)是谷歌和必应(Bing)等公司大规模对回复进行排名的一个例子。在大大小小的规模上,优化算法正被部署来利用过去的在线或数字行为来推荐未来的活动,随着时间的推移不断校准和定制建议。
语音识别
语音识别技术现在产生了大约 5%的错误率,这与人类的能力相当。像苹果的 Siri 和亚马逊的 Alexa 这样的语音激活代理正在打开我们可以简单地请求激活我们移动设备上的无数服务的方法的窗口。想象一下客户服务电话上的交互式语音应答(IVR)实际上是有效的。
通过利用这些使能技术,开发人员友好的服务已经建立起来——促进技术专家社区的采用,从而推动今天利用机器智能的应用的扩散。以下主题剖析了这些技术对旅行体验产生最大影响的方式。
订婚
聊天机器人是一种独特而有效的联系客户的媒介。Facebook Messenger、IBM Watson、Heroku、Amazon Alexa 和 Slack(以及许多其他平台)为构建和训练聊天机器人提供了框架。这些应用程序可能被部署为酒店的礼宾员,帮助定位健身房,或者航空公司应用程序的信使,提醒旅客延误,或者语音命令界面,预订机票。
搜索&探索
旅行者现在可以用自然语言搜索,无论他们去哪里,都能找到想要的和定制的体验。像 WayBlazer 这样的智能服务通过结合评论、排名和旅行指南,推荐最有可能引起旅行者共鸣的活动、餐馆、公园、博物馆和体验。
物流&运营
现在,在 200 多个国家使用数十种语言进行预订比以往任何时候都更容易、更快捷。智能交通系统——从无人机场铁路到突破性的自动驾驶汽车技术——正在改变旅行者从 A 地到 b 地的出行方式。此外,动态定价算法正在改变我们基于整个旅行体验中的实时供需的花钱方式——包括预订和运输。
未来会怎样?
很快,简单地预订一张机票就会引发一场无人驾驶的旅行。真正个性化的餐厅和活动推荐将通过 messenger 应用程序的一键式预订功能立即自动发送。旅行计划将花费比现在少得多的时间。即使在到达机场后,旅客也会被引导到他们的登机口,沿途有购物、休闲和用餐的建议。机场不仅仅是去其他地方的一种手段;这将是一个独立的地方。
当影响者到达餐厅酒吧或入住酒店时,社交监控系统将通知酒店员工,使服务团队能够主动为他们创造令人难以置信的体验——也许是免费的饮料或甜点。航空公司甚至可能瞄准特定的忠诚和有影响力的受延误困扰的乘客,以独特的方式进行补偿。
就像飞机上的自动驾驶仪一样,机器智能无法管理旅游业提供的所有操作和服务。飞行员处理起飞和降落的方式类似于旅游公司继续为旅行者提供差异化体验的方式。然而,在整个飞行和旅行过程中,智能有助于优化个性化、规模和便利性。
2017 年机器智能峰会
阿姆斯特丹#reworkMI 概述
上周,我在阿姆斯特丹参加了第四届机器智能峰会。这项活动的任务是:
“……让政府官员、学者、企业家、投资者和行业专业人士齐聚一堂,讨论机器学习、深度学习和人工智能的最新突破,并探索它们在工业中的应用及其潜在影响……”
当我在第二天对房间进行快速举手调查时,看起来观众大多来自学术界或创业背景(我承认,我忘了问政府官员)。
完整的时间表和摘要可以在网上找到,我通过回顾那里来写这个摘要。以下是演讲的简要概述,按主题分组(而不是按演讲者顺序):
计算机视觉
来自 DFKI 的 Damian Borth】讨论了从形容词-名词对的角度探索由生成对抗网络(GANs)创造的潜在空间,以捕捉图像的主观特征。展示的结果包括一种翻译图像以更好地捕捉某些特征的方法;例如,将图像从“多雾的天空”翻译成“美丽的天空”
来自 EyeEM 的 Appu Shaji 讨论了 EyeEM 如何使用计算机视觉为客户创造新体验。他讨论的一个有趣的应用是“EyeEM 选择”功能(见这篇博客文章),它从你的图库中挑选最好的照片来展示。
时尚&美丽
来自欧莱雅的 Panagiotis-Alexandros Bokaris承诺我们的演讲“不仅仅是关于口红”他的演讲涵盖了增强现实和计算机视觉交叉领域正在进行的广泛工作——并指出这些技术如何进入美容相关产品,如智能发刷(和口红)。
来自 Zalando Research 的 Roland Vollgraf 讨论了深度学习在服装项目上的应用。通过学习产品图片、文字描述和供应商属性,他们创建了一个“时尚 DNA”,它可以应用于聚类项目,也可以生成不存在的服装项目…还没有。
搜索&推荐
Google Research的 Aleksandr Chucklin 做了一个关于搜索引擎结果页面评估的演示(Arxiv 论文此处)。这是另一个展示搜索结果评估变得多么微妙的演讲——有关于移动/网络搜索差异的研究,关于评估“良好放弃”的研究,以及关于评估混合内容和非线性搜索结果页面的质量的研究。
我在 Skyscanner 做了一个关于引导目的地发现系统的演讲,并且可能是少数几个没有讨论深度学习应用的人之一(至少现在是这样!).更多信息请见另一篇博文。我想这是我第一次出现在潜望镜上。
购物&拍卖
来自野餐会的 Daniel Gleber 从机器学习的角度概述了野餐会(荷兰在线购物服务)正在解决的各种问题:它们跨越了整个顾客旅程,等等。例如,这包括扩展客户反馈系统,在该系统中,用户可以请求当前没有库存的商品,从一个松散的渠道变成一个自动分类系统。另一个重点领域是预测交付时间——图表的 y 轴显示的错误度量单位是秒!
来自 Catawiki 的 Peter Tegelaar 讨论了深度学习在 Catawiki 的拍卖系统中的各种应用。这包括从使用分类来支持产品分类到估计物品的价格。彼得还公开谈到了深度学习的一个对他们不起作用的应用(估计客户终身价值),并警告我们不要把一切都当成钉子,现在深度学习是最新的锤子。
机器人和硬件
来自波恩大学的 Sven Behnke 教授讨论了深度学习在机器人认知方面的应用。这个空间有各种角度。他讨论的许多有趣的应用之一是在 RoboCup 2016 中使用这些方法,参与者与在非结构化环境中执行自动分拣任务的机器人竞争(参见亚马逊机器人挑战赛)。
阿姆斯特丹大学的 Theo ge vers概述了他的团队在自动物体检测、分割和重建方面的研究。他演示了一个应用程序,可以从实时视频流中自动推断一个人的情绪、年龄和性别。毫不奇怪,第一个问题是关于隐私的。
NVIDIA 的 Adam Grzywaczewski概述了由于对深度学习的兴趣激增而出现的基础设施挑战。他收到的一个问题是,英伟达的 GPU 与谷歌的 TPUs 相比如何。他的回答?我不知道,我不能出去买谷歌的主板来和我们的比较。
小型机器人公司的 Ben Scott-Robinson 发表了一篇关于三个机器人的演讲:Tom、Dick 和 Harry,以及它们是如何被设计来帮助农民做从土壤分析到播种的一切事情的。将正在设计的机器人拟人化是一个有趣的焦点,看到这种“农业即服务”模式的发展将会很有趣。
来自 ING 的 Dor Kedem 发表了一篇关于大型计算集群中资源分配的演讲,以及如何使用机器学习和集群利用模式来节省大量资金,否则这些资金将被用于分配最终闲置的资源。
文档分析&嵌入
来自 Swisscom 的 Sotirios Fokeas 发表了一篇关于使用句子嵌入来提取文档中高覆盖率关键短语的演讲。句子嵌入是一种有趣的方法,最近也受到了很多关注。
来自凯泽斯劳滕大学的 Marcus Liwicki 给出了一个在分析文档方面行之有效的方法的概述。这包括著名的长短期记忆(LSTM)网络。
LSTMs 也出现在米哈伊·罗塔鲁关于 Textkernel 的谈话中;他做了一个关于使用深度学习从候选人的简历中自动解析数据,并使用这些数据将申请人与工作匹配的演讲。这包括考虑独立于语言的模型,并通过嵌入找到职位相似性。
用机器学习进行数据分析
苏黎世联邦理工学院的 Vahid Moosavi】发表了一篇关于使用数据来模拟城市现象的演讲,比如房地产价格和空气污染流量。他提出的一个关键点是,将数据和机器学习应用于传统上依赖领域知识的问题空间,正在将“专业知识”的定义从拥有已知问题答案的“T2”转向知道提出好问题的“T4”。
来自伦敦大学学院的 Ingo Waldmann 发表了一篇关于使用深度学习来自动分析和发现太阳系外行星的演讲(参见“梦想大气层”),以及天文学如何成为不断增长的研究领域的最新受害者,在这些领域中,数据可用性超过了我们的分析能力。
用深度学习扩充专家
来自 Scyfer 的 Tijmen Blankevoort】谈到了人在回路或主动学习。这包括在医学成像中的应用。来自 COSMONiO 的 Larens Hogeweg 也讨论了深度学习在医学成像上的应用。特别是,他专注于从“小数据”(甚至 1 或 2 个样本)中学习,并展示了方法如何能够很好地推广。
贝叶斯方法
来自 alpha-i 的 Christopher Bonnett 介绍了在深度学习中使用贝叶斯方法来揭示模型预测中的不确定性,以及预测本身。
来自 Freeletics 的 Laith Alkurdi 发表了一篇关于贝叶斯方法如何被用于在 Freeletics 应用程序中建模用户和创建“教练人工智能”的演讲。
小组讨论
第一天的小组讨论重点是投资人工智能。该小组由马修·布拉德利( Forward Partners )主持,成员包括朱利叶斯·吕斯曼( Earlybird Venture Capital )、卡洛斯·爱德华多·埃斯皮纳尔( Seedcamp )和丹尼尔·格莱伯(野餐)。有趣的片段包括评估初创公司在访问训练数据方面的竞争优势,以及在多面手人工智能初创公司和那些在特定垂直领域增长的初创公司之间进行平衡。
与会议的其他部分相比,第二场小组讨论有点变化,重点是应对网络安全方面日益增长的威胁。该小组由 Eelco Stofbergen ( CGI )主持,成员包括 Tanya Harris(Harrman Cyber)、Ian Bryant(trust worthy Software Foundation)和 Colin Williams(University of Warwick)。该小组收到的一个有趣的问题是,在安全攻击/防御中,“好人”还是“坏人”更好地利用了人工智能:答案是“我们必须拭目以待”。
收尾思路
#reworkMI 是一个有趣的会议,我遇到了一群很棒的人。每个人都对深度学习感到兴奋——这并不奇怪——而且这种兴奋主要是从非常技术的角度来看的。然而,许多演讲者都有幻灯片,讲述了他们目前在深度学习系统中面临的挑战(如下所示):这些挑战跨越了整个产品生命周期。仍有许多工作要做。
机器学习 101:梯度下降的直观介绍
毫无疑问,梯度下降是大多数机器学习(ML)算法的核心和灵魂。我绝对相信你应该花时间去理解它。因为一旦你这样做了,首先,你会更好地理解大多数最大似然算法是如何工作的。此外,理解基本概念是发展对更复杂主题的直觉的关键。
为了理解梯度下降的核心,让我们有一个运行的例子。这个任务是这个领域中的一个老任务——使用一些历史数据作为先验知识来预测房价。
但我们的目标是讨论梯度下降。为了做到这一点,让我们的例子足够简单,这样我们就可以集中在好的部分。
但是,在我们继续之前,你可以在这里得到代码。
基本概念
假设你想爬一座很高的山。你的目标是最快到达山顶。你环顾四周,意识到你有不止一条路可以开始。因为你在底部,所有这些选项似乎都让你更接近顶峰。
但是你想以最快的方式到达顶峰。那么,你如何做到这一点呢?你如何迈出一步让你尽可能接近顶峰?
到目前为止,还不清楚如何迈出这一步。这就是梯度可以帮助你的地方。
正如汗学院的视频中所说,梯度捕捉了一个多变量函数的所有偏导数。
我们一步一步来,看看效果如何。
简单来说,导数是函数在给定点的变化率或斜率。
以 f(x) = x 函数为例。 f(x) 的导数是另一个函数f’(x),它计算 f(x) 在给定点 x 的斜率。这种情况下,对于 x = 2 , f(x) = x 的斜率为 2x 或 22 = 4* 。
The slope of f(x)=x² at different points.
简单来说,导数指向最陡上坡的方向。好的一面是,梯度是完全一样的。除了一个例外,梯度是存储偏导数的向量值函数。换句话说,梯度是一个向量,它的每个分量都是一个特定变量的偏导数。
再以函数, f(x,y) = 2x + y 为例。
这里, f(x,y) 是一个多元函数。它的梯度是一个向量,包含 f(x,y) 的偏导数。第一个相对于 x,第二个相对于 y。
如果我们计算 f(x,y) 的偏导数,我们得到。
所以梯度是下面的向量:
请注意,每个分量表示每个函数变量的最陡上升方向。换个说法,梯度指向函数增加最多的方向。
回到爬山的例子,坡度把你指向最快到达山顶的方向。换句话说,梯度指向表面的较高高度。
同样,如果我们得到一个有 4 个变量的函数,我们将得到一个有 4 个偏导数的梯度向量。一般来说, n 变量函数会产生一个 n 维梯度向量。
然而,对于梯度下降,我们不想尽可能快地最大化 f ,我们想要最小化f。
但是,让我们先定义我们的任务,事情会看起来干净得多。
预测房价
我们要解决根据历史数据预测房价的问题。为了建立一个机器学习模型,我们通常至少需要 3 样东西。一个问题 T ,一个性能度量 P ,以及一个经验 E ,我们的模型将从这些地方学习模式。
为了解决任务 T ,我们将使用一个简单的线性回归模型。这个模型将从经验中学习,经过训练后,它将能够将其知识推广到看不见的数据中。
线性模型是一个很好的学习模型。它是许多其他 ML 算法的基础,如神经网络和支持向量机。
对于这个例子,体验 E ,是房屋数据集。房屋数据集包含圣路易斯奥比斯波县及其周边地区最近的房地产列表。
该集合包含 781 条数据记录,可在此处以 CSV 格式下载。在 8 个可用特性中,为了简单起见,我们将只关注其中的两个:尺寸和价格。对于 781 条记录中的每一条,以平方英尺为单位的大小将是我们的输入特征,价格将是我们的目标值。
此外,为了检查我们的模型是否恰当地从经验中学习,我们需要一种机制来衡量它的性能。为此,我们采用均方误差(MSE)作为性能指标。
多年来,MSE 一直是线性回归的标准。但是从理论上讲,任何其他的误差度量,比如绝对误差,都是可行的。MSE 的一些好处是它对较大误差的惩罚大于绝对误差。
既然我们已经形式化了我们的学习算法,让我们深入代码。
首先,我们使用 Pandas 加载 python 中的数据,并分离大小和价格特性。之后,我们将数据标准化,以防止一些特征的价值超过其他一些特征。此外,梯度下降与归一化数据相比收敛速度更快。
下图,你可以通过它的面积以平方米为单位看到房价的分布。
Distribution of house prices by Size. The data is normalized to the [0,1] interval.
线性回归模型的工作原理是在数据上画一条线。因此,我们的模型由一个简单的直线方程表示。
Line equation. m and b are the slope and the y-intercept respectively. The x variable is the placeholder for the input values.
对于线性模型,两个自由参数是斜率 m 和 y 截距 y 。这两个变量是我们要改变的旋钮,为了找到最好的线方程。
迭代地,我们将对它们进行细微的改变,这样它就可以沿着误差面上最陡下降的方向。在每次迭代之后,这些权重变化将改进我们的模型,以便它能够代表数据集的趋势。
在继续之前,请记住,对于梯度下降,我们希望采取与梯度相反的方向。
你可以把梯度下降想象成一个球滚下山谷。我们希望它坐落在大山的最深处,然而,很容易看出事情可能会出错。
In analogy, we can think of Gradient Descent as being a ball rolling down on a valley. The deepest valley is the optimal global minimum and that is the place we aim for.
根据球开始滚动的位置,它可能会停在谷底。但不是在最低的一个。这被称为局部最小值,在我们的模型中,谷是误差面。
注意,在类比中,并不是所有的局部最小值都是不好的。有些其实和最低(全局)的差不多低(好)。事实上,对于高维误差曲面,最常见的是采用这些局部最小值中的一个(不算太坏)。
类似地,我们初始化模型权重的方式可能导致它停留在局部最小值。为了避免这种情况,我们用来自具有零均值和低方差的随机正态分布的值来初始化两个权重向量。
在每次迭代中,我们将随机选取数据集的一个子集,并将其与权重进行线性组合。这个子集被称为小批量。线性组合后,我们将结果向量输入 MSE 函数,以计算当前误差。
有了这个误差信号,我们就可以计算误差的偏导数,得到梯度。
首先,我们得到关于 W0 的偏导数。
Partial with respect to W0
第二,我们做同样的事情,但是把 W1 作为演员。
Partial with respect to W1
有了这两个分音,我们就有了梯度向量:
The Gradient
其中 Err 是 MSE 误差函数。
这样,我们的下一步是使用梯度更新权重向量 W0 和 W1 ,以最小化误差。
我们希望更新权重,以便它们可以在下一次迭代中降低误差。我们需要使它们遵循每个梯度信号的相反方向。为了做到这一点,我们要在那个方向上迈出η大小的小步。
步长η是学习速率,它控制学习速率。根据经验,一个好的起点是 0.1。最后,更新步骤规则被设置为:
在代码中,完整的模型如下所示。看两个梯度 DW0 和 DW1 前面的负号。这保证了我们将采取与梯度方向相反的步骤。
更新重量后,我们用另一个随机小批量重复该过程。就是这样。
一步一步地,每一次权重更新都会导致线条向其最佳表现方向发生微小的移动。最后,当误差方差足够小时,我们可以停止学习。
Linear model conversion over time. The first weight updates cause the line to rapidly reach an ideal representation.
这个版本的梯度下降被称为小批量随机梯度下降。在这个版本中,我们使用训练数据的一个小子集来计算梯度。每个小批量梯度提供了最佳方向的近似值。即使梯度没有指向准确的方向,但实际上它收敛到非常好的解。
Error signal by epoch. Note that after decreasing the error signal very fast the model slows down and converges.
如果你仔细观察错误/事件图表,你会发现在开始时,学习的速度更快。
然而,经过一段时间后,它开始减速并趋于平稳。发生这种情况是因为,在开始时,指向最陡下降的梯度向量的幅度很大。结果,两个权重变量 W0 和 W1 遭受更剧烈的变化。
然而,随着它们越来越接近误差表面的顶点,梯度慢慢变得越来越小,这导致权重的变化非常小。
最后,学习曲线稳定下来,这个过程就完成了。
尽情享受吧!
机器学习 101 -简介
如果你是一名软件工程师,我敢肯定在某个时候你想做“一些机器学习”,破解宇宙的秘密,找到生命、宇宙和一切的最终答案。
然而,机器学习可能是一个相当大且令人生畏的话题:一种与你日常所做/使用的非常不同的范式,由大数据、数学模型驱动……简而言之:它超出了你通常的舒适区。
不过没关系——事实上,这是我将尝试向您介绍机器学习的主要概念的系列文章的第一部分。
© Michele Preziuso
其核心是,在机器学习中,一边是大数据,一边是你认为大数据可以解决或提供答案的问题。
大数据
一般来说,大数据是一组具有以下特征的数据:
Big data characteristics — © Michele Preziuso
Volume
生成和存储数据的数量。数据的大小决定了价值和潜在的洞察力,以及是否能被认为是大数据。
Variety数据的类型和性质。这有助于分析它的人有效地使用由此产生的洞察力。大数据来自文本、图像、音频、视频;此外,它通过数据融合完成缺失的部分。
速度
在这种情况下,生成和处理数据以满足增长和发展道路上的需求和挑战的速度。大数据通常是实时可用的。与小数据相比,大数据的产生更加持续。与大数据相关的两种速度是生成的频率以及处理、记录和发布的频率。
准确性
是对大数据的扩展定义,指的是数据质量和数据价值。捕获数据的数据质量可能会有很大差异,从而影响准确的分析。
如何使用机器学习解决大数据问题?
在你可以开始考虑你的机器学习解决方案之前,你必须从问题开始:你必须完全理解它并描述它。
- 有什么问题?
- 为什么需要解决?
- 你会怎么解决?
1.有什么问题?
a .非正式地描述一下
软启动:像向朋友描述问题一样描述问题
b .正式描述它
我发现用正式语言描述问题非常有用,这是汤姆·米切尔在他的书机器学习中描述的(我非常推荐阅读这本书,因为这是机器学习的一个很好的起点):
机器学习领域关注的是如何构造能随着经验自动改进的计算机程序的问题。
[…
如果计算机在 T 中的任务上的性能(由 P 测量)随着经验 E 而提高,则称其从关于某类任务 T 和性能测量 P 的经验 E 中学习。
我们应该能够用 E、T 和 P 写出问题的正式描述,或者更好的是,用标题 E、T 和 P 列出我们的问题
c .研究并列出相似的问题 研究并列出任何你认为与你正在试图解决的问题相似的问题。这可以帮助你找到解决方案,在你旅途中遇到问题和潜在问题之前限制它们的范围。
d .列出所有假设和额外信息 列出所有对你的问题的表述很重要但在描述中没有提到的假设。它们可能很微妙,但能帮助你更快达到预期的结果。
以分析点击流来预测流量峰值的经典示例为例,您可以说:
- 响应大小和用户代理无关紧要
- 推荐可能与模型相关
- 日期和时间是一个基本维度
2.为什么需要解决问题?
简单地考虑一下解决方案:你为什么需要构建它,你(或你的客户)将从解决这个问题中获得什么好处,…最后,你还应该考虑一下解决方案在短期内和长期内将如何使用。
通过自己的方式找到解决方案是可以的,但是您应该始终牢记长期目标,构建一个可以在未来的验证服务中轻松转换的解决方案——当然,除非您将此作为学习练习。
3.你会如何解决这个问题?
对你的数据进行取样并观察它。思考你的问题,从原始数据出发,探索你将如何获得最终结果。
编写一个高级算法,只需列出从数据收集开始执行的所有手动步骤,如何处理数据以及如何最终解决问题。
接下来就是自动化这些步骤:如果有必要的话,添加这些步骤,并构建你的解决方案的原型。容器、Jupyter 笔记本和许多其他工具是你的朋友,不要害怕使用它们,失败后再尝试。
一旦你定义了问题,你实际上可以开始构建你的机器学习解决方案——你会在这个系列的第二部分的中找到更多关于这个的内容。
机器学习 101 -解决问题的工作流程
你如何从原始数据到一个完全工作的机器学习解决方案?
如果你是一名软件工程师,我敢肯定在某个时候你想做“一些机器学习”,破解宇宙的秘密,找到生命、宇宙和一切的最终答案。
然而,机器学习可能是一个相当大且令人生畏的话题:一种与你日常所做/使用的非常不同的范式,由大数据、数学模型驱动……简而言之:它超出了你通常的舒适区。
不过没关系——事实上,这是我将尝试向您介绍机器学习的主要概念的系列文章的第二部分。
你可以在这里找到第一部分。
© Michele Preziuso
一旦你遵循了简介文章中强调的步骤,你就应该有一个非常清晰明确的问题,以及一堆高速、大容量、高度多样化和高度准确的数据,我们称之为大数据。
你如何从零到英雄?
- 准备您的数据
- 抽查机器学习算法
- 优化您的结果
一旦你有了想要的结果,是时候把数据可视化,成为一个英雄了!
机器学习 101 |监督、非监督、强化和超越
机器学习包含数据科学家和其他专业人员使用的大量想法、工具和技术。
让我们来看看其中的一些概念,以及如何用它们来解决问题。
监督机器学习的问题和解决方案
最简单的任务属于监督学习的范畴。在监督学习中,我们可以访问正确的输入输出对的示例,并在训练阶段展示给机器。手写识别的常见示例通常被视为监督学习任务。我们向计算机显示一些手写数字的图像以及这些数字的正确标签,计算机学习将图像与标签相关联的模式。
通过明确的例子,学习如何以这种方式执行任务,相对容易理解,也容易实现,但有一项至关重要的任务:只有当我们能够访问正确的输入输出对的数据集时,我们才能完成这项任务。在手写的例子中,这意味着在某些时候我们需要派人去对训练集中的图像进行分类。这是一项费力的工作,通常不可行,但在数据确实存在的地方,监督学习算法在广泛的任务中非常有效。
监督机器学习任务可以大致分为两个子组:回归和分类。回归是估计或预测连续量的问题。一个月后,S & P 500 的价值会是多少?孩子成年后会有多高?今年我们有多少客户会转向竞争对手?这些是归入回归范畴的问题的例子。为了在有监督的机器学习框架中解决这些问题,我们将收集过去处理相同问题的“正确答案”输入/输出对的例子。对于输入,我们将确定我们认为能够预测我们希望预测的结果的特征。
对于第一个问题,我们可以尝试收集给定日期标准普尔 500 下股票的历史价格以及一个月后标准普尔 500 的价值作为特性。这将形成我们的训练集,机器将尝试从中确定特征和最终标准普尔 500 值之间的某种函数关系。
分类处理将观察值分配到离散的类别,而不是估计连续的数量。在最简单的情况下,有两种可能的类别;这种情况被称为二元分类。许多重要的问题都可以用二元分类法来描述。某个客户会离开我们去找竞争对手吗?给定的患者是否患有癌症?给定的图像包含热狗吗?用于执行二进制分类的算法特别重要,因为许多用于执行更一般类型的分类(其中存在任意标签)的算法仅仅是一组一起工作的二进制分类器。例如,手写识别问题的简单解决方案是简单地训练一组二进制分类器:0-检测器、1-检测器、2-检测器等等,它们输出图像是它们各自数字的确定性。分类器仅输出其分类器具有最高确定性的数字。
无监督机器学习
另一方面,有一类完全不同的任务被称为无监督学习。监督学习任务找到我们有一个“正确答案”数据集可以学习的模式。无监督的学习任务可以找到我们找不到的模式。这可能是因为“正确的答案”是不可观察的,或不可行的,或者对于一个给定的问题,甚至没有一个“正确的答案”本身。
无监督任务的一大子类就是聚类的问题。聚类指的是将观察结果分组在一起,使得同一组的成员彼此相似,而与其他组的成员不同。这里的一个常见应用是在市场营销中,我们希望识别具有相似偏好或购买习惯的客户或潜在客户的细分市场。集群的一个主要挑战是,通常很难或者不可能知道应该存在多少个集群,或者集群应该是什么样子。
Source: https://arxiv.org/abs/1511.06434
一类非常有趣的无监督任务是生成模型。生成模型是模拟生成训练数据的过程的模型。一个好的生成模型将能够生成在某种意义上类似于训练数据的新数据。这种类型的学习是无监督的,因为生成数据的过程是不可直接观察的——只有数据本身是可观察的。
这一领域的最新发展导致了图像生成方面惊人的、有时甚至是可怕的进步。这里的图像是通过训练一种称为深度卷积广义对抗网络模型的无监督学习模型来生成面部图像,并向其请求微笑男子的图像而创建的。
强化学习、混合和超越
一种新型的学习问题最近引起了广泛关注,它被称为强化学习。在强化学习中,我们不为机器提供正确的输入输出对的例子,但我们确实以奖励信号的形式为机器提供了量化其性能的方法。强化学习方法类似于人类和动物的学习方式:机器尝试一系列不同的事情,当它做得好的时候就会得到奖励。
强化学习在解空间巨大或无限的情况下是有用的,并且通常应用于机器可以被认为是与其环境交互的代理的情况。这种模型的第一个大成功故事是由一个小团队完成的,训练了一个强化学习模型,只使用游戏的像素输出作为输入来玩雅达利视频游戏。该模型最终能够在三场游戏中超越人类玩家,而创建该模型的公司不久后被谷歌以超过 5 亿美元收购。
为了对玩 Atari 视频游戏的问题实施监督学习,我们需要一个数据集,该数据集包含数百万或数十亿个由真人玩的示例游戏,以供机器学习。相比之下,强化学习的工作原理是根据机器在任务中的表现给予奖励。简单的视频游戏非常适合这种类型的任务,因为分数可以作为一种奖励。机器继续通过模拟来学习哪种模式能最大化它的回报。
通常,一些或所有这些不同领域之间的混合方法会产生好的结果。例如,某些领域的一项重要任务是异常检测的任务。异常检测算法监控一些信号,并指示何时发生了奇怪的事情。欺诈检测就是一个很好的例子。我们需要一种算法来监控信用卡交易流,并标记出奇怪的交易。但是怪异是什么意思呢?这个问题适合于一种监督/无监督的混合方法。当然,我们希望算法能够检测到一些已知的模式,我们可以通过向监督学习模型显示已知欺诈模式的示例来训练它。但我们也希望能够检测出以前未知的潜在欺诈或其他异常活动的例子,这可能通过无监督学习的方法来实现。
你可以用机器学习的基础知识走很长的路
许多最先进的工具需要大量复杂的知识,包括高等数学、统计学和软件工程。对于一个想要开始的初学者来说,这可能看起来势不可挡,特别是如果你想与一些令人兴奋的新型模型合作,这些模型会产生令人毛骨悚然的微笑男子图像或驾驶自动驾驶汽车。
好消息是,你可以用基础的东西做很多事情,这些东西很容易得到。在 R 和 Python 中实现了各种监督和非监督学习模型,这些模型可以免费获得,并且可以在您自己的计算机上直接设置,甚至像线性或逻辑回归这样的简单模型也可以用于执行有趣和重要的机器学习任务。
有兴趣了解更多机器学习背后的科学吗? 了解更多关于我们的 数据科学 课程。
这篇文章最初出现在 BrainStation 博客上。
机器学习 101 | TELUS 的数据科学家解释道
如果你在技术领域工作,或者甚至正在考虑这个问题,你可能会遇到“机器学习”这个术语。在 Indeed.com 上的快速搜索显示,在撰写本文时,仅在温哥华就有超过 300 个包含“机器学习”一词的工作职位,这些工作的估计中值年薪超过 11 万美元。谷歌趋势显示,搜索词“机器学习”的受欢迎程度在最近三年增长了约 400%。显然,对具有机器学习知识的人有很高的需求——但它到底是什么?在这篇文章中,我将描述术语“机器学习”的确切含义,并解释为什么它对现代企业如此重要。
机器学习的概念定义
计算机科学家汤姆·M·米切尔有一个著名的定义,这个定义经常被使用,我将在这里改写一下。我们说一个计算机程序正在学习如何执行某项任务,如果它随着积累经验而在执行任务方面变得更好的话。因此,以这种方式学习的计算机程序被称为属于机器学习的范畴。
通过考虑不满足这个定义的程序可能有助于理解这个定义。在数学和计算机科学的一些领域中,一个重要的问题是寻找一个数的质因数。如果您将数字 1081 输入到解决这个问题的程序中,它将返回数字 23 和 47 作为输出,因为 1081 = 23 * 47。想出如何编写一个简单的程序来解决这个问题并不太难——一个显而易见的方法就是尝试将 1081 除以所有小于 1081 的数。这个程序完成了任务,但是它没有学习:它没有随着经验变得更好。你可以在一百万个输入上运行这个程序,它永远不会比你第一次运行它时更快或更好地分解数字 1081。
现在让我们考虑一种不同的任务:识别笔迹。假设我们想写一个程序,它输入一个手写数字的图像,输出一个从 0 到 9 的数字。想出一个简单的方法来解决这个问题并不像上面的整数分解问题那样简单,但是我们可能会有一些想法。你可能会写一个类似这样的程序:
- 如果图像是椭圆形,则返回 0。
- 如果图像是垂直线,则返回 1。
- 如果图像是上下两个圆,返回 8。
- …
也许这种方法注定失败的原因显而易见。不同的人写的不一样。用这些规则来捕捉每一个可接受的变化,哪怕是一个数字,都是不可行的,更不用说所有的 10 个数字了。但无论如何,即使你可以,这种类型的解决方案也不能算作机器学习:规则不会随着经验的增长而改变或适应。
机器学习方法以完全不同的方式解决这个问题。机器学习程序不是试图从一开始就强加规则,而是试图通过查看示例来发现规则。在机器学习解决方案中,我们不是试图提出规则,而是试图提出数据。我们将尽可能多的预先标记的数字图像收集到所谓的训练集中,用于训练计算机程序。我们把所有的 1 的图像拿出来,给计算机看,告诉它它们是 1。然后我们对 2 的图像做同样的处理,以此类推。对于每一个数字,计算机试图自己找出这个数字的图像有什么共同之处。
我在细节上挥了一下手,但是你可以看到这种方法将如何根据我们对机器学习的工作定义随着经验而改进。有些人在他们的 7 上画十字。如果我开始的图像集不包含任何画十字的 7,我的程序可能无法识别画十字的 7 应该被标记为 7。但是随着我增加它需要看的例子的数量,最终它会以一些交叉的 7 结束,并且会知道有时 7 是交叉的。类似地,任何其他可能发生的普通变化也是如此。
Images of 7’s from the MNIST dataset. Original source: http://cs.nyu.edu/~roweis/data.html
事实证明,设计巧妙的机器学习程序可以变得非常擅长这种任务。学习如何进行机器学习的一个常见的入门项目是在一个名为的著名图像数据集 MNIST 数据库上执行这项任务。非常简单的机器学习算法可以学习以优于 90%的准确率对这些图像进行正确分类,研究人员已经使用更先进的机器学习工具达到了优于 99.7%的准确率。
机器学习什么时候起作用?
为什么手写识别问题非常适合机器学习解决方案,而整数因式分解问题却不适合?有几个关键的区别。
一个是控制投入和产出之间关系的规则的复杂性。整数因式分解问题在某种技术意义上非常困难,但因式分解问题的输入和输出之间的关系非常简单:如果程序输出的数字是质数,并且相乘得到输入,那么你就得到正确的答案。将笔迹图像与它们所代表的数字联系起来的规则要复杂、模糊得多,也难以捕捉。
一个相关的区别是,在因式分解问题中,我们正在寻找一个精确的解决方案,而在手写识别问题中,我们对一个非常好的近似解决方案感到满意。事实上,手写识别问题的精确解决方案即使在理论上也是不可行的。一些 3 看起来像 5,一些 4 看起来像 9,唯一能确定正确标签的方法是询问第一个写下数字的人。对于手写识别的解决方案,我们所能合理期望的是它在大多数情况下是正确的。
最后,手写识别似乎天生就是一项统计或概率任务。作为人类,我们实际上从来不确定我们看到的是 9 还是 4。我们认为一个数字可能是 9,因为它看起来更像我们过去见过的 9,而不是我们过去见过的 4。大多数时候,我们对自己的猜测很有把握,但我们仍在猜测。我们也不应该期望计算机能做得比这更好。
为什么机器学习适用于商业问题
机器学习非常适合具有手写识别问题特征的问题,即高度复杂的问题,近似解决方案就足够的问题,以及固有的统计或概率问题。企业越来越发现他们的许多问题都有这些特征。例如,考虑标记欺诈性信用卡交易的问题。
- **复杂性:**识别欺诈性信用卡交易的规则非常复杂,而且不断变化。
- **近似值就足够了:**我们正在标记事务以供进一步审查,所以如果程序有时出错也没关系。
- **解决方案是概率性的:**在我们通过联系客户进行核实之前,我们永远不能确定交易是欺诈性的。
对于这样的商业问题,我们需要什么来实现机器学习解决方案呢?数据——现代企业大量供应的一种商品。由于这些原因,企业正在发现机器学习的工具非常自然地符合他们的活动和目标,这就是为什么我们看到机器学习工具和技术在商业领域的应用如此引人注目。
自从研究人员在大约 20 世纪 60 年代开始考虑这些想法以来,机器学习作为一个领域已经成熟了很多,现在有一些基本的工具和想法被认为是机器学习的基础。除了抽象的概念定义,还有一种任何开始学习机器的人都应该理解的语言。在我的下一篇关于机器学习的文章中,我将更仔细地看看这些工具和想法,并更详细地回顾现代机器学习的语言。
有兴趣了解机器学习背后的科学吗?看看我们即将推出的数据科学课程。
这篇文章最初出现在 BrainStation 博客上。
机器学习介绍#1
机器学习是在没有明确编程的情况下赋予计算机学习能力的研究领域。
简单来说,机器学习就是根据数据进行预测。
Architecture of Machine Learning
机器学习现在正被广泛使用。我们日常使用的一些例子:
脸书已经使用机器学习对新闻提要故事进行排名和个性化,过滤掉攻击性内容,突出趋势话题,对搜索结果进行排名,以及识别图像和视频内容。
脸书正在使用深度学习算法来读取图像和视频内容,并用于为业务做广告。假设如果照片中有养猫的人,那么他/她一定是爱猫人士,那么脸书可以向该用户宣传猫产品。
谷歌 几乎在每个产品中都使用机器学习:
- 照片 -:使用机器学习来识别人脸、位置、情绪等。
- Gmail -:分析电子邮件的内容并提供智能回复。
reference : http://mashable.com/2017/05/17/gmail-smart-replies/#YQTo1XeWYOqR
- Google now -:单词 person 的发音在世界不同的地方可能因人而异。“玩”这个词在各自的语言中发音不同。谷歌现在从不同的样本数据中学习,并在此基础上提供最佳搜索结果。
- Youtube : Youtube 使用机器学习来改善搜索结果。以前,它用于根据内容创建者提供的元标签和文本进行搜索,但现在它分析视频内容,并向用户提供最佳内容。
亚马逊 利用机器学习进行商品推荐。
优步 使用 UberEATS 中的机器学习来计算配送食物的预计时间。
The UberEATS app hosts an estimated delivery time feature powered by machine learning models built on Michelangelo reference :- https://eng.uber.com/michelangelo/
开发者可以使用谷歌、亚马逊、微软和 IBM 提供的服务来存储数据——为了机器学习的目的训练他们自己的模型。
有很多公司投资机器学习。Udacity 在博客上提供了关于日常使用机器学习的项目的信息。
有用的链接
机器学习:温和的介绍。
在过去十年左右的时间里,机器学习和广义的数据科学席卷了技术前沿。几乎每个科技发烧友都有或想拥有一份。2012 年,《哈佛商业评论》称数据科学家的工作为“21 世纪最性感的工作”,六年后,它仍然保持着这个标签。
**但是是什么让它如此吸引人呢?**让我们仔细看看。
机器学习指的是机器或计算机学习执行某项任务并在没有明确编程的情况下做得更好的各种技术和方法。
更正式地说,
如果由 P 测量的计算机程序在 T 中的任务的性能随着经验 E 而提高,则称该计算机程序相对于某类任务 T 和性能测量 P 从经验 E 中学习。
—汤姆·米契尔(机器学习)
仅仅是机器能够自己学习执行任务的想法,就已经成为今天围绕人工智能(AI)这个子领域的广泛兴奋和热情的最大驱动力之一。
最近几项令人兴奋的发展,如自动驾驶汽车和虚拟游戏机器人,更加点燃了这一领域的好奇心,而网飞和亚马逊使用的推荐系统、谷歌翻译、语音助手 Siri、Alexa 和谷歌助手等机器学习的应用和实现,已经使我们的日常生活比几年前更加方便。
机器学习工作流
机器学习大致包括以下步骤,
Machine Learning Work-flow
- 数据收集:第一步也是最重要的一步是收集与我们的问题陈述相对应的相关数据。准确的数据收集对于维护我们机器学习项目的完整性至关重要。
- 数据预处理:上一步收集的数据很可能还不适合我们的机器学习算法使用,因为这些数据可能是不完整、不一致,并且很可能包含许多错误和缺失 值。在处理完数据集中的所有不一致、错误和缺失数据后,我们继续进行特征工程。特征是所有独立单元共享的属性或特性,将对其进行分析或预测。特征工程是使用数据的领域知识来创建相关特征,使机器学习算法表现良好的过程。
- 模型训练:预处理后的数据首先主要分为两个部分,即训练/测试比通常为 70/30 或 80/20 的训练/测试数据集,对于较小的数据集,随着我们的原始数据集大小的增加,测试数据集的大小通常会减小,即使对于非常大的数据集,训练/测试比也应达到 99/1。模型训练是一个过程,机器学习算法通过该过程从训练数据集中获取见解,并且在训练期间学习特定参数,这些参数将最小化损失或者它在训练数据集中的表现有多差。
- 模型评估:在模型被训练之后,使用一些评估标准,在测试数据集上对它进行评估,这是它以前从未见过的。“以前从未见过”意味着模型没有从这个特定的数据集中获得任何洞察力来学习上面提到的那些参数。因此,该模型尝试仅使用从训练数据集获得的知识在测试数据集上执行。一些最常见的评估指标是准确度分数、F1 分数、平均绝对误差(MAE)和均方误差(MSE)。
- 性能改进:通过使用各种技术,如交叉验证、超参数调整,或者通过尝试多种机器学习算法并使用表现最佳甚至更好的算法,通过使用组合多种算法结果的集成方法,可以进一步改进模型在训练和测试数据集上的性能。
机器学习的类型
- 监督学习
- 无监督学习
- 强化学习
监督学习
监督学习是一种机器学习任务,其中使用训练数据集在给定的一组输入特征和输出特征之间建立关系,或者更具体地说是学习一个函数。然后,这个学习的函数进一步用于预测来自测试数据集的一组新输入的输出。监督学习对标记为的训练数据进行操作,即对于每组输入特征,我们都有相应的正确的输出到学习功能映射。
监督学习主要分为两个具体任务:分类和回归。
- 分类:将每组输入变量分类或分离到可能的类之一作为输出的监督学习任务,即输出将只由某个离散值表示。
例如,给定一个班级的学生在一年中以前的考试中的表现,我们希望预测某个特定的学生是否会通过期末考试。这种类型的问题通常被称为二进制分类问题,因为我们试图预测两类形式的输出,即“通过”或“失败”。具有两个以上类别进行预测的问题被称为多类别分类问题。
Supervised Learning Example
2.回归:它是一种监督学习任务,对于每一组输入变量,输出由连续的值表示。
修改前面的例子,给定一个班级的学生在一年中以前的考试中的表现,我们希望预测学生在期末考试中的分数百分比。分数表示为连续值,例如,百分比分数为 96.75/100 或 59.25/100。
无监督学习
与监督学习相反,无监督学习是一种机器学习任务,其中从由没有标记响应的输入数据组成的数据集得出推论,手头的主要工作是学习给定数据的结构和模式。由于我们没有标记数据,评估模型的性能不再像监督学习那样简单。最重要的无监督学习算法之一是聚类。
聚类:它的任务是将一组对象分组,使得同一组中的对象(称为聚类)彼此之间比其他组(聚类)中的对象更相似(在某种意义上)。
Clustering (grouping) the given unlabelled data into 3 clusters.
强化学习
强化学习(RL)是一项机器学习任务,涉及软件代理如何在环境中采取行动,以最大化某种累积回报的概念。它遵循击中和试验方法的概念。代理人的正确或错误答案会得到一分奖励或惩罚,基于获得的正奖励分,模型会训练自己。并且一旦被训练,它就准备好预测呈现给它的新数据。
举个例子,
一个孩子正在学习如何走路。在他真正能够行走之前,他有相当多的任务要完成,比如站立、保持平衡和迈出第一步。假设他的母亲拿着巧克力站在他身边,如果他成功地完成了这些任务的一部分,这将是孩子的奖励,如果他没有完成,他也不会得到奖励。所以,孩子一步一步地学习,去做那些能给他带来回报的事情,而不去做那些不会给他带来回报的事情。
Basic Reinforcement Learning Process
在这里,在这个类比中,孩子是代理人,地板和奖励系统(母亲)组成了环境他通过采取行动与之互动,即从一个状态改变到另一个状态,即从一个子任务到另一个子任务,以最大化他的积极奖励,其中,得到巧克力是积极奖励,没有得到巧克力是消极奖励**。**
这里有一个很棒的视频让你兴奋。它展示了一个代理如何在没有任何事先指导的情况下自学行走、奔跑、跳跃和攀爬。这个人工智能是由谷歌的 DeepMind 开发的。
深度学习
深度学习一直是人工智能像今天这样快速前进的最大贡献者之一。深度学习是机器学习的一个子领域,它利用了一种被称为人工神经网络(ANNs)的机器学习算法,这种算法是由人脑模糊地启发的。神经网络的主要吸引力在于其学习输入数据的复杂非线性表示的能力。
Different Model Performance Trends
如上图所示,深度学习模型往往在处理大量数据时表现良好,而旧的机器学习模型在达到某个饱和点后就会停止改善。还可以看出,更大(更深)的神经网络往往表现得更好,但它们招致更大的计算成本。那么为什么深度学习现在正在兴起呢?
正是因为这三大原因:
- 开发更好的算法技术和方法。
- 多亏了互联网,今天有了大量的数据。
- GPU 的出现增强了计算能力。
最后的想法
机器学习发展得如此之快、如此之好,以至于它几乎可以应用于所有其他研究领域。大公司越来越多地投资于基于 ML 的解决方案,以解决人类难以解决或耗时的问题。现在有大量的资源可以用来开始机器学习,这些资源在五年前甚至都不存在,在无数的平台上以如此多不同的形式存在。
现在是进入机器学习和人工智能领域的最佳时机。
机器学习:一条必经之路
随着科技的进步,这个时代变得多么容易,而且每天都在进步。从自动人脸检测到癌症预测,天气预报到地震预测,你的私人助理,如苹果的 Siri 和谷歌的助手(对不起 Cortana),智能机器人到自动驾驶汽车,还有更多应用有待开发。机器学习自诞生以来已经走过了数英里,并从根本上扩大了计算的范围。现在你有了能做决定的智能电脑,让你的生活变得简单。这个博客只是关于我对机器学习的了解和思考。
这个旅程始于六个月前,我在寒假开始学习 ML。我投资了我的 15 天假期,并对它产生了兴趣。对我来说,ML 不仅仅是关于统计学,概率,而是更多的高级概念,它是我在数学课上学到的知识的应用。最初对我来说,理解这些概念非常困难,因为观想能力差,所以我把它留了下来,想在暑假开始。所以我又开始学习这些概念,并且我决定我不会停止学习,直到我从自己身上得到积极的反馈。
我从一个著名的学习平台 Coursera 开始学习 ML,导师是 Andrew ng,他是 ML 初学者领域的知名人士之一。我真的很喜欢这门课程,到今天为止,我已经了解了回归概念,这是监督学习的一部分,简单地说,它是给定数据集的直线拟合或曲线拟合,并基于这些对给定特征集的输出进行预测。例如,假设你要去一个城市,在你的预算范围内寻找一所房子,你有以下一组数据
- 卧室数量
- 公寓类型
- 学校数量
- 该地区的公共汽车数量
-
然后使用回归,您可以获得该地区房屋的租金或价格(大约)信息。这些是我为智能城市假设的一些功能,您可以添加/删除更多功能,这些功能可以为您提供更好的训练集。这只是回归的一个很小的例子,这个概念有很广泛的应用。这只是我旅程中很小的一部分,还有更多的路要走,更多的路要走。
- उत्कर्ष_उवाच
机器学习算法 vs 精算……谁会赢?
机器学习算法 vs 精算……保险行业谁会赢?
机器学习算法与精算科学:
在当今快节奏的技术世界中,保险业高管或有抱负的领导者必须考虑未来、投资者预期、扩展和利用技术,以及这个新问题 “机器学习算法与精算科学?”
ML 与 AS——有什么区别?
机器学习(ML) 是一种人工智能(AI),它为计算机提供了学习的能力,而无需显式编程。机器学习专注于开发计算机程序,这些程序可以在接触到新数据时教会自己成长和变化。
精算学(AS) 是应用数学和统计方法评估保险、金融等行业和职业风险的学科。精算师是通过密集的教育和丰富的经验在该领域获得资格的专业人士。精算师使用统计推断来帮助预测未来。精算师帮助保险商理解数据中的“为什么”,他们为试图通过统计数据理解风险的保险商和组织带来巨大的价值。
机器学习算法与精算科学是保险行业领导者持续争论的话题。最终,一名精算师将与一名数据科学家合作,构建一种可以做到这两点的算法和工具。在此之前,我们将关注这两个领域相互竞争的观点。
承销商需要知道原因吗?如果他们能通过 ML 算法得到结果呢?
你或你的股东会为了增加规模、相关性和速度而牺牲风险或股本的最佳回报吗?这一代保险公司/再保险人的问题。
如果你可以使用 ML 算法获得 8–9%的净资产收益率,同时降低你的费用和规模,那么使用传统精算学获得 10%的净资产收益率是否是可持续的?如果 ML 算法产生了同样的 ROE ~10%会怎样?
这些例子强调了一个基本问题——精算过程是否提供了足够的价值来支持时间、成本和约束?或者,行业高管是否应该专注于使用 ML 算法来构建类似的回报&利用该技术来扩大规模,提高与客户/经纪人/市场的相关性。
如果不是,您是否愿意使用算法返回承保结果的 Beta 值,而不是使用精算师生成 alpha 值?
机器学习算法方法的优势
费用节省
如果需要更少的精算师,速度会提高,承销商可以更容易地调整他们的投资组合,从而节省更多的费用。
如果这些节省下来的钱被用来雇佣更多的理赔人员。用于评估风险价格(精算工资)的购置费用中节省的资金可以重新分配给索赔人员/资源。正如这里讨论的,我们认为索赔是分配资源以改善结果的最佳方式之一——重点应放在损失成本方面。这应该是被保险人和保险公司的重点——以及我们如何随着时间的推移为客户增加价值。
通过雇佣额外的索赔专家,保险公司可以节省成本。例如,节省 250 万美元对损失率的影响相当于承保 1000 万至 2500 万美元的保费——取决于产品线损失率。当您看到对底线的影响时,增加理赔人员会对您有所帮助。
时间分析速度
如果算法正在处理提交信息,则可以提高事务和分析的速度。因此,为承保人提供了改进的覆盖范围和风险分析的周转时间。
刻度
ML 算法的性质将允许保险公司/再保险公司扩大规模和增长。这种规模提供了许多好处——如前所述,有助于降低费用和费用比率。这种规模还将帮助你维持与核心客户的首选关系,以及吸收冲击损失的能力。
从 1 亿美元的投资组合中赚取 3000 万美元的利润,与从 1.5 亿美元的投资组合中赚取 5000 万美元的利润一样好还是更好?
结果
我们预计这场辩论将持续相当长一段时间,因为该行业历来不愿接受变革。但是,我们预测会发生以下情况:
- 保险业将需要数据工程师
- 保险业将需要数据科学家
- 保险业将需要更少的“纯精算师”资源
- 软件开发人员将构建平台,为非数据科学家提供易于使用的输出
- 保险公司和再保险公司拥有的数据和员工将成为他们创造 Alpha 的最有价值的资产
- 我们预测这些新工具将产生不同类型的未来保险公司/再保险公司,以及来自投资者的不同期望。
- 承销商将继续销售产品,评估风险,并改变覆盖范围,但必须精通数据科学领域
- 两种不同类型的保险公司
- 快速报价和小行——这将产生市场的 beta 回报
- 慢速报价较大的行使用精算科学—生成 alpha
- 两种不同类型的再保险人
- 快速报价和小行——这将产生市场的 beta 回报
- 慢速报价较大行使用精算科学-生成 alpha
更多关于保险行业的信息可以在www.myinsuranceshark.com找到
Python 中的层次凝聚聚类算法实例
分层聚类算法将相似的对象分组为称为簇的组。有两种类型的分层聚类算法:
- 凝聚—自下而上的方法。从许多小集群开始,将它们合并在一起以创建更大的集群。
- 分裂——自上而下的方法。从单个集群开始,然后将它分成更小的集群。
分层聚类的一些优点和缺点
赞成的意见
- 不假设特定数量的聚类(即 k 均值)
- 可能对应有意义的分类法
骗局
- 一旦决定合并两个集群,就无法撤销
- 对于大型数据集太慢,O(𝑛2 log(𝑛))
它是如何工作的
- 使每个数据点成为一个群集
2.取两个最近的集群,并使它们成为一个集群
3.重复步骤 2,直到只有一个集群
系统树图
我们可以使用树状图来可视化分组的历史,并计算出最佳的聚类数。
- 确定不与任何其他聚类相交的最大垂直距离
- 在两端画一条水平线
- 聚类的最佳数量等于穿过水平线的垂直线的数量
例如,在下面的情况中,集群数量的最佳选择将是 4 。
链接标准
类似于梯度下降,您可以调整某些参数,以获得截然不同的结果。
链接标准指的是如何计算聚类之间的距离。
单键
两个聚类之间的距离是每个聚类中两点之间的最短距离
完全连锁
两个聚类之间的距离是每个聚类中两点之间的最长距离
平均连锁
聚类之间的距离是一个聚类中的每个点到另一个聚类中的每个点的平均距离
病房联动
聚类之间的距离是所有聚类内的平方差之和
距离度量
您用来计算数据点之间距离的方法将影响最终结果。
欧几里得距离
两点之间的最短距离。例如,如果 x=(a,b)且 y=(c,d),则 x 和 y 之间的欧几里德距离为√(a c)+(b d)
曼哈顿距离
想象一下,你在一个大城市的市中心,你想从 A 点到 b 点。你不能穿过建筑物,而是必须沿着不同的街道行走。例如,如果 x=(a,b)且 y=(c,d),则 x 和 y 之间的曼哈顿距离为| a c |+| b d |
python 中的示例
让我们看一个具体的例子,看看我们如何使用层次凝聚聚类来标记数据。
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from sklearn.cluster import AgglomerativeClustering
import scipy.cluster.hierarchy as sch
在本教程中,我们使用 csv 文件,其中包含一个客户列表,包括他们的性别、年龄、年收入和支出分数。
如果你想跟进,你可以从 superdatascience 网站获得数据集。
[## 机器学习 A-Z:下载实践数据集-超级数据科学-大数据|分析职业生涯…
欢迎来到机器学习课程的数据仓库,作者是基里尔·叶列缅科和哈德琳·德·庞特维斯…
www.superdatascience.com](https://www.superdatascience.com/machine-learning/)
为了稍后在图表上显示我们的数据,我们只能取两个变量(年收入和支出分数)。
dataset = pd.read_csv('./data.csv')
X = dataset.iloc[:, [3, 4]].values
查看树状图,不与任何集群相交的最高垂直距离是中间的绿色。假设有 5 条垂直线穿过阈值,则最佳聚类数是 5。
dendrogram = sch.dendrogram(sch.linkage(X, method='ward'))
我们创建了一个实例AgglomerativeClustering
,使用欧几里得距离作为点之间距离的度量,并使用 ward 连接来计算聚类的邻近度。
model = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
model.fit(X)
labels = model.labels_
属性返回一个整数数组,其中的值对应于不同的类别。
我们可以使用简写符号将属于某一类别的所有样本显示为特定的颜色。
plt.scatter(X[labels==0, 0], X[labels==0, 1], s=50, marker='o', color='red')
plt.scatter(X[labels==1, 0], X[labels==1, 1], s=50, marker='o', color='blue')
plt.scatter(X[labels==2, 0], X[labels==2, 1], s=50, marker='o', color='green')
plt.scatter(X[labels==3, 0], X[labels==3, 1], s=50, marker='o', color='purple')
plt.scatter(X[labels==4, 0], X[labels==4, 1], s=50, marker='o', color='orange')
plt.show()
Python 中的均值漂移聚类算法示例
均值漂移是一种分层聚类算法。与有监督的机器学习算法相比,聚类试图在没有首先对标记数据进行训练的情况下对数据进行分组。聚类被广泛应用于搜索引擎、学术排名和医学等领域。与 K-Means 相反,当使用 Mean Shift 时,您不需要事先知道类别(聚类)的数量。均值漂移的缺点是计算量很大——O(n)。
它是如何工作的
- 定义一个窗口(内核的带宽)并将该窗口放置在一个数据点上
2.计算窗口中所有点的平均值
3.将窗口的中心移动到平均值的位置
4.重复步骤 2 和 3,直到收敛
python 中的示例
让我们看看如何使用 python 中的均值漂移算法来标注数据。
import numpy as np
import pandas as pd
from sklearn.cluster import MeanShift
from sklearn.datasets.samples_generator import make_blobs
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
我们使用make_blobs
方法生成自己的数据。
clusters = [[1,1,1],[5,5,5],[3,10,10]]
X, _ = make_blobs(n_samples = 150, centers = clusters, cluster_std = 0.60)
在训练模型之后,我们存储聚类中心的坐标。
ms = MeanShift()
ms.fit(X)
cluster_centers = ms.cluster_centers_
最后,我们在 3D 图形中绘制数据点和质心。
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')ax.scatter(X[:,0], X[:,1], X[:,2], marker='o')ax.scatter(cluster_centers[:,0], cluster_centers[:,1], cluster_centers[:,2], marker='x', color='red', s=300, linewidth=5, zorder=10)plt.show()
K-means 聚类 Python 示例
K-Means 聚类是一种无监督的机器学习算法。与传统的监督机器学习算法相比,K-Means 试图在没有首先用标记数据训练的情况下对数据进行分类。一旦运行了算法并定义了组,任何新数据都可以很容易地分配到最相关的组。
K-Means 的实际应用包括:
- 客户特征分析
- 市场分割
- 计算机视觉
- 搜索引擎
- 天文学
它是如何工作的
- 选择 K (即 2) 个随机点作为称为质心的聚类中心
2.通过计算每个数据点相对于每个质心的距离,将每个数据点分配给最近的聚类
3.通过计算指定点的平均值来确定新的聚类中心
4.重复第 2 步和第 3 步,直到集群分配没有任何变化
选择正确的集群数量
通常情况下,您要处理的数据会有多个维度,因此很难可视化。因此,最佳聚类数不再明显。幸运的是,我们有办法从数学上确定这一点。
我们绘制了聚类数和聚类平方和(WCSS)之间的关系,然后我们选择了 WCSS 变化开始变平的聚类数(肘形法)。
WCSS 被定义为集群的每个成员与其质心之间的平方距离之和。
例如,为图 1 的计算的 WCSS 将大于为图 2 的计算的 WCSS。
Figure 1
Figure 2
密码
让我们看看如何使用 python 的 K-Means 算法对数据进行分类。和往常一样,我们需要从导入所需的库开始。
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import KMeans
在本教程中,我们将使用来自sklearn.datasets
模块的make_blobs
函数生成我们自己的数据。centers
参数指定了集群的数量。
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)plt.scatter(X[:,0], X[:,1])
即使我们已经知道了最佳的集群数量,我认为我们仍然可以从使用肘方法来确定它中获益。为了获得图表中使用的值,我们使用不同数量的分类来训练多个模型,并且每次都存储intertia_
属性(WCSS)的值。
wcss = []for i in range(1, 11):
kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
plt.plot(range(1, 11), wcss)
plt.title('Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
接下来,我们将使用上一步中确定的最佳聚类数(4)对数据进行分类。k-means++
确保你得到的东西不会落入随机初始化陷阱。
kmeans = KMeans(n_clusters=4, init='k-means++', max_iter=300, n_init=10, random_state=0)
pred_y = kmeans.fit_predict(X)plt.scatter(X[:,0], X[:,1])
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red')
plt.show()