2017年11月10日星期五

NIPS 2017 Spotlight论文Bayesian GAN的TensorFlow实现

用生成模型学习高维自然信号(比如图像、视频和音频)长期以来一直是机器学习的重要发展方向之一。来自 Uber AI Lab 的 Yunus Saatchi 等人今年五月提出了 Bayesian GAN——利用一个简单的贝叶斯公式进行端到端无监督/半监督 GAN 学习。该研究的论文已被列入 NIPS 2017 大会 Spotlight。最近,这篇论文的另一作者 Andrew Gordon Wilson 在 GitHub 上发布了 Bayesian GAN 的 TensorFlow 实现。


项目链接:http://ift.tt/2yLZYpV


论文:Bayesian GAN




论文链接:http://ift.tt/2s5BIaW


摘要:生成对抗网络(GAN)可以隐性地学习难以用显性似然(explicit likelihood)建模的图像、音频和数据的丰富分布。我们展示了一种实际的贝叶斯公式,用 GAN 进行无监督和半监督学习。在该框架下,我们使用随机梯度哈密尔顿蒙特卡罗(Hamiltonian Monte Carlo)来边缘化生成器和判别器的权重。得到的方法很直接,且可在没有标准干预(如特征匹配或小批量判别)的情况下达到不错的性能。通过探索生成器参数具有表达性的后验,贝叶斯 GAN 避免了模式崩溃(mode-collapse),输出可解释的多种候选样本,在 SVHN、CelebA 和 CIFAR-10 等多个基准数据集上取得了顶尖的半监督学习量化结果,优于 DCGAN、Wasserstein GAN 和 DCGAN。

介绍

在贝叶斯 GAN 中,我们提出了生成器和判别器权重的条件后验,通过随机梯度哈密尔顿蒙特卡罗边缘化这些后验。贝叶斯 GAN 的主要特性有:(1)在半监督学习问题上的准确预测;(2)对优秀性能的最小干预;(3)响应对抗反馈的推断的概率公式;(4)避免模式崩溃;(5)展示多个互补的生成和判别模型,形成一个概率集成(probabilistic ensemble)。

我们介绍了一个生成器参数的多模态后验。这些参数的每个设置对应数据的不同生成假设。这里我们将展示两种权重向量设置下生成的样本,不同的权重向量设置对应不同的写作风格。贝叶斯 GAN 保留该参数分布。相反,标准 GAN 用点估计(类似最大似然解决方案)来展示整个分布,降低了数据的可解释性。




环境需求

该代码有以下依赖项(版本号很关键)

  • python 2.7
  • tensorflow==1.0.0

在 Linux 上安装 TensorfFow 1.0.0,请按照 http://ift.tt/2At5KJm

  • scikit-learn==0.17.1

你可以使用下列命令安装 scikit-learn 0.17.1:

  1. pip install scikit-learn==0.17.1

或者,使用提供的 environment.yml 文件创建 conda 环境,并进行设置:

  1. conda env create -f environment.yml -n bgan

然后,使用下列命令加载环境:

  1. source activate bgan

训练选项

bayesian_gan_hmc.py 具备以下训练选项。

  • --out_dir:文件夹路径,用于存储输出
  • --n_save: 每 n_save 次迭代存储的样本和权重;默认值 100
  • --z_dim: 生成器 z 向量的维度;默认值 100
  • --data_path:数据路径;具体讨论详见 http://ift.tt/2i3JTRR
  • --dataset:可以是 mnist、cifar、svhn 或 celeb;默认 mnist
  • --gen_observed: 生成器「观察到」的数据;影响噪声变量和先验的缩放;默认值 1000
  • --batch_size:训练的批量大小;默认值 64
  • --prior_std:权重先验分布的 std;默认值 1
  • --numz:和论文中的 J 一样; z 的样本数,实现整合;默认值 1
  • --num_mcmc: 和论文中的 M 一样;每个 z 的 MCMC NN 权重样本数;默认值 1
  • --lr: Adam 优化器使用的学习率;默认值 0.0002
  • --optimizer:使用的优化方法:adam (tf.train.AdamOptimizer) 或 sgd (tf.train.MomentumOptimizer);默认 adam
  • --semi_supervised:进行半监督学习
  • --N:半监督学习所需标注样本数量
  • --train_iter:训练迭代次数;默认值 50000
  • --save_samples:保存训练过程中生成的样本
  • --save_weights:训练过程中,保存权重
  • --random_seed:随机种子;如果使用 GPU,那么注意设置该种子不会引起 100% 的可复现结果

你还可以用--wasserstein 运行 WGAN,或用--ml_ensemble 训练 DCGAN 的集成。尤其是,你可以使用--ml_ensemble 1 训练一个 DCGAN。

使用

安装

1. 安装所需依赖项

2. 复制该 repository

合成数据

你可以使用 bgan_synth 脚本运行论文中的合成实验。例如,以下命令用于训练贝叶斯 GAN(D=100,d=10),进行 5000 次迭代,并把结果保存在

  1. ./bgan_synth.py --x_dim 100 --z_dim 10 --numz 10 --out

运行以下命令使用相同的数据运行 ML GAN:

  1. ./bgan_synth.py --x_dim 100 --z_dim 10 --numz 1 --out

bgan_synth 的参数有 --save_weights、--out_dir、--z_dim、--numz、--wasserstein、--train_iter 和 --x_dim。x_dim 控制观测数据(论文中的 x)的维度。通过这个链接查看其它参数的说明:http://ift.tt/2AuxME8

运行了上面的两个命令之后,你可以在里查看每 100 次迭代后的输出。例如,第 900 次迭代的贝叶斯 GAN 的输出结果如下:

相对地,标准 GAN(numz=1,强制执行 ML 评估)的输出结果如下:

可以清晰地看到在这个合成数据的例子中,标准 GAN 出现了模式崩溃的趋势,而贝叶斯 GAN 完全没有这样的问题。

你可以查看 synth.iptnb,进一步探索合成实验,并生成詹森-香农差异图。

MNIST、CIFAR10、CELEBA、SVHN

bayesian_gan_hmc 脚本允许在标准和自定义数据集上训练模型。下面,我们将介绍如何使用该脚本。

数据准备

为了重现在 MNIST、CIFAR10、CelebA 和 SVHN 数据集上的实验,你需要准备这些数据,并使用一个正确的——data_path。

  • 对于 MNIST,你不需要准备数据,并可以提供任意的——data_path;
  • 对于 CIFAR10,请从该地址(http://ift.tt/2i3Kh2W Python 版本;然后使用包含 cifar-10-batchs-py 的目录的路径作为——data_path;
  • 对于 SVHN,请从该地址(http://ift.tt/2AvwDvZ train_32x32.mat 和 test_32x32.mat 文件,并使用包含这些文件的目录的路径作为——data_path;
  • 对于 CelebA,你需要安装 OpenCV。数据下载地址:http://ift.tt/2i3LE1n celebA 文件夹,该文件夹包含 Anno 和 img_align_celeba 子文件夹。其中 Anno 必须包含 list_attr_celeba.txt,img_align_celeba 必须包含.jpg 文件。你还需要通过在——data_path (其中是包含了 celebA 的文件夹的路径)中运行 datasets/crop_faces.py 脚本对图像进行剪裁。训练模型的时候,你需要在——data_path 中使用相同的


无监督学习


你可以在没有 -- semi 参数的情况下通过运行 bayesian_gan_hmc 脚本对模型进行无监督训练。例如,使用以下命令:

  1. ./bayesian_gan_hmc.py --data_path --dataset svhn --numz 1 --num_mcmc 10 --out_dir

  2. --train_iter 75000 --save_samples --n_save 100

在 SVHN 数据集上训练模型。该命令会使用这个方法执行 75000 次迭代,每 100 次迭代保存样本。这里必须是保存结果的目录。可查看数据准备部分,了解如何设置。可查看训练选项部分,了解其它训练选项。



半监督训练


你可以使用--semi 选项来运行 bayesian_gan_hmc,对模型进行半监督训练。使用-N 参数设置训练所用标注样本的数量。例如,使用

  1. ./bayesian_gan_hmc.py --data_path --dataset cifar --numz 1 --num_mcmc 10

  2. --out_dir --train_iter 75000 --N 4000 --semi --lr 0.00005

在 CIFAR10 数据集上用 4000 个标注样本训练该模型。该命令使训练经历 75000 次迭代,输出结果储存在 文件夹中。

要想在 MNIST 数据集上使用 200 个标注样本训练该模型,你需要使用以下命令:

  1. ./bayesian_gan_hmc.py --data_path / --dataset mnist --numz 5 --num_mcmc 5

  2. --out_dir --train_iter 30000 -N 200 --semi --lr 0.001

自定义数据

要想在自定义数据集上训练该模型,你需要用特定的接口定义类别。假设我们想在 digits 数据集上训练模型。该数据集包含 8x8 数字图像。假设数据的储存格式为 x_tr.npy、y_tr.npy、x_te.npy 和 y_te.npy。我们假设 x_tr.npy 和 x_te.npy 的形态为 (?, 8, 8, 1)。然后在 bgan_util.py 中定义该数据集对应的类别,如下所示:

  1. class Digits:

  2.    def __init__(self):

  3.        self.imgs = np.load('x_tr.npy')

  4.        self.test_imgs = np.load('x_te.npy')

  5.        self.labels = np.load('y_tr.npy')

  6.        self.test_labels = np.load('y_te.npy')

  7.        self.labels = one_hot_encoded(self.labels, 10)

  8.        self.test_labels = one_hot_encoded(self.test_labels, 10)

  9.        self.x_dim = [8, 8, 1]

  10.        self.num_classes = 10

  11.    @staticmethod

  12.    def get_batch(batch_size, x, y):

  13.        """Returns a batch from the given arrays.

  14.        """

  15.        idx = np.random.choice(range(x.shape[0]), size=(batch_size,), replace=False)

  16.        return x[idx], y[idx]

  17.    def next_batch(self, batch_size, class_id=None):

  18.        return self.get_batch(batch_size, self.imgs, self.labels)

  19.    def test_batch(self, batch_size):

  20.        return self.get_batch(batch_size, self.test_imgs, self.test_labels)

该类别必须具备 next_batch 和 test_batch,以及 imgs、labels、test_imgs、test_labels、x_dim 和 num_classes。

现在,我们可以把 Digits 类输入到 bayesian_gan_hmc.py:

  1. from bgan_util import Digits

将下列行添加至处理--dataset 参数的代码中:

  1. if args.dataset == "digits":

  2.    dataset = Digits()

准备过程完成后,我们可以使用以下命令训练模型:

  1. ./bayesian_gan_hmc.py --data_path --dataset digits --numz 1 --num_mcmc 10

  2. --out_dir --train_iter 5000 --save_samples




]]> 原文: http://ift.tt/2i4sUyW
RSS Feed

机器知心

IFTTT

从遗传算法到OpenAI新方向:进化策略工作机制全解

在这篇文章中,作者用一些简单的视觉案例解释了进化策略(Evolution Strategies)的工作方式,其中包括了简单进化策略、简单遗传算法、CMA-ES、自然进化策略以及 OpenAI 的进化策略,并给出了形象的动态图过程展示。



「适者生存」


我尽量简化了公式,如果读者想理解更多的细节,我提供了原始文章的链接。这是这一系列文章的第一篇,在文章中,我将展现如何将这些算法应用到诸如 MNIST, OPENAI Gym, Roboschool 和 PyBullet 等多种环境中。


简介


神经网络模型具有高度的表达性和灵活性。如果能找到一系列合适的模型参数,我们就可以运用神经网络去解决许多有挑战性的问题。深度学习的成功主要来源于反向传播算法,因为它可以有效地使用每个模型的参数去计算目标函数的梯度。有了这些梯度,我们就能有效地在参数空间中选取好的解,来解决我们的神经网络解决难题。


然而,也有许多反向传播算法无法应用的问题。举个例子,在强化学习(reinforcement learning)当中,我们同样可以训练一个神经网络,从而形成一系列的行动决策,去完成环境中的某些任务。然而,特别是在未来多个时间步才能实现回报的情况下,通过当下的动作去估计未来奖励信号的梯度是非常重要的。退一步说,即使我们可以计算准确的梯度,在强化学习中也有许多陷入局部最优的情况。



「陷入局部最优」


整个强化学习领域都致力于研究这个信度分配问题(credit-assignment problem),近年来也有很大的进展。然而,当奖励信号非常稀疏时,信度分配问题仍非常困难。在真实世界里,奖励可能是稀疏且有噪声的。有时候,我们只是得到了一个简单的奖励,比如一张年终奖金支票,而且其数目取决于我们的雇佣者,我们可能很难确切地知道为什么奖金如此之低。对于这些问题,与其依赖这些高噪声、且很有可能无意义的未来梯度信号估计,我们不如直接忽略任何的梯度信号,并尝试着使用一些黑盒优化技术(black-box optimization),例如遗传算法(genetic algorithms)或进化策略。


OpenAI 发表了一篇名为「用作强化学习的可扩展替代的进化策略」(Evolution Strategies as a Scalable Alternative to Reinforcement Learning (http://ift.tt/2nQhtzu))的论文,(机器之心文章:深度 | 谷歌和 OpenAI 新研究:如何使用达尔文进化论辅助设计人工智能算法?)其中表示,尽管进化策略比强化学习的数据效率低,它仍然有许多优势。进化策略摈弃梯度计算的方法,从而能更有效地评价这些算法。同时,利用进化策略算法,很容易将计算分配到上千台机器中完成并行计算。研究发现,通过多次运行进化策略算法,相较于强化学习算法,使用进化策略算法发现的策略种类更多。


我想指出,即使是对那些识别机器学习模型的问题,如设计一个神经网络的架构,我们也无法直接计算梯度。尽管诸如强化学习、进化策略、遗传算法,能够被应用于搜索模型空间以及用于解决实际问题的模型参数,这篇文章只会关注一部分,即将这些算法应用到预定义的模型中,并找寻模型参数。


什么是进化策略?



「二维 Rastrign 函数有许多局部最优(来源:维基百科)」


下面的图片是转换的二维 Schaffer 函数和 Rastrigin 函数的俯视图,作为简单的工具常常被用于测试连续的黑盒优化算法。图中颜色更浅的区域代表了更大的函数值 F(x, y) . 正如你所见,这个函数中有许多的局部最优。我们的工作就是去寻找一系列的模型参数 (x, y),使得 F(x, y) 能够尽量接近全局最大值。




进化策略的定义多种多样。我们可以将之定义为,一种为用户提供多个竞争方案以评估问题的算法。这个评估是基于一个给定解决方案的目标函数,并会返回单个拟合(fitness)值。基于当下解决方案的拟合结果,算法会接着提供下一代的竞争方案,与当前代的方案相比,这些方案更有可能会得到更好的结果。一旦提出了用户满意的最佳方案,迭代进程就会结束。


假设我们的算法命名为 EvolutionStrategy,我们可以运用如下的方式:

  1. solver = EvolutionStrategy()

  2. while True:

  3.  # ask the ES to give us a set of candidate solutions

  4.  # 使用进化策略(ES)给出多个竞争方案

  5.  solutions = solver.ask()

  6.  # create an array to hold the solutions.

  7.  # 创建一个数组,保存这些方案

  8.  fitness_list = np.zeros(solver.popsize)

  9.  # evaluate the fitness for each given solution.

  10.  # 评估每个方案的拟合度

  11.  for i in range(solver.popsize):

  12.    fitness_list[i] = evaluate(solutions[i])

  13.  # give list of fitness results back to ES

  14.  # 将拟合结果返回给ES

  15.  solver.tell(fitness_list)

  16.  # get best parameter, fitness from ES

  17.  # 从ES得到最佳参数和拟合度

  18.  best_solution, best_fitness = solver.result()

  19.  if best_fitness > MY_REQIRED_FITNESS:

  20.    break

通常来说,会将每一代竞争方案的规模保持为常量,但其实这并不必要。进化策略可以根据所需,形成许多竞争方案。这是因为这些由进化策略给出的方案是从一个分布函数中抽样的,而这些分布函数将会在每一代被进化策略更新。我会使用一个简单进化策略的例子解释这个抽样的过程。


简单进化策略


可以想象,一种最简单的进化策略,就是单纯地从正态分布(平均值为 μ,标准差为 *σ*)中直接抽样。在我们的二维问题中,有 μ=(μ_x,μ_y) 以及 σ = (σ_x, σ_y)。首先初始化一个μ值。在拟合度结果被评估之后,我们将平均值μ设定为本代竞争方案中最优解,并且在这个新的均值周围进行下一代解决方法的抽样。以下就是把这个算法用于之前提过的两个问题的 20 代的表现:





在上述的可视化表示中,绿色圆点表示每代分布的平均值,蓝色圆点表示被抽样的方案,而红色圆点就是当前被我们的算法找到的最佳方案。


这个简单的算法通常只对简单的问题有效。因为它贪婪的本性,算法会抛弃除了最佳方案外的一切方案,所以可能在更困难的问题中倾向于陷入局部最优。如果能够从一个表示更多种方案的概率分布中为下一代抽样,而不是只从当前代的最优解附近抽样,可能更为有利。


简单遗传算法


遗传算法是最古老的黑盒优化算法之一。遗传算法有许多的变形和不同程度的复杂度,但在此只阐明最简单的版本。


这个遗传算法的思想非常简单:只保留当前代最佳的前 10% 的方案,舍弃其他方案。在下一代中,抽样一个新的方案的办法是,随机选取前一代的两个方案作为双亲,并重新组合这些参数,从而形成一个新的方案。这种交叉重新组合的方法使用了掷硬币的办法,决定从双亲中的哪一方获取每一个参数。在我们的二维函数中,我们的新方案会以 50% 的几率从双亲的任何一方中继承 x 或 y。在重新组合之后,有着固定标准差的高斯噪声也会出现在每一个新的方案中。

 




上面的图片阐述了简单遗传算法是如何工作的。绿色圆点表示了上一代中的精英方案,蓝色圆点便是竞争方案的子代,而红色圆点是最优解。


遗传算法通过与不同种类的竞争方案保持联系的方法生成下一代,从而保证了多样性。然而,在实际过程中,大部分留存下来的精英方案倾向于逐渐收敛到局部最优。遗传算法有许多复杂的变形,比如 CoSyNe、ESP 和 NEAT,它们的想法主要是将类似的解决方案集聚到不同的种类中,从而更好地在过程中更好地保持多样性。


协方差矩阵适应性进化策略(CMA-ES)


简单进化策略和遗传算法的一个共同缺点是,标准差的噪声参数是固定的。有时候,我们会想探索更多可能,并增加我们的搜索空间的标准差;有时候,我们有自信正在一个最优值附近,只是想微调这个方案。基本上来说,我们希望我们的研究进程像下图这样展现:





是不是很神奇?上述图像所展示的研究策略,就运用了协方差矩阵自适应进化策略(Covariance-Matrix Adaptation Evolution Strategy , 以下简称 CMA-ES)。CMA-ES 是这样一种算法,它可得到每一代的结果,并且适应性的增加或减小下一代的搜索范围。它不只是根据 μ和σ* *调整适应性,还会计算整个参数空间的协方差矩阵。在每一代中,CMA-ES 会提供一个多变量的正态分布的参数,用于下一代的抽样。那么,它是如何增加或减少搜索范围的呢?


在我们讨论它使用的方法之前,让我们复习一下如何评估一个协方差矩阵。这对于之后研究 CMA-ES 的方法非常重要。如果我们想评估一个大小为 N 的样本的协方差矩阵,我们可以使用下面的方程去计算协方差矩阵 C 的最大似然估计。我们首先计算了样本中 x_i 和 y_i 的平均值:


一个 2x2 的协方差矩阵 C 的元素是这样的:


当然,产生的平均值 μ_x 和 μ_y 以及协方差σ_x、σ_y 和σ_xy 只是对于实际的、原始抽样的协方差矩阵的一个估计,对我们而言并不是非常有用。


CMA-ES 聪明地修改了上述的协方差计算公式,使得它能够适应一个优化问题。我会一步一步地讲解这是怎么做的。首先,它关注的是当前代的 N_best 个最优解。为了简化,我们取 N_best 为解中的前 25%。在根据拟合度挑选出方案之后,我们仅通过当前代(g)样本的 25% 的解去计算下一代(g+1)的平均值μ^(g+1),比如:


接下来,我们仅仅使用解中最佳的 25% 去估计下一代的协方差矩阵 C^(g+1),但我们用了一个聪明的办法:在计算中没有使用更新的 μ^(g+1),而使用当前代的 μ^(g):


在有了下一代(g+1)的一系列参数μ_x, μ_y, σ_x, σ_y, 和 σ_xy 之后,我们现在可以抽样出下一代的竞争方案了。


下面是一系列视觉图像,清晰地展现了如何使用当前代(g)的结果去构建下一代的方案:


1. 计算第 g 代中每一个竞争方案的拟合度;

2. 挑选出第 g 代的最佳 25% 的方案,如图中紫色圆点所示;

3. 仅仅使用这些最优解,以及当前代的平均值μ^g(图中绿色圆点),计算下一代的协方差矩阵 C^(g+1);

4. 使用更新的平均值μ^(g+1) 和协方差矩阵 C^(g+1) 进行新一组的竞争方案抽样。

让我们把这些策略再一次在整个搜索过程中可视化,以下是这两个问题的可视化结果:





因为 CMA-ES 可以使用最优解的信息对它的平均值和方差同时进行调整,所以它可以在最优解距离很远时扩大搜索范围,或在最优解很近的时候缩小搜索范围。为了便于理解,我对于这个简单二维问题的 CMA-ES 算法的解释进行了高度简化。如果你想了解更多的细节,建议阅读 CMA-ES 作者 Nikolaus Hansen 所准备的 CMA-ES 教程(http://ift.tt/2zuy1Ci

CMA-ES 算法,作为无梯度优化算法中最流行的算法之一,已经成为许多研究者和实践者的选择。它真正唯一的缺点是,当我们需要解决的模型参数太多时,协方差的计算复杂度将变成 O(N^2),尽管现在已经将其近似成为 O(N)。在参数的数量小于 1000 时,我会选用 CMA-ES。当然,如果足够耐心,我发现此算法也可以用于上至 10000 个参数的情形。


自然进化策略


假设你建立了一个人造生存模拟器,并抽取一些神经网络去控制一个蚁群中每个蚂蚁的行为。如果我们使用简单进化策略,蚂蚁的行为和特性将会朝着独自受益的方向发展。因此在每一代中,我们的蚁群里将充满着只管自己死活的「精英」蚂蚁。


如果我们不使用上述只考虑自我拟合度的法则,转而使用拟合度的总和作为变量,并且在每一代中对于整个蚁群的整体幸福感做优化,结果会如何呢?好吧,你最终将会创造一个马克思主义的理想蚁国了。


迄今,上述算法的直观缺点在于,抛弃了大部分的方案,只保留了部分最佳的方案。其实,那些不好的方案保留了关于「不要做什么」的关键信息,对于更好地计算、评估下一代有重要作用。许多研究强化学习的人会对于这篇 REINFORCE 论文(http://ift.tt/2zMZ0d5 1992 年发表的论文当中,关于策略神经网络的模型参数,作者 Williams 简单概述了一种评估期望奖励的方案。同时,在论文的第六部分,文章提议使用强化学习(REINFORCE)作为进化策略的手段。随后 Policy Exploring Policy Gradients (PEPG, 2009) 和 Natural Evolution Strategies(NES,2014) 两篇文章,将本论文中使用强化学习-进化策略(REINFORCE-ES)的特例进行了扩充和发展。


在这种方案当中,我们想使用每一代中每个方案的全部信息,无论是好是坏。这样,有了这些梯度信号的评估,我们就能将全部方案在下一代中朝着更好的方向发展。既然我们需要评估梯度,我们就可以使用应用于深度学习的标准随机梯度下降算法(SGD)。当然,我们也可以使用动量随机梯度下降算法(Momentum SGD),均方根传播算法(RMSProp),或 Adam 算法进行优化。


我们需要的是对于一个抽样方案进行期望拟合度评分(fitness score)的优化。如果期望结果足够好,那么在抽样的一代中,表现最佳的方案可能表现更好,所以对期望进行优化是一个明智的方案。将某个抽样方案的期望拟合度评分最大化,其实几乎等同于将全体的拟合度评分进行最大化。


假设 z 是概率分布函数 π(z,θ) 的抽样方案向量,我们可以将目标函数 F 的期望值定义为:


其中θ表示概率分布函数的参数。举例来说,如果 π 是一个正态分布,那么 θ 就是指 μ 和 σ。对于我们的简单二维问题,每一个 z 的整体都是一个二维向量 (x,y)。

在「自然进化策略」(http://ift.tt/2zOjYIo θ 的 J(θ) 的梯度的来历。使用与 REINFORCE 算法中同样的对数似然法,我们可以计算 J(θ) 的梯度:


在一个大小为 N 的样本中,我们有方案 z^1, z^2, ...... z^N,从而可以用求和的方式估计这个梯度:


有了上述的梯度,我们可以使用一个学习率 α(比如 0.01),并且开始我们关于概率分布函数π的θ参数优化,从而使得我们的抽样方案在目标函数 F 上获得更高的拟合度评分。使用 SGD 或 Adam 算法,我们可以将 θ 在下一代进行更新:


在概率分布函数更新之后,我们可以进行新的竞争方案 z 的抽样,直到我们得到一个适当的解。

在 REINFORCE 论文的第六部分,Williams 还推导了封闭型的梯度公式 ∇_θlogπ(z^i,θ),这主要是为了那些向量化多变量正态分布的 π(z,θ) 所设计的(即,相关参数是零)。在这种特殊情况下,θ是μ和σ向量。因此,解的每一个元素可以从一个单变量的正态分布 z_j∼N(μ_j,σ_j) 中抽样而来。


对于每一个方案 i 的θ向量中每一个独立元素,这个封闭的梯度公式∇_θ logN(z^i,θ) 可以被推导成:


为了清楚地表示,我使用角标 j 表示参数空间,而上标 i 表示群体中的每一个样本,它们不应该被混淆。对于本文的二维问题来说,z_1 = =x, z_2 = y, μ_1=μ_x, μ_2=μ_y, σ_1=σ_x, σ_2=σ_y。


我们可以把这两个公式放回到两个近似梯度公式中,对 μ 和 σ 进行清晰的更新。上文提及的论文中有着更加明晰的更新规则,包含了一个基准,并且可以引入例如 PEPG 中的对立抽样等其他技巧,而这正是我的执行方案的基础。但是,这个概念基本与其他进化策略算法相同,即,在每一代更新多变量正态分布的平均值和标准差,并从新的分布之中进行取样。下面是使用上述公式的本算法图解:





我们可以看到,这种算法可以根据需要动态地改变 σ,以继续探索或者调整解的空间。不像 CMA-ES,我们的实现中并没有相关结构,所以我们只是没有得到对角型的椭圆样本,而是得到了垂直或水平的样本,尽管理论上来说,如有需要,我们能够以计算效率为代价,推导出更新规则,从而纳入整个协方差矩阵。


我喜欢这个算法。因为它正如 CMA-ES 那样,这里的标准差可以调整,然后搜索空间可以在过程中增大或者缩小。由于并没有使用相关参数,这个算法的效率是 O(N),所以在 CMA-ES 的表现不太好时,我会使用 PEPG。我经常在参数超过几千的时候使用 PEPG。


OpenAI 的进化策略


在 OpenAI 的论文中,他们使用了一种新的遗传策略,是上面提到的 REINFORCE-ES 算法的特例。特别地,σ 被定为一个常量,只有 μ 在每一代中被更新。下面就是将 σ 定义为常量之后这个策略执行的样子:





在这个简化之外,该论文同样提出了更新规则的修正,从而适用于不同工作机器的并行计算。该更新规则使用一个固定值种子预计算一大群随机数。这样的话,每个工作机器可以复制其他机器的参数,并且每个机器只需要与其他机器进行一个数字的简单通信,这个数字也就是最终的拟合度结果。如果我们想将进化策略扩展到成千上万个不同的工作机器中去,这就显得非常重要了。因为在每一代的更新中,每次都将一整个解向量传输上百万次并不太现实,但是只传输最终的拟合度结果却也许可行。这篇论文展示,通过利用亚马逊 EC2 的 1440 个机器,他们可以使用十几分钟的时间解决 Mujoco 仿真机器人步行问题。


在理论上,我以为这个并行更新规则对那些同样可以调整 σ 的原始算法也有效。但也许在实际上,他们只是想在大型并行计算实验中,把可变的部分减小到最小值。这篇富有启发性的论文同样讨论了许多其他将进化策略应用到强化学习方面的实际案例。我非常推荐大家继续深入学习。


拟合度塑造


上述大部分算法通常会与拟合度塑造(fitness shaping)方法相结合。下面我想说说基于等级的拟合度塑造方法(rank-based fitness shaping method)。拟合度塑造会避免当前样本中的异常值主导(上文提到的)近似梯度计算:


如果一个特殊的 F(z^m) 比当前样本中其他 F(z^i) 都大得多,梯度就可能被这个异常值所主导,从而增大了算法陷入局部最优的可能性。为了减轻这个问题,可以应用拟合度的等级转化。我们将给结果进行评级,不使用实际的拟合度函数,而是使用一个与解的等级成比例的增强拟合度函数(augmented fitness function)。下面就是原始拟合度和基于等级的拟合度的结果对比:


假设我们有一个大小为 101 的样本。我们会根据实际拟合度函数评价每一个样本,然后根据拟合度挑选解。比如,我们会给最差的方案提供一个增强拟合度函数值,-0.50,然后给第二差的方案标值为 -0.49,……,给次优方案标值 0.49,给最优方案标值 0.50。这个增强拟合度值的集合将会取代实际的拟合度值,被用于计算下一次梯度更新。从某种程度上,这有点类似于用更直接一点的办法,即对结果使用批标准化(Batch Normalization)。也有一些拟合度塑造的其他类似方法,不过它们最后都基本会给出一个类似的结论。


我发现拟合度塑造在这种强化学习中非常有用:在策略神经网络中,并具有非确定性目标函数。此外,它同时作用于这样的情况——地图是随机形成且竞争方案有随机策略;而这也是强化学习环境常常会出现的情况。对于那些确定性的、表现良好的函数而言,使用拟合度塑造塑形用处不大,而且有时会拖慢找到优化解的时间。


MNIST 数据集


比起基于梯度的算法,进化策略可能是一个发现更多新颖解决方案的算法。然而,进化策略在许多可计算高质量梯度的问题中,比基于梯度的算法仍然要差得多。比如,只有傻子才会用遗传算法做图像分类。但是,有时候这种人真的存在,并且有时候这种探索还是富有成效的呢!


既然所有的机器学习算法都应该在 MNIST 上进行测试,我也尝试着用这些进化策略算法,使用一个 2 层的用于分类 MNIST 的卷积网络寻找权重。当然,这只是想看看我们跟随机梯度下降相比处在什么位置。因为这个卷积网络只有约 1.1 万个参数,所以我们使用了较慢一点的 CMA-ES 算法。在 http://ift.tt/2hkatWH 中,可以获得相关代码和实验过程。


下面是使用了不同进化策略的结果。我们用大小为 101 的样本计算了 300 代。我们持续追踪了每一代结束时表现最好的模型参数,并且在进行 300 代计算之后在测试集中评估了这个模型。有趣的是,有时候测试集的精确度比那些得分较低的训练集模型的精确度高。



不过,我们要怀着怀疑的眼光看待这个结果,因为我们只运行了一次,而不是对 5-10 次实验取了平均。这个基于一次运行的结果表明,CMA-ES 在 MNIST 训练集任务当中表现得最好,不过 PEPG 算法也紧随其后。两者都达到了近 98% 的准确度,比 SGD 或 Adam 算法的基准线大约低 1%。也许那种动态改变协方差矩阵的能力,以及逐代改变标准差参数的能力,使得它能较好地调节权重,这比简单的 OpenAI 的 ES 算法要略胜一筹。


自己动手


文章提到的上述算法很有可能有开源执行方案。CMA-ES 的作者,Nikolaus Hansen, 已经在维护一个基于 numpy 的 CMA-ES 方案,这个方案还有许多附加功能。他的这个 python 方案,使我之前接触了训练循环的接口。因为这个接口非常容易使用,我使用这个接口执行了一些其他的算法,比如简单遗传算法、PEPG 算法,还有 OpenAI 的 ES 算法等等。我把它们放在了一个简单的 python 文件中,名为 es.py,并且把原始的 CMA-ES 也放了进去。这样的话,我就可以只通过改变代码中的一两行,快速比较不同的 ES 算法:

  1. import es

  2. #solver = es.SimpleGA(...)

  3. #solver = es.PEPG(...)

  4. #solver = es.OpenES(...)

  5. solver = es.CMAES(...)

  6. while True:

  7.  solutions = solver.ask()

  8.  fitness_list = np.zeros(solver.popsize)

  9.  for i in range(solver.popsize):

  10.    fitness_list[i] = evaluate(solutions[i])

  11.  solver.tell(fitness_list)

  12.  result = solver.result()

  13.  if result[1] > MY_REQIRED_FITNESS:

  14.    break

你可以在 Github 和 Ipython notebook 上看到使用不同进化策略的实例:http://ift.tt/2zOUwhX

在这个携带有 es.python 的 Ipython notebook ( http://ift.tt/2zOUwhX) 上,我向你展示了使用 es.py 中的进化策略,解决具有更多局部最优的十维 Ras 函数优化问题的办法。这个十维版本的问题比上述用于可视化的二维版本的问题更难。以下是上述讨论过的算法的性能比较:




在这个十维 Ras 问题中,没有一个优化方案达到了全局最优解。不过 CMA-ES 比较接近,远远超过了其他任何算法。PEPG 和 NES 在第二位,OpenAI-ES 以及遗传算法落在后面。我不得不使用退火办法减小 OpenAI-ES 的 σ 值,让它在这个任务中表现得好一些。




在未来,我会将进化策略应用到其他实验和有趣的问题当中,敬请期待吧!


]]> 原文: http://ift.tt/2zuDVUe
RSS Feed

机器知心

IFTTT

从服务内部到实现商业化,美团云所经历的这两年

美团云的定位就是整体向外输出美团点评的数据技术积累与技术能力,我们把 AI 能力开放出去,让用户使用我们的基础设施、计算力或算法数据等能力,进而帮助用户降低产品商业化的门槛。


100 万单、 1000 万单到 1400 再到 1600 万单的峰值,美团点评的外卖订单迅速上涨。与此同时,配送体验要求也在不断提升,平台也始终面临运力的挑战,必须不断平衡配送成本和配送体验的要求。


如何通过技术手段而不是单纯扩大旗手规模的方式,让美团外卖平台超过 40 万的骑手高效工作,提升用户满意度的同时,降低配送成本,是美团配送技术团队持续解决的难题。「美团外卖业务场景的技术难度相对较高的主要表现在于——系统压力高峰期区分明显、交易链路长实时性要求高、交易转化率高和用户停留时间短四方面。」美团外卖技术架构负责人孙传亭说。


规模庞大且不断扩展的业务量,使外卖系统中数据驱动的因素大大提升,这对美团外卖的后端系统架构提出更高的要求。过去一年多时间,针对即时配送场景应用了机器学习、运筹优化等技术,推出 O2O 即时配送智能调度系统。


不止是外卖业务,点评 UGC 内容、用户上传信息等业务内容都从以往的人工改变为机器处理为主。美团云成为背后有力的底层技术支撑,美团云总经理李爽说:「对技术本身就有很大需求,我们也做了大量的工作。同时,构建云平台符合我们的发展方向,也符合具体的市场方向,所以我们就做了这个选择。」


美团云成立时间并不长,2015 年 4 月,李爽加入美团点评后才开始着手构建美团云团队。如今,美团云团队有 200 余人,是美团点评不可或缺的重要组成部分。


同样,在产品方面,美团云也已经完成相对完善的布局:2017 年,美团云推出 GPU 云主机进入 AI 领域;5 月布局主机类、平台类、服务类三大类产品开启 AI 战略,并于英特尔、华为、依图、搜狗等 AI 企业建立深度合作,打造人工智能生态圈;9 月大幅降价底层计算产品 GPU,并宣布 SaaS 层产品及深度学习平台全线免费。


尽管从亚马逊到国内 BAT 都早已站在云服务市场的「黄金赛道」,竞争的激烈程度不言而喻。但在李爽看来,现阶段不同的 AI 场景有着不同的计算需求,美团云不会放弃任何机会,只要是新的机会、新的场景,都希望能够去进行尝试,「因为谁也不能判断未来到底会怎样。」

从内到外,向 AI 靠拢

「美团云的成长与美团点评的发展是密不可分的。」李爽回顾称,也就是说,这是一个从美团点评的业务需求出发,逐步完善后再向外输出解决方案的过程:


从 2012 年开始起,在自身业务需求的推动下,美团开始部署私有云。一年后,公司上线公有云项目美团云 MOS,当时盛大、阿里巴巴都在尝试做公有云,但由于资源准备还不充分,加上内部业务增速很快,美团云对外商业化的计划往后推迟。直到 2015 年,美团云生活服务领域的业务已经相对成熟,才正式独立运营并全面对外开放云服务。


李爽介绍,从内部延伸至外部的过程中,产品形态的转化是他们面临的一大考验。比如,计费的形式以及用户的管理,内部产品偏向于更加简化、规模及效率,外部则强调功能、安全性合理性,包括用户的友好程度,内部使用 API 可以搞定,外部必须有操作界面的设计。


「那时我们希望跟市场上大部分公司具备一样的能力,所以 2015 年我们的主要工作就是一边构建团队,一边在产品的数量与平台的性能上完成补齐。」李爽说。在这段时间里,在原有的计算和存储功能外,美团云添加了 IaaS 与 PaaS 等相关模块和功能。


2016 年的时候做了行业云方面的探索,主要集中在传统领域,包括餐饮、酒店、旅游等。在完成行业云的探索之后,美团云的业务重心在 2017 年回归到了平台策略上,并于 5 月正式把 AI 作为重要战略目标,选择以底层高性能云主机为依托,中层深度学习平台为支撑,上层场景服务为应用组合,以这样的方式来布局其人工智能版图。


李爽称:「2017 年,我们看到整个云计算市场的计算力正在发生迁移,这是好事,也是整个 AI 行业的发展趋势。」在 AI 领域,传统 CPU 的计算力已经向 GPU、FPGA、甚至更新的 Intel 处理器等迁移。「这种迁移速度非常快,会带动起整个行业形态的变化。我们会把这四种计算资源融合在一起,对外释放这种能力。」


而这些技术能力也正是美团云的需求。从最初的自动化证照审核,到后来的美团点评 UGC 处理,以及美团外卖的调度等,这背后的工作逐渐由机器取代人工,海量数据经过训练与处理更好地输出给美团点评的业务,实现效率的提升。


这一过程不仅符合美团云发展的方向,还实现了 AI 能力的积累,同时能够以此输出给客户。一般而言,做云服务有两个方向,一是专注垂直领域,提供从底层到顶层的整套解决方案;二是把能力聚焦于自身的强项,美团云属于后者。


李爽表示,美团云在底部的 IaaS 和 PaaS 积累了大量经验,会把精力放在运营资源和搭建平台,推出 IaaS 类和 PaaS 类的相关产品,在此基础上再把业务进行对外输出,把应用层交给更加熟悉这个领域的客户来完成。


「无论从产品还是从规模的角度看,AI 都是比较新的东西。除了小型互联网公司,传统机构和政府方面对于 AI 的理解也可能存在一定的距离,我们希望可以缩短这个距离,让他们的产品更快地应用到实际。」李爽补充道。

打造整套 AI 体系

「未来的 AI 领域可能会形成一个头重尾长的生态。」美团云战略负责人 Racheal 认为,大公司往往会着眼于 AI 领域的大问题,但事实上还有很多细分行业需求有待中小型企业玩家和创业公司来解决。比如,大部分用户不一定具备建立一套数据与平台的能力,另一个角度来看,这些公司自建平台的必要性并不高。


「美团云的定位就是整体向外输出美团点评的数据技术积累与技术能力,我们把 AI 能力开放出去,让用户使用我们的基础设施、计算力或算法数据等能力,进而帮助用户降低产品商业化的门槛。」Racheal 说。


目前,美团云上线了主机类、平台类和服务类三大 AI 产品,以底层高性能云主机为依托,中层深度学习平台为支撑,上层场景服务为应用组合的方式来布局其人工智能版图。


主机类产品覆盖 GPU 云主机、FPGA 云主机、KNL 物理机等 IaaS 层主机服务。9 月 6 日,美团云宣布 GPU 产品永久降价 50%,大幅降低了企业 AI 计算资源的成本。


平台类产品方面,美团云的深度学习平台支持开发者在 TensorFlow、Caffe、Torch 等灵活、高扩展性深度学习框架中进行模型训练及算法研究,进一步输出美团云的 AI 能力。9 月 21 日,美团云宣布 AI 服务全线免费,也免费开放了深度学习平台。


提及全线免费的市场打法对美团云营收方面所产生的影响时,李爽表示,现在考虑这一问题还为时尚早,美团云目前并不太考虑营收问题。


服务类产品则包括人脸识别、图片识别、NLP 、语音识别、OCR 文字识别、智能客服、机器翻译等与人们生活场景密切相关的 AI 服务。李爽称:「IaaS 和 PaaS 层我们具有优势,所以选择自己来打造。相比之下,SaaS 层其实更贴近于用户的使用场景,我们会更依靠生态里的合作伙伴。」


在谈到为什么没有把合作伙伴的能力直接提供给用户,而是重新构建一个新的接口再服务用户时,李爽表示:「其实合作伙伴的生命周期也存在风险,我们希望可以给用户提供一个稳定的接口和平台,避免受到合作伙伴业务调整带来的影响。」目前,美团云已与搜狗、依图、旷视、Rokid 等 AI 企业展开合作,实现内部孵化与外部技术的融合,构建一个完整的生态系统,打造最开放的 AI 共享平台。


对于 AI 战略的规划和实现路径,李爽介绍称:「我们的第一步会面向全体 AI 生产者,把底层资源释放给他们,让他们把维护框架、构建平台的精力节省下来用于自身算法和应用层的研发,帮助他们完成自身 AI 价值的最大化。然后今年年底,我们会开启生态化建设,把外部资源纳入我们的平台上,将 AI 生产者的业务融入我们的体系中,再给用户提供相应的解决方案。」


李爽始终认为,数据是 AI 发展的核心,其外层依次为算力、算法和应用,用户的数据经过计算效率的提升、算法模型的优化以及平台的搭建,由内向外逐渐扩展,最大化发挥价值。


由此,美团云计划从底层向上构建,将这四种资源纳入美团云的体系中,这也是美团云今年的目标。「我们需要对资源进行评估、衡量和调整,根据场景需求再一次做补齐工作,达到用户和都满意的状态。」李爽说。


]]> 原文: http://ift.tt/2zqlTCh
RSS Feed

机器知心

IFTTT

2017年11月9日星期四

全世界合格的AI人才只有1万人左右,谷歌决定让AI写算法

编译 | 张卉馨

来源 | 纽约时报


研发人员有一个梦想,让人工智能机器创造其他的人工智能机器。但是,对高级程序员们来说,这是一个噩梦。


最近,在硅谷和中国的演讲中,谷歌首席工程师之一 Jeff Dean 都提到了 AutoML 。ML ,机器学习(machine learning)的缩写,是一种能够通过分析数据自行完成特定任务的计算机算法。AutoML 也是一种机器学习算法,但它学习的是如何创造其他机器学习算法。


有了 AutoML ,不久以后,谷歌或许就可以找到一种创造 AI 的技术,部分取代人类。这是科技产业的未来,许多人认为。

从能识别人脸的智能手机应用,到自动驾驶的汽车,科技产业前景光明。但据估计,具备创建复杂(甚至有些神秘)算法的教育背景、经验和能力的人,全世界仅1万人左右。


世界最大高科技企业,包括谷歌,脸书和微软,每年在 AI 人才方面投入数百万美元,让这一稀缺人才市场更加陷入困境。百年树人,人才短缺问题很难短时间内得到解决,掌握这些技能也要花费好几年。


但是,产业发展不会等人。目前,公司企业正在研发各种工具,帮助简化打造AI软件的过程,比如,图像和语音识别服务,在线聊天机器人等。


最近,微软公布了一款可以帮助程序员创建深度神经网络的工具。「每出现一种新技术,计算机科学就会以这样的方式跟进。」微软的副总裁 Joseph Sirosh 表示,「我们正在省去许多繁重的劳作。」


这不是利他主义。像 Jeff Dean 这样的研发人员们相信,更多的人和企业研究人工智能,会促进自己的研究。巨头们也在这一趋势中看到了光明「钱」途。他们纷纷对外出售云计算服务,帮助企业和开发者创建 AI。


「存在这方面的刚需,当前的工具不能完全满足这些需求。」码隆科技的联合创始人兼首席技术官 Matt Scott 表示。这家创业公司也致力于类似服务。




这也正是谷歌希望 AutoML  能够做的事情。上个月公布新款安卓智能手机时,谷歌 CEO Sundar Pichai 还曾炫耀过 AutoML。


这个项目最终会帮助其他公司创建具备人工智能的系统,即使这些公司没有丰富的专业知识。Jeff Dean 表示,如今也仅几千家家公司具备打造 AI 的能力,更多的公司拥有必要的数据。


「希望首先可以解决几千家组织的机器学习问题,然后帮助几百万家公司组织。」他说。


谷歌正在云计算业务上倾注巨资,期待未来几年,该业务成为公司主要的经济引擎。将大部分世界顶尖 AI 研发人员收入囊中后,谷歌也有启动引擎的砝码了。


神经网络正在快速加速人工智能的发展。如今,工程师们可以更快地创建自主学习算法。过去,程序员都是手动创建一个图像识别服务或是一个文字翻译 app,一次只能完成一行编码。


例如,通过分析大量传统技术支持通话中的声音,机器学习算法能够学会识别口头单词。


但是,构建神经网络并不像创建网站或是普通的智能手机应用那么简单。数学,极端的试错、相当多的直觉,一个都不能少。独立的机器学习实验室 Element AI 的首席执行官 Jean-François Gagné 将这个过程定义为「一种新的计算机编程。」

在创建神经网络的过程中,研发人员通常会运用大量的机器网络运行几十或几百项实验,测试该算法能多大程度上学会识别图像或是翻译一种语言。他们会不断地调整算法特定部分,直到找到起作用的那一部分。这一技术被称为「黑暗的艺术」,因为研发人员发现很难解释,为什么会做出这样的调整。


谷歌正在尝试使用 AutoML 将这个过程自动化。通过创建能分析其他算法研发过程的算法,就能搞清楚哪些方法凑效,哪些不能。最终,系统将学会创建出更有效的机器学习。现在,谷歌认为 AutoML 可以创造识别图片物体的算法,比完全由人类专家建造的算法更精确。该项目一位成员、谷歌研究人员 Barret Zoph 相信,这种办法最终也适用于其他的任务,例如语音识别和机器翻译。


这是 AI 研究的重要趋势之一,专家称作「学会学习」或「元学习」。


许多人相信,这样的方法会极大地促进人工智能的发展,无论是在网络世界还是现实世界。伯克利的研发人员们正在打造让机器人基于过去经验解决新问题的技术。


「实际上,计算机会为我们创造这样的算法。」伯克利的教授 Pieter Abbeel 称,「计算机创造的算法,能迅速地解决很多问题,至少我们有这样的希望。」最近,他离开 OpenAI,成立了一家机器人创业公司。(又一员大将离开马斯克的OpenAI自立门户,称工业机器人市场大有可为

这也是让更多的人和企业有能力打造 AI 的方式。这些方法不会完全取代人类研究人员。专家们仍然需要做很多重要设计工作。但是,他们希望的是,少数专家的工作成果,可以帮助更多的人创建自己的软件。


现在还不现实,未来几年会实现,只是时间问题。Renato Negrinho 说。他是卡内基梅隆大学研究人员,也正在开发类似 AutoML 的技术。


文章来源:http://ift.tt/2AlTdrR


]]> 原文: http://ift.tt/2mbKaXB
RSS Feed

机器知心

IFTTT

M2 模型杀回 Coding 和 Agent 领域,MiniMax 想要「普惠智能」-InfoQ每周精要No.900

「每周精要」 NO. 900 2025/11/01 头条 HEADLINE M2 模型杀回 Coding 和 Agent 领域,MiniMax 想要「普惠智能」 精选 SELECTED a16z 将 3000 万开发者标价 3 万亿 网友:几个初创公司 + 大模型就...