2017年12月15日,星期五

NIPS对话AI研讨会

我只参加了NIPS 对话人工智能研讨会,因此我的想法仅限于此。我真的很喜欢研讨会的副标题:“今天的实践和明天的潜力”。因为我在一个产品团队中尝试构建实际上有效的聊天机器人,所以它给我的印象恰到好处。

一些演讲与 Alexa奖 。阅读这些论文时,请记住,参赛者会受到极端的样本复杂性约束。半决赛入围者大约进行了500次政策对话,而决赛入围者则不到10倍。这是因为1)Alexa聊天功能不是设备的主要用途,因此并非所有最终用户都参与其中; 2)他们必须将聊天内容分发给所有参赛者。

样本复杂度约束的结果是“对方差的偏见”, as 我之前讨论过。在Alexa奖中,这意味着获胜者拥有“在大多数人为指定的底物上学到了混合物。”换句话说,(稀少的)政策数据仅限于调整混合权重。 (MILA团队的基础知识在论坛数据上未经监督地进行了培训,但是看起来其他基础知识可以提供最大的好处。)对话中普遍存在示例复杂性约束,但是比赛的条件比我要极端得多。在实践中遇到,因此,如果您发现自己拥有更多的策略数据,请考虑更积极地使用。

说到样本复杂性约束,我们发现了关于MT任务的预训练表示 VE 在实践中对多个任务非常有效。我们现在在玩 ELMo风格 使用语言建模作为预训练任务进行预训练(非常有前途:不需要并行语料库!)。

我在研讨会上注意到的另一个与样本复杂性相关的主题是功能角色动态的使用。粗略地说,这是在与主题无关地对对话框的结构进行建模。一旦主题被抽象,学习什么是结构合理的对话的样本复杂性就显得很低。 狄德瑞克森(Didericksen)等。等 将纯结构化的L1模型与简单的局部敏感L2(tf-idf)结合起来,构建了基于检索的对话模拟器。类似地,他们提交了Alexa奖, 塞尔班(Serban)等。等 从观察数据中学到了一个对话模拟器,该对话模拟器仅利用功能角色和情感信息,然后应用了Q学习:就某些指标而言,这比政策外强化更为有效。

总体而言,尽管当前对话系统的性能不佳,但研讨会给了我足够的乐观感,可以继续进行操作。

2017年8月10日星期四

ICML 2017思想

ICML 2017刚刚结束。尽管悉尼对欧洲和北美的人来说偏远,但会议中心
是一个很棒的聚会场所(供应优质咖啡!),这座城市很有趣。一切进展顺利,
组织者做得很好。

您可以从我的列表中获取我喜欢的论文列表 Twitter提要 ,所以我想讨论一些广泛的主题
我感觉到了。

  • 多任务正则化可减轻RL中的样本复杂性。 在视频游戏和对话中,添加额外的(辅助)任务以加速学习都是很有用的。
  • 利用知识和记忆。 我们当前的模型是功能强大的函数逼近器,但是特别是在NLP中,我们需要超越“当前示例”才能展示其能力。
  • 梯度下降作为推断。 不管是 用GAN修补 要么 使用RNN最大化BLUE得分,梯度下降法是一种不合理的推理算法。
  • 仔细的初始化很重要。 我想传统的优化人员会说“当然”,但是我们开始意识到良好的初始化对于深度学习的重要性。特别是,从特征值接近1开始接近线性。(Balduzzi等。等 , 普尔等等)
  • 卷积与NLP的递归模型一样好,并且比后者更快。 Facebook上的出色工作 因果卷积 对于seq2seq。这符合我的个人经验:出于计算性能的原因,我们在生产中使用卷积NLP模型。
  • 神经网络过于参数化。 它们可以变得更稀疏而不会失去准确性(莫尔恰诺夫(Molchanov)等。等, 洛巴切娃(Lobacheva)等。等 )。
  • 玛卢巴举行了最好的派对。
最后,我一直在想 论文都是“old”. 虽然我第一次看很多论文,但是感觉结果都过时了,因为我已经沉迷于“fresh results” on arxiv.

2017年7月26日星期三

理性的繁荣

最近,Yoav Goldberg有一个 著名博客大佬。我感谢他的关注,因为这种情况在游戏理论上是危险的:任何个人研究人员都可以尽早地积极定位他们的工作而受益,但是随着言辞和现实的分歧越来越大,整个领域冒着另一个AI冬季的危险。 Yoav的解决方案是整合公众羞辱感,以使本地激励措施与总体成果保持一致(参见奖励塑造)。

I 感觉 there is a better way, as exemplified by a recent paper by 贾良。在本文中,作者使用干扰词破坏了SQUAD数据集,这些干扰词对人类的绩效没有影响,但从根本上降低了排行榜上系统的性能。这使我想起了 Paperno等等 在段落完成任务上,人类以高超的技术执行,而对于所有现有技术,NLP方法都惨败。这两项工作清楚地表明,我们当前的自动系统仅具有与人的表面相似(尽管具有经济价值)。

这种对我们的能力进行诚实自我评估的方法不仅更具学术性,而且更具生产力,因为它提供了需要考虑的具体任务。至少,这将导致改进的技术工件。进一步迭代这种目标设定和目标解决过程 很多很多 时代最终可能会导致一些值得称呼的人工智能。

(您可能会说Yoav Goldberg策略更具娱乐性,但是Yoav Goldberg方式的高点是“快速打击”,而艰巨的任务值得考虑的话具有很多“重播价值”。)

2017年7月17日星期一

分层架构,反事实学习和示例复杂性

我现在在一个产品团队中,我再次发现自己在分层架构中工作:“L1”模型选择一些候选者,这些候选者将传递给“L2”重新排名和过滤传递给“L3”等等。这样做的动机通常是计算性的,例如,您可以为 DSSM 模型很容易,但索引一个 比达夫 模式更具挑战性。但是,我认为也有潜在的样本复杂性好处。

我担心反事实设置中的样本复杂性,因为我认为这可能是AI冬季的下一个来源。强化学习需要汇聚大量数据,这就是为什么媒体的所有惊人结果都出现在模拟环境,自演场景,在完全监督的环境中对子组件进行离散优化或存在其他情况的原因本质上是无限的数据。在现实生活中,数据是有限的。

所以当我读 大型离散动作空间中的深度强化学习 由Dulac-Arnold等撰写。等,我注意到主要动机是计算性的,但认为另一个(更重要的?)好处可能是统计性的。分层架构无法克服最坏情况下的样本复杂性界限,但我认为在实践中,它们是反事实设置的好策略。

分层架构允许使用半监督方法,因为L1模型通常可以使用无监督技术(例如单词嵌入,句子嵌入,带tf-idf的倒置索引)进行初始化。利用该L1模型学习L2模型仅具有基于L1模型产生的候选数量而不是候选总数的样本复杂度。当然,基于候选总数,学习L1仍然具有样本复杂度,但是如果无监督的初始化很好,那么L1学习缓慢就可以了。此外,在实践中,L1假设类别更简单(由于计算原因),这减轻了样本的复杂性。

在NIPS 2017上有一个名为``从粗到细推理''的研讨会,大概是探讨了这些想法,但我没有参加,他们的网站也关闭了。希望会有另一个,我会参加!

2017年3月25日,星期六

为什么现在是进行对话的时间

我正在开发面向任务的对话框产品,从业务角度来看,一切进展都令人惊讶。事实证明,现有技术足以替代部分人与机器之间的商业对话交互,从而节省了大量相关成本,其成本超过了开发自动系统的成本。这是令人困惑的事情:据我所知,盈余是如此之大,以至于十年前用当时的技术做到这一点是可行的。所有新奇的AI东西都有帮助,但仅能提高利润。那么,这些企业为何在10年前没有出现?

我怀疑答案是已经发生了从物理交易和语音介导的交互到数字交易和聊天介导的交互的格式转变。

远离声音的动作非常重要:如果我们不得不尝试使用ASR进行操作,即使在今天,它也可能行不通。幸运的是,今天您与有线电视公司聊天而不是与他们聊天。这种转变是由节省成本引起的:与多次并发语音对话相比,人工代理可以更轻松地处理多个并发聊天会话。但是,这要求大多数客户拥有计算机,智能手机或其他设备,而不是老式电话。

电子商务在实体商店上的持续主导地位也是一个因素(RIP 西尔斯 )。在电子商务中,销售人员越来越多地通过实时聊天界面协助客户进行交易。再次,从更有效的人力资源部署方式开始,自动化成为越来越多地处理工作负载的媒介。

最终的结果是,零售业从业人数下降了,但他们的报酬却上升了。这是因为这些机器将越来越多地处理这些领域的例行事务,仅留下人类特有的极端特质问题的尾巴。处理这些非常规问题将需要更多的技能和经验,因此需要更高的补偿(此外,越来越多的工作将是将非常规问题的躯干构造为机器可以常规处理的内容,即教导机器处理更多;这类似于编程,并且也将要求更高的补偿)。

2017年2月15日星期三

软件工程与机器学习概念

并非软件工程的所有核心概念都可以转化为机器学习领域。这是我注意到的一些差异。

分而治之 软件工程中的一项关键技术是将一个问题分解为更简单的子问题,解决这些子问题,然后将它们组合为原始问题的解决方案。可以说,这是递归应用的整个工作,直到可以使用任何编程语言在一行中表示解决方案为止。规范的教学示例是 河内塔.

不幸的是,在机器学习中我们永远无法完全解决问题。充其量,我们大约可以解决一个问题。这是该技术需要修改的地方:在软件工程中,子问题解决方案是 精确 ,但在机器学习错误中,复合和综合结果可能完全是垃圾。另外,如果组件是“improved”孤立,但聚合系统性能会降低“improvement”部署(例如,由于 模式 现在,下游组件无法预料到错误的发生,即使它们的出现频率较低)。

这是否意味着我们注定要进行整体思考(这听起来似乎无法解决大问题)?不,但这意味着您必须对子问题分解保持防御。可行时,最佳策略是对系统进行端到端培训,即一起(而不是孤立地)优化所有组件(和组合策略)。通常这是不可行的,因此(受贝叶斯思想启发)另一种选择是让每个组件随输出报告某种类型的置信度或方差,以便于下游处理和集成。

实际上,当系统达到特定范围时,需要分解以将工作分配给许多人。正如Leon Bottou在他的著作中优雅地描述的那样,这现在在机器学习中不起作用是一个问题。 ICML 2015邀请演讲.

谈到莱昂讨论$ \ ldots $的另一个概念

正确性 在软件工程中,就给定关于输入的特定假设而言,当算法终止时,某些属性将为真,在某种意义上,可以证明算法是正确的。在(监督的)机器学习中,我们真正拥有的唯一保证是,如果训练集是来自特定分布的iid样本,则来自同一分布的另一个iid样本的性能将接近训练集,而并非远非最佳。

因此,任何以机器学习为生的人都有实验的心态。通常,我被问到选项A还是选项B更好,大多数时候我的答案是“我不知道,让我们同时尝试一下,看看会发生什么。”机器学习领域的人们可能知道的最重要的事情是如何以可预测泛化的方式评估模型。即使那样“feel”事情:识别并防止训练和验证集之间的泄漏(例如,通过分层抽样和时间抽样)是您花了几次力气才能学到的东西;反事实循环的同上。 Kaggle非常适合学习前者,但是后者似乎需要在闭环系统上犯错才能真正欣赏。

实验性“correctness”它比其他软件的保证要弱得多,并且有很多方法可以使事情恶化。例如,根据我的经验,它总是临时的:模型过时,似乎总是在发生。如此,您需要计划不断(因此自动)重新训练模型。

重用 This one is interesting. 重用 is the key 至 leverage in 传统软件 engineering: it's not just more productive 至 reuse other code, but every line of code you write yourself is an opportunity 至 inject defects. Thus, reuse not only allows you 至 move faster but also make less mistakes: in return, you must pay the price of learning how 至 operate a piece of software written by others (when done well, this price has been lowered through good 要么 ganization, documentation, 和 community support).

机器学习的某些方面表现出完全相同的权衡。例如,如果您正在编写自己的深度学习工具包,请认识到您很有趣。乐趣并没有错,可以说教学活动比整天玩视频游戏要好。但是,如果您想完成某件事,则绝对应该尝试重用尽可能多的技术,这意味着您应该使用标准工具箱。一旦学习了如何使用标准工具箱,您将可以更快地行动并减少错误。

机器学习工具包是“traditional software”但是,并且被设计为可以重用。模型重用呢?那也可能很好,但是上面关于分解的警告仍然适用。因此,也许您使用的模型会根据用户个人资料生成特征,作为模型的输入。很好,但是您应该对所依赖的模型进行版本控制,并且不要在未经评估或重新培训的情况下盲目升级。重用另一个模型的内部结构尤其危险,因为大多数机器学习模型无法识别,即具有各种内部对称性,而这些对称性不是由训练过程确定的。例如,将一个嵌入与一棵树耦合,当嵌入的下一个版本是上一个的旋转时,您可以看到性能立即下降。

基本上,模型重用会创建 强大 组件之间的耦合,如果更改一个组件,可能会出现问题。

测验 我发现软件测试在机器学习中的作用是所有问题中最棘手的问题。毫无疑问,测试是必要的,但是使用基于属性的测试之类的挑战在于,机器学习组件捕获的概念很难用属性来表征(否则,您将使用非ml软件技术来编写它。 )。在一定程度上,ml组件应该显示某些属性,您可以测试一下这些属性,但是除非将这些属性合并到学习过程本身中(例如,通过参数绑定或数据扩充),否则您可能会违反该属性不一定表示缺陷。

有一个“extra-test”具有最低可接受质量的数据集是一个好主意:这可能是简单的示例,“any reasonable model”应该正确。还有自洽性:在Yahoo,他们曾经使用带有一组输入-输出对的模型来运送模型,这些输入-输出对是在模型放在一起时计算的,并且如果加载的模型没有重现该对,则模型加载会被取消。 (那是永远不会发生的,对吗?惊喜!也许您正在使用具有不同版本或类似内容的库来使输入具有特色。)

监视已部署模型的度量标准(代理和真实)也有助于发现问题。如果代理指标(即您实际在其上训练模型并估计通用性能的事物)向南移动,则模型的输入正在以某种方式发生变化(例如,非平稳环境,特征提取管道的变化);但是如果代理指标稳定,而真正指标向南移动,则问题可能出在如何利用模型的输出。

Unfortunately what I find is many software systems with machine learning components are tested in a way that would make 传统软件 engineers cringe: we look 在 the output 至 see if it is reasonable. Crazy! As machine learning becomes a more pervasive part of software engineering, this state of affairs must change.

2017年1月27日,星期五

强化学习和语言支持

指定从经验中学习的程序的正确方法是什么?现有的通用编程语言旨在简化任何软件的规范。所以我们可以只使用这些编程语言进行强化学习,对吗?有点。

抽象很重要

用高性能服务进行类比可能会有所帮助。有关高性能投放的早期影响力页面(Dan Kegel的C10K问题)概述了几种I / O策略。我已经尝试了很多。一种策略是事件驱动的编程,其中核心事件循环监视事件的文件描述符,然后分派处理程序。这种样式可产生高性能的服务器,但难以编程且对程序员错误敏感。除了故障隔离问题(如果所有事件都在相同的地址空间中运行)之外,这种风格还很容易受到任何事件处理程序执行时间过长(例如,隐藏的阻塞I / O调用,计算密集型操作等)的影响。 。相反,基于线程的编程允许您假装您是唯一正在运行的处理程序。它的计算效率较低,并且仍然存在故障隔离问题,但推理起来更容易。 (随后,我开始进入Erlang,因为它本质上是试图烘焙带有错误隔离功能的用户空间线程到语言中,这甚至更好。)

我不知道现在高性能服务中的最新技术,我对这个游戏有些不了解。要点是,并非所有编程语言都具有相同的创造力,因为它们给程序员带来了不同的认知负担,并在运行时产生了不同的计算负担。我可以通过两种方式(协作调度与抢先式调度)之一使用现有的语言(当时为C ++),也可以使用旨在减轻折衷的另一种语言(Erlang)。

具有自动信用分配的命令式规范

如前所述,我们现在要指定的程序与过去指定的程序之间的差异是,我们希望我们的程序能够从经验中学习。与高性能服务一样,我们希望平衡程序员的认知负担与运行时施加的计算负担(也可能是运行时施加的统计负担;计算负担对应于诸如时间或空间之类的资源,而统计负担对应于数据资源)。

在当前范围内“AI summer”,一个流行的想法是 自动区分。完整的AD意味着基本上可以使用任何语言构造来定义函数,并且提供了用于计算函数相对于输入的梯度的计算“for free.”配备有正在计算(亚)可微函数的AD的语言可以从经验中学习,逐渐接近损失函数的局部最优值。深度学习工具包通过一些框架(例如, 链条机 )在指定正向计算时积极追求允许任意语言构造的想法。

随着推理变得越来越复杂,使用任意语言构造的能力变得越来越重要。简单的推论(例如分类或排名)很容易推断,但除此之外,它很快成为以下方面的主要缺陷来源:1)指定如何使用机器学习模型的输出来合成完整的系统,以及2)指定如何运行该完整系统获得的数据将用于更新模型。

在结构化预测领域中,该问题显而易见。“结构化预测”当然是一个有点荒谬的名词“非线性系统分析”;在这两种情况下,最初都解决了该问题的一个简单版本(分别是分类和线性系统分析),然后为其他所有问题创建了一个总括术语。尽管如此,Hal Daume对结构化预测有一个很好的定义,它在一个示例上进行了多个预测,并且经历了(在决策中)共同损失。 (他也有一个 ku句版 这个定义。)

由于结构化预测中的推理很复杂,因此对于结构化预测本质上是重新定义了命令性规范和自动信用分配的思想。该技术概述于 Chang等人撰写的Arxiv论文。等,但是Chainer的粉丝会认出这是“define-by-run”用于结构化预测。 (请注意,这里的优化策略不是梯度下降,至少不是在正向计算上,而是策略梯度方法之类的东西,它会通过正向计算做出的预测转化为离散的信用分配问题。)

查看情景RL的一种方法是使用强盗反馈进行结构化预测:类似于监督学习,完全观察到结构化预测,因为可以计算给定特定输入的任何决策序列的损失。在强化学习中,您会获得强盗反馈,即,您仅了解与实际采取的决策顺序相关的损失。虽然这不是查看情节性RL的唯一方法,但它确实有助于与上一段中提到的论文的某些思想联系起来。

一个激励人的例子

这是一个希望可以澄清问题的示例。假设我们要构建一个交互式的问答系统,在该系统中用户提出问题,然后该系统可以有选择地向用户提出(澄清)问题或提供答案。我们可以将其视为一个偶然的RL问题,其中用户陈述是观察值,系统问题是动作,系统答案是更多动作,并且情节在我们提供答案后就结束了。

我想做的是指定类似此伪python的计算:
def interactive_qa_episode():
   q  = get_user_question()
   Qapairs  = []
  sysaction = get_next_system_action(uq,  Qapairs )
  while (sysaction.is_question):
    ua = get_user_answer(sysaction.utterance)
     Qapairs .append((sysaction,ua))
    sysaction = get_next_system_action(uq,  Qapairs )
  deliverAnswer(sysaction.utterance)
很清楚这里发生了什么:我们得到一个用户问题,有条件地提出问题,然后给出答案。在机器学习出现之前,这种系统的实现者会尝试填写上述未指定的功能:特别是, get_next_system_action 手动指定很棘手。我们要做的是改为学习此功能。

使用装饰器来实现这一点将是很好的。首先,要学习,我们需要知道做的更好还是更坏的想法,因此假设给出答案后,可以通过某种方法来确定用户对会话的满意程度(即,ceterus perebus,应随所提问题的数量单调减少) ,以鼓励权宜之计):
@episodicRL
def interactive_qa_episode():
   q  = get_user_question()
   Qapairs  = []
  sysaction = get_next_system_action(uq,  Qapairs )
  while (sysaction.is_question):
    ua = get_user_answer(sysaction.utterance)
     Qapairs .append((sysaction,ua))
    sysaction = get_next_system_action(uq,  Qapairs )
# this next line is the only change  至  the  要么 iginal function
   奖励  = deliverAnswer(sysaction.utterance) 
太容易了!伪代码是如此高效。我们甚至可以想象更新 奖励 multiple times, with the decorator keeping track of the 奖励 deltas for 改善的 credit assignment.

现在开始进行一些魔术性元编程,并将其转换为使用RL算法训练的模型(例如,诸如q-learning之类的值迭代方法或诸如 强盗 )。还是呢?我们仍然没有说要学习哪些功能以及哪些是手工指定的。默认值是手动指定的,因此我们将修饰一个功能。
@learnedFunction
def get_next_system_action(uq,  Qapairs ):
  ...
现在我们陷入一些棘手的问题。我们最终需要根据参数化模型(例如神经网络)来指定此功能;我们将不得不说从诸如 q Qapairs ;我们将不得不说如何将模型的输出映射到实际决策上。为了保持前进,我们假设存在一组固定的系统问题和系统答案。
action_table = [ ... ] # list containing action mapping
@learnedFunction
def get_next_system_action(uq,  Qapairs ):
  not_allowed_action_ids = [ sysa.action_id for (sysa, _) in  Qapairs  ]
  action_id = categorical_choice(uq:  q ,
                                  Qapairs :  Qapairs ,
                                 not_allowed_action_ids: not_allowed_action_ids,
                                 tag: 'nextsystemaction')
  return action_table[action_id]
categorical_choice 是从一组可能性中进行强制选择的表示。对于小型动作空间,可以将其直接实现为每个动作的输出,但是对于大型动作空间,可以通过具有信息检索样式级联管道的动作嵌入来实现。

很好吗?好吧,仍然存在一些问题。
  • 用于选择的最佳模型结构(即策略类)需要程序员指定一些规范,例如卷积文本网络与迭代注意力体系结构。理想情况下,此规范不同于推理规范,因此可以尝试许多建模思想。这就是tag参数的目的,是将其与学习参数的单独说明结合在一起。 (如果未提供,则可以在编译期间生成合理的默认标记。)
  • 如所示 以前的帖子,引导就是一切。所以最初的实现 get_next_system_action 需要提供。也许这可以简化为提供基础模型的初始设置,但是可能不取决于初始化方案。注意,如果初始化是通过模拟或从历史数据中脱离策略学习完成的,则可以通过简化I / O功能的模型来支持这些初始化 get_user_questionget_user_answer。另一个常见的情况是,将未学习的功能作为参考策略,学习的功能应与之竞争。
我不能和Chainer一起做吗? 有点。当然,如果您使用特定的RL算法。例如,q学习可将强化学习减少到回归,因此,如果您对该内联进行编码,您将获得Chainer可以处理的东西。但是,目标是在不泄漏学习算法细节的情况下指定推论,因此我宁愿不对该内联代码进行编码。另一种方法是编译 链条机 ,类似于c ++早期的cfront。

但最终,我希望有一个不同的编译策略。不仅仅是实现学习算法,还有更多的风险:存在所有提到的问题 我以前的帖子 这使我确信,实施应该能够利用强化学习服务。

2017年1月21日,星期六

强化学习即服务

在过去的6个月中,我一直在将强化学习整合到实际产品中,因此,我对可能是常见问题的认识正在逐渐提高。特别是,我现在对强化学习即服务的想法很感兴趣,其中 决策服务 来自MSR-NY的数据就是一个早期的例子(目前仅限于上下文强盗,但结合了关键的系统见解)。

服务,不是算法 监督学习本质上是观察性的:已经收集了一些数据,然后在其上运行算法。 (在线监督学习不一定能以这种方式工作,但是在收集数据后出于计算的原因,大多数使用在线技术。)相反,反事实学习很难做到观察。经济学,政治学和流行病学等各种领域都试图使用观察数据得出反事实结论,主要是因为这是唯一可用的数据(以可承受的成本)。但是,在测试新药时,该标准是进行对照实验,因为通过控制数据收集,可以更有把握地得出更复杂的结论。

类似地,强化学习最好完成“in the loop”,并控制用于学习的数据收集算法。因此,由于必需的状态管理,增强学习算法的纯库实现是不自然的。例如,奖励是在采取行动之后发生的,并且这些奖励最终需要相互关联才能学习。 (我的第一份工作之一是在一家名为Overture的赞助搜索公司中,维护搜索单击联接是十几名工程师的全职工作:请注意,这只是单例会议的立即联接!)

因此,包装强化学习即服务意义更大。这有助于模型更新,服务(探索)分布和数据收集的分布式协调。对于云计算提供商来说,这种情况是自然而然的。但是,实际上需要有一个离线客户端模式(例如,用于移动和IOT应用程序);此外,由于低延迟决策要求,即使在纯数据中心环境中也将利用此功能。 (更一般而言,“tiered learning”与云计算平台中使用的分层存储架构类似的架构。布伦丹·麦克马汉(Brendan McMahan)在 联合学习

引导就是一切 试图解决和解决实际问题真是令人惊讶。我现在很欣赏强化学习已经被超卖了。特别是,强化学习的样本复杂性要求非常高。 (这是花哨的说法,因为它需要收敛大量的数据。)当您在模拟环境中工作时,这不是要担心的问题,因为您拥有无限的训练数据,因此在模拟环境中我们会看到惊人的结果。

当在真实用户的实时流量上进行强化学习时,您的数据量比您想象的要少,因为您总是从测试数据的一部分入手,直到变得更好为止,您才能获得更多(第22章)。因此,实际上我花了很多时间来制定初始服务策略,不幸的是有些特质:使用正确的数据资产进行模仿学习可能很棒,但是启发式策略也很重要。我怀疑在模拟环境中通过not-smartly-initialized-RL进行初始化是另一种可能性(在对话框模拟器中效果不佳,因此我还没有利用这种策略)。

这为RL即服务创建了一些设计问题。
  • 假设有一个初始投放策略,该如何指定?在决策服务中,您传递将采取初始服务策略的操作,这对于上下文强盗来说是合适的,但是对于多步骤时期,这可能很麻烦,因为初始服务策略需要维持状态。对于服务来说,使其更易于管理很有意义。
  • 服务如何帮助我制定最初的服务政策?考虑到我到目前为止的经验,以下是制定初始服务政策的一些可能方法:
    • 任意程序(``启发式'')。有时这是冷启动的最简单方法,或者这可能是当前的``冠军''系统。
    • 模仿学习。假设合适的数据资产可用。
    • 从历史数据中进行非政策学习。如果历史政策经过适当随机化(例如,以前调用RL作为服务的穷举),那么这可能比模仿学习更好。
    • 通过仿真进行增强。在对话中这似乎不可行,但是如果有一个好的模拟器(例如,机器人和游戏引擎?),那可能很棒。此外,这将涉及平台的直接重用,即使生成的数据也是如此。

语言是编程的UI 我认为 学分分配汇编 不仅将解决如何指定初始策略的问题,而且还将为使用RL服务提供最自然的接口。我将在另一篇文章中进行探讨。

2017年1月13日,星期五

通过对抗训练生成文本

今年在GAN研讨会上有一篇非常可爱的论文, 通过对抗训练生成文本 由张,甘和卡林撰写。特别是,它们做出了一些很重要的不寻常选择。 (警告:如果您不熟悉GAN,那么这篇文章就没有多大意义了。)
  1. 他们使用卷积神经网络(CNN)作为判别器,而不是RNN。回想起来,这似乎是个不错的选择,例如张彤已经 粉碎它 使用CNN进行文本分类。 CNN比RNN容易训练,因此最终结果是强大的判别器,并且具有相对容易的优化问题。
  2. 他们在发生器中使用LSTM输出的平滑近似值,但实际上这种技巧到处都是,因此在隔离方面并不是那么出色。
  3. 他们使用纯矩匹配标准进行鞍点优化(基于小批量估算)。 GAN从逐点辨别损失开始,最近的工作通过矩匹配样式惩罚增加了这种损失,但是这里的鞍点优化是纯矩匹配。 (因此从技术上讲,鉴别器不是鉴别器。实际上,它们在文本中可互换地称为鉴别器或编码器,这解释了原因。)
  4. 他们对初始化非常聪明。特别地,鉴别器被预先训练以在两个单词互换位置的情况下区分真实句子和相同句子。 (在初始化期间,使用逐点分类损失训练鉴别器)。这很有趣,因为交换两个单词会保留输入的许多$ n $ -gram统计信息,即许多卷积滤波器将计算出完全相同的值。 (最近我很幸运地使用置换句子作为其他模型的否定词,现在我将尝试交换两个单词。)
  5. 他们更新发电机 更频繁 比区分符要高,这与标准的民间传说相反,后者说您希望区分符的移动速度比生成器快。也许这是因为CNN优化问题比LSTM容易得多。纯粹的矩匹配损耗的使用也可能是相关的。



关于神经网络论文的老抱怨是您无法复制它们。如今,复制神经网络论文通常比其他论文更容易,因为您可以将他们的代码存储在github上并运行实验。但是,我仍然很难确定所做的各种选择的相对重要性。对于上面列举的选择:最终结果对这些选择的敏感性是多少?很难说,但是我已经开始假设灵敏度很高,因为当我在复制后尝试调整结果时,通常会变得很糟糕。 (我尚未尝试复制此特定结果。)

无论如何,本文有一些很酷的想法,希望可以扩展到生成逼真的对话框。