AutoML 源自于这个想法:如果必须建立大量机器学习模型,使用各种算法和多个不同的超参数配置,那么这种模型构建的过程,还有比较模型的性能和精度都能自动化。 简单吧? 实践:训练一个能自动编程的神经网络 要求 Tensorflow + 基本的深度学习技巧 项目的 Github 库:https://github.com/thibo73800/deep_generation/tree/master/c_code 下文将快速回顾循环神经网络( RNN)相关要点,虽然不会把项目操作从头到尾过一遍,但会着重记述核心要点。花时间把每块代码都跑一边,能让你更好地理解整个逻辑。动手很关键。 好,我们这就开始吧! 数据集 做任何监督学习都需要一个训练数据集,我们这个网络也一样。项目的代码全部基于 C 语言(用太简单的语言就没意思了)。因此,我们的训练数据集将是 Github Linux 库里的 C 语言脚本。我已经预先提取了相关的 .c代码。 第一个问题: 神经网络只处理数字,其他信息都不知道。因此,数据集中的每个字符都需要表示成以下形式: 由上图可见,字符 “=” 被分配给了数字 7。稍后我们会用热编码表示每个数字,这样能在反向传播的过程中更好地收敛。 这里需要记住 3 个重要的变量:vocab_to_int、int_to_vocab和encoded。前两个让我们能够在字符和数字间自由转换,最后一个则是所有数据集的 encoder 格式。 第一个批次 先来生成一个简单的批次,含有两个序列,每个序列由 10 个数字组成。这个批次也将作为下面文章的样本。 这个批次看起来是这样的。也可以显示成: 好,现在我们有了需要处理的第一批值。我们的神经网络需要做的事情是,在知道已经输入的 n 个字符(而不是仅仅前一个字符)后,能够预测接下来要输入的字符是什么。比方说,如果我告诉网络,最后一个输入的字符是“e”,那么进化的可能有很多种。但是,如果我说最后的输入是“w”“h”“i”“l”和“e”,那么接下来要输入的字符是“(”就显而易见了。 因此,我们的神经网络必须要能考虑到字符类型的时空特征。 而为了实现这一点,我们需要用到一个循环神经网络。 循环神经网络 为了说明最后一个例子,一个经典的分类器(上图的左边)接收前面的字母;这个字母会被传入隐藏层(用蓝色表示),网络会推导出一个输出。一个循环的神经网络在结构上是不同的。每个单元(用红色表示)不仅连接到输入,还与时刻t-1的单元相连。为了解决我们的问题,我们将使用 LSTM(长短时内存)单元。 开始建模! 下面我们将详细介绍这篇文章的 5 个主要部分。占位符作为模型的一个 entry。LSTM 单元的初始化用于创建 RNN。 输出层与每个单元相连。相关运算用于测量模型的误差。最后,我们会定义训练的运算。 1)Graph 输入 批次由两个大小为 10 的输入组成,因此我们输入的形状大小为 [2,10],这个批次的每个 entry 与单个输出相关联,可以将我们的目标也定义为相同的形状。最后,我们定义一个占位符,用于将来 dropout 概率的值。 2)LSTM 输出 我们依次来看这段代码: (责任编辑:本港台直播) |