Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

OpenAI发布「块稀疏」GPU内核:实现文本情感分析与图像生成建模当前最优水平

近日,OpenAI 在其一篇题为《Block-Sparse GPU Kernels》的博文中发布了一个低级别神经网络架构的高度优化 GPU 内核,并且这个神经网络带有「块稀疏」(block-sparse)权重。根据已选的稀疏性,这些内核可以比 cuBLAS 或 cuSPARSE 运行快几个数量级,并在文本情感分析与文本、图像生成建模方面取得了当前最优结果。机器之心对博文进行了编译,GitHub 链接及论文摘要请见文中。

  • GitHub 地址:https://github.com/openai/blocksparse
  • 论文地址:https://s3-us-west-2.amazonaws.com/openai-assets/blocksparse/blocksparsepaper.pdf

深度学习模型架构和算法的发展在很大程度上受限于基本操作的高效 GPU 实现的可用性。这其中的一个问题是缺乏稀疏线性操作的高效 GPU 实现,它也正是今天我们发布的内容,以及用其实现一些稀疏模式的初步结果。这些初步结果很有潜在价值但还存在不确定性,因此我们想邀请社区加入进来,共同解决这一难题。


密集层(左)可由宽而稀疏的层(中)或者深而稀疏的层(右)替代,并同时近似地保持计算时间。

与密集权重矩阵相反,稀疏权重矩阵具有大量为零的条目。稀疏权重矩阵作为模型的构建模块很有吸引力,因为矩阵乘法和稀疏块卷积的计算成本仅与非零块的数量成比例。例如,稀疏使得某些神经网络的训练成为可能,这些神经网络比给定相同参数和计算预算的其它网络更宽、更深,例如具有数万个隐藏单元的 LSTM(目前训练的最大的 LSTM 只有数千个隐藏单元)。

内核


密集权重矩阵(左)和块稀疏(中)权重矩阵的可视化,其中白色代表零值权重。

内核允许在全连接层和卷积层高效地使用块稀疏权重(如上所示)。对于卷积层,内核允许输入和输出特征维度的稀疏性;连接性在空间维度上不受影响。稀疏性是在块的层面被定义的(如上右图所示),并已经优化为 8x8(本实例中)、 16x16 或 32x32 的块大小。在块的层面上,稀疏性模式是完全可配置的。由于内核跳过零值块的计算,所以计算成本只与非零权重的数量成正比,而不是输入/输出特征的数量。存储参数的成本也只与非零权重的数量成正比。


不同级别的稀疏性相对于 cuBLAS 的加速效果,其使用了宽状态(12288 个隐藏单元)、32x32 的块大小和 32 的批尺寸。该对比实验使用英伟达 Titan X Pascal GPU 和 CUDA 8 完成。和 cuSPARSE 对比的加速效果更佳。


使用稀疏内核

以下是在 TensorFlow 中进行稀疏矩阵乘法运算的示例代码:

  1. from blocksparse.matmul import BlocksparseMatMul

  2. import tensorflow as tf

  3. import numpy as np

  4. hidden_size = 4096

  5. block_size = 32

  6. minibatch_size = 64

  7. # Create a (random) sparsity pattern

  8. sparsity = np.random.randint(2, size=(hidden_size//block_size,hidden_size//block_size))

  9. # Initialize the sparse matrix multiplication object

  10. bsmm = BlocksparseMatMul(sparsity, block_size=block_size)

  11. # Input to graph

  12. x = tf.placeholder(tf.float32, shape=[None, hidden_size])

  13. # Initialize block-sparse weights

  14. w = tf.get_variable("w", bsmm.w_shape, dtype=tf.float32)

  15. # Block-sparse matrix multiplication

  16. y = bsmm(x, w)

  17. # Run

  18. sess = tf.InteractiveSession()

  19. sess.run(tf.global_variables_initializer())

  20. result = sess.run([y], feed_dict = {x: np.ones((minibatch_size,hidden_size), dtype='float32')})

  21. print(result)

小世界(Small-World)LSTM

块稀疏内核的一个很有趣的应用是用于创建小世界(small-world)神经网络。小世界图的连接方式是图中的任意两个节点之间仅通过少量几步就能连接,即使图中有数百万个节点。我们实现小世界连接的动机是,即使具有高度的稀疏度,我们仍然希望信息在网络中能快速地传播。大脑中的连接模式就是小世界的,这使我们好奇同样的性质能不能用于提高 LSTM 的性能。我们使用小世界稀疏连接高效地训练了拥有大约两万个隐藏单元(与拥有相似参数数量的密集网络相比具有 5 倍的宽度)的 LSTM,提升了文本生成建模和半监督情绪分类的结果,详情参见我们的论文。


在小世界图中,小世界图的连接方式是图中的任意两个节点之间仅通过少量几步就能连接,即使图中有数百万个节点。以上动图展示了一个二维 Watts-Strogatz 小世界图上的中心节点(像素)的激活扩散现象(随机平滑灰度仅仅是为了审美效果)。在这个图中,节点之间的平均路径长度小于 5,和我们在 LSTM 实验中使用的 Barabasi-Albert 图相似。

情绪表征学习

通过使用在我们的情绪神经实验(Unsupervised Sentiment Neuron,https://blog.openai.com/unsupervised-sentiment-neuron/)中的设置,我们使用近似相等的参数数量训练 LSTM,并比较了使用密集权重矩阵的模型和一个块稀疏的变体。稀疏模型在所有的情绪数据集上的性能都超越了相对的密集模型。我们的稀疏模型将在文档级 IMDB 数据集上的当前最佳性能从 5.91% 误差率(Miyato 等,2016)降低到了 5.01%。相对于我们之前的结果(Unsupervised Sentiment Neuron,仅在短句级数据集上获得最佳结果),这个提升是很有潜在价值的。


在密集特征上训练的线性模型和稀疏生成模型的情绪分类错误率(%),两者拥有近似相等的参数总数。

压缩结果

通过使用稀疏和宽的 LSTM,在我们实验中的每个特征占用的比特数从 1.059 下降到了 1.048(在相等参数数量的前提下,即大约 1 亿个参数)。拥有块稀疏线性层的架构也可以提高相对于使用密集连接线性层的结果。我们对在 CIFAR-10 自然图像上训练的 PixelCNN++模型做了一个简单的修改。用稀疏内核替代了常规的 2D 卷积核,同时增加网络深度,但保持其它超参数不变,使每个维度占用的比特数从 2.92 下降到 2.90,达到了在该数据集上的当前最佳。

研究方向

我们在这里提几个对未来研究的建议。

大多数神经网络的权重(连接)在训练完成之后都可以修剪掉。如果能结合剪枝技术和我们的稀疏内核,能获得怎样的加速效果呢?

在生物大脑中,除了连接强度以外,网络的稀疏结构部分地在成长过程中确定。是否可以在人工神经网络中实现类似的行为,即不仅将梯度用于学习连接强度,还用于寻找最优的稀疏结构。最新的一篇论文提出了一种方法用于学习块稀疏 RNN(https://arxiv.org/abs/1711.02782)。我们近日也提出了一种算法用于在神经网络中进行 L0 正则化,可用于实现这一目标。

我们训练了拥有成千上万个隐藏单元的 LSTM,可以更好地处理文本。更一般地说,稀疏层使得训练拥有大型权重矩阵(但参数数量、计算开销和相对的密集模型相等)的模型成为可能。这种模型能为哪些领域带来显著的进步呢?

论文:GPU Kernels for Block-SparseWeights


论文链接:https://s3-us-west-2.amazonaws.com/openai-assets/blocksparse/blocksparsepaper.pdf

摘要:我们正在发布一个低级别神经网络架构(带有块稀疏(block-sparse)权重)的高度优化 GPU 内核,它允许在权重矩阵中带有灵活可配置的块稀疏性模式的线性层(包括卷积层)的高效评估与微分。我们发现根据已选稀疏性,这些内核可以比 cuBLAS 或 cuSPARSE 运行快几个数量级。我们借助这些内核取得了文本情感分析与文本、图像生成建模方面的当前最优结果。通过公开发布这些内核,我们希望可以促进模型和算法设计的进一步发展。

理论OpenAI论文神经网络架构
1
暂无评论
暂无评论~