TensorFlow.jsではまた、訓練を実行し勾配をしきりに計算するAPIも提供されています。
演算とAPIを組み合わせ、出力と入力で自動的に微分する関数の例を示します。
目次
勾配
tf.grad
tf.grads
tf.customGrad
tf.valueAndGrad
tf.valueAndGrads
tf.variableGrads
f(a,b)の勾配の例:
// f(a,b) = a*b
const f = (a, b) => a.mul(b);
// df/da = b, df/db = a
const grads = tf.grads(f);
const a = tf.tensor1d([1, 2]);
const b = tf.tensor1d([-1, -2]);
const [da, db] = grads([a, b]);
da.print();
/*
Tensor
[-1, -2]
*/
db.print();
/*
Tensor
[1, 2]
*/
オプティマイザー
tf.train.sgd
tf.train.momentum
tf.train.adagrad
tf.train.adadelta
tf.train.adam
tf.train.adamax
tf.train.rmsprop
オプティマイザーを、確率的勾配降下法(SGD)で構成する例です。
// 係数 a, b, c.
const xs = tf.tensor1d([0, 1, 2, 3, 4]);
const ys = tf.tensor1d([1.1, 3.9, 9.2, 15.8, 25.1]);
const a = tf.scalar(Math.random()).variable();
const b = tf.scalar(Math.random()).variable();
const c = tf.scalar(Math.random()).variable();
// y = a*x^2 + b*x + c
const f = x => a.mul(x.square()).add(b.mul(x)).add(c);
const loss = (pred, label) => pred.sub(label).square().mean();
const LEARNING_RATE = 0.01;
const optimizer = tf.train.sgd(LEARNING_RATE);
// モデルを訓練する
for (let i = 0; i < 10; i++) {
optimizer.minimize(() => loss(f(xs), ys));
console.log(`a: ${a.dataSync()}, b: ${b.dataSync()}, c: ${c.dataSync()}`);
}
// 推測する
const preds = f(xs).dataSync();
preds.forEach((pred, i) => {
console.log(`x: ${i}, pred: ${pred}`);
});
もっと詳しく知りたい場合は、TensorFlow.js Training APIを参照してください。