分配稀缺资源:TTRPG版

我的最受欢迎的游戏大会在过去的几周里,我经历了一些成长的痛苦。这是一个桌面角色扮演游戏约定,它提出了一个有趣的资源分配问题:您有大量的参与者N,以及一系列的游戏和事件,每个游戏和事件都可能需要一些参与者,从3人到50人不等。

小红帽(Little Red Riding Hood)在一个单调乏味的学校体育馆里填写选票,结果变成了投票站。小红帽(Little Red Riding Hood)在一个单调乏味的学校体育馆里填写选票,结果变成了投票站。采用诺曼·罗克韦尔(Norman Rockwell)和村上隆(Takashi Murakami)风格的高度精细的电影照明。(OpenJourney v4)
小红帽填写了一张等级选择选票。

到目前为止,大会使用先到先得(FCFS)策略来分配玩家参加游戏。注册在特定的时间开放,每个人都会狂热地在网站上点击刷新,尝试进入一些非常流行的游戏,然后在超级流行的游戏填满后,转向其他有趣的游戏。

FCFS策略有几个大问题:最明显的是,当所有人都在注册打开后的第一分钟出现,点击查找他们最喜欢的游戏时,服务器都有崩溃的趋势,而游戏在最初几毫秒内还没有满。不太明显的是,那些在注册开放的那一刻无法参加的玩家可能会错过他们喜欢的许多游戏。

因此,FCFS给我们带来了技术问题(一个导致计算机崩溃的固定期限)和公平问题。每当有人试图使用FCFS在线解决资源分配问题时,几乎都会出现相同的问题。(值得注意的是,如果不编写机器人程序或支付编写机器人程序的第三方的费用,就不可能在加利福尼亚州获得营地。)

一个更美好的世界是可能的

为了解决这两个问题,我们需要a)为人们提供一种异步表达偏好的方式,以及b)设计分配算法根据人们的喜好分配他们玩游戏。

这里有一个如何做到这一点的建议。

首先,我们允许人们在固定的截止日期之前随时提交他们的排名偏好。这让每个人都有足够的时间阅读可用的游戏,在他们的偏好列表中移动内容,等等。

分配算法:一旦截止日期过去,我们会查看所有排名的偏好,并将玩家与游戏配对。这样做的一种方法是随机对每个人排序,然后浏览列表并为尚未满的顶级游戏注册。然后再次浏览列表,将人员分配到他们的首选项中,这些选项尚未满,或者与他们已经注册的内容相冲突。重复你喜欢的次数。这个分配算法编写起来非常简单,最多只需几秒钟。

在初始分配运行后,可以让事情稳定一段时间,然后在给人们时间调整偏好后再次运行分配。最后,开放FCFS注册,以帮助填补任何剩余的空缺,减少摩擦。

这是公平的,因为每个人都有同样的机会在随机列表中名列前茅,而且每个人在被分配到第二场比赛之前都会得到他们的最佳选择。

这也消除了服务器上的大部分压力:人们在截止日期前随机提交自己的偏好。在截止日期前,你仍然会遇到一些“困难”,但很可能不会像FCFS那样。如果最后期限需要延长,那没问题——最坏的情况是,在分配算法运行之前,人们有更多的时间提交他们的偏好,这根本不是问题。无论何时运行分配算法,其工作原理都是一样的。

我认为这项提议最困难的部分可能是用户体验,它收集人们的排序偏好,并让他们重新排序。我想象每个游戏描述页面都有一个“红心”按钮。然后每个用户都可以进入一个页面,在那里他们可以订购“心爱”的游戏,可能会有游戏标题、日期+时间、游戏主机,也许还有一个小的用户可编辑注释字段(如果我们觉得有趣的话)。

少量进一步分析

该方法将彩票与等级选择投票.

彩票是一种广受欢迎的方法公平分配稀缺资源:让所有感兴趣的人注册,然后随机分配资源。加权彩票被提议用于不需要均匀随机性的情况。人们可以使用权重来让某些首选群体有更高的机会提前获得分配(首次参加?注册游戏大师?),尽管我预计这会带来更多麻烦。

等级选择投票逐步淘汰候选人,使用每个人当前的首选项作为他们在每轮投票中的投票。(谈到选举,我强烈倾向于批准投票由于淘汰顺序中的随机性问题,导致通常的等级选择方案中出现奇怪的结果,从而鼓励了复杂的战略投票策略。然而,我认为这在奥运会会议环境中不是一个问题。)

最后,通过使用种子随机数生成器生成参与者的随机顺序,可以使系统具有确定性、可复制性和可审计性。(如果在运行分配算法之前种子是公开的,则可能需要注意避免与系统进行博弈。)

设置稳定扩散嵌入的动画

稳定扩散是您可以在自己的硬件上运行的最佳神经文本到图像引擎。我最近为我的家用机器买了一个新的3090,并花了几个周末的时间在稳定扩散上。最初,我一直在使用它生成概念艺术为了一场游戏启示录世界桌面角色扮演游戏。稳定扩散在这个空间里真的很耀眼;当我在ML输出中发现可能会融入游戏中的新想法时,概念艺术的创作变成了一种协作舞蹈。丰富的图像也有助于为玩家创造一个共享的世界,这与TTRPG书籍倾向于投资的难以置信的丰富的艺术没有太大的不同。而单个TTRPG游戏的小规模,只有几个玩家,意味着我们可以将概念艺术添加到一个以前从未存在过的地方。这些ML工具对于租金最低的协作创意练习来说非常棒。

一个废弃的加油站,由稳定扩散生成。

拥有对模型+执行代码的完全访问权限,就可以很容易地深入研究并开始修补非标准用例。我特别感兴趣的是如何处理模型使用的各种潜在/隐藏表示。在这篇文章中,我将a)解释模型的各个部分(简单地),然后解释我是如何b)使用文本嵌入潜伏期创建一些简单的动画,c)对图像的许多微小变化进行采样的。

动画在五个不同的文本提示嵌入之间转换(然后再次转换)。

模型概述

首先,复制“编写自己的推理管道“拥抱脸上的稳定扩散文档”部分。复制该过程,然后检查代码是否实际运行并生成图像。

要开始处理潜在的问题,有助于更好地理解模型结构。

  1. 该模型将a作为输入文本提示和a随机种子.
  2. 这些用于创建文本嵌入和初始纯噪声VAE延迟.
  3. 扩散算法对VAE潜伏期进行逐步去噪,以获得在一定程度上与文本提示匹配的“干净”潜伏期图像。(顺便提一下,在每一步都会生成新的噪声并将其添加到去噪图像中;您确实需要使用相同的随机生成器种子,而不仅仅是相同的初始噪声VAE潜伏。)
  4. VAE解码器(非常快速)将去噪后的潜在图像转换为全尺寸输出图像。
稳定扩散输入、嵌入和子模型图。
稳定扩散的各个部分。

因此,如果从同一个随机种子运行相同的文本提示,则会得到相同的图像。现在,结果是文本嵌入空间中的一个小变化主要地对应于输出图像中的小变化。这种连续性使文本嵌入空间成为一个很好的游乐场。

请注意,相比之下,VAE图像潜势实际上是一个相当无聊的空间:潜势具有形状[4,64,64],其中最后一个维度对应图像的高度和宽度。这篇博客文章表明VAE潜伏期实际上已经非常接近图像。您可以通过操纵VAE潜伏期来获得某种效果(例如,将x发送到-x或多或少会使图像的负色效果变差),但这些效果并不是特别有趣,就像您在Photoshop中尝试执行的降级版本一样。

变形动画

通常你可以相当地提示符中的小改动(只要您使用相同的种子),您将返回一个非常相似的图像,并在细节中进行了一些更改。然后,您可以通过从一个文本嵌入“行走”到另一个文本嵌入来制作变形动画,并在此过程中生成新的图像。在图像变形动画中,我只更改了这位著名女演员的名字,其余提示保持不变,并用16个过渡帧将两者连接起来。

KD,Technoprist,演变为AB,TechnOprist。

“稳定扩散”(Stable Diffusion)不擅长制作随机人脸(你往往会得到最清晰的图像),但它倾向于为经常出现在数据集中的名人获取细节。所以,为了有一张好脸,选一个著名的名字。文本嵌入转换提供了一种很好的方法来处理随意的深度假冒问题:大多数“中间”人脸仍然很好,所以我们可以为几个人创建文本嵌入,插入,然后选择一个看起来不太像任何“源”脸的人脸。

这里是另一个例子,在城市中一条废弃的街道和一片森林之间进行插值。这两幅图像的基本构成保持不变,但其中一幅充满了建筑物和霓虹灯,而另一幅则充满了树木。

一座多雨的城市,也是一片雨林。

生成变体

文本嵌入空间中连续性的另一个巧妙应用是,您可以使用它来浏览密切相关的图像,并尝试找到比初始输出稍好的内容。换言之,您可以在基础文本嵌入中反复添加噪波,以获得大量变体。

AB技术含量最高的变体。

对于此图像,我在文本提示中重复添加了高斯噪声,标准偏差为0.02。这是一个随机游走的结构:每个新嵌入的y[k]=0.5*y[0]+0.5*(y[k-1]+噪声)。这可能会在较长的随机行走中创建一个漂亮的动画,因为相邻步骤之间有一些连贯性。第一项(0.5*y[0])确保我们保持在原始图像的附近。

奥卡的程序音乐

我最近偶然发现Orca测序器由百只兔子开发。它自称是一种“深奥的编程语言”,用于编写音乐。它纯粹是一个音序器,对MIDI和其他我还没有探索过的输出类型有很好的集成……已经有一些很好的教程,但我想说明几个“习惯用法”,我是在一个周末的语言实验中学会的。它是一种很好的语言,可以创建简单的家用“跟踪器”来控制合成器。

在音序器中,我一直想要的是注入“有趣的随机性”的能力,比如随机改变音符的增益/速度,或者从给定的音阶中随机选择音符。太阳VOX(我在2010年最喜欢的另一个跟踪器)支持随机增益,但不支持AFAICT。

在这篇文章中,我将对Orca的指令做一点介绍/概述,并记录一些我为制作缓慢变化的低音/旋律模式而想出的食谱。这里有一段视频Orca编程运行;它正在控制我的(严重未充分利用的)OP-Z。

继续阅读

斐波那契编码:如果不是利润,则用于娱乐。

假设我们想用尽可能少的比特向朋友发送一条消息……我们还假设这条消息由单位正态分布的实数组成。现在,事实证明,发送任意精度的实数真的很昂贵:你可能会发现自己发送了一些以前不知道的人对人的超越数,只需要永远列出数字。因此,实际上,我们在编码中允许一定程度的噪声容限。

这是一个需要投入一些精力的好问题:大量数据大致呈正态分布,如果您要发送一些机器学习的表示,可以引入一些正则化,以确保数据接近单位正态。(例如,这就是背后的全部想法可变自动编码器.)

我将从一个标准解决方案的快速概述开始,然后我们将进入一个涉及斐波那契代码和空间填充曲线的半生不熟的想法。

基本思想分为两部分:

  • 首先,斐波那契编码允许您对任意大的整数进行编码,而无需事先发送整数的长度。(这里有很多类似的方案,但Fib很有趣。)
  • 其次,将整数映射到实数中,以“渐进”的方式覆盖正态分布,以便在不需要高精度的情况下可以使用较小的数字,而在需要更高精度的时候只能使用较大的数字。

最后,我们将进行一些实证测试,看看这个方案的效果如何,并指出哪里还有改进的余地。

继续阅读

用贝塔分布评估成功率

假设您正在构建一个小部件,它执行一些简单的操作,结果要么成功要么失败。你决定它需要在75%的时间内成功才能发布。你运行了十次测试,看到它只成功了8次。所以你问自己,这真的够好吗?你相信测试结果吗?如果您再运行一次测试,但它失败了,那么您的成功率毕竟只有72.7%。

那么,你什么时候有足够的数据,你如何决定你的成功率“足够好”在本文中,我们将了解Beta分布帮助我们回答这个问题。首先,我们将获得Beta分布的一些直觉,然后讨论为什么它是问题的正确分布。

基本问题

将小部件的测试视为独立的布尔变量,由一些隐藏参数控制μ,以便测试成功μ我们的工作就是估计这个参数:我们想要一个P的模型(μ=x |,如果),概率分布μ取决于我们对成功和失败的观察。这是一个连续的概率分布μ介于0和1之间的数字。(这一一般设置被称为“参数估计'在统计文献中,因为我们试图估计一个著名分布的参数。)

β8-2
8次成功和2次失败的Beta分布。蓝色曲线是概率密度函数P(x=μ|s,f)。μ的预期值为0.8(用黑色标记)。绿线表示90%确定mu大于0.633。红色曲线是累积密度函数,它有助于找到置信界限。

继续阅读

看起来像一个统计学习算法

形象

我最近很高兴读到詹姆斯·斯科特的“看起来像一个州,”该报告审查了大型中央组织项目中的某种失败压力。这些失败归根结底是管理者和政府可以获得的知识种类:集合和统计,而不是生活在“实地”的人们可以获得的直接经验种类,在这种情况下,集中的知识要么不能描述,要么没有机会描述复杂的现实。该书将这两种不同的知识分类为技术(一般知识)和地方知识。在我的阅读中,该技术的优点和缺点与我们从传统算法中获得的知识相似,而metis知识刚刚开始通过统计学习算法变得可用。

在这篇(有点长)帖子中,我将概述斯科特论点的一些主要观点,并看看它们与现代机器学习的关系。特别是,斯科特观察到的管理员知识和社区知识之间的差异表明了一系列研究主题。除了简单地看一下人类和机器处理数据的方式之间的差异外,我们还观察到传统的集中式数据分析在某些领域系统性地失败了。从这些失败中,我们收集到了改进机器学习系统以解决潜在问题的建议。

继续阅读

图灵大教堂与数学与工业的分离

我刚刚读完《图灵大教堂》,这是一本关于早期计算的绝对迷人的书。这本书几乎完全集中在40年代和50年代高级研究所进行的约翰·冯·诺依曼(John von Neumann)的“电子计算机项目”上。事实上,图灵在书中只是偶尔短暂露面:它几乎完全是IAS项目的写照,以及所涉及的各种各样的人物。

疯子
约翰·冯·诺伊曼和奥本海默在MANIAC计算机上。

对我来说,这本书强调了在追求科学进步的过程中克服(或绕过)界限的重要性。冯·诺依曼(Von Neumann)尤其痴迷于应用(尤其是在哥德尔定理结束希尔伯特程序之后),并充当了纯粹数学和应用数学之间的桥梁。与此同时,物理计算机的建造带来了各种杰出的工程师。很明显,IAS的部门政治仍然相当强大——纯粹的数学家们对工程师们不太重视,而在冯·诺依曼离开IAS后,计算机项目陷入了毫无意义的停顿。戴森认为,普林斯顿因此错过了成为世界计算理论和实践中心的机会。

继续阅读

模拟城市中的空间填充曲线

我一直在玩城市:天际线最近,超级流行的SimCity淘汰赛。处理流量是游戏的核心主题(应该如此)。交通往往在十字路口聚集,众所周知,单行道的交通流量较高。那么,合乎逻辑的结论是,尝试建立一个只有一条超长单行道的城市……不幸的是,我们不得不在这个完美的愿景上妥协,因为人们想下班回家等等。

希尔伯特维尔4
希尔伯特维尔:充满太空的城市。

空间填充曲线快速入门

与此同时空间填充曲线是19世纪的一项数学发明,也是分形的早期例子之一。基本思想是定义一条通过正方形每个点的路径,同时连续的这是通过定义一系列日益扭曲的路径(H1、H2、H3…)来实现的,以使H∞定义良好且连续。当然,我们并不想要一条无限曲折的道路,但空间填充曲线的模型仍然对我们有用。

在空间填充曲线中有几个重要的想法。第一个概念是,通过在曲线H1、H2、H3…的序列中获得某些性质,我们将能够将这些性质推广到极限曲线H∞。

摩尔曲线-0-5段
摩尔曲线是(连续!)填充空间曲线的一个示例。当您沿着路径移动时,颜色变化会跟踪时间;请注意,在非常曲折的第六条路径中,时间上的一个小变化仍然会使你保持在同一个(块状)邻里。


第二个主要想法是如何获得连续性。将曲线视为一个函数,在时间0处开始,在时间1处结束,我们需要一个H∞,其中时间的微小变化会产生位置的微小变化这里需要注意的是,当我们试图填充正方形时,路径本身会变得越来越长,这可能会使连续性很难满足……当路径长度加倍时,您的移动速度是原来的两倍。

事实上,由于连续性,您还可以“向后走”:给定正方形中的一个点,您可以以任意精度近似地估计通过极限曲线H∞上的点的时间。这直接证明了曲线实际上覆盖了整个正方形。

下面是一个空间填充曲线的示例连续。将Bk定义为根据以下说明获得的曲线:

  1. 从左下角开始。
  2. 走到正方形的顶部,然后向右移动1/k。
  3. 移到方框底部,向右移动1/k。
  4. 重复步骤2和3,直到到达正方形的右侧。

这里的问题是,一个非常小的时间变化可能会把我们从方块的顶部一直带到方块的底部。我们需要更加紧张,以确保我们不会在广场上乱跳。上图所示的摩尔曲线很好地表达了他的意思:时间(颜色)上的微小变化不会将你从正方形的一边移到另一边。

实际模拟城市

如果我们尝试使用空间填充曲线在“城市:天际线”中建造城市,会发生什么?

我建造“Hilbertville”的第一次尝试是建造大型街区,使用(二阶)Hilbert曲线的设计,修建一条单行、蜿蜒的单行道。不过,除了道路之外,我还设置了一些人行道,让步行的人可以直接进出这些社区。我喜欢认为这有力地鼓励了步行交通,尽管很难从游戏中的统计数据中判断出人们实际的总体通勤选择是什么。

希尔伯特维尔2
希尔伯特维尔,两个街区。下面的视图突出显示了道路所在的位置,并对每个路段的拥堵程度进行了彩色编码。由于汽车在十字路口等待,每个街区的出口都有点拥堵。

天际线只允许建筑物直接面向道路;角落往往会导致空旷的空间。你可以在上图所示的两个街区中间看到一个巨大的空广场。在这两个方块的内部还有两个较小的长方形和两个小的空方块。使顶部的“循环”稍微长一点,消除了大部分内部空白。从游戏的角度来看,这个内部空间很糟糕;理想情况下,我们仍然可以在空地上建一个公园,让人们有更多的空间,但即使是公园也需要道路。

与主要连接道路的交叉口最终成为所有交通拥堵的“汇”。因此,我们应该尝试减少此类交点的数量……摩尔曲线是希尔伯特曲线上的一个微小变化,它将路径的“起点”和“终点”放在一起。如果我们将起点和终点合并成一条宽阔的双向道路,我们会得到:

希尔伯特维尔3
基于摩尔曲线的填空道路。

我们仍然可以在邻里之间得到浪费的广场,但在一定程度上减少了室内空间的空置量。潜在地,我们可以开发一个稍微不同的模式,并在块之间交替,以消除块之间丢失的空间。此外,由于街区的入口和出口重合,我们可以将与主干道的十字路口数量减半,这对于交通拥堵来说是一个巨大的胜利。

这是整个城市的景色;它还不是超级大,人口约为25000人。尽管与我之前建造的一些城市相比,主要环路上的拥堵情况要轻得多,但我们仍然面临着相当严重的拥堵。特别是,工业区(有大量的卡车交通)在这些长而曲折的单行道上表现得更好。

希尔伯特维尔4
希尔伯特维尔全景,人口25000。这里有十四个街区;请注意底部的两个摩尔曲线块,以及左下角稍微修改过的希尔伯特曲线块,这以稍微较长的道路为代价减少了空余空间。

空荡荡的空间实际上是由道路上所有的转弯造成的;更少的角落意味着更少的荒地。解决这一问题最简单的方法就是使用“来回”的单行道,而不需要所有花哨的弯路。

这种道路设计的另一个主要问题是获得服务。尤其是消防车要到达街区尽头还有很长的路要走;“火灾危险”指标似乎认为这是个坏主意。不过,我不确定这是否真的是个问题,因为一个街区内的交通量几乎为零,尽管路途遥远,但应急响应速度却相当快。

总的来说,我认为这是一个喜忧参半的成功。没有强有力的理由支持扭曲的空间填充曲线,而不是简单的来回单行道,无论哪种情况,消防车和垃圾车的通行似乎都是一个问题。填充曲线的扭曲度主要用于获得正确的局部量,以确保极限曲线的连续性;然而,这在城市设计中并没有明确的目的,许多转弯最终导致难以进入的角落空间。然而,好的一面是,城市的设计减少了交通量,大力鼓励步行交通。

4D散点图

我最近读了爱德华·塔夫特(Edward Tufte)的《可视化定量信息》(Visualizing Quantitative Information),这是一本关于可视化统计数据的经典著作。它读起来有点像数据可视化的“样式元素”:我们没有“省略不必要的单词”,而是“最大化数据输入”事实上,本书的主要目标是建立一些基本的设计原则,然后表明这些原则,创造性地应用,可以导致真正新的数据表示模式。

书中我最喜欢的图形之一是一张根据物理论文改编的散点图,在一张图形中绘制出四个维度。处理三维以上的数据是很典型的;我被这个散点图能够说明四维数据的相对简单性所震惊。

我删掉了一些python代码来生成类似的图像;这是Iris数据集的4D散点图:

散射4d
虹膜数据集的4D散点图

继续阅读

面向数学家的机器学习资源

涉足新领域的感觉。
涉足新领域的感觉。

昨天我在多伦多遇到了一些数学家朋友,他们对如何开始机器学习和数据科学等方面很感兴趣。当然,有很多很棒的资源,但写一点关于我是如何开始的可能是值得的,并放置一些可能对来自类似背景的人更感兴趣的资源。这样就可以了。
首先,重要的是要理解机器学习是一个巨大的领域,它的贡献来自计算机科学、统计学,有时甚至数学……但好的一面是,大多数算法确实没有那么复杂,而且如果要大规模运行,它们就不可能如此。总的来说,你需要学习一些编码,算法、和理论.

哦,你需要做一些辅助项目。快速解决问题,因为这是真正学习的最快方式。

继续阅读