const a = tf.variable(tf.scalar(Math.random()));
const b = tf.variable(tf.scalar(Math.random()));
const c = tf.variable(tf.scalar(Math.random()));
const d = tf.variable(tf.scalar(Math.random()));
创建模型,模型为上述的目标方程:
function predict(x) {
// y = a * x ^ 3 + b * x ^ 2 + c * x + d
return tf.tidy(() => {
return a.mul(x.pow(tf.scalar(3)))
.add(b.mul(x.square()))
.add(c.mul(x))
.add(d);
})
}
之前看到一个有意思的文章 前端人工智能?TensorFlow.js 学会游戏通关,使用tensorflow.js训练模型玩google无网页面的彩蛋T-Rex Runner 。看了下代码,恩...果断看不懂。先看下演示效果: Genetic Algorithm - T-Rex Runner,希望大家在读完这篇文章后至少能看懂源码了=。=,原理以后再扯,我也不懂。
实际上之前火爆过的flappy bird早就有多种神经网络或是强化学习的算法试验过了。但还是觉得很有意思,所以拿过来给大家做科普,顺便可以探讨下前端如何结合人工智能,可以做些什么?
Tensorflow.js?
TensorFlow.js 于3 月 30 日谷歌 TenosrFlow 开发者峰会正式发布,核心改编自deeplearn.js,面向JS提供一套可以在浏览器中运行的机器学习库(应该说是API,类似python)。
亮点是可以用WebGL加速,即可以用GPU加速,一般训练机器学习模型非常的消耗计算资源(比如能做机器学习计算的显卡会非常火爆)。
什么是Tensorflow?
Tensorflow.js 对我们前端工程师而言有什么优势和意义
比如:Sketching Interfaces 从原型到代码
玩起来!
https://js.tensorflow.org/#getting-started
虽然部分demo可能是之前机器学习玩剩下的,但这些例子算是首次在纯浏览器中训练运行。
快速开始
过程: 给定数据,训练拟合函数,输出模型,根据模型预测给定值的输出
核心概念
Tensor 张量
把一个张量想象成一个n维的数组或列表。看到这玩意让我想到了大学线性代数里的向量和矩阵,后来查到还有一个标量。
标量(单独的数,0维): x
向量: (可以理解为一维数组)
矩阵: (可以理解为二维数组)
我们可以将标量视为零阶张量,矢量视为一阶张量,那么矩阵就是二阶张量,当然还可以更多阶...
当然对于低阶的张量,tensorflow提供了方便的API来构造:
张量一旦创建不可改变,但你可以在他们上做操作生成新的张量。很像React的Immutable.js的思想
Variables 变量
变量通过张量初始化,但是值可以改变
Operations 操作
张量用于存储数据,操作可以修改这些数据,返回新的张量。用下来像是以张量为基本单位进行的便捷操作,比如:
模型和层
Tensorflow.js 给出了两种创建模型的方式,一种是通过各种操作直接描述模型,比如:
第二种方式是使用tf提供的高阶API ,tf.model,用层来构建模型,什么是层?层是深度学习中的一个重要抽象概念,一个普通的神经网络通常由多个层组成,比如输入层,输出层,隐藏层,深度学习为什么深?就是因为隐藏层比较多(大于2)。
例子:
好吧,如果你一定要知道SGD是啥:
RNN是啥:
我也没看懂…不班门弄斧了…看懂了再讲…
一个Tensorflow的具体例子: 训练拟合曲线(官方教程)
代码示例: https://github.com/tensorflow/tfjs-examples/tree/master/polynomial-regression-core
运行效果:
目标方程: y = ax^3 + bx^2 + cx + d. 参数值为: a: -0.8, b: -0.2, c: 0.9, d: 0.5
运行目标:我们知道函数长这样,但具体的参数值不清楚,猜测a,b,c,d的值。训练的过程就是最小化误差的过程
三步走
初始化参数为tf变量,初始化为随机值
创建模型,模型为上述的目标方程:
训练,训练以上模型,即学习目标参数值。训练模型需要:
损失函数
优化函数
训练循环
回头看 T-Rex-Runner问题
问题描述: 根据状态(输入)进行是否跳跃的预测predict(输出)。
输入:
输出:
预测方式:
f([0.1428, 0.02012, 0.00549]) = [0.2158, 0.8212]
表示预测结果为跳跃如何训练
训练过程嵌入生命周期,最主要在以下三个函数中嵌入训练和预测过程:
onRunning函数(Predict)
跑的过程中判断是否要跳,还是保持不动。
onCrash(重要训练数据)
crash的时候进行训练数据的收集
onReset(训练节点)
训练模型(以NN神经网络为例)
和之前的predict不同,这个函数的样子我们未知,使用神经网络模拟。看他的模型,你会发现你也能看得懂了(至少是语法层面上)。
应用场景探索
参考资料