2017年,机器之心贡献过的开源项目

机器之心原创

参与:蒋思源、黄小天



机器之心目前有三个 GitHub 项目,即旨在构建 AI 领域术语库的「Artificial-Intelligence-Terminology」、旨在提供高质量模型实现与试验的「ML-Tutorial-Experiment」和旨在开放 AI 企业评选的「AI00」。



机器之心 GitHub 项目地址:http://github.com/jiqizhixin

人工智能术语计划

目前「Artificial-Intelligence-Terminology」共有 750 个专业术语,我们将机器之心在编译技术文章和论文过程中所遇到的专业术语记录下来,希望有助于大家查阅和翻译。同时也希望大家能积极指出我们编译的不当之处。

项目地址:http://github.com/jiqizhixin/Artificial-Intelligence-Terminology



2017年,机器之心贡献过的开源项目



在该项目中,读者可通过 README 界面表盘查看自己想要了解的专业词汇。在单个首字母中,表格的组织形式为:英文/缩写、汉语、来源&扩展。



来源&扩展是对该词汇的注解,内容为机器之心往期的相关文章。例如字母 A 中的「算法」,我们关联到的三篇文章是《回归、分类与聚类:三大方向剖解机器学习算法的优缺点》和《机器学习算法附速查表》和《深度学习算法全景图:从理论证明其正确性》。因此,我们希望不仅能提供相对应的术语,同时还希望能为读者提供每一个术语的来源和概念上的扩展。



我们最近的工作很大程度上都在增加每个术语的对应链接,我们希望每个术语不仅有对应的翻译和表达方式,同时还能提供相关的文章。



本项目中所有英文专业词汇对照的中文都来自机器之心编译的文章和系列机器学习教科书(如周志华的《机器学习》和李航的《统计学习方法》和 Ian Goodfellow 的《深度学习》中译版等),我们力求在提供准确翻译的同时保留最常用的形式。



目前该术语库重点更新了各词汇的链接文章,并直接体现在项目中。但由于当前仍在继续添加与完善词汇对应的链接,因此我们并没有直接更新到词汇展示页。我们的词汇展示页可以很便捷地查找便捷的 AI 词汇,并且我们很快会添加扩展链接以方便读者索引对应的词汇和对应的术语解释,以下是术语的展示页面:



展示地址:http://jiqizhixin.github.io/AI-Terminology-page/



2017年,机器之心贡献过的开源项目



算法教程与实现

目前机器学习算法实现项目共获得 976 次收藏,是我们今年将要重点关注和完善的项目。它目前有三篇详细的教程文章,即 CNN 的实现、经典 GAN 的推导与实现和 CapsNet 的解读。我们希望能提供高质量和能实现的技术文章,在这些文章中,我们所使用的代码块或整体实现都是我们预先测试的。且我们提供的 Jupyter Notebook 都带有代码注释,非常适合初学者随文章阅读。

项目地址:http://github.com/jiqizhixin/ML-Tutorial-Experiment

在从零开始用 TensorFlow 搭建卷积神经网络的文章中,我们主要介绍的是 CNN 的实现,而并不会从理论和概念上详细解释深度神经网络、卷积神经网络、最优化方法等基本内容。值得注意的是,这篇文章不仅从最基础的 TensorFlow 安装开始,同时还详细描述了 TensorFlow 的基本操作和构建方法。

文章地址:机器之心 GitHub 项目:从零开始用 TensorFlow 搭建卷积神经网络

该教程主要从全连接网络到 LeNet-5 介绍了如何构建基本的 CNN,如下展示了最初的 LeNet-5 架构:

def

model_lenet5(data, variables)

:



   layer1_conv = tf.nn.conv2d(data, variables[

"w1"

], [

1

,

1

,

1

,

1

], padding=

"SAME"

)

   layer1_actv = tf.sigmoid(layer1_conv + variables[

"b1"

])

   layer1_pool = tf.nn.avg_pool(layer1_actv, [

1

,

2

,

2

,

1

], [

1

,

2

,

2

,

1

], padding=

"SAME"

)



   layer2_conv = tf.nn.conv2d(layer1_pool, variables[

"w2"

], [

1

,

1

,

1

,

1

], padding=

"VALID"

)

   layer2_actv = tf.sigmoid(layer2_conv + variables[

"b2"

])

   layer2_pool = tf.nn.avg_pool(layer2_actv, [

1

,

2

,

2

,

1

], [

1

,

2

,

2

,

1

], padding=

"SAME"

)



   flat_layer = flatten_tf_array(layer2_pool)

   layer3_fccd = tf.matmul(flat_layer, variables[

"w3"

]) + variables[

"b3"

]

   layer3_actv = tf.nn.sigmoid(layer3_fccd)



   layer4_fccd = tf.matmul(layer3_actv, variables[

"w4"

]) + variables[

"b4"

]

   layer4_actv = tf.nn.sigmoid(layer4_fccd)

   logits = tf.matmul(layer4_actv, variables[

"w5"

]) + variables[

"b5"

]

   

return

logits

第二个分析与实现的主题是 GAN,该文章从原论文出发,借助 Goodfellow 在 NIPS 2016 的演讲和台大李弘毅的解释,而完成原 GAN 的推导与证明。其主要分为四部分,第一部分是描述 GAN 的直观概念,第二部分描述概念与优化的形式化表达,第三部分将对 GAN 进行详细的理论推导与分析,最后一部分将实现前面的理论分析。

文章地址:机器之心 GitHub 项目:GAN 完整理论推导与实现,Perfect!

在这篇文章中,我们最后描述了整个算法的训练过程:

对于每一次迭代:

  • 从真实数据分布 P_data 抽取 m 个样本

  • 从先验分布 P_prior(z) 抽取 m 个噪声样本

  • 将噪声样本投入 G 而生成数据 

    2017年,机器之心贡献过的开源项目

    通过最大化 V 的近似而更新判别器参数θ_d,即极大化 

    2017年,机器之心贡献过的开源项目

     ,且判别器参数的更新迭代式为 

    2017年,机器之心贡献过的开源项目




  • 以上是学习判别器 D 的过程。因为学习 D 的过程是计算 JS 散度的过程,并且我们希望能最大化价值函数,所以该步骤会重复 k 次。



  • 从先验分布 P_prior(z) 中抽取另外 m 个噪声样本 {z^1,...,z^m}

  • 通过极小化 V^tilde 而更新生成器参数θ_g,即极大化 

    2017年,机器之心贡献过的开源项目

    ,且生成器参数的更新迭代式为 

    2017年,机器之心贡献过的开源项目




  • 以上是学习生成器参数的过程,这一过程在一次迭代中只会进行一次,因此可以避免更新太多而令 JS 散度上升。

    除了文章中所描述的 Keras 实现,后续我们还在补充资料中添加了 TensorFlow 实现。如下所示定义了生成器与判别器:

    #定义生成器



    def

    generator(z)

    :





       

    #第一层先计算 y=z*G_W1+G-b1,然后投入激活函数计算G_h1=ReLU(y),G_h1 为第二次层神经网络的输出激活值



       G_h1 = tf.nn.relu(tf.matmul(z, G_W1) + G_b1)



       

    #以下两个语句计算第二层传播到第三层的激活结果,第三层的激活结果是含有784个元素的向量,该向量转化28×28就可以表示图像



       G_log_prob = tf.matmul(G_h1, G_W2) + G_b2

       G_prob = tf.nn.sigmoid(G_log_prob)

       

    return

    G_prob



    #定义判别器



    def

    discriminator(x)

    :





       

    #计算D_h1=ReLU(x*D_W1+D_b1),该层的输入为含784个元素的向量



       D_h1 = tf.nn.relu(tf.matmul(x, D_W1) + D_b1)



       

    #计算第三层的输出结果。因为使用的是Sigmoid函数,则该输出结果是一个取值为[0,1]间的标量(见上述权重定义)



       

    #即判别输入的图像到底是真(=1)还是假(=0)



       D_logit = tf.matmul(D_h1, D_W2) + D_b2

       D_prob = tf.nn.sigmoid(D_logit)



       

    #返回判别为真的概率和第三层的输入值,输出D_logit是为了将其输入tf.nn.sigmoid_cross_entropy_with_logits()以构建损失函数



       

    return

    D_prob, D_logit

    第三篇描述的是 Hinton 等人提出来的 CapsNet,其旨在解释 CapsNet 的网络架构与实现。为了解释 CapsNet,该文章从卷积层与卷积机制开始,从工程实践的角度解释卷积操作的过程与输出,这对进一步理解 Capsule 层的处理十分有利,后面文章基于对 Capsule 层的理解解释 Geoffrey Hinton 等人最近提出来的 CapsNet 架构,并根据 naturomics 的实现进行测试与解释。

    文章地址:先读懂 CapsNet 架构然后用 TensorFlow 实现,这应该是最详细的教程了

    根据 Dynamic Routing Between Capsules,整个层级间的传播与分配可以分为两个部分,第一部分是下图 u_i 与 u_j|i hat 间的线性组合,第二部分是 u_j|i hat 与 s_j 之间的 Routing 过程:

    2017年,机器之心贡献过的开源项目

    图:Capsule 层级结构图

    如上所示,该图展示了 Capsule 的层级结构与动态 Routing 的过程。最下面的层级 u_i 共有两个 Capsule 单元,该层级传递到下一层级 v_j 共有四个 Capsule。u_1 和 u_2 是一个向量,即含有一组神经元的 Capsule 单元,它们分别与不同的权重 W_ij(同样是向量)相乘得出 u_j|i hat。例如 u_1 与 W_12 相乘得出预测向量 u_2|1 hat。随后该预测向量和对应的「耦合系数」c_ij 相乘并传入特定的后一层 Capsule 单元。不同 Capsule 单元的输入 s_j 是所有可能传入该单元的加权和,即所有可能传入的预测向量与耦合系数的乘积和。随后我们就得到了不同的输入向量 s_j,将该输入向量投入到「squashing」非线性函数就能得出后一层 Capsule 单元的输出向量 v_j。然后我们可以利用该输出向量 v_j 和对应预测向量 u_j|i hat 的乘积更新耦合系数 c_ij,这样的迭代更新不需要应用反向传播。

    在最近 Sara 等研究者开放了论文 Dynamic Routing between Capsules 的官方实现代码后,我们也对核心代码做了简要的解析。这一份实现是 Sara 等研究者获得顶尖结果的依据,它与其它研究者所复现的代码主要有三个区别。首先,Sara 的实现会添加一个 leaky_routing 函数,按照该函数的定义,它会添加额外的维度以路由分对数(logits)。如果需要执行路由的张量维度与上层任意 Capsule 单元不匹配,那么该函数将允许激活的 Capsule 单元在额外的维度中进行路由。

    其次是 Sara 的实现调用了两次动态路由算法(余弦相似度),而我们从论文上理解为只有在 DigitCaps 层才会使用动态路由,因此相对于其它研究者直接将卷积后的张量投入 Squash 非线性函数,Sara 的实现会先迭代精炼几次卷积结果。最后一点是 naturomics 所表明的偏置项问题,他表明 Sara 等人实现的路由算法在投入到 Squash 非线性激活函数时会添加一个偏置项。我们将官方核心代码的解读添加到了补充资料中。

    文章地址:Capsule 官方代码开源之后,机器之心做了份核心代码解读 

    目前这三个分析与实现并没有成体系,比如果我们没有从基础的机器学习算法开始,一步步完善各算法的试验与分析。在新的一年,我们将重点关注于该项目而提供高质量的教程与实现。

    AI00



    2017年,机器之心贡献过的开源项目

    We believe AI should be an extension of individual human wills and, in the spirit of liberty, as broadly and evenly distributed as possible. -OpenAI

    项目地址:http://github.com/jiqizhixin/AI00

    这不仅是一份榜单,更是一个人人可以参与的开源项目,人工智能是一个复杂庞大的体系,涉及众多学科,也关乎技术、产品、行业和资本等众多要素,本报告的写作团队只代表他们的专业观点,有自己的局限性,需要更多行业专家参与进来加以修正和完善。



    人工智能技术和行业的发展瞬息万变,而报告的制作周期较长,其中的内容和数据势必会落后于行业的最新进展,无法同时满足时效性和高质量的要求。而领域内参与者的及时更新可以解决这个问题。



    我们深刻地理解在没有专业用户反馈的情况下所做出报告的质量局限性,所以希望用工程界「Agile Development」的理念来对待我们的报告,不断收集专业反馈来持续提升报告质量。



    以上是机器之心现有的一些 GitHub 项目,我们还会继续扩展并发现对读者有帮助的新计划,例如汉化或制作机器学习工具包的速查表、从《Deep Learning》或其它书籍衍生出的知识点等等。在新的一年里,机器之心希望读者能和我们共同完善这一些目标。



    目前 AI00 已经走过了一年多的时间,从 2016 年 10 月的第一份榜单开始,该项目已经更新了 15 次。我们每一次都会根据读者与业界的反馈更新各上榜公司的主营业务、融资情况和所属领域等。以下是自第一次榜单以来的更新情况:



    机器之心选出全球最值得关注的100家人工智能公司(中国27家)

    机器之心「AI00」十一月最新榜单:两家国内公司新上榜

    机器之心「AI00」十二月最新榜单:四家公司新上榜



    机器之心「AI00」一月最新榜单:英国最火的机器学习创业公司



    机器之心「AI00」二月最新榜单:新增赛灵思、Argo AI和Gamalon



    机器之心「AI00」三月最新榜单:新增DataRobot与值得关注的Neuralink



    机器之心「AI00」四月最新榜单:新增人工智能网络安全公司Cylance和Sift Science



    机器之心「AI00」颁奖晚宴闭幕,五月最新榜单发布



    机器之心「AI00」六月最新榜单:算法商店Algorithmia与网络安全公司Spark



    机器之心「AI00」七月榜单:「AI不止语音助手」的华为



    机器之心「AI00」八月榜单:脱胎于谷歌TPU团队的Groq



    机器之心「AI00」九月榜单:1400万美元A轮融资的TalkIQ



    机器之心「AI00」十月榜单:卡耐基梅隆大学数位博士开创的Solvvy



    机器之心「AI00」十一月榜单:OpenAI科学家创立Embodied Intelligenc

    e



    机器之心「AI00」十二月榜单:紧盯AI人才的京东



    机器之心「AI00」一月榜单:前谷歌自动驾驶首席工程师创立Nuro

    本文为机器之心原创,

    转载请联系本公众号获得授权



    ?------------------------------------------------

    加入机器之心(全职记者/实习生):hr@jiqizhixin.com

    投稿或寻求报道:editor@jiqizhixin.com

    广告&商务合作:bd@jiqizhixin.com