2017年12月31日星期日

新年快乐!这是份值得收藏的2017年AI与深度学习要点大全

若朴 夏乙 编译自 WILDML量子位 出品 | 公众号 QbitAI

2017已经正式离我们远去。

过去的一年里,有很多值得梳理记录的内容。博客WILDML的作者、曾在Google Brain做了一年Resident的Denny Britz,就把他眼中的2017年AI和深度学习的大事,进行了一番梳理汇总。

量子位进行概要摘录如下,详情可前往原文查看,地址:http://ift.tt/2zSsyRT

强化学习称霸人类游戏

如果说2016年AlphaGo击败李世乭之后,大家对它的棋坛地位还有些许怀疑的话,2017年击败柯洁,让它成了毫无疑问的围棋霸主。

作为一个强化学习Agent,它的第一个版本使用了来自人类专家的训练数据,然后通过自我对局和蒙特卡洛树搜索的改进来进化。

不久之后,AlphaGo Zero更进一步,使用了之前一篇论文Thinking Fast and Slow with Deep Learning and Tree Search提出的技术,从零开始下围棋,在训练中没有用到人类对局的数据。

临近年底,我们又看到了新一代的AlphaGo:AlphaZero,在围棋之后,用同样的技术搞定了国际象棋和日本将棋。

这些算法在对局中所用的策略,有时候甚至让经验丰富的棋手都觉得惊讶,他们也会向AlphaGo学习,改变着自己的对局风格。为了让学习更容易,DeepMind还发布了AlphaGo Teach工具。

下面是相关论文,认真的同学们可以收藏回顾啦:

AlphaGo

http://ift.tt/2kxZgUN

AlphaGo Zero

http://ift.tt/2yztrBO

AlphaZero

http://ift.tt/2nvQQ3f

Thinking Fast and Slow with Deep Learning and Tree Search

http://ift.tt/2rPEb9y

AI今年取得重大进展的游戏不止围棋。CMU研究人员的Libratus(冷扑大师)在20天的一对一无限注德州扑克比赛中,击败了人类顶级扑克玩家。

再早些时候,查尔斯大学、捷克技术大学和加拿大阿尔伯塔大学开发的DeepStack,首先击败了专业德扑玩家。

有一点值得注意,这两个程序玩的都是一对一扑克,也就是两名玩家之间的对局,这比多人游戏更容易。2018年,我们很可能看到算法在多玩家扑克上取得一些进步。

Libratus论文:

http://ift.tt/2B77b4U

用强化学习玩人类游戏的下一个领域,似乎是更复杂的多人游戏,除了多人扑克之外,还有星际争霸、DotA等等。DeepMind正在积极研究星际争霸2,发布了相关的研究环境。

星际争霸2研究环境:

http://ift.tt/2hKMX7E

而OpenAI在DotA中单比赛中取得了初步的成功,玩转5v5游戏,是他们的下一步目标。

进化算法回归

对于监督学习来说,基于梯度的反向传播算法已经非常好,而且这一点可能短期内不会有什么改变。

然而,在强化学习中,进化策略(Evolution Strategies, ES)似乎正在东山再起。因为强化学习的数据通常不是lid(独立同分布)的,错误信号更加稀疏,而且需要探索,不依赖梯度的算法表现很好。另外,进化算法可以线性扩展到数千台机器,实现非常快的平行训练。它们不需要昂贵的GPU,但可以在成百上千便宜的CPU机器上进行训练。

2017年早些时候,OpenAI的研究人员证明了进化策略实现的性能,可以与Deep Q-Learning等标准强化学习算法相媲美。

相关论文:

http://ift.tt/2mV8c7N

年底,Uber内部一个团队又连发5篇论文,来展示遗传算法和新颖性搜索的潜力。他们使用非常简单的遗传算法,没有任何梯度信息,学会了玩各种雅达利游戏。他们的进化算法在Frostbite游戏中达到了10500分,而DQN、AC3、ES等算法在同样的游戏中得分都不到1000。

WaveNets,CNNs以及注意力机制

谷歌的Tacotron 2文本转语音系统效果令人印象深刻。这个系统基于WaveNet,也是一种自动回归模型,也被部署于Google Assistant之中,并在过去一年得到快速提升。

远离昂贵且训练漫长的回归架构是一个更大的趋势。在论文Attention is All you Need里,研究人员完全摆脱了循环和卷积,使用一个更复杂的注意力机制,只用了很小的训练成本,就达到了目前最先进的结果。

论文地址:http://ift.tt/2rUnEDo

深度学习框架这一年

如果非要用一句话总结2017,那只能说是框架之年。

Facebook搞出了PyTorch,这个框架得到了搞自然语言处理的研究人员大爱。

TensorFlow在2017年继续领跑,目前已经发布到1.4.1版本。除了主框架之外,还发布了多个伴随库。TensorFlow团队还发布了一个全新的eager execution模式,类似PyTorch的动态计算图。

此外,

  • 苹果发布了CoreML移动机器学习库;
  • Uber的一个团队发布了Pyro,一个深度概率编程语言;
  • 亚马逊宣布在MXNet上提供更高级别的API Gluon;
  • Uber发布了内部米开朗基罗机器学习基础设施平台的详情;
  • 由于框架已经太多,Facebook和微软宣布推出ONNX开放格式,以便跨框架共享深度学习模型。

除了通用的深度学习框架外,我们还看到大量的强化学习框架发布:

  • OpenAI Roboschool,用于机器人仿真

http://ift.tt/2pDYk4N

  • OpenAI Baselines,一套强化学习算法的高质量实现

http://ift.tt/2qkiPiA

  • Tensorflow Agents,用TensorFlow来训练RL智能体

http://ift.tt/2eMG41w

  • Unity ML Agents,研究人员可用Unity Editor来创建游戏,并展开强化训练

http://ift.tt/2wtV3sn

  • Nervana Coach,用最先进的强化学习算法进行试验

http://ift.tt/2zpOzHS

  • Facebook ELF,游戏研究平台

http://ift.tt/2sKQxUp

  • DeepMind Pycolab,定制化的游戏引擎

http://ift.tt/2js86RV

  • Geek.ai MAgent,多智能体强化学习平台

http://ift.tt/2B1SkrX

为了让深度学习更易普及,还有一些面向web的框架,例如谷歌的deeplearn.js和MIL WebDNN执行框架。

2017,还有一个流行框架跟我们告别了。

那就是Theano。

学习资源

随着深度学习和强化学习越来越流行,2017年有越来越多的课程、训练营等活动举行并分享到网上。以下是我最爱的一些。

  • Deep RL Bootcamp,由OpenAI和UC Berkeley联合主办,主要讲授关于强化学习的基础知识和最新研究成果

地址:http://ift.tt/2lBpRiG

  • 斯坦福视觉识别卷积神经网络课程2017春季版

http://ift.tt/1ERxZ3M

  • 斯坦福自然语言处理与深度学习课程2017冬季版

http://ift.tt/1PGjeBB

  • 斯坦福的深度学习理论课程

http://ift.tt/2zokyf4

  • Coursera上最新的深度学习课程

http://ift.tt/2vLAXJh

  • 蒙特利尔深度学习和强化学习暑期学校

http://ift.tt/2wmv96D

  • UC Berkeley的深度强化学习课程2017秋季版

http://ift.tt/1qYr18w

  • TensorFlow开发者大会上关于深度学习和TensorFlow API相关的内容

https://www.youtube.com/playlist?list=PLOU2XLYxmsIKGc_NBoIhTn2Qhraji53cv

几大学术会议,延续了在网上发布会议内容的新传统。如果你想赶上最尖端的研究,可以查看这些顶级会议的录像资料。

  • NIPS 2017:

http://ift.tt/2zftYsz

  • ICLR 2017:

http://ift.tt/2w6f4S1

  • EMNLP 2017:

http://ift.tt/2jnJwVh

研究人员也开始在arXiv上发布低门槛的教程和综述论文。以下是过去一年我的最爱。

  • 深度强化学习:概述

Deep Reinforcement Learning: An Overview

http://ift.tt/2ktZJF8

  • 给工程师的机器学习简介

A Brief Introduction to Machine Learning for Engineers

http://ift.tt/2jj49Sy

  • 神经机器翻译

Neural Machine Translation

http://ift.tt/2ChIxvE

  • 教程:神经机器翻译和序列到序列模型

Neural Machine Translation and Sequence-to-sequence Models: A Tutorial

http://ift.tt/2n2ZySm

应用:AI和医学

2017年,有不少人宣称用深度学习解决了医疗问题,而且还击败了人类专家。这其中有真正的突破,也有一些炒作。对这方面感兴趣的话,推荐关注Luke Oakden-Rayner的人类医生终结系列博客:

http://ift.tt/2op2Ak2

这里简要介绍一些发展。其中最重要的事件包括:斯坦福的一个团队公布了用深度学习识别皮肤癌的算法细节。

相关研究:http://ift.tt/2q56YtZ

另一个斯坦福的团队则开发了一个模型,能比人类专家更好的发现心律失常。

相关研究:http://ift.tt/2sx5wNG

当然也有一些风波。例如DeepMind与NHS之间的问题;NIH发布了一个不适合训练AI的胸部X光片数据集等等。

应用:艺术和GAN

应用于图像、音乐、绘图和视频领域的生成模型,今年也越来越受到关注。NIPS 2017还首次推出了面向创意与设计的机器学习研讨会。

最流行的应用之一是谷歌的QuickDraw,使用神经网络来识别你的涂鸦。基于已经发布的数据集,你甚至可以让机器帮你画完草稿。

一起去玩一下:

http://ift.tt/2f1IjPw

GAN今年取得了不少重大进展。例如CycleGAN、DiscoGAN、StarGAN等新模型在生成人脸方面令人印象深刻。GAN通常难以生成逼真的高分辨率图像,但pix2pixHD改变了这种现状。

相关地址:

CycleGAN

http://ift.tt/2nBk0uc

DiscoGAN

http://ift.tt/2niiUWJ

StarGAN

http://ift.tt/2n7KjeO

应用:无人车

无人车领域的大玩家包括Uber、Lyft、Waymo和Tesla。Uber这一年都麻烦不断,但是这家公司一直没有停下在无人车方面的脚步。

Waymo在亚利桑那的凤凰城进行了一系列无人车实验,还公布了测试和模拟技术的细节。Lyft正在建立自己的无人车硬件和软件体系。特斯拉的Autopilot没有太多更新。

当然还有一个"新的"入局者,库克证实苹果公司也在研究自动驾驶。

超酷的研究和应用

今年有很多好玩的项目和展示,这里不可能提及所有:

  • 用深度学习去除背景
  • 用深度学习创造动漫角色

一起来试试吧~ http://ift.tt/2vt6nCQ

  • 用神经网络给黑白照片着色
  • 神经网络玩《马里奥赛车》
  • 实时《马里奥赛车 64》AI

http://ift.tt/2hg7ttR

  • 使用深度学习鉴别赝品
  • 随手画猫

在研究层面,

  • 无监督情绪神经元 - 一个可以学习情绪的系统,尽管只被亚马逊训练用于预测评论的下一个字符。
  • 学会沟通 - 智能体"开发"了自己的语言。
  • 习得索引结构 - 使用神经网络优化高速缓存B-Tree。

http://ift.tt/2AZWqRm

  • Attention is All You Need - Google推出的翻译架构Transformer完全舍弃了RNN/CNN结构。

http://ift.tt/2rV0EE7

  • Mask R-CNN
  • Deep Image Prior,图像去噪、超分辨率和修补。

数据集

神经网络需要大量的数据,因此开放数据集是对行业的重要贡献。以下是今年几个新推出的数据集代表。

  • Youtube Bounding Boxes

http://ift.tt/2luEbdC

  • Google QuickDraw Data

http://ift.tt/2qWD6Q1

  • DeepMind Open Source Datasets

http://ift.tt/2lw5FPQ

  • Google Speech Commands Dataset

http://ift.tt/2g81MRw

  • Atomic Visual Actions

http://ift.tt/2hQaroW

  • Several updates to the Open Images data set

http://ift.tt/2d1Ashr

  • Nsynth dataset of annotated musical notes

http://ift.tt/2oFVGdP

  • Quora Question Pairs

http://ift.tt/2k0ITjN

深度学习,重现性和炼金术

过去一年中,研究人员对学术论文结果的可复现性提出了担忧。深度学习模型通常依赖于大量的超参数,必须对其进行优化才能获得足够好的结果。这种优化代价高昂,可能只有Google和Facebook才能负担得起。

另外,研究人员并不总是同步公开代码,论文中有时还会漏掉重要的细节,或者使用特殊的评估方法……这些因素都让可复现性成为一个大问题。

在论文Are GANs Created Equal? A Large-Scale Study中,使用昂贵的超参数搜索调整GAN,可以击败更为复杂的方法。

论文地址:http://ift.tt/2ijo589

同样,在论文On the State of the Art of Evaluation in Neural Language Models中,研究人员表明,简单的LSTM架构在正确调整后,表现就能比最近的多数模型都好。

论文地址:http://ift.tt/2ua2O3P

在NIPS 2017大会上,阿里·拉希米称现在的深度学习就像"炼金术",呼吁更为严谨的学术管理。不过Yann LeCun随即进行了实名反击。

竞争,炒作和失败

加拿大和中国,正在加速AI方面的部署。

硬件方面,AI芯片竞争提速,英伟达发布了最新的Titan V旗舰GPU、Google发布了第二代TPU、英特尔的Nervana也发布了新的芯片。就连特斯拉也在开发AI硬件。另外,来自中国的竞争者也不容小觑。

宣传非常重要,但有些宣传和实验室实际发生的事情不符。IBM沃森就是过度营销的传奇,并没有带来相符的结果。大家都不喜欢沃森,所以他们在医疗方面一再失败也不奇怪。

Facebook的人工智能发明了自己的语言那事,其实也跟真相不符。这不简单是媒体的误导,研究人员所用的标题和摘要也越了界,没能反映实验的实际结果。

— 完 —

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

诚挚招聘

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

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

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



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

RSS5

IFTTT

Python环境下的8种简单线性回归算法

本文中,作者讨论了 8 种在 Python 环境下进行简单线性回归计算的算法,不过没有讨论其性能的好坏,而是对比了其相对计算复杂度的度量。


GitHub 地址:http://ift.tt/2p6DTh5


对于大多数数据科学家而言,线性回归方法是他们进行统计学建模和预测分析任务的起点。但我们不可夸大线性模型(快速且准确地)拟合大型数据集的重要性。如本文所示,在线性回归模型中,「线性」一词指的是回归系数,而不是特征的 degree。


特征(或称独立变量)可以是任何的 degree,甚至是超越函数(transcendental function),比如指数函数、对数函数、正弦函数。因此,很多自然现象可以通过这些变换和线性模型来近似模拟,即使当输出与特征的函数关系是高度非线性的也没问题。


另一方面,由于 Python 正在快速发展为数据科学家的首选编程语言,所以能够意识到存在很多方法用线性模型拟合大型数据集,就显得尤为重要。同样重要的一点是,数据科学家需要从模型得到的结果中来评估与每个特征相关的重要性。


然而,在 Python 中是否只有一种方法来执行线性回归分析呢?如果有多种方法,那我们应该如何选择最有效的那个呢?


由于在机器学习中,Scikit-learn 是一个十分流行的 Python 库,因此,人们经常会从这个库调用线性模型来拟合数据。除此之外,我们还可以使用该库的 pipeline 与 FeatureUnion 功能(如:数据归一化、模型回归系数正则化、将线性模型传递给下游模型),但是一般来看,如果一个数据分析师仅需要一个又快又简单的方法来确定回归系数(或是一些相关的统计学基本结果),那么这并不是最快或最简洁的方法。

虽然还存在其他更快更简洁的方法,但是它们都不能提供同样的信息量与模型灵活性。


请继续阅读。


有关各种线性回归方法的代码可以参阅笔者的 GitHub。其中大部分都基于 SciPy 包

SciPy 基于 Numpy 建立,集合了数学算法与方便易用的函数。通过为用户提供高级命令,以及用于操作和可视化数据的类,SciPy 显著增强了 Python 的交互式会话。


以下对各种方法进行简要讨论。


方法 1:Scipy.polyfit( ) 或 numpy.polyfit( )




这是一个非常一般的最小二乘多项式拟合函数,它适用于任何 degree 的数据集与多项式函数(具体由用户来指定),其返回值是一个(最小化方差)回归系数的数组。


对于简单的线性回归而言,你可以把 degree 设为 1。如果你想拟合一个 degree 更高的模型,你也可以通过从线性特征数据中建立多项式特征来完成。


详细描述参考:http://ift.tt/2CnflGf


方法 2:stats.linregress( )



这是 Scipy 中的统计模块中的一个高度专门化的线性回归函数。其灵活性相当受限,因为它只对计算两组测量值的最小二乘回归进行优化。因此,你不能用它拟合一般的线性模型,或者是用它来进行多变量回归分析。但是,由于该函数的目的是为了执行专门的任务,所以当我们遇到简单的线性回归分析时,这是最快速的方法之一。除了已拟合的系数和截距项(intercept term)外,它还会返回基本的统计学值如 R² 系数与标准差。


详细描述参考:http://ift.tt/2iLOUgP


方法 3:optimize.curve_fit( )



这个方法与 Polyfit 方法类似,但是从根本来讲更为普遍。通过进行最小二乘极小化,这个来自 scipy.optimize 模块的强大函数可以通过最小二乘方法将用户定义的任何函数拟合到数据集上。


对于简单的线性回归任务,我们可以写一个线性函数:mx+c,我们将它称为估计器。它也适用于多变量回归。它会返回一个由函数参数组成的数列,这些参数是使最小二乘值最小化的参数,以及相关协方差矩阵的参数。


详细描述参考:http://ift.tt/2yy7MHR


方法 4:numpy.linalg.lstsq



这是用矩阵因式分解来计算线性方程组的最小二乘解的根本方法。它来自 numpy 包中的线性代数模块。通过求解一个 x 向量(它将|| b—a x ||²的欧几里得 2-范数最小化),它可以解方程 ax=b。


该方程可能会欠定、确定或超定(即,a 中线性独立的行少于、等于或大于其线性独立的列数)。如果 a 是既是一个方阵也是一个满秩矩阵,那么向量 x(如果没有舍入误差)正是方程的解。


借助这个方法,你既可以进行简单变量回归又可以进行多变量回归。你可以返回计算的系数与残差。一个小窍门是,在调用这个函数之前,你必须要在 x 数据上附加一列 1,才能计算截距项。结果显示,这是处理线性回归问题最快速的方法之一。


详细描述参考:http://ift.tt/2DlIgIp


方法 5: Statsmodels.OLS ( )


statsmodel 是一个很不错的 Python 包,它为人们提供了各种类与函数,用于进行很多不同统计模型的估计、统计试验,以及统计数据研究。每个估计器会有一个收集了大量统计数据结果的列表。其中会对结果用已有的统计包进行对比试验,以保证准确性。


对于线性回归,人们可以从这个包调用 OLS 或者是 Ordinary least squares 函数来得出估计过程的最终统计数据。


需要记住的一个小窍门是,你必须要手动为数据 x 添加一个常数,以用于计算截距。否则,只会默认输出回归系数。下方表格汇总了 OLS 模型全部的结果。它和任何函数统计语言(如 R 和 Julia)一样丰富。




详细描述参考:http://ift.tt/2p4lB0b


方法 6、7:使用矩阵求逆方法的解析解


对于一个良态(well-conditioned)线性回归问题(至少是对于数据点、特征),回归系数的计算存在一个封闭型的矩阵解(它保证了最小二乘的最小化)。它由下面方程给出:



在这里,我们有两个选择:


方法 6:使用简单矩阵求逆乘法。


方法 7:首先计算数据 x 的广义 Moore-Penrose 伪逆矩阵,然后将结果与 y 进行点积。由于这里第二个步骤涉及到奇异值分解(SVD),所以它在处理非良态数据集的时候虽然速度慢,但是结果不错。(参考:开发者必读:计算机科学中的线性代数)


详细描述参考:http://ift.tt/2bVD93O


方法 8: sklearn.linear_model.LinearRegression( )


这个方法经常被大部分机器学习工程师与数据科学家使用。然而,对于真实世界的问题,它的使用范围可能没那么广,我们可以用交叉验证与正则化算法比如 Lasso 回归和 Ridge 回归来代替它。但是要知道,那些高级函数的本质核心还是从属于这个模型。


详细描述参考:http://ift.tt/1HSxOH0


以上方法的速度与时间复杂度测量


作为一个数据科学家,他的工作经常要求他又快又精确地完成数据建模。如果使用的方法本来就很慢,那么在面对大型数据集的时候便会出现执行的瓶颈问题。


一个判断算法能力可扩展性的好办法,是用不断扩大的数据集来测试数据,然后提取所有试验的执行时间,画出趋势图。


可以在 GitHub 查看这个方法的代码。下方给出了最终的结果。由于模型的简单性,stats.linregress 和简单矩阵求逆乘法的速度最快,甚至达到了 1 千万个数据点。




总结


作为一个数据科学家,你必须要经常进行研究,去发现多种处理相同的分析或建模任务的方法,然后针对不同问题对症下药。


在本文中,我们讨论了 8 种进行简单线性回归的方法。其中大部分方法都可以延伸到更一般的多变量和多项式回归问题上。我们没有列出这些方法的 R² 系数拟合,因为它们都非常接近 1。


对于(有百万人工生成的数据点的)单变量回归,回归系数的估计结果非常不错。


这篇文章首要目标是讨论上述 8 种方法相关的速度/计算复杂度。我们通过在一个合成的规模逐渐增大的数据集(最大到 1 千万个样本)上进行实验,我们测出了每种方法的计算复杂度。令人惊讶的是,简单矩阵求逆乘法的解析解竟然比常用的 scikit-learn 线性模型要快得多。


原文链接:http://ift.tt/2p4lOjZ


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

机器知心

IFTTT

蒙特卡洛树搜索是什么?如何将其用于规划星际飞行?

本文解读了蒙特卡洛树搜索算法背后的概念,并用一个案例说明了欧洲航天局使用该算法来规划星际飞行的方法。


前段时间,我们见证了游戏人工智能领域历史上最重大的事件——AlphaGo 成为了第一个在围棋上战胜世界冠军的计算机程序,其相关论文参阅:http://ift.tt/2CrXhL8


DeepMind 的开发者将来自机器学习和树搜索的不同技术结合到一起而实现了这一结果。其中之一就是蒙特卡洛树搜索(MCTS/Monte Carlo Tree Search)算法。这个算法很容易理解,而且也在游戏人工智能领域外有很多应用。下面我将解释 MCTS 算法背后的概念,并且还将简要介绍欧洲航天局是如何使用该算法来规划星际飞行的。


完美信息博弈


蒙特卡洛树搜索是在执行所谓的完美信息博弈(perfect information game)时所使用的算法。简单来说,完美信息博弈是指每个玩家在任意时间点都具有关于之前发生过的所有事件行动的完美信息的博弈。这样的博弈案例有国际象棋、围棋和井子棋。但并不是说每一步行动都已知就意味着可以计算和推断出每一个可能的结果。比如,围棋中合法的可能局面的数量就超过了 10^170。


每种完美信息博弈都可以通过以下方式表示成树形式的数据结构。首先,你有一个代表博弈的起始状态的根(root)。对于国际象棋而言,即是摆在棋盘上合适位置的 16 个白方棋子和 16 个黑方棋子。对于井子棋而言则是简单的 3x3 空方格。第一个玩家有一定数量 n1 的可能选择。在井子棋中即是在 9 个可能的位置画一个圈。每一种走法都会改变博弈的状态。这些所得到的状态是根节点的子节点。然后,对于 n1 个子节点中的每一个,第二个玩家有 n2 种可能的走法可以考虑,其中每一种走法又会产生另一个博弈状态——得到一个子节点。注意 n1 个节点中每一个节点所对应的子节点数量 n2 可能各不相同。比如在国际象棋中你可能会采取一种走法迫使对方移动他的国王;但你也可能选择另一种走法,让你的对手有很多选择余地。


一局博弈的结果就是从根节点到其中一个叶节点的路径。每一个叶节点都包含了一个确定的信息,说明了谁胜谁负。


根据树进行决策


在完美信息博弈中进行决策时,我们面临着两个主要问题。首先也是最主要的一个是树的规模。


对于井子棋这种可能性非常有限的博弈来说,这不是什么问题。我们在开始时最多只有 9 个子节点,而且随着游戏进行这个数字还会越来越小。但对于国际象棋或围棋而言,情况却完全不同。它们所对应的树非常庞大以至于我们没法搜索整个树。解决这一问题的一个方法是在树上进行随机游走一段时间以及获取原来决策树的一个子树。


但是,这又会带来另一个问题。如果我们每次选择时都沿着树随机游走,我们就忽视了我们的选择的效果,也没法从之前的游戏中学习。下过国际象棋的人都知道在棋盘上随机乱下是坚持不了太长时间的。也许新手可以通过这种方法来了解各个棋子的走法。但一局又一局的游戏之后,新手也能越来越好地区分好的下法和糟糕的下法。


所以我们有什么方法可以利用之前构建的决策树中所包含的事实来推理下一步走法呢?方法当然是有的。


多臂赌博机(MAB)问题


想象一下,如果你在一家赌场里,想玩一下老虎机。你可以随机选择一台然后开始玩。那天晚上晚些时候,另一位坐在你旁边的赌博者在 10 分钟内赢得钱比你在过去几个小时内赢的还多。当然,你不应该和别人比,这都是运气问题。但是,你当然也想知道下次你能不能赚多一点。那么你应该选择哪一台老虎机才能赚最多呢?也许你一次应该玩多台老虎机?


你面临的问题是多臂赌博机问题(Multi-Armed Bandit Problem)。这个问题在第二次世界大战期间就已经为人所知了,但我们今天最常了解的版本是由 Herbert Robbins 在 1952 年制定的。设有 N 台老虎机,每一台都有不同的预期回报值(你从给定机器所得到的预期净收入)。但你不知道任何机器的预期回报值。你可以在玩的过程中随时更换机器,也可以在任何机器上玩任意次数。那么最优的策略是什么?


在这样的场景中,「最优」意味着什么?显然你的最佳选择是只在回报值最高的机器上玩。最优策略是指能让你得到的结果尽可能接近在回报值最高的机器上玩所得到的结果的策略。


研究(http://ift.tt/2C7FVQ0



所以这就是你可以希望得到的最佳。幸运的是,事实也证明你可以达到这一边界(重申一次,是平均的)。实现这一目标的一种方法如下。


对于每一台机器 i,我们都跟踪记录两个数据:我们尝试过这台机器的次数(ni)以及平均回报值(xi)。我们也要跟踪我们玩过的总次数(n)。然后对于每个 i,我们都计算 xi 周围的置信区间:



我们总是选择在具有最高 xi 上界的机器上玩(即在上式中选择 + 号)。


这是多臂赌博机问题的解决方案之一。现在注意,我们也可以将其用于我们的完美信息博弈。只需要将每一种可能的下一步骤(子节点)看作是一台老虎机就行了。每次我们选择下一步骤后,我们最后都会或胜或负或平局。这是我们得到的结果。简单起见,我假设我们的目标是获胜,那么设我们获胜时结果为 1,其它情况的结果为 0。


真实应用案例


MAB 算法在真实世界中有很多实际的应用实现,比如价格引擎优化或寻找最优的网络广告。我们这里就看看第一种案例,看看我们可以如何使用 R 语言实现它。假设你在网上销售你的产品并且想引入一种新品,但你却不知道价格该定多少才合适。你根据专业知识和经验想出了 4 种可选的价格方案:99 美元、100 美元、115 美元和 120 美元。现在你想测试一下这些价格的表现,然后选出其中对你最有利的。在第一天的实验中,当你定价为 99 美元时,有 4000 人访问了你网店,其中有 368 人购买了该产品。其它价位的测试结果如下:


  • 定价 100 美元:4060 次访问,355 次购买
  • 定价 115 美元:4011 次访问,373 次购买
  • 定价 120 美元:4007 次访问,230 次购买


现在让我们看看如何用 R 来计算哪个价位在第一天实验中的表现最好。


  1. library(bandit)

  2. set.seed(123)

  3. visits_day1 <- c(4000, 4060, 4011, 4007)

  4. purchase_day1 <- c(368, 355, 373, 230)

  5. prices <- c(99, 100, 115, 120)

  6. post_distribution = sim_post(purchase_day1, visits_day1, ndraws = 10000)

  7. probability_winning <- prob_winner(post_distribution)

  8. names(probability_winning) <- prices

  9. probability_winning

  10. ##     99    100    115    120

  11. ## 0.3960 0.0936 0.5104 0.0000


我们计算了贝叶斯概率(Bayesian probability)来了解哪个价位的表现最好,可以看到 115 美元的价格有最高的概率(0.5)。而 120 美元对顾客来说价格似乎太高了。


我们还要继续实验几天。


第二天的结果:


  1. visits_day2 <- c(8030, 8060, 8027, 8037)

  2. purchase_day2 <- c(769, 735, 786, 420)

  3. post_distribution = sim_post(purchase_day2, visits_day2, ndraws = 1000000)

  4. probability_winning <- prob_winner(post_distribution)

  5. names(probability_winning) <- prices

  6. probability_winning

  7. ##       99      100      115      120

  8. ## 0.308623 0.034632 0.656745 0.000000


第二天依然是 115 美元价位的表现最好,99 美元和 100 美元价位的表现接近。


我们还可以使用 bandit 软件包执行显著性分析,使用 prop.test 进行整体比例比较是非常方便的。


  1. significance_analysis(purchase_day2, visits_day2)

  2. ##   successes totals estimated_proportion        lower      upper

  3. ## 1       769   8030           0.09576588 -0.004545319 0.01369494

  4. ## 2       735   8060           0.09119107  0.030860453 0.04700507

  5. ## 3       786   8027           0.09791952 -0.007119595 0.01142688

  6. ## 4       420   8037           0.05225831           NA         NA

  7. ##   significance rank best       p_best

  8. ## 1 3.322143e-01    2    1 3.086709e-01

  9. ## 2 1.437347e-21    3    1 2.340515e-06

  10. ## 3 6.637812e-01    1    1 6.564434e-01

  11. ## 4           NA    4    0 1.548068e-39


可以看到 120 美元的表现仍然是最差的,所以我们丢弃这个配置,继续下一天的实验。因为其 p_best 值非常小(可忽略),所以这种做法是最好的。


第三天的结果:


  1. visits_day3 <- c(15684, 15690, 15672, 8037)

  2. purchase_day3 <- c(1433, 1440, 1495, 420)

  3. post_distribution = sim_post(purchase_day3, visits_day3, ndraws = 1000000)

  4. probability_winning <- prob_winner(post_distribution)

  5. names(probability_winning) <- prices

  6. probability_winning

  7. ## 99 100 115 120

  8. ## 0.087200 0.115522 0.797278 0.000000

  9. value_remaining = value_remaining(purchase_day3, visits_day3)

  10. potential_value = quantile(value_remaining, 0.95)

  11. potential_value

  12. ##        95%

  13. ## 0.02670002


第三天的结果能让我们总结得出:115 美元的价位设置具有最高的转化率和收入。我们仍然不确定最佳价格 115 美元的转化概率,但不管是多少,其它某个价格还有 2.67% 的概率超过它(剩余价值的 95% 分数位)。


下面的直方图给出了剩余价值分布上的情况。提升量的分布说明随着实验的继续,另一个价格有可能会超过当前的最优价格。样本越多,转化率的可信度就越高。随着时间的推移,其它价格击败 115 美元的机会会越来越低。



如果你对这个案例有兴趣,请参阅我们另一篇有关动态定价的文章:http://ift.tt/2Bldiie


蒙特卡洛树搜索


现在我们可以学习蒙特卡洛树搜索的工作方式了。


只要我们有足够多的信息可以将子节点看作是老虎机,我们就可以像解决多臂赌博机问题一样选择下一个节点(步骤)。当我们有一些关于每个子节点的结果的信息时就能做到这一点。



我们会在某个时候到达某个我们无法再继续以这种方式继续的节点,因为此时至少有一个节点没有可用的统计数据。是时候探索这个树来获取新信息了。这可以完全随机地完成,也可以在选择子节点时应用一些启发式方法(实际上对于具有大量分支的博弈(比如围棋)来说,如果我们想得到好结果,这可能是必不可少的)。



最终,我们会到达一个叶节点,然后检查我们是否获胜。



现在我们可以更新我们到达叶节点过程中所访问过的节点。如果玩家在对应节点的行动带来了胜利,那么我们就增加一个获胜数。否则我们就保持原样。不管我们是否获胜,我们总是增加经历该节点的次数(在对应的图中,我们可以根据胜负的次数自动推断它)。



就是这样!我们重复这个过程直到满足某个条件:超时或我们之前提到过的置信区间稳定(收敛)。然后我们根据在搜索过程中收集到的信息做出最后的决策。我们可以选择有最高结果上界的节点(正如我们在多臂赌博机问题的每次迭代中做的那样)。或者你也可以选择有最高平均结果的节点。


做出决策之后,就选择了行动。现在轮到我们的对手行动了。当他们结束之后,我们就到达了一个新节点,在这个树中更深的某个位置;然后我们继续上面的操作。


不只是游戏


你可能也注意到了,蒙特卡洛树搜索可以被看作是在完美信息博弈场景中进行决策的一种通用技术。所以它的应用领域并不只限于游戏领域。我听说过的最惊人的用例是用来规划星际飞行。我这里会简单介绍一下,你也可以在这里查看:http://ift.tt/2i3QxHs


你可以将星际飞行看作是访问多个行星的旅程,比如从地球经由火星飞往木星。


实现这一目标的一种方法是利用这些行星的引力场(就像电影《火星救援》中那样),这样做可以节省燃料。问题在于到达和离开每个行星表面或轨道的最佳时机是怎样的(对于起点和终点的两个行星,仅有到达和离开)。


你可以将这个问题看作是一个决策树。如果你将时间分成区间,在每个行星处你都要进行一次决策:我应该在哪个时间段到达,又该在哪个时间段离开。每个选择都会影响后面的选择。首先,你不能在到达之前离开。其次,你之前的选择决定了你当前剩余的燃料以及你在宇宙中所处的位置。


这些连续选择集合起来就决定了你最终所到达的位置。如果你访问了所有的检查点,那你就赢了。否则你就输了。这就像是一个完美信息博弈问题。但你没有对手,你的行动是确定离开/到达的时间段。这可以使用上述蒙特卡洛树搜索方法解决。实际上和其它方法相比,蒙特卡洛树搜索方法的表现其实相当好,参阅:http://ift.tt/2C43XvB


原文链接:http://ift.tt/2DuMEVr


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

机器知心

IFTTT

Facebook 开源语音识别工具包wav2letter(附实现教程)

近日,Facebook AI 研究院开源了端到端语音识别系统 wav2letter,本文是该架构的论文实现,读者可据此做语音转录。


GitHub 地址:http://ift.tt/2ljy2AL


wav2letter


wav2letter 是 Facebook AI 研究院今天开源的简单高效的端到端自动语音识别(ASR)系统。该实现的原作者包括 Ronan Collobert、Christian Puhrsch、Gabriel Synnaeve、Neil Zeghidour 和 Vitaliy Liptchinsky。


wav2letter 实现的是论文「Wav2Letter: an End-to-End ConvNet-based Speech Recognition System」以及「Letter-Based Speech Recognition with Gated ConvNets」中提出的架构(如果你使用了这个模型或预训练模型,请引用以上两篇论文之一)。


如果你想要立刻进行语音转录,我们提供了在 Librispeech 数据集上预训练的模型。


预训练模型:http://ift.tt/2EnyMN8


Librispeech 数据集:http://ift.tt/2AliW6p


安装要求


  • MacOS 或 Linux 操作系统
  • Torch,我们在下文介绍了安装教程
  • 在 CPU 上训练:Intel MKL
  • 在 GPU 上训练:NVIDIA CUDA Toolkit (cuDNN v5.1 for CUDA 8.0)
  • 读取录音文件:Libsndfile(必须在任何标准发行版中可用)
  • 标准语音特征:FFTW(必须在任何标准发行版中可用)


安装


MKL


如果你打算在 CPU 上训练,我们强烈推荐安装 Intel MKL。


通过以下代码更新你的 .bashrc 文件


  1. # We assume Torch will be installed in $HOME/usr.# Change according to your needs.export PATH=$HOME/usr/bin:$PATH# This is to detect MKL during compilation# but also to make sure it is found at runtime.

  2. INTEL_DIR=/opt/intel/lib/intel64

  3. MKL_DIR=/opt/intel/mkl/lib/intel64

  4. MKL_INC_DIR=/opt/intel/mkl/include

  5. if [ ! -d "$INTEL_DIR" ]; thenecho "$ warning: INTEL_DIR out of date"fiif [ ! -d "$MKL_DIR" ]; thenecho "$ warning: MKL_DIR out of date"fiif [ ! -d "$MKL_INC_DIR" ]; thenecho "$ warning: MKL_INC_DIR out of date"fi# Make sure MKL can be found by Torch.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$INTEL_DIR:$MKL_DIRexport CMAKE_LIBRARY_PATH=$LD_LIBRARY_PATHexport CMAKE_INCLUDE_PATH=$CMAKE_INCLUDE_PATH:$MKL_INC_DIR


LuaJIT + LuaRocks


以下代码在本地的$HOME/usr 安装了 LuaJIT 和 LuaRocks。如果你需要全系统的安装,请删除-DCMAKE_INSTALL_PREFIX=$HOME/usr 选项。


  1. git clone http://ift.tt/2Cq0BWZ luajit-rocks

  2. mkdir build; cd build

  3. cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/usr -DWITH_LUAJIT21=OFF

  4. make -j 4

  5. make installcd ../..


在下一部分,我们假定 LuaJIT 和 LuaRocks 被安装在了路径$PATH。如果不是,并假定你将它们安装在了本地的$HOME/usr,你需要替换成运行~/usr/bin/luarocks 和 ~/usr/bin/luajit。


KenLM 语言模型工具包


运行 wav2letter 解码器需要 KenLM 工具包,运行 KenLM 需要安装 Boost 库。


  1. # make sure boost is installed (with system/thread/test modules)# actual command might vary depending on your system

  2. sudo apt-get install libboost-dev libboost-system-dev libboost-thread-dev libboost-test-dev


成功安装了 Boost 之后,就可以安装 KenLM:


  1. wget http://ift.tt/2q4qNld

  2. tar xfvz kenlm.tar.gzcd kenlm

  3. mkdir build && cd build

  4. cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/usr -DCMAKE_POSITION_INDEPENDENT_CODE=ON

  5. make -j 4

  6. make install

  7. cp -a lib/* ~/usr/lib # libs are not installed by default :(cd ../..


OpenMPI 和 TorchMPI


如果想使用多 CPU 或多 GPU 训练(或多机器训练),你需要安装 OpenMPI 和 TorchMPI。


免责声明:我们强烈推荐你自己重编译 OpenMPI。OpenMPI 二进制文件的标准发行版的编译标签存在很大的方差。特定的标签对于成功地编译和运行 TorchMPI 很关键。


首先安装OpenMPI:


  1. wget http://ift.tt/2El0qdD

  2. tar xfj openmpi-2.1.2.tar.bz2cd openmpi-2.1.2; mkdir build; cd build

  3. ./configure --prefix=$HOME/usr --enable-mpi-cxx --enable-shared --with-slurm --enable-mpi-thread-multiple --enable-mpi-ext=affinity,cuda --with-cuda=/public/apps/cuda/9.0

  4. make -j 20 all

  5. make install


注意:这里也可以使用 openmpi-3.0.0.tar.bz2,但需要将—enable-mpi-thread-multiple 删除。

现在可以安装 TorchMPI 了:


  1. MPI_CXX_COMPILER=$HOME/usr/bin/mpicxx ~/usr/bin/luarocks install torchmpi


安装 Torch 和其它的 Torch 包


  1. luarocks install torch

  2. luarocks install cudnn # for GPU support

  3. luarocks install cunn # for GPU support


安装 wav2letter 包


  1. git clone http://ift.tt/2q4KER0

  2. cd wav2letter

  3. cd gtn && luarocks make rocks/gtn-scm-1.rockspec && cd ..

  4. cd speech && luarocks make rocks/speech-scm-1.rockspec && cd ..

  5. cd torchnet-optim && luarocks make rocks/torchnet-optim-scm-1.rockspec && cd ..

  6. cd wav2letter && luarocks make rocks/wav2letter-scm-1.rockspec && cd ..

  7. # Assuming here you got KenLM in $HOME/kenlm

  8. # And only if you plan to use the decoder:

  9. cd beamer && KENLM_INC=$HOME/kenlm luarocks make rocks/beamer-scm-1.rockspec && cd ..


训练 wav2letter 模型


数据预处理


数据文件夹包含多个用于预处理多种数据集的脚本。目前我们仅提供 LibriSpeech 和 TIMIT。


以下是预处理 LibriSpeech ASR 语料库的例子:


  1. wget http://ift.tt/2EncRWv

  2. tar xfvz dev-clean.tar.gz# repeat for train-clean-100, train-clean-360, train-other-500, dev-other, test-clean, test-other

  3. luajit ~/wav2letter/data/librispeech/create.lua ~/LibriSpeech ~/librispeech-proc

  4. luajit ~/wav2letter/data/utils/create-sz.lua librispeech-proc/train-clean-100 librispeech-proc/train-clean-360 librispeech-proc/train-other-500 librispeech-proc/dev-clean librispeech-proc/dev-other librispeech-proc/test-clean librispeech-proc/test-other


训练


  1. mkdir experiments

  2. luajit ~/wav2letter/train.lua --train -rundir ~/experiments -runname hello_librispeech -arch ~/wav2letter/arch/librispeech-glu-highdropout -lr 0.1 -lrcrit 0.0005 -gpu 1 -linseg 1 -linlr 0 -linlrcrit 0.005 -onorm target -nthread 6 -dictdir ~/librispeech-proc  -datadir ~/librispeech-proc -train train-clean-100+train-clean-360+train-other-500 -valid dev-clean+dev-other -test test-clean+test-other -gpu 1 -sqnorm -mfsc -melfloor 1 -surround "|" -replabel 2 -progress -wnorm -normclamp 0.2 -momentum 0.9 -weightdecay 1e-05


在多 GPU 上训练


使用 OpenMPI 进行多 GPU 训练:


  1. mpirun -n 2 --bind-to none  ~/TorchMPI/scripts/wrap.sh luajit ~/wav2letter/train.lua --train -mpi -gpu 1 ...


这里,我们假定 mpirun 位于$PATH。


运行解码器(推理)


运行解码器之前,需要做些预处理步骤。


首先,创造一个字母词典,里面包含 wav2letter 中使用到的特殊重复字母


  1. cat ~/librispeech-proc/letters.lst >> ~/librispeech-proc/letters-rep.lst && echo "1" >> ~/librispeech-proc/letters-rep.lst && echo "2" >> ~/librispeech-proc/letters-rep.lst


然后用一个语言模型,做预处理。在这里,我们使用的是基于 LibriSpeech 的预训练语言模型,你们也可以使用 KenLM 训练自己的语言模型。然后,把单词预处理转化为小写字母,在 dict.lst 特定词典中生成字母录音文本(带有重复字母)。该脚本可能会提醒你哪个单词转录错误,因为重复字母数量不对。在我们的案例中不存在这种情况,因为这种词非常少。


  1. wget http://ift.tt/2q4KKYS luajit~/wav2letter/data/utils/convert-arpa.lua ~/3-gram.pruned.3e-7.arpa.gz ~/3-gram.pruned.3e-7.arpa ~/dict.lst -preprocess ~/wav2letter/data/librispeech/preprocess.lua -r 2 -letters letters-rep.lst


注意:也可以使用 4-gram 预训练语言模型 4-gram.arpa.gz 作为替代,预处理可能花费的时间比较长。

可选项:用 KenLM 将其转化为二进制格式,后续载入语言模型,可加速训练时间(我们在这里假定 KenLM 位于你的$PATH)。


  1. build_binary 3-gram.pruned.3e-7.arpa 3-gram.pruned.3e-7.bin


我们现在可以生成特定训练模型的 emissions,在数据集上运行 test.lua。该脚本展示了字母错误率(LER)与词错率(WER),后者是在声学模型没有后处理的情况下计算的。


  1. luajit ~/wav2letter/test.lua ~/experiments/hello_librispeech/001_model_dev-clean.bin -progress -show -test dev-clean -save


一旦 emissions 存储好,可运行解码器计算通过用特定语言模型约束解码获得的词错率:


  1. luajit ~/wav2letter/decode.lua ~/experiments/hello_librispeech dev-clean -show -letters ~/librispeech-proc/letters-rep.lst  -words ~/dict.lst -lm ~/3-gram.pruned.3e-7.arpa -lmweight 3.1639 -beamsize 25000 -beamscore 40 -nthread 10 -smearing max -show


预训练模型


我们提供了基于 LibriSpeech 的完整预训练模型:


  1. wget http://ift.tt/2EmHmM9


了使用该模型做语音转录,我们需要遵循该 github 项目中 README 的 requirements、installation 和 decoding 部分。


注意,该模型是 Facebook 基础设施上的预训练模型,所以你需要运行 test.lua 使用它,有略微不同的参数:


  1. luajit ~/wav2letter/test.lua ~/librispeech-glu-highdropout.bin -progress -show -test dev-clean -save -datadir ~/librispeech-proc/ -dictdir ~/librispeech-proc/ -gfsai


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

机器知心

IFTTT

清华大学提出SA-VAE框架,通过单样本/少样本学习生成任意风格的汉字

近日,清华大学提出了一种风格感知变分自编码器(SA-VAE),通过引入先验知识,结合少量的样本学习,可以有效地将汉字分解成内容部分和风格部分,使我们能快速而自由地生成期望风格的汉字。


论文:Learning to Write Stylized Chinese Characters by Reading a Handful of Examples



论文地址:http://ift.tt/2C7FPI8


摘要:因其广泛的适用性,自动书写中文字体是一个很具吸引力但又不乏挑战的任务。在这篇论文中,为了灵活地生成汉字,们提出了一个叫做风格感知变分自编码器(Style-Aware Auto-Encoder,SA-VAE)的框架。具体而言,我们建议通过将一个汉字的隐藏特征分解成内容相关和风格相关的成分来捕捉汉字的不同特征。考虑到复杂的形状和结构,我们将结构信息作为先验知识纳入我们的框架来指导结果的生成。通过推理一个字体未知的汉字的风格组成,我们的架构展示出了强大的单样本/少样本(one-shot/low-shot)泛化能力。据我们所知,这是首次尝试仅仅通过观察一个或者少数样本生成新字体汉字的工作。通过融合不同内容和风格的特征向量来生成不同风格的汉字,大量实验证明了这个架构的有效性,这在实际应用中是非常重要的。


汉字生成因巨大的词汇量和复杂结构而特别具有挑战性。与图像生成任务(例如人脸 [35]、卧室 [29])不一样,汉字生成中即使是一个很小的偏差也能导致完全的混乱和错误。为了解决这个问题,我们将字体的知识集成在了框架中,而且考虑到汉字的结构和部首信息,我们提出了哈希编码方法来指导生成。通过这种方式,我们的模型能够容易地被扩展到大词汇量中。同时,与之前基于笔画的方法不同的是,我们的模型在处理手写字体的时候也表现良好。


为了解决新风格推理的挑战,也就是说,生成一种在训练阶段没有见过的风格,我们在字体库中收集了很多字体风格,包括打印体和手写体。依靠模型的强大生成能力,我们可以做出合理的推断,并且允许在不用重新训练的情况下就能生成新字体,而传统的模型都需要重新训练。


大量实验证明,我们的方法可以通过仅读取少量样本就生成中文字体,包括打印体和手写体。据我们所知,据我们所知,这是首次尝试仅仅通过单样本/少样本设置来生成新字体汉字(包括打印体和手写体)的工作。总结一下,我们的主要贡献在以下三个方面:


  • 我们提出了一个新型的交叉逐对优化的方法用于风格特征提取,它也是以弱监督的形式解决解耦合问题的一个通用技术。
  • 我们将汉字的域知识以先验知识的形式引入模型中,并提出了一种信息编码方法来指导汉字生成。
  • 我们提出的模型(SA-VAE)可以实现准确的风格推理,并以单样本/少样本的方式生成中文字体。


图 1:基于我们的方法的汉字生成过程描述。给定少量特定字体的样本(例如签名),我们推理不同字体的隐藏向量。然后,我们通过识别它们的内容在少量样本的基础上生成中文字体(「生存还是毁灭,这是个问题」),可以看到,用来训练的样本中,每个风格只有四个汉字(「莎士比亚」)。


图 2:我们提出的 SA-VAE 框架主要包含三个子网络,包括内容识别网络 C、风格推理网络 S,以及汉字生成网络 G。S 和 C 分别提取风格特征和内容特征,G 结合这两个特征生成汉字。另外,我们引入了汉字的域知识 K 以得到更多的内容表征信息。训练过程是以交叉逐对的方式进行的。


如图 2 所示,我们的模型,主要包含三个子网络,包括内容识别网络 C、风格推理网络 S,以及汉字生成网络 G。整个过程可以分为两个阶段——推理阶段和生成阶段。在推理阶段,首先,我们分别基于内容识别网络和风格推理网络将隐藏特征解耦成与内容和风格相关的成分。为了得到更多信息的内容编码,字体结构和部首的知识进一步被集成在内容向量中。在生成阶段,我们将内容向量和风格向量作为一个反卷积网络的输入,所以字体可以通过之前推理阶段得到的风格特征进行重构。为了可靠的解耦,训练过程是以交叉逐对的方式进行的,这意味着生成的汉字提取了不同的源汉字中的风格特征和内容编码。


图 3:编码方法描述,包含结构信息和部首信息。


图 4:汉字的全部 12 种结构和对应的例子。


图 5:汉字中经常使用的部首和对应的例子。


图 6:Vanilla 变分自编码器和我们的交叉逐对训练的对比:实线和虚线分别代表风格提供者和内容提供者。


训练算法


图 7:只需少数汉字就能通过我们的风格推理网络 S 提供新的风格,结合我们数据库中的内容编码作为生成网络的输入,我们可以得到新风格的任何汉字。


PaperWeekly链接:


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

机器知心

IFTTT

入职仅一年,套现5000多万后背刺马斯克搬走 Grok 核心代码库!-InfoQ 每周精要894期

「每周精要」 NO. 894 2025/09/06 头条 HEADLINE 入职仅一年,套现 5000 多万搬走 Grok 核心代码库! 业内专家:拥有菜谱不等于能做出同样的菜 精选 SELECTED AI 公司创始人现跑路迪拜! 80% 收入烧广告、假账骗投资人,微...