译者注:Haiku:中文翻译为“俳句”,是由17音组成的日本定型短诗,从俳谐(诽谐)的首句演变而来。日本最早的俳谐出现于《古今和歌集》(收有“俳谐歌”58首),至江户时代(1600年-1867年)则有从“俳谐连歌”产生的俳句、连句、俳文等。正冈子规把俳谐的首句从俳谐中*出来,单独成体,称为俳句。
在这个文章中,我们描述了“Bitku”的创建流程。“Bitku”是一个可以完全在区块链上运行的“俳句”生成器。文章首先介绍了构建这个区块链上原生的,能够进行文学艺术创造的产品的目标,其能够真正产生并存储在链上。然后文章说明了这里自动生成的NFT艺术品的现实愿景。最后,文章详细描述了我们首创的生成式机器学习模型的训练和部署流程,并说明了其如何运行在区块链上。
原文作者:Jeremy Neiman
原文链接:https://towardsdatascience.com/machine-learning-haiku-generator-on-blockchain-f6e5a801ca25翻译:Flow中文技术大使,王亮
Bitku #40
自动生成NFT技术概述
自动生成艺术NFT的趋势正在增长--在区块链上通过算法创建并“铸造”独特的艺术品,以便证明所有权。现有的几种生成 NFT 的方法:
Art Blocks是生成 NFT 的最大平台之一。艺术家们创建了一个脚本(通常使用p5js),它可以接受一个数字并将其变成一件艺术品。每个数字将产生不同的输出。该脚本保存为以太坊区块链上的文本。当你在 Art Blocks 上铸造 NFT 时,交易会在你的以太坊地址存储一个随机种子。要查看艺术作品时,您的计算机从区块链中提取脚本,提取你的种子,然后计算机在该种子上运行脚本。所有的计算都发生在观看艺术作品的电脑上;区块链只是一个账本,用于跟踪脚本,以及谁拥有哪些种子。
另一种方法是按需生成艺术,但通过调用区块链之外的 API。这被称为Oracle 。Oracle 通常用于访问外部数据,例如金融应用程序的汇率。但它们也可用于调用使用 GPT-3 生成文本的 API,或代表区块链碳排放的像素艺术树。在这种情况下,艺术品是由一个黑箱生成的,你并不知道你的结果是如何得到的。结果也存储在链下,因此区块链无法完全保证其不变性。
还有一类是预生成的艺术品。例如,使用Processing生成 100 张随机 jpg 图像,然后在OpenSea 上将这些图像铸造为 NFT 。这些图像将使用IPFS之类的技术存储在区块链之外,并将区块链上的 NFT 链接到该图像。
真正艺术家创作出令人惊叹艺术作品作为 NFT,我对艺术品的质量没有任何批评。但从技术角度来看,我发现这些方法并不令人满意,因为它们都有一个共同点:它们将生成艺术品的计算复杂性从区块链转移到其他计算机上,无论是你的计算机,还是云中的 API,或艺术家的电脑。NFT 仅用作所有权证明,并不是艺术本身的组成部分。
但这个流程没用做到的是没有做的是—在区块链系统本身上运行生成代码,来创造艺术品。
尽快到这个想法看起来有点离奇,但这正是我打算做的。
Bitku #240
主要思路
我打算做的是仅依赖于区块链的来生成艺术品,而对外界的依赖为0。只要区块链存在,任何人都可以明确地知道这件艺术品是什么,以及它是如何产生的。
为了满足第一个要求,我们需要将艺术品本身存储在区块链上,为了满足第二个要求,我们需要在区块链上运行生成艺术品的代码。
■ 这并不是一个好主意
就其性质而言,区块链具有时间和空间*。区块链通过在许多计算机上复制计算和存储来工作。
以以太坊为例,全球有数千个全节点,每个节点都会执行交易,再加上数十万矿工,其中一些会执行交易。试图运行一个需要大量计算的复杂过程是不可行的,而且还会影响整个系统的运行。
此成本反映在执行交易的gas需求中。以太坊黄皮书概述了不同操作的成本,例如计算、存储或加载字节。存储 1MB 需要 6.4 亿 gas,按今天的 gas 价格和汇率计算,大约是 64 ETH 或 170,000 美元。这还只是存储,不考虑计算成本。
考虑到这些*,很明显将视觉艺术存储在区块链上是不可行的。而“俳句”,我之前尝试过的,似乎是完美的契合:它们是文本——而且是短文本。
有了目标,下一个问题是如何在区块链上生成俳句。我在上面链接的项目使用了一个循环深度学习模型,该模型在磁盘上为 140MB,运行起来计算成本很高。
Bitku #29
马尔可夫链模型
输入马尔可夫链:它们的功能远不如最先进的深度学习模型——它们生成的文本更不真实。但它们体积很小,而且很容易理解。
马尔可夫链对一系列事件进行建模,其中下一个事件的概率取决于当前的状态。在我们的例子中,要在句子中生成下一个单词时,我们会考虑当前单词。
下图显示了在The Mouse, the Bird, and the Sausage的第一句话上训练的马尔可夫链。
其第一句话:“Once upon a time, a mouse, a bird, and a sausage, entered into partnership and set up house together”
每个单词都通过该单词跟在前一个单词之后的概率连接到其他单词。要从中生成文本,如果我们从“once”开始,100% 的时间我们会选择“onon”这个词,然后我们总是会选择“a”。在这一点上,我们有几个词可以遵循。每次我们生成一个包含“a”的句子时,我们可能会在后面加上一个不同的词:“a bird”或“a sausage”。
这些概率来自训练过程。训练是通过处理一组文本(称为语料库)并训练单词之间的每个转换概率来完成的。
在这种情况下,“on”总是跟随“once”,因此在我们的模型中它有 100% 的概率跟随它。虽然“a”后面有四个词,每个词的次数相同,所以它们每个词都有相同的 25% 的机会。
随着语料库的增长,这变得更加复杂,但想法是相同的:词对出现在语料库中的频率将为模型提供基本的生成概率。
Bitku #189
构建区块链俳句生成器
至此,我已经确定了我的目标和要求:建立一个可以在区块链上生成和存储俳句的马尔可夫模型。是时候建造它了!
■ Flow区块链
我的第一步是选择一个区块链来使用。虽然由于生态系统的普及和成熟,以太坊是显而易见的选择,但由于上述*,很明显我需要寻找其他的区块链。我将搜索重点放在权益证明 (PoS) 区块链上,以尽量减少我需要的计算对系统环境的影响。
在考虑了几个选项后,我选择了Flow。Flow 是一个相对较新的公司,以NBA Top Shot而闻名,但应用程序生态系在快速增长。Flow 使用一种 PoS 共识算法,该算法被划分为几种不同类型的节点。与大多数区块链相比,其执行发生在相对较少数量的计算机上。很难估计在 Flow 区块链上运行复杂交易对计算/能源/碳的影响,因为目前所有交易都按不到百分之一美分的统一费率收取,但可以肯定的是,它比使用以太坊等区块链更便宜,成本更低。
但真正将我推向 Flow 的并不是其 PoS 共识机制,而是它的编程语言Cadence和开发者生态系统。Cadence 有一个简单易懂的智能合约编程界面,特别是对于像我这样的智能合约编程新手。有很好的教程和在线编辑环境,方便用入门,并有清晰的API 参考文档。Flow 和 Cadence 仍在积极开发中,所以我确实遇到了一些文档已经过时的地方,并且开发者生态系统的某些部分还处于早期阶段——比如 JavaScript 库——但总的来说,我在 Flow 上开发的体验非常棒。
■ 构建俳句生成马尔可夫模型
在上面的例子中,马尔可夫模型的状态只是当前单词。当当前单词是“on”时,下一个单词将是“a”。从“a”有四个相等的选择。该模型的一个可能输出是:
once upon a sausage entered into partnership and a mouse a mouse a mouse…
很容易看出我们产生了毫无意义的结果。选择一个好的下一个词,需要更多关于句子的上下文。但状态不必只是当前的词。对于这个项目,我训练了一个马尔科夫模型,其中状态由当前单词、前一个单词和行号组成。这远非完美,但比当前仅单词的情况有了很大改进,同时足够简单以适应约束。
训练语料库来自多个来源。俳句训练数据并不多,因此该模型的大部分内容是在其他诗歌或散文句子上进行训练的,这些句子经过重组以具有类似俳句的外观。总之,我有几百兆字节的训练数据。
我处理了每个“俳句”来分类从状态(行号、当前单词和前一个单词)到下一个单词的转换。在这一步之后,我有大约 650 万次转换。
以下示例显示了从当前单词 (the) 到“the”之后的每个单词的这些转换以及它发生了多少次。
the, world, 644 the, night, 474 … the,sudden , 2 the,change , 1有了这个,你可以计算从一个状态到一个单词的概率。如果这四个词是我们语料库中“the”之后仅有的四个词,那么“世界”出现的概率为 57.4%,“夜晚”出现的概率为 42.3%,而“变化”的出现概率不到 0.1%。时间。这意味着当我使用这个模型生成俳句时,有 57.4% 的时间当前单词是“the”,下一个生成的单词会是“world”,而很少会是“change”。
创建马尔可夫模型就像为训练数据中的每个转换计算这些概率一样简单。我从这组转换中创建了三个不同的马尔可夫模型:
第一个模型使用行号、当前单词和前一个单词来生成下一个单词。
第二个模型使用行号和仅当前单词来生成下一个单词。此模型是当第一个模型中不存在当前状态时的后备。例如,当我们处于俳句的开头并且我们还没有两个单词时,或者如果生成了一个不常见的单词对,例如“the change”,就会出现这种情况。
最后一个模型专门模拟俳句的末端。我之前在生成俳句时遇到的一个问题是,由于俳句的大小受到*(只有有限的行数和音节),所以您经常会在诗的结尾留下不完整的想法。我通过在训练数据中建立俳句末尾的状态模型来解决这个问题。如果在生成一首诗即将结束时遇到该状态,我们将采用该选项并结束这首诗,而不是尝试继续生成。
可以在此处找到处理训练数据和构建模型的完整代码。完整代码:https://github.com/docmarionum1/bitku/blob/main/train/Train%20Models.ipynb
■ 移植到Flow
训练好模型后,我必须让模型在 Flow 区块链上运行。这需要将我的 Python 代码移植到 Cadence 智能合约中。Cadence 是一种“面向资源”的编程语言,它使得安全可靠地完成所有区块链的各类操作——铸造 NFT、将它们存储在正确的帐户中,以及交换资金。但是,虽然 Cadence 是图灵完备的,但它比 Python 之类的语言更受*,这使得移植俳句生成代码更具挑战性。
■ 缩小模型
我们遇到最大的挑战是找到一个由 Cadence 支持的模型表示,它小到可以存储在区块链上。三个模型的实际*在 1-2MB 之间,Flow 区块链则有4MB 事务大小*。
为了从数百 MB 的训练数据和 650 万个状态转换到只有几 MB,我做了以下工作:
将单词词典修剪为仅 1,000 个最常用的单词。由于新单词和其他单词之间的无数互连,最终模型的大小随着字典中单词数量的增加而呈指数增长。我发现 1,000 可以很好地平衡模型大小和生成的俳句的多样性。
剪枝剩余单词之间的不频繁转换。这也是以减少产出多样性为代价的。以上面的例子为例:即使“the”和“change”都包含在 1,000 词词典中,“the change”也不包含在状态转换中。这不仅节省了空间,而且有助于防止语法错误的转换。当“change”是名词时,“the change”可能是正确的,例如“give me the change”,但“change”通常是动词。该模型不知道单词被用作哪个词性,因此“change”通常会被解释为动词,后跟“my”和“your”等词。
将单词压缩成更小的表示。我的压缩方案是用唯一的字母数字代码替换单词,为最常见的单词提供最短的代码。
当我创建模型并在 Flow 上对其进行测试时,获得不频繁转换的确切单词数和阈值是一个迭代过程。Flow/Cadence 还处于早期阶段,新版本的 Cadence 运行时迫使我多次调整模型的大小。
这是字典中用于反转压缩的片段:
{ "a":"END", "b":"START", "c":"\n", "d":"the", "e":"I", "f":"to", "g":"and", "h":"a", "i":"of", ..., "pg":"walking", "ph":"lonely", "pi":"thousand" }“START”和“END”是我用来标记俳句开始和结束的符号。之后,“\n”(换行符)是最常见的,其次是“the”和“I”。巧合的是,“Thousand”是字典中 1,000 个单词中出现频率最低的单词,如您所见,可以压缩为两个字符(“pi”)
这是模型的样子:
{ "d":{ 0:{"c":8,"aw":9,…,"i6":34,"d7":35}, 1:{"c":7,"bB":8 ,...,"gm":46,"aj":47}, 2:{"cP":1,"bG":2,...,"k9":51,"mc":52} } }这是单词“d”之后的单词模型,该单词翻译为“the”。里面有三本字典,俳句三行各一本。对于第一行,“the”后面最常见的词是“c”(“\n”),第二个是“aw”(“only”),最后一个是“d7”(“lord”)。最大数为 35,因此要在俳句第一行的“the”之后生成一个单词,请在 1 到 35 之间选择一个随机数,然后选择值小于或等于该数的第一个单词。5 将转换为“\n”,而 9 将转换为“仅”。转换为百分比,对于这种特定情况,这意味着大约 23% 的时间换行符跟在“the”之后,而其他单词有 3% 的机会。
■ 将生成代码移植到 Cadence
整理好模型并与 Cadence 兼容后,下一步就是使用它们来生成俳句。
基本思想是从模型中随机抽取一个词,然后使用该词随机选择下一个词。在生成过程中,如果第一行有 5 个或更多音节,或者第二行有 7 个或更多音节,则插入换行符作为下一个“单词”。在最后一行,如果有 4 个或更多音节,那么我们尝试从上述特定于结尾的模型中提取。
虽然我一直在谈论挑选“随机”词,但我们实际上想要一个伪随机词——看起来随机但行为可重复的词。我们在区块链上构建它所获得的好处之一是俳句的明确出处。我们不仅可以像了解其他 NFT 一样了解所有权历史,还可以准确了解它是如何生成的。假设我们有种子,我们总是可以返回,定位代码,并了解产生任何给定俳句的过程。
在这种情况下,我用块的 ID 和俳句的 ID 为伪随机数生成器播种(每个俳句都用唯一的顺序 ID 标记)。因为块 ID 包含在种子中,所以在您铸造俳句之前,您永远不知道 * 俳句会是什么。
如果速度足够快,可能会提前知道您的交易将包含在哪个区块中,但实际上它是不可预测的。
智能合约的完整代码,包括模型和生成代码,可以在这里找到。
结果
到有趣的部分——输出结果。我已经在本文中包含了其中的一些。以下是我最喜欢的几个:
Bitku #0
Bitku #5
Bitku #221
是的,最后一个只是两个字。正如我之前提到的,使用区块链的一大好处是,在给定随机数种子的情况下,你可以准确地弄清楚发生了什么。(我将把它作为练习留给读者;这是产生俳句 #221 的交易。)
资料参考:
您可以阅读有关该项目的更多信息,并在以下位置找到所有源代码:https ://github.com/docmarionum1/bitku
如果您想了解更多有关生成俳句的信息,您可以阅读有关使用深度学习以及从职位描述生成俳句的信息。
Jeremy Neiman 可以在他的网站上找到同样无意义的事情:http: //jeremyneiman.com/
感谢 Abigail Pope-Brooks 的编辑和反馈。
本文中的所有图片均由作者创作,除非另有说明。
[1] 附录:区块链机器学习现状
据我所知,Bitku 是第一个在生产区块链上运行的机器学习应用。
我只能找到另一个在智能合约中实现机器学习的源代码实例:Microsoft Research 的区块链上的分散式和协作式 AI(也称为在区块链上共享可更新模型 (SUM))。
这是一个有趣的项目,其主要重点是确定如何利用区块链使训练模型分散化并访问它们进行预测。要点是它们为向模型提供数据提供了一种激励机制,实现了易于更新的 ML 模型(例如最近邻分类器)以降低交易成本,然后允许免费访问预测,因为从区块链中读取免费。
该项目在以太统计上实施,并显示使用当地模拟器工作。我找不到任何被部署到Mainnet的迹象,现在使用它是持久的。但我可以看到这种方法在POS区块链上工作。
在此之外,我无法在区块链中找到ML的其他实施。
有一篇论文,提出了一种使用区块链为激励,创建有效模型的方案(kaggle的区块链化),但它只是理论阐述。
还有一些研究,主要研究如何利用区块链让机器学习更方便,例如机器学习链,目前是一个原型系统 - 它使用区块链来协调分布式机器学习,并增强机器学习的安全性 - 但它不会在智能合同中运行机器学习算法。
END
什么是Flow福洛链?
Flow福洛链是一个快速,去中心化,且对开发者友好的区块链,旨在为新一代游戏、娱乐应用程序提供动力的数字资产的基础。Flow是唯一一个由始至终为消费者提供出色体验的Layer-1区块链团队。其团队创造的dApp包括:CryptoKitties、Dapper Wallets、NBA Top shot。
CrytoKitties于2017年推出时便快速成为加密市场最受欢迎的dApp,因其成功而导致以太坊堵塞。在Flow上运营的NBA Top shot也已成为增长最快的dApp,在公开发布后的6个月创造了7亿美金销量。正因为Flow公链的可扩展性和消费者友好的体验,让这一切成为可能。目前有300多个项目正在Flow链上筹备中,我们期待看到一个伟大的生态系统蓬勃发展。
关于Dapper Labs
Dapper Labs是一家位于加拿大的全球顶尖区块链服务商,在2017 年年底通过CryptoKitties收藏游戏成功进入⽤户视野,并且因为加密猫的爆⽕导致以太坊拥堵,从而推出Flow公链以及全新的开发语言—— Cadence,旨在吸引更多的开发者在Flow 上开发应⽤。
Flow的合作伙伴们:
我们欢迎越来越多的小伙伴加入Flow星球,为星球增添色彩!
Flow 官网:https://zh.onflow.org/
Flow 论坛: https://forum.onflow.org/
Flow Discord:
https://discord.com/invite/flow
Flow CN Telegram: https://t.me/flow_zh
Flow B站:https://space.bilibili.com/1002168058
Flow 微博:
https://weibo.com/7610419699
Flow CSDN:
https://blog.csdn.net/weixin_57551966?spm=1010.2135.3001.5343
扫码添加Flow官方账号【【微信:11810619】号:11810619】,加入Flow生态群
【【微信:11810619】号:11810619】 : FlowChainOfficial