2018年5月9日星期三

想了解TPU 3.0?Jeff Dean推荐看看这段视频

岳排槐 发自 凹非寺量子位 出品 | 公众号 QbitAI

昨天,Google I/O 2018大会首日上,TPU 3.0正式披露。

但信息极少。

在谈到这款芯片的时候,Google CEO只是轻描淡写的透露TPU 3.0比上一代快八倍,而且由于芯片太强大,Google第一次引入液体冷却方法。

不过,也没有展开更多细节。想知道更多?

其实在首日的分会场Stage 8的一个环节里,Google TensorFlow和Cloud TPU的产品经理Zak Stone,带来了更多关于TPU的讲述。

如果你想了解更多TPU,Jeff Dean推荐看看Stone的这段分享。

Stone透露了更多关于TPU 3.0的情况,例如最近两代TPU的性能对比(如下图所示)。

据介绍,TPU 3.0有了全新的芯片架构,以及更大规模的系统。还披露了TPU 3.0的更多外观细节。如下图所示。

总之,目前这个芯片,还只能是可远观,不可说得太细。

这段视频在此。没有字幕,但听起来不是很难,感兴趣的同学别怕。

Zak Stone讲解TPU_腾讯视频

欢迎大家关注我们的专栏:量子位 - 知乎专栏

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态



via 量子位 - 知乎专栏 https://ift.tt/2rBiY43
RSS Feed

RSS5

IFTTT

想了解TPU 3.0?Jeff Dean推荐看看这段视频

岳排槐 发自 凹非寺量子位 出品 | 公众号 QbitAI

昨天,Google I/O 2018大会首日上,TPU 3.0正式披露。

但信息极少。

在谈到这款芯片的时候,Google CEO只是轻描淡写的透露TPU 3.0比上一代快八倍,而且由于芯片太强大,Google第一次引入液体冷却方法。

不过,也没有展开更多细节。想知道更多?

其实在首日的分会场Stage 8的一个环节里,Google TensorFlow和Cloud TPU的产品经理Zak Stone,带来了更多关于TPU的讲述。

如果你想了解更多TPU,Jeff Dean推荐看看Stone的这段分享。

Stone透露了更多关于TPU 3.0的情况,例如最近两代TPU的性能对比(如下图所示)。

据介绍,TPU 3.0有了全新的芯片架构,以及更大规模的系统。还披露了TPU 3.0的更多外观细节。如下图所示。

总之,目前这个芯片,还只能是可远观,不可说得太细。

这段视频在此。没有字幕,但听起来不是很难,感兴趣的同学别怕。

Zak Stone讲解TPU_腾讯视频

欢迎大家关注我们的专栏:量子位 - 知乎专栏

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态



via 量子位 - 知乎专栏 https://ift.tt/2rBiY43
RSS Feed

RSS5

IFTTT

晶泰科技与辉瑞制药宣布战略研发合作,以人工智能驱动下的高精确药物模拟技术,促进新药发现与发展

美国时间5月8日消息,以算法驱动创新的AI医药研发公司晶泰科技XtalPi Inc.)宣布与辉瑞制药(Pfizer Inc.)签订战略研发合作,融合量子物理与人工智能,建立小分子药物模拟算法平台,显著提高算法的精确度和适用广泛度,驱动小分子药物的创新。

药物模拟这一技术被广泛应用于药物发现与设计,让科学家可以从原子层面对药物的生物学、药学性质和反应进行研究与预测。在这次合作中,晶泰科技将发挥其量子力学、人工智能、云端高性能科学计算的技术优势,对现有的药物模拟技术进行改进与突破,让这一平台可以覆盖更广泛的化学空间,并生成更精确的药物分子模型。在这一基础上,平台还将实现对药物若干项关键性质的准确预测,进一步赋能药物发现与发展中的重要环节。本次战略研发合作的确立,得益于晶泰科技与辉瑞已有的良好合作基础。其药物晶型预测技术受到辉瑞的青睐,而这一药物模拟算法平台将进一步增强双方在计算辅助药物设计与药物固相筛选方面的技术实力。

为了促进产学研界的技术交流, 此次研发成功后还将面向学界开源分享一部分基于公开数据库产生的分子力学参数,以此促进和支持相关领域的持续进步与创新。

"与晶泰科技的合作将会是提升我们计算模拟技术的良好机会",辉瑞药物设计部负责人Charlotte Allerton说。"我们期待通过新的技术工具,进一步提高辉瑞对小分子药物研发的效率。"

"我们非常高兴能与辉瑞这样全球领先的创新药企成为合作伙伴。他们和我们一样深信,物理模型场景下的AI及算法创新将会催生新一代高效、高准确率的药物研发工具,"晶泰科技联合创始人兼董事长温书豪说。"这次合作让我们有机会充分施展晶泰科技在分子模拟、人工智能云计算领域积累的优势技术,对已有的通用研发算法改进升级, 对尚未得到解决的药物设计难题开发新的算法解决方案。"

晶泰科技是第一家由谷歌与腾讯两大科技巨头共同投资的AI公司,也是国内首家与世界顶级药企宣布战略合作的AI药物算法公司。晶泰科技于2014年创立于麻省理工校园,以计算驱动创新,致力于打造新一代的智能药物研发技术,解决药物临床前研究中的效率与成功率问题。公司将量子物理、人工智能与超大规模云计算相结合,突破性地实现对小分子药物重要特性的快速、准确预测,在药物设计和药物固相筛选等领域拥有多项行业领先的技术。晶泰科技的投资方包括腾讯,红杉(中国),谷歌,真格基金与峰瑞资本。公司已与多家世界顶级药企和新药研究机构建立稳定深入的合作,并取得了多项里程碑式的进展。

]]> 原文: https://ift.tt/2K2vPUj
RSS Feed

机器知心

IFTTT

2018年5月8日星期二

信息论视角下的深度学习简述,形式化的泛化误差分析

本论文从信息论的角度简要概述了深度学习,试图解决这两个问题:(1) 深度神经网络为什么比浅层网络的泛化能力好?(2) 是否在所有场景下,更深层的神经网络的效果都更好?

论文:An Information-Theoretic View for Deep Learning

论文链接:https://ift.tt/2I9XLoU

摘要:深度学习改变了计算机视觉自然语言处理语音识别领域。但还有两个依然模糊的关键问题:(1) 深度神经网络为什么比浅层网络的泛化能力好?(2) 是否在所有场景下,更深层的神经网络的效果都更好?具体而言,令 L 表示某一深度神经网络中的卷积层和池化层层数,n 表示训练样本量,我们可推导出此网络的期望泛化误差上界:

其中,σ>0 为常量,依赖于损失函数; 0<η<1 为另一常量,依赖于每个卷积池化层上的信息损失(information loss);I(S,W) 为训练样本 S 和输出假设 W 间的互信息。据此上界可以得出:(1) 随着神经网络卷积层和池化层个数 L 的增加,期望泛化误差呈指数下降至 0。带有严格信息损失的层(如卷积层),可以降低深度学习算法的泛化误差;这回答了上文中的第一个问题。但是,(2) 算法的期望泛化误差为 0 并不意味着测试误差或 E[R(W)] 很小,因为随着层数增加,用于拟合数据的信息发生损失时,E[R_S(W)] 会增大。这表明「神经网络越深越好」的说法仅在测试误差或 E[R_S(W)] 较小的条件下成立。(3) 我们进一步展示了深度学习算法满足稳定性的弱概念;随着 L 的增加,深度学习算法的样本复杂度会降低。

我们研究了统计学习的标准框架,其中 Z 表示示例空间(instance space),W 表示假设空间(hypothesis space),n 元组 S = (Z_1, Z_2, ..., Z_n) 表示训练样本,所有元素 Z_i 为从未知分布 D 中抽样得到的独立同分布样本。学习算法 A : S → W 可以理解为从训练样本空间 Z^n 到假设空间 W 上的随机映射。利用马尔科夫核 P_W|S 来描述学习算法 A:给定训练样本 S,算法根据条件分布 P_W|S 从 W 中抽取一个假设。

我们引入损失函数  作为某假设预测效果的度量。对任意通过 S 学得的假设 W,我们将期望风险定义为:

将经验风险(empirical risk)定义为:

对学习算法 A,我们定义泛化误差:

泛化误差很小表示学得的假设在训练数据集和测试数据集上表现接近。

在本文中,我们研究了深度学习算法的期望泛化误差,如下:

该期望在联合分布 P_W,S = D^n × P_W|S 上。

我们可得到以下分解:

等式右侧第一项为期望泛化误差,第二项则反映了在期望的角度下,学得假设对训练样本的拟合程度。

在设计学习算法时,我们希望期望风险的期望 E[R(W)] 越小越好。但通常,很难同时令期望泛化误差 G(D,P_W|S) 和期望经验风险 E[R_S(W)] 都很小:如果某个模型对训练样本的拟合过于好,则它在测试数据上的泛化能力就可能很差,这就是「偏差-方差权衡问题」(Domingos, 2000)。惊人的是,根据实证经验,深度学习算法能够很好地同时最小化 G(D, P_W|S) 和 E[R_S(W)]。深度网络的深层架构能够有效地紧凑表征高变函数(highly-varying function),进而令 E[R_S(W)] 很小。但关于期望泛化误差 G(D, P_W|S) 能够保持很小的原因的理论研究依然不明确。

在本文中,我们从信息论角度出发研究深度学习算法的期望泛化误差。我们证明了随着层数增加,期望泛化误差 G(D, P_W|S) 会呈指数下降至 0。在定理 2 中,我们证明了:

其中,L 是深度神经网络中的信息损失层层数;0<η<1 为另一常量,依赖于每个卷积层和池化层上的信息损失;σ>0 为常量,依赖于损失函数;n 为训练样本 S 的样本量大小;I(S, W) 为输入训练样本 S 和输出假设 W 间的互信息。

此结论来自于两个和信息论相关的重要结果。第一个结果是来自于 Ahlswede 和 Gács 1976 年提出的强数据处理不等式(Strong Data Processing Inequalities,SDPI):对于马尔科夫链 U → V → W,如果在映射 V → W 中存在信息损失,则 I(U, V ) ≤ ηI(U, W),其中 η<1,为非负信息损失因子。第二个结果来自于 (Russo and Zou 2015, Xu and Raginsky 2017):对于某个学习算法,输入和输出间的互信息决定了该学习算法的泛化误差。

我们的结果与「偏差-方差权衡问题」并不冲突。尽管随着信息损失层层数增加,期望泛化误差呈指数下降至 0;但由于信息损失不利于拟合训练样本,因此期望经验风险 𝔼[R_S(W)] 会有所增加。这意味着,在设计深度学习算法时,需要更多地关注信息损失和训练误差之间的平衡。

利用输入和输出间的互信息来限制期望泛化误差的范围具有一个好处,它几乎依赖于学习算法的所有方面:数据分布、假设类的复杂度,以及学习算法本身的性质;而证明 PAC 可学习性的传统框架 (Mohri et al. 2012) 则只覆盖了其中一部分方面。如基于 VC 维 (Vapnik 2013)、覆盖数 (Zhang 2002),Rademacher (Bartlett and Mendelson 2002, Bartlett et al. 2005, Liu et al. 2017)、PAC-Bayes (Langford and Shawe-Taylor 2003)、算法稳定性 (Liu et al. 2017, Bousquet and Elissee 2002) 以及稳健性 (Xu and Mannor 2012) 的框架。

本文其余部分组织结构如下:在第二部分,我们在 DNN 和马尔科夫链之间建立了联系;第三部分利用强数据处理不等式推导出深度神经网络中的中间特征表征和输出之间的互信息变化;第四部分给出了主要研究结果:DNN 中基于深度 L 的指数极泛化误差上界;第五部分为主要定理的证明;第 6 部分是总结。

图 1:包含 L 个隐藏层的深度神经网络的层级特征图。

图 2:深度神经网络的特征图构成了一个马尔科夫链。

]]> 原文: https://ift.tt/2wrImPj
RSS Feed

机器知心

IFTTT

如何通过梯度检验帮助实现反向传播

本文介绍了如何使用梯度检验方法确认反向传播代码是否准确。

在《Coding Neural Network - Forward Propagation and Backpropagation》一文中,我们借助 numpy 实现了前向传播和反向传播算法。但从头开始实现反向传播很容易遇到 bug 或者报错。因此,在训练数据上运行神经网络之前,必须检验反向传播的实现是否正确。不过首先,我们先复习一下反向传播的概念:从最后的节点开始,沿着拓扑排序的反方向遍历所有节点,计算每个边的尾节点相对于损失函数导数。换言之,计算损失函数对所有参数导数:∂J/∂θ,其中θ表示模型中的参数

我们通过计算数值梯度并比较数值梯度和根据反向传播求出的梯度(解析梯度)间的差异,来测试我们的实现代码。这里有两种数值梯度的计算方法:

  • 右边形式:

  •  [J(θ+ϵ)−J(θ)]/ϵ

  • 双边形式(见图 2):

  •  [J(θ+ϵ)−J(θ−ϵ)]/2ϵ

图 2:双边数值梯度

逼近导数的双边形式比右边形式更接近真实值。我们以 f(x)=x^2 为例,在 x=3 处计算导数

  • 解析导数:∇_xf(x)=2x ⇒∇_xf(3)=6

  • 双边数值导数:[(3+1e−2)^2−(3−1e−2)^2]/[2∗1e−2]=5.999999999999872

  • 右边数值导数:[(3+1e−2)^2−3^2]/[1e−2]=6.009999999999849

可以看到,解析梯度和双边数值梯度之间的差值几乎为零;而和右边形式的数值梯度之间的差值为 0.01。因此在下文中,我们使用双边形式计算数值梯度。

另外,我们使用下式对数值梯度和解析梯度间的差值进行标准化。

如果差值≤10^−7,可以认为反向传播的实现代码没有问题;否则,就需要回去检查代码,因为一定有什么地方出错了。

以下是完成梯度检验的步骤:

1. 随机从训练集中抽取一些样本,用来计算数值梯度和解析梯度(不要使用所有训练样本,因为梯度检验运行会很慢)。

2. 初始化参数

3. 计算前向传播和交叉熵损失。

4. 利用写好的反向传播的实现代码计算梯度(解析梯度)。

5. 计算双边形式的数值梯度。

6. 计算数值梯度和解析解梯度的差值。

这里,我们使用《Coding Neural Network - Forward Propagation and Backpropagation》中所写的函数来实现参数初始化、前向传播、反向传播以及交叉熵损失的计算。

导入数据。

# Loading packages import sys  import h5py import matplotlib.pyplot as plt import numpy as np from numpy.linalg import norm import seaborn as sns  sys.path.append("../scripts/") from coding_neural_network_from_scratch import (initialize_parameters,                                                 L_model_forward,                                                 L_model_backward,                                                 compute_cost) # Import the data train_dataset = h5py.File("../data/train_catvnoncat.h5") X_train = np.array(train_dataset["train_set_x"]).T y_train = np.array(train_dataset["train_set_y"]).T X_train = X_train.reshape(-1, 209) y_train = y_train.reshape(-1, 209)  X_train.shape, y_train.shape ((12288, 209), (1, 209)) 

编写 helper 函数,帮助实现参数和梯度词典(gradients dictionary)到向量的相互转换。

def dictionary_to_vector(params_dict):"""     Roll a dictionary into a single vector.      Arguments     ---------     params_dict : dict         learned parameters.      Returns     -------     params_vector : array         vector of all parameters concatenated.     """count = 0for key in params_dict.keys():new_vector = np.reshape(params_dict[key], (-1, 1))if count == 0:theta_vector = new_vectorelse:theta_vector = np.concatenate((theta_vector, new_vector))count += 1return theta_vectordef vector_to_dictionary(vector, layers_dims):"""     Unroll parameters vector to dictionary using layers dimensions.      Arguments     ---------     vector : array         parameters vector.     layers_dims : list or array_like         dimensions of each layer in the network.      Returns     -------     parameters : dict         dictionary storing all parameters.     """L = len(layers_dims)parameters = {}k = 0for l in range(1, L):# Create temp variable to store dimension used on each layerw_dim = layers_dims[l] * layers_dims[l - 1]b_dim = layers_dims[l]# Create temp var to be used in slicing parameters vectortemp_dim = k + w_dim# add parameters to the dictionaryparameters["W" + str(l)] = vector[k:temp_dim].reshape(layers_dims[l], layers_dims[l - 1])parameters["b" + str(l)] = vector[temp_dim:temp_dim + b_dim].reshape(b_dim, 1)k += w_dim + b_dimreturn parametersdef gradients_to_vector(gradients):"""     Roll all gradients into a single vector containing only dW and db.      Arguments     ---------     gradients : dict         storing gradients of weights and biases for all layers: dA, dW, db.      Returns     -------     new_grads : array         vector of only dW and db gradients.     """# Get the number of indices for the gradients to iterate overvalid_grads = [key for key in gradients.keys()if not key.startswith("dA")]L = len(valid_grads)// 2count = 0# Iterate over all gradients and append them to new_grads listfor l in range(1, L + 1):if count == 0:new_grads = gradients["dW" + str(l)].reshape(-1, 1)new_grads = np.concatenate((new_grads, gradients["db" + str(l)].reshape(-1, 1)))else:new_grads = np.concatenate((new_grads, gradients["dW" + str(l)].reshape(-1, 1)))new_grads = np.concatenate((new_grads, gradients["db" + str(l)].reshape(-1, 1)))count += 1return new_grads 

最后,编写梯度检验函数,利用此函数计算解析梯度和数值梯度之间的差值,并借此判断反向传播的实现代码是否正确。我们随机抽取 1 个样本来计算差值:

def forward_prop_cost(X, parameters, Y, hidden_layers_activation_fn="tanh"):"""     Implements the forward propagation and computes the cost.      Arguments     ---------     X : 2d-array         input data, shape: number of features x number of examples.     parameters : dict         parameters to use in forward prop.     Y : array         true "label", shape: 1 x number of examples.     hidden_layers_activation_fn : str         activation function to be used on hidden layers: "tanh", "relu".      Returns     -------     cost : float         cross-entropy cost.     """# Compute forward propAL, _ = L_model_forward(X, parameters, hidden_layers_activation_fn)# Compute costcost = compute_cost(AL, Y)return costdef gradient_check(parameters, gradients, X, Y, layers_dims, epsilon=1e-7,hidden_layers_activation_fn="tanh"):"""     Checks if back_prop computes correctly the gradient of the cost output by     forward_prop.      Arguments     ---------     parameters : dict         storing all parameters to use in forward prop.     gradients : dict         gradients of weights and biases for all layers: dA, dW, db.     X : 2d-array         input data, shape: number of features x number of examples.     Y : array         true "label", shape: 1 x number of examples.     epsilon :          tiny shift to the input to compute approximate gradient.     layers_dims : list or array_like         dimensions of each layer in the network.      Returns     -------     difference : float         difference between approx gradient and back_prop gradient     """# Roll out parameters and gradients dictionariesparameters_vector = dictionary_to_vector(parameters)gradients_vector = gradients_to_vector(gradients)# Create vector of zeros to be used with epsilongrads_approx = np.zeros_like(parameters_vector)for i in range(len(parameters_vector)):# Compute cost of theta + epsilontheta_plus = np.copy(parameters_vector)theta_plus[i] = theta_plus[i] + epsilonj_plus = forward_prop_cost(X, vector_to_dictionary(theta_plus, layers_dims), Y,hidden_layers_activation_fn)# Compute cost of theta - epsilontheta_minus = np.copy(parameters_vector)theta_minus[i] = theta_minus[i] - epsilonj_minus = forward_prop_cost(X, vector_to_dictionary(theta_minus, layers_dims), Y,hidden_layers_activation_fn)# Compute numerical gradientsgrads_approx[i] = (j_plus - j_minus) / (2 * epsilon)# Compute the difference of numerical and analytical gradientsnumerator = norm(gradients_vector - grads_approx)denominator = norm(grads_approx) + norm(gradients_vector)difference = numerator / denominatorif difference > 10e-7:print ("\033[31mThere is a mistake in back-propagation " +\                "implementation. The difference is: {}".format(difference))else:print ("\033[32mThere implementation of back-propagation is fine! "+\                "The difference is: {}".format(difference))return difference 
# Set up neural network architecture layers_dims = [X_train.shape[0], 5, 5, 1]  # Initialize parameters parameters = initialize_parameters(layers_dims)  # Randomly selecting 1 example from training data perms = np.random.permutation(X_train.shape[1]) index = perms[:1]  # Compute forward propagation AL, caches = L_model_forward(X_train[:, index], parameters, "tanh")  # Compute analytical gradients gradients = L_model_backward(AL, y_train[:, index], caches, "tanh")  # Compute difference of numerical and analytical gradients difference = gradient_check(parameters, gradients, X_train[:, index], y_train[:, index], layers_dims) 

反向传播的实现是 OK 的!这里的差值是 3.0220555297630148e-09

结论

以下是一些关键点:

  • 双边形式的数值梯度在逼近解析梯度时效果比单边形式的数值梯度更好。

  • 由于梯度检验的运行很慢,因此:

  •  进行梯度检验时,只使用一个或少数样本;

  •  在确认反向传播的实现代码无误后,训练神经网络时记得取消梯度检验函数的调用。

  • 如果使用了 drop-out 策略,(直接进行)梯度检验会失效。可以在进行梯度检验时,将 keep-prob 设置为 1,训练神经网络时,再进行修改。

  • 通常采用 e=10e-7 作为检查解析梯度和数值梯度间差值的基准。如果差值小于 10e-7,则反向传播的实现代码没有问题。

  • 幸运的是,在诸如 TensorFlow、PyTorch 等深度学习框架中,我们几乎不需要自己实现反向传播,因为这些框架已经帮我们计算好梯度了;但是,在成为一个深度学习工作者之前,动手实现这些算法是很好的练习,可以帮助我们理解其中的原理。

源代码地址:https://ift.tt/2rAJnyX

]]> 原文: https://ift.tt/2ruzpPy
RSS Feed

机器知心

IFTTT

DLL:一个炙手可热的快速深度神经网络库

DLL 是一个旨在提供由 C++实现的受限玻尔兹曼机(RBM)和深度信念网络(DBN)及其卷积版本的软件库,由瑞士 University of Applied Science of Western Switzerland、弗里堡大学的研究者共同提出。与常用的深度学习框架类似,它还支持更多标准的神经网络。目前,该工具已开发至 1.1 版本。

项目链接:https://ift.tt/2tz5kxX

引言

近年来,神经网络深度学习之名重获青睐。所谓的深度即是运用更大更深的网络,通常 z 指的是使用更大的输入维度来融合更多的上下文知识,以及增加网络层数来提取不同粒度级别的信息。

深度学习的成功主要归因于三个因素。第一,大数据的出现,意味着有大量的训练数据可用。第二,新的训练策略,例如无监督的预训练,它保证了深度网络会很好的初始化,并且还可以学习大量未标记数据集的高效特征提取器。

第三,更强劲的硬件有助于加速深度网络的训练过程。深度网络目前正在提高多领域的最新技术。成功的深度学习应用应该在物体识别 [1],图像标注 [2],上色 [3] 或生成高仿真的图像 [4] 等领域取得近乎人类的表现。

此外,免费且易用的框架的可用性以及基于公共数据集的详细实现样例的可用性也促成了深度学习技术的广泛运用。

从实际角度出发,理想的深度学习框架应当易于使用,能够提供高精度的快速训练,并有多种配置选项。满足所有要求十分困难,因为有些要求自相矛盾。鉴于此,我们可能会感受到现有框架之间的巨大差异。

在本文中,我们提出并开发了一个专注于高效计算,针对特定的网络模型和算法配置的深度学习框架。尽管我们意识到这些问题的局限性,但我们相信,我们在框架中实现的不同优化可能会引起研究社区的兴趣。

我们的框架叫做深度学习库(DLL),它是免费且开源的。开发这一框架的最初原因是其他机器学习框架中缺乏对受限玻尔兹曼机(RBM)[5] 和卷积 RBM(CRBM)[6] 的支持。在本论文截稿前,这一问题仍然存在。随着我们的不断开发,该框架扩展了通用的神经网络操作,现在可以用来训练标准人工神经网络(ANNs)和卷积神经网络(CNNs)[7] 等不同种类。

虽然也有 GPU 加速,但是 DLL 已针对中央处理器(CPU)的进行了速度优化。尽管 GPU 开始成为训练训练深层网络的即成标准,但它们并不总是可用,并且一些发布程序仍然针对现有的 CPU 实现。而且,一旦网络训练完成,通常会在 CPU 上执行推理。

因此,我们认为能够在合理的时间内训练神经网络并实现在 CPU 上的快速推理仍然很重要。在本文中,我们也记录了对 GPU 的成功优化,但我们必须注意到 GPU 的高级并行化已经充分利用 [8],[9],尤其是卷积网络 [10]。

除了加速外,本文的特别贡献是对几个最新的热门框架的综合评估。评估是在四个不同的模型和三个数据集上进行的。最终根据 CPU 和 GPU 上的计算时间以及训练模型的最终准确度进行比较。

本文的其余部分如下。第二节详细介绍 DLL 库。第三节介绍实验部分。第四节介绍 MNIST 的实验结果,第五节介绍 CIFAR-10 的实验结果,第六节介绍 ImageNet 的实验结果。最后,第七节给出总结。

DLL:深度学习工具库

深度学习库(DLL)是最初专注于支持 RBM 和 CRBM 的机器学习框架。它是在几项研究工作 [11] - [14] 的背景下开发并使用的。它还支持各种神经网络层和标准反向传播算法。它是用 C ++ 编写的,主接口是 C ++(在论文 II-B 节中有示例)。该框架也可以通过用简单的描述语言来使用,以使研究人员更容易上手。

该框架完全支持 RBM 模型 [5]。还可以使用对比散度(CD)[15] 进行训练。该实现是根据 [16] 中的模型设计的。它还支持深度信念网络(DBN),先逐层预训练,然后使用梯度下降法进行微调。

RBM 支持大范围的可见和隐藏单元类型,如二值函数,高斯函数和整流线性单元(ReLU)[17]。同时也按照 [6] 的模型整合对 CRBM 的支持,同时第二版整合最大池化层为池化层。

该框架还支持常规神经网络。即可以训练人工神经网络和 CNN。CNN 也支持最大池化层和平均池化层。这些网络可以使用小批量梯度下降法进行训练。同时支持动量权重衰减等基本学习选项。

该框架还支持一些高级特性,如 Dropout [18] 和 批归一化 [19]。最后,该框架也整合了 Adagrad [20],Adadelta [21] 和 Adam [22] 等自适应优化器。并支持自动编码器 [23] 和卷积自动编码器 [24]。他们可以接受有噪声的输入数据来训练以增强泛化性能,这种技术被称为去噪自动编码器 [25]。

DLL 库遵从 MIT 开源许可条款,免费使用。该项目的详细信息以及部分教程可参考主页。

实验评估

我们通过一些实验将 DLL 与目前流行的深度学习框架进行了比较。每种模型在每个框架上的训练时间都会进行比较,无论是在 CPU 上还是在 GPU 上。所有实验都计算了在每个框架上测试的准确度。结果表明,所有测试框架在使用相同参数进行训练时都准确率都不相上下。

我们在这里指出,这些实验的目标不是针对测试数据集取得最优性能。事实上,这些模型之所以简单,是为了与大量的框架进行比较。此外,如果我们的目的是取得高准确率,网络不应该总是像实验那样训练多个 epochs。

最后,重要的是:我们不知道所有框架的全部细节。我们尽最大努力保持网络架构和训练参数的同一性,但可能框架本身的一些实现细节导致训练方法,解释执行时间的差异略有不同。

本研究介绍的所有实验都运行在频率为 3.4 GHz Intel R CoreTM i7-2600,12 GB RAM 的 Gentoo Linux 机器上(针对这些测试而禁用 CPU 调频)。机器开启了 SSE 和 AVX 矢量化扩展。BLAS 通过 Intel R Math Kernel Library(MKL)以并行模式执行。基准 GPU 是 NVIDIA Geforce R GTX 960 显卡,配以 CUDA 8.0.4.4 和 CUDNN 5.0.5。为了确保实验可重现,用于这些实验的源代码已开源。

项目地址: https://ift.tt/2yx9gFp

以下是研究人员选取的对比框架:

1)Caffe [30]:Caffe 是一个高级机器学习框架,专注于速度和表达。它是用 C++ 开发的,可通过文本描述性语言使用。Caffe 1.0 可通过源码安装并支持 GPU 和 MKL。

2)TensorFlow [31]:一个允许构建数据流图来执行数值计算的通用的低级框架。该框架的核心用 C ++ 编写,但这些功能大多可通过 Python 接口调用。Tensorflow 1.3.1 可通过源码安装并支持 CUDA,CUDNN 和 MKL。

3)Keras [32]:一个高级机器学习库,为 Tensorflow 或 Theano 提供前端接口。用 Python 编写。提供了大量的高级模型,简化了机器学习模型的开发。可使用 Tensorflow 1.3.1 的官方软件包来安装 Keras 2.0.8。

4)Torch [33]:Torch 是最早于 2002 年出现的一个低级机器学习框架。通过 Lua 前端接口调用。虽然它是一个低级框架,但包含了用于机器学习的高级模块。它可以通过 Git commit 3e9e141 进行源码安装并支持 CUDA 和 MKL。

5)DeepLearning4J [34]:DeepLearning4J 是用 Java,C 和 C ++ 编写的 Java 深度学习框架。它具有非常多的功能,且专注于分布式计算。可从 Maven 获取 0.9.1 版本。

这些框架是根据它们的流行程度来选择的,也是也为了编程语言的多样性。DLL 可直接从源代码调用,截稿时可用的最新版本是(Git commit 2f3c62c)。

图 2:各框架基于 MNIST 数据集的全连接神经网络实验在 CPU 和 GPU 上的训练时间性能的比较。

图 3:各框架在 CNN,MNIST,CPU 和 GPU 上的训练时间性能比较。

论文:DLL: A Blazing Fast Deep Neural Network Library

链接:https://ift.tt/2wrHAln

深度学习库(DLL)是一个全新的机器学习库,它专注于速度。DLL 支持前馈神经网络,如全连接的人工神经网络(ANN)和卷积神经网络(CNN)。它还对受限玻尔兹曼机器(RBM)和卷积 RBM 提供非常全面的支持。

我们这项工作的主要动机是提出与评估有潜力加速训练和推理时间的创新的软件工程策略。这些策略大多独立于深度学习算法。我们在三个数据集和四个不同的神经网络模型上对 DLL 与其它五个流行的深度学习框架进行了比较。实验表明,所提出的框架在 CPU 和 GPU 上均有大幅提升。在分类性能方面,DLL 可获得与其他框架相似的准确度。

]]> 原文: https://ift.tt/2I0pA6R
RSS Feed

机器知心

IFTTT

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

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