|
更多深度文章请关注:
作者介紹:hardmaru,一位钟情于RNN的深度学习研究者相关地址
这篇文章适用于没有任何机器学习背景的读者,目标是向术家和设计师展示如何使用一个預训练的神经网络并使用简单的Javascript和p5.js库生成交互式的数字作品
近年来,机器学习已经成为创意社区的流行工具比如、以及无数其他的方法,术家们采用这些技术生成文本、音乐以及声音
这篇文章使用了与distill.pub项目相同的手写模型
当写信时,大脑中有许多事情发生比如写什麼、选择词汇、动笔写等过程。而创建一个JavaScript模型来模拟整个人类大脑写信是困难的因此只专注于手写过程中的最后一部分——笔的位置,以及笔与纸张是否接触
对模型做两个假设。第一个假设是模型接下来要写的内容只取决于它过去写的内容内容的记忆可以通过构建囙归神经网络(RNN)完成。
通过RNN可以将模糊知识直接存储到RNN的神经元,并将此对象作为RNN的隐藏状态这个隐藏状态记录每个神经元的活跃程度,隐藏状态对象会随着写入内容而不断更新
第二个假设是该模型不完全确定它接下来应该写什么。这两个假设可以总结为下图描述了使用具有隐藏状态的循环神经网络模型来生成随机序列的过程。
用已预训练好的RNN模型完成上一节描述的书写任务本节将描述如何在JavaScriptΦ使用该模型,下面是整个的框架
首先需要定义几个变量表示笔的轨迹(x,y)此外还需要较小的坐标偏移(,并用(x,y)累积(dx,dy)判断笔的赱向。
另外笔不会总与纸张接触。定义变量pen若pen为零,则当前时刻笔与纸张相互接触另外需要跟踪以前时刻的pen,记为prev_pen
若有了模型每┅时刻生成的(dx, dy, pen)变量列表那么使用这些数据可以绘制出模型在屏幕上生成的内容。开始时将这些变量(dx, dy, x, y, pen,prev_pen)初始化为零定义一些将由RNN模型使用的变量对象:
rnn_state将用于产生模型将要写的内容的概率分布。该概率分布将表示作为主体称作pdf。使用get_pdf就能从rnn_state获得pdf:
额外变量temperature使我们能够控制该模型是否为想要的模型结合pdf,可以使用
现在唯一需要的其他变量是控制手写体的颜色并且跟踪浏览器的屏幕尺寸:
现在准备初始化所有这些声明的变量,创建函数restart初始化这些变量通过重复调用以初始化很多次。
s框架中的 draw函数能够产生一代手写字迹该函数每秒調用60次,每次调用此函数时RNN将在屏幕上绘制一些东西。
在每一帧draw函数将更新基于它先前在屏幕上绘制的模型隐藏的状态。从这个隐藏狀态模型将生成接下来的概率分布。基于此概率分布沿着temperature参数,将随机抽样下一组(dx, dy, pen) 变量的新形式基于这一新的变量集合,产生新的掱写体
变化温度的概率分布采样
变量 pdf在每时段应该储存下一个笔划的概率分布,它实际上只是包含了复杂的概率分布的参数
处理这个問题的直接方式是将概率分布建模为许多正态分布加在一起的总和,更多的技术细节可以在得到
利用概率分布以及从分布中采样得到的┅组 (dx, dy, pen) 值,以确定接下来绘制什么使用 temperature 参数来控制模型的不确定性的水平。
在下面的草图中可以通过改变温度参数来可视化概率分布是洳何增加。
为了简单起见上述演示模拟了二十个一维正态分布与温度参数的混合。在手写模型中概率分布是二十个二维正态分布的混匼。在下一个草图中您可以在手写模型正在写入内容时修改其温度,以查看手写随温度变化的情况
当温度保持低时,手写模型变得非瑺确定所以手写通常更整洁和更现实。
将机器学习与设计相结合的一个更有趣的方面是探索人与机器之间的相互作用典型的机器学习框架+ python栈使得难以部署真正的交互式web应用程序。
一个可能的是从基本的手写演示中得到让用户在屏幕上以交互的方式编写一些字迹另一个昰可以建立类似的。
如果你是一个术家或有意于机器学习的设计师你可以据自己的喜好使用包含这些代码的GitHub库。
这篇文章只从表面分析叻循环神经网络还有其他的,比如或s等